aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/comments/l10n/uk.js2
-rw-r--r--apps/comments/l10n/uk.json2
-rw-r--r--apps/dav/l10n/de_DE.js2
-rw-r--r--apps/dav/l10n/de_DE.json2
-rw-r--r--apps/dav/l10n/uk.js39
-rw-r--r--apps/dav/l10n/uk.json39
-rw-r--r--apps/dav/lib/CalDAV/CalDavBackend.php2
-rw-r--r--apps/dav/lib/CalDAV/Reminder/ReminderService.php53
-rw-r--r--apps/dav/lib/Connector/Sabre/Auth.php3
-rw-r--r--apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php198
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/AuthTest.php12
-rw-r--r--apps/files/l10n/uk.js4
-rw-r--r--apps/files/l10n/uk.json4
-rw-r--r--apps/files_external/composer/autoload.php25
-rw-r--r--apps/files_external/composer/composer.json13
-rw-r--r--apps/files_external/composer/composer.lock18
-rw-r--r--apps/files_external/composer/composer/ClassLoader.php581
-rw-r--r--apps/files_external/composer/composer/InstalledVersions.php352
-rw-r--r--apps/files_external/composer/composer/LICENSE21
-rw-r--r--apps/files_external/composer/composer/autoload_classmap.php121
-rw-r--r--apps/files_external/composer/composer/autoload_namespaces.php9
-rw-r--r--apps/files_external/composer/composer/autoload_psr4.php10
-rw-r--r--apps/files_external/composer/composer/autoload_real.php37
-rw-r--r--apps/files_external/composer/composer/autoload_static.php147
-rw-r--r--apps/files_external/composer/composer/installed.json5
-rw-r--r--apps/files_external/composer/composer/installed.php23
-rw-r--r--apps/files_external/l10n/uk.js2
-rw-r--r--apps/files_external/l10n/uk.json2
-rw-r--r--apps/files_sharing/l10n/uk.js15
-rw-r--r--apps/files_sharing/l10n/uk.json15
-rw-r--r--apps/files_versions/l10n/eu.js9
-rw-r--r--apps/files_versions/l10n/eu.json9
-rw-r--r--apps/files_versions/l10n/uk.js18
-rw-r--r--apps/files_versions/l10n/uk.json18
-rw-r--r--apps/settings/l10n/uk.js27
-rw-r--r--apps/settings/l10n/uk.json27
-rw-r--r--apps/theming/l10n/uk.js7
-rw-r--r--apps/theming/l10n/uk.json7
-rw-r--r--apps/workflowengine/l10n/uk.js1
-rw-r--r--apps/workflowengine/l10n/uk.json1
40 files changed, 1787 insertions, 95 deletions
diff --git a/apps/comments/l10n/uk.js b/apps/comments/l10n/uk.js
index f4d4fc01323..8695d12715e 100644
--- a/apps/comments/l10n/uk.js
+++ b/apps/comments/l10n/uk.js
@@ -25,7 +25,7 @@ OC.L10N.register(
"Comment" : "Коментар",
"An error occurred while trying to edit the comment" : "Під час редагування коментаря сталася помилка",
"Comment deleted" : "Коментар вилучено",
- "An error occurred while trying to delete the comment" : "Під час спроби видалити коментар сталася помилка",
+ "An error occurred while trying to delete the comment" : "Під час спроби вилучити коментар сталася помилка",
"An error occurred while trying to create the comment" : "Під час створення коментаря сталася помилка",
"%1$s commented" : "%1$s прокоментовано"
},
diff --git a/apps/comments/l10n/uk.json b/apps/comments/l10n/uk.json
index 67559be1ec6..48deb434490 100644
--- a/apps/comments/l10n/uk.json
+++ b/apps/comments/l10n/uk.json
@@ -23,7 +23,7 @@
"Comment" : "Коментар",
"An error occurred while trying to edit the comment" : "Під час редагування коментаря сталася помилка",
"Comment deleted" : "Коментар вилучено",
- "An error occurred while trying to delete the comment" : "Під час спроби видалити коментар сталася помилка",
+ "An error occurred while trying to delete the comment" : "Під час спроби вилучити коментар сталася помилка",
"An error occurred while trying to create the comment" : "Під час створення коментаря сталася помилка",
"%1$s commented" : "%1$s прокоментовано"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js
index 91b92c78d0b..cff75f95946 100644
--- a/apps/dav/l10n/de_DE.js
+++ b/apps/dav/l10n/de_DE.js
@@ -74,7 +74,7 @@ OC.L10N.register(
"Cancelled: %1$s" : "Abgesagt: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" wurde abgebrochen",
"Re: %1$s" : "Re: %1$s",
- "%1$s has responded your invitation" : "%1$s hat auf Ihre Einladungen geantwortet",
+ "%1$s has responded your invitation" : "%1$s hat auf Ihre Einladung geantwortet",
"Invitation: %1$s" : "Einladung: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s möchte Sie zu \"%2$s\" einladen",
"Organizer:" : "Organisator:",
diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json
index fcf7d10b0e9..82f67ed1f52 100644
--- a/apps/dav/l10n/de_DE.json
+++ b/apps/dav/l10n/de_DE.json
@@ -72,7 +72,7 @@
"Cancelled: %1$s" : "Abgesagt: %1$s",
"\"%1$s\" has been canceled" : "\"%1$s\" wurde abgebrochen",
"Re: %1$s" : "Re: %1$s",
- "%1$s has responded your invitation" : "%1$s hat auf Ihre Einladungen geantwortet",
+ "%1$s has responded your invitation" : "%1$s hat auf Ihre Einladung geantwortet",
"Invitation: %1$s" : "Einladung: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s möchte Sie zu \"%2$s\" einladen",
"Organizer:" : "Organisator:",
diff --git a/apps/dav/l10n/uk.js b/apps/dav/l10n/uk.js
index eabd45e7d43..7cddc8ebbe2 100644
--- a/apps/dav/l10n/uk.js
+++ b/apps/dav/l10n/uk.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"dav",
{
"Calendar" : "Календар",
- "To-dos" : "Справи",
+ "To-dos" : "Завдання",
"Personal" : "Особисте",
"{actor} created calendar {calendar}" : "{actor} створив календар {calendar}",
"You created calendar {calendar}" : "Ви створили календар {calendar}",
@@ -37,21 +37,21 @@ OC.L10N.register(
"{actor} restored event {event} of calendar {calendar}" : "{actor} відновив подію {event} календаря {calendar}",
"You restored event {event} of calendar {calendar}" : "Ви відновили подію {event} календаря {calendar}",
"Busy" : "Зайнято",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} створив завдання {todo} у списку {calendar}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} створив(-ла) завдання {todo} у списку {calendar}",
"You created to-do {todo} in list {calendar}" : "Ви створили завдання {todo} у списку {calendar}",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} видалив справу {todo} зі списку {calendar}",
- "You deleted to-do {todo} from list {calendar}" : "Ви видалили завдання {todo} зі списку {calendar}",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} оновив завдання {todo} у списку {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} вилучив(-ла) справу {todo} зі списку {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Ви вилучили завдання {todo} зі списку {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} оновив(-ла) завдання {todo} у списку {calendar}",
"You updated to-do {todo} in list {calendar}" : "Ви оновили завдання {todo} у списку {calendar}",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} вирішив завдання {todo} у списку {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} вирішив(-ла) завдання {todo} у списку {calendar}",
"You solved to-do {todo} in list {calendar}" : "Ви вирішили завдання {todo} у списку {calendar}",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} знову відкрив справу {todo} у списку {calendar}",
- "You reopened to-do {todo} in list {calendar}" : "Ви знову відкрили справу {todo} у списку {calendar}",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} перемістив завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} знову відкрив(-ла) завдання у списку {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Ви знову відкрили завдання {todo} зі списку {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} перемістив(-ла) завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Ви перемістили завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
"Calendar, contacts and tasks" : "Календар, контакти та завдання",
- "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> був змінений",
- "A calendar <strong>event</strong> was modified" : "Календарна <strong>подія</strong> була змінена",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> було змінено",
+ "A calendar <strong>event</strong> was modified" : "Календарну <strong>подію</strong> було змінено",
"A calendar <strong>to-do</strong> was modified" : "<strong>Завдання</strong> в календарі змінено",
"Contact birthdays" : "Дні народження контактів",
"Death of %s" : "Смерть %s",
@@ -72,8 +72,11 @@ OC.L10N.register(
"Where: %s" : "Місце: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"Cancelled: %1$s" : "Скасовано: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" скасовано",
"Re: %1$s" : "Re: %1$s",
+ "%1$s has responded your invitation" : "%1$s відповів на ваше запрошення",
"Invitation: %1$s" : "Запрошення: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s запрошує вас до \"%2$s\"",
"Organizer:" : "Організатор:",
"Attendees:" : "Учасники:",
"Title:" : "Назва:",
@@ -146,9 +149,9 @@ OC.L10N.register(
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Якщо ви налаштуєте свій робочий час, інші користувачі побачать, коли вас немає на місці, коли вони бронюють зустріч.",
"Time zone:" : "Часовий пояс:",
"to" : "до",
- "Delete slot" : "Видалити слот",
+ "Delete slot" : "Вилучити діапазон",
"No working hours set" : "Робочий час не встановлено",
- "Add slot" : "Додати слот",
+ "Add slot" : "Додати діапазон",
"Monday" : "понеділок",
"Tuesday" : "Вівторок",
"Wednesday" : "Середа",
@@ -179,15 +182,15 @@ OC.L10N.register(
"Tentative" : "Попередній",
"Your attendance was updated successfully." : "Ваша участь успішно оновлена.",
"Todos" : "Завдання",
- "{actor} created todo {todo} in list {calendar}" : "{actor} створив завдання {todo} у списку {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} створив(-ла) завдання {todo} у списку {calendar}",
"You created todo {todo} in list {calendar}" : "Ви створили завдання {todo} у списку {calendar}",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} вилучили завдання {todo} зі списку {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} вилучив(-ла) завдання {todo} зі списку {calendar}",
"You deleted todo {todo} from list {calendar}" : "Ви вилучили завдання {todo} зі списку {calendar}",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} оновив завдання {todo} у списку {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} оновив(-ла) завдання {todo} зі списку {calendar}",
"You updated todo {todo} in list {calendar}" : "Ви оновили завдання {todo} у списку {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} виконав завдання {todo} зі списку {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} виконав(-ла) завдання {todo} зі списку {calendar}",
"You solved todo {todo} in list {calendar}" : "Ви виконали завдання {todo} зі списку {calendar}",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно відкрив завдання {todo} у списку {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно відкрив(-ла) завдання {todo} у списку {calendar}",
"You reopened todo {todo} in list {calendar}" : "Ви повторно відкрили завдання {todo} у списку {calendar}",
"A calendar <strong>todo</strong> was modified" : "Календарне <strong>завдання</strong> було змінене",
"Invitation canceled" : "Запрошення скасоване",
diff --git a/apps/dav/l10n/uk.json b/apps/dav/l10n/uk.json
index 533e2edc25f..40f426ceb88 100644
--- a/apps/dav/l10n/uk.json
+++ b/apps/dav/l10n/uk.json
@@ -1,6 +1,6 @@
{ "translations": {
"Calendar" : "Календар",
- "To-dos" : "Справи",
+ "To-dos" : "Завдання",
"Personal" : "Особисте",
"{actor} created calendar {calendar}" : "{actor} створив календар {calendar}",
"You created calendar {calendar}" : "Ви створили календар {calendar}",
@@ -35,21 +35,21 @@
"{actor} restored event {event} of calendar {calendar}" : "{actor} відновив подію {event} календаря {calendar}",
"You restored event {event} of calendar {calendar}" : "Ви відновили подію {event} календаря {calendar}",
"Busy" : "Зайнято",
- "{actor} created to-do {todo} in list {calendar}" : "{actor} створив завдання {todo} у списку {calendar}",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} створив(-ла) завдання {todo} у списку {calendar}",
"You created to-do {todo} in list {calendar}" : "Ви створили завдання {todo} у списку {calendar}",
- "{actor} deleted to-do {todo} from list {calendar}" : "{actor} видалив справу {todo} зі списку {calendar}",
- "You deleted to-do {todo} from list {calendar}" : "Ви видалили завдання {todo} зі списку {calendar}",
- "{actor} updated to-do {todo} in list {calendar}" : "{actor} оновив завдання {todo} у списку {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} вилучив(-ла) справу {todo} зі списку {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "Ви вилучили завдання {todo} зі списку {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} оновив(-ла) завдання {todo} у списку {calendar}",
"You updated to-do {todo} in list {calendar}" : "Ви оновили завдання {todo} у списку {calendar}",
- "{actor} solved to-do {todo} in list {calendar}" : "{actor} вирішив завдання {todo} у списку {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} вирішив(-ла) завдання {todo} у списку {calendar}",
"You solved to-do {todo} in list {calendar}" : "Ви вирішили завдання {todo} у списку {calendar}",
- "{actor} reopened to-do {todo} in list {calendar}" : "{actor} знову відкрив справу {todo} у списку {calendar}",
- "You reopened to-do {todo} in list {calendar}" : "Ви знову відкрили справу {todo} у списку {calendar}",
- "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} перемістив завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} знову відкрив(-ла) завдання у списку {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Ви знову відкрили завдання {todo} зі списку {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} перемістив(-ла) завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Ви перемістили завдання {todo} зі списку {sourceCalendar} до списку {targetCalendar}",
"Calendar, contacts and tasks" : "Календар, контакти та завдання",
- "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> був змінений",
- "A calendar <strong>event</strong> was modified" : "Календарна <strong>подія</strong> була змінена",
+ "A <strong>calendar</strong> was modified" : "<strong>Календар</strong> було змінено",
+ "A calendar <strong>event</strong> was modified" : "Календарну <strong>подію</strong> було змінено",
"A calendar <strong>to-do</strong> was modified" : "<strong>Завдання</strong> в календарі змінено",
"Contact birthdays" : "Дні народження контактів",
"Death of %s" : "Смерть %s",
@@ -70,8 +70,11 @@
"Where: %s" : "Місце: %s",
"%1$s via %2$s" : "%1$s через %2$s",
"Cancelled: %1$s" : "Скасовано: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" скасовано",
"Re: %1$s" : "Re: %1$s",
+ "%1$s has responded your invitation" : "%1$s відповів на ваше запрошення",
"Invitation: %1$s" : "Запрошення: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s запрошує вас до \"%2$s\"",
"Organizer:" : "Організатор:",
"Attendees:" : "Учасники:",
"Title:" : "Назва:",
@@ -144,9 +147,9 @@
"If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Якщо ви налаштуєте свій робочий час, інші користувачі побачать, коли вас немає на місці, коли вони бронюють зустріч.",
"Time zone:" : "Часовий пояс:",
"to" : "до",
- "Delete slot" : "Видалити слот",
+ "Delete slot" : "Вилучити діапазон",
"No working hours set" : "Робочий час не встановлено",
- "Add slot" : "Додати слот",
+ "Add slot" : "Додати діапазон",
"Monday" : "понеділок",
"Tuesday" : "Вівторок",
"Wednesday" : "Середа",
@@ -177,15 +180,15 @@
"Tentative" : "Попередній",
"Your attendance was updated successfully." : "Ваша участь успішно оновлена.",
"Todos" : "Завдання",
- "{actor} created todo {todo} in list {calendar}" : "{actor} створив завдання {todo} у списку {calendar}",
+ "{actor} created todo {todo} in list {calendar}" : "{actor} створив(-ла) завдання {todo} у списку {calendar}",
"You created todo {todo} in list {calendar}" : "Ви створили завдання {todo} у списку {calendar}",
- "{actor} deleted todo {todo} from list {calendar}" : "{actor} вилучили завдання {todo} зі списку {calendar}",
+ "{actor} deleted todo {todo} from list {calendar}" : "{actor} вилучив(-ла) завдання {todo} зі списку {calendar}",
"You deleted todo {todo} from list {calendar}" : "Ви вилучили завдання {todo} зі списку {calendar}",
- "{actor} updated todo {todo} in list {calendar}" : "{actor} оновив завдання {todo} у списку {calendar}",
+ "{actor} updated todo {todo} in list {calendar}" : "{actor} оновив(-ла) завдання {todo} зі списку {calendar}",
"You updated todo {todo} in list {calendar}" : "Ви оновили завдання {todo} у списку {calendar}",
- "{actor} solved todo {todo} in list {calendar}" : "{actor} виконав завдання {todo} зі списку {calendar}",
+ "{actor} solved todo {todo} in list {calendar}" : "{actor} виконав(-ла) завдання {todo} зі списку {calendar}",
"You solved todo {todo} in list {calendar}" : "Ви виконали завдання {todo} зі списку {calendar}",
- "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно відкрив завдання {todo} у списку {calendar}",
+ "{actor} reopened todo {todo} in list {calendar}" : "{actor} повторно відкрив(-ла) завдання {todo} у списку {calendar}",
"You reopened todo {todo} in list {calendar}" : "Ви повторно відкрили завдання {todo} у списку {calendar}",
"A calendar <strong>todo</strong> was modified" : "Календарне <strong>завдання</strong> було змінене",
"Invitation canceled" : "Запрошення скасоване",
diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php
index 51eb505124e..b60d731b215 100644
--- a/apps/dav/lib/CalDAV/CalDavBackend.php
+++ b/apps/dav/lib/CalDAV/CalDavBackend.php
@@ -658,7 +658,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
}
/**
- * @return array{id: int, uri: string, '{http://calendarserver.org/ns/}getctag': string, '{http://sabredav.org/ns}sync-token': int, '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set': SupportedCalendarComponentSet, '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp': ScheduleCalendarTransp }|null
+ * @return array{id: int, uri: string, '{http://calendarserver.org/ns/}getctag': string, '{http://sabredav.org/ns}sync-token': int, '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set': SupportedCalendarComponentSet, '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp': ScheduleCalendarTransp, '{urn:ietf:params:xml:ns:caldav}calendar-timezone': ?string }|null
*/
public function getCalendarById(int $calendarId): ?array {
$fields = array_column($this->propertyMap, 0);
diff --git a/apps/dav/lib/CalDAV/Reminder/ReminderService.php b/apps/dav/lib/CalDAV/Reminder/ReminderService.php
index 1da471a51f5..a2daa3cc98e 100644
--- a/apps/dav/lib/CalDAV/Reminder/ReminderService.php
+++ b/apps/dav/lib/CalDAV/Reminder/ReminderService.php
@@ -32,6 +32,7 @@ declare(strict_types=1);
namespace OCA\DAV\CalDAV\Reminder;
use DateTimeImmutable;
+use DateTimeZone;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\Connector\Sabre\Principal;
use OCP\AppFramework\Utility\ITimeFactory;
@@ -221,6 +222,7 @@ class ReminderService {
if (!$vcalendar) {
return;
}
+ $calendarTimeZone = $this->getCalendarTimeZone((int) $objectData['calendarid']);
$vevents = $this->getAllVEventsFromVCalendar($vcalendar);
if (count($vevents) === 0) {
@@ -249,7 +251,7 @@ class ReminderService {
continue;
}
- $alarms = $this->getRemindersForVAlarm($valarm, $objectData,
+ $alarms = $this->getRemindersForVAlarm($valarm, $objectData, $calendarTimeZone,
$eventHash, $alarmHash, true, true);
$this->writeRemindersToDatabase($alarms);
}
@@ -306,6 +308,16 @@ class ReminderService {
try {
$triggerTime = $valarm->getEffectiveTriggerTime();
+ /**
+ * @psalm-suppress DocblockTypeContradiction
+ * https://github.com/vimeo/psalm/issues/9244
+ */
+ if ($triggerTime->getTimezone() === false || $triggerTime->getTimezone()->getName() === 'UTC') {
+ $triggerTime = new DateTimeImmutable(
+ $triggerTime->format('Y-m-d H:i:s'),
+ $calendarTimeZone
+ );
+ }
} catch (InvalidDataException $e) {
continue;
}
@@ -324,7 +336,7 @@ class ReminderService {
continue;
}
- $alarms = $this->getRemindersForVAlarm($valarm, $objectData, $masterHash, $alarmHash, $isRecurring, false);
+ $alarms = $this->getRemindersForVAlarm($valarm, $objectData, $calendarTimeZone, $masterHash, $alarmHash, $isRecurring, false);
$this->writeRemindersToDatabase($alarms);
$processedAlarms[] = $alarmHash;
}
@@ -363,6 +375,7 @@ class ReminderService {
/**
* @param VAlarm $valarm
* @param array $objectData
+ * @param DateTimeZone $calendarTimeZone
* @param string|null $eventHash
* @param string|null $alarmHash
* @param bool $isRecurring
@@ -371,6 +384,7 @@ class ReminderService {
*/
private function getRemindersForVAlarm(VAlarm $valarm,
array $objectData,
+ DateTimeZone $calendarTimeZone,
string $eventHash = null,
string $alarmHash = null,
bool $isRecurring = false,
@@ -386,6 +400,16 @@ class ReminderService {
$isRelative = $this->isAlarmRelative($valarm);
/** @var DateTimeImmutable $notificationDate */
$notificationDate = $valarm->getEffectiveTriggerTime();
+ /**
+ * @psalm-suppress DocblockTypeContradiction
+ * https://github.com/vimeo/psalm/issues/9244
+ */
+ if ($notificationDate->getTimezone() === false || $notificationDate->getTimezone()->getName() === 'UTC') {
+ $notificationDate = new DateTimeImmutable(
+ $notificationDate->format('Y-m-d H:i:s'),
+ $calendarTimeZone
+ );
+ }
$clonedNotificationDate = new \DateTime('now', $notificationDate->getTimezone());
$clonedNotificationDate->setTimestamp($notificationDate->getTimestamp());
@@ -471,6 +495,7 @@ class ReminderService {
$vevents = $this->getAllVEventsFromVCalendar($vevent->parent);
$recurrenceExceptions = $this->getRecurrenceExceptionFromListOfVEvents($vevents);
$now = $this->timeFactory->getDateTime();
+ $calendarTimeZone = $this->getCalendarTimeZone((int) $reminder['calendar_id']);
try {
$iterator = new EventIterator($vevents, $reminder['uid']);
@@ -517,7 +542,7 @@ class ReminderService {
$alarms = $this->getRemindersForVAlarm($valarm, [
'calendarid' => $reminder['calendar_id'],
'id' => $reminder['object_id'],
- ], $reminder['event_hash'], $alarmHash, true, false);
+ ], $calendarTimeZone, $reminder['event_hash'], $alarmHash, true, false);
$this->writeRemindersToDatabase($alarms);
// Abort generating reminders after creating one successfully
@@ -825,4 +850,26 @@ class ReminderService {
private function isRecurring(VEvent $vevent):bool {
return isset($vevent->RRULE) || isset($vevent->RDATE);
}
+
+ /**
+ * @param int $calendarid
+ *
+ * @return DateTimeZone
+ */
+ private function getCalendarTimeZone(int $calendarid): DateTimeZone {
+ $calendarInfo = $this->caldavBackend->getCalendarById($calendarid);
+ $tzProp = '{urn:ietf:params:xml:ns:caldav}calendar-timezone';
+ if (!isset($calendarInfo[$tzProp])) {
+ // Defaulting to UTC
+ return new DateTimeZone('UTC');
+ }
+ // This property contains a VCALENDAR with a single VTIMEZONE
+ /** @var string $timezoneProp */
+ $timezoneProp = $calendarInfo[$tzProp];
+ /** @var VObject\Component\VCalendar $vtimezoneObj */
+ $vtimezoneObj = VObject\Reader::read($timezoneProp);
+ /** @var VObject\Component\VTimeZone $vtimezone */
+ $vtimezone = $vtimezoneObj->VTIMEZONE;
+ return $vtimezone->getTimeZone();
+ }
}
diff --git a/apps/dav/lib/Connector/Sabre/Auth.php b/apps/dav/lib/Connector/Sabre/Auth.php
index 1610c554b9b..69821c63c21 100644
--- a/apps/dav/lib/Connector/Sabre/Auth.php
+++ b/apps/dav/lib/Connector/Sabre/Auth.php
@@ -104,14 +104,11 @@ class Auth extends AbstractBasic {
if ($this->userSession->isLoggedIn() &&
$this->isDavAuthenticated($this->userSession->getUser()->getUID())
) {
- \OC_Util::setupFS($this->userSession->getUser()->getUID());
$this->session->close();
return true;
} else {
- \OC_Util::setupFS(); //login hooks may need early access to the filesystem
try {
if ($this->userSession->logClientIn($username, $password, $this->request, $this->throttler)) {
- \OC_Util::setupFS($this->userSession->getUser()->getUID());
$this->session->set(self::DAV_AUTHENTICATED, $this->userSession->getUser()->getUID());
$this->session->close();
return true;
diff --git a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php
index 4e5413a5226..710c6da0307 100644
--- a/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php
+++ b/apps/dav/tests/unit/CalDAV/Reminder/ReminderServiceTest.php
@@ -29,6 +29,8 @@ declare(strict_types=1);
*/
namespace OCA\DAV\Tests\unit\CalDAV\Reminder;
+use DateTime;
+use DateTimeZone;
use OCA\DAV\CalDAV\CalDavBackend;
use OCA\DAV\CalDAV\Reminder\Backend;
use OCA\DAV\CalDAV\Reminder\INotificationProvider;
@@ -194,6 +196,87 @@ END:VEVENT
END:VCALENDAR
EOD;
+ private const CALENDAR_DATA_ONE_TIME = <<<EOD
+BEGIN:VCALENDAR
+PRODID:-//IDN nextcloud.com//Calendar app 4.3.0-alpha.0//EN
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+CREATED:20230203T154600Z
+DTSTAMP:20230203T154602Z
+LAST-MODIFIED:20230203T154602Z
+SEQUENCE:2
+UID:f6a565b6-f9a8-4d1e-9d01-c8dcbe716b7e
+DTSTART;TZID=Europe/Vienna:20230204T090000
+DTEND;TZID=Europe/Vienna:20230204T120000
+STATUS:CONFIRMED
+SUMMARY:TEST
+BEGIN:VALARM
+ACTION:DISPLAY
+TRIGGER;RELATED=START:-PT1H
+END:VALARM
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID:Europe/Vienna
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+EOD;
+
+ private const CALENDAR_DATA_ALL_DAY = <<<EOD
+BEGIN:VCALENDAR
+PRODID:-//IDN nextcloud.com//Calendar app 4.3.0-alpha.0//EN
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+CREATED:20230203T113430Z
+DTSTAMP:20230203T113432Z
+LAST-MODIFIED:20230203T113432Z
+SEQUENCE:2
+UID:a163a056-ba26-44a2-8080-955f19611a8f
+DTSTART;VALUE=DATE:20230204
+DTEND;VALUE=DATE:20230205
+STATUS:CONFIRMED
+SUMMARY:TEST
+BEGIN:VALARM
+ACTION:EMAIL
+TRIGGER;RELATED=START:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+EOD;
+
+ private const PAGO_PAGO_VTIMEZONE_ICS = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VTIMEZONE
+TZID:Pacific/Pago_Pago
+BEGIN:STANDARD
+TZOFFSETFROM:-1100
+TZOFFSETTO:-1100
+TZNAME:SST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+ICS;
+
+
+ /** @var null|string */
+ private $oldTimezone;
+
protected function setUp(): void {
parent::setUp();
@@ -254,7 +337,7 @@ EOD;
$this->timeFactory->expects($this->once())
->method('getDateTime')
->with()
- ->willReturn(\DateTime::createFromFormat(\DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
$this->reminderService->onCalendarObjectCreate($objectData);
}
@@ -281,7 +364,7 @@ EOD;
$this->timeFactory->expects($this->once())
->method('getDateTime')
->with()
- ->willReturn(\DateTime::createFromFormat(\DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
$this->reminderService->onCalendarObjectCreate($objectData);
}
@@ -304,8 +387,7 @@ EOD;
$this->timeFactory->expects($this->once())
->method('getDateTime')
- ->with()
- ->willReturn(\DateTime::createFromFormat(\DateTime::ATOM, '2016-06-29T00:00:00+00:00'));
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2016-06-29T00:00:00+00:00'));
$this->reminderService->onCalendarObjectCreate($objectData);
}
@@ -324,6 +406,60 @@ EOD;
$this->reminderService->onCalendarObjectCreate($objectData);
}
+ public function testOnCalendarObjectCreateAllDayWithoutTimezone(): void {
+ $objectData = [
+ 'calendardata' => self::CALENDAR_DATA_ALL_DAY,
+ 'id' => '42',
+ 'calendarid' => '1337',
+ 'component' => 'vevent',
+ ];
+ $this->timeFactory->expects($this->once())
+ ->method('getDateTime')
+ ->with()
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2023-02-03T13:28:00+00:00'));
+ $this->caldavBackend->expects(self::once())
+ ->method('getCalendarById')
+ ->with(1337)
+ ->willReturn([
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => null,
+ ]);
+
+ // One hour before midnight relative to the server's time
+ $expectedReminderTimstamp = (new DateTime('2023-02-03T23:00:00'))->getTimestamp();
+ $this->backend->expects(self::once())
+ ->method('insertReminder')
+ ->with(1337, 42, self::anything(), false, 1675468800, false, self::anything(), self::anything(), 'EMAIL', true, $expectedReminderTimstamp, false);
+
+ $this->reminderService->onCalendarObjectCreate($objectData);
+ }
+
+ public function testOnCalendarObjectCreateAllDayWithTimezone(): void {
+ $objectData = [
+ 'calendardata' => self::CALENDAR_DATA_ALL_DAY,
+ 'id' => '42',
+ 'calendarid' => '1337',
+ 'component' => 'vevent',
+ ];
+ $this->timeFactory->expects($this->once())
+ ->method('getDateTime')
+ ->with()
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2023-02-03T13:28:00+00:00'));
+ $this->caldavBackend->expects(self::once())
+ ->method('getCalendarById')
+ ->with(1337)
+ ->willReturn([
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => self::PAGO_PAGO_VTIMEZONE_ICS,
+ ]);
+
+ // One hour before midnight relative to the timezone
+ $expectedReminderTimstamp = (new DateTime('2023-02-03T23:00:00', new DateTimeZone('Pacific/Pago_Pago')))->getTimestamp();
+ $this->backend->expects(self::once())
+ ->method('insertReminder')
+ ->with(1337, 42, 'a163a056-ba26-44a2-8080-955f19611a8f', false, self::anything(), false, self::anything(), self::anything(), 'EMAIL', true, $expectedReminderTimstamp, false);
+
+ $this->reminderService->onCalendarObjectCreate($objectData);
+ }
+
public function testOnCalendarObjectCreateRecurringEntryWithRepeat():void {
$objectData = [
'calendardata' => self::CALENDAR_DATA_RECURRING_REPEAT,
@@ -331,7 +467,12 @@ EOD;
'calendarid' => '1337',
'component' => 'vevent',
];
-
+ $this->caldavBackend->expects(self::once())
+ ->method('getCalendarById')
+ ->with(1337)
+ ->willReturn([
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => null,
+ ]);
$this->backend->expects($this->exactly(6))
->method('insertReminder')
->withConsecutive(
@@ -343,11 +484,44 @@ EOD;
[1337, 42, 'wej2z68l9h', true, 1467849600, false, 'fbdb2726bc0f7dfacac1d881c1453e20', '8996992118817f9f311ac5cc56d1cc97', 'EMAIL', true, 1467158400, false]
)
->willReturn(1);
+ $this->timeFactory->expects($this->once())
+ ->method('getDateTime')
+ ->with()
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2016-06-29T00:00:00+00:00'));
+
+ $this->reminderService->onCalendarObjectCreate($objectData);
+ }
+ public function testOnCalendarObjectCreateWithEventTimezoneAndCalendarTimezone():void {
+ $objectData = [
+ 'calendardata' => self::CALENDAR_DATA_ONE_TIME,
+ 'id' => '42',
+ 'calendarid' => '1337',
+ 'component' => 'vevent',
+ ];
+ $this->caldavBackend->expects(self::once())
+ ->method('getCalendarById')
+ ->with(1337)
+ ->willReturn([
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => self::PAGO_PAGO_VTIMEZONE_ICS,
+ ]);
+ $expectedReminderTimstamp = (new DateTime('2023-02-04T08:00:00', new DateTimeZone('Europe/Vienna')))->getTimestamp();
+ $this->backend->expects(self::once())
+ ->method('insertReminder')
+ ->withConsecutive(
+ [1337, 42, self::anything(), false, self::anything(), false, self::anything(), self::anything(), self::anything(), true, $expectedReminderTimstamp, false],
+ )
+ ->willReturn(1);
+ $this->caldavBackend->expects(self::once())
+ ->method('getCalendarById')
+ ->with(1337)
+ ->willReturn([
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => null,
+ ]);
$this->timeFactory->expects($this->once())
->method('getDateTime')
->with()
- ->willReturn(\DateTime::createFromFormat(\DateTime::ATOM, '2016-06-29T00:00:00+00:00'));
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2023-02-03T13:28:00+00:00'));;
$this->reminderService->onCalendarObjectCreate($objectData);
}
@@ -487,7 +661,7 @@ EOD;
$provider1->expects($this->once())
->method('send')
->with($this->callback(function ($vevent) {
- if ($vevent->DTSTART->getDateTime()->format(\DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
+ if ($vevent->DTSTART->getDateTime()->format(DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
return false;
}
return true;
@@ -495,7 +669,7 @@ EOD;
$provider2->expects($this->once())
->method('send')
->with($this->callback(function ($vevent) {
- if ($vevent->DTSTART->getDateTime()->format(\DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
+ if ($vevent->DTSTART->getDateTime()->format(DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
return false;
}
return true;
@@ -503,7 +677,7 @@ EOD;
$provider3->expects($this->once())
->method('send')
->with($this->callback(function ($vevent) {
- if ($vevent->DTSTART->getDateTime()->format(\DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
+ if ($vevent->DTSTART->getDateTime()->format(DateTime::ATOM) !== '2016-06-09T00:00:00+00:00') {
return false;
}
return true;
@@ -511,7 +685,7 @@ EOD;
$provider4->expects($this->once())
->method('send')
->with($this->callback(function ($vevent) {
- if ($vevent->DTSTART->getDateTime()->format(\DateTime::ATOM) !== '2016-06-30T00:00:00+00:00') {
+ if ($vevent->DTSTART->getDateTime()->format(DateTime::ATOM) !== '2016-06-30T00:00:00+00:00') {
return false;
}
return true;
@@ -519,7 +693,7 @@ EOD;
$provider5->expects($this->once())
->method('send')
->with($this->callback(function ($vevent) {
- if ($vevent->DTSTART->getDateTime()->format(\DateTime::ATOM) !== '2016-07-07T00:00:00+00:00') {
+ if ($vevent->DTSTART->getDateTime()->format(DateTime::ATOM) !== '2016-07-07T00:00:00+00:00') {
return false;
}
return true;
@@ -541,7 +715,7 @@ EOD;
->willReturn(99);
$this->timeFactory->method('getDateTime')
- ->willReturn(\DateTime::createFromFormat(\DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
+ ->willReturn(DateTime::createFromFormat(DateTime::ATOM, '2016-06-08T00:00:00+00:00'));
$this->reminderService->processReminders();
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
index 72800b84253..be841295f0b 100644
--- a/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/AuthTest.php
@@ -117,7 +117,7 @@ class AuthTest extends TestCase {
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
- $user->expects($this->exactly(2))
+ $user->expects($this->exactly(1))
->method('getUID')
->willReturn('MyTestUser');
$this->userSession
@@ -125,7 +125,7 @@ class AuthTest extends TestCase {
->method('isLoggedIn')
->willReturn(true);
$this->userSession
- ->expects($this->exactly(2))
+ ->expects($this->exactly(1))
->method('getUser')
->willReturn($user);
$this->session
@@ -171,7 +171,7 @@ class AuthTest extends TestCase {
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
- $user->expects($this->exactly(3))
+ $user->expects($this->exactly(2))
->method('getUID')
->willReturn('MyTestUser');
$this->userSession
@@ -179,7 +179,7 @@ class AuthTest extends TestCase {
->method('isLoggedIn')
->willReturn(true);
$this->userSession
- ->expects($this->exactly(3))
+ ->expects($this->exactly(2))
->method('getUser')
->willReturn($user);
$this->session
@@ -660,11 +660,11 @@ class AuthTest extends TestCase {
$user = $this->getMockBuilder(IUser::class)
->disableOriginalConstructor()
->getMock();
- $user->expects($this->exactly(3))
+ $user->expects($this->exactly(2))
->method('getUID')
->willReturn('MyTestUser');
$this->userSession
- ->expects($this->exactly(4))
+ ->expects($this->exactly(3))
->method('getUser')
->willReturn($user);
$response = $this->auth->check($server->httpRequest, $server->httpResponse);
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index cf04003f2ba..71efadddf33 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -166,6 +166,10 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "Передачу права на власність на {path} від користувача {user} завершено.",
"in %s" : "в %s",
"File Management" : "Керування файлами",
+ "Storage informations" : "Інформація про сховище",
+ "{usedQuotaByte} used" : "{usedQuotaByte} використано",
+ "{relative}% used" : "{relative}% використано",
+ "Could not refresh storage stats" : "Неможливо оновити статистику сховища",
"Transfer ownership of a file or folder" : "Передача права на власність на файл або каталог",
"Choose file or folder to transfer" : "Виберіть файл або каталог для передачі",
"Change" : "Змінити",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index bb93a1c5a07..4bb26ff5000 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -164,6 +164,10 @@
"The ownership transfer of {path} from {user} has completed." : "Передачу права на власність на {path} від користувача {user} завершено.",
"in %s" : "в %s",
"File Management" : "Керування файлами",
+ "Storage informations" : "Інформація про сховище",
+ "{usedQuotaByte} used" : "{usedQuotaByte} використано",
+ "{relative}% used" : "{relative}% використано",
+ "Could not refresh storage stats" : "Неможливо оновити статистику сховища",
"Transfer ownership of a file or folder" : "Передача права на власність на файл або каталог",
"Choose file or folder to transfer" : "Виберіть файл або каталог для передачі",
"Change" : "Змінити",
diff --git a/apps/files_external/composer/autoload.php b/apps/files_external/composer/autoload.php
new file mode 100644
index 00000000000..390bf13e26d
--- /dev/null
+++ b/apps/files_external/composer/autoload.php
@@ -0,0 +1,25 @@
+<?php
+
+// autoload.php @generated by Composer
+
+if (PHP_VERSION_ID < 50600) {
+ if (!headers_sent()) {
+ header('HTTP/1.1 500 Internal Server Error');
+ }
+ $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+ if (!ini_get('display_errors')) {
+ if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+ fwrite(STDERR, $err);
+ } elseif (!headers_sent()) {
+ echo $err;
+ }
+ }
+ trigger_error(
+ $err,
+ E_USER_ERROR
+ );
+}
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitFiles_External::getLoader();
diff --git a/apps/files_external/composer/composer.json b/apps/files_external/composer/composer.json
new file mode 100644
index 00000000000..4368a88e28b
--- /dev/null
+++ b/apps/files_external/composer/composer.json
@@ -0,0 +1,13 @@
+{
+ "config" : {
+ "vendor-dir": ".",
+ "optimize-autoloader": true,
+ "classmap-authoritative": true,
+ "autoloader-suffix": "Files_External"
+ },
+ "autoload" : {
+ "psr-4": {
+ "OCA\\Files_External\\": "../lib/"
+ }
+ }
+}
diff --git a/apps/files_external/composer/composer.lock b/apps/files_external/composer/composer.lock
new file mode 100644
index 00000000000..62a29d36726
--- /dev/null
+++ b/apps/files_external/composer/composer.lock
@@ -0,0 +1,18 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "d751713988987e9331980363e24189ce",
+ "packages": [],
+ "packages-dev": [],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": [],
+ "plugin-api-version": "2.3.0"
+}
diff --git a/apps/files_external/composer/composer/ClassLoader.php b/apps/files_external/composer/composer/ClassLoader.php
new file mode 100644
index 00000000000..fd56bd7d840
--- /dev/null
+++ b/apps/files_external/composer/composer/ClassLoader.php
@@ -0,0 +1,581 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see https://www.php-fig.org/psr/psr-0/
+ * @see https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ /** @var \Closure(string):void */
+ private static $includeFile;
+
+ /** @var ?string */
+ private $vendorDir;
+
+ // PSR-4
+ /**
+ * @var array[]
+ * @psalm-var array<string, array<string, int>>
+ */
+ private $prefixLengthsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array<string, array<int, string>>
+ */
+ private $prefixDirsPsr4 = array();
+ /**
+ * @var array[]
+ * @psalm-var array<string, string>
+ */
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ /**
+ * @var array[]
+ * @psalm-var array<string, array<string, string[]>>
+ */
+ private $prefixesPsr0 = array();
+ /**
+ * @var array[]
+ * @psalm-var array<string, string>
+ */
+ private $fallbackDirsPsr0 = array();
+
+ /** @var bool */
+ private $useIncludePath = false;
+
+ /**
+ * @var string[]
+ * @psalm-var array<string, string>
+ */
+ private $classMap = array();
+
+ /** @var bool */
+ private $classMapAuthoritative = false;
+
+ /**
+ * @var bool[]
+ * @psalm-var array<string, bool>
+ */
+ private $missingClasses = array();
+
+ /** @var ?string */
+ private $apcuPrefix;
+
+ /**
+ * @var self[]
+ */
+ private static $registeredLoaders = array();
+
+ /**
+ * @param ?string $vendorDir
+ */
+ public function __construct($vendorDir = null)
+ {
+ $this->vendorDir = $vendorDir;
+ self::initializeIncludeClosure();
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+ }
+
+ return array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array<string, array<int, string>>
+ */
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array<string, string>
+ */
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return array<string, string>
+ */
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ /**
+ * @return string[] Array of classname => path
+ * @psalm-return array<string, string>
+ */
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param string[] $classMap Class to filename map
+ * @psalm-param array<string, string> $classMap
+ *
+ * @return void
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @return void
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param string[]|string $paths The PSR-0 base directories
+ *
+ * @return void
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param string[]|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ *
+ * @return void
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ *
+ * @return void
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ *
+ * @return void
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ *
+ * @return void
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+ if (null === $this->vendorDir) {
+ return;
+ }
+
+ if ($prepend) {
+ self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+ } else {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ self::$registeredLoaders[$this->vendorDir] = $this;
+ }
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ *
+ * @return void
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+
+ if (null !== $this->vendorDir) {
+ unset(self::$registeredLoaders[$this->vendorDir]);
+ }
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return true|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ (self::$includeFile)($file);
+
+ return true;
+ }
+
+ return null;
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+ return false;
+ }
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if (false === $file && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
+ if (false === $file) {
+ // Remember that this class does not exist.
+ $this->missingClasses[$class] = true;
+ }
+
+ return $file;
+ }
+
+ /**
+ * Returns the currently registered loaders indexed by their corresponding vendor directories.
+ *
+ * @return self[]
+ */
+ public static function getRegisteredLoaders()
+ {
+ return self::$registeredLoaders;
+ }
+
+ /**
+ * @param string $class
+ * @param string $ext
+ * @return string|false
+ */
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ $subPath = $class;
+ while (false !== $lastPos = strrpos($subPath, '\\')) {
+ $subPath = substr($subPath, 0, $lastPos);
+ $search = $subPath . '\\';
+ if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+ foreach ($this->prefixDirsPsr4[$search] as $dir) {
+ if (file_exists($file = $dir . $pathEnd)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+
+ return false;
+ }
+
+ private static function initializeIncludeClosure(): void
+ {
+ if (self::$includeFile !== null) {
+ return;
+ }
+
+ /**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ *
+ * @param string $file
+ * @return void
+ */
+ self::$includeFile = static function($file) {
+ include $file;
+ };
+ }
+}
diff --git a/apps/files_external/composer/composer/InstalledVersions.php b/apps/files_external/composer/composer/InstalledVersions.php
new file mode 100644
index 00000000000..c6b54af7ba2
--- /dev/null
+++ b/apps/files_external/composer/composer/InstalledVersions.php
@@ -0,0 +1,352 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
+ */
+class InstalledVersions
+{
+ /**
+ * @var mixed[]|null
+ * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
+ */
+ private static $installed;
+
+ /**
+ * @var bool|null
+ */
+ private static $canGetVendors;
+
+ /**
+ * @var array[]
+ * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+ */
+ private static $installedByVendor = array();
+
+ /**
+ * Returns a list of all package names which are present, either by being installed, replaced or provided
+ *
+ * @return string[]
+ * @psalm-return list<string>
+ */
+ public static function getInstalledPackages()
+ {
+ $packages = array();
+ foreach (self::getInstalled() as $installed) {
+ $packages[] = array_keys($installed['versions']);
+ }
+
+ if (1 === \count($packages)) {
+ return $packages[0];
+ }
+
+ return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+ }
+
+ /**
+ * Returns a list of all package names with a specific type e.g. 'library'
+ *
+ * @param string $type
+ * @return string[]
+ * @psalm-return list<string>
+ */
+ public static function getInstalledPackagesByType($type)
+ {
+ $packagesByType = array();
+
+ foreach (self::getInstalled() as $installed) {
+ foreach ($installed['versions'] as $name => $package) {
+ if (isset($package['type']) && $package['type'] === $type) {
+ $packagesByType[] = $name;
+ }
+ }
+ }
+
+ return $packagesByType;
+ }
+
+ /**
+ * Checks whether the given package is installed
+ *
+ * This also returns true if the package name is provided or replaced by another package
+ *
+ * @param string $packageName
+ * @param bool $includeDevRequirements
+ * @return bool
+ */
+ public static function isInstalled($packageName, $includeDevRequirements = true)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (isset($installed['versions'][$packageName])) {
+ return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Checks whether the given package satisfies a version constraint
+ *
+ * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+ *
+ * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+ *
+ * @param VersionParser $parser Install composer/semver to have access to this class and functionality
+ * @param string $packageName
+ * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+ * @return bool
+ */
+ public static function satisfies(VersionParser $parser, $packageName, $constraint)
+ {
+ $constraint = $parser->parseConstraints($constraint);
+ $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+ return $provided->matches($constraint);
+ }
+
+ /**
+ * Returns a version constraint representing all the range(s) which are installed for a given package
+ *
+ * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+ * whether a given version of a package is installed, and not just whether it exists
+ *
+ * @param string $packageName
+ * @return string Version constraint usable with composer/semver
+ */
+ public static function getVersionRanges($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ $ranges = array();
+ if (isset($installed['versions'][$packageName]['pretty_version'])) {
+ $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+ }
+ if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+ }
+ if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+ }
+ if (array_key_exists('provided', $installed['versions'][$packageName])) {
+ $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+ }
+
+ return implode(' || ', $ranges);
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+ */
+ public static function getPrettyVersion($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['pretty_version'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+ */
+ public static function getReference($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ if (!isset($installed['versions'][$packageName]['reference'])) {
+ return null;
+ }
+
+ return $installed['versions'][$packageName]['reference'];
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @param string $packageName
+ * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+ */
+ public static function getInstallPath($packageName)
+ {
+ foreach (self::getInstalled() as $installed) {
+ if (!isset($installed['versions'][$packageName])) {
+ continue;
+ }
+
+ return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+ }
+
+ throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+ }
+
+ /**
+ * @return array
+ * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
+ */
+ public static function getRootPackage()
+ {
+ $installed = self::getInstalled();
+
+ return $installed[0]['root'];
+ }
+
+ /**
+ * Returns the raw installed.php data for custom implementations
+ *
+ * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+ * @return array[]
+ * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
+ */
+ public static function getRawData()
+ {
+ @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = include __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+
+ return self::$installed;
+ }
+
+ /**
+ * Returns the raw data of all installed.php which are currently loaded for custom implementations
+ *
+ * @return array[]
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+ */
+ public static function getAllRawData()
+ {
+ return self::getInstalled();
+ }
+
+ /**
+ * Lets you reload the static array from another file
+ *
+ * This is only useful for complex integrations in which a project needs to use
+ * this class but then also needs to execute another project's autoloader in process,
+ * and wants to ensure both projects have access to their version of installed.php.
+ *
+ * A typical case would be PHPUnit, where it would need to make sure it reads all
+ * the data it needs from this class, then call reload() with
+ * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+ * the project in which it runs can then also use this class safely, without
+ * interference between PHPUnit's dependencies and the project's dependencies.
+ *
+ * @param array[] $data A vendor/composer/installed.php data set
+ * @return void
+ *
+ * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
+ */
+ public static function reload($data)
+ {
+ self::$installed = $data;
+ self::$installedByVendor = array();
+ }
+
+ /**
+ * @return array[]
+ * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+ */
+ private static function getInstalled()
+ {
+ if (null === self::$canGetVendors) {
+ self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+ }
+
+ $installed = array();
+
+ if (self::$canGetVendors) {
+ foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+ if (isset(self::$installedByVendor[$vendorDir])) {
+ $installed[] = self::$installedByVendor[$vendorDir];
+ } elseif (is_file($vendorDir.'/composer/installed.php')) {
+ $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
+ if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
+ self::$installed = $installed[count($installed) - 1];
+ }
+ }
+ }
+ }
+
+ if (null === self::$installed) {
+ // only require the installed.php file if this file is loaded from its dumped location,
+ // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+ if (substr(__DIR__, -8, 1) !== 'C') {
+ self::$installed = require __DIR__ . '/installed.php';
+ } else {
+ self::$installed = array();
+ }
+ }
+ $installed[] = self::$installed;
+
+ return $installed;
+ }
+}
diff --git a/apps/files_external/composer/composer/LICENSE b/apps/files_external/composer/composer/LICENSE
new file mode 100644
index 00000000000..f27399a042d
--- /dev/null
+++ b/apps/files_external/composer/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/apps/files_external/composer/composer/autoload_classmap.php b/apps/files_external/composer/composer/autoload_classmap.php
new file mode 100644
index 00000000000..c6037ea9ded
--- /dev/null
+++ b/apps/files_external/composer/composer/autoload_classmap.php
@@ -0,0 +1,121 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = $vendorDir;
+
+return array(
+ 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+ 'OCA\\Files_External\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
+ 'OCA\\Files_External\\BackgroundJob\\CredentialsCleanup' => $baseDir . '/../lib/BackgroundJob/CredentialsCleanup.php',
+ 'OCA\\Files_External\\Command\\Applicable' => $baseDir . '/../lib/Command/Applicable.php',
+ 'OCA\\Files_External\\Command\\Backends' => $baseDir . '/../lib/Command/Backends.php',
+ 'OCA\\Files_External\\Command\\Config' => $baseDir . '/../lib/Command/Config.php',
+ 'OCA\\Files_External\\Command\\Create' => $baseDir . '/../lib/Command/Create.php',
+ 'OCA\\Files_External\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
+ 'OCA\\Files_External\\Command\\Export' => $baseDir . '/../lib/Command/Export.php',
+ 'OCA\\Files_External\\Command\\Import' => $baseDir . '/../lib/Command/Import.php',
+ 'OCA\\Files_External\\Command\\ListCommand' => $baseDir . '/../lib/Command/ListCommand.php',
+ 'OCA\\Files_External\\Command\\Notify' => $baseDir . '/../lib/Command/Notify.php',
+ 'OCA\\Files_External\\Command\\Option' => $baseDir . '/../lib/Command/Option.php',
+ 'OCA\\Files_External\\Command\\Verify' => $baseDir . '/../lib/Command/Verify.php',
+ 'OCA\\Files_External\\Config\\ConfigAdapter' => $baseDir . '/../lib/Config/ConfigAdapter.php',
+ 'OCA\\Files_External\\Config\\ExternalMountPoint' => $baseDir . '/../lib/Config/ExternalMountPoint.php',
+ 'OCA\\Files_External\\Config\\IConfigHandler' => $baseDir . '/../lib/Config/IConfigHandler.php',
+ 'OCA\\Files_External\\Config\\SimpleSubstitutionTrait' => $baseDir . '/../lib/Config/SimpleSubstitutionTrait.php',
+ 'OCA\\Files_External\\Config\\SystemMountPoint' => $baseDir . '/../lib/Config/SystemMountPoint.php',
+ 'OCA\\Files_External\\Config\\UserContext' => $baseDir . '/../lib/Config/UserContext.php',
+ 'OCA\\Files_External\\Config\\UserPlaceholderHandler' => $baseDir . '/../lib/Config/UserPlaceholderHandler.php',
+ 'OCA\\Files_External\\Controller\\AjaxController' => $baseDir . '/../lib/Controller/AjaxController.php',
+ 'OCA\\Files_External\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php',
+ 'OCA\\Files_External\\Controller\\GlobalStoragesController' => $baseDir . '/../lib/Controller/GlobalStoragesController.php',
+ 'OCA\\Files_External\\Controller\\StoragesController' => $baseDir . '/../lib/Controller/StoragesController.php',
+ 'OCA\\Files_External\\Controller\\UserGlobalStoragesController' => $baseDir . '/../lib/Controller/UserGlobalStoragesController.php',
+ 'OCA\\Files_External\\Controller\\UserStoragesController' => $baseDir . '/../lib/Controller/UserStoragesController.php',
+ 'OCA\\Files_External\\Lib\\Auth\\AmazonS3\\AccessKey' => $baseDir . '/../lib/Lib/Auth/AmazonS3/AccessKey.php',
+ 'OCA\\Files_External\\Lib\\Auth\\AuthMechanism' => $baseDir . '/../lib/Lib/Auth/AuthMechanism.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Builtin' => $baseDir . '/../lib/Lib/Auth/Builtin.php',
+ 'OCA\\Files_External\\Lib\\Auth\\IUserProvided' => $baseDir . '/../lib/Lib/Auth/IUserProvided.php',
+ 'OCA\\Files_External\\Lib\\Auth\\InvalidAuth' => $baseDir . '/../lib/Lib/Auth/InvalidAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\NullMechanism' => $baseDir . '/../lib/Lib/Auth/NullMechanism.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OAuth1\\OAuth1' => $baseDir . '/../lib/Lib/Auth/OAuth1/OAuth1.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OAuth2\\OAuth2' => $baseDir . '/../lib/Lib/Auth/OAuth2/OAuth2.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\OpenStackV2' => $baseDir . '/../lib/Lib/Auth/OpenStack/OpenStackV2.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\OpenStackV3' => $baseDir . '/../lib/Lib/Auth/OpenStack/OpenStackV3.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\Rackspace' => $baseDir . '/../lib/Lib/Auth/OpenStack/Rackspace.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\GlobalAuth' => $baseDir . '/../lib/Lib/Auth/Password/GlobalAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\LoginCredentials' => $baseDir . '/../lib/Lib/Auth/Password/LoginCredentials.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\Password' => $baseDir . '/../lib/Lib/Auth/Password/Password.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\SessionCredentials' => $baseDir . '/../lib/Lib/Auth/Password/SessionCredentials.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\UserGlobalAuth' => $baseDir . '/../lib/Lib/Auth/Password/UserGlobalAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\UserProvided' => $baseDir . '/../lib/Lib/Auth/Password/UserProvided.php',
+ 'OCA\\Files_External\\Lib\\Auth\\PublicKey\\RSA' => $baseDir . '/../lib/Lib/Auth/PublicKey/RSA.php',
+ 'OCA\\Files_External\\Lib\\Auth\\PublicKey\\RSAPrivateKey' => $baseDir . '/../lib/Lib/Auth/PublicKey/RSAPrivateKey.php',
+ 'OCA\\Files_External\\Lib\\Auth\\SMB\\KerberosApacheAuth' => $baseDir . '/../lib/Lib/Auth/SMB/KerberosApacheAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\SMB\\KerberosAuth' => $baseDir . '/../lib/Lib/Auth/SMB/KerberosAuth.php',
+ 'OCA\\Files_External\\Lib\\Backend\\AmazonS3' => $baseDir . '/../lib/Lib/Backend/AmazonS3.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Backend' => $baseDir . '/../lib/Lib/Backend/Backend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\DAV' => $baseDir . '/../lib/Lib/Backend/DAV.php',
+ 'OCA\\Files_External\\Lib\\Backend\\FTP' => $baseDir . '/../lib/Lib/Backend/FTP.php',
+ 'OCA\\Files_External\\Lib\\Backend\\InvalidBackend' => $baseDir . '/../lib/Lib/Backend/InvalidBackend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\LegacyBackend' => $baseDir . '/../lib/Lib/Backend/LegacyBackend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Local' => $baseDir . '/../lib/Lib/Backend/Local.php',
+ 'OCA\\Files_External\\Lib\\Backend\\OwnCloud' => $baseDir . '/../lib/Lib/Backend/OwnCloud.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SFTP' => $baseDir . '/../lib/Lib/Backend/SFTP.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SFTP_Key' => $baseDir . '/../lib/Lib/Backend/SFTP_Key.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SMB' => $baseDir . '/../lib/Lib/Backend/SMB.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SMB_OC' => $baseDir . '/../lib/Lib/Backend/SMB_OC.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Swift' => $baseDir . '/../lib/Lib/Backend/Swift.php',
+ 'OCA\\Files_External\\Lib\\Config\\IAuthMechanismProvider' => $baseDir . '/../lib/Lib/Config/IAuthMechanismProvider.php',
+ 'OCA\\Files_External\\Lib\\Config\\IBackendProvider' => $baseDir . '/../lib/Lib/Config/IBackendProvider.php',
+ 'OCA\\Files_External\\Lib\\DefinitionParameter' => $baseDir . '/../lib/Lib/DefinitionParameter.php',
+ 'OCA\\Files_External\\Lib\\DependencyTrait' => $baseDir . '/../lib/Lib/DependencyTrait.php',
+ 'OCA\\Files_External\\Lib\\FrontendDefinitionTrait' => $baseDir . '/../lib/Lib/FrontendDefinitionTrait.php',
+ 'OCA\\Files_External\\Lib\\IFrontendDefinition' => $baseDir . '/../lib/Lib/IFrontendDefinition.php',
+ 'OCA\\Files_External\\Lib\\IIdentifier' => $baseDir . '/../lib/Lib/IIdentifier.php',
+ 'OCA\\Files_External\\Lib\\IdentifierTrait' => $baseDir . '/../lib/Lib/IdentifierTrait.php',
+ 'OCA\\Files_External\\Lib\\InsufficientDataForMeaningfulAnswerException' => $baseDir . '/../lib/Lib/InsufficientDataForMeaningfulAnswerException.php',
+ 'OCA\\Files_External\\Lib\\LegacyDependencyCheckPolyfill' => $baseDir . '/../lib/Lib/LegacyDependencyCheckPolyfill.php',
+ 'OCA\\Files_External\\Lib\\MissingDependency' => $baseDir . '/../lib/Lib/MissingDependency.php',
+ 'OCA\\Files_External\\Lib\\Notify\\SMBNotifyHandler' => $baseDir . '/../lib/Lib/Notify/SMBNotifyHandler.php',
+ 'OCA\\Files_External\\Lib\\PersonalMount' => $baseDir . '/../lib/Lib/PersonalMount.php',
+ 'OCA\\Files_External\\Lib\\PriorityTrait' => $baseDir . '/../lib/Lib/PriorityTrait.php',
+ 'OCA\\Files_External\\Lib\\SessionStorageWrapper' => $baseDir . '/../lib/Lib/SessionStorageWrapper.php',
+ 'OCA\\Files_External\\Lib\\StorageConfig' => $baseDir . '/../lib/Lib/StorageConfig.php',
+ 'OCA\\Files_External\\Lib\\StorageModifierTrait' => $baseDir . '/../lib/Lib/StorageModifierTrait.php',
+ 'OCA\\Files_External\\Lib\\Storage\\AmazonS3' => $baseDir . '/../lib/Lib/Storage/AmazonS3.php',
+ 'OCA\\Files_External\\Lib\\Storage\\FTP' => $baseDir . '/../lib/Lib/Storage/FTP.php',
+ 'OCA\\Files_External\\Lib\\Storage\\FtpConnection' => $baseDir . '/../lib/Lib/Storage/FtpConnection.php',
+ 'OCA\\Files_External\\Lib\\Storage\\OwnCloud' => $baseDir . '/../lib/Lib/Storage/OwnCloud.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTP' => $baseDir . '/../lib/Lib/Storage/SFTP.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTPReadStream' => $baseDir . '/../lib/Lib/Storage/SFTPReadStream.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTPWriteStream' => $baseDir . '/../lib/Lib/Storage/SFTPWriteStream.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SMB' => $baseDir . '/../lib/Lib/Storage/SMB.php',
+ 'OCA\\Files_External\\Lib\\Storage\\StreamWrapper' => $baseDir . '/../lib/Lib/Storage/StreamWrapper.php',
+ 'OCA\\Files_External\\Lib\\Storage\\Swift' => $baseDir . '/../lib/Lib/Storage/Swift.php',
+ 'OCA\\Files_External\\Lib\\VisibilityTrait' => $baseDir . '/../lib/Lib/VisibilityTrait.php',
+ 'OCA\\Files_External\\Listener\\GroupDeletedListener' => $baseDir . '/../lib/Listener/GroupDeletedListener.php',
+ 'OCA\\Files_External\\Listener\\StorePasswordListener' => $baseDir . '/../lib/Listener/StorePasswordListener.php',
+ 'OCA\\Files_External\\Listener\\UserDeletedListener' => $baseDir . '/../lib/Listener/UserDeletedListener.php',
+ 'OCA\\Files_External\\Migration\\DummyUserSession' => $baseDir . '/../lib/Migration/DummyUserSession.php',
+ 'OCA\\Files_External\\Migration\\Version1011Date20200630192246' => $baseDir . '/../lib/Migration/Version1011Date20200630192246.php',
+ 'OCA\\Files_External\\Migration\\Version1015Date20211104103506' => $baseDir . '/../lib/Migration/Version1015Date20211104103506.php',
+ 'OCA\\Files_External\\Migration\\Version1016Date20220324154536' => $baseDir . '/../lib/Migration/Version1016Date20220324154536.php',
+ 'OCA\\Files_External\\Migration\\Version22000Date20210216084416' => $baseDir . '/../lib/Migration/Version22000Date20210216084416.php',
+ 'OCA\\Files_External\\MountConfig' => $baseDir . '/../lib/MountConfig.php',
+ 'OCA\\Files_External\\NotFoundException' => $baseDir . '/../lib/NotFoundException.php',
+ 'OCA\\Files_External\\Service\\BackendService' => $baseDir . '/../lib/Service/BackendService.php',
+ 'OCA\\Files_External\\Service\\DBConfigService' => $baseDir . '/../lib/Service/DBConfigService.php',
+ 'OCA\\Files_External\\Service\\GlobalStoragesService' => $baseDir . '/../lib/Service/GlobalStoragesService.php',
+ 'OCA\\Files_External\\Service\\ImportLegacyStoragesService' => $baseDir . '/../lib/Service/ImportLegacyStoragesService.php',
+ 'OCA\\Files_External\\Service\\LegacyStoragesService' => $baseDir . '/../lib/Service/LegacyStoragesService.php',
+ 'OCA\\Files_External\\Service\\StoragesService' => $baseDir . '/../lib/Service/StoragesService.php',
+ 'OCA\\Files_External\\Service\\UserGlobalStoragesService' => $baseDir . '/../lib/Service/UserGlobalStoragesService.php',
+ 'OCA\\Files_External\\Service\\UserStoragesService' => $baseDir . '/../lib/Service/UserStoragesService.php',
+ 'OCA\\Files_External\\Service\\UserTrait' => $baseDir . '/../lib/Service/UserTrait.php',
+ 'OCA\\Files_External\\Settings\\Admin' => $baseDir . '/../lib/Settings/Admin.php',
+ 'OCA\\Files_External\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php',
+ 'OCA\\Files_External\\Settings\\PersonalSection' => $baseDir . '/../lib/Settings/PersonalSection.php',
+ 'OCA\\Files_External\\Settings\\Section' => $baseDir . '/../lib/Settings/Section.php',
+);
diff --git a/apps/files_external/composer/composer/autoload_namespaces.php b/apps/files_external/composer/composer/autoload_namespaces.php
new file mode 100644
index 00000000000..3f5c9296251
--- /dev/null
+++ b/apps/files_external/composer/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = $vendorDir;
+
+return array(
+);
diff --git a/apps/files_external/composer/composer/autoload_psr4.php b/apps/files_external/composer/composer/autoload_psr4.php
new file mode 100644
index 00000000000..a8389f14e6a
--- /dev/null
+++ b/apps/files_external/composer/composer/autoload_psr4.php
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = $vendorDir;
+
+return array(
+ 'OCA\\Files_External\\' => array($baseDir . '/../lib'),
+);
diff --git a/apps/files_external/composer/composer/autoload_real.php b/apps/files_external/composer/composer/autoload_real.php
new file mode 100644
index 00000000000..3b19f021e48
--- /dev/null
+++ b/apps/files_external/composer/composer/autoload_real.php
@@ -0,0 +1,37 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitFiles_External
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ /**
+ * @return \Composer\Autoload\ClassLoader
+ */
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
+ spl_autoload_register(array('ComposerAutoloaderInitFiles_External', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
+ spl_autoload_unregister(array('ComposerAutoloaderInitFiles_External', 'loadClassLoader'));
+
+ require __DIR__ . '/autoload_static.php';
+ call_user_func(\Composer\Autoload\ComposerStaticInitFiles_External::getInitializer($loader));
+
+ $loader->setClassMapAuthoritative(true);
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/apps/files_external/composer/composer/autoload_static.php b/apps/files_external/composer/composer/autoload_static.php
new file mode 100644
index 00000000000..26091fb32b3
--- /dev/null
+++ b/apps/files_external/composer/composer/autoload_static.php
@@ -0,0 +1,147 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitFiles_External
+{
+ public static $prefixLengthsPsr4 = array (
+ 'O' =>
+ array (
+ 'OCA\\Files_External\\' => 19,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'OCA\\Files_External\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/../lib',
+ ),
+ );
+
+ public static $classMap = array (
+ 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+ 'OCA\\Files_External\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
+ 'OCA\\Files_External\\BackgroundJob\\CredentialsCleanup' => __DIR__ . '/..' . '/../lib/BackgroundJob/CredentialsCleanup.php',
+ 'OCA\\Files_External\\Command\\Applicable' => __DIR__ . '/..' . '/../lib/Command/Applicable.php',
+ 'OCA\\Files_External\\Command\\Backends' => __DIR__ . '/..' . '/../lib/Command/Backends.php',
+ 'OCA\\Files_External\\Command\\Config' => __DIR__ . '/..' . '/../lib/Command/Config.php',
+ 'OCA\\Files_External\\Command\\Create' => __DIR__ . '/..' . '/../lib/Command/Create.php',
+ 'OCA\\Files_External\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
+ 'OCA\\Files_External\\Command\\Export' => __DIR__ . '/..' . '/../lib/Command/Export.php',
+ 'OCA\\Files_External\\Command\\Import' => __DIR__ . '/..' . '/../lib/Command/Import.php',
+ 'OCA\\Files_External\\Command\\ListCommand' => __DIR__ . '/..' . '/../lib/Command/ListCommand.php',
+ 'OCA\\Files_External\\Command\\Notify' => __DIR__ . '/..' . '/../lib/Command/Notify.php',
+ 'OCA\\Files_External\\Command\\Option' => __DIR__ . '/..' . '/../lib/Command/Option.php',
+ 'OCA\\Files_External\\Command\\Verify' => __DIR__ . '/..' . '/../lib/Command/Verify.php',
+ 'OCA\\Files_External\\Config\\ConfigAdapter' => __DIR__ . '/..' . '/../lib/Config/ConfigAdapter.php',
+ 'OCA\\Files_External\\Config\\ExternalMountPoint' => __DIR__ . '/..' . '/../lib/Config/ExternalMountPoint.php',
+ 'OCA\\Files_External\\Config\\IConfigHandler' => __DIR__ . '/..' . '/../lib/Config/IConfigHandler.php',
+ 'OCA\\Files_External\\Config\\SimpleSubstitutionTrait' => __DIR__ . '/..' . '/../lib/Config/SimpleSubstitutionTrait.php',
+ 'OCA\\Files_External\\Config\\SystemMountPoint' => __DIR__ . '/..' . '/../lib/Config/SystemMountPoint.php',
+ 'OCA\\Files_External\\Config\\UserContext' => __DIR__ . '/..' . '/../lib/Config/UserContext.php',
+ 'OCA\\Files_External\\Config\\UserPlaceholderHandler' => __DIR__ . '/..' . '/../lib/Config/UserPlaceholderHandler.php',
+ 'OCA\\Files_External\\Controller\\AjaxController' => __DIR__ . '/..' . '/../lib/Controller/AjaxController.php',
+ 'OCA\\Files_External\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php',
+ 'OCA\\Files_External\\Controller\\GlobalStoragesController' => __DIR__ . '/..' . '/../lib/Controller/GlobalStoragesController.php',
+ 'OCA\\Files_External\\Controller\\StoragesController' => __DIR__ . '/..' . '/../lib/Controller/StoragesController.php',
+ 'OCA\\Files_External\\Controller\\UserGlobalStoragesController' => __DIR__ . '/..' . '/../lib/Controller/UserGlobalStoragesController.php',
+ 'OCA\\Files_External\\Controller\\UserStoragesController' => __DIR__ . '/..' . '/../lib/Controller/UserStoragesController.php',
+ 'OCA\\Files_External\\Lib\\Auth\\AmazonS3\\AccessKey' => __DIR__ . '/..' . '/../lib/Lib/Auth/AmazonS3/AccessKey.php',
+ 'OCA\\Files_External\\Lib\\Auth\\AuthMechanism' => __DIR__ . '/..' . '/../lib/Lib/Auth/AuthMechanism.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Builtin' => __DIR__ . '/..' . '/../lib/Lib/Auth/Builtin.php',
+ 'OCA\\Files_External\\Lib\\Auth\\IUserProvided' => __DIR__ . '/..' . '/../lib/Lib/Auth/IUserProvided.php',
+ 'OCA\\Files_External\\Lib\\Auth\\InvalidAuth' => __DIR__ . '/..' . '/../lib/Lib/Auth/InvalidAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\NullMechanism' => __DIR__ . '/..' . '/../lib/Lib/Auth/NullMechanism.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OAuth1\\OAuth1' => __DIR__ . '/..' . '/../lib/Lib/Auth/OAuth1/OAuth1.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OAuth2\\OAuth2' => __DIR__ . '/..' . '/../lib/Lib/Auth/OAuth2/OAuth2.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\OpenStackV2' => __DIR__ . '/..' . '/../lib/Lib/Auth/OpenStack/OpenStackV2.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\OpenStackV3' => __DIR__ . '/..' . '/../lib/Lib/Auth/OpenStack/OpenStackV3.php',
+ 'OCA\\Files_External\\Lib\\Auth\\OpenStack\\Rackspace' => __DIR__ . '/..' . '/../lib/Lib/Auth/OpenStack/Rackspace.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\GlobalAuth' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/GlobalAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\LoginCredentials' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/LoginCredentials.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\Password' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/Password.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\SessionCredentials' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/SessionCredentials.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\UserGlobalAuth' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/UserGlobalAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\Password\\UserProvided' => __DIR__ . '/..' . '/../lib/Lib/Auth/Password/UserProvided.php',
+ 'OCA\\Files_External\\Lib\\Auth\\PublicKey\\RSA' => __DIR__ . '/..' . '/../lib/Lib/Auth/PublicKey/RSA.php',
+ 'OCA\\Files_External\\Lib\\Auth\\PublicKey\\RSAPrivateKey' => __DIR__ . '/..' . '/../lib/Lib/Auth/PublicKey/RSAPrivateKey.php',
+ 'OCA\\Files_External\\Lib\\Auth\\SMB\\KerberosApacheAuth' => __DIR__ . '/..' . '/../lib/Lib/Auth/SMB/KerberosApacheAuth.php',
+ 'OCA\\Files_External\\Lib\\Auth\\SMB\\KerberosAuth' => __DIR__ . '/..' . '/../lib/Lib/Auth/SMB/KerberosAuth.php',
+ 'OCA\\Files_External\\Lib\\Backend\\AmazonS3' => __DIR__ . '/..' . '/../lib/Lib/Backend/AmazonS3.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Backend' => __DIR__ . '/..' . '/../lib/Lib/Backend/Backend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\DAV' => __DIR__ . '/..' . '/../lib/Lib/Backend/DAV.php',
+ 'OCA\\Files_External\\Lib\\Backend\\FTP' => __DIR__ . '/..' . '/../lib/Lib/Backend/FTP.php',
+ 'OCA\\Files_External\\Lib\\Backend\\InvalidBackend' => __DIR__ . '/..' . '/../lib/Lib/Backend/InvalidBackend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\LegacyBackend' => __DIR__ . '/..' . '/../lib/Lib/Backend/LegacyBackend.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Local' => __DIR__ . '/..' . '/../lib/Lib/Backend/Local.php',
+ 'OCA\\Files_External\\Lib\\Backend\\OwnCloud' => __DIR__ . '/..' . '/../lib/Lib/Backend/OwnCloud.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SFTP' => __DIR__ . '/..' . '/../lib/Lib/Backend/SFTP.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SFTP_Key' => __DIR__ . '/..' . '/../lib/Lib/Backend/SFTP_Key.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SMB' => __DIR__ . '/..' . '/../lib/Lib/Backend/SMB.php',
+ 'OCA\\Files_External\\Lib\\Backend\\SMB_OC' => __DIR__ . '/..' . '/../lib/Lib/Backend/SMB_OC.php',
+ 'OCA\\Files_External\\Lib\\Backend\\Swift' => __DIR__ . '/..' . '/../lib/Lib/Backend/Swift.php',
+ 'OCA\\Files_External\\Lib\\Config\\IAuthMechanismProvider' => __DIR__ . '/..' . '/../lib/Lib/Config/IAuthMechanismProvider.php',
+ 'OCA\\Files_External\\Lib\\Config\\IBackendProvider' => __DIR__ . '/..' . '/../lib/Lib/Config/IBackendProvider.php',
+ 'OCA\\Files_External\\Lib\\DefinitionParameter' => __DIR__ . '/..' . '/../lib/Lib/DefinitionParameter.php',
+ 'OCA\\Files_External\\Lib\\DependencyTrait' => __DIR__ . '/..' . '/../lib/Lib/DependencyTrait.php',
+ 'OCA\\Files_External\\Lib\\FrontendDefinitionTrait' => __DIR__ . '/..' . '/../lib/Lib/FrontendDefinitionTrait.php',
+ 'OCA\\Files_External\\Lib\\IFrontendDefinition' => __DIR__ . '/..' . '/../lib/Lib/IFrontendDefinition.php',
+ 'OCA\\Files_External\\Lib\\IIdentifier' => __DIR__ . '/..' . '/../lib/Lib/IIdentifier.php',
+ 'OCA\\Files_External\\Lib\\IdentifierTrait' => __DIR__ . '/..' . '/../lib/Lib/IdentifierTrait.php',
+ 'OCA\\Files_External\\Lib\\InsufficientDataForMeaningfulAnswerException' => __DIR__ . '/..' . '/../lib/Lib/InsufficientDataForMeaningfulAnswerException.php',
+ 'OCA\\Files_External\\Lib\\LegacyDependencyCheckPolyfill' => __DIR__ . '/..' . '/../lib/Lib/LegacyDependencyCheckPolyfill.php',
+ 'OCA\\Files_External\\Lib\\MissingDependency' => __DIR__ . '/..' . '/../lib/Lib/MissingDependency.php',
+ 'OCA\\Files_External\\Lib\\Notify\\SMBNotifyHandler' => __DIR__ . '/..' . '/../lib/Lib/Notify/SMBNotifyHandler.php',
+ 'OCA\\Files_External\\Lib\\PersonalMount' => __DIR__ . '/..' . '/../lib/Lib/PersonalMount.php',
+ 'OCA\\Files_External\\Lib\\PriorityTrait' => __DIR__ . '/..' . '/../lib/Lib/PriorityTrait.php',
+ 'OCA\\Files_External\\Lib\\SessionStorageWrapper' => __DIR__ . '/..' . '/../lib/Lib/SessionStorageWrapper.php',
+ 'OCA\\Files_External\\Lib\\StorageConfig' => __DIR__ . '/..' . '/../lib/Lib/StorageConfig.php',
+ 'OCA\\Files_External\\Lib\\StorageModifierTrait' => __DIR__ . '/..' . '/../lib/Lib/StorageModifierTrait.php',
+ 'OCA\\Files_External\\Lib\\Storage\\AmazonS3' => __DIR__ . '/..' . '/../lib/Lib/Storage/AmazonS3.php',
+ 'OCA\\Files_External\\Lib\\Storage\\FTP' => __DIR__ . '/..' . '/../lib/Lib/Storage/FTP.php',
+ 'OCA\\Files_External\\Lib\\Storage\\FtpConnection' => __DIR__ . '/..' . '/../lib/Lib/Storage/FtpConnection.php',
+ 'OCA\\Files_External\\Lib\\Storage\\OwnCloud' => __DIR__ . '/..' . '/../lib/Lib/Storage/OwnCloud.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTP' => __DIR__ . '/..' . '/../lib/Lib/Storage/SFTP.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTPReadStream' => __DIR__ . '/..' . '/../lib/Lib/Storage/SFTPReadStream.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SFTPWriteStream' => __DIR__ . '/..' . '/../lib/Lib/Storage/SFTPWriteStream.php',
+ 'OCA\\Files_External\\Lib\\Storage\\SMB' => __DIR__ . '/..' . '/../lib/Lib/Storage/SMB.php',
+ 'OCA\\Files_External\\Lib\\Storage\\StreamWrapper' => __DIR__ . '/..' . '/../lib/Lib/Storage/StreamWrapper.php',
+ 'OCA\\Files_External\\Lib\\Storage\\Swift' => __DIR__ . '/..' . '/../lib/Lib/Storage/Swift.php',
+ 'OCA\\Files_External\\Lib\\VisibilityTrait' => __DIR__ . '/..' . '/../lib/Lib/VisibilityTrait.php',
+ 'OCA\\Files_External\\Listener\\GroupDeletedListener' => __DIR__ . '/..' . '/../lib/Listener/GroupDeletedListener.php',
+ 'OCA\\Files_External\\Listener\\StorePasswordListener' => __DIR__ . '/..' . '/../lib/Listener/StorePasswordListener.php',
+ 'OCA\\Files_External\\Listener\\UserDeletedListener' => __DIR__ . '/..' . '/../lib/Listener/UserDeletedListener.php',
+ 'OCA\\Files_External\\Migration\\DummyUserSession' => __DIR__ . '/..' . '/../lib/Migration/DummyUserSession.php',
+ 'OCA\\Files_External\\Migration\\Version1011Date20200630192246' => __DIR__ . '/..' . '/../lib/Migration/Version1011Date20200630192246.php',
+ 'OCA\\Files_External\\Migration\\Version1015Date20211104103506' => __DIR__ . '/..' . '/../lib/Migration/Version1015Date20211104103506.php',
+ 'OCA\\Files_External\\Migration\\Version1016Date20220324154536' => __DIR__ . '/..' . '/../lib/Migration/Version1016Date20220324154536.php',
+ 'OCA\\Files_External\\Migration\\Version22000Date20210216084416' => __DIR__ . '/..' . '/../lib/Migration/Version22000Date20210216084416.php',
+ 'OCA\\Files_External\\MountConfig' => __DIR__ . '/..' . '/../lib/MountConfig.php',
+ 'OCA\\Files_External\\NotFoundException' => __DIR__ . '/..' . '/../lib/NotFoundException.php',
+ 'OCA\\Files_External\\Service\\BackendService' => __DIR__ . '/..' . '/../lib/Service/BackendService.php',
+ 'OCA\\Files_External\\Service\\DBConfigService' => __DIR__ . '/..' . '/../lib/Service/DBConfigService.php',
+ 'OCA\\Files_External\\Service\\GlobalStoragesService' => __DIR__ . '/..' . '/../lib/Service/GlobalStoragesService.php',
+ 'OCA\\Files_External\\Service\\ImportLegacyStoragesService' => __DIR__ . '/..' . '/../lib/Service/ImportLegacyStoragesService.php',
+ 'OCA\\Files_External\\Service\\LegacyStoragesService' => __DIR__ . '/..' . '/../lib/Service/LegacyStoragesService.php',
+ 'OCA\\Files_External\\Service\\StoragesService' => __DIR__ . '/..' . '/../lib/Service/StoragesService.php',
+ 'OCA\\Files_External\\Service\\UserGlobalStoragesService' => __DIR__ . '/..' . '/../lib/Service/UserGlobalStoragesService.php',
+ 'OCA\\Files_External\\Service\\UserStoragesService' => __DIR__ . '/..' . '/../lib/Service/UserStoragesService.php',
+ 'OCA\\Files_External\\Service\\UserTrait' => __DIR__ . '/..' . '/../lib/Service/UserTrait.php',
+ 'OCA\\Files_External\\Settings\\Admin' => __DIR__ . '/..' . '/../lib/Settings/Admin.php',
+ 'OCA\\Files_External\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php',
+ 'OCA\\Files_External\\Settings\\PersonalSection' => __DIR__ . '/..' . '/../lib/Settings/PersonalSection.php',
+ 'OCA\\Files_External\\Settings\\Section' => __DIR__ . '/..' . '/../lib/Settings/Section.php',
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInitFiles_External::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInitFiles_External::$prefixDirsPsr4;
+ $loader->classMap = ComposerStaticInitFiles_External::$classMap;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/apps/files_external/composer/composer/installed.json b/apps/files_external/composer/composer/installed.json
new file mode 100644
index 00000000000..f20a6c47c6d
--- /dev/null
+++ b/apps/files_external/composer/composer/installed.json
@@ -0,0 +1,5 @@
+{
+ "packages": [],
+ "dev": false,
+ "dev-package-names": []
+}
diff --git a/apps/files_external/composer/composer/installed.php b/apps/files_external/composer/composer/installed.php
new file mode 100644
index 00000000000..1099399ef12
--- /dev/null
+++ b/apps/files_external/composer/composer/installed.php
@@ -0,0 +1,23 @@
+<?php return array(
+ 'root' => array(
+ 'name' => '__root__',
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'reference' => 'd7bd7639c21fe9de94408198bc7089ebe617ff67',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../',
+ 'aliases' => array(),
+ 'dev' => false,
+ ),
+ 'versions' => array(
+ '__root__' => array(
+ 'pretty_version' => 'dev-master',
+ 'version' => 'dev-master',
+ 'reference' => 'd7bd7639c21fe9de94408198bc7089ebe617ff67',
+ 'type' => 'library',
+ 'install_path' => __DIR__ . '/../',
+ 'aliases' => array(),
+ 'dev_requirement' => false,
+ ),
+ ),
+);
diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js
index 86f71b4e1c5..abb8a73c8a3 100644
--- a/apps/files_external/l10n/uk.js
+++ b/apps/files_external/l10n/uk.js
@@ -22,7 +22,7 @@ OC.L10N.register(
"Disconnect" : "Від'єднати",
"Admin defined" : "Визначено адміністратором",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Автоматична перевірка статусу вимкнена через велику кількість налаштованих сховищ, натисніть, щоб перевірити статус",
- "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати цю зовнішню пам’ять? Це зробить сховище недоступним у Nextcloud і призведе до видалення цих файлів і папок на будь-якому клієнті синхронізації, який наразі підключено, але не видалить жодних файлів і папок на самому зовнішньому сховищі.",
+ "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати цю зовнішню пам’ять? Це зробить сховище недоступним у Nextcloud і призведе до видалення цих файлів і папок на будь-якому клієнті синхронізації, який наразі підключено, але не вилучіть жодних файлів і папок на самому зовнішньому сховищі.",
"Delete storage?" : "Вилучити сховище?",
"Saved" : "Збережено",
"Saving …" : "Збереження ..",
diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json
index aeefd93b9f0..b09643de1f4 100644
--- a/apps/files_external/l10n/uk.json
+++ b/apps/files_external/l10n/uk.json
@@ -20,7 +20,7 @@
"Disconnect" : "Від'єднати",
"Admin defined" : "Визначено адміністратором",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Автоматична перевірка статусу вимкнена через велику кількість налаштованих сховищ, натисніть, щоб перевірити статус",
- "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати цю зовнішню пам’ять? Це зробить сховище недоступним у Nextcloud і призведе до видалення цих файлів і папок на будь-якому клієнті синхронізації, який наразі підключено, але не видалить жодних файлів і папок на самому зовнішньому сховищі.",
+ "Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Ви впевнені, що бажаєте від’єднати цю зовнішню пам’ять? Це зробить сховище недоступним у Nextcloud і призведе до видалення цих файлів і папок на будь-якому клієнті синхронізації, який наразі підключено, але не вилучіть жодних файлів і папок на самому зовнішньому сховищі.",
"Delete storage?" : "Вилучити сховище?",
"Saved" : "Збережено",
"Saving …" : "Збереження ..",
diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js
index 60ce00e2af7..ff32b7d5ca4 100644
--- a/apps/files_sharing/l10n/uk.js
+++ b/apps/files_sharing/l10n/uk.js
@@ -204,8 +204,13 @@ OC.L10N.register(
"Shared via link by {initiator}" : "Спільний доступ через посилання від {initiator}",
"Mail share ({label})" : "Спільний доступ через пошту ({label})",
"Share link ({label})" : "Поділитися посиланням ({label})",
+ "Share link ({index})" : "Поділитися посиланням ({index})",
"Share link" : "Посилання на спільний доступ",
+ "Actions for \"{title}\"" : "Дія для \"{title}\"",
+ "Copy public link of \"{title}\" to clipboard" : "Копіювати публічне посилання \"{title}\" до буферу пам'яти",
"Error, please enter proper password and/or expiration date" : "Помилка. Будь ласка, зазначте правильний пароль та/або термін дії",
+ "Link share created" : "Створено посилання на спільний ресурс",
+ "Error while creating the share" : "Помилка під час створення спільного ресурсу",
"Search for share recipients" : "Виберіть отримувачів",
"No recommendations. Start typing." : "Відсутні рекомендації. Будь ласка, додайте.",
"Resharing is not allowed" : "Надання доступу іншим не дозволяється",
@@ -218,6 +223,8 @@ OC.L10N.register(
"Group" : "Група",
"Email" : "Ел.пошта",
"Circle" : "Коло",
+ "Talk conversation" : "Розмова Talk",
+ "Deck board" : "Дошка Deck",
"on {server}" : "на {server}",
"Others with access" : "Доступ для інших",
"No other users with access found" : "Більше немає користувачів, які мають доступ",
@@ -233,9 +240,14 @@ OC.L10N.register(
"Error creating the share" : "Помилка під час створення спільного ресурсу",
"Error updating the share: {errorMessage}" : "Помилка під час оновлення спільного ресурсу: {errorMessage}",
"Error updating the share" : "Помилка оновлення спільного ресурсу",
+ "File \"{path}\" has been unshared" : "Файл \"{path} вилучено зі спільного доступу",
+ "Folder \"{path}\" has been unshared" : "Каталог \"{path}\" було вилучено зі спільного доступу",
+ "Share {propertyName} saved" : "Спільний ресурс {propertyName} збережено",
"Shared" : "Спільні",
"Share" : "Спільний доступ",
"Shared with" : "Спільний доступ з",
+ "Password created successfully" : "Успішно створено пароль",
+ "Error generating password from password policy" : "Помилка під час створення пароля згідно з політикою паролів",
"Shared with you and the group {group} by {owner}" : " {owner} надав доступ вам та групі {group}",
"Shared with you and {circle} by {owner}" : "{owner} надав доступ вам та колу {circle}",
"Shared with you and the conversation {conversation} by {owner}" : "{owner} надав доступ вам та у чаті {conversation}",
@@ -262,6 +274,7 @@ OC.L10N.register(
"One or more of your shares will expire tomorrow" : "Термін дії одного чи кількох ваших спільних ресурсів спливає завтра",
"Copy to clipboard" : "Скопіювати до буферу обміну ",
"Sorry, this link doesn’t seem to work anymore." : "На жаль, посилання більше не дійсне.",
- "Toggle grid view" : "Перемкнути подання сіткою"
+ "Toggle grid view" : "Перемкнути подання сіткою",
+ "Error generating password from password_policy" : "Помилка під час створення паролів з password_policy"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json
index cc7dd107232..d6754d9564d 100644
--- a/apps/files_sharing/l10n/uk.json
+++ b/apps/files_sharing/l10n/uk.json
@@ -202,8 +202,13 @@
"Shared via link by {initiator}" : "Спільний доступ через посилання від {initiator}",
"Mail share ({label})" : "Спільний доступ через пошту ({label})",
"Share link ({label})" : "Поділитися посиланням ({label})",
+ "Share link ({index})" : "Поділитися посиланням ({index})",
"Share link" : "Посилання на спільний доступ",
+ "Actions for \"{title}\"" : "Дія для \"{title}\"",
+ "Copy public link of \"{title}\" to clipboard" : "Копіювати публічне посилання \"{title}\" до буферу пам'яти",
"Error, please enter proper password and/or expiration date" : "Помилка. Будь ласка, зазначте правильний пароль та/або термін дії",
+ "Link share created" : "Створено посилання на спільний ресурс",
+ "Error while creating the share" : "Помилка під час створення спільного ресурсу",
"Search for share recipients" : "Виберіть отримувачів",
"No recommendations. Start typing." : "Відсутні рекомендації. Будь ласка, додайте.",
"Resharing is not allowed" : "Надання доступу іншим не дозволяється",
@@ -216,6 +221,8 @@
"Group" : "Група",
"Email" : "Ел.пошта",
"Circle" : "Коло",
+ "Talk conversation" : "Розмова Talk",
+ "Deck board" : "Дошка Deck",
"on {server}" : "на {server}",
"Others with access" : "Доступ для інших",
"No other users with access found" : "Більше немає користувачів, які мають доступ",
@@ -231,9 +238,14 @@
"Error creating the share" : "Помилка під час створення спільного ресурсу",
"Error updating the share: {errorMessage}" : "Помилка під час оновлення спільного ресурсу: {errorMessage}",
"Error updating the share" : "Помилка оновлення спільного ресурсу",
+ "File \"{path}\" has been unshared" : "Файл \"{path} вилучено зі спільного доступу",
+ "Folder \"{path}\" has been unshared" : "Каталог \"{path}\" було вилучено зі спільного доступу",
+ "Share {propertyName} saved" : "Спільний ресурс {propertyName} збережено",
"Shared" : "Спільні",
"Share" : "Спільний доступ",
"Shared with" : "Спільний доступ з",
+ "Password created successfully" : "Успішно створено пароль",
+ "Error generating password from password policy" : "Помилка під час створення пароля згідно з політикою паролів",
"Shared with you and the group {group} by {owner}" : " {owner} надав доступ вам та групі {group}",
"Shared with you and {circle} by {owner}" : "{owner} надав доступ вам та колу {circle}",
"Shared with you and the conversation {conversation} by {owner}" : "{owner} надав доступ вам та у чаті {conversation}",
@@ -260,6 +272,7 @@
"One or more of your shares will expire tomorrow" : "Термін дії одного чи кількох ваших спільних ресурсів спливає завтра",
"Copy to clipboard" : "Скопіювати до буферу обміну ",
"Sorry, this link doesn’t seem to work anymore." : "На жаль, посилання більше не дійсне.",
- "Toggle grid view" : "Перемкнути подання сіткою"
+ "Toggle grid view" : "Перемкнути подання сіткою",
+ "Error generating password from password_policy" : "Помилка під час створення паролів з password_policy"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/apps/files_versions/l10n/eu.js b/apps/files_versions/l10n/eu.js
index 1a1405d924f..f3e0632b4e5 100644
--- a/apps/files_versions/l10n/eu.js
+++ b/apps/files_versions/l10n/eu.js
@@ -4,10 +4,19 @@ OC.L10N.register(
"Versions" : "Bertsioak",
"This application automatically maintains older versions of files that are changed." : "Aplikazio honek aldatzen diren fitxategien bertsio zaharrak mantentzen ditu automatikoki.",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Aplikazio honek automatikoki mantentzen ditu aldatzen diren fitxategien bertsio zaharragoak. Gaituta dagoenean, ezkutuko bertsioen karpeta batez hornitzen da erabiltzaile bakoitzaren direktorioa, fitxategien bertsio zaharrak gordetzeko. Erabiltzaileak edozein unetan bertsio zaharrago batera leheneratu dezake web interfazearen bidez, ordeztutako fitxategia bertsio bihurtuz. Aplikazioak automatikoki kudeatzen du bertsioen karpeta, erabiltzailea bertsioak direla eta kuotarik gabe geratuko ez dela ziurtatzeko.\n\t\tBertsioak iraungitzeaz gain, bertsioen aplikazioak ziurtatzen du ez dela inoiz erabiliko erabiltzailearen uneko espazio librearen %50 baino gehiago. Biltegiratutako bertsioek muga hori gainditzen badute, aplikazioak bertsio zaharrenak ezabatuko ditu, mugara jaitsi arte. Informazio gehiago dago eskuragarri bertsioen dokumentazioan.",
+ "Edit version name" : "Editatu bertsioaren izena",
"Restore version" : "Leheneratu bertsioa",
"Download version" : "Deskargatu bertsioa",
+ "Delete version" : "Ezabatu bertsioa",
+ "Version name" : "Bertsioaren izena",
+ "Remove version name" : "Kendu bertsioaren izena",
+ "Save version name" : "Gorde bertsioaren izena",
+ "Initial version restored" : "Hasierako bertsioa leheneratua",
"Version restored" : "Bertsioa leheneratu da",
"Could not restore version" : "Ezin izan da bertsioa leheneratu",
+ "Could not set version name" : "Ezin izan da bertsioaren izena ezarri",
+ "Could not delete version" : "Ezin izan da bertsioa ezabatu",
+ "${version.label} restored" : "${version.label} leheneratuta",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Fitxategi honek aldatzen diren fitxategien bertsio zaharrak mantentzen ditu. Aktibatzen denean, bertsioen karpeta ezkutu bat sortzen da erabiltzailearen karpeta barruan eta bertan gordetzen dira bertsio zaharrak. Erabiltzailek edozein bertsio zaharretara itzultzea erabaki dezake web interfazea erabiliz, ordezkatutako fitxategia bertsio bilakatuz. Aplikazio honek bertsioen karpeta automatikoki kudeatzen du erabiltzaileak ez dezan mugarik gainditu bertsioengatik.\n\t\tBertsioak iraungitzeaz gain, bertsioen aplikazio honek erabiltzailearen toki libre guztiaren %50 baino gehiago ez erabiltzea bermatzen du. Gordetako bertsioek muga hori gainditzen badute, aplikazioak bertsio zaharrenak ezabatuko ditu mugara iritsi arte. Informazio gehiago lortzeko aplikazioaren dokumentazioa irakurri dezakezu.",
"Failed to revert {file} to revision {timestamp}." : "Errorea egon da {fitxategia} {timestamp} bertsiora leheneratzean.",
"_%n byte_::_%n bytes_" : ["%nbyte","%n bytes"],
diff --git a/apps/files_versions/l10n/eu.json b/apps/files_versions/l10n/eu.json
index 23ee73955b1..43a61c3d6ee 100644
--- a/apps/files_versions/l10n/eu.json
+++ b/apps/files_versions/l10n/eu.json
@@ -2,10 +2,19 @@
"Versions" : "Bertsioak",
"This application automatically maintains older versions of files that are changed." : "Aplikazio honek aldatzen diren fitxategien bertsio zaharrak mantentzen ditu automatikoki.",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Aplikazio honek automatikoki mantentzen ditu aldatzen diren fitxategien bertsio zaharragoak. Gaituta dagoenean, ezkutuko bertsioen karpeta batez hornitzen da erabiltzaile bakoitzaren direktorioa, fitxategien bertsio zaharrak gordetzeko. Erabiltzaileak edozein unetan bertsio zaharrago batera leheneratu dezake web interfazearen bidez, ordeztutako fitxategia bertsio bihurtuz. Aplikazioak automatikoki kudeatzen du bertsioen karpeta, erabiltzailea bertsioak direla eta kuotarik gabe geratuko ez dela ziurtatzeko.\n\t\tBertsioak iraungitzeaz gain, bertsioen aplikazioak ziurtatzen du ez dela inoiz erabiliko erabiltzailearen uneko espazio librearen %50 baino gehiago. Biltegiratutako bertsioek muga hori gainditzen badute, aplikazioak bertsio zaharrenak ezabatuko ditu, mugara jaitsi arte. Informazio gehiago dago eskuragarri bertsioen dokumentazioan.",
+ "Edit version name" : "Editatu bertsioaren izena",
"Restore version" : "Leheneratu bertsioa",
"Download version" : "Deskargatu bertsioa",
+ "Delete version" : "Ezabatu bertsioa",
+ "Version name" : "Bertsioaren izena",
+ "Remove version name" : "Kendu bertsioaren izena",
+ "Save version name" : "Gorde bertsioaren izena",
+ "Initial version restored" : "Hasierako bertsioa leheneratua",
"Version restored" : "Bertsioa leheneratu da",
"Could not restore version" : "Ezin izan da bertsioa leheneratu",
+ "Could not set version name" : "Ezin izan da bertsioaren izena ezarri",
+ "Could not delete version" : "Ezin izan da bertsioa ezabatu",
+ "${version.label} restored" : "${version.label} leheneratuta",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Fitxategi honek aldatzen diren fitxategien bertsio zaharrak mantentzen ditu. Aktibatzen denean, bertsioen karpeta ezkutu bat sortzen da erabiltzailearen karpeta barruan eta bertan gordetzen dira bertsio zaharrak. Erabiltzailek edozein bertsio zaharretara itzultzea erabaki dezake web interfazea erabiliz, ordezkatutako fitxategia bertsio bilakatuz. Aplikazio honek bertsioen karpeta automatikoki kudeatzen du erabiltzaileak ez dezan mugarik gainditu bertsioengatik.\n\t\tBertsioak iraungitzeaz gain, bertsioen aplikazio honek erabiltzailearen toki libre guztiaren %50 baino gehiago ez erabiltzea bermatzen du. Gordetako bertsioek muga hori gainditzen badute, aplikazioak bertsio zaharrenak ezabatuko ditu mugara iritsi arte. Informazio gehiago lortzeko aplikazioaren dokumentazioa irakurri dezakezu.",
"Failed to revert {file} to revision {timestamp}." : "Errorea egon da {fitxategia} {timestamp} bertsiora leheneratzean.",
"_%n byte_::_%n bytes_" : ["%nbyte","%n bytes"],
diff --git a/apps/files_versions/l10n/uk.js b/apps/files_versions/l10n/uk.js
index 6c990816042..aa6341187c7 100644
--- a/apps/files_versions/l10n/uk.js
+++ b/apps/files_versions/l10n/uk.js
@@ -3,8 +3,22 @@ OC.L10N.register(
{
"Versions" : "Версії",
"This application automatically maintains older versions of files that are changed." : "Цей застосунок підтримує роботу з попередніми версіями файлів, які було змінено.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично підтримує старіші версії файлів, які було змінено. Якщо його увімкнено, прихований каталог версій створюється в каталозі кожного користувача та використовується для зберігання старих версій файлів. Користувач може будь-коли повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом з версіями файлів, щоб користувач не вичерпав квоту через надмірну кількість версій. \n\nНа додаток до закінчення терміну дії версій, додаток версій гарантує, що ніколи не буде використано більше 50% вільного простору користувача. Якщо збережені версії перевищують це обмеження, програма спочатку видалить найстаріші версії, доки не досягне цього обмеження. Додаткову інформацію можна знайти в документації версій.",
- "Version" : "Версія",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично підтримує старіші версії файлів, які було змінено. Якщо його увімкнено, прихований каталог версій створюється в каталозі кожного користувача та використовується для зберігання старих версій файлів. Користувач може будь-коли повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом з версіями файлів, щоб користувач не вичерпав квоту через надмірну кількість версій. \n\nНа додаток до закінчення терміну дії версій, додаток версій гарантує, що ніколи не буде використано більше 50% вільного простору користувача. Якщо збережені версії перевищують це обмеження, програма спочатку вилучіть найстаріші версії, доки не досягне цього обмеження. Додаткову інформацію можна знайти в документації версій.",
+ "Name this version" : "Назвіть цю версію",
+ "Edit version name" : "Редагуйте назву версії",
+ "Restore version" : "Відновити версію",
+ "Download version" : "Звантажити версію",
+ "Delete version" : "Вилучити версію",
+ "Version name" : "Назва версії",
+ "Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "Версії з назвами є постійними та їх виключено з автоматичного очищення після переповнення квоти у сховищі.",
+ "Remove version name" : "Вилучити назву версії",
+ "Save version name" : "Зберегти назву версії",
+ "Initial version restored" : "Початкову версію відновлено",
+ "Version restored" : "Версію відновлено",
+ "Could not restore version" : "Не вдалося відновити версію",
+ "Could not set version name" : "Не вдалося встановити назву для версії",
+ "Could not delete version" : "Не вдалося вилучити версію",
+ "${version.label} restored" : "${version.label} відновлено",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично обслуговує попередні версії файлів, які були змінені. Коли застосунок ввімкнено, у кожному каталозі користувача створюється прихована каталога версій файлів, у якій зберігаються старі версії файлів. Користувач за допомогою веб-інтерфейсу може повернутися у будь-який момент до однієї з попередніх версій файлу. При цьому файл, що замінюється, стає однією з версій. Застосунок також автоматично відслідковує каталоги з версіями файлів згідно з обмеженнями квот користувача.\n\t\tКрім відслідковування терміну збереження версій застосунок також забезпечує обмеження використаного версіями об'єму, щоб версії ніколи не використовували більше 50% доступного користувачу вільного дискового простору. В разі перевищення вказаних лімітів застосунок автоматично вилучає найдавніші версії аж до повернення в межі лімітів. Додаткова інформація доступна у документації до застосунку Версії.",
"Failed to revert {file} to revision {timestamp}." : "Не вдалося повернути {file} до ревізії {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байтів","%n байтів"],
diff --git a/apps/files_versions/l10n/uk.json b/apps/files_versions/l10n/uk.json
index 003f8be7402..337cff314f6 100644
--- a/apps/files_versions/l10n/uk.json
+++ b/apps/files_versions/l10n/uk.json
@@ -1,8 +1,22 @@
{ "translations": {
"Versions" : "Версії",
"This application automatically maintains older versions of files that are changed." : "Цей застосунок підтримує роботу з попередніми версіями файлів, які було змінено.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично підтримує старіші версії файлів, які було змінено. Якщо його увімкнено, прихований каталог версій створюється в каталозі кожного користувача та використовується для зберігання старих версій файлів. Користувач може будь-коли повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом з версіями файлів, щоб користувач не вичерпав квоту через надмірну кількість версій. \n\nНа додаток до закінчення терміну дії версій, додаток версій гарантує, що ніколи не буде використано більше 50% вільного простору користувача. Якщо збережені версії перевищують це обмеження, програма спочатку видалить найстаріші версії, доки не досягне цього обмеження. Додаткову інформацію можна знайти в документації версій.",
- "Version" : "Версія",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично підтримує старіші версії файлів, які було змінено. Якщо його увімкнено, прихований каталог версій створюється в каталозі кожного користувача та використовується для зберігання старих версій файлів. Користувач може будь-коли повернутися до старішої версії через веб-інтерфейс, а замінений файл стане версією. Програма автоматично керує каталогом з версіями файлів, щоб користувач не вичерпав квоту через надмірну кількість версій. \n\nНа додаток до закінчення терміну дії версій, додаток версій гарантує, що ніколи не буде використано більше 50% вільного простору користувача. Якщо збережені версії перевищують це обмеження, програма спочатку вилучіть найстаріші версії, доки не досягне цього обмеження. Додаткову інформацію можна знайти в документації версій.",
+ "Name this version" : "Назвіть цю версію",
+ "Edit version name" : "Редагуйте назву версії",
+ "Restore version" : "Відновити версію",
+ "Download version" : "Звантажити версію",
+ "Delete version" : "Вилучити версію",
+ "Version name" : "Назва версії",
+ "Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "Версії з назвами є постійними та їх виключено з автоматичного очищення після переповнення квоти у сховищі.",
+ "Remove version name" : "Вилучити назву версії",
+ "Save version name" : "Зберегти назву версії",
+ "Initial version restored" : "Початкову версію відновлено",
+ "Version restored" : "Версію відновлено",
+ "Could not restore version" : "Не вдалося відновити версію",
+ "Could not set version name" : "Не вдалося встановити назву для версії",
+ "Could not delete version" : "Не вдалося вилучити версію",
+ "${version.label} restored" : "${version.label} відновлено",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Цей застосунок автоматично обслуговує попередні версії файлів, які були змінені. Коли застосунок ввімкнено, у кожному каталозі користувача створюється прихована каталога версій файлів, у якій зберігаються старі версії файлів. Користувач за допомогою веб-інтерфейсу може повернутися у будь-який момент до однієї з попередніх версій файлу. При цьому файл, що замінюється, стає однією з версій. Застосунок також автоматично відслідковує каталоги з версіями файлів згідно з обмеженнями квот користувача.\n\t\tКрім відслідковування терміну збереження версій застосунок також забезпечує обмеження використаного версіями об'єму, щоб версії ніколи не використовували більше 50% доступного користувачу вільного дискового простору. В разі перевищення вказаних лімітів застосунок автоматично вилучає найдавніші версії аж до повернення в межі лімітів. Додаткова інформація доступна у документації до застосунку Версії.",
"Failed to revert {file} to revision {timestamp}." : "Не вдалося повернути {file} до ревізії {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n байт","%n байти","%n байтів","%n байтів"],
diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js
index 390123e9bc7..f30fdc95182 100644
--- a/apps/settings/l10n/uk.js
+++ b/apps/settings/l10n/uk.js
@@ -33,11 +33,13 @@ OC.L10N.register(
"Your <strong>group memberships</strong> were modified" : "Параметри вашої <strong>участі в групі</strong> оновлено",
"{actor} changed your password" : "{actor} змінив(-ла) ваш пароль",
"You changed your password" : "Ви змінили пароль",
- "Your password was reset by an administrator" : "Ваш пароль був скинутий адміністратором",
+ "Your password was reset by an administrator" : "Ваш пароль було скинуто адміністратором",
"Your password was reset" : "Ваш пароль скинуто",
"{actor} changed your email address" : "{actor} змінив(-ла) адресу вашої ел.пошти",
"You changed your email address" : "Ви змінили ел.адресу",
"Your email address was changed by an administrator" : "Ваша email адреса змінена адміністратором",
+ "You created an app password for a session named \"{token}\"" : "Ви створити пароль на застосунок для сесії з назвою \"{token}\"",
+ "An administrator created an app password for a session named \"{token}\"" : "Адміністратор створив пароль на застосунок для сесії з назвою \"{token}\"",
"You deleted app password \"{token}\"" : "Ви вилучили пароль застосунку \"{token}\"",
"You renamed app password \"{token}\" to \"{newToken}\"" : "Ви перейменували пароль програми \"{token}\" на \"{newToken}\"",
"You granted filesystem access to app password \"{token}\"" : "Ви надали доступ до файлової системи паролю програми \"{token}\"",
@@ -91,14 +93,14 @@ OC.L10N.register(
"In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Щоб підтвердити свій обліковий запис Twitter, опублікуйте наступний твіт у Twitter (переконайтеся, що опубліковано без розривів рядків):",
"In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Щоб підтвердити свій веб-сайт, збережіть наведений нижче вміст у корені вебсервера: '.well-known/CloudIdVerificationCode.txt' (переконайтеся, що повний текст розміщено в один рядок):",
"%1$s changed your password on %2$s." : "%1$s змінив(-ла) ваш пароль у хмарі %2$s.",
- "Your password on %s was changed." : "Ваш пароль на сервері %s був змінений.",
- "Your password on %s was reset by an administrator." : "Ваш пароль на сервері %s був скинутий адміністратором",
+ "Your password on %s was changed." : "Ваш пароль на сервері %s було змінено.",
+ "Your password on %s was reset by an administrator." : "Ваш пароль на сервері %s було скинуто адміністратором.",
"Your password on %s was reset." : "Ваш пароль на %s перевстановлено.",
"Password for %1$s changed on %2$s" : "Пароль %1$s змінений на сервері %2$s",
"Password changed for %s" : "Пароль змінено для %s",
"If you did not request this, please contact an administrator." : "Якщо ви цього не просили, зв'яжіться з адміністратором.",
- "Your email address on %s was changed." : "Ваша електронна адреса на сервері %s була змінена.",
- "Your email address on %s was changed by an administrator." : "Ваша електронна адреса на сервері %s була змінена адміністратором.",
+ "Your email address on %s was changed." : "Вашу електронну адресу на сервері %s було змінено.",
+ "Your email address on %s was changed by an administrator." : "Вашу електронну адресу на сервері %s було змінено адміністратором.",
"Email address for %1$s changed on %2$s" : "Електронна адреса %1$s змінена на %2$s",
"Email address changed for %s" : "Адресу електронної пошти змінено для %s",
"The new email address is %s" : "Нова адреса електронної пошти: %s",
@@ -267,7 +269,7 @@ OC.L10N.register(
"Your profile picture" : "Ваше зображення профілю",
"Upload profile picture" : "Завантажте зображення профілю",
"Choose profile picture from files" : "Виберіть зображення профілю з файлів",
- "Remove profile picture" : "Видалити зображення профілю",
+ "Remove profile picture" : "Вилучити зображення профілю",
"png or jpg, max. 20 MB" : "png або jpg, макс. 20 МБ",
"Picture provided by original account" : "Картинка надана оригінальним обліковим записом",
"Cancel" : "Скасувати",
@@ -287,20 +289,21 @@ OC.L10N.register(
"Your full name" : "Ваше повне ім'я",
"Email options" : "Параметри електронної пошти",
"Primary email for password reset and notifications" : "Основна адреса ел.пошти для надсилання пароля та сповіщень",
- "Remove primary email" : "Видалити основну електронну адресу",
- "Delete email" : "Видалити електронну пошту",
+ "Remove primary email" : "Вилучити основну електронну адресу",
+ "Delete email" : "Вилучити електронну адресу",
"Unset as primary email" : "Скасувати як основну електронну адресу",
"This address is not confirmed" : "Ця адреса не підтверджена",
"Set as primary email" : "Установити як основну електронну адресу",
"Your email address" : "Ваша адреса електронної пошти",
"Additional email address {index}" : "Додаткова електронна адреса {index}",
- "Unable to delete primary email address" : "Не вдалося видалити основну електронну адресу",
+ "Unable to delete primary email address" : "Не вдалося вилучити основну електронну адресу",
"Unable to update primary email address" : "Не вдалося оновити основну електронну адресу",
"Unable to add additional email address" : "Не вдалося додати додаткову електронну адресу",
"Unable to update additional email address" : "Не вдалося оновити додаткову електронну адресу",
- "Unable to delete additional email address" : "Не вдалося видалити додаткову електронну адресу",
+ "Unable to delete additional email address" : "Не вдалося вилучити додаткову електронну адресу",
"No email address set" : "E-mail не вказано",
"Additional emails" : "Додаткові електронні листи",
+ "Your handle" : "Ви керуєте",
"Your headline" : "Ваш заголовок",
"Language" : "Мова",
"Help translate" : "Допомогти з перекладом",
@@ -407,9 +410,11 @@ OC.L10N.register(
"Phone number" : "Номер телефону",
"Role" : "Роль",
"Twitter" : "Twitter",
+ "Fediverse (e.g. Mastodon)" : "Fediverse (напр., Mastodon)",
"Website" : "Вебсайт",
"Profile visibility" : "Видимість профілю",
"Not available as this property is required for core functionality including file sharing and calendar invitations" : "Недоступно, оскільки ця властивість необхідна для основних функцій, включаючи спільний доступ до файлів і запрошення в календарі",
+ "Not available as federation has been disabled for your account, contact your system administrator if you have any questions" : "Недоступно, оскільки об'єднані хмари вимкнено для вашого облікового запису. Будь ласка, сконтактуйте з вашим адміністратором.",
"Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Недоступно, оскільки публікація даних користувача на пошуковому сервері заборонена. Зверніться до системного адміністратора, якщо у вас виникнуть запитання",
"Active apps" : "Активні застосунки",
"Disabled apps" : "Неактивні застосунки",
@@ -498,7 +503,7 @@ OC.L10N.register(
"An administrator created app password \"{token}\"" : "Адміністратор створив пароль програми \"{token}\"",
"Couldn't remove app." : "Неможливо вилучити застосунок.",
"Couldn't update app." : "Не вдалося оновити застосунок.",
- "Backend doesn't support password change, but the user's encryption key was updated." : "Бекенд не підтримує зміну пароля, але ключ шифрування користувача був оновлений.",
+ "Backend doesn't support password change, but the user's encryption key was updated." : "Бекенд не підтримує зміну пароля, але ключ шифрування користувача було оновлено.",
"Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "Не вдалося визначити, чи TLS-версія cURL застаріла, оскільки сталася помилка під час запиту HTTPS до https://nextcloud.com. Будь ласка, перевірте файл журналу nextcloud для отримання додаткової інформації.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "Майже перевищено максимальну кількість ключів OPcache. Щоб переконатися, що всі сценарії можна зберігати в кеші, рекомендується застосувати <code>opcache.max_accelerated_files</code> до вашої конфігурації PHP зі значенням, вищим за <code>%s</code>.",
"Admin privileges" : "Права адміністратора",
diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json
index e64f31e5068..3fd3e843e06 100644
--- a/apps/settings/l10n/uk.json
+++ b/apps/settings/l10n/uk.json
@@ -31,11 +31,13 @@
"Your <strong>group memberships</strong> were modified" : "Параметри вашої <strong>участі в групі</strong> оновлено",
"{actor} changed your password" : "{actor} змінив(-ла) ваш пароль",
"You changed your password" : "Ви змінили пароль",
- "Your password was reset by an administrator" : "Ваш пароль був скинутий адміністратором",
+ "Your password was reset by an administrator" : "Ваш пароль було скинуто адміністратором",
"Your password was reset" : "Ваш пароль скинуто",
"{actor} changed your email address" : "{actor} змінив(-ла) адресу вашої ел.пошти",
"You changed your email address" : "Ви змінили ел.адресу",
"Your email address was changed by an administrator" : "Ваша email адреса змінена адміністратором",
+ "You created an app password for a session named \"{token}\"" : "Ви створити пароль на застосунок для сесії з назвою \"{token}\"",
+ "An administrator created an app password for a session named \"{token}\"" : "Адміністратор створив пароль на застосунок для сесії з назвою \"{token}\"",
"You deleted app password \"{token}\"" : "Ви вилучили пароль застосунку \"{token}\"",
"You renamed app password \"{token}\" to \"{newToken}\"" : "Ви перейменували пароль програми \"{token}\" на \"{newToken}\"",
"You granted filesystem access to app password \"{token}\"" : "Ви надали доступ до файлової системи паролю програми \"{token}\"",
@@ -89,14 +91,14 @@
"In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Щоб підтвердити свій обліковий запис Twitter, опублікуйте наступний твіт у Twitter (переконайтеся, що опубліковано без розривів рядків):",
"In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Щоб підтвердити свій веб-сайт, збережіть наведений нижче вміст у корені вебсервера: '.well-known/CloudIdVerificationCode.txt' (переконайтеся, що повний текст розміщено в один рядок):",
"%1$s changed your password on %2$s." : "%1$s змінив(-ла) ваш пароль у хмарі %2$s.",
- "Your password on %s was changed." : "Ваш пароль на сервері %s був змінений.",
- "Your password on %s was reset by an administrator." : "Ваш пароль на сервері %s був скинутий адміністратором",
+ "Your password on %s was changed." : "Ваш пароль на сервері %s було змінено.",
+ "Your password on %s was reset by an administrator." : "Ваш пароль на сервері %s було скинуто адміністратором.",
"Your password on %s was reset." : "Ваш пароль на %s перевстановлено.",
"Password for %1$s changed on %2$s" : "Пароль %1$s змінений на сервері %2$s",
"Password changed for %s" : "Пароль змінено для %s",
"If you did not request this, please contact an administrator." : "Якщо ви цього не просили, зв'яжіться з адміністратором.",
- "Your email address on %s was changed." : "Ваша електронна адреса на сервері %s була змінена.",
- "Your email address on %s was changed by an administrator." : "Ваша електронна адреса на сервері %s була змінена адміністратором.",
+ "Your email address on %s was changed." : "Вашу електронну адресу на сервері %s було змінено.",
+ "Your email address on %s was changed by an administrator." : "Вашу електронну адресу на сервері %s було змінено адміністратором.",
"Email address for %1$s changed on %2$s" : "Електронна адреса %1$s змінена на %2$s",
"Email address changed for %s" : "Адресу електронної пошти змінено для %s",
"The new email address is %s" : "Нова адреса електронної пошти: %s",
@@ -265,7 +267,7 @@
"Your profile picture" : "Ваше зображення профілю",
"Upload profile picture" : "Завантажте зображення профілю",
"Choose profile picture from files" : "Виберіть зображення профілю з файлів",
- "Remove profile picture" : "Видалити зображення профілю",
+ "Remove profile picture" : "Вилучити зображення профілю",
"png or jpg, max. 20 MB" : "png або jpg, макс. 20 МБ",
"Picture provided by original account" : "Картинка надана оригінальним обліковим записом",
"Cancel" : "Скасувати",
@@ -285,20 +287,21 @@
"Your full name" : "Ваше повне ім'я",
"Email options" : "Параметри електронної пошти",
"Primary email for password reset and notifications" : "Основна адреса ел.пошти для надсилання пароля та сповіщень",
- "Remove primary email" : "Видалити основну електронну адресу",
- "Delete email" : "Видалити електронну пошту",
+ "Remove primary email" : "Вилучити основну електронну адресу",
+ "Delete email" : "Вилучити електронну адресу",
"Unset as primary email" : "Скасувати як основну електронну адресу",
"This address is not confirmed" : "Ця адреса не підтверджена",
"Set as primary email" : "Установити як основну електронну адресу",
"Your email address" : "Ваша адреса електронної пошти",
"Additional email address {index}" : "Додаткова електронна адреса {index}",
- "Unable to delete primary email address" : "Не вдалося видалити основну електронну адресу",
+ "Unable to delete primary email address" : "Не вдалося вилучити основну електронну адресу",
"Unable to update primary email address" : "Не вдалося оновити основну електронну адресу",
"Unable to add additional email address" : "Не вдалося додати додаткову електронну адресу",
"Unable to update additional email address" : "Не вдалося оновити додаткову електронну адресу",
- "Unable to delete additional email address" : "Не вдалося видалити додаткову електронну адресу",
+ "Unable to delete additional email address" : "Не вдалося вилучити додаткову електронну адресу",
"No email address set" : "E-mail не вказано",
"Additional emails" : "Додаткові електронні листи",
+ "Your handle" : "Ви керуєте",
"Your headline" : "Ваш заголовок",
"Language" : "Мова",
"Help translate" : "Допомогти з перекладом",
@@ -405,9 +408,11 @@
"Phone number" : "Номер телефону",
"Role" : "Роль",
"Twitter" : "Twitter",
+ "Fediverse (e.g. Mastodon)" : "Fediverse (напр., Mastodon)",
"Website" : "Вебсайт",
"Profile visibility" : "Видимість профілю",
"Not available as this property is required for core functionality including file sharing and calendar invitations" : "Недоступно, оскільки ця властивість необхідна для основних функцій, включаючи спільний доступ до файлів і запрошення в календарі",
+ "Not available as federation has been disabled for your account, contact your system administrator if you have any questions" : "Недоступно, оскільки об'єднані хмари вимкнено для вашого облікового запису. Будь ласка, сконтактуйте з вашим адміністратором.",
"Not available as publishing user specific data to the lookup server is not allowed, contact your system administrator if you have any questions" : "Недоступно, оскільки публікація даних користувача на пошуковому сервері заборонена. Зверніться до системного адміністратора, якщо у вас виникнуть запитання",
"Active apps" : "Активні застосунки",
"Disabled apps" : "Неактивні застосунки",
@@ -496,7 +501,7 @@
"An administrator created app password \"{token}\"" : "Адміністратор створив пароль програми \"{token}\"",
"Couldn't remove app." : "Неможливо вилучити застосунок.",
"Couldn't update app." : "Не вдалося оновити застосунок.",
- "Backend doesn't support password change, but the user's encryption key was updated." : "Бекенд не підтримує зміну пароля, але ключ шифрування користувача був оновлений.",
+ "Backend doesn't support password change, but the user's encryption key was updated." : "Бекенд не підтримує зміну пароля, але ключ шифрування користувача було оновлено.",
"Could not determine if TLS version of cURL is outdated or not because an error happened during the HTTPS request against https://nextcloud.com. Please check the nextcloud log file for more details." : "Не вдалося визначити, чи TLS-версія cURL застаріла, оскільки сталася помилка під час запиту HTTPS до https://nextcloud.com. Будь ласка, перевірте файл журналу nextcloud для отримання додаткової інформації.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be hold in cache, it is recommended to apply <code>opcache.max_accelerated_files</code> to your PHP configuration with a value higher than <code>%s</code>." : "Майже перевищено максимальну кількість ключів OPcache. Щоб переконатися, що всі сценарії можна зберігати в кеші, рекомендується застосувати <code>opcache.max_accelerated_files</code> до вашої конфігурації PHP зі значенням, вищим за <code>%s</code>.",
"Admin privileges" : "Права адміністратора",
diff --git a/apps/theming/l10n/uk.js b/apps/theming/l10n/uk.js
index 06df5238f19..c121064d60e 100644
--- a/apps/theming/l10n/uk.js
+++ b/apps/theming/l10n/uk.js
@@ -72,8 +72,13 @@ OC.L10N.register(
"Set a custom background" : "Встановити спеціальне зображення тла",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось веб-стандартів і перевіряємо, щоб забезпечити зручність користування без комп'ютерної миші, а також за допомогую допоміжного програмного забезпечення, наприклад, програми зчитування з екрана. Ми прагнемо відповідати {guidelines} Правила доступу до веб-вмісту {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.",
"If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви виявите будь-які проблеми, не соромтеся повідомити про них на {issuetracker}нашій системі відстеження проблем{linkend}. І якщо ви хочете взяти участь, приєднуйтесь до {designteam}нашої команди дизайнерів{linkend}!",
+ "Custom background" : "Користувацьке тло",
+ "Default background" : "Типове тло",
"Change color" : "Змінити колір",
+ "Remove background" : "Вилучити тло",
+ "Select a background from your files" : "Виберіть зображення тла з ваших файлів",
"Theme selection is enforced" : "Вибір теми виконується примусово",
+ "Select a custom color" : "Виберіть власний колір",
"Reset to default" : "Скинути до типового",
"Upload" : "Завантажити",
"Remove background image" : "Вилучити зображення тла",
@@ -86,6 +91,8 @@ OC.L10N.register(
"Login image" : "Зображення сторінки входу",
"Upload new login background" : "Завантажити новий фон для сторінки входу",
"Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Встановіть розширення Imagemagick PHP з підтримкою SVG-зображень, щоб автоматично генерувати іконки сайту на основі завантаженого логотипу та кольору.",
+ "Migrate and clean up admin theming images" : "Мігруйте та очистіть зображення теми адміністратора",
+ "Failed to clean up the old admin theming images folder" : "Не вдалося очистити старий каталог із зображеннями теми адміністратора",
"In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У деяких випадках комбінації клавіш можуть перешкоджати роботі інструментів спеціальних можливостей. Щоб правильно сфокусуватися на інструменті, тут можна вимкнути всі комбінації клавіш. Це також вимкне всі доступні ярлики в програмах.",
"Pick from Files" : "Виберіть із файлів",
"Default image" : "Типове зображення",
diff --git a/apps/theming/l10n/uk.json b/apps/theming/l10n/uk.json
index f6fc1c3f2ee..14a7b0ff8ff 100644
--- a/apps/theming/l10n/uk.json
+++ b/apps/theming/l10n/uk.json
@@ -70,8 +70,13 @@
"Set a custom background" : "Встановити спеціальне зображення тла",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Для нас дуже важливо забезпечити доступ для всіх. Ми дотримуємось веб-стандартів і перевіряємо, щоб забезпечити зручність користування без комп'ютерної миші, а також за допомогую допоміжного програмного забезпечення, наприклад, програми зчитування з екрана. Ми прагнемо відповідати {guidelines} Правила доступу до веб-вмісту {linkend} 2.1 на рівні AA, а з темою високої контрастності навіть на рівні AAA.",
"If you find any issues, do not hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Якщо ви виявите будь-які проблеми, не соромтеся повідомити про них на {issuetracker}нашій системі відстеження проблем{linkend}. І якщо ви хочете взяти участь, приєднуйтесь до {designteam}нашої команди дизайнерів{linkend}!",
+ "Custom background" : "Користувацьке тло",
+ "Default background" : "Типове тло",
"Change color" : "Змінити колір",
+ "Remove background" : "Вилучити тло",
+ "Select a background from your files" : "Виберіть зображення тла з ваших файлів",
"Theme selection is enforced" : "Вибір теми виконується примусово",
+ "Select a custom color" : "Виберіть власний колір",
"Reset to default" : "Скинути до типового",
"Upload" : "Завантажити",
"Remove background image" : "Вилучити зображення тла",
@@ -84,6 +89,8 @@
"Login image" : "Зображення сторінки входу",
"Upload new login background" : "Завантажити новий фон для сторінки входу",
"Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Встановіть розширення Imagemagick PHP з підтримкою SVG-зображень, щоб автоматично генерувати іконки сайту на основі завантаженого логотипу та кольору.",
+ "Migrate and clean up admin theming images" : "Мігруйте та очистіть зображення теми адміністратора",
+ "Failed to clean up the old admin theming images folder" : "Не вдалося очистити старий каталог із зображеннями теми адміністратора",
"In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "У деяких випадках комбінації клавіш можуть перешкоджати роботі інструментів спеціальних можливостей. Щоб правильно сфокусуватися на інструменті, тут можна вимкнути всі комбінації клавіш. Це також вимкне всі доступні ярлики в програмах.",
"Pick from Files" : "Виберіть із файлів",
"Default image" : "Типове зображення",
diff --git a/apps/workflowengine/l10n/uk.js b/apps/workflowengine/l10n/uk.js
index a514ebbbb7f..8a5d806ae56 100644
--- a/apps/workflowengine/l10n/uk.js
+++ b/apps/workflowengine/l10n/uk.js
@@ -41,6 +41,7 @@ OC.L10N.register(
"Add new flow" : "Додати новий процес",
"Cancel" : "Скасувати",
"Delete" : "Вилучити",
+ "Active" : "Активно",
"Save" : "Зберегти",
"Available flows" : "Процеси",
"For details on how to write your own flow, check out the development documentation." : "Перегляньте документацію для розробника, щоби дізнатися, як додати власні процеси.",
diff --git a/apps/workflowengine/l10n/uk.json b/apps/workflowengine/l10n/uk.json
index 3cdc5040492..89c82243ee4 100644
--- a/apps/workflowengine/l10n/uk.json
+++ b/apps/workflowengine/l10n/uk.json
@@ -39,6 +39,7 @@
"Add new flow" : "Додати новий процес",
"Cancel" : "Скасувати",
"Delete" : "Вилучити",
+ "Active" : "Активно",
"Save" : "Зберегти",
"Available flows" : "Процеси",
"For details on how to write your own flow, check out the development documentation." : "Перегляньте документацію для розробника, щоби дізнатися, як додати власні процеси.",