aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/l10n/de.js10
-rw-r--r--apps/dav/l10n/de.json10
-rw-r--r--apps/dav/l10n/de_DE.js10
-rw-r--r--apps/dav/l10n/de_DE.json10
-rw-r--r--apps/dav/l10n/ru.js96
-rw-r--r--apps/dav/l10n/ru.json96
-rw-r--r--apps/dav/l10n/sv.js10
-rw-r--r--apps/dav/l10n/sv.json10
-rw-r--r--apps/files/l10n/ar.js2
-rw-r--r--apps/files/l10n/ar.json2
-rw-r--r--apps/files/l10n/ast.js1
-rw-r--r--apps/files/l10n/ast.json1
-rw-r--r--apps/files/l10n/bg.js1
-rw-r--r--apps/files/l10n/bg.json1
-rw-r--r--apps/files/l10n/ca.js1
-rw-r--r--apps/files/l10n/ca.json1
-rw-r--r--apps/files/l10n/cs.js2
-rw-r--r--apps/files/l10n/cs.json2
-rw-r--r--apps/files/l10n/da.js1
-rw-r--r--apps/files/l10n/da.json1
-rw-r--r--apps/files/l10n/de.js2
-rw-r--r--apps/files/l10n/de.json2
-rw-r--r--apps/files/l10n/de_DE.js2
-rw-r--r--apps/files/l10n/de_DE.json2
-rw-r--r--apps/files/l10n/el.js1
-rw-r--r--apps/files/l10n/el.json1
-rw-r--r--apps/files/l10n/en_GB.js2
-rw-r--r--apps/files/l10n/en_GB.json2
-rw-r--r--apps/files/l10n/es.js2
-rw-r--r--apps/files/l10n/es.json2
-rw-r--r--apps/files/l10n/es_EC.js1
-rw-r--r--apps/files/l10n/es_EC.json1
-rw-r--r--apps/files/l10n/es_MX.js1
-rw-r--r--apps/files/l10n/es_MX.json1
-rw-r--r--apps/files/l10n/et_EE.js2
-rw-r--r--apps/files/l10n/et_EE.json2
-rw-r--r--apps/files/l10n/eu.js2
-rw-r--r--apps/files/l10n/eu.json2
-rw-r--r--apps/files/l10n/fa.js1
-rw-r--r--apps/files/l10n/fa.json1
-rw-r--r--apps/files/l10n/fi.js1
-rw-r--r--apps/files/l10n/fi.json1
-rw-r--r--apps/files/l10n/fr.js2
-rw-r--r--apps/files/l10n/fr.json2
-rw-r--r--apps/files/l10n/ga.js2
-rw-r--r--apps/files/l10n/ga.json2
-rw-r--r--apps/files/l10n/gl.js4
-rw-r--r--apps/files/l10n/gl.json4
-rw-r--r--apps/files/l10n/hu.js1
-rw-r--r--apps/files/l10n/hu.json1
-rw-r--r--apps/files/l10n/id.js1
-rw-r--r--apps/files/l10n/id.json1
-rw-r--r--apps/files/l10n/is.js1
-rw-r--r--apps/files/l10n/is.json1
-rw-r--r--apps/files/l10n/it.js2
-rw-r--r--apps/files/l10n/it.json2
-rw-r--r--apps/files/l10n/ja.js1
-rw-r--r--apps/files/l10n/ja.json1
-rw-r--r--apps/files/l10n/ka.js1
-rw-r--r--apps/files/l10n/ka.json1
-rw-r--r--apps/files/l10n/ko.js1
-rw-r--r--apps/files/l10n/ko.json1
-rw-r--r--apps/files/l10n/lt_LT.js1
-rw-r--r--apps/files/l10n/lt_LT.json1
-rw-r--r--apps/files/l10n/mk.js1
-rw-r--r--apps/files/l10n/mk.json1
-rw-r--r--apps/files/l10n/nb.js1
-rw-r--r--apps/files/l10n/nb.json1
-rw-r--r--apps/files/l10n/nl.js1
-rw-r--r--apps/files/l10n/nl.json1
-rw-r--r--apps/files/l10n/pl.js1
-rw-r--r--apps/files/l10n/pl.json1
-rw-r--r--apps/files/l10n/pt_BR.js2
-rw-r--r--apps/files/l10n/pt_BR.json2
-rw-r--r--apps/files/l10n/pt_PT.js2
-rw-r--r--apps/files/l10n/pt_PT.json2
-rw-r--r--apps/files/l10n/ro.js1
-rw-r--r--apps/files/l10n/ro.json1
-rw-r--r--apps/files/l10n/ru.js1
-rw-r--r--apps/files/l10n/ru.json1
-rw-r--r--apps/files/l10n/sc.js1
-rw-r--r--apps/files/l10n/sc.json1
-rw-r--r--apps/files/l10n/sk.js2
-rw-r--r--apps/files/l10n/sk.json2
-rw-r--r--apps/files/l10n/sl.js1
-rw-r--r--apps/files/l10n/sl.json1
-rw-r--r--apps/files/l10n/sr.js2
-rw-r--r--apps/files/l10n/sr.json2
-rw-r--r--apps/files/l10n/sv.js2
-rw-r--r--apps/files/l10n/sv.json2
-rw-r--r--apps/files/l10n/sw.js24
-rw-r--r--apps/files/l10n/sw.json24
-rw-r--r--apps/files/l10n/th.js1
-rw-r--r--apps/files/l10n/th.json1
-rw-r--r--apps/files/l10n/tr.js2
-rw-r--r--apps/files/l10n/tr.json2
-rw-r--r--apps/files/l10n/ug.js1
-rw-r--r--apps/files/l10n/ug.json1
-rw-r--r--apps/files/l10n/uk.js1
-rw-r--r--apps/files/l10n/uk.json1
-rw-r--r--apps/files/l10n/vi.js1
-rw-r--r--apps/files/l10n/vi.json1
-rw-r--r--apps/files/l10n/zh_CN.js1
-rw-r--r--apps/files/l10n/zh_CN.json1
-rw-r--r--apps/files/l10n/zh_HK.js2
-rw-r--r--apps/files/l10n/zh_HK.json2
-rw-r--r--apps/files/l10n/zh_TW.js2
-rw-r--r--apps/files/l10n/zh_TW.json2
-rw-r--r--apps/files/src/components/FilesListVirtual.vue7
-rw-r--r--apps/files/src/views/FilesList.vue7
-rw-r--r--apps/files_sharing/l10n/de.js2
-rw-r--r--apps/files_sharing/l10n/de.json2
-rw-r--r--apps/files_sharing/l10n/de_DE.js2
-rw-r--r--apps/files_sharing/l10n/de_DE.json2
-rw-r--r--apps/files_sharing/l10n/et_EE.js2
-rw-r--r--apps/files_sharing/l10n/et_EE.json2
-rw-r--r--apps/files_sharing/l10n/ru.js32
-rw-r--r--apps/files_sharing/l10n/ru.json32
-rw-r--r--apps/files_sharing/l10n/sv.js5
-rw-r--r--apps/files_sharing/l10n/sv.json5
-rw-r--r--apps/files_sharing/l10n/zh_TW.js2
-rw-r--r--apps/files_sharing/l10n/zh_TW.json2
-rw-r--r--apps/files_sharing/src/components/SharingEntryLink.vue38
-rw-r--r--apps/files_sharing/tests/Listener/LoadAdditionalListenerTest.php28
-rw-r--r--apps/files_trashbin/l10n/de.js1
-rw-r--r--apps/files_trashbin/l10n/de.json1
-rw-r--r--apps/files_trashbin/l10n/de_DE.js1
-rw-r--r--apps/files_trashbin/l10n/de_DE.json1
-rw-r--r--apps/files_trashbin/l10n/sv.js1
-rw-r--r--apps/files_trashbin/l10n/sv.json1
-rw-r--r--apps/files_versions/src/components/Version.vue12
-rw-r--r--apps/provisioning_api/appinfo/routes.php1
-rw-r--r--apps/provisioning_api/l10n/ru.js31
-rw-r--r--apps/provisioning_api/l10n/ru.json31
-rw-r--r--apps/provisioning_api/lib/Controller/UsersController.php15
-rw-r--r--apps/provisioning_api/openapi-full.json72
-rw-r--r--apps/provisioning_api/openapi.json72
-rw-r--r--apps/provisioning_api/tests/Controller/UsersControllerTest.php7
-rw-r--r--apps/sharebymail/l10n/ru.js10
-rw-r--r--apps/sharebymail/l10n/ru.json10
-rw-r--r--apps/systemtags/l10n/ru.js22
-rw-r--r--apps/systemtags/l10n/ru.json22
-rw-r--r--apps/theming/lib/Capabilities.php2
-rw-r--r--apps/theming/openapi.json4
-rw-r--r--apps/theming/tests/CapabilitiesTest.php7
-rw-r--r--apps/user_ldap/ajax/deleteConfiguration.php4
-rw-r--r--apps/user_ldap/ajax/getNewServerConfigPrefix.php4
-rw-r--r--apps/user_ldap/l10n/gl.js1
-rw-r--r--apps/user_ldap/l10n/gl.json1
-rw-r--r--apps/user_ldap/lib/Command/Search.php3
-rw-r--r--apps/user_ldap/lib/Command/SetConfig.php4
-rw-r--r--apps/user_ldap/lib/Connection.php4
-rw-r--r--apps/user_ldap/lib/Helper.php96
-rw-r--r--apps/user_ldap/lib/Jobs/CleanUp.php2
-rw-r--r--apps/user_ldap/lib/Settings/Admin.php4
-rw-r--r--apps/user_ldap/tests/AccessTest.php3
-rw-r--r--apps/user_ldap/tests/HelperTest.php81
-rw-r--r--apps/user_ldap/tests/Integration/AbstractIntegrationTest.php3
-rw-r--r--apps/user_ldap/tests/LDAPProviderTest.php5
159 files changed, 935 insertions, 216 deletions
diff --git a/apps/dav/l10n/de.js b/apps/dav/l10n/de.js
index 1c6de8f18cf..3ba68d336ed 100644
--- a/apps/dav/l10n/de.js
+++ b/apps/dav/l10n/de.js
@@ -301,6 +301,14 @@ OC.L10N.register(
"Reset to default" : "Auf Standard zurücksetzen ",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
+ "Failed to save example event creation setting" : "Einstellung für die Beispiels-Ereigniserstellung konnte nicht gespeichert werden",
+ "Failed to upload the example event" : "Das Beispielsereignis konnte nicht hochgeladen werden",
+ "Custom example event was saved successfully" : "Benutzerdefiniertes Beispielereignis gespeichert",
+ "Failed to delete the custom example event" : "Benutzerdefiniertes Beispielsereignis konnte nicht gelöscht werden",
+ "Custom example event was deleted successfully" : "Benutzerdefiniertes Beispielsereignis wurde gelöscht",
+ "Import calendar event" : "Kalenderereignis importieren",
+ "Uploading a new event will overwrite the existing one." : "Das Hochladen eines neuen Ereignisses wird das bestehende Ereignis überschreiben.",
+ "Upload event" : "Ereignis hochladen",
"Availability" : "Verfügbarkeit",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Wenn du deine Arbeitszeiten angibst, können andere beim Buchen einer Besprechung sehen, wann du nicht im Büro bist.",
"Absence" : "Abwesenheit",
@@ -317,6 +325,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die freigegebenen Kalender senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
+ "Example content" : "Beispielsinhalt",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Beispielinhalte dienen dazu, die Funktionen von Nextcloud vorzustellen. Standardinhalte werden mit Nextcloud ausgeliefert und können durch benutzerdefinierte Inhalte ersetzt werden.",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren deines Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json
index bd3269672bd..c152c3aa8cc 100644
--- a/apps/dav/l10n/de.json
+++ b/apps/dav/l10n/de.json
@@ -299,6 +299,14 @@
"Reset to default" : "Auf Standard zurücksetzen ",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
+ "Failed to save example event creation setting" : "Einstellung für die Beispiels-Ereigniserstellung konnte nicht gespeichert werden",
+ "Failed to upload the example event" : "Das Beispielsereignis konnte nicht hochgeladen werden",
+ "Custom example event was saved successfully" : "Benutzerdefiniertes Beispielereignis gespeichert",
+ "Failed to delete the custom example event" : "Benutzerdefiniertes Beispielsereignis konnte nicht gelöscht werden",
+ "Custom example event was deleted successfully" : "Benutzerdefiniertes Beispielsereignis wurde gelöscht",
+ "Import calendar event" : "Kalenderereignis importieren",
+ "Uploading a new event will overwrite the existing one." : "Das Hochladen eines neuen Ereignisses wird das bestehende Ereignis überschreiben.",
+ "Upload event" : "Ereignis hochladen",
"Availability" : "Verfügbarkeit",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Wenn du deine Arbeitszeiten angibst, können andere beim Buchen einer Besprechung sehen, wann du nicht im Büro bist.",
"Absence" : "Abwesenheit",
@@ -315,6 +323,8 @@
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die freigegebenen Kalender senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
+ "Example content" : "Beispielsinhalt",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Beispielinhalte dienen dazu, die Funktionen von Nextcloud vorzustellen. Standardinhalte werden mit Nextcloud ausgeliefert und können durch benutzerdefinierte Inhalte ersetzt werden.",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren deines Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js
index d6e90925eed..efdf32b9c34 100644
--- a/apps/dav/l10n/de_DE.js
+++ b/apps/dav/l10n/de_DE.js
@@ -301,6 +301,14 @@ OC.L10N.register(
"Reset to default" : "Auf Standard zurücksetzen ",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
+ "Failed to save example event creation setting" : "Einstellung für die Beispiels-Terminerstellung konnte nicht gespeichert werden",
+ "Failed to upload the example event" : "Der Beispieltermin konnte nicht hochgeladen werden",
+ "Custom example event was saved successfully" : "Benutzerdefinierter Beispieltermin gespeichert",
+ "Failed to delete the custom example event" : "Benutzerdefinierter Beispieltermin konnte nicht gelöscht werden",
+ "Custom example event was deleted successfully" : "Benutzerdefinierter Beispieltermin wurde gelöscht",
+ "Import calendar event" : "Kalendertermin importieren",
+ "Uploading a new event will overwrite the existing one." : "Das Hochladen eines neuen Termins wird den bestehenden Termin überschreiben.",
+ "Upload event" : "Termin hochladen",
"Availability" : "Verfügbarkeit",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Wenn Sie Ihre Arbeitszeiten angeben, können andere beim Buchen einer Besprechung sehen, wann Sie nicht im Büro sind.",
"Absence" : "Abwesenheit",
@@ -317,6 +325,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die Kalenderfreigaben senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
+ "Example content" : "Beispielsinhalt",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Beispielinhalte dienen dazu, die Funktionen von Nextcloud vorzustellen. Standardinhalte werden mit Nextcloud ausgeliefert und können durch benutzerdefinierte Inhalte ersetzt werden.",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren Ihres Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json
index 8274d130006..7170849d1a9 100644
--- a/apps/dav/l10n/de_DE.json
+++ b/apps/dav/l10n/de_DE.json
@@ -299,6 +299,14 @@
"Reset to default" : "Auf Standard zurücksetzen ",
"Import contacts" : "Kontakte importieren",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Durch das Importieren einer neuen VCF-Datei wird der vorhandene Standardkontakt gelöscht und durch den neuen ersetzt. Fortsetzen?",
+ "Failed to save example event creation setting" : "Einstellung für die Beispiels-Terminerstellung konnte nicht gespeichert werden",
+ "Failed to upload the example event" : "Der Beispieltermin konnte nicht hochgeladen werden",
+ "Custom example event was saved successfully" : "Benutzerdefinierter Beispieltermin gespeichert",
+ "Failed to delete the custom example event" : "Benutzerdefinierter Beispieltermin konnte nicht gelöscht werden",
+ "Custom example event was deleted successfully" : "Benutzerdefinierter Beispieltermin wurde gelöscht",
+ "Import calendar event" : "Kalendertermin importieren",
+ "Uploading a new event will overwrite the existing one." : "Das Hochladen eines neuen Termins wird den bestehenden Termin überschreiben.",
+ "Upload event" : "Termin hochladen",
"Availability" : "Verfügbarkeit",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Wenn Sie Ihre Arbeitszeiten angeben, können andere beim Buchen einer Besprechung sehen, wann Sie nicht im Büro sind.",
"Absence" : "Abwesenheit",
@@ -315,6 +323,8 @@
"Send reminder notifications to calendar sharees as well" : "Erinnerungsbenachrichtigungen auch an die Kalenderfreigaben senden",
"Reminders are always sent to organizers and attendees." : "Erinnerungen werden immer an Organisatoren und Teilnehmer gesendet.",
"Enable notifications for events via push" : "Benachrichtigungen für Termine per Push aktivieren",
+ "Example content" : "Beispielsinhalt",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Beispielinhalte dienen dazu, die Funktionen von Nextcloud vorzustellen. Standardinhalte werden mit Nextcloud ausgeliefert und können durch benutzerdefinierte Inhalte ersetzt werden.",
"There was an error updating your attendance status." : "Es ist ein Fehler beim Aktualisieren Ihres Teilnehmerstatus aufgetreten.",
"Please contact the organizer directly." : "Bitte den Organisator direkt kontaktieren.",
"Are you accepting the invitation?" : "Die Einladung annehmen?",
diff --git a/apps/dav/l10n/ru.js b/apps/dav/l10n/ru.js
index e09f09bc4c1..e170bb36582 100644
--- a/apps/dav/l10n/ru.js
+++ b/apps/dav/l10n/ru.js
@@ -72,7 +72,77 @@ OC.L10N.register(
"Description: %s" : "Описание: %s",
"Where: %s" : "Где: %s",
"%1$s via %2$s" : "%1$s через %2$s",
+ "In the past on %1$s for the entire day" : "В прошлом, %1$s, в течение всего дня",
+ "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Через минуту, %1$s, в течение всего дня","Через %n минуты, %1$s, в течение всего дня","Через %n минут, %1$s, в течение всего дня","Через %n минут, %1$s, в течение всего дня"],
+ "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Через час, %1$s, в течение всего дня","Через %n часа, %1$s, в течение всего дня","Через %n часов, %1$s, в течение всего дня","Через %n часов, %1$s, в течение всего дня"],
+ "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Через день, %1$s, в течение всего дня","Через %n дня, %1$s, в течение всего дня","Через %n дней,%1$s, в течение всего дня","Через %n дней, %1$s, в течение всего дня"],
+ "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Через неделю, %1$s, в течение всего дня","Через %n недели, %1$s, в течение всего дня","Через %n недель, %1$s, в течение всего дня","Через %n недель, %1$s, в течение всего дня"],
+ "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Через месяц, %1$s, в течение всего дня","Через %n месяца, %1$s, в течение всего дня","Через %n месяцев, %1$s, в течение всего дня","Через %n месяцев, %1$s, в течение всего дня"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Через год, %1$s, в течение всего дня","Через %n года, %1$s, в течение всего дня","Через %n лет, %1$s, в течение всего дня","Через %n лет, %1$s, в течение всего дня"],
+ "In the past on %1$s between %2$s - %3$s" : "В прошлом, %1$s, с %2$s до %3$s",
+ "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Через минуту, %1$s, с %2$s до %3$s","Через %n минуты, %1$s, с %2$s до %3$s","Через %n минут, %1$s, с %2$s до %3$s","Через %n минут, %1$s, с %2$s до %3$s"],
+ "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Через час, %1$s, с %2$s до %3$s","Через %n часа, %1$s, с %2$s до %3$s","Через %n часов, %1$s, с %2$s до %3$s","Через %n часов, %1$s, с %2$s до %3$s"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Через день, %1$s, с %2$s до %3$s","Через %n дня %1$s, с %2$s до %3$s","Через %n дней, %1$s, с %2$s до %3$s","Через %n дней, %1$s, с %2$s до %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Через неделю, %1$s, с %2$s до %3$s","Через %n недели, %1$s, с %2$s до %3$s","Через %n недель, %1$s, с %2$s до %3$s","Через %n недель, %1$s, с %2$s до %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Через месяц, %1$s, с %2$s до %3$s","Через %n месяца, %1$s, с %2$s до %3$s","Через %n месяцев, %1$s, с %2$s до %3$s","Через %n месяцев, %1$s, с %2$s до %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Через год, %1$s, с %2$s до %3$s","Через %n года, %1$s, с %2$s до %3$s","Через %n лет, %1$s, с %2$s до %3$s","Через %n лет, %1$s, с %2$s до %3$s"],
+ "Could not generate when statement" : "Не удалось сгенерировать выражение времени",
"Every Day for the entire day" : "Каждый день в течение всего дня",
+ "Every Day for the entire day until %1$s" : "Каждый день весь день до %1$s",
+ "Every Day between %1$s - %2$s" : "Каждый день с %1$s по %2$s",
+ "Every Day between %1$s - %2$s until %3$s" : "Каждый день с %1$s до %2$s до %3$s",
+ "Every %1$d Days for the entire day" : "Каждые %1$d дней в течение всего дня",
+ "Every %1$d Days for the entire day until %2$s" : "Каждые %1$d дней в течение всего дня до %2$s",
+ "Every %1$d Days between %2$s - %3$s" : "Каждые %1$d дней с %2$s до %3$s",
+ "Every %1$d Days between %2$s - %3$s until %4$s" : "Каждые %1$d дней с %2$s до %3$s до %4$s",
+ "Could not generate event recurrence statement" : "Не удалось сгенерировать правило повторения события",
+ "Every Week on %1$s for the entire day" : "Каждую неделю в %1$s в течение всего дня",
+ "Every Week on %1$s for the entire day until %2$s" : "Каждую неделю по %1$s в течение всего дня до %2$s",
+ "Every Week on %1$s between %2$s - %3$s" : "Каждую неделю в %1$s с %2$s до %3$s",
+ "Every Week on %1$s between %2$s - %3$s until %4$s" : "Каждую неделю по %1$s с %2$s до %3$s до %4$s",
+ "Every %1$d Weeks on %2$s for the entire day" : "Каждые %1$d недель по %2$s в течение всего дня",
+ "Every %1$d Weeks on %2$s for the entire day until %3$s" : "Каждые %1$d недель по %2$s в течение всего дня до %3$s",
+ "Every %1$d Weeks on %2$s between %3$s - %4$s" : "Каждые %1$d недель по %2$s с %3$s до %4$s",
+ "Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Каждые %1$d недель по %2$s с %3$s до %4$s до %5$s",
+ "Every Month on the %1$s for the entire day" : "Каждый месяц %1$s в течение всего дня",
+ "Every Month on the %1$s for the entire day until %2$s" : "Каждый месяц %1$s в течение всего дня до %2$s",
+ "Every Month on the %1$s between %2$s - %3$s" : "Каждый месяц %1$s с %2$s до %3$s",
+ "Every Month on the %1$s between %2$s - %3$s until %4$s" : "Каждый месяц %1$s с %2$s до %3$s до %4$s",
+ "Every %1$d Months on the %2$s for the entire day" : "Каждые %1$d месяцев %2$s в течение всего дня",
+ "Every %1$d Months on the %2$s for the entire day until %3$s" : "Каждые %1$d месяцев %2$s в течение всего дня до %3$s",
+ "Every %1$d Months on the %2$s between %3$s - %4$s" : "Каждые %1$d месяцев %2$s с %3$s до %4$s",
+ "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Каждые %1$d месяцев %2$s с %3$s до %4$s до %5$s",
+ "Every Year in %1$s on the %2$s for the entire day" : "Каждый год в %1$s %2$s в течение всего дня",
+ "Every Year in %1$s on the %2$s for the entire day until %3$s" : "Каждый год в %1$s %2$s в течение всего дня до %3$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s" : "Каждый год в %1$s %2$s с %3$s до %4$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Каждый год в %1$s %2$s с %3$s до %4$s до %5$s",
+ "Every %1$d Years in %2$s on the %3$s for the entire day" : "Каждые %1$d лет в %2$s %3$s в течение всего дня",
+ "Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Каждые %1$d лет в %2$s %3$s в течение всего дня до %4$s",
+ "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Каждые %1$d лет в %2$s %3$s с %4$s до %5$s",
+ "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Каждые %1$d лет в %2$s %3$s с %4$s до %5$s до %6$s",
+ "On specific dates for the entire day until %1$s" : "В определённые даты, весь день до %1$s",
+ "On specific dates between %1$s - %2$s until %3$s" : "В определённые даты с %1$s по %2$s до %3$s",
+ "In the past on %1$s" : "В прошлом, %1$s",
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Через минуту, %1$s","Через %n минуты, %1$s","Через %n минут, %1$s","Через %n минут, %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Через час, %1$s","Через %n часа, %1$s","Через %n часов, %1$s","Через %n часов, %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["Через день, %1$s","Через %n дня, %1$s","Через %n дней, %1$s","Через %n дней, %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Через неделю, %1$s","Через %n недели,%1$s","Через %n недель, %1$s","Через %n недель, %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Через месяц, %1$s","Через %n месяца, %1$s","Через %n месяцев, %1$s","Через %n месяцев, %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Через год, %1$s","Через %n года, %1$s","Через %n лет, %1$s","Через %n лет, %1$s"],
+ "In the past on %1$s then on %2$s" : "В прошлом, %1$s, затем %2$s",
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Через минуту, %1$s, затем %2$s","Через %n минуты, %1$s, затем %2$s","Через %n минут, %1$s, затем %2$s","Через %n минут, %1$s, затем %2$s"],
+ "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Через час, %1$s, затем %2$s","Через %n часа, %1$s, затем %2$s","Через %n часов, %1$s, затем %2$s","Через %n часов, %1$s, затем %2$s"],
+ "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Через день, %1$s, затем %2$s","Через %n дня, %1$s, затем %2$s","Через %n дней, %1$s, затем %2$s","Через %n дней, %1$s, затем %2$s"],
+ "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Через неделю, %1$s, затем %2$s","Через %n недели, %1$s, затем %2$s","Через %n недель, %1$s, затем %2$s","Через %n недель, %1$s, затем %2$s"],
+ "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Через месяц, %1$s, затем %2$s","Через %n месяца, %1$s, затем %2$s","Через %n месяцев, %1$s, затем %2$s","Через %n месяцев, %1$s, затем %2$s"],
+ "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Через год, %1$s, затем %2$s","Через %n года, %1$s, затем %2$s","Через %n лет, %1$s, затем %2$s","Через %n лет, %1$s, затем %2$s"],
+ "In the past on %1$s then on %2$s and %3$s" : "В прошлом, %1$s, затем %2$s и %3$s",
+ "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Через минуту, %1$s, затем %2$s и %3$s","Через %n минуты, %1$s, затем %2$s и %3$s","Через %n минут, %1$s, затем %2$s и %3$s","Через %n минут, %1$s, затем %2$s и %3$s"],
+ "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Через час, %1$s, затем %2$s и %3$s","Через %n часа, %1$s, затем %2$s и %3$s","Через %n часов, %1$s, затем %2$s и %3$s","Через %n часов, %1$s, затем %2$s и %3$s"],
+ "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Через день, %1$s, затем %2$s и %3$s","Через %n дня, %1$s, затем %2$s и %3$s","Через %n дней, %1$s, затем %2$s и %3$s","Через %n дней, %1$s, затем %2$s и %3$s"],
+ "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Через неделю, %1$s, затем %2$s и %3$s","Через %n недели, %1$s, затем %2$s и %3$s","Через %n недель, %1$s, затем %2$s и %3$s","Через %n недель, %1$s, затем %2$s и %3$s"],
+ "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Через месяц, %1$s, затем %2$s и %3$s","Через %n месяца, %1$s, затем %2$s и %3$s","Через %n месяцев, %1$s, затем %2$s и %3$s","Через %n месяцев, %1$s, затем %2$s и %3$s"],
+ "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Через год, %1$s, затем %2$s и %3$s","Через %n года, %1$s, затем %2$s и %3$s","Через %n лет, %1$s, затем %2$s и %3$s","Через %n лет, %1$s, затем %2$s и %3$s"],
"Could not generate next recurrence statement" : "Не удалось сгенерировать следующий оператор повторения",
"Cancelled: %1$s" : "Событие отменено: %1$s",
"\"%1$s\" has been canceled" : "Событие «%1$s» отменено",
@@ -119,10 +189,12 @@ OC.L10N.register(
"Second" : "Второй",
"Third" : "Третий",
"Fourth" : "Четвертый",
+ "Fifth" : "Пятый",
"Last" : "Последний",
"Second Last" : "Предпоследний",
- "Third Last" : "Третий по счету",
- "Fourth Last" : "Четвертый по счету",
+ "Third Last" : "Третий с конца",
+ "Fourth Last" : "Четвёртый с конца",
+ "Fifth Last" : "Пятый с конца",
"Contacts" : "Контакты",
"{actor} created address book {addressbook}" : "{actor} создал(а) адресную книгу «{addressbook}»",
"You created address book {addressbook}" : "Вы создали адресную книгу «{addressbook}»",
@@ -178,6 +250,9 @@ OC.L10N.register(
"Completed on %s" : "Завершено %s",
"Due on %s by %s" : "До %s %s",
"Due on %s" : "До %s",
+ "System Address Book" : "Системная адресная книга",
+ "The system address book contains contact information for all users in your instance." : "Системная адресная книга содержит контактную информацию всех пользователей в вашем инстансе.",
+ "Enable System Address Book" : "Включить системную адресную книгу",
"DAV system address book" : "Системная адресная книга DAV",
"No outstanding DAV system address book sync." : "Синхронизация системной адресной книги DAV выполнена.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Синхронизация системной адресной книги DAV ещё не запущена, поскольку в этом экземпляре более 1000 пользователей или произошла ошибка. Перезапустите синхронизацию вручную используя команду «occ dav:sync-system-addressbook».",
@@ -218,7 +293,22 @@ OC.L10N.register(
"Cancel" : "Отмена",
"Import" : "Импортировать",
"Error while saving settings" : "Ошибка при сохранении параметров",
+ "Contact reset successfully" : "Контакт успешно сброшен",
+ "Error while resetting contact" : "Ошибка при сбросе контакта",
+ "Contact imported successfully" : " Контакт успешно импортирован",
+ "Error while importing contact" : " Ошибка при импорте контакта",
+ "Import contact" : "Импортировать контакт",
"Reset to default" : "Сбросить изменения",
+ "Import contacts" : "Импортировать контакты",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Импорт нового файла .vcf удалит существующий контакт по умолчанию и заменит его новым. Продолжить?",
+ "Failed to save example event creation setting" : "Не удалось сохранить настройки создания примера события",
+ "Failed to upload the example event" : "Не удалось загрузить пример события",
+ "Custom example event was saved successfully" : "Настраиваемый пример события успешно сохранён",
+ "Failed to delete the custom example event" : "Не удалось удалить настраиваемый пример события",
+ "Custom example event was deleted successfully" : "Настраиваемый пример события успешно удалён",
+ "Import calendar event" : "Импортировать событие календаря",
+ "Uploading a new event will overwrite the existing one." : " Загрузка нового события перезапишет существующее.",
+ "Upload event" : "Загрузить событие",
"Availability" : "Рабочее время",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Если вы настроите свой расписание работы, другие пользователи при планировании встреч смогут видеть, когда вас нет в офисе.",
"Absence" : "Отсутствие",
@@ -235,6 +325,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Отправлять напоминания всем пользователям, имеющим доступ к календарю",
"Reminders are always sent to organizers and attendees." : "Организаторам и участникам уведомления отправляются во всех случаях.",
"Enable notifications for events via push" : "Включить уведомления о событиях с помощью push",
+ "Example content" : "Пример содержимого",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Пример содержимого демонстрирует возможности Nextcloud. По умолчанию поставляется стандартное содержимое, которое можно заменить настраиваемым.",
"There was an error updating your attendance status." : "Ошибка обновления статуса участия.",
"Please contact the organizer directly." : "Обратитесь к организатору напрямую.",
"Are you accepting the invitation?" : "Принять приглашение?",
diff --git a/apps/dav/l10n/ru.json b/apps/dav/l10n/ru.json
index f6e8329d5d7..d1da881a4c6 100644
--- a/apps/dav/l10n/ru.json
+++ b/apps/dav/l10n/ru.json
@@ -70,7 +70,77 @@
"Description: %s" : "Описание: %s",
"Where: %s" : "Где: %s",
"%1$s via %2$s" : "%1$s через %2$s",
+ "In the past on %1$s for the entire day" : "В прошлом, %1$s, в течение всего дня",
+ "_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Через минуту, %1$s, в течение всего дня","Через %n минуты, %1$s, в течение всего дня","Через %n минут, %1$s, в течение всего дня","Через %n минут, %1$s, в течение всего дня"],
+ "_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Через час, %1$s, в течение всего дня","Через %n часа, %1$s, в течение всего дня","Через %n часов, %1$s, в течение всего дня","Через %n часов, %1$s, в течение всего дня"],
+ "_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Через день, %1$s, в течение всего дня","Через %n дня, %1$s, в течение всего дня","Через %n дней,%1$s, в течение всего дня","Через %n дней, %1$s, в течение всего дня"],
+ "_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Через неделю, %1$s, в течение всего дня","Через %n недели, %1$s, в течение всего дня","Через %n недель, %1$s, в течение всего дня","Через %n недель, %1$s, в течение всего дня"],
+ "_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Через месяц, %1$s, в течение всего дня","Через %n месяца, %1$s, в течение всего дня","Через %n месяцев, %1$s, в течение всего дня","Через %n месяцев, %1$s, в течение всего дня"],
+ "_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Через год, %1$s, в течение всего дня","Через %n года, %1$s, в течение всего дня","Через %n лет, %1$s, в течение всего дня","Через %n лет, %1$s, в течение всего дня"],
+ "In the past on %1$s between %2$s - %3$s" : "В прошлом, %1$s, с %2$s до %3$s",
+ "_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Через минуту, %1$s, с %2$s до %3$s","Через %n минуты, %1$s, с %2$s до %3$s","Через %n минут, %1$s, с %2$s до %3$s","Через %n минут, %1$s, с %2$s до %3$s"],
+ "_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Через час, %1$s, с %2$s до %3$s","Через %n часа, %1$s, с %2$s до %3$s","Через %n часов, %1$s, с %2$s до %3$s","Через %n часов, %1$s, с %2$s до %3$s"],
+ "_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Через день, %1$s, с %2$s до %3$s","Через %n дня %1$s, с %2$s до %3$s","Через %n дней, %1$s, с %2$s до %3$s","Через %n дней, %1$s, с %2$s до %3$s"],
+ "_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Через неделю, %1$s, с %2$s до %3$s","Через %n недели, %1$s, с %2$s до %3$s","Через %n недель, %1$s, с %2$s до %3$s","Через %n недель, %1$s, с %2$s до %3$s"],
+ "_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Через месяц, %1$s, с %2$s до %3$s","Через %n месяца, %1$s, с %2$s до %3$s","Через %n месяцев, %1$s, с %2$s до %3$s","Через %n месяцев, %1$s, с %2$s до %3$s"],
+ "_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Через год, %1$s, с %2$s до %3$s","Через %n года, %1$s, с %2$s до %3$s","Через %n лет, %1$s, с %2$s до %3$s","Через %n лет, %1$s, с %2$s до %3$s"],
+ "Could not generate when statement" : "Не удалось сгенерировать выражение времени",
"Every Day for the entire day" : "Каждый день в течение всего дня",
+ "Every Day for the entire day until %1$s" : "Каждый день весь день до %1$s",
+ "Every Day between %1$s - %2$s" : "Каждый день с %1$s по %2$s",
+ "Every Day between %1$s - %2$s until %3$s" : "Каждый день с %1$s до %2$s до %3$s",
+ "Every %1$d Days for the entire day" : "Каждые %1$d дней в течение всего дня",
+ "Every %1$d Days for the entire day until %2$s" : "Каждые %1$d дней в течение всего дня до %2$s",
+ "Every %1$d Days between %2$s - %3$s" : "Каждые %1$d дней с %2$s до %3$s",
+ "Every %1$d Days between %2$s - %3$s until %4$s" : "Каждые %1$d дней с %2$s до %3$s до %4$s",
+ "Could not generate event recurrence statement" : "Не удалось сгенерировать правило повторения события",
+ "Every Week on %1$s for the entire day" : "Каждую неделю в %1$s в течение всего дня",
+ "Every Week on %1$s for the entire day until %2$s" : "Каждую неделю по %1$s в течение всего дня до %2$s",
+ "Every Week on %1$s between %2$s - %3$s" : "Каждую неделю в %1$s с %2$s до %3$s",
+ "Every Week on %1$s between %2$s - %3$s until %4$s" : "Каждую неделю по %1$s с %2$s до %3$s до %4$s",
+ "Every %1$d Weeks on %2$s for the entire day" : "Каждые %1$d недель по %2$s в течение всего дня",
+ "Every %1$d Weeks on %2$s for the entire day until %3$s" : "Каждые %1$d недель по %2$s в течение всего дня до %3$s",
+ "Every %1$d Weeks on %2$s between %3$s - %4$s" : "Каждые %1$d недель по %2$s с %3$s до %4$s",
+ "Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Каждые %1$d недель по %2$s с %3$s до %4$s до %5$s",
+ "Every Month on the %1$s for the entire day" : "Каждый месяц %1$s в течение всего дня",
+ "Every Month on the %1$s for the entire day until %2$s" : "Каждый месяц %1$s в течение всего дня до %2$s",
+ "Every Month on the %1$s between %2$s - %3$s" : "Каждый месяц %1$s с %2$s до %3$s",
+ "Every Month on the %1$s between %2$s - %3$s until %4$s" : "Каждый месяц %1$s с %2$s до %3$s до %4$s",
+ "Every %1$d Months on the %2$s for the entire day" : "Каждые %1$d месяцев %2$s в течение всего дня",
+ "Every %1$d Months on the %2$s for the entire day until %3$s" : "Каждые %1$d месяцев %2$s в течение всего дня до %3$s",
+ "Every %1$d Months on the %2$s between %3$s - %4$s" : "Каждые %1$d месяцев %2$s с %3$s до %4$s",
+ "Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Каждые %1$d месяцев %2$s с %3$s до %4$s до %5$s",
+ "Every Year in %1$s on the %2$s for the entire day" : "Каждый год в %1$s %2$s в течение всего дня",
+ "Every Year in %1$s on the %2$s for the entire day until %3$s" : "Каждый год в %1$s %2$s в течение всего дня до %3$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s" : "Каждый год в %1$s %2$s с %3$s до %4$s",
+ "Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Каждый год в %1$s %2$s с %3$s до %4$s до %5$s",
+ "Every %1$d Years in %2$s on the %3$s for the entire day" : "Каждые %1$d лет в %2$s %3$s в течение всего дня",
+ "Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Каждые %1$d лет в %2$s %3$s в течение всего дня до %4$s",
+ "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Каждые %1$d лет в %2$s %3$s с %4$s до %5$s",
+ "Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Каждые %1$d лет в %2$s %3$s с %4$s до %5$s до %6$s",
+ "On specific dates for the entire day until %1$s" : "В определённые даты, весь день до %1$s",
+ "On specific dates between %1$s - %2$s until %3$s" : "В определённые даты с %1$s по %2$s до %3$s",
+ "In the past on %1$s" : "В прошлом, %1$s",
+ "_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Через минуту, %1$s","Через %n минуты, %1$s","Через %n минут, %1$s","Через %n минут, %1$s"],
+ "_In a hour on %1$s_::_In %n hours on %1$s_" : ["Через час, %1$s","Через %n часа, %1$s","Через %n часов, %1$s","Через %n часов, %1$s"],
+ "_In a day on %1$s_::_In %n days on %1$s_" : ["Через день, %1$s","Через %n дня, %1$s","Через %n дней, %1$s","Через %n дней, %1$s"],
+ "_In a week on %1$s_::_In %n weeks on %1$s_" : ["Через неделю, %1$s","Через %n недели,%1$s","Через %n недель, %1$s","Через %n недель, %1$s"],
+ "_In a month on %1$s_::_In %n months on %1$s_" : ["Через месяц, %1$s","Через %n месяца, %1$s","Через %n месяцев, %1$s","Через %n месяцев, %1$s"],
+ "_In a year on %1$s_::_In %n years on %1$s_" : ["Через год, %1$s","Через %n года, %1$s","Через %n лет, %1$s","Через %n лет, %1$s"],
+ "In the past on %1$s then on %2$s" : "В прошлом, %1$s, затем %2$s",
+ "_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Через минуту, %1$s, затем %2$s","Через %n минуты, %1$s, затем %2$s","Через %n минут, %1$s, затем %2$s","Через %n минут, %1$s, затем %2$s"],
+ "_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Через час, %1$s, затем %2$s","Через %n часа, %1$s, затем %2$s","Через %n часов, %1$s, затем %2$s","Через %n часов, %1$s, затем %2$s"],
+ "_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Через день, %1$s, затем %2$s","Через %n дня, %1$s, затем %2$s","Через %n дней, %1$s, затем %2$s","Через %n дней, %1$s, затем %2$s"],
+ "_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Через неделю, %1$s, затем %2$s","Через %n недели, %1$s, затем %2$s","Через %n недель, %1$s, затем %2$s","Через %n недель, %1$s, затем %2$s"],
+ "_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Через месяц, %1$s, затем %2$s","Через %n месяца, %1$s, затем %2$s","Через %n месяцев, %1$s, затем %2$s","Через %n месяцев, %1$s, затем %2$s"],
+ "_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Через год, %1$s, затем %2$s","Через %n года, %1$s, затем %2$s","Через %n лет, %1$s, затем %2$s","Через %n лет, %1$s, затем %2$s"],
+ "In the past on %1$s then on %2$s and %3$s" : "В прошлом, %1$s, затем %2$s и %3$s",
+ "_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Через минуту, %1$s, затем %2$s и %3$s","Через %n минуты, %1$s, затем %2$s и %3$s","Через %n минут, %1$s, затем %2$s и %3$s","Через %n минут, %1$s, затем %2$s и %3$s"],
+ "_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Через час, %1$s, затем %2$s и %3$s","Через %n часа, %1$s, затем %2$s и %3$s","Через %n часов, %1$s, затем %2$s и %3$s","Через %n часов, %1$s, затем %2$s и %3$s"],
+ "_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Через день, %1$s, затем %2$s и %3$s","Через %n дня, %1$s, затем %2$s и %3$s","Через %n дней, %1$s, затем %2$s и %3$s","Через %n дней, %1$s, затем %2$s и %3$s"],
+ "_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Через неделю, %1$s, затем %2$s и %3$s","Через %n недели, %1$s, затем %2$s и %3$s","Через %n недель, %1$s, затем %2$s и %3$s","Через %n недель, %1$s, затем %2$s и %3$s"],
+ "_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Через месяц, %1$s, затем %2$s и %3$s","Через %n месяца, %1$s, затем %2$s и %3$s","Через %n месяцев, %1$s, затем %2$s и %3$s","Через %n месяцев, %1$s, затем %2$s и %3$s"],
+ "_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Через год, %1$s, затем %2$s и %3$s","Через %n года, %1$s, затем %2$s и %3$s","Через %n лет, %1$s, затем %2$s и %3$s","Через %n лет, %1$s, затем %2$s и %3$s"],
"Could not generate next recurrence statement" : "Не удалось сгенерировать следующий оператор повторения",
"Cancelled: %1$s" : "Событие отменено: %1$s",
"\"%1$s\" has been canceled" : "Событие «%1$s» отменено",
@@ -117,10 +187,12 @@
"Second" : "Второй",
"Third" : "Третий",
"Fourth" : "Четвертый",
+ "Fifth" : "Пятый",
"Last" : "Последний",
"Second Last" : "Предпоследний",
- "Third Last" : "Третий по счету",
- "Fourth Last" : "Четвертый по счету",
+ "Third Last" : "Третий с конца",
+ "Fourth Last" : "Четвёртый с конца",
+ "Fifth Last" : "Пятый с конца",
"Contacts" : "Контакты",
"{actor} created address book {addressbook}" : "{actor} создал(а) адресную книгу «{addressbook}»",
"You created address book {addressbook}" : "Вы создали адресную книгу «{addressbook}»",
@@ -176,6 +248,9 @@
"Completed on %s" : "Завершено %s",
"Due on %s by %s" : "До %s %s",
"Due on %s" : "До %s",
+ "System Address Book" : "Системная адресная книга",
+ "The system address book contains contact information for all users in your instance." : "Системная адресная книга содержит контактную информацию всех пользователей в вашем инстансе.",
+ "Enable System Address Book" : "Включить системную адресную книгу",
"DAV system address book" : "Системная адресная книга DAV",
"No outstanding DAV system address book sync." : "Синхронизация системной адресной книги DAV выполнена.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Синхронизация системной адресной книги DAV ещё не запущена, поскольку в этом экземпляре более 1000 пользователей или произошла ошибка. Перезапустите синхронизацию вручную используя команду «occ dav:sync-system-addressbook».",
@@ -216,7 +291,22 @@
"Cancel" : "Отмена",
"Import" : "Импортировать",
"Error while saving settings" : "Ошибка при сохранении параметров",
+ "Contact reset successfully" : "Контакт успешно сброшен",
+ "Error while resetting contact" : "Ошибка при сбросе контакта",
+ "Contact imported successfully" : " Контакт успешно импортирован",
+ "Error while importing contact" : " Ошибка при импорте контакта",
+ "Import contact" : "Импортировать контакт",
"Reset to default" : "Сбросить изменения",
+ "Import contacts" : "Импортировать контакты",
+ "Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Импорт нового файла .vcf удалит существующий контакт по умолчанию и заменит его новым. Продолжить?",
+ "Failed to save example event creation setting" : "Не удалось сохранить настройки создания примера события",
+ "Failed to upload the example event" : "Не удалось загрузить пример события",
+ "Custom example event was saved successfully" : "Настраиваемый пример события успешно сохранён",
+ "Failed to delete the custom example event" : "Не удалось удалить настраиваемый пример события",
+ "Custom example event was deleted successfully" : "Настраиваемый пример события успешно удалён",
+ "Import calendar event" : "Импортировать событие календаря",
+ "Uploading a new event will overwrite the existing one." : " Загрузка нового события перезапишет существующее.",
+ "Upload event" : "Загрузить событие",
"Availability" : "Рабочее время",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Если вы настроите свой расписание работы, другие пользователи при планировании встреч смогут видеть, когда вас нет в офисе.",
"Absence" : "Отсутствие",
@@ -233,6 +323,8 @@
"Send reminder notifications to calendar sharees as well" : "Отправлять напоминания всем пользователям, имеющим доступ к календарю",
"Reminders are always sent to organizers and attendees." : "Организаторам и участникам уведомления отправляются во всех случаях.",
"Enable notifications for events via push" : "Включить уведомления о событиях с помощью push",
+ "Example content" : "Пример содержимого",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Пример содержимого демонстрирует возможности Nextcloud. По умолчанию поставляется стандартное содержимое, которое можно заменить настраиваемым.",
"There was an error updating your attendance status." : "Ошибка обновления статуса участия.",
"Please contact the organizer directly." : "Обратитесь к организатору напрямую.",
"Are you accepting the invitation?" : "Принять приглашение?",
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index 4eb4c3ee271..feb1adde944 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -301,6 +301,14 @@ OC.L10N.register(
"Reset to default" : "Återställ till grundinställningar",
"Import contacts" : "Importera kontakter",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Att importera en ny .vcf-fil kommer att radera den befintliga standardkontakten och ersätta den med den nya. Vill du fortsätta?",
+ "Failed to save example event creation setting" : "Kunde inte spara exemplet för inställning av händelseskapande",
+ "Failed to upload the example event" : "Kunde inte ladda upp exempelhändelsen",
+ "Custom example event was saved successfully" : "Anpassad exempelhändelse sparades",
+ "Failed to delete the custom example event" : "Kunde inte ta bort den anpassade exempelhändelsen",
+ "Custom example event was deleted successfully" : "Anpassad exempelhändelse har raderats",
+ "Import calendar event" : "Importera kalenderhändelse",
+ "Uploading a new event will overwrite the existing one." : "Om du laddar upp en ny händelse kommer den att skriva över den befintliga.",
+ "Upload event" : "Ladda upp händelse",
"Availability" : "Din tillgänglighet",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Om du konfigurerar dina arbetstider kommer andra att se när du är frånvarande när de bokar ett möte.",
"Absence" : "Frånvaro",
@@ -317,6 +325,8 @@ OC.L10N.register(
"Send reminder notifications to calendar sharees as well" : "Skicka även påminnelser till kalenderdeltagare",
"Reminders are always sent to organizers and attendees." : "Påminnelser skickas alltid till arrangörer och deltagare.",
"Enable notifications for events via push" : "Aktivera notiser för händelser via push",
+ "Example content" : "Exempelinnehåll",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Exempelinnehåll används för att visa upp funktionerna i Nextcloud. Standardinnehåll levereras med Nextcloud och kan ersättas med anpassat innehåll.",
"There was an error updating your attendance status." : "Ett fel uppstod vid uppdatering av din närvarostatus.",
"Please contact the organizer directly." : "Vänligen kontakta arrangören direkt.",
"Are you accepting the invitation?" : "Acceptera inbjudan?",
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index 617bbbc5a0e..0496461778f 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -299,6 +299,14 @@
"Reset to default" : "Återställ till grundinställningar",
"Import contacts" : "Importera kontakter",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Att importera en ny .vcf-fil kommer att radera den befintliga standardkontakten och ersätta den med den nya. Vill du fortsätta?",
+ "Failed to save example event creation setting" : "Kunde inte spara exemplet för inställning av händelseskapande",
+ "Failed to upload the example event" : "Kunde inte ladda upp exempelhändelsen",
+ "Custom example event was saved successfully" : "Anpassad exempelhändelse sparades",
+ "Failed to delete the custom example event" : "Kunde inte ta bort den anpassade exempelhändelsen",
+ "Custom example event was deleted successfully" : "Anpassad exempelhändelse har raderats",
+ "Import calendar event" : "Importera kalenderhändelse",
+ "Uploading a new event will overwrite the existing one." : "Om du laddar upp en ny händelse kommer den att skriva över den befintliga.",
+ "Upload event" : "Ladda upp händelse",
"Availability" : "Din tillgänglighet",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Om du konfigurerar dina arbetstider kommer andra att se när du är frånvarande när de bokar ett möte.",
"Absence" : "Frånvaro",
@@ -315,6 +323,8 @@
"Send reminder notifications to calendar sharees as well" : "Skicka även påminnelser till kalenderdeltagare",
"Reminders are always sent to organizers and attendees." : "Påminnelser skickas alltid till arrangörer och deltagare.",
"Enable notifications for events via push" : "Aktivera notiser för händelser via push",
+ "Example content" : "Exempelinnehåll",
+ "Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Exempelinnehåll används för att visa upp funktionerna i Nextcloud. Standardinnehåll levereras med Nextcloud och kan ersättas med anpassat innehåll.",
"There was an error updating your attendance status." : "Ett fel uppstod vid uppdatering av din närvarostatus.",
"Please contact the organizer directly." : "Vänligen kontakta arrangören direkt.",
"Are you accepting the invitation?" : "Acceptera inbjudan?",
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index bbf83d997a4..5a5f4b7fbf8 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -120,7 +120,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "ترويسات الأعمدة ذات الأزرار قابلة للترتيب.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
"File not found" : "تعذر العثور على الملف",
- "{count} selected" : "{count} تم تحديده",
+ "_{count} selected_::_{count} selected_" : ["{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده"],
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{used} of {quota} used" : "{used} من {quota} مستخدم",
"{relative}% used" : "{relative}% مستخدمة",
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index ba86b8a249b..53f25349af8 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -118,7 +118,7 @@
"Column headers with buttons are sortable." : "ترويسات الأعمدة ذات الأزرار قابلة للترتيب.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "لم يتم عرض هذه القائمة بالكامل لأسباب تتعلق بالأداء. سيتم عرض الملفات تباعاً أثناء التنقل عبر القائمة.",
"File not found" : "تعذر العثور على الملف",
- "{count} selected" : "{count} تم تحديده",
+ "_{count} selected_::_{count} selected_" : ["{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده","{count} تمّ تحديده"],
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{used} of {quota} used" : "{used} من {quota} مستخدم",
"{relative}% used" : "{relative}% مستخدمة",
diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js
index d9bdbf9b621..9c28dace36c 100644
--- a/apps/files/l10n/ast.js
+++ b/apps/files/l10n/ast.js
@@ -90,7 +90,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
"File not found" : "Nun s'atopó'l ficheru",
- "{count} selected" : "{count} na seleición",
"{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
"{used} of {quota} used" : "{used} de {quota} n'usu",
"{relative}% used" : "{relative}% n'usu",
diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json
index 3ccfed40a0c..dc64011f531 100644
--- a/apps/files/l10n/ast.json
+++ b/apps/files/l10n/ast.json
@@ -88,7 +88,6 @@
"Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
"File not found" : "Nun s'atopó'l ficheru",
- "{count} selected" : "{count} na seleición",
"{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
"{used} of {quota} used" : "{used} de {quota} n'usu",
"{relative}% used" : "{relative}% n'usu",
diff --git a/apps/files/l10n/bg.js b/apps/files/l10n/bg.js
index 7d172b5ceba..92a891ee965 100644
--- a/apps/files/l10n/bg.js
+++ b/apps/files/l10n/bg.js
@@ -78,6 +78,7 @@ OC.L10N.register(
"\"{displayName}\" action failed" : "Действието „{displayName}“ е неуспешно",
"Actions" : "Действия",
"File not found" : "Файлът не е намерен",
+ "_{count} selected_::_{count} selected_" : ["{count} избрани","{count} избрани"],
"{usedQuotaByte} used" : "{usedQuotaByte} използвано",
"{used} of {quota} used" : "{used} от {quota} използвани",
"{relative}% used" : "{relative}% използвано",
diff --git a/apps/files/l10n/bg.json b/apps/files/l10n/bg.json
index eea8dc8561c..2d3f7428d95 100644
--- a/apps/files/l10n/bg.json
+++ b/apps/files/l10n/bg.json
@@ -76,6 +76,7 @@
"\"{displayName}\" action failed" : "Действието „{displayName}“ е неуспешно",
"Actions" : "Действия",
"File not found" : "Файлът не е намерен",
+ "_{count} selected_::_{count} selected_" : ["{count} избрани","{count} избрани"],
"{usedQuotaByte} used" : "{usedQuotaByte} използвано",
"{used} of {quota} used" : "{used} от {quota} използвани",
"{relative}% used" : "{relative}% използвано",
diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js
index 165d9f4db58..b2450f96782 100644
--- a/apps/files/l10n/ca.js
+++ b/apps/files/l10n/ca.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Les capçaleres de columna amb botons es poder ordenar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"File not found" : "No s'ha trobat el fitxer",
- "{count} selected" : "Selecció: {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} en ús",
"{used} of {quota} used" : "{used} de {quota} en ús",
"{relative}% used" : "{relative}% en ús",
diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json
index 785f02ffb75..7d468051d24 100644
--- a/apps/files/l10n/ca.json
+++ b/apps/files/l10n/ca.json
@@ -114,7 +114,6 @@
"Column headers with buttons are sortable." : "Les capçaleres de columna amb botons es poder ordenar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"File not found" : "No s'ha trobat el fitxer",
- "{count} selected" : "Selecció: {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} en ús",
"{used} of {quota} used" : "{used} de {quota} en ús",
"{relative}% used" : "{relative}% en ús",
diff --git a/apps/files/l10n/cs.js b/apps/files/l10n/cs.js
index e3739719ee2..a1718de5911 100644
--- a/apps/files/l10n/cs.js
+++ b/apps/files/l10n/cs.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Podle těch sloupců, které mají v záhlaví tlačítko, je možné řadit.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"File not found" : "Soubor nenalezen",
- "{count} selected" : "vybráno {count}",
+ "_{count} selected_::_{count} selected_" : ["vybráno {count}","vybráno {count}","vybráno {count}","vybráno {count}"],
"{usedQuotaByte} used" : "{usedQuotaByte} využito",
"{used} of {quota} used" : "Využito {used} z {quota} ",
"{relative}% used" : "{relative}% využito",
diff --git a/apps/files/l10n/cs.json b/apps/files/l10n/cs.json
index 1f5d8646df1..9ebd45561e0 100644
--- a/apps/files/l10n/cs.json
+++ b/apps/files/l10n/cs.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Podle těch sloupců, které mají v záhlaví tlačítko, je možné řadit.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"File not found" : "Soubor nenalezen",
- "{count} selected" : "vybráno {count}",
+ "_{count} selected_::_{count} selected_" : ["vybráno {count}","vybráno {count}","vybráno {count}","vybráno {count}"],
"{usedQuotaByte} used" : "{usedQuotaByte} využito",
"{used} of {quota} used" : "Využito {used} z {quota} ",
"{relative}% used" : "{relative}% využito",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index 1bd3dad4599..3cd40d2a95d 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper er sorterbare.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Hele listen er ikke hentet, af hensyn til størrelsen. Listen vil blive hentet løbende som du kører igennem listen.",
"File not found" : "Filen blev ikke fundet",
- "{count} selected" : "{count} valgt",
"{usedQuotaByte} used" : "{usedQuotaByte} brugt",
"{used} of {quota} used" : "{used} af {quota} brugt",
"{relative}% used" : "{relative}% brugt",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index cce400a7144..5089b66dcc9 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -114,7 +114,6 @@
"Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper er sorterbare.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Hele listen er ikke hentet, af hensyn til størrelsen. Listen vil blive hentet løbende som du kører igennem listen.",
"File not found" : "Filen blev ikke fundet",
- "{count} selected" : "{count} valgt",
"{usedQuotaByte} used" : "{usedQuotaByte} brugt",
"{used} of {quota} used" : "{used} af {quota} brugt",
"{relative}% used" : "{relative}% brugt",
diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js
index 7d0d105072c..3e6ad8bf9aa 100644
--- a/apps/files/l10n/de.js
+++ b/apps/files/l10n/de.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden angezeigt, wenn du durch die Liste navigierst.",
"File not found" : "Datei nicht gefunden",
- "{count} selected" : "{count} ausgewählt",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{used} of {quota} used" : "{used} von {quota} verwendet",
"{relative}% used" : "{relative} % verwendet",
diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json
index 7dca82a027c..709464ad3be 100644
--- a/apps/files/l10n/de.json
+++ b/apps/files/l10n/de.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden angezeigt, wenn du durch die Liste navigierst.",
"File not found" : "Datei nicht gefunden",
- "{count} selected" : "{count} ausgewählt",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{used} of {quota} used" : "{used} von {quota} verwendet",
"{relative}% used" : "{relative} % verwendet",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index c0f58b2e1eb..63cf2a969c9 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"File not found" : "Datei nicht gefunden",
- "{count} selected" : "{count} ausgewählt",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{used} of {quota} used" : "{used} von {quota} verwendet",
"{relative}% used" : "{relative} % verwendet",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 5f3c56b5943..ee85f6a1860 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Spaltenüberschriften mit Schaltflächen sind sortierbar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"File not found" : "Datei nicht gefunden",
- "{count} selected" : "{count} ausgewählt",
+ "_{count} selected_::_{count} selected_" : ["{count} ausgewählt","{count} ausgewählt"],
"{usedQuotaByte} used" : "{usedQuotaByte} verwendet",
"{used} of {quota} used" : "{used} von {quota} verwendet",
"{relative}% used" : "{relative} % verwendet",
diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js
index b80ca51fce8..8e9d8cfe461 100644
--- a/apps/files/l10n/el.js
+++ b/apps/files/l10n/el.js
@@ -96,7 +96,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Οι επικεφαλίδες στηλών με κουμπιά είναι ταξινομήσιμες.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
"File not found" : "Δε βρέθηκε το αρχείο",
- "{count} selected" : "{count} έχουν επιλεγεί",
"{usedQuotaByte} used" : "{usedQuotaByte} χρησιμοποιείται",
"{used} of {quota} used" : "Χρήση {used} από {quota} ",
"{relative}% used" : "{relative}% χρησιμοποιείται",
diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json
index 517397b07c1..dfb52e9e725 100644
--- a/apps/files/l10n/el.json
+++ b/apps/files/l10n/el.json
@@ -94,7 +94,6 @@
"Column headers with buttons are sortable." : "Οι επικεφαλίδες στηλών με κουμπιά είναι ταξινομήσιμες.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
"File not found" : "Δε βρέθηκε το αρχείο",
- "{count} selected" : "{count} έχουν επιλεγεί",
"{usedQuotaByte} used" : "{usedQuotaByte} χρησιμοποιείται",
"{used} of {quota} used" : "Χρήση {used} από {quota} ",
"{relative}% used" : "{relative}% χρησιμοποιείται",
diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js
index 8c048258500..9321bed70a9 100644
--- a/apps/files/l10n/en_GB.js
+++ b/apps/files/l10n/en_GB.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"File not found" : "File not found",
- "{count} selected" : "{count} selected",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{used} of {quota} used" : "{used} of {quota} used",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json
index 111c36b99b0..ad4a1a6e0ed 100644
--- a/apps/files/l10n/en_GB.json
+++ b/apps/files/l10n/en_GB.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"File not found" : "File not found",
- "{count} selected" : "{count} selected",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{used} of {quota} used" : "{used} of {quota} used",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 052bcaa2aa0..b20e2be9964 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -117,7 +117,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"File not found" : "No se ha encontrado el archivo",
- "{count} selected" : "{count} seleccionados",
+ "_{count} selected_::_{count} selected_" : ["{count}seleccionado","{count} seleccionados","{count} seleccionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{used} of {quota} used" : "{used} usados de {quota}",
"{relative}% used" : "{relative}% utilizado",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 3a9fa3af3e5..c34b3f7281b 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -115,7 +115,7 @@
"Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"File not found" : "No se ha encontrado el archivo",
- "{count} selected" : "{count} seleccionados",
+ "_{count} selected_::_{count} selected_" : ["{count}seleccionado","{count} seleccionados","{count} seleccionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{used} of {quota} used" : "{used} usados de {quota}",
"{relative}% used" : "{relative}% utilizado",
diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js
index 2e937b91fae..0702df37a2c 100644
--- a/apps/files/l10n/es_EC.js
+++ b/apps/files/l10n/es_EC.js
@@ -78,6 +78,7 @@ OC.L10N.register(
"\"{displayName}\" action failed" : "La acción \"{displayName}\" falló.",
"Actions" : "Acciones",
"List of files and folders." : "Lista de archivos y carpetas. ",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionado"],
"{usedQuotaByte} used" : "{usedQuotaByte} usados.",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% usados.",
diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json
index ce46795a8ae..321328d7be4 100644
--- a/apps/files/l10n/es_EC.json
+++ b/apps/files/l10n/es_EC.json
@@ -76,6 +76,7 @@
"\"{displayName}\" action failed" : "La acción \"{displayName}\" falló.",
"Actions" : "Acciones",
"List of files and folders." : "Lista de archivos y carpetas. ",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados","{count} seleccionado"],
"{usedQuotaByte} used" : "{usedQuotaByte} usados.",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% usados.",
diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js
index 7ad14b22bbb..086d9e0fdd0 100644
--- a/apps/files/l10n/es_MX.js
+++ b/apps/files/l10n/es_MX.js
@@ -106,7 +106,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"File not found" : "Archivo no encontrado",
- "{count} selected" : "{count} seleccionados",
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% utilizado",
diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json
index 93aee529828..b126e689477 100644
--- a/apps/files/l10n/es_MX.json
+++ b/apps/files/l10n/es_MX.json
@@ -104,7 +104,6 @@
"Column headers with buttons are sortable." : "Las columnas con botones en la cabecera son ordenables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista no se muestra completamente por motivos de rendimiento. Los archivos se mostrarán a medida que navega por la lista.",
"File not found" : "Archivo no encontrado",
- "{count} selected" : "{count} seleccionados",
"{usedQuotaByte} used" : "{usedQuotaByte} utilizados",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% utilizado",
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index cd54b2acf33..4b6f263c9a0 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Võid kasutada nuppudega veerupäised järjestamiseks.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
"File not found" : "Faili ei leitud",
- "{count} selected" : "{count} valitud",
+ "_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
"{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
"{used} of {quota} used" : "{used} / {quota} kasutusel",
"{relative}% used" : "{relative}% kasutusel",
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index b8052a14b64..1ff383d06c7 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Võid kasutada nuppudega veerupäised järjestamiseks.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Jõudluse mõttes ei ole kogu loend esimesel hetkel tervikuna nähtav. Uued failid lisanduvad sedamööda, kuid sa loendis edasi liigud.",
"File not found" : "Faili ei leitud",
- "{count} selected" : "{count} valitud",
+ "_{count} selected_::_{count} selected_" : ["{count} valitud","{count} valitud"],
"{usedQuotaByte} used" : "{usedQuotaByte} kasutusel",
"{used} of {quota} used" : "{used} / {quota} kasutusel",
"{relative}% used" : "{relative}% kasutusel",
diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js
index 51ed660a406..d5b58dc1124 100644
--- a/apps/files/l10n/eu.js
+++ b/apps/files/l10n/eu.js
@@ -111,7 +111,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Botoiak dituzten zutabeen goiburuak ordena daitezke.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"File not found" : "Ez da fitxategia aurkitu",
- "{count} selected" : "{count} hautatuta",
+ "_{count} selected_::_{count} selected_" : ["{count} hautatuta","{count} hautatuta"],
"{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
"{used} of {quota} used" : "{used} / {quota} erabilita",
"{relative}% used" : "%{relative} erabilita",
diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json
index f050ebc9124..07818c85564 100644
--- a/apps/files/l10n/eu.json
+++ b/apps/files/l10n/eu.json
@@ -109,7 +109,7 @@
"Column headers with buttons are sortable." : "Botoiak dituzten zutabeen goiburuak ordena daitezke.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"File not found" : "Ez da fitxategia aurkitu",
- "{count} selected" : "{count} hautatuta",
+ "_{count} selected_::_{count} selected_" : ["{count} hautatuta","{count} hautatuta"],
"{usedQuotaByte} used" : "{usedQuotaByte} erabilita",
"{used} of {quota} used" : "{used} / {quota} erabilita",
"{relative}% used" : "%{relative} erabilita",
diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js
index 38d47a69821..64dcbc55580 100644
--- a/apps/files/l10n/fa.js
+++ b/apps/files/l10n/fa.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"File not found" : "فایل یافت نشد",
- "{count} selected" : "{count} selected",
"{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
"{used} of {quota} used" : "{used} از {quota} استفاده شده",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json
index d4cca468374..e652c77538b 100644
--- a/apps/files/l10n/fa.json
+++ b/apps/files/l10n/fa.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "این لیست به دلایل عملکرد به طور کامل ارائه نشده است. در حین حرکت در لیست، فایل ها ارائه می شوند.",
"File not found" : "فایل یافت نشد",
- "{count} selected" : "{count} selected",
"{usedQuotaByte} used" : "{usedQuotaByte} استفاده شده است",
"{used} of {quota} used" : "{used} از {quota} استفاده شده",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js
index 91ff67eb0e2..35958eb8d83 100644
--- a/apps/files/l10n/fi.js
+++ b/apps/files/l10n/fi.js
@@ -110,7 +110,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Painikkeilla varustetut sarakeotsikot ovat järjestettävissä.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"File not found" : "Tiedostoa ei löytynyt",
- "{count} selected" : "{count} valittu",
"{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
"{used} of {quota} used" : "{used}/{quota} käytetty",
"{relative}% used" : "{relative} % käytetty",
diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json
index 86e0f1dd414..8f1db629e08 100644
--- a/apps/files/l10n/fi.json
+++ b/apps/files/l10n/fi.json
@@ -108,7 +108,6 @@
"Column headers with buttons are sortable." : "Painikkeilla varustetut sarakeotsikot ovat järjestettävissä.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"File not found" : "Tiedostoa ei löytynyt",
- "{count} selected" : "{count} valittu",
"{usedQuotaByte} used" : "{usedQuotaByte} käytetty",
"{used} of {quota} used" : "{used}/{quota} käytetty",
"{relative}% used" : "{relative} % käytetty",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 7a03d199e85..4616c9f75a4 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "L'entête des colonnes avec des boutons sont triables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
"File not found" : "Fichier non trouvé",
- "{count} selected" : "{count} sélectionné(s)",
+ "_{count} selected_::_{count} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
"{used} of {quota} used" : "{used} utilisés sur {quota}",
"{relative}% used" : "{relative}% utilisés",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 7485b1c5749..ef55859018e 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "L'entête des colonnes avec des boutons sont triables.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas entièrement affichée pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous naviguerez dans la liste.",
"File not found" : "Fichier non trouvé",
- "{count} selected" : "{count} sélectionné(s)",
+ "_{count} selected_::_{count} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
"{used} of {quota} used" : "{used} utilisés sur {quota}",
"{relative}% used" : "{relative}% utilisés",
diff --git a/apps/files/l10n/ga.js b/apps/files/l10n/ga.js
index 0aca93f958f..fa6b5d48918 100644
--- a/apps/files/l10n/ga.js
+++ b/apps/files/l10n/ga.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Is féidir ceanntásca colún le cnaipí a shórtáil.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Níl an liosta seo le fáil go hiomlán ar chúiseanna feidhmíochta. Déanfar na comhaid a rindreáil agus tú ag dul tríd an liosta.",
"File not found" : "Comhad gan aimsiú",
- "{count} selected" : "{count} roghnaithe",
+ "_{count} selected_::_{count} selected_" : ["{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe"],
"{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
"{used} of {quota} used" : "{used} de {quota} in úsáid",
"{relative}% used" : "{relative}% in úsáid",
diff --git a/apps/files/l10n/ga.json b/apps/files/l10n/ga.json
index d8fa2048c0a..00896df6386 100644
--- a/apps/files/l10n/ga.json
+++ b/apps/files/l10n/ga.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Is féidir ceanntásca colún le cnaipí a shórtáil.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Níl an liosta seo le fáil go hiomlán ar chúiseanna feidhmíochta. Déanfar na comhaid a rindreáil agus tú ag dul tríd an liosta.",
"File not found" : "Comhad gan aimsiú",
- "{count} selected" : "{count} roghnaithe",
+ "_{count} selected_::_{count} selected_" : ["{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe","{count} roghnaithe"],
"{usedQuotaByte} used" : "{usedQuotaByte} úsáidte",
"{used} of {quota} used" : "{used} de {quota} in úsáid",
"{relative}% used" : "{relative}% in úsáid",
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index bcd590765b6..cf0db39da34 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -116,7 +116,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "As cabeceiras das columnas con botóns pódense ordenar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres se despraza pola lista.",
"File not found" : "Non se atopou o ficheiro",
- "{count} selected" : "{count} seleccionados",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "Usados {used} de {quota}",
"{relative}% used" : "{relative}% usado",
@@ -152,7 +152,7 @@ OC.L10N.register(
"Adding the file extension \"{new}\" may render the file unreadable." : "Engadir a extensión de ficheiro «{new}» pode facer que o ficheiro sexa ilexíbel.",
"Do not show this dialog again." : "Non volver amosar este diálogo",
"Select file or folder to link to" : "Seleccione o ficheiro ou cartafol ao que ligar",
- "Choose {file}" : "Escoller {file}",
+ "Choose {file}" : "Escoller {file}",
"Share" : "Compartir",
"Shared by link" : "Compartido por ligazón",
"Shared" : "Compartido",
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index bcb6369d52d..6e37d23adad 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -114,7 +114,7 @@
"Column headers with buttons are sortable." : "As cabeceiras das columnas con botóns pódense ordenar.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse mentres se despraza pola lista.",
"File not found" : "Non se atopou o ficheiro",
- "{count} selected" : "{count} seleccionados",
+ "_{count} selected_::_{count} selected_" : ["{count} seleccionado","{count} seleccionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "Usados {used} de {quota}",
"{relative}% used" : "{relative}% usado",
@@ -150,7 +150,7 @@
"Adding the file extension \"{new}\" may render the file unreadable." : "Engadir a extensión de ficheiro «{new}» pode facer que o ficheiro sexa ilexíbel.",
"Do not show this dialog again." : "Non volver amosar este diálogo",
"Select file or folder to link to" : "Seleccione o ficheiro ou cartafol ao que ligar",
- "Choose {file}" : "Escoller {file}",
+ "Choose {file}" : "Escoller {file}",
"Share" : "Compartir",
"Shared by link" : "Compartido por ligazón",
"Shared" : "Compartido",
diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js
index eaed162caac..5c783906ce7 100644
--- a/apps/files/l10n/hu.js
+++ b/apps/files/l10n/hu.js
@@ -114,7 +114,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "A gombot tartalmazó oszlopfejlécek rendezhetők.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg.",
"File not found" : "A fájl nem található",
- "{count} selected" : "{count}kiválasztva",
"{usedQuotaByte} used" : "{usedQuotaByte} felhasználva",
"{used} of {quota} used" : "{used} / {quota} felhasználva",
"{relative}% used" : "{relative}% felhasználva",
diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json
index f00a3f35eb3..4cc4b9e4a4d 100644
--- a/apps/files/l10n/hu.json
+++ b/apps/files/l10n/hu.json
@@ -112,7 +112,6 @@
"Column headers with buttons are sortable." : "A gombot tartalmazó oszlopfejlécek rendezhetők.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg.",
"File not found" : "A fájl nem található",
- "{count} selected" : "{count}kiválasztva",
"{usedQuotaByte} used" : "{usedQuotaByte} felhasználva",
"{used} of {quota} used" : "{used} / {quota} felhasználva",
"{relative}% used" : "{relative}% felhasználva",
diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js
index 2be51a48924..8bdd866a8dc 100644
--- a/apps/files/l10n/id.js
+++ b/apps/files/l10n/id.js
@@ -69,6 +69,7 @@ OC.L10N.register(
"Size" : "Ukuran",
"Actions" : "Tindakan",
"File not found" : "Berkas tidak ditemukan",
+ "_{count} selected_::_{count} selected_" : ["{count} dipilih"],
"{usedQuotaByte} used" : "{usedQuotaByte} digunakan",
"{used} of {quota} used" : "{used} dari {quota} terpakai",
"{relative}% used" : "{relative}% digunakan",
diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json
index d9c47f1600b..0dd90d46f7e 100644
--- a/apps/files/l10n/id.json
+++ b/apps/files/l10n/id.json
@@ -67,6 +67,7 @@
"Size" : "Ukuran",
"Actions" : "Tindakan",
"File not found" : "Berkas tidak ditemukan",
+ "_{count} selected_::_{count} selected_" : ["{count} dipilih"],
"{usedQuotaByte} used" : "{usedQuotaByte} digunakan",
"{used} of {quota} used" : "{used} dari {quota} terpakai",
"{relative}% used" : "{relative}% digunakan",
diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js
index 75cccd78118..5eb9a5c9d03 100644
--- a/apps/files/l10n/is.js
+++ b/apps/files/l10n/is.js
@@ -114,7 +114,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Dálkfyrirsagnir með hnöppum eru raðanlegar",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
"File not found" : "Skrá finnst ekki",
- "{count} selected" : "{count} valið",
"{usedQuotaByte} used" : "{usedQuotaByte} notað",
"{used} of {quota} used" : "{used} af {quota} notað",
"{relative}% used" : "{relative}% notað",
diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json
index 0dcd0432f49..19d99ddf893 100644
--- a/apps/files/l10n/is.json
+++ b/apps/files/l10n/is.json
@@ -112,7 +112,6 @@
"Column headers with buttons are sortable." : "Dálkfyrirsagnir með hnöppum eru raðanlegar",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
"File not found" : "Skrá finnst ekki",
- "{count} selected" : "{count} valið",
"{usedQuotaByte} used" : "{usedQuotaByte} notað",
"{used} of {quota} used" : "{used} af {quota} notað",
"{relative}% used" : "{relative}% notað",
diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js
index 04252175d75..0a366f2031f 100644
--- a/apps/files/l10n/it.js
+++ b/apps/files/l10n/it.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Le intestazioni di colonna con pulsanti sono ordinabili.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di prestazioni. I file verranno mostrati durante la navigazione della lista.",
"File not found" : "File non trovato",
- "{count} selected" : "{count} selezionati",
+ "_{count} selected_::_{count} selected_" : ["{count} selezionato","{count} selezionati","{count} selezionati"],
"{usedQuotaByte} used" : "{usedQuotaByte} usato",
"{used} of {quota} used" : "{used} di {quota} utilizzati",
"{relative}% used" : "{relative}% usato",
diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json
index 0c71fc93b41..5ceaf0f95c9 100644
--- a/apps/files/l10n/it.json
+++ b/apps/files/l10n/it.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Le intestazioni di colonna con pulsanti sono ordinabili.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di prestazioni. I file verranno mostrati durante la navigazione della lista.",
"File not found" : "File non trovato",
- "{count} selected" : "{count} selezionati",
+ "_{count} selected_::_{count} selected_" : ["{count} selezionato","{count} selezionati","{count} selezionati"],
"{usedQuotaByte} used" : "{usedQuotaByte} usato",
"{used} of {quota} used" : "{used} di {quota} utilizzati",
"{relative}% used" : "{relative}% usato",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 5e262b4f8cd..4ec8e70aa85 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "ボタン付きの列ヘッダはソート可能です。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
"File not found" : "ファイルが見つかりません",
- "{count} selected" : "{count} 選択",
"{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
"{used} of {quota} used" : "{used} / {quota} 使用中",
"{relative}% used" : "{relative}% 使用されています",
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 3b07da7e45e..db2d6694bd0 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "ボタン付きの列ヘッダはソート可能です。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
"File not found" : "ファイルが見つかりません",
- "{count} selected" : "{count} 選択",
"{usedQuotaByte} used" : "{usedQuotaByte} 使用されています",
"{used} of {quota} used" : "{used} / {quota} 使用中",
"{relative}% used" : "{relative}% 使用されています",
diff --git a/apps/files/l10n/ka.js b/apps/files/l10n/ka.js
index 550819832fc..648dd9e0cd0 100644
--- a/apps/files/l10n/ka.js
+++ b/apps/files/l10n/ka.js
@@ -85,6 +85,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{used} of {quota} used" : "{used} of {quota} used",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/ka.json b/apps/files/l10n/ka.json
index b9120314895..2f2017ccc82 100644
--- a/apps/files/l10n/ka.json
+++ b/apps/files/l10n/ka.json
@@ -83,6 +83,7 @@
"Column headers with buttons are sortable." : "Column headers with buttons are sortable.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.",
"File not found" : "File not found",
+ "_{count} selected_::_{count} selected_" : ["{count} selected","{count} selected"],
"{usedQuotaByte} used" : "{usedQuotaByte} used",
"{used} of {quota} used" : "{used} of {quota} used",
"{relative}% used" : "{relative}% used",
diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js
index 927f765b6f6..c275c4fc723 100644
--- a/apps/files/l10n/ko.js
+++ b/apps/files/l10n/ko.js
@@ -116,7 +116,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
"File not found" : "파일을 찾을 수 없음",
- "{count} selected" : "{count}개 선택됨",
"{usedQuotaByte} used" : "{usedQuotaByte} 사용",
"{used} of {quota} used" : "{quota} 중 {used} 사용함",
"{relative}% used" : "{relative}% 사용",
diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json
index 1d8f34484ef..161fcf36443 100644
--- a/apps/files/l10n/ko.json
+++ b/apps/files/l10n/ko.json
@@ -114,7 +114,6 @@
"Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
"File not found" : "파일을 찾을 수 없음",
- "{count} selected" : "{count}개 선택됨",
"{usedQuotaByte} used" : "{usedQuotaByte} 사용",
"{used} of {quota} used" : "{quota} 중 {used} 사용함",
"{relative}% used" : "{relative}% 사용",
diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js
index e977378b33b..2adddf95db7 100644
--- a/apps/files/l10n/lt_LT.js
+++ b/apps/files/l10n/lt_LT.js
@@ -88,7 +88,6 @@ OC.L10N.register(
"Actions" : "Veiksmai",
"List of files and folders." : "Failų ir aplankų sąrašas.",
"File not found" : "Failas nerastas",
- "{count} selected" : "Pažymėta {count}",
"{usedQuotaByte} used" : "Naudojama {usedQuotaByte}",
"{used} of {quota} used" : "panaudota {used} iš {quota}",
"{relative}% used" : "Naudojama {relative}",
diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json
index a2495e4f0f5..8bd48c833b8 100644
--- a/apps/files/l10n/lt_LT.json
+++ b/apps/files/l10n/lt_LT.json
@@ -86,7 +86,6 @@
"Actions" : "Veiksmai",
"List of files and folders." : "Failų ir aplankų sąrašas.",
"File not found" : "Failas nerastas",
- "{count} selected" : "Pažymėta {count}",
"{usedQuotaByte} used" : "Naudojama {usedQuotaByte}",
"{used} of {quota} used" : "panaudota {used} iš {quota}",
"{relative}% used" : "Naudojama {relative}",
diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js
index fa58071b8c6..6e9fa1dbd38 100644
--- a/apps/files/l10n/mk.js
+++ b/apps/files/l10n/mk.js
@@ -99,7 +99,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Насловите на колоните со копчиња се сортираат.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
"File not found" : "Датотеката не е пронајдена",
- "{count} selected" : "{count} селектирани",
"{usedQuotaByte} used" : "искористено {usedQuotaByte}",
"{used} of {quota} used" : "Искористени {used} од {quota}",
"{relative}% used" : "искористено {relative}% ",
diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json
index a1ded352961..e4c8680b27a 100644
--- a/apps/files/l10n/mk.json
+++ b/apps/files/l10n/mk.json
@@ -97,7 +97,6 @@
"Column headers with buttons are sortable." : "Насловите на колоните со копчиња се сортираат.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
"File not found" : "Датотеката не е пронајдена",
- "{count} selected" : "{count} селектирани",
"{usedQuotaByte} used" : "искористено {usedQuotaByte}",
"{used} of {quota} used" : "Искористени {used} од {quota}",
"{relative}% used" : "искористено {relative}% ",
diff --git a/apps/files/l10n/nb.js b/apps/files/l10n/nb.js
index eb260daa93b..75932ece0ae 100644
--- a/apps/files/l10n/nb.js
+++ b/apps/files/l10n/nb.js
@@ -112,7 +112,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper kan sorteres.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denne listen er ikke fullstendig gjengitt av ytelsesgrunner. Filene gjengis når du navigerer gjennom listen.",
"File not found" : "Finner ikke filen",
- "{count} selected" : "{count} valgt",
"{usedQuotaByte} used" : "{usedQuotaByte} brukt",
"{used} of {quota} used" : "{used} av {quota} brukt",
"{relative}% used" : "{relative}% brukt",
diff --git a/apps/files/l10n/nb.json b/apps/files/l10n/nb.json
index f92fd8a93d2..68b4f5caba4 100644
--- a/apps/files/l10n/nb.json
+++ b/apps/files/l10n/nb.json
@@ -110,7 +110,6 @@
"Column headers with buttons are sortable." : "Kolonneoverskrifter med knapper kan sorteres.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denne listen er ikke fullstendig gjengitt av ytelsesgrunner. Filene gjengis når du navigerer gjennom listen.",
"File not found" : "Finner ikke filen",
- "{count} selected" : "{count} valgt",
"{usedQuotaByte} used" : "{usedQuotaByte} brukt",
"{used} of {quota} used" : "{used} av {quota} brukt",
"{relative}% used" : "{relative}% brukt",
diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js
index 30ae8770ece..672161ab12a 100644
--- a/apps/files/l10n/nl.js
+++ b/apps/files/l10n/nl.js
@@ -122,7 +122,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Kolomkoppen met knoppen zijn sorteerbaar",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "De lijst is niet volledig verwerkt om de prestatie niet te beperken. De bestanden worden verder verwerkt als je door de lijst navigeert.",
"File not found" : "Bestand niet gevonden",
- "{count} selected" : "{count} geselecteerd",
"{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
"{used} of {quota} used" : "{used} van {quota} gebruikt",
"{relative}% used" : "{relative}% gebruikt",
diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json
index 4f548fe1987..b81ab06b1ec 100644
--- a/apps/files/l10n/nl.json
+++ b/apps/files/l10n/nl.json
@@ -120,7 +120,6 @@
"Column headers with buttons are sortable." : "Kolomkoppen met knoppen zijn sorteerbaar",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "De lijst is niet volledig verwerkt om de prestatie niet te beperken. De bestanden worden verder verwerkt als je door de lijst navigeert.",
"File not found" : "Bestand niet gevonden",
- "{count} selected" : "{count} geselecteerd",
"{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
"{used} of {quota} used" : "{used} van {quota} gebruikt",
"{relative}% used" : "{relative}% gebruikt",
diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js
index dc0e482ea90..8013e28dd28 100644
--- a/apps/files/l10n/pl.js
+++ b/apps/files/l10n/pl.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Nagłówki kolumn z przyciskami są sortowalne.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
"File not found" : "Nie odnaleziono pliku",
- "{count} selected" : "wybrano {count}",
"{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
"{used} of {quota} used" : "Wykorzystane {used} z {quota}",
"{relative}% used" : "Wykorzystano {relative}%",
diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json
index e1c31eb98d0..424f6dc6399 100644
--- a/apps/files/l10n/pl.json
+++ b/apps/files/l10n/pl.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "Nagłówki kolumn z przyciskami są sortowalne.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
"File not found" : "Nie odnaleziono pliku",
- "{count} selected" : "wybrano {count}",
"{usedQuotaByte} used" : "Wykorzystano {usedQuotaByte}",
"{used} of {quota} used" : "Wykorzystane {used} z {quota}",
"{relative}% used" : "Wykorzystano {relative}%",
diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js
index 4fbf806e50f..f91a54ae351 100644
--- a/apps/files/l10n/pt_BR.js
+++ b/apps/files/l10n/pt_BR.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Os cabeçalhos de coluna com botões podem ser ordenados.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados à medida que você navegar pela lista.",
"File not found" : "Arquivo não encontrado",
- "{count} selected" : "{count} selecionados",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionados","{count} selecionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% usado",
diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json
index 26407bec6c5..f7b9e8a7b55 100644
--- a/apps/files/l10n/pt_BR.json
+++ b/apps/files/l10n/pt_BR.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Os cabeçalhos de coluna com botões podem ser ordenados.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados à medida que você navegar pela lista.",
"File not found" : "Arquivo não encontrado",
- "{count} selected" : "{count} selecionados",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionados","{count} selecionados"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "{used} de {quota} usados",
"{relative}% used" : "{relative}% usado",
diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js
index f7ee81df2ff..a5832ddbc58 100644
--- a/apps/files/l10n/pt_PT.js
+++ b/apps/files/l10n/pt_PT.js
@@ -105,7 +105,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Os cabeçalhos das colunas com botões são ordenáveis",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Por motivos de desempenho, esta lista não é totalmente processada. Os ficheiros serão processados à medida que navega na lista.",
"File not found" : "Ficheiro não encontrado",
- "{count} selected" : "{count} selecionado ",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionado","{count} selecionado"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "utilizado {used} de {quota}",
"{relative}% used" : "{relative}% usado",
diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json
index 87045e72815..d65768f0290 100644
--- a/apps/files/l10n/pt_PT.json
+++ b/apps/files/l10n/pt_PT.json
@@ -103,7 +103,7 @@
"Column headers with buttons are sortable." : "Os cabeçalhos das colunas com botões são ordenáveis",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Por motivos de desempenho, esta lista não é totalmente processada. Os ficheiros serão processados à medida que navega na lista.",
"File not found" : "Ficheiro não encontrado",
- "{count} selected" : "{count} selecionado ",
+ "_{count} selected_::_{count} selected_" : ["{count} selecionado","{count} selecionado","{count} selecionado"],
"{usedQuotaByte} used" : "{usedQuotaByte} usado",
"{used} of {quota} used" : "utilizado {used} de {quota}",
"{relative}% used" : "{relative}% usado",
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 8ad80762a2b..bdfc25f6d8d 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -82,6 +82,7 @@ OC.L10N.register(
"List of files and folders." : "Listă fișiere și foldere",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați prin listă.",
"File not found" : "Fișierul nu a fost găsit",
+ "_{count} selected_::_{count} selected_" : ["{count}selectat","{count}selectate","{count}selectate"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilizați",
"{used} of {quota} used" : "{used} din {quota} folosiți",
"{relative}% used" : "{relative}% utilizat",
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index d9c1484484c..7b8d2223910 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -80,6 +80,7 @@
"List of files and folders." : "Listă fișiere și foldere",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați prin listă.",
"File not found" : "Fișierul nu a fost găsit",
+ "_{count} selected_::_{count} selected_" : ["{count}selectat","{count}selectate","{count}selectate"],
"{usedQuotaByte} used" : "{usedQuotaByte} utilizați",
"{used} of {quota} used" : "{used} din {quota} folosiți",
"{relative}% used" : "{relative}% utilizat",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 324ea82e228..6bcef9a52d3 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Заголовки столбцов с кнопками можно сортировать.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
"File not found" : "Файл не найден",
- "{count} selected" : "{count} выбрано",
"{usedQuotaByte} used" : "Использовано {usedQuotaByte}",
"{used} of {quota} used" : "использовано {used} из {quota}",
"{relative}% used" : "Использовано {relative}%",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index 73cb009e141..609359c71c4 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "Заголовки столбцов с кнопками можно сортировать.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
"File not found" : "Файл не найден",
- "{count} selected" : "{count} выбрано",
"{usedQuotaByte} used" : "Использовано {usedQuotaByte}",
"{used} of {quota} used" : "использовано {used} из {quota}",
"{relative}% used" : "Использовано {relative}%",
diff --git a/apps/files/l10n/sc.js b/apps/files/l10n/sc.js
index 90722be0e4c..d5d2d3bd1b0 100644
--- a/apps/files/l10n/sc.js
+++ b/apps/files/l10n/sc.js
@@ -76,7 +76,6 @@ OC.L10N.register(
"(selected)" : "(seletzionados)",
"List of files and folders." : "Lista de archìvios e cartellas.",
"File not found" : "Archìviu no agatadu",
- "{count} selected" : "seletzionados: {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} impreadu",
"{used} of {quota} used" : "{used} de {quota} impreadu",
"{relative}% used" : "{relative}% impreadu",
diff --git a/apps/files/l10n/sc.json b/apps/files/l10n/sc.json
index 0bdada5e8a7..d0213890843 100644
--- a/apps/files/l10n/sc.json
+++ b/apps/files/l10n/sc.json
@@ -74,7 +74,6 @@
"(selected)" : "(seletzionados)",
"List of files and folders." : "Lista de archìvios e cartellas.",
"File not found" : "Archìviu no agatadu",
- "{count} selected" : "seletzionados: {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} impreadu",
"{used} of {quota} used" : "{used} de {quota} impreadu",
"{relative}% used" : "{relative}% impreadu",
diff --git a/apps/files/l10n/sk.js b/apps/files/l10n/sk.js
index b4f176d76f9..cab8dc7bf62 100644
--- a/apps/files/l10n/sk.js
+++ b/apps/files/l10n/sk.js
@@ -116,7 +116,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Stĺpce hlavičiek s tlačidlami sú triediteľné.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzať zoznamom.",
"File not found" : "Súbor nenájdený",
- "{count} selected" : "{count} vybraných",
+ "_{count} selected_::_{count} selected_" : ["{count} vybraný","{count} vybrané","{count} vybraných","{count} vybraných"],
"{usedQuotaByte} used" : "{usedQuotaByte} použitých",
"{used} of {quota} used" : "použitých {used} z {quota}",
"{relative}% used" : "{relative}% použitých",
diff --git a/apps/files/l10n/sk.json b/apps/files/l10n/sk.json
index 00da3b734a4..f3f95fa723d 100644
--- a/apps/files/l10n/sk.json
+++ b/apps/files/l10n/sk.json
@@ -114,7 +114,7 @@
"Column headers with buttons are sortable." : "Stĺpce hlavičiek s tlačidlami sú triediteľné.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzať zoznamom.",
"File not found" : "Súbor nenájdený",
- "{count} selected" : "{count} vybraných",
+ "_{count} selected_::_{count} selected_" : ["{count} vybraný","{count} vybrané","{count} vybraných","{count} vybraných"],
"{usedQuotaByte} used" : "{usedQuotaByte} použitých",
"{used} of {quota} used" : "použitých {used} z {quota}",
"{relative}% used" : "{relative}% použitých",
diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js
index 19893245a4a..eaf19443be1 100644
--- a/apps/files/l10n/sl.js
+++ b/apps/files/l10n/sl.js
@@ -118,7 +118,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Naslove stolpcev z gumbi je mogoče sortirati.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali med brskanjem.",
"File not found" : "Datoteke ni mogoče najti",
- "{count} selected" : "{count} izbranih",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
"{used} of {quota} used" : "V uporabi je {used} od {quota}",
"{relative}% used" : "Zasedeno {relative} %",
diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json
index f738ccdfba6..7766e6a7014 100644
--- a/apps/files/l10n/sl.json
+++ b/apps/files/l10n/sl.json
@@ -116,7 +116,6 @@
"Column headers with buttons are sortable." : "Naslove stolpcev z gumbi je mogoče sortirati.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Seznam datotek ni v celoti izpisan zaradi zagotavljanja hitrosti in odzivnosti sistema. Predmeti se bodo dopolnjevali med brskanjem.",
"File not found" : "Datoteke ni mogoče najti",
- "{count} selected" : "{count} izbranih",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
"{used} of {quota} used" : "V uporabi je {used} od {quota}",
"{relative}% used" : "Zasedeno {relative} %",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 1462028efbd..d6db57e6761 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Заглавља колона са дугмићима могу да се соритрају.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
"File not found" : "Фајл није нађен",
- "{count} selected" : "{count} изабрано",
+ "_{count} selected_::_{count} selected_" : ["изабран је {count}","изабрана су {count}","изабрано је {count}"],
"{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
"{used} of {quota} used" : "{used} од {quota} искоришћено",
"{relative}% used" : "{relative}% искоришћено",
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index e4cfab160f8..234cec9924a 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Заглавља колона са дугмићима могу да се соритрају.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
"File not found" : "Фајл није нађен",
- "{count} selected" : "{count} изабрано",
+ "_{count} selected_::_{count} selected_" : ["изабран је {count}","изабрана су {count}","изабрано је {count}"],
"{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
"{used} of {quota} used" : "{used} од {quota} искоришћено",
"{relative}% used" : "{relative}% искоришћено",
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index bb758578e22..6553841455e 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Kolumnrubriker med knappar är sorterbara.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
"File not found" : "Filen kunde inte hittas",
- "{count} selected" : "{count} valda",
+ "_{count} selected_::_{count} selected_" : ["{count} vald","{count} valda"],
"{usedQuotaByte} used" : "{usedQuotaByte} använt",
"{used} of {quota} used" : "{used} av {quota} använt",
"{relative}% used" : "{relative}% använt",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index e0ac773057c..f412c03a05a 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "Kolumnrubriker med knappar är sorterbara.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
"File not found" : "Filen kunde inte hittas",
- "{count} selected" : "{count} valda",
+ "_{count} selected_::_{count} selected_" : ["{count} vald","{count} valda"],
"{usedQuotaByte} used" : "{usedQuotaByte} använt",
"{used} of {quota} used" : "{used} av {quota} använt",
"{relative}% used" : "{relative}% använt",
diff --git a/apps/files/l10n/sw.js b/apps/files/l10n/sw.js
index 028248f33c5..966124e25f0 100644
--- a/apps/files/l10n/sw.js
+++ b/apps/files/l10n/sw.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.\n ",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
"File not found" : "Faili halipatikani",
- "{count} selected" : "{count}imechaguliwa",
"{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
"{used} of {quota} used" : "{used} ya {quota}imetumika",
"{relative}% used" : "{relative}% imetumika",
@@ -186,6 +185,13 @@ OC.L10N.register(
"Open in files" : "Fungua ndani ya faili",
"File cannot be accessed" : "Faili haliwezi kufikika",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili haikupatikana au huna ruhusa ya kuitazama. Uliza mtumaji kuishirikisha.",
+ "Clipboard is not available" : "Ubao wa kunakili haupatikani",
+ "WebDAV URL copied to clipboard" : "WavutiDAV URL umenakiliwa kwenye ubao wa kunakili",
+ "Sort favorites first" : "Chagua za upendeleo kwanza",
+ "Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Show hidden files" : "Onesha mafaili yaliyofichwa",
+ "Show file type column" : "Onyesha safu wima ya aina ya faili\n ",
+ "Crop image previews" : "Punguza onyesho la kukagua picha",
"Enable the grid view" : "Wezesha mwonekano wa gridi",
"Enable folder tree" : "Wezesha faili la tatu",
"Additional settings" : "Mipangilio ya nyongeza",
@@ -195,7 +201,11 @@ OC.L10N.register(
"Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
"Warnings" : "Maonyo",
+ "Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.\n ",
+ "Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
"Keyboard shortcuts" : "Mikato ya keyboard",
+ "Speed up your Files experience with these quick shortcuts." : "Ongeza kasi ya utumiaji wa Faili zako kwa njia hizi za mkato za haraka.",
+ "Open the actions menu for a file" : "Fungua menyu ya vitendo kwa faili",
"Rename a file" : "Ita faili jina jipya",
"Delete a file" : "Futa faili",
"Favorite or remove a file from favorites" : "Pendwa au ondoa faili kutoka pendwa",
@@ -204,8 +214,20 @@ OC.L10N.register(
"Select all files" : "Chagua faili zote",
"Deselect all files" : "Usichague faili zote",
"Select or deselect a file" : "Chagua au usichague faili",
+ "Select a range of files" : "Chagua anuwai ya faili",
"Navigation" : "Uendeshaji",
+ "Navigate to the parent folder" : "Nenda kwenye kisanduku kikuu",
+ "Navigate to the file above" : "Sogea kwenye faili la juu",
+ "Navigate to the file below" : "Sogea kwenye faili la chini",
+ "Navigate to the file on the left (in grid mode)" : "Sogea kwenye faili la kushoto (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Sogea kwenye faili la kulia ( in grid mode)",
"View" : "Angalia",
+ "Toggle the grid view" : "Geuza mwonekano wa gridi\n ",
+ "Open the sidebar for a file" : "Fungua utepe kwa faili",
+ "Show those shortcuts" : "Onesha mikato hiyo",
+ "You" : "Wewe",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
"Owner" : "Mmiliki",
"Remove from favorites" : "Ondoa kutoka katika pendwa",
"Add to favorites" : "Ongeza kwenye pendwa",
diff --git a/apps/files/l10n/sw.json b/apps/files/l10n/sw.json
index 868a65e86f2..e6b7997e086 100644
--- a/apps/files/l10n/sw.json
+++ b/apps/files/l10n/sw.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "Vichwa vya safu wima vilivyo na vifungo vinaweza kupangwa.\n ",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Orodha hii haijatolewa kikamilifu kwa sababu za utendaji. Faili zitatolewa unapopitia orodha.",
"File not found" : "Faili halipatikani",
- "{count} selected" : "{count}imechaguliwa",
"{usedQuotaByte} used" : "{usedQuotaByte}imetumika",
"{used} of {quota} used" : "{used} ya {quota}imetumika",
"{relative}% used" : "{relative}% imetumika",
@@ -184,6 +183,13 @@
"Open in files" : "Fungua ndani ya faili",
"File cannot be accessed" : "Faili haliwezi kufikika",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Faili haikupatikana au huna ruhusa ya kuitazama. Uliza mtumaji kuishirikisha.",
+ "Clipboard is not available" : "Ubao wa kunakili haupatikani",
+ "WebDAV URL copied to clipboard" : "WavutiDAV URL umenakiliwa kwenye ubao wa kunakili",
+ "Sort favorites first" : "Chagua za upendeleo kwanza",
+ "Sort folders before files" : "Chagua vikasha kabla ya mafaili",
+ "Show hidden files" : "Onesha mafaili yaliyofichwa",
+ "Show file type column" : "Onyesha safu wima ya aina ya faili\n ",
+ "Crop image previews" : "Punguza onyesho la kukagua picha",
"Enable the grid view" : "Wezesha mwonekano wa gridi",
"Enable folder tree" : "Wezesha faili la tatu",
"Additional settings" : "Mipangilio ya nyongeza",
@@ -193,7 +199,11 @@
"Use this address to access your Files via WebDAV" : "Tumia anwani hii kufikia Faili zako kupitia WavutiDAV",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "Ikiwa umewasha 2FA, lazima uunde na utumie nenosiri jipya la programu kwa kubofya hapa",
"Warnings" : "Maonyo",
+ "Prevent warning dialogs from open or reenable them." : "Zuia mazungumzo ya onyo yasifunguliwe au uwashe upya.\n ",
+ "Show a warning dialog when changing a file extension." : "Onyesha mazungumzo ya onyo unapobadilisha kiendelezi cha faili.",
"Keyboard shortcuts" : "Mikato ya keyboard",
+ "Speed up your Files experience with these quick shortcuts." : "Ongeza kasi ya utumiaji wa Faili zako kwa njia hizi za mkato za haraka.",
+ "Open the actions menu for a file" : "Fungua menyu ya vitendo kwa faili",
"Rename a file" : "Ita faili jina jipya",
"Delete a file" : "Futa faili",
"Favorite or remove a file from favorites" : "Pendwa au ondoa faili kutoka pendwa",
@@ -202,8 +212,20 @@
"Select all files" : "Chagua faili zote",
"Deselect all files" : "Usichague faili zote",
"Select or deselect a file" : "Chagua au usichague faili",
+ "Select a range of files" : "Chagua anuwai ya faili",
"Navigation" : "Uendeshaji",
+ "Navigate to the parent folder" : "Nenda kwenye kisanduku kikuu",
+ "Navigate to the file above" : "Sogea kwenye faili la juu",
+ "Navigate to the file below" : "Sogea kwenye faili la chini",
+ "Navigate to the file on the left (in grid mode)" : "Sogea kwenye faili la kushoto (in grid mode)",
+ "Navigate to the file on the right (in grid mode)" : "Sogea kwenye faili la kulia ( in grid mode)",
"View" : "Angalia",
+ "Toggle the grid view" : "Geuza mwonekano wa gridi\n ",
+ "Open the sidebar for a file" : "Fungua utepe kwa faili",
+ "Show those shortcuts" : "Onesha mikato hiyo",
+ "You" : "Wewe",
+ "Shared multiple times with different people" : "Shared multiple times with different people",
+ "Error while loading the file data" : "Hitilafu wakati wa kupakia data za faili",
"Owner" : "Mmiliki",
"Remove from favorites" : "Ondoa kutoka katika pendwa",
"Add to favorites" : "Ongeza kwenye pendwa",
diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js
index 5b51231ceb2..2a340d22504 100644
--- a/apps/files/l10n/th.js
+++ b/apps/files/l10n/th.js
@@ -69,6 +69,7 @@ OC.L10N.register(
"Size" : "ขนาด",
"Actions" : "การกระทำ",
"File not found" : "ไม่พบไฟล์",
+ "_{count} selected_::_{count} selected_" : ["เลือก {count} รายการ"],
"{usedQuotaByte} used" : "ใช้ไป {usedQuotaByte}",
"{used} of {quota} used" : "ใช้ไป {used} จาก {quota}",
"{relative}% used" : "ใช้ไป {relative}%",
diff --git a/apps/files/l10n/th.json b/apps/files/l10n/th.json
index bdde1cf0d06..2d0a94b0afb 100644
--- a/apps/files/l10n/th.json
+++ b/apps/files/l10n/th.json
@@ -67,6 +67,7 @@
"Size" : "ขนาด",
"Actions" : "การกระทำ",
"File not found" : "ไม่พบไฟล์",
+ "_{count} selected_::_{count} selected_" : ["เลือก {count} รายการ"],
"{usedQuotaByte} used" : "ใช้ไป {usedQuotaByte}",
"{used} of {quota} used" : "ใช้ไป {used} จาก {quota}",
"{relative}% used" : "ใช้ไป {relative}%",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 129a6d4f178..f3643d4c5b0 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -116,7 +116,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Düğmeler olan sütunlar sıralanabilir.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"File not found" : "Dosya bulunamadı",
- "{count} selected" : "{count} seçilmiş",
+ "_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
"{used} of {quota} used" : "{used} / {quota} kullanılmış",
"{relative}% used" : "%{relative} kullanılmış",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index f20a43de5ba..65abc77e66d 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -114,7 +114,7 @@
"Column headers with buttons are sortable." : "Düğmeler olan sütunlar sıralanabilir.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"File not found" : "Dosya bulunamadı",
- "{count} selected" : "{count} seçilmiş",
+ "_{count} selected_::_{count} selected_" : ["{count} seçilmiş","{count} seçilmiş"],
"{usedQuotaByte} used" : "{usedQuotaByte} kullanılmış",
"{used} of {quota} used" : "{used} / {quota} kullanılmış",
"{relative}% used" : "%{relative} kullanılmış",
diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js
index b277568a525..b2dbc4b6b44 100644
--- a/apps/files/l10n/ug.js
+++ b/apps/files/l10n/ug.js
@@ -104,7 +104,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "كۇنۇپكىلار بار ئىستون ماۋزۇلىرى تەرتىپلىك.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "بۇ تىزىملىك ئىقتىدار سەۋەبىدىن تولۇق كۆرسىتىلمىگەن. ھۆججەتلەر تىزىملىكتىن ئۆتكەندە كۆرسىتىلىدۇ.",
"File not found" : "ھۆججەت تېپىلمىدى",
- "{count} selected" : "{count} تاللانغان",
"{usedQuotaByte} used" : "{usedQuotaByte} ئىشلىتىلگەن",
"{used} of {quota} used" : "{used} {quota} ئىشلىتىلگەن",
"{relative}% used" : "{relative}% ئىشلىتىلگەن",
diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json
index 518c039bbce..d51f6ab4258 100644
--- a/apps/files/l10n/ug.json
+++ b/apps/files/l10n/ug.json
@@ -102,7 +102,6 @@
"Column headers with buttons are sortable." : "كۇنۇپكىلار بار ئىستون ماۋزۇلىرى تەرتىپلىك.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "بۇ تىزىملىك ئىقتىدار سەۋەبىدىن تولۇق كۆرسىتىلمىگەن. ھۆججەتلەر تىزىملىكتىن ئۆتكەندە كۆرسىتىلىدۇ.",
"File not found" : "ھۆججەت تېپىلمىدى",
- "{count} selected" : "{count} تاللانغان",
"{usedQuotaByte} used" : "{usedQuotaByte} ئىشلىتىلگەن",
"{used} of {quota} used" : "{used} {quota} ئىشلىتىلگەن",
"{relative}% used" : "{relative}% ئىشلىتىلگەن",
diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js
index a800b46858d..8ad29f48c28 100644
--- a/apps/files/l10n/uk.js
+++ b/apps/files/l10n/uk.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
"File not found" : "Файл не знайдено",
- "{count} selected" : "{count} вибрано",
"{usedQuotaByte} used" : "{usedQuotaByte} використано",
"{used} of {quota} used" : "Використано {used} із {quota}",
"{relative}% used" : "{relative}% використано",
diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json
index 0e58cbd39aa..c124ca30b1b 100644
--- a/apps/files/l10n/uk.json
+++ b/apps/files/l10n/uk.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "Назви стовпців з кнопками можна впорядковувати",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Список не подається повністю з міркувань обчислювальних потужностей. Файли показуватимуться під час прокручування списку.",
"File not found" : "Файл не знайдено",
- "{count} selected" : "{count} вибрано",
"{usedQuotaByte} used" : "{usedQuotaByte} використано",
"{used} of {quota} used" : "Використано {used} із {quota}",
"{relative}% used" : "{relative}% використано",
diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js
index c7730a797e1..f2dcda9a650 100644
--- a/apps/files/l10n/vi.js
+++ b/apps/files/l10n/vi.js
@@ -105,7 +105,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "Tiêu đề cột có thể sắp xếp được.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Danh sách này không được hiển thị đầy đủ để tăng hiệu năng. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
"File not found" : "Không tìm thấy tập tin",
- "{count} selected" : "đã chọn {count} ",
"{usedQuotaByte} used" : "{usedQuotaByte} đã được sử dụng",
"{used} of {quota} used" : "{used} trong {quota} đã được sử dụng",
"{relative}% used" : "đã sử dụng {relative}%",
diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json
index ebb4a3ae9e1..4cabf258101 100644
--- a/apps/files/l10n/vi.json
+++ b/apps/files/l10n/vi.json
@@ -103,7 +103,6 @@
"Column headers with buttons are sortable." : "Tiêu đề cột có thể sắp xếp được.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Danh sách này không được hiển thị đầy đủ để tăng hiệu năng. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
"File not found" : "Không tìm thấy tập tin",
- "{count} selected" : "đã chọn {count} ",
"{usedQuotaByte} used" : "{usedQuotaByte} đã được sử dụng",
"{used} of {quota} used" : "{used} trong {quota} đã được sử dụng",
"{relative}% used" : "đã sử dụng {relative}%",
diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js
index 66cd6bc7bdd..a6e951b09d9 100644
--- a/apps/files/l10n/zh_CN.js
+++ b/apps/files/l10n/zh_CN.js
@@ -124,7 +124,6 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "带有按钮的列标题可进行排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出于性能考虑,此列表未完全呈现。文件将在您浏览列表时呈现。",
"File not found" : "文件未找到",
- "{count} selected" : "已选中 {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} 已使用",
"{used} of {quota} used" : "已使用 {used} / {quota}",
"{relative}% used" : "{relative}% 已使用",
diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json
index 7fa07ebcbcf..b19f085b8cf 100644
--- a/apps/files/l10n/zh_CN.json
+++ b/apps/files/l10n/zh_CN.json
@@ -122,7 +122,6 @@
"Column headers with buttons are sortable." : "带有按钮的列标题可进行排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出于性能考虑,此列表未完全呈现。文件将在您浏览列表时呈现。",
"File not found" : "文件未找到",
- "{count} selected" : "已选中 {count}",
"{usedQuotaByte} used" : "{usedQuotaByte} 已使用",
"{used} of {quota} used" : "已使用 {used} / {quota}",
"{relative}% used" : "{relative}% 已使用",
diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js
index 650ec7a5511..1ed2bb1cb4f 100644
--- a/apps/files/l10n/zh_HK.js
+++ b/apps/files/l10n/zh_HK.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "具有按鈕的縱列標題可排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"File not found" : "找不到檔案",
- "{count} selected" : "已選擇 {count} 項",
+ "_{count} selected_::_{count} selected_" : ["已選擇 {count} 項"],
"{usedQuotaByte} used" : "已使用 {usedQuotaByte} ",
"{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
"{relative}% used" : "已使用 {relative}%",
diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json
index 60bfa5bab26..b02c2d70d50 100644
--- a/apps/files/l10n/zh_HK.json
+++ b/apps/files/l10n/zh_HK.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "具有按鈕的縱列標題可排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"File not found" : "找不到檔案",
- "{count} selected" : "已選擇 {count} 項",
+ "_{count} selected_::_{count} selected_" : ["已選擇 {count} 項"],
"{usedQuotaByte} used" : "已使用 {usedQuotaByte} ",
"{used} of {quota} used" : "已使用 {quota} 當中的 {used}",
"{relative}% used" : "已使用 {relative}%",
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 960e6ec7a8c..9ada2759aa1 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -124,7 +124,7 @@ OC.L10N.register(
"Column headers with buttons are sortable." : "帶有按鈕的欄位標頭為可排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"File not found" : "找不到檔案",
- "{count} selected" : "已選取 {count} 個",
+ "_{count} selected_::_{count} selected_" : ["已選取 {count} 個"],
"{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
"{used} of {quota} used" : "已使用 {used},共 {quota}",
"{relative}% used" : "已使用 {relative}%",
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index a331632097a..4524c884385 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -122,7 +122,7 @@
"Column headers with buttons are sortable." : "帶有按鈕的欄位標頭為可排序。",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"File not found" : "找不到檔案",
- "{count} selected" : "已選取 {count} 個",
+ "_{count} selected_::_{count} selected_" : ["已選取 {count} 個"],
"{usedQuotaByte} used" : "已使用 {usedQuotaByte}",
"{used} of {quota} used" : "已使用 {used},共 {quota}",
"{relative}% used" : "已使用 {relative}%",
diff --git a/apps/files/src/components/FilesListVirtual.vue b/apps/files/src/components/FilesListVirtual.vue
index 8fdc87b154c..feb4b61c53e 100644
--- a/apps/files/src/components/FilesListVirtual.vue
+++ b/apps/files/src/components/FilesListVirtual.vue
@@ -21,7 +21,9 @@
</template>
<template v-if="!isNoneSelected" #header-overlay>
- <span class="files-list__selected">{{ t('files', '{count} selected', { count: selectedNodes.length }) }}</span>
+ <span class="files-list__selected">
+ {{ n('files', '{count} selected', '{count} selected', selectedNodes.length, { count: selectedNodes.length }) }}
+ </span>
<FilesListTableHeaderActions :current-view="currentView"
:selected-nodes="selectedNodes" />
</template>
@@ -68,7 +70,7 @@ import type { Location } from 'vue-router'
import { Folder, Permission, View, getFileActions, FileType } from '@nextcloud/files'
import { showError } from '@nextcloud/dialogs'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
-import { translate as t } from '@nextcloud/l10n'
+import { n, t } from '@nextcloud/l10n'
import { useHotKey } from '@nextcloud/vue/composables/useHotKey'
import { defineComponent } from 'vue'
@@ -140,6 +142,7 @@ export default defineComponent({
selectionStore,
userConfigStore,
+ n,
t,
}
},
diff --git a/apps/files/src/views/FilesList.vue b/apps/files/src/views/FilesList.vue
index b335737c4dd..60791a2b527 100644
--- a/apps/files/src/views/FilesList.vue
+++ b/apps/files/src/views/FilesList.vue
@@ -483,13 +483,6 @@ export default defineComponent({
watch: {
/**
- * Update the window title to match the page heading
- */
- pageHeading() {
- document.title = `${this.pageHeading} - ${getCapabilities().theming?.name ?? 'Nextcloud'}`
- },
-
- /**
* Handle rendering the custom empty view
* @param show The current state if the custom empty view should be rendered
*/
diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js
index 9ed6edf5359..0373e006838 100644
--- a/apps/files_sharing/l10n/de.js
+++ b/apps/files_sharing/l10n/de.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Standardordner für angenommene Freigaben",
"Reset" : "Zurücksetzen",
"Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen",
+ "Share expiration: {date}" : "Freigabe-Ablaufdatum: {date}",
"Share Expiration" : "Freigabe-Ablaufdatum",
"group" : "Gruppe",
"conversation" : "Unterhaltung",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Freigaben, die nicht zu internen oder externen Freigaben gehören. Dies können Freigaben von Apps oder anderen Quellen sein.",
"Share with accounts, teams, federated cloud IDs" : "Teilen mit Konten, Teams, Federated-Cloud-IDs",
"Share with accounts and teams" : "Teile mit Konten und Teams",
+ "Federated cloud ID" : "Federated-Cloud-ID",
"Email, federated cloud ID" : "Name, Federated-Cloud-ID",
"Unable to load the shares list" : "Liste der Freigaben konnte nicht geladen werden",
"Expires {relativetime}" : "Läuft {relativetime} ab",
diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json
index 4b64c5b2627..056ae0275de 100644
--- a/apps/files_sharing/l10n/de.json
+++ b/apps/files_sharing/l10n/de.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Standardordner für angenommene Freigaben",
"Reset" : "Zurücksetzen",
"Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen",
+ "Share expiration: {date}" : "Freigabe-Ablaufdatum: {date}",
"Share Expiration" : "Freigabe-Ablaufdatum",
"group" : "Gruppe",
"conversation" : "Unterhaltung",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Freigaben, die nicht zu internen oder externen Freigaben gehören. Dies können Freigaben von Apps oder anderen Quellen sein.",
"Share with accounts, teams, federated cloud IDs" : "Teilen mit Konten, Teams, Federated-Cloud-IDs",
"Share with accounts and teams" : "Teile mit Konten und Teams",
+ "Federated cloud ID" : "Federated-Cloud-ID",
"Email, federated cloud ID" : "Name, Federated-Cloud-ID",
"Unable to load the shares list" : "Liste der Freigaben konnte nicht geladen werden",
"Expires {relativetime}" : "Läuft {relativetime} ab",
diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js
index 5ac99f9f986..f20c9209224 100644
--- a/apps/files_sharing/l10n/de_DE.js
+++ b/apps/files_sharing/l10n/de_DE.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Standardordner für angenommene Freigaben",
"Reset" : "Zurücksetzen",
"Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen",
+ "Share expiration: {date}" : "Freigabe-Ablaufdatum: {date}",
"Share Expiration" : "Freigabe-Ablaufdatum",
"group" : "Gruppe",
"conversation" : "Unterhaltung",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Freigaben, die nicht zu internen oder externen Freigaben gehören. Dies können Freigaben von Apps oder anderen Quellen sein.",
"Share with accounts, teams, federated cloud IDs" : "Teilen mit Konten, Teams, Federated-Cloud-IDs",
"Share with accounts and teams" : "Teile mit Konten und Teams",
+ "Federated cloud ID" : "Federated-Cloud-ID",
"Email, federated cloud ID" : "Name, Federated-Cloud-ID",
"Unable to load the shares list" : "Liste der Freigaben kann nicht geladen werden",
"Expires {relativetime}" : "Läuft {relativetime} ab",
diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json
index ec845d1caf8..14112761270 100644
--- a/apps/files_sharing/l10n/de_DE.json
+++ b/apps/files_sharing/l10n/de_DE.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Standardordner für angenommene Freigaben",
"Reset" : "Zurücksetzen",
"Reset folder to system default" : "Ordner auf Systemstandard zurücksetzen",
+ "Share expiration: {date}" : "Freigabe-Ablaufdatum: {date}",
"Share Expiration" : "Freigabe-Ablaufdatum",
"group" : "Gruppe",
"conversation" : "Unterhaltung",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Freigaben, die nicht zu internen oder externen Freigaben gehören. Dies können Freigaben von Apps oder anderen Quellen sein.",
"Share with accounts, teams, federated cloud IDs" : "Teilen mit Konten, Teams, Federated-Cloud-IDs",
"Share with accounts and teams" : "Teile mit Konten und Teams",
+ "Federated cloud ID" : "Federated-Cloud-ID",
"Email, federated cloud ID" : "Name, Federated-Cloud-ID",
"Unable to load the shares list" : "Liste der Freigaben kann nicht geladen werden",
"Expires {relativetime}" : "Läuft {relativetime} ab",
diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js
index 78689676661..b2840f2179b 100644
--- a/apps/files_sharing/l10n/et_EE.js
+++ b/apps/files_sharing/l10n/et_EE.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Määra vastuvõetava jaosmeedia jaoks vaikimisi kaust",
"Reset" : "Lähtesta",
"Reset folder to system default" : "Kasuta süsteemi vaikimisi kausta",
+ "Share expiration: {date}" : "Jagamise aegumine: {date}",
"Share Expiration" : "Jagamise aegumine",
"group" : "grupp",
"conversation" : "vestlus",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Jaosmeedia, mis pole sisemise või välise jagamise osa. Näiteks jagamine rakendustest või muudest allikatest.",
"Share with accounts, teams, federated cloud IDs" : "Jaga kasutajatega, tiimidega ja liitpilves osalejatega",
"Share with accounts and teams" : "Jaga kasutajate ja tiimidega",
+ "Federated cloud ID" : "Liitpilve tunnus",
"Email, federated cloud ID" : "E-posti aadress, liitpilve kasutajatunnus",
"Unable to load the shares list" : "Jaosmeedia loendi laadimine ei õnnestu",
"Expires {relativetime}" : "Aegub {relativetime}",
diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json
index d1a83294120..a8ba5ef57bb 100644
--- a/apps/files_sharing/l10n/et_EE.json
+++ b/apps/files_sharing/l10n/et_EE.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Määra vastuvõetava jaosmeedia jaoks vaikimisi kaust",
"Reset" : "Lähtesta",
"Reset folder to system default" : "Kasuta süsteemi vaikimisi kausta",
+ "Share expiration: {date}" : "Jagamise aegumine: {date}",
"Share Expiration" : "Jagamise aegumine",
"group" : "grupp",
"conversation" : "vestlus",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Jaosmeedia, mis pole sisemise või välise jagamise osa. Näiteks jagamine rakendustest või muudest allikatest.",
"Share with accounts, teams, federated cloud IDs" : "Jaga kasutajatega, tiimidega ja liitpilves osalejatega",
"Share with accounts and teams" : "Jaga kasutajate ja tiimidega",
+ "Federated cloud ID" : "Liitpilve tunnus",
"Email, federated cloud ID" : "E-posti aadress, liitpilve kasutajatunnus",
"Unable to load the shares list" : "Jaosmeedia loendi laadimine ei õnnestu",
"Expires {relativetime}" : "Aegub {relativetime}",
diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js
index 2da7d326673..7567511b268 100644
--- a/apps/files_sharing/l10n/ru.js
+++ b/apps/files_sharing/l10n/ru.js
@@ -137,7 +137,9 @@ OC.L10N.register(
"Link copied to clipboard" : "Ссылка скопирована в буфер обмена",
"Email already added" : "Адрес электронной почты уже добавлен",
"Invalid email address" : "Неверный адрес электронной почты",
+ "_The following email address is not valid: {emails}_::_The following email addresses are not valid: {emails}_" : ["Следующий адрес электронной почты недействителен: {emails}","Следующие адреса электронной почты недействительны: {emails}","Следующие адреса электронной почты недействительны: {emails}","Следующие адреса электронной почты недействительны: {emails}"],
"_{count} email address already added_::_{count} email addresses already added_" : [" {count} e-mail адрес уже добавлен"," {count} e-mail адреса уже добавлено"," {count} e-mail адресов уже добавлены","{count} e-mail адресов уже добавлены"],
+ "_{count} email address added_::_{count} email addresses added_" : ["Добавлен {count} адрес электронной почты","Добавлено {count} адреса электронной почты","Добавлено {count} адресов электронной почты","Добавлено {count} адресов электронной почты"],
"You can now share the link below to allow people to upload files to your directory." : "Теперь вы можете поделиться приведенной ниже ссылкой, чтобы люди могли загружать файлы в ваш каталог.",
"Share link" : "Общий доступ по ссылке",
"Copy to clipboard" : "Копировать в буфер обмена",
@@ -158,8 +160,10 @@ OC.L10N.register(
"Add a note to help people understand what you are requesting." : "Добавьте примечание, чтобы помочь людям понять, о чем вы просите.",
"You can add links, date or any other information that will help the recipient understand what you are requesting." : "Вы можете добавить ссылки, дату или любую другую информацию, которая поможет получателю понять, что вы запрашиваете.",
"Close" : "Закрыть",
+ "_Send email and close_::_Send {count} emails and close_" : ["Отправить письмо и закрыть","Отправить {count} письма и закрыть","Отправить {count} писем и закрыть","Отправить {count} писем и закрыть"],
"Please select a folder, you cannot share the root directory." : "Пожалуйста, выберите папку, вы не можете предоставить общий доступ к корневому каталогу.",
"File request created" : "Создан запрос на файл",
+ "_File request created and email sent_::_File request created and {count} emails sent_" : ["Создан запрос файла и отправлено письмо","Создан запрос файла и отправлено {count} письма","Создан запрос файла и отправлено {count} писем","Создан запрос файла и отправлено {count} писем"],
"Error creating the share: {errorMessage}" : "Не удалось создать общий ресурс: {errorMessage}",
"Error creating the share" : "Ошибка создания общего доступа",
"Error sending emails: {errorMessage}" : "Ошибка при отправке электронных писем: {errorMessage}",
@@ -181,6 +185,8 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Задать папку для принятых опубликованных ресурсов",
"Reset" : "Сброс",
"Reset folder to system default" : "Сбросить папку к значениям по умолчанию",
+ "Share expiration: {date}" : "Срок действия общего ресурса: {date}",
+ "Share Expiration" : "Срок действия общего ресурса",
"group" : "группа",
"conversation" : "беседа",
"remote" : "на другом сервере",
@@ -244,11 +250,14 @@ OC.L10N.register(
"Deck board" : "Доска",
"ScienceMesh" : "ScienceMesh",
"on {server}" : "на {server}",
+ "Enter external recipients" : "Введите внешних получателей",
+ "Search for internal recipients" : "Поиск внутренних получателей",
"Note from" : "Примечание от",
"Note:" : "Примечание:",
"File drop" : "Приём файлов",
"Upload files to {foldername}." : "Загрузка файлов в {foldername}.",
"By uploading files, you agree to the terms of service." : "Загружая файлы, вы соглашаетесь с условиями обслуживания.",
+ "Successfully uploaded files" : "Файлы успешно загружены",
"View terms of service" : "Ознакомиться с условиями предоставления услуг",
"Terms of service" : "Условия использования",
"Share with {userName}" : "Поделиться с {userName}",
@@ -265,6 +274,7 @@ OC.L10N.register(
"Edit" : "Редактировать",
"Share" : "Поделиться",
"Delete" : "Удалить",
+ "Password field cannot be empty" : "Поле пароля не может быть пустым",
"Replace current password" : "Заменить текущий пароль",
"Failed to generate a new token" : "Не удалось сгенерировать новый токен",
"Allow upload and editing" : "Разрешить приём и редактирование",
@@ -272,6 +282,10 @@ OC.L10N.register(
"Upload only" : "Только загружать",
"Advanced settings" : "Расширенные параметры",
"Share label" : "Метка общего доступа",
+ "Share link token" : "Токен ссылки на общий ресурс",
+ "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Установите простой для запоминания токен ссылки на общий ресурс или сгенерируйте новый. Не рекомендуется использовать легко угадываемые токены для общих ресурсов с конфиденциальной информацией.",
+ "Generating…" : "Создание…",
+ "Generate new token" : "Создать новый токен",
"Set password" : "Задать пароль",
"Password expires {passwordExpirationTime}" : "Срок действия пароля истекает {passwordExpirationTime}",
"Password expired" : "Срок действия пароля истёк",
@@ -282,6 +296,7 @@ OC.L10N.register(
"Allow download and sync" : "Разрешить загрузку и синхронизацию",
"Note to recipient" : "Примечание для получателя",
"Enter a note for the share recipient" : "Введите примечание для получателя",
+ "Show files in grid view" : "Показать файлы в виде сетки",
"Delete share" : "Удалить общий ресурс",
"Others with access" : "Другие пользователи, имеющие доступ",
"No other accounts with access found" : "Других учетных записей с доступом не найдено",
@@ -295,13 +310,18 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Ссылки, которые не являются частью внутренних или внешних ссылок. Это могут быть ссылки из приложений или других источников.",
"Share with accounts, teams, federated cloud IDs" : "Поделиться с учетными записями, командами, идентификаторами федеративного облака",
"Share with accounts and teams" : "Поделиться с аккаунтами и командами",
+ "Federated cloud ID" : "Федеративный облачный ID",
+ "Email, federated cloud ID" : "Электронная почта, федеративный облачный ID",
"Unable to load the shares list" : "Невозможно загрузить список общих ресурсов",
"Expires {relativetime}" : "Истекает {relativetime}",
"this share just expired." : "срок действия этого общего ресурса только что истёк.",
"Shared with you by {owner}" : "{owner} предоставил(а) Вам доступ",
"Internal shares" : "Внутренние ссылки",
+ "Internal shares explanation" : "Пояснение к внутренним общим ресурсам",
"External shares" : "Внешние ссылки",
+ "External shares explanation" : "Пояснение к внешним общим ресурсам",
"Additional shares" : "Дополнительные ссылки",
+ "Additional shares explanation" : "Пояснение к дополнительным общим ресурсам",
"Link to a file" : "Ссылка на файл",
"_Accept share_::_Accept shares_" : ["Принять общий ресурс","Принять общие ресурсы","Принять общие ресурсы","Принять общие ресурсы"],
"Open in Files" : "Открыть в Файлах",
@@ -357,10 +377,20 @@ OC.L10N.register(
"Share expiry date saved" : "Дата истечения срока общего доступа сохранена",
"Share hide-download state saved" : "Скрытая загрузка ссылки общего доступа сохранено",
"Share label saved" : "Метка общего доступа сохранена",
+ "Share note for recipient saved" : "Примечание к общему ресурсу для получателя сохранено",
"Share password saved" : "Пароль общего доступа сохранен",
"Share permissions saved" : "Разрешения общего доступа сохранены",
+ "To upload files to {folder}, you need to provide your name first." : "Чтобы загрузить файлы в {folder}, сначала укажите своё имя.",
"Upload files to {folder}" : "Загрузка файлов в {folder}",
+ "Please confirm your name to upload files to {folder}" : "Пожалуйста, подтвердите своё имя для загрузки файлов в {folder}",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} поделился с вами папкой.",
+ "Names must not be empty." : "Имя не может быть пустым.",
+ "Names must not start with a dot." : "Имя не должно начинаться с точки.",
+ "\"{char}\" is not allowed inside a name." : "Символ «{char}» не допускается в имени.",
+ "\"{segment}\" is a reserved name and not allowed." : "«{segment}» — зарезервированное имя и не может быть использовано.",
+ "\"{extension}\" is not an allowed name." : "«{extension}» — недопустимое имя.",
+ "Names must not end with \"{extension}\"." : "Имя не должно оканчиваться на «{extension}».",
+ "Invalid name." : "Недопустимое имя.",
"Shared by" : "Поделился",
"Shared with" : "Общий доступ",
"Password created successfully" : "Пароль создан",
@@ -393,6 +423,8 @@ OC.L10N.register(
"Failed to add the public link to your Nextcloud" : "Не удалось создать общедоступную ссылку",
"You are not allowed to edit link shares that you don't own" : "Вам не разрешается редактировать ссылки, которыми вы не владеете",
"Download all files" : "Скачать все файлы",
+ "_1 email address already added_::_{count} email addresses already added_" : ["Уже добавлен 1 адрес электронной почты","Уже добавлено {count} адреса электронной почты","Уже добавлено {count} адресов электронной почты","Уже добавлено {count} адресов электронной почты"],
+ "_1 email address added_::_{count} email addresses added_" : ["Добавлен 1 адрес электронной почты","Добавлено {count} адреса электронной почты","Добавлено {count} адресов электронной почты","Добавлено {count} адресов электронной почты"],
"Search for share recipients" : "Найти больше получателей общего ресурса",
"No recommendations. Start typing." : "Рекомендации отсутствуют, начните вводить символы",
"To upload files, you need to provide your name first." : "Чтобы загрузить файлы, вам необходимо сначала указать свое имя.",
diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json
index 2179703dd71..a84dbdd18ab 100644
--- a/apps/files_sharing/l10n/ru.json
+++ b/apps/files_sharing/l10n/ru.json
@@ -135,7 +135,9 @@
"Link copied to clipboard" : "Ссылка скопирована в буфер обмена",
"Email already added" : "Адрес электронной почты уже добавлен",
"Invalid email address" : "Неверный адрес электронной почты",
+ "_The following email address is not valid: {emails}_::_The following email addresses are not valid: {emails}_" : ["Следующий адрес электронной почты недействителен: {emails}","Следующие адреса электронной почты недействительны: {emails}","Следующие адреса электронной почты недействительны: {emails}","Следующие адреса электронной почты недействительны: {emails}"],
"_{count} email address already added_::_{count} email addresses already added_" : [" {count} e-mail адрес уже добавлен"," {count} e-mail адреса уже добавлено"," {count} e-mail адресов уже добавлены","{count} e-mail адресов уже добавлены"],
+ "_{count} email address added_::_{count} email addresses added_" : ["Добавлен {count} адрес электронной почты","Добавлено {count} адреса электронной почты","Добавлено {count} адресов электронной почты","Добавлено {count} адресов электронной почты"],
"You can now share the link below to allow people to upload files to your directory." : "Теперь вы можете поделиться приведенной ниже ссылкой, чтобы люди могли загружать файлы в ваш каталог.",
"Share link" : "Общий доступ по ссылке",
"Copy to clipboard" : "Копировать в буфер обмена",
@@ -156,8 +158,10 @@
"Add a note to help people understand what you are requesting." : "Добавьте примечание, чтобы помочь людям понять, о чем вы просите.",
"You can add links, date or any other information that will help the recipient understand what you are requesting." : "Вы можете добавить ссылки, дату или любую другую информацию, которая поможет получателю понять, что вы запрашиваете.",
"Close" : "Закрыть",
+ "_Send email and close_::_Send {count} emails and close_" : ["Отправить письмо и закрыть","Отправить {count} письма и закрыть","Отправить {count} писем и закрыть","Отправить {count} писем и закрыть"],
"Please select a folder, you cannot share the root directory." : "Пожалуйста, выберите папку, вы не можете предоставить общий доступ к корневому каталогу.",
"File request created" : "Создан запрос на файл",
+ "_File request created and email sent_::_File request created and {count} emails sent_" : ["Создан запрос файла и отправлено письмо","Создан запрос файла и отправлено {count} письма","Создан запрос файла и отправлено {count} писем","Создан запрос файла и отправлено {count} писем"],
"Error creating the share: {errorMessage}" : "Не удалось создать общий ресурс: {errorMessage}",
"Error creating the share" : "Ошибка создания общего доступа",
"Error sending emails: {errorMessage}" : "Ошибка при отправке электронных писем: {errorMessage}",
@@ -179,6 +183,8 @@
"Set default folder for accepted shares" : "Задать папку для принятых опубликованных ресурсов",
"Reset" : "Сброс",
"Reset folder to system default" : "Сбросить папку к значениям по умолчанию",
+ "Share expiration: {date}" : "Срок действия общего ресурса: {date}",
+ "Share Expiration" : "Срок действия общего ресурса",
"group" : "группа",
"conversation" : "беседа",
"remote" : "на другом сервере",
@@ -242,11 +248,14 @@
"Deck board" : "Доска",
"ScienceMesh" : "ScienceMesh",
"on {server}" : "на {server}",
+ "Enter external recipients" : "Введите внешних получателей",
+ "Search for internal recipients" : "Поиск внутренних получателей",
"Note from" : "Примечание от",
"Note:" : "Примечание:",
"File drop" : "Приём файлов",
"Upload files to {foldername}." : "Загрузка файлов в {foldername}.",
"By uploading files, you agree to the terms of service." : "Загружая файлы, вы соглашаетесь с условиями обслуживания.",
+ "Successfully uploaded files" : "Файлы успешно загружены",
"View terms of service" : "Ознакомиться с условиями предоставления услуг",
"Terms of service" : "Условия использования",
"Share with {userName}" : "Поделиться с {userName}",
@@ -263,6 +272,7 @@
"Edit" : "Редактировать",
"Share" : "Поделиться",
"Delete" : "Удалить",
+ "Password field cannot be empty" : "Поле пароля не может быть пустым",
"Replace current password" : "Заменить текущий пароль",
"Failed to generate a new token" : "Не удалось сгенерировать новый токен",
"Allow upload and editing" : "Разрешить приём и редактирование",
@@ -270,6 +280,10 @@
"Upload only" : "Только загружать",
"Advanced settings" : "Расширенные параметры",
"Share label" : "Метка общего доступа",
+ "Share link token" : "Токен ссылки на общий ресурс",
+ "Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Установите простой для запоминания токен ссылки на общий ресурс или сгенерируйте новый. Не рекомендуется использовать легко угадываемые токены для общих ресурсов с конфиденциальной информацией.",
+ "Generating…" : "Создание…",
+ "Generate new token" : "Создать новый токен",
"Set password" : "Задать пароль",
"Password expires {passwordExpirationTime}" : "Срок действия пароля истекает {passwordExpirationTime}",
"Password expired" : "Срок действия пароля истёк",
@@ -280,6 +294,7 @@
"Allow download and sync" : "Разрешить загрузку и синхронизацию",
"Note to recipient" : "Примечание для получателя",
"Enter a note for the share recipient" : "Введите примечание для получателя",
+ "Show files in grid view" : "Показать файлы в виде сетки",
"Delete share" : "Удалить общий ресурс",
"Others with access" : "Другие пользователи, имеющие доступ",
"No other accounts with access found" : "Других учетных записей с доступом не найдено",
@@ -293,13 +308,18 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Ссылки, которые не являются частью внутренних или внешних ссылок. Это могут быть ссылки из приложений или других источников.",
"Share with accounts, teams, federated cloud IDs" : "Поделиться с учетными записями, командами, идентификаторами федеративного облака",
"Share with accounts and teams" : "Поделиться с аккаунтами и командами",
+ "Federated cloud ID" : "Федеративный облачный ID",
+ "Email, federated cloud ID" : "Электронная почта, федеративный облачный ID",
"Unable to load the shares list" : "Невозможно загрузить список общих ресурсов",
"Expires {relativetime}" : "Истекает {relativetime}",
"this share just expired." : "срок действия этого общего ресурса только что истёк.",
"Shared with you by {owner}" : "{owner} предоставил(а) Вам доступ",
"Internal shares" : "Внутренние ссылки",
+ "Internal shares explanation" : "Пояснение к внутренним общим ресурсам",
"External shares" : "Внешние ссылки",
+ "External shares explanation" : "Пояснение к внешним общим ресурсам",
"Additional shares" : "Дополнительные ссылки",
+ "Additional shares explanation" : "Пояснение к дополнительным общим ресурсам",
"Link to a file" : "Ссылка на файл",
"_Accept share_::_Accept shares_" : ["Принять общий ресурс","Принять общие ресурсы","Принять общие ресурсы","Принять общие ресурсы"],
"Open in Files" : "Открыть в Файлах",
@@ -355,10 +375,20 @@
"Share expiry date saved" : "Дата истечения срока общего доступа сохранена",
"Share hide-download state saved" : "Скрытая загрузка ссылки общего доступа сохранено",
"Share label saved" : "Метка общего доступа сохранена",
+ "Share note for recipient saved" : "Примечание к общему ресурсу для получателя сохранено",
"Share password saved" : "Пароль общего доступа сохранен",
"Share permissions saved" : "Разрешения общего доступа сохранены",
+ "To upload files to {folder}, you need to provide your name first." : "Чтобы загрузить файлы в {folder}, сначала укажите своё имя.",
"Upload files to {folder}" : "Загрузка файлов в {folder}",
+ "Please confirm your name to upload files to {folder}" : "Пожалуйста, подтвердите своё имя для загрузки файлов в {folder}",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} поделился с вами папкой.",
+ "Names must not be empty." : "Имя не может быть пустым.",
+ "Names must not start with a dot." : "Имя не должно начинаться с точки.",
+ "\"{char}\" is not allowed inside a name." : "Символ «{char}» не допускается в имени.",
+ "\"{segment}\" is a reserved name and not allowed." : "«{segment}» — зарезервированное имя и не может быть использовано.",
+ "\"{extension}\" is not an allowed name." : "«{extension}» — недопустимое имя.",
+ "Names must not end with \"{extension}\"." : "Имя не должно оканчиваться на «{extension}».",
+ "Invalid name." : "Недопустимое имя.",
"Shared by" : "Поделился",
"Shared with" : "Общий доступ",
"Password created successfully" : "Пароль создан",
@@ -391,6 +421,8 @@
"Failed to add the public link to your Nextcloud" : "Не удалось создать общедоступную ссылку",
"You are not allowed to edit link shares that you don't own" : "Вам не разрешается редактировать ссылки, которыми вы не владеете",
"Download all files" : "Скачать все файлы",
+ "_1 email address already added_::_{count} email addresses already added_" : ["Уже добавлен 1 адрес электронной почты","Уже добавлено {count} адреса электронной почты","Уже добавлено {count} адресов электронной почты","Уже добавлено {count} адресов электронной почты"],
+ "_1 email address added_::_{count} email addresses added_" : ["Добавлен 1 адрес электронной почты","Добавлено {count} адреса электронной почты","Добавлено {count} адресов электронной почты","Добавлено {count} адресов электронной почты"],
"Search for share recipients" : "Найти больше получателей общего ресурса",
"No recommendations. Start typing." : "Рекомендации отсутствуют, начните вводить символы",
"To upload files, you need to provide your name first." : "Чтобы загрузить файлы, вам необходимо сначала указать свое имя.",
diff --git a/apps/files_sharing/l10n/sv.js b/apps/files_sharing/l10n/sv.js
index 6c3a5828007..05be7bc3722 100644
--- a/apps/files_sharing/l10n/sv.js
+++ b/apps/files_sharing/l10n/sv.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "Sätt standardmapp för accepterade delningar",
"Reset" : "Återställ",
"Reset folder to system default" : "Återställ mapp till system-standard",
+ "Share expiration: {date}" : "Delningens utgång: {date}",
"Share Expiration" : "Delningens utgång",
"group" : "grupp",
"conversation" : "konversation",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Delningar som inte ingår i de interna eller externa delningarna. Detta kan vara delningar från appar eller andra källor.",
"Share with accounts, teams, federated cloud IDs" : "Dela med konton, team, federerade moln-ID:n",
"Share with accounts and teams" : "Dela med konton och team",
+ "Federated cloud ID" : "Federerat moln-ID",
"Email, federated cloud ID" : "E-post, federerat moln-ID",
"Unable to load the shares list" : "Kunde inte läsa in delningslistan",
"Expires {relativetime}" : "Upphör {relativetime}",
@@ -378,8 +380,11 @@ OC.L10N.register(
"Share note for recipient saved" : "Delningens notering för mottagare sparad",
"Share password saved" : "Lösenord för delning sparad",
"Share permissions saved" : "Delningsbehörighet sparad",
+ "To upload files to {folder}, you need to provide your name first." : "För att ladda upp filer till {folder}, måste du först ange ditt namn.",
"Upload files to {folder}" : "Ladda upp filer till {folder}",
+ "Please confirm your name to upload files to {folder}" : "Bekräfta ditt namn för att ladda upp filer till {folder}",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} delade en mapp med dig.",
+ "Names must not be empty." : "Namn får inte vara tomt.",
"Names must not start with a dot." : "Namn får inte börja med en punkt.",
"\"{char}\" is not allowed inside a name." : "\"{char}\" är inte tillåtet i ett namn.",
"\"{segment}\" is a reserved name and not allowed." : "\"{segment}\" är ett reserverat namn och inte tillåtet.",
diff --git a/apps/files_sharing/l10n/sv.json b/apps/files_sharing/l10n/sv.json
index 58d5256c760..b675aecf7d0 100644
--- a/apps/files_sharing/l10n/sv.json
+++ b/apps/files_sharing/l10n/sv.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "Sätt standardmapp för accepterade delningar",
"Reset" : "Återställ",
"Reset folder to system default" : "Återställ mapp till system-standard",
+ "Share expiration: {date}" : "Delningens utgång: {date}",
"Share Expiration" : "Delningens utgång",
"group" : "grupp",
"conversation" : "konversation",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Delningar som inte ingår i de interna eller externa delningarna. Detta kan vara delningar från appar eller andra källor.",
"Share with accounts, teams, federated cloud IDs" : "Dela med konton, team, federerade moln-ID:n",
"Share with accounts and teams" : "Dela med konton och team",
+ "Federated cloud ID" : "Federerat moln-ID",
"Email, federated cloud ID" : "E-post, federerat moln-ID",
"Unable to load the shares list" : "Kunde inte läsa in delningslistan",
"Expires {relativetime}" : "Upphör {relativetime}",
@@ -376,8 +378,11 @@
"Share note for recipient saved" : "Delningens notering för mottagare sparad",
"Share password saved" : "Lösenord för delning sparad",
"Share permissions saved" : "Delningsbehörighet sparad",
+ "To upload files to {folder}, you need to provide your name first." : "För att ladda upp filer till {folder}, måste du först ange ditt namn.",
"Upload files to {folder}" : "Ladda upp filer till {folder}",
+ "Please confirm your name to upload files to {folder}" : "Bekräfta ditt namn för att ladda upp filer till {folder}",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} delade en mapp med dig.",
+ "Names must not be empty." : "Namn får inte vara tomt.",
"Names must not start with a dot." : "Namn får inte börja med en punkt.",
"\"{char}\" is not allowed inside a name." : "\"{char}\" är inte tillåtet i ett namn.",
"\"{segment}\" is a reserved name and not allowed." : "\"{segment}\" är ett reserverat namn och inte tillåtet.",
diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js
index a3406810090..764bd713123 100644
--- a/apps/files_sharing/l10n/zh_TW.js
+++ b/apps/files_sharing/l10n/zh_TW.js
@@ -185,6 +185,7 @@ OC.L10N.register(
"Set default folder for accepted shares" : "為接受的分享設定預設資料夾",
"Reset" : "重設",
"Reset folder to system default" : "將資料夾重設回系統預設",
+ "Share expiration: {date}" : "分享到期日:{date}",
"Share Expiration" : "分享過期",
"group" : "群組",
"conversation" : "對話",
@@ -309,6 +310,7 @@ OC.L10N.register(
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "不屬於內部或外部分享的分享。這可能是來自應用程式或其他來源的分享。",
"Share with accounts, teams, federated cloud IDs" : "與帳號、團隊、聯邦雲端 ID 分享",
"Share with accounts and teams" : "與帳號及團隊分享",
+ "Federated cloud ID" : "聯邦雲端 ID",
"Email, federated cloud ID" : "電子郵件、聯邦雲端 ID",
"Unable to load the shares list" : "無法載入分享列表",
"Expires {relativetime}" : "過期於 {relativetime}",
diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json
index b2c14b0776f..580be7e28e2 100644
--- a/apps/files_sharing/l10n/zh_TW.json
+++ b/apps/files_sharing/l10n/zh_TW.json
@@ -183,6 +183,7 @@
"Set default folder for accepted shares" : "為接受的分享設定預設資料夾",
"Reset" : "重設",
"Reset folder to system default" : "將資料夾重設回系統預設",
+ "Share expiration: {date}" : "分享到期日:{date}",
"Share Expiration" : "分享過期",
"group" : "群組",
"conversation" : "對話",
@@ -307,6 +308,7 @@
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "不屬於內部或外部分享的分享。這可能是來自應用程式或其他來源的分享。",
"Share with accounts, teams, federated cloud IDs" : "與帳號、團隊、聯邦雲端 ID 分享",
"Share with accounts and teams" : "與帳號及團隊分享",
+ "Federated cloud ID" : "聯邦雲端 ID",
"Email, federated cloud ID" : "電子郵件、聯邦雲端 ID",
"Unable to load the shares list" : "無法載入分享列表",
"Expires {relativetime}" : "過期於 {relativetime}",
diff --git a/apps/files_sharing/src/components/SharingEntryLink.vue b/apps/files_sharing/src/components/SharingEntryLink.vue
index 781626a1ec9..702b876306f 100644
--- a/apps/files_sharing/src/components/SharingEntryLink.vue
+++ b/apps/files_sharing/src/components/SharingEntryLink.vue
@@ -223,13 +223,14 @@
</template>
<script>
+import { showError, showSuccess } from '@nextcloud/dialogs'
import { emit } from '@nextcloud/event-bus'
+import { t } from '@nextcloud/l10n'
+import moment from '@nextcloud/moment'
import { generateUrl, getBaseUrl } from '@nextcloud/router'
-import { showError, showSuccess } from '@nextcloud/dialogs'
import { ShareType } from '@nextcloud/sharing'
-import VueQrcode from '@chenfengyuan/vue-qrcode'
-import moment from '@nextcloud/moment'
+import VueQrcode from '@chenfengyuan/vue-qrcode'
import NcActionButton from '@nextcloud/vue/components/NcActionButton'
import NcActionCheckbox from '@nextcloud/vue/components/NcActionCheckbox'
import NcActionInput from '@nextcloud/vue/components/NcActionInput'
@@ -258,7 +259,7 @@ import GeneratePassword from '../utils/GeneratePassword.ts'
import Share from '../models/Share.ts'
import SharesMixin from '../mixins/SharesMixin.js'
import ShareDetails from '../mixins/ShareDetails.js'
-import { getLoggerBuilder } from '@nextcloud/logger'
+import logger from '../services/logger.ts'
export default {
name: 'SharingEntryLink',
@@ -313,10 +314,6 @@ export default {
ExternalLegacyLinkActions: OCA.Sharing.ExternalLinkActions.state,
ExternalShareActions: OCA.Sharing.ExternalShareActions.state,
- logger: getLoggerBuilder()
- .setApp('files_sharing')
- .detectUser()
- .build(),
// tracks whether modal should be opened or not
showQRCode: false,
@@ -330,6 +327,8 @@ export default {
* @return {string}
*/
title() {
+ const l10nOptions = { escape: false /* no escape as this string is already escaped by Vue */ }
+
// if we have a valid existing share (not pending)
if (this.share && this.share.id) {
if (!this.isShareOwner && this.share.ownerDisplayName) {
@@ -337,26 +336,26 @@ export default {
return t('files_sharing', '{shareWith} by {initiator}', {
shareWith: this.share.shareWith,
initiator: this.share.ownerDisplayName,
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Shared via link by {initiator}', {
initiator: this.share.ownerDisplayName,
- })
+ }, l10nOptions)
}
if (this.share.label && this.share.label.trim() !== '') {
if (this.isEmailShareType) {
if (this.isFileRequest) {
return t('files_sharing', 'File request ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Mail share ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
return t('files_sharing', 'Share link ({label})', {
label: this.share.label.trim(),
- })
+ }, l10nOptions)
}
if (this.isEmailShareType) {
if (!this.share.shareWith || this.share.shareWith.trim() === '') {
@@ -391,6 +390,7 @@ export default {
}
return null
},
+
passwordExpirationTime() {
if (this.share.passwordExpirationTime === null) {
return null
@@ -613,7 +613,7 @@ export default {
* @param {boolean} shareReviewComplete if the share was reviewed
*/
async onNewLinkShare(shareReviewComplete = false) {
- this.logger.debug('onNewLinkShare called (with this.share)', this.share)
+ logger.debug('onNewLinkShare called (with this.share)', this.share)
// do not run again if already loading
if (this.loading) {
return
@@ -628,7 +628,7 @@ export default {
shareDefaults.expiration = this.formatDateToString(this.config.defaultExpirationDate)
}
- this.logger.debug('Missing required properties?', this.enforcedPropertiesMissing)
+ logger.debug('Missing required properties?', this.enforcedPropertiesMissing)
// Do not push yet if we need a password or an expiration date: show pending menu
// A share would require a review for example is default expiration date is set but not enforced, this allows
// the user to review the share and remove the expiration date if they don't want it
@@ -636,7 +636,7 @@ export default {
this.pending = true
this.shareCreationComplete = false
- this.logger.info('Share policy requires a review or has mandated properties (password, expirationDate)...')
+ logger.info('Share policy requires a review or has mandated properties (password, expirationDate)...')
// ELSE, show the pending popovermenu
// if password default or enforced, pre-fill with random one
@@ -664,13 +664,13 @@ export default {
// if the share is valid, create it on the server
if (this.checkShare(this.share)) {
try {
- this.logger.info('Sending existing share to server', this.share)
+ logger.info('Sending existing share to server', this.share)
await this.pushNewLinkShare(this.share, true)
this.shareCreationComplete = true
- this.logger.info('Share created on server', this.share)
+ logger.info('Share created on server', this.share)
} catch (e) {
this.pending = false
- this.logger.error('Error creating share', e)
+ logger.error('Error creating share', e)
return false
}
return true
diff --git a/apps/files_sharing/tests/Listener/LoadAdditionalListenerTest.php b/apps/files_sharing/tests/Listener/LoadAdditionalListenerTest.php
index cd3fb0568fa..75bee35d58a 100644
--- a/apps/files_sharing/tests/Listener/LoadAdditionalListenerTest.php
+++ b/apps/files_sharing/tests/Listener/LoadAdditionalListenerTest.php
@@ -16,6 +16,7 @@ use OCP\EventDispatcher\Event;
use OCP\IConfig;
use OCP\L10N\IFactory;
use OCP\Share\IManager;
+use OCP\Util;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
@@ -37,6 +38,21 @@ class LoadAdditionalListenerTest extends TestCase {
$this->factory = $this->createMock(IFactory::class);
$this->initialStateService = $this->createMock(InitialStateService::class);
$this->config = $this->createMock(IConfig::class);
+
+ /* Empty static array to avoid inter-test conflicts */
+ \OC_Util::$styles = [];
+ self::invokePrivate(Util::class, 'scripts', [[]]);
+ self::invokePrivate(Util::class, 'scriptDeps', [[]]);
+ self::invokePrivate(Util::class, 'scriptsInit', [[]]);
+ }
+
+ protected function tearDown(): void {
+ parent::tearDown();
+
+ \OC_Util::$styles = [];
+ self::invokePrivate(Util::class, 'scripts', [[]]);
+ self::invokePrivate(Util::class, 'scriptDeps', [[]]);
+ self::invokePrivate(Util::class, 'scriptsInit', [[]]);
}
public function testHandleIgnoresNonMatchingEvent(): void {
@@ -61,7 +77,7 @@ class LoadAdditionalListenerTest extends TestCase {
$this->overwriteService(InitialStateService::class, $this->initialStateService);
$this->overwriteService(IConfig::class, $this->config);
- $scriptsBefore = \OCP\Util::getScripts();
+ $scriptsBefore = Util::getScripts();
$this->assertNotContains('files_sharing/l10n/language_mock', $scriptsBefore);
$this->assertNotContains('files_sharing/js/additionalScripts', $scriptsBefore);
$this->assertNotContains('files_sharing/js/init', $scriptsBefore);
@@ -71,14 +87,12 @@ class LoadAdditionalListenerTest extends TestCase {
$listener->handle($this->event);
// assert array $scripts contains the expected scripts
- $scriptsAfter = \OCP\Util::getScripts();
+ $scriptsAfter = Util::getScripts();
$this->assertContains('files_sharing/l10n/language_mock', $scriptsAfter);
$this->assertContains('files_sharing/js/additionalScripts', $scriptsAfter);
$this->assertNotContains('files_sharing/js/init', $scriptsAfter);
$this->assertContains('files_sharing/css/icons', \OC_Util::$styles);
-
- $this->assertTrue(true);
}
public function testHandleWithLoadAdditionalScriptsEventWithShareApiEnabled(): void {
@@ -92,17 +106,15 @@ class LoadAdditionalListenerTest extends TestCase {
$this->overwriteService(IConfig::class, $this->config);
$this->overwriteService(IFactory::class, $this->factory);
- $scriptsBefore = \OCP\Util::getScripts();
+ $scriptsBefore = Util::getScripts();
$this->assertNotContains('files_sharing/js/init', $scriptsBefore);
// Util static methods can't be easily mocked, so just ensure no exceptions
$listener->handle($this->event);
- $scriptsAfter = \OCP\Util::getScripts();
+ $scriptsAfter = Util::getScripts();
// assert array $scripts contains the expected scripts
$this->assertContains('files_sharing/js/init', $scriptsAfter);
-
- $this->assertTrue(true);
}
}
diff --git a/apps/files_trashbin/l10n/de.js b/apps/files_trashbin/l10n/de.js
index 75a7ce7d443..0c623ec6ad0 100644
--- a/apps/files_trashbin/l10n/de.js
+++ b/apps/files_trashbin/l10n/de.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Original location" : "Ursprünglicher Ort",
"Deleted by" : "Gelöscht von",
"Deleted" : "Gelöscht",
+ "few seconds ago" : "Gerade eben",
"A long time ago" : "Vor langer Zeit",
"Unknown" : "Unbekannt",
"All files" : "Alle Dateien",
diff --git a/apps/files_trashbin/l10n/de.json b/apps/files_trashbin/l10n/de.json
index 6085c3ba2ee..d68fd5e470b 100644
--- a/apps/files_trashbin/l10n/de.json
+++ b/apps/files_trashbin/l10n/de.json
@@ -14,6 +14,7 @@
"Original location" : "Ursprünglicher Ort",
"Deleted by" : "Gelöscht von",
"Deleted" : "Gelöscht",
+ "few seconds ago" : "Gerade eben",
"A long time ago" : "Vor langer Zeit",
"Unknown" : "Unbekannt",
"All files" : "Alle Dateien",
diff --git a/apps/files_trashbin/l10n/de_DE.js b/apps/files_trashbin/l10n/de_DE.js
index 179a3689d7e..27b41dcea4d 100644
--- a/apps/files_trashbin/l10n/de_DE.js
+++ b/apps/files_trashbin/l10n/de_DE.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Original location" : "Ursprünglicher Ort",
"Deleted by" : "Gelöscht von",
"Deleted" : "Gelöscht",
+ "few seconds ago" : "Gerade eben",
"A long time ago" : "Vor langer Zeit",
"Unknown" : "Unbekannt",
"All files" : "Alle Dateien",
diff --git a/apps/files_trashbin/l10n/de_DE.json b/apps/files_trashbin/l10n/de_DE.json
index 974d0a02b90..c4f1ca5ea43 100644
--- a/apps/files_trashbin/l10n/de_DE.json
+++ b/apps/files_trashbin/l10n/de_DE.json
@@ -14,6 +14,7 @@
"Original location" : "Ursprünglicher Ort",
"Deleted by" : "Gelöscht von",
"Deleted" : "Gelöscht",
+ "few seconds ago" : "Gerade eben",
"A long time ago" : "Vor langer Zeit",
"Unknown" : "Unbekannt",
"All files" : "Alle Dateien",
diff --git a/apps/files_trashbin/l10n/sv.js b/apps/files_trashbin/l10n/sv.js
index fd50574e6fc..265736af1c8 100644
--- a/apps/files_trashbin/l10n/sv.js
+++ b/apps/files_trashbin/l10n/sv.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Original location" : "Ursprunglig plats",
"Deleted by" : "Raderad av",
"Deleted" : "Borttagen",
+ "few seconds ago" : "några sekunder sedan",
"A long time ago" : "För länge sedan",
"Unknown" : "Okänd",
"All files" : "Alla filer",
diff --git a/apps/files_trashbin/l10n/sv.json b/apps/files_trashbin/l10n/sv.json
index 1bf54bf7379..c2ebb95fced 100644
--- a/apps/files_trashbin/l10n/sv.json
+++ b/apps/files_trashbin/l10n/sv.json
@@ -14,6 +14,7 @@
"Original location" : "Ursprunglig plats",
"Deleted by" : "Raderad av",
"Deleted" : "Borttagen",
+ "few seconds ago" : "några sekunder sedan",
"A long time ago" : "För länge sedan",
"Unknown" : "Okänd",
"All files" : "Alla filer",
diff --git a/apps/files_versions/src/components/Version.vue b/apps/files_versions/src/components/Version.vue
index 8ea16e215c6..275f1d0ddbf 100644
--- a/apps/files_versions/src/components/Version.vue
+++ b/apps/files_versions/src/components/Version.vue
@@ -45,7 +45,10 @@
disable-menu
disable-tooltip
:show-user-status="false" />
- <div>{{ versionAuthor }}</div>
+ <div class="version__info__author_name"
+ :title="versionAuthor">
+ {{ versionAuthor }}
+ </div>
</div>
</div>
</template>
@@ -349,12 +352,19 @@ export default defineComponent({
gap: 0.5rem;
color: var(--color-main-text);
font-weight: 500;
+ overflow: hidden;
&__label {
font-weight: 700;
// Fix overflow on narrow screens
overflow: hidden;
text-overflow: ellipsis;
+ min-width: 110px;
+ }
+
+ &__author_name {
+ overflow: hidden;
+ text-overflow: ellipsis;
}
&__date {
diff --git a/apps/provisioning_api/appinfo/routes.php b/apps/provisioning_api/appinfo/routes.php
index 66d1fb699a9..df4f806fa08 100644
--- a/apps/provisioning_api/appinfo/routes.php
+++ b/apps/provisioning_api/appinfo/routes.php
@@ -35,6 +35,7 @@ return [
['root' => '/cloud', 'name' => 'Users#getCurrentUser', 'url' => '/user', 'verb' => 'GET'],
['root' => '/cloud', 'name' => 'Users#getEditableFields', 'url' => '/user/fields', 'verb' => 'GET'],
['root' => '/cloud', 'name' => 'Users#getEditableFieldsForUser', 'url' => '/user/fields/{userId}', 'verb' => 'GET'],
+ ['root' => '/cloud', 'name' => 'Users#getEnabledApps', 'url' => '/user/apps', 'verb' => 'GET'],
['root' => '/cloud', 'name' => 'Users#editUser', 'url' => '/users/{userId}', 'verb' => 'PUT'],
['root' => '/cloud', 'name' => 'Users#editUserMultiValue', 'url' => '/users/{userId}/{collectionName}', 'verb' => 'PUT', 'requirements' => ['collectionName' => '^(?!enable$|disable$)[a-zA-Z0-9_]*$']],
['root' => '/cloud', 'name' => 'Users#wipeUserDevices', 'url' => '/users/{userId}/wipe', 'verb' => 'POST'],
diff --git a/apps/provisioning_api/l10n/ru.js b/apps/provisioning_api/l10n/ru.js
index 604a71392e7..7fa4c8d7e81 100644
--- a/apps/provisioning_api/l10n/ru.js
+++ b/apps/provisioning_api/l10n/ru.js
@@ -1,8 +1,33 @@
OC.L10N.register(
"provisioning_api",
{
- "Logged in user must be an administrator or have authorization to edit this setting." : "Вошедший пользователь должен быть администратором или иметь полномочия для редактирования этого параметра.",
+ "Logged in account must be an administrator or have authorization to edit this setting." : "Для изменения этого параметра необходимо быть администратором или иметь соответствующие права.",
+ "Could not create non-existing user ID" : "Невозможно создать несуществующий идентификатор пользователя",
"User already exists" : "Пользователь уже существует",
+ "Group %1$s does not exist" : "Группа %1$s не существует",
+ "Insufficient privileges for group %1$s" : "Недостаточно прав для группы %1$s",
+ "No group specified (required for sub-admins)" : "Группа не указана (обязательно для субадминистраторов)",
+ "Sub-admin group does not exist" : "Группа субадминистратора не существует",
+ "Cannot create sub-admins for admin group" : "Нельзя назначить субадминистраторов для группы администраторов",
+ "No permissions to promote sub-admins" : "Недостаточно прав для назначения субадминистраторов",
+ "Invalid password value" : "Некорректное значение пароля",
+ "An email address is required, to send a password link to the user." : "Требуется адрес электронной почты для отправки ссылки на установку пароля пользователю.",
+ "Required email address was not provided" : "Не указан обязательный адрес электронной почты",
+ "Invalid quota value: %1$s" : "Недопустимое значение квоты: %1$s",
+ "Invalid quota value. %1$s is exceeding the maximum quota" : "Недопустимое значение квоты.%1$s превышает максимальное значение",
+ "Unlimited quota is forbidden on this instance" : "Безлимитная квота запрещена в этом инстансе",
+ "Setting the password is not supported by the users backend" : "Установка пароля не поддерживается используемой системой управления пользователями",
+ "Invalid language" : "Недопустимый язык",
+ "Invalid locale" : "Недопустимая локаль",
+ "Invalid first day of week" : "Недопустимый первый день недели",
+ "Cannot remove yourself from the admin group" : "Нельзя удалить себя из группы администраторов",
+ "Cannot remove yourself from this group as you are a sub-admin" : "Нельзя удалить себя из этой группы, так как вы являетесь субадминистратором",
+ "Not viable to remove user from the last group you are sub-admin of" : "Нельзя удалить пользователя из последней группы, в которой вы являетесь субадминистратором",
+ "User does not exist" : "Пользователь не существует",
+ "Group does not exist" : "Группа не существует",
+ "User is not a sub-admin of this group" : "Пользователь не является субадминистратором этой группы",
+ "Email address not available" : "Адрес электронной почты недоступен",
+ "Sending email failed" : "Не удалось отправить письмо",
"Email confirmation" : "Подтверждение электронной почты",
"To enable the email address %s please click the button below." : "Чтобы включить адрес электронной почты %s, пожалуйста, нажмите на кнопку ниже.",
"Confirm" : "Подтвердить",
@@ -12,7 +37,7 @@ OC.L10N.register(
"An unexpected error occurred. Please contact your admin." : "Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором.",
"Email confirmation successful" : "Электронная почта подтверждена",
"Provisioning API" : "Provisioning API",
- "This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Это приложение предоставляет API, которое может использоваться внешними системами для управления пользователями, группами и приложениями.",
- "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Это приложение включает набор API-интерфейсов, которые внешние системы могут использовать для создания, редактирования, удаления и запроса пользователя\n\t\tатрибуты, запрос, установка и удаление групп, установка квоты и запрос общего хранилища, используемого в Nextcloud. Пользователи-администраторы группы\n\t\tтакже может запрашивать Nextcloud и выполнять те же функции, что и администратор, для групп, которыми они управляют. API также позволяет\n\t\tадминистратору запрос активных приложений Nextcloud, информации о приложении, а также для удаленного включения или отключения приложения.\n\t\tПосле включения приложения HTTP-запросы можно использовать через заголовок Basic Auth для выполнения любых функций.\n\t\tДополнительная информация доступна в документации по Provisioning API, включая примеры вызовов.\n\t\tи ответы сервера."
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Это приложение предоставляет набор API, которые внешние системы могут использовать для управления учётными записями, группами и приложениями.",
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query account\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin accounts\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Это приложение включает набор API, которые внешние системы могут использовать для создания, редактирования, удаления и запроса атрибутов учетной записи, запроса, установки и удаления групп, установки квоты и запроса общего хранилища, используемого в Nextcloud. Учетные записи администратора группы\nтакже могут запрашивать Nextcloud и выполнять те же функции, что и администратор для групп, которыми они управляют. API также позволяет\nадминистратору запрашивать активные приложения Nextcloud, информацию о приложении и включать или отключать приложение удаленно.\nПосле включения приложения HTTP-запросы можно использовать через заголовок Basic Auth для выполнения любой из функций,\nперечисленных выше. Дополнительная информация доступна в документации API Provisioning, включая примеры вызовов\nи ответы сервера."
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/apps/provisioning_api/l10n/ru.json b/apps/provisioning_api/l10n/ru.json
index d2e5e4f12cc..41989b6ba29 100644
--- a/apps/provisioning_api/l10n/ru.json
+++ b/apps/provisioning_api/l10n/ru.json
@@ -1,6 +1,31 @@
{ "translations": {
- "Logged in user must be an administrator or have authorization to edit this setting." : "Вошедший пользователь должен быть администратором или иметь полномочия для редактирования этого параметра.",
+ "Logged in account must be an administrator or have authorization to edit this setting." : "Для изменения этого параметра необходимо быть администратором или иметь соответствующие права.",
+ "Could not create non-existing user ID" : "Невозможно создать несуществующий идентификатор пользователя",
"User already exists" : "Пользователь уже существует",
+ "Group %1$s does not exist" : "Группа %1$s не существует",
+ "Insufficient privileges for group %1$s" : "Недостаточно прав для группы %1$s",
+ "No group specified (required for sub-admins)" : "Группа не указана (обязательно для субадминистраторов)",
+ "Sub-admin group does not exist" : "Группа субадминистратора не существует",
+ "Cannot create sub-admins for admin group" : "Нельзя назначить субадминистраторов для группы администраторов",
+ "No permissions to promote sub-admins" : "Недостаточно прав для назначения субадминистраторов",
+ "Invalid password value" : "Некорректное значение пароля",
+ "An email address is required, to send a password link to the user." : "Требуется адрес электронной почты для отправки ссылки на установку пароля пользователю.",
+ "Required email address was not provided" : "Не указан обязательный адрес электронной почты",
+ "Invalid quota value: %1$s" : "Недопустимое значение квоты: %1$s",
+ "Invalid quota value. %1$s is exceeding the maximum quota" : "Недопустимое значение квоты.%1$s превышает максимальное значение",
+ "Unlimited quota is forbidden on this instance" : "Безлимитная квота запрещена в этом инстансе",
+ "Setting the password is not supported by the users backend" : "Установка пароля не поддерживается используемой системой управления пользователями",
+ "Invalid language" : "Недопустимый язык",
+ "Invalid locale" : "Недопустимая локаль",
+ "Invalid first day of week" : "Недопустимый первый день недели",
+ "Cannot remove yourself from the admin group" : "Нельзя удалить себя из группы администраторов",
+ "Cannot remove yourself from this group as you are a sub-admin" : "Нельзя удалить себя из этой группы, так как вы являетесь субадминистратором",
+ "Not viable to remove user from the last group you are sub-admin of" : "Нельзя удалить пользователя из последней группы, в которой вы являетесь субадминистратором",
+ "User does not exist" : "Пользователь не существует",
+ "Group does not exist" : "Группа не существует",
+ "User is not a sub-admin of this group" : "Пользователь не является субадминистратором этой группы",
+ "Email address not available" : "Адрес электронной почты недоступен",
+ "Sending email failed" : "Не удалось отправить письмо",
"Email confirmation" : "Подтверждение электронной почты",
"To enable the email address %s please click the button below." : "Чтобы включить адрес электронной почты %s, пожалуйста, нажмите на кнопку ниже.",
"Confirm" : "Подтвердить",
@@ -10,7 +35,7 @@
"An unexpected error occurred. Please contact your admin." : "Произошла неизвестная ошибка. Пожалуйста, свяжитесь с администратором.",
"Email confirmation successful" : "Электронная почта подтверждена",
"Provisioning API" : "Provisioning API",
- "This application enables a set of APIs that external systems can use to manage users, groups and apps." : "Это приложение предоставляет API, которое может использоваться внешними системами для управления пользователями, группами и приложениями.",
- "This application enables a set of APIs that external systems can use to create, edit, delete and query user\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin users\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Это приложение включает набор API-интерфейсов, которые внешние системы могут использовать для создания, редактирования, удаления и запроса пользователя\n\t\tатрибуты, запрос, установка и удаление групп, установка квоты и запрос общего хранилища, используемого в Nextcloud. Пользователи-администраторы группы\n\t\tтакже может запрашивать Nextcloud и выполнять те же функции, что и администратор, для групп, которыми они управляют. API также позволяет\n\t\tадминистратору запрос активных приложений Nextcloud, информации о приложении, а также для удаленного включения или отключения приложения.\n\t\tПосле включения приложения HTTP-запросы можно использовать через заголовок Basic Auth для выполнения любых функций.\n\t\tДополнительная информация доступна в документации по Provisioning API, включая примеры вызовов.\n\t\tи ответы сервера."
+ "This application enables a set of APIs that external systems can use to manage accounts, groups and apps." : "Это приложение предоставляет набор API, которые внешние системы могут использовать для управления учётными записями, группами и приложениями.",
+ "This application enables a set of APIs that external systems can use to create, edit, delete and query account\n\t\tattributes, query, set and remove groups, set quota and query total storage used in Nextcloud. Group admin accounts\n\t\tcan also query Nextcloud and perform the same functions as an admin for groups they manage. The API also enables\n\t\tan admin to query for active Nextcloud applications, application info, and to enable or disable an app remotely.\n\t\tOnce the app is enabled, HTTP requests can be used via a Basic Auth header to perform any of the functions\n\t\tlisted above. More information is available in the Provisioning API documentation, including example calls\n\t\tand server responses." : "Это приложение включает набор API, которые внешние системы могут использовать для создания, редактирования, удаления и запроса атрибутов учетной записи, запроса, установки и удаления групп, установки квоты и запроса общего хранилища, используемого в Nextcloud. Учетные записи администратора группы\nтакже могут запрашивать Nextcloud и выполнять те же функции, что и администратор для групп, которыми они управляют. API также позволяет\nадминистратору запрашивать активные приложения Nextcloud, информацию о приложении и включать или отключать приложение удаленно.\nПосле включения приложения HTTP-запросы можно использовать через заголовок Basic Auth для выполнения любой из функций,\nперечисленных выше. Дополнительная информация доступна в документации API Provisioning, включая примеры вызовов\nи ответы сервера."
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php
index 4b3db45f518..3dfa8f1fe5a 100644
--- a/apps/provisioning_api/lib/Controller/UsersController.php
+++ b/apps/provisioning_api/lib/Controller/UsersController.php
@@ -21,6 +21,7 @@ use OCA\Settings\Settings\Admin\Users;
use OCP\Accounts\IAccountManager;
use OCP\Accounts\IAccountProperty;
use OCP\Accounts\PropertyDoesNotExistException;
+use OCP\App\IAppManager;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
@@ -79,6 +80,7 @@ class UsersController extends AUserDataOCSController {
private KnownUserService $knownUserService,
private IEventDispatcher $eventDispatcher,
private IPhoneNumberUtil $phoneNumberUtil,
+ private IAppManager $appManager,
) {
parent::__construct(
$appName,
@@ -710,6 +712,19 @@ class UsersController extends AUserDataOCSController {
}
/**
+ * Get a list of enabled apps for the current user
+ *
+ * @return DataResponse<Http::STATUS_OK, array{apps: list<string>}, array{}>
+ *
+ * 200: Enabled apps returned
+ */
+ #[NoAdminRequired]
+ public function getEnabledApps(): DataResponse {
+ $currentLoggedInUser = $this->userSession->getUser();
+ return new DataResponse(['apps' => $this->appManager->getEnabledAppsForUser($currentLoggedInUser)]);
+ }
+
+ /**
* @NoSubAdminRequired
*
* Get a list of fields that are editable for a user
diff --git a/apps/provisioning_api/openapi-full.json b/apps/provisioning_api/openapi-full.json
index 734c588be6b..cde7eeaa557 100644
--- a/apps/provisioning_api/openapi-full.json
+++ b/apps/provisioning_api/openapi-full.json
@@ -3573,6 +3573,78 @@
}
}
},
+ "/ocs/v2.php/cloud/user/apps": {
+ "get": {
+ "operationId": "users-get-enabled-apps",
+ "summary": "Get a list of enabled apps for the current user",
+ "tags": [
+ "users"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Enabled apps returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "apps"
+ ],
+ "properties": {
+ "apps": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/ocs/v2.php/cloud/users/{userId}/{collectionName}": {
"put": {
"operationId": "users-edit-user-multi-value",
diff --git a/apps/provisioning_api/openapi.json b/apps/provisioning_api/openapi.json
index d2fd2378488..29272f34956 100644
--- a/apps/provisioning_api/openapi.json
+++ b/apps/provisioning_api/openapi.json
@@ -2003,6 +2003,78 @@
}
}
},
+ "/ocs/v2.php/cloud/user/apps": {
+ "get": {
+ "operationId": "users-get-enabled-apps",
+ "summary": "Get a list of enabled apps for the current user",
+ "tags": [
+ "users"
+ ],
+ "security": [
+ {
+ "bearer_auth": []
+ },
+ {
+ "basic_auth": []
+ }
+ ],
+ "parameters": [
+ {
+ "name": "OCS-APIRequest",
+ "in": "header",
+ "description": "Required to be true for the API request to pass",
+ "required": true,
+ "schema": {
+ "type": "boolean",
+ "default": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Enabled apps returned",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "required": [
+ "ocs"
+ ],
+ "properties": {
+ "ocs": {
+ "type": "object",
+ "required": [
+ "meta",
+ "data"
+ ],
+ "properties": {
+ "meta": {
+ "$ref": "#/components/schemas/OCSMeta"
+ },
+ "data": {
+ "type": "object",
+ "required": [
+ "apps"
+ ],
+ "properties": {
+ "apps": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
"/ocs/v2.php/cloud/users/{userId}/{collectionName}": {
"put": {
"operationId": "users-edit-user-multi-value",
diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
index 80d6d0f6152..3f8c1566b5d 100644
--- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php
+++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php
@@ -20,6 +20,7 @@ use OCP\Accounts\IAccount;
use OCP\Accounts\IAccountManager;
use OCP\Accounts\IAccountProperty;
use OCP\Accounts\IAccountPropertyCollection;
+use OCP\App\IAppManager;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCS\OCSException;
use OCP\EventDispatcher\IEventDispatcher;
@@ -64,6 +65,7 @@ class UsersControllerTest extends TestCase {
private IEventDispatcher&MockObject $eventDispatcher;
private IRootFolder $rootFolder;
private IPhoneNumberUtil $phoneNumberUtil;
+ private IAppManager $appManager;
protected function setUp(): void {
parent::setUp();
@@ -84,6 +86,7 @@ class UsersControllerTest extends TestCase {
$this->knownUserService = $this->createMock(KnownUserService::class);
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
$this->phoneNumberUtil = new PhoneNumberUtil();
+ $this->appManager = $this->createMock(IAppManager::class);
$this->rootFolder = $this->createMock(IRootFolder::class);
$l10n = $this->createMock(IL10N::class);
@@ -110,6 +113,7 @@ class UsersControllerTest extends TestCase {
$this->knownUserService,
$this->eventDispatcher,
$this->phoneNumberUtil,
+ $this->appManager,
])
->onlyMethods(['fillStorageInfo'])
->getMock();
@@ -501,6 +505,7 @@ class UsersControllerTest extends TestCase {
$this->knownUserService,
$this->eventDispatcher,
$this->phoneNumberUtil,
+ $this->appManager,
])
->onlyMethods(['editUser'])
->getMock();
@@ -3796,6 +3801,7 @@ class UsersControllerTest extends TestCase {
$this->knownUserService,
$this->eventDispatcher,
$this->phoneNumberUtil,
+ $this->appManager,
])
->onlyMethods(['getUserData'])
->getMock();
@@ -3887,6 +3893,7 @@ class UsersControllerTest extends TestCase {
$this->knownUserService,
$this->eventDispatcher,
$this->phoneNumberUtil,
+ $this->appManager,
])
->onlyMethods(['getUserData'])
->getMock();
diff --git a/apps/sharebymail/l10n/ru.js b/apps/sharebymail/l10n/ru.js
index 3f59ad6b900..0ee054c416f 100644
--- a/apps/sharebymail/l10n/ru.js
+++ b/apps/sharebymail/l10n/ru.js
@@ -18,12 +18,22 @@ OC.L10N.register(
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Мы не можем отправить вам автоматически сгенерированный пароль. Укажите действующий адрес электронной почты в личных настройках и повторите попытку.",
"Failed to send share by email. Got an invalid email address" : "Не удалось отправить ссылку общего доступа по электронной почте. Получен неверный адрес электронной почты",
"Failed to send share by email" : "Не удалось предоставить общий доступ по адресу электронной почты",
+ "%1$s shared %2$s with you" : "%1$s поделился(ась) %2$s с вами",
"Note:" : "Примечание:",
+ "This share is valid until %s at midnight" : "Общий ресурс будет действителен до полуночи %s",
+ "Expiration:" : "Срок действия:",
"Open %s" : "Открыть %s",
"%1$s via %2$s" : "%1$s через %2$s",
+ "%1$s shared %2$s with you. You should have already received a separate mail with a link to access it." : "%1$s поделился(ась) с вами %2$s. Вы должны были получить отдельное письмо со ссылкой для доступа.",
+ "Password to access %1$s shared to you by %2$s" : "Пароль для доступа к %1$s, предоставленному вам пользователем %2$s",
"Password to access %s" : "Пароль для доступа к %s",
"It is protected with the following password:" : "Доступ защищён следующим паролем: ",
"This password will expire at %s" : "Срок действия этого пароля завершится %s",
+ "%1$s shared %2$s with you and wants to add:" : "%1$s поделился(ась) %2$s с вами и хочет добавить:",
+ "%1$s shared %2$s with you and wants to add" : "%1$s поделился(ась) %2$s с вами и хочет добавить",
+ "%s added a note to a file shared with you" : "%s добавил(а) заметку к файлу, которым поделился(ась) с вами",
+ "You just shared %1$s with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Вы только что поделились %1$s с %2$s. Ссылка на доступ уже отправлена получателю. Согласно политике безопасности, установленной администратором %3$s, каждый общий ресурс должен быть защищён паролем, и его запрещено отправлять пароль напрямую получателю. Пожалуйста, передайте пароль самостоятельно.",
+ "Password to access %1$s shared by you with %2$s" : "Пароль для доступа к %1$s, которым вы поделились с %2$s",
"This is the password:" : "Пароль: ",
"You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой пароль в диалоге «Общий доступ».",
"Could not find share" : "Не удалось найти общий ресурс",
diff --git a/apps/sharebymail/l10n/ru.json b/apps/sharebymail/l10n/ru.json
index b0b3cf028dd..d7bf86c5657 100644
--- a/apps/sharebymail/l10n/ru.json
+++ b/apps/sharebymail/l10n/ru.json
@@ -16,12 +16,22 @@
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Мы не можем отправить вам автоматически сгенерированный пароль. Укажите действующий адрес электронной почты в личных настройках и повторите попытку.",
"Failed to send share by email. Got an invalid email address" : "Не удалось отправить ссылку общего доступа по электронной почте. Получен неверный адрес электронной почты",
"Failed to send share by email" : "Не удалось предоставить общий доступ по адресу электронной почты",
+ "%1$s shared %2$s with you" : "%1$s поделился(ась) %2$s с вами",
"Note:" : "Примечание:",
+ "This share is valid until %s at midnight" : "Общий ресурс будет действителен до полуночи %s",
+ "Expiration:" : "Срок действия:",
"Open %s" : "Открыть %s",
"%1$s via %2$s" : "%1$s через %2$s",
+ "%1$s shared %2$s with you. You should have already received a separate mail with a link to access it." : "%1$s поделился(ась) с вами %2$s. Вы должны были получить отдельное письмо со ссылкой для доступа.",
+ "Password to access %1$s shared to you by %2$s" : "Пароль для доступа к %1$s, предоставленному вам пользователем %2$s",
"Password to access %s" : "Пароль для доступа к %s",
"It is protected with the following password:" : "Доступ защищён следующим паролем: ",
"This password will expire at %s" : "Срок действия этого пароля завершится %s",
+ "%1$s shared %2$s with you and wants to add:" : "%1$s поделился(ась) %2$s с вами и хочет добавить:",
+ "%1$s shared %2$s with you and wants to add" : "%1$s поделился(ась) %2$s с вами и хочет добавить",
+ "%s added a note to a file shared with you" : "%s добавил(а) заметку к файлу, которым поделился(ась) с вами",
+ "You just shared %1$s with %2$s. The share was already sent to the recipient. Due to the security policies defined by the administrator of %3$s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "Вы только что поделились %1$s с %2$s. Ссылка на доступ уже отправлена получателю. Согласно политике безопасности, установленной администратором %3$s, каждый общий ресурс должен быть защищён паролем, и его запрещено отправлять пароль напрямую получателю. Пожалуйста, передайте пароль самостоятельно.",
+ "Password to access %1$s shared by you with %2$s" : "Пароль для доступа к %1$s, которым вы поделились с %2$s",
"This is the password:" : "Пароль: ",
"You can choose a different password at any time in the share dialog." : "В любой момент можно выбрать другой пароль в диалоге «Общий доступ».",
"Could not find share" : "Не удалось найти общий ресурс",
diff --git a/apps/systemtags/l10n/ru.js b/apps/systemtags/l10n/ru.js
index 0a63f20736e..527a2c47aad 100644
--- a/apps/systemtags/l10n/ru.js
+++ b/apps/systemtags/l10n/ru.js
@@ -65,18 +65,39 @@ OC.L10N.register(
"Delete" : "Удалить",
"Reset" : "Сбросить",
"Loading …" : "Загрузка…",
+ "_{tag1} will be set and {tag2} will be removed from 1 file._::_{tag1} will be set and {tag2} will be removed from {count} files._" : ["{tag1} будет добавлен, а {tag2} будет удалён из 1 файла.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов."],
+ "_{tag} will be set to 1 file._::_{tag} will be set to {count} files._" : ["{tag}будет добавлен к 1 файлу.","{tag} будет добавлен к {count} файлам.","{tag} будет добавлен к {count} файлов.","{tag} будет добавлен к {count} файлов."],
+ "_{tag} will be removed from 1 file._::_{tag} will be removed from {count} files._" : ["{tag} будет удалён из 1 файла.","{tag} будет удалён из {count} файлов.","{tag} будет удалён из {count} файлов.","{tag} будет удалён из {count} файлов."],
+ "_{tags} and {lastTag} will be set to 1 file._::_{tags} and {lastTag} will be set to {count} files._" : ["{tags} и {lastTag} будут добавлены к 1 файлу.","{tags} и {lastTag} будут добавлены к {count} файлам.","{tags} и {lastTag} будут добавлены к {count}файлам.","{tags} и {lastTag} будут добавлены к {count} файлам."],
+ "_{tags} and {lastTag} will be removed from 1 file._::_{tags} and {lastTag} will be removed from {count} files._" : ["{tags} и {lastTag} будут удалены из 1 файла.","{tags} и {lastTag} будут удалены из {count} файлов.","{tags} и {lastTag} будут удалены из {count} файлов.","{tags} и {lastTag} будут удалены из {count} файлов."],
+ "{displayName} (hidden)" : "{displayName} (скрыто)",
+ "{displayName} (restricted)" : "{displayName} (ограничено)",
+ "Only admins can create new tags" : "Только администраторы могут создать новые метки",
"Failed to apply tags changes" : "Не удалось применить изменения тегов",
+ "File tags modification canceled" : "Изменение меток отменено",
"Manage tags" : "Управление метками",
+ "Applying tags changes…" : "Изменение меток…",
"Search or create tag" : "Найти или создать тег",
+ "Search tag" : "Найти метку",
+ "Change tag color" : "Изменить цвет метки",
"Create new tag" : "Создать новый тег",
+ "Select or create tags to apply to all selected files" : "Выберите или создайте метки для применения ко всем выбранным файлам",
+ "Select tags to apply to all selected files" : "Выберите метки для применения ко всем выбранным файлам",
"Cancel" : "Отмена",
"Apply changes" : "Применить изменения",
"Failed to load tags" : "Не удалось загрузить метки",
"Failed to load selected tags" : "Не удалось загрузить выбранный тег",
"Failed to select tag" : "Не удалось выбрать тег",
+ "System admin disabled tag creation. You can only use existing ones." : "Создание меток отключено системным администратором. Вы можете использовать только существующие.",
"Loading collaborative tags …" : "Загрузка совместных тегов ...",
"Search or create collaborative tags" : "Поиск или создание совместных тегов",
"No tags to select, type to create a new tag" : "Нет тегов для выбора. Введите что-нибудь для создания нового тега",
+ "Unable to update setting" : "Не удалось обновить настройку",
+ "System tag creation is now restricted to administrators" : "Создание системных меток теперь разрешено только администраторам",
+ "System tag creation is now allowed for everybody" : "Создание системных меток теперь разрешено всем пользователям",
+ "System tag management" : "Управление системными метками",
+ "If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files." : "Если включено, только администраторы смогут создавать и редактировать метки. Пользователи всё ещё смогут назначать и удалять их с файлов.",
+ "Restrict tag creation and editing to administrators" : "Разрешить создание и редактирование меток только администраторам",
"Collaborative tags are available for all users. Restricted tags are visible to users but cannot be assigned by them. Invisible tags are for internal use, since users cannot see or assign them." : "Совместные теги доступны для всех пользователей. Ограниченные теги видны пользователям, но не могут быть назначены ими. Невидимые теги предназначены для внутреннего использования, поскольку пользователи не могут их видеть или назначать.",
"Assigned collaborative tags" : "Присвоенные теги для совместной работы",
"Open in Files" : "Открыть в приложении «Файлы»",
@@ -86,6 +107,7 @@ OC.L10N.register(
"Failed to load tag" : "Не удалось загрузить тег",
"Failed to load last used tags" : "Не удалось загрузить последние использованные метки",
"Missing \"Content-Location\" header" : "Отсутствует заголовок «Content-Location»",
+ "A tag with the same name already exists" : "Метка с таким именем уже существует",
"Failed to load tags for file" : "Не удалось загрузить метки для файла",
"Failed to set tag for file" : "Не удалось поставить метку файлу",
"Failed to delete tag for file" : "Не удалось удалить метку у файла"
diff --git a/apps/systemtags/l10n/ru.json b/apps/systemtags/l10n/ru.json
index a94c3a94a2e..1b74ab93bc1 100644
--- a/apps/systemtags/l10n/ru.json
+++ b/apps/systemtags/l10n/ru.json
@@ -63,18 +63,39 @@
"Delete" : "Удалить",
"Reset" : "Сбросить",
"Loading …" : "Загрузка…",
+ "_{tag1} will be set and {tag2} will be removed from 1 file._::_{tag1} will be set and {tag2} will be removed from {count} files._" : ["{tag1} будет добавлен, а {tag2} будет удалён из 1 файла.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов.","{tag1} будет добавлен, а {tag2} будет удалён из {count} файлов."],
+ "_{tag} will be set to 1 file._::_{tag} will be set to {count} files._" : ["{tag}будет добавлен к 1 файлу.","{tag} будет добавлен к {count} файлам.","{tag} будет добавлен к {count} файлов.","{tag} будет добавлен к {count} файлов."],
+ "_{tag} will be removed from 1 file._::_{tag} will be removed from {count} files._" : ["{tag} будет удалён из 1 файла.","{tag} будет удалён из {count} файлов.","{tag} будет удалён из {count} файлов.","{tag} будет удалён из {count} файлов."],
+ "_{tags} and {lastTag} will be set to 1 file._::_{tags} and {lastTag} will be set to {count} files._" : ["{tags} и {lastTag} будут добавлены к 1 файлу.","{tags} и {lastTag} будут добавлены к {count} файлам.","{tags} и {lastTag} будут добавлены к {count}файлам.","{tags} и {lastTag} будут добавлены к {count} файлам."],
+ "_{tags} and {lastTag} will be removed from 1 file._::_{tags} and {lastTag} will be removed from {count} files._" : ["{tags} и {lastTag} будут удалены из 1 файла.","{tags} и {lastTag} будут удалены из {count} файлов.","{tags} и {lastTag} будут удалены из {count} файлов.","{tags} и {lastTag} будут удалены из {count} файлов."],
+ "{displayName} (hidden)" : "{displayName} (скрыто)",
+ "{displayName} (restricted)" : "{displayName} (ограничено)",
+ "Only admins can create new tags" : "Только администраторы могут создать новые метки",
"Failed to apply tags changes" : "Не удалось применить изменения тегов",
+ "File tags modification canceled" : "Изменение меток отменено",
"Manage tags" : "Управление метками",
+ "Applying tags changes…" : "Изменение меток…",
"Search or create tag" : "Найти или создать тег",
+ "Search tag" : "Найти метку",
+ "Change tag color" : "Изменить цвет метки",
"Create new tag" : "Создать новый тег",
+ "Select or create tags to apply to all selected files" : "Выберите или создайте метки для применения ко всем выбранным файлам",
+ "Select tags to apply to all selected files" : "Выберите метки для применения ко всем выбранным файлам",
"Cancel" : "Отмена",
"Apply changes" : "Применить изменения",
"Failed to load tags" : "Не удалось загрузить метки",
"Failed to load selected tags" : "Не удалось загрузить выбранный тег",
"Failed to select tag" : "Не удалось выбрать тег",
+ "System admin disabled tag creation. You can only use existing ones." : "Создание меток отключено системным администратором. Вы можете использовать только существующие.",
"Loading collaborative tags …" : "Загрузка совместных тегов ...",
"Search or create collaborative tags" : "Поиск или создание совместных тегов",
"No tags to select, type to create a new tag" : "Нет тегов для выбора. Введите что-нибудь для создания нового тега",
+ "Unable to update setting" : "Не удалось обновить настройку",
+ "System tag creation is now restricted to administrators" : "Создание системных меток теперь разрешено только администраторам",
+ "System tag creation is now allowed for everybody" : "Создание системных меток теперь разрешено всем пользователям",
+ "System tag management" : "Управление системными метками",
+ "If enabled, only administrators can create and edit tags. Accounts can still assign and remove them from files." : "Если включено, только администраторы смогут создавать и редактировать метки. Пользователи всё ещё смогут назначать и удалять их с файлов.",
+ "Restrict tag creation and editing to administrators" : "Разрешить создание и редактирование меток только администраторам",
"Collaborative tags are available for all users. Restricted tags are visible to users but cannot be assigned by them. Invisible tags are for internal use, since users cannot see or assign them." : "Совместные теги доступны для всех пользователей. Ограниченные теги видны пользователям, но не могут быть назначены ими. Невидимые теги предназначены для внутреннего использования, поскольку пользователи не могут их видеть или назначать.",
"Assigned collaborative tags" : "Присвоенные теги для совместной работы",
"Open in Files" : "Открыть в приложении «Файлы»",
@@ -84,6 +105,7 @@
"Failed to load tag" : "Не удалось загрузить тег",
"Failed to load last used tags" : "Не удалось загрузить последние использованные метки",
"Missing \"Content-Location\" header" : "Отсутствует заголовок «Content-Location»",
+ "A tag with the same name already exists" : "Метка с таким именем уже существует",
"Failed to load tags for file" : "Не удалось загрузить метки для файла",
"Failed to set tag for file" : "Не удалось поставить метку файлу",
"Failed to delete tag for file" : "Не удалось удалить метку у файла"
diff --git a/apps/theming/lib/Capabilities.php b/apps/theming/lib/Capabilities.php
index b6145298d95..c9bc98036f5 100644
--- a/apps/theming/lib/Capabilities.php
+++ b/apps/theming/lib/Capabilities.php
@@ -41,6 +41,7 @@ class Capabilities implements IPublicCapability {
* @return array{
* theming: array{
* name: string,
+ * productName: string,
* url: string,
* slogan: string,
* color: string,
@@ -94,6 +95,7 @@ class Capabilities implements IPublicCapability {
return [
'theming' => [
'name' => $this->theming->getName(),
+ 'productName' => $this->theming->getProductName(),
'url' => $this->theming->getBaseUrl(),
'slogan' => $this->theming->getSlogan(),
'color' => $color,
diff --git a/apps/theming/openapi.json b/apps/theming/openapi.json
index 26f5e7b8120..66ee05413b3 100644
--- a/apps/theming/openapi.json
+++ b/apps/theming/openapi.json
@@ -79,6 +79,7 @@
"type": "object",
"required": [
"name",
+ "productName",
"url",
"slogan",
"color",
@@ -98,6 +99,9 @@
"name": {
"type": "string"
},
+ "productName": {
+ "type": "string"
+ },
"url": {
"type": "string"
},
diff --git a/apps/theming/tests/CapabilitiesTest.php b/apps/theming/tests/CapabilitiesTest.php
index f5230d4d6d0..16cc6d51ba9 100644
--- a/apps/theming/tests/CapabilitiesTest.php
+++ b/apps/theming/tests/CapabilitiesTest.php
@@ -54,6 +54,7 @@ class CapabilitiesTest extends TestCase {
return [
['name', 'url', 'slogan', '#FFFFFF', '#000000', 'logo', 'background', '#fff', '#000', 'http://absolute/', true, [
'name' => 'name',
+ 'productName' => 'name',
'url' => 'url',
'slogan' => 'slogan',
'color' => '#FFFFFF',
@@ -71,6 +72,7 @@ class CapabilitiesTest extends TestCase {
]],
['name1', 'url2', 'slogan3', '#01e4a0', '#ffffff', 'logo5', 'background6', '#fff', '#000', 'http://localhost/', false, [
'name' => 'name1',
+ 'productName' => 'name1',
'url' => 'url2',
'slogan' => 'slogan3',
'color' => '#01e4a0',
@@ -88,6 +90,7 @@ class CapabilitiesTest extends TestCase {
]],
['name1', 'url2', 'slogan3', '#000000', '#ffffff', 'logo5', 'backgroundColor', '#000000', '#ffffff', 'http://localhost/', true, [
'name' => 'name1',
+ 'productName' => 'name1',
'url' => 'url2',
'slogan' => 'slogan3',
'color' => '#000000',
@@ -105,6 +108,7 @@ class CapabilitiesTest extends TestCase {
]],
['name1', 'url2', 'slogan3', '#000000', '#ffffff', 'logo5', 'backgroundColor', '#000000', '#ffffff', 'http://localhost/', false, [
'name' => 'name1',
+ 'productName' => 'name1',
'url' => 'url2',
'slogan' => 'slogan3',
'color' => '#000000',
@@ -135,6 +139,9 @@ class CapabilitiesTest extends TestCase {
->method('getName')
->willReturn($name);
$this->theming->expects($this->once())
+ ->method('getProductName')
+ ->willReturn($name);
+ $this->theming->expects($this->once())
->method('getBaseUrl')
->willReturn($url);
$this->theming->expects($this->once())
diff --git a/apps/user_ldap/ajax/deleteConfiguration.php b/apps/user_ldap/ajax/deleteConfiguration.php
index f09295355ac..68bce69f982 100644
--- a/apps/user_ldap/ajax/deleteConfiguration.php
+++ b/apps/user_ldap/ajax/deleteConfiguration.php
@@ -1,8 +1,6 @@
<?php
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use OCP\Util;
@@ -17,7 +15,7 @@ use OCP\Util;
\OC_JSON::callCheck();
$prefix = (string)$_POST['ldap_serverconfig_chooser'];
-$helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+$helper = Server::get(Helper::class);
if ($helper->deleteServerConfiguration($prefix)) {
\OC_JSON::success();
} else {
diff --git a/apps/user_ldap/ajax/getNewServerConfigPrefix.php b/apps/user_ldap/ajax/getNewServerConfigPrefix.php
index e8746a7c1b1..e5ba6375c73 100644
--- a/apps/user_ldap/ajax/getNewServerConfigPrefix.php
+++ b/apps/user_ldap/ajax/getNewServerConfigPrefix.php
@@ -2,8 +2,6 @@
use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
/**
@@ -16,7 +14,7 @@ use OCP\Server;
\OC_JSON::checkAppEnabled('user_ldap');
\OC_JSON::callCheck();
-$helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+$helper = Server::get(Helper::class);
$serverConnections = $helper->getServerConfigurationPrefixes();
sort($serverConnections);
$lk = array_pop($serverConnections);
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index d97ec49e13c..a39e92ab1f8 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -61,6 +61,7 @@ OC.L10N.register(
"No LDAP base DN was given" : "Non se indicou un DN base de LDAP",
"User base DN is not a subnode of global base DN" : "O DN base do usuario non é un subnodo do DN base global",
"Group base DN is not a subnode of global base DN" : "O DN base de grupo non é un subnodo do DN base global",
+ "Login filter does not contain %s placeholder." : "O filtro de inicio de sesión non contén o marcador de substitución %s.",
"Please login with the new password" : "Acceda co novo contrasinal",
"LDAP User backend" : "Infraestrutura do usuario LDAP",
"Your password will expire tomorrow." : "O seu contrasinal caduca mañá.",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index 952066b7994..58b0658ebf0 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -59,6 +59,7 @@
"No LDAP base DN was given" : "Non se indicou un DN base de LDAP",
"User base DN is not a subnode of global base DN" : "O DN base do usuario non é un subnodo do DN base global",
"Group base DN is not a subnode of global base DN" : "O DN base de grupo non é un subnodo do DN base global",
+ "Login filter does not contain %s placeholder." : "O filtro de inicio de sesión non contén o marcador de substitución %s.",
"Please login with the new password" : "Acceda co novo contrasinal",
"LDAP User backend" : "Infraestrutura do usuario LDAP",
"Your password will expire tomorrow." : "O seu contrasinal caduca mañá.",
diff --git a/apps/user_ldap/lib/Command/Search.php b/apps/user_ldap/lib/Command/Search.php
index ad13c94c84a..85906b20e9a 100644
--- a/apps/user_ldap/lib/Command/Search.php
+++ b/apps/user_ldap/lib/Command/Search.php
@@ -12,7 +12,6 @@ use OCA\User_LDAP\Helper;
use OCA\User_LDAP\LDAP;
use OCA\User_LDAP\User_Proxy;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use Symfony\Component\Console\Command\Command;
@@ -83,7 +82,7 @@ class Search extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output): int {
- $helper = new Helper($this->ocConfig, Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$configPrefixes = $helper->getServerConfigurationPrefixes(true);
$ldapWrapper = new LDAP();
diff --git a/apps/user_ldap/lib/Command/SetConfig.php b/apps/user_ldap/lib/Command/SetConfig.php
index 5a0b65a2c3e..7e9efcf34d0 100644
--- a/apps/user_ldap/lib/Command/SetConfig.php
+++ b/apps/user_ldap/lib/Command/SetConfig.php
@@ -11,8 +11,6 @@ use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\ConnectionFactory;
use OCA\User_LDAP\Helper;
use OCA\User_LDAP\LDAP;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Server;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
@@ -43,7 +41,7 @@ class SetConfig extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output): int {
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$availableConfigs = $helper->getServerConfigurationPrefixes();
$configID = $input->getArgument('configID');
if (!in_array($configID, $availableConfigs)) {
diff --git a/apps/user_ldap/lib/Connection.php b/apps/user_ldap/lib/Connection.php
index 78a5f93d29e..b25a2e72b2b 100644
--- a/apps/user_ldap/lib/Connection.php
+++ b/apps/user_ldap/lib/Connection.php
@@ -11,8 +11,6 @@ use OC\ServerNotAvailableException;
use OCA\User_LDAP\Exceptions\ConfigurationIssueException;
use OCP\ICache;
use OCP\ICacheFactory;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IL10N;
use OCP\Server;
use OCP\Util;
@@ -156,7 +154,7 @@ class Connection extends LDAPUtility {
if ($memcache->isAvailable()) {
$this->cache = $memcache->createDistributed();
}
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$this->doNotValidate = !in_array($this->configPrefix,
$helper->getServerConfigurationPrefixes());
$this->logger = Server::get(LoggerInterface::class);
diff --git a/apps/user_ldap/lib/Helper.php b/apps/user_ldap/lib/Helper.php
index 27c19e6c4f5..d3abf04fd1e 100644
--- a/apps/user_ldap/lib/Helper.php
+++ b/apps/user_ldap/lib/Helper.php
@@ -9,7 +9,7 @@ namespace OCA\User_LDAP;
use OCP\Cache\CappedMemoryCache;
use OCP\DB\QueryBuilder\IQueryBuilder;
-use OCP\IConfig;
+use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\Server;
@@ -18,7 +18,7 @@ class Helper {
protected CappedMemoryCache $sanitizeDnCache;
public function __construct(
- private IConfig $config,
+ private IAppConfig $appConfig,
private IDBConnection $connection,
) {
$this->sanitizeDnCache = new CappedMemoryCache(10000);
@@ -45,21 +45,37 @@ class Helper {
* except the default (first) server shall be connected to.
*
*/
- public function getServerConfigurationPrefixes($activeConfigurations = false): array {
+ public function getServerConfigurationPrefixes(bool $activeConfigurations = false): array {
+ $all = $this->getAllServerConfigurationPrefixes();
+ if (!$activeConfigurations) {
+ return $all;
+ }
+ return array_values(array_filter(
+ $all,
+ fn (string $prefix): bool => ($this->appConfig->getValueString('user_ldap', $prefix . 'ldap_configuration_active') === '1')
+ ));
+ }
+
+ protected function getAllServerConfigurationPrefixes(): array {
+ $unfilled = ['UNFILLED'];
+ $prefixes = $this->appConfig->getValueArray('user_ldap', 'configuration_prefixes', $unfilled);
+ if ($prefixes !== $unfilled) {
+ return $prefixes;
+ }
+
+ /* Fallback to browsing key for migration from Nextcloud<32 */
$referenceConfigkey = 'ldap_configuration_active';
$keys = $this->getServersConfig($referenceConfigkey);
$prefixes = [];
foreach ($keys as $key) {
- if ($activeConfigurations && $this->config->getAppValue('user_ldap', $key, '0') !== '1') {
- continue;
- }
-
$len = strlen($key) - strlen($referenceConfigkey);
$prefixes[] = substr($key, 0, $len);
}
- asort($prefixes);
+ sort($prefixes);
+
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', $prefixes);
return $prefixes;
}
@@ -68,46 +84,45 @@ class Helper {
*
* determines the host for every configured connection
*
- * @return array an array with configprefix as keys
+ * @return array<string,string> an array with configprefix as keys
*
*/
- public function getServerConfigurationHosts() {
- $referenceConfigkey = 'ldap_host';
-
- $keys = $this->getServersConfig($referenceConfigkey);
+ public function getServerConfigurationHosts(): array {
+ $prefixes = $this->getServerConfigurationPrefixes();
+ $referenceConfigkey = 'ldap_host';
$result = [];
- foreach ($keys as $key) {
- $len = strlen($key) - strlen($referenceConfigkey);
- $prefix = substr($key, 0, $len);
- $result[$prefix] = $this->config->getAppValue('user_ldap', $key);
+ foreach ($prefixes as $prefix) {
+ $result[$prefix] = $this->appConfig->getValueString('user_ldap', $prefix . $referenceConfigkey);
}
return $result;
}
/**
- * return the next available configuration prefix
- *
- * @return string
+ * return the next available configuration prefix and register it as used
*/
- public function getNextServerConfigurationPrefix() {
- $serverConnections = $this->getServerConfigurationPrefixes();
-
- if (count($serverConnections) === 0) {
- return 's01';
+ public function getNextServerConfigurationPrefix(): string {
+ $prefixes = $this->getServerConfigurationPrefixes();
+
+ if (count($prefixes) === 0) {
+ $prefix = 's01';
+ } else {
+ sort($prefixes);
+ $lastKey = array_pop($prefixes);
+ $lastNumber = (int)str_replace('s', '', $lastKey);
+ $prefix = 's' . str_pad((string)($lastNumber + 1), 2, '0', STR_PAD_LEFT);
}
- sort($serverConnections);
- $lastKey = array_pop($serverConnections);
- $lastNumber = (int)str_replace('s', '', $lastKey);
- return 's' . str_pad((string)($lastNumber + 1), 2, '0', STR_PAD_LEFT);
+ $prefixes[] = $prefix;
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', $prefixes);
+ return $prefix;
}
private function getServersConfig(string $value): array {
$regex = '/' . $value . '$/S';
- $keys = $this->config->getAppKeys('user_ldap');
+ $keys = $this->appConfig->getKeys('user_ldap');
$result = [];
foreach ($keys as $key) {
if (preg_match($regex, $key) === 1) {
@@ -125,7 +140,9 @@ class Helper {
* @return bool true on success, false otherwise
*/
public function deleteServerConfiguration($prefix) {
- if (!in_array($prefix, self::getServerConfigurationPrefixes())) {
+ $prefixes = $this->getServerConfigurationPrefixes();
+ $index = array_search($prefix, $prefixes);
+ if ($index === false) {
return false;
}
@@ -144,7 +161,11 @@ class Helper {
$query->andWhere($query->expr()->notLike('configkey', $query->createNamedParameter('s%')));
}
- $deletedRows = $query->execute();
+ $deletedRows = $query->executeStatement();
+
+ unset($prefixes[$index]);
+ $this->appConfig->setValueArray('user_ldap', 'configuration_prefixes', array_values($prefixes));
+
return $deletedRows !== 0;
}
@@ -152,10 +173,13 @@ class Helper {
* checks whether there is one or more disabled LDAP configurations
*/
public function haveDisabledConfigurations(): bool {
- $all = $this->getServerConfigurationPrefixes(false);
- $active = $this->getServerConfigurationPrefixes(true);
-
- return count($all) !== count($active) || count($all) === 0;
+ $all = $this->getServerConfigurationPrefixes();
+ foreach ($all as $prefix) {
+ if ($this->appConfig->getValueString('user_ldap', $prefix . 'ldap_configuration_active') !== '1') {
+ return true;
+ }
+ }
+ return false;
}
/**
diff --git a/apps/user_ldap/lib/Jobs/CleanUp.php b/apps/user_ldap/lib/Jobs/CleanUp.php
index 7cfc473c950..a1309c0c463 100644
--- a/apps/user_ldap/lib/Jobs/CleanUp.php
+++ b/apps/user_ldap/lib/Jobs/CleanUp.php
@@ -67,7 +67,7 @@ class CleanUp extends TimedJob {
if (isset($arguments['helper'])) {
$this->ldapHelper = $arguments['helper'];
} else {
- $this->ldapHelper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $this->ldapHelper = Server::get(Helper::class);
}
if (isset($arguments['ocConfig'])) {
diff --git a/apps/user_ldap/lib/Settings/Admin.php b/apps/user_ldap/lib/Settings/Admin.php
index 014210ca8f0..49868eb68c7 100644
--- a/apps/user_ldap/lib/Settings/Admin.php
+++ b/apps/user_ldap/lib/Settings/Admin.php
@@ -8,8 +8,6 @@ namespace OCA\User_LDAP\Settings;
use OCA\User_LDAP\Configuration;
use OCA\User_LDAP\Helper;
use OCP\AppFramework\Http\TemplateResponse;
-use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IL10N;
use OCP\Server;
use OCP\Settings\IDelegatedSettings;
@@ -26,7 +24,7 @@ class Admin implements IDelegatedSettings {
* @return TemplateResponse
*/
public function getForm() {
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$prefixes = $helper->getServerConfigurationPrefixes();
if (count($prefixes) === 0) {
$newPrefix = $helper->getNextServerConfigurationPrefix();
diff --git a/apps/user_ldap/tests/AccessTest.php b/apps/user_ldap/tests/AccessTest.php
index 86ce2aff854..eafaeb76403 100644
--- a/apps/user_ldap/tests/AccessTest.php
+++ b/apps/user_ldap/tests/AccessTest.php
@@ -25,7 +25,6 @@ use OCP\HintException;
use OCP\IAppConfig;
use OCP\IAvatarManager;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Image;
use OCP\IUserManager;
use OCP\Notification\IManager as INotificationManager;
@@ -110,7 +109,7 @@ class AccessTest extends TestCase {
$this->createMock(INotificationManager::class),
$this->shareManager])
->getMock();
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
return [$lw, $connector, $um, $helper];
}
diff --git a/apps/user_ldap/tests/HelperTest.php b/apps/user_ldap/tests/HelperTest.php
index 470b67c5531..adea600d900 100644
--- a/apps/user_ldap/tests/HelperTest.php
+++ b/apps/user_ldap/tests/HelperTest.php
@@ -8,7 +8,7 @@ declare(strict_types=1);
namespace OCA\User_LDAP\Tests;
use OCA\User_LDAP\Helper;
-use OCP\IConfig;
+use OCP\IAppConfig;
use OCP\IDBConnection;
use OCP\Server;
use PHPUnit\Framework\MockObject\MockObject;
@@ -17,45 +17,53 @@ use PHPUnit\Framework\MockObject\MockObject;
* @group DB
*/
class HelperTest extends \Test\TestCase {
- private IConfig&MockObject $config;
+ private IAppConfig&MockObject $appConfig;
private Helper $helper;
protected function setUp(): void {
parent::setUp();
- $this->config = $this->createMock(IConfig::class);
- $this->helper = new Helper($this->config, Server::get(IDBConnection::class));
+ $this->appConfig = $this->createMock(IAppConfig::class);
+ $this->helper = new Helper(
+ $this->appConfig,
+ Server::get(IDBConnection::class)
+ );
}
public function testGetServerConfigurationPrefixes(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_configuration_active',
's1ldap_configuration_active',
]);
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
$result = $this->helper->getServerConfigurationPrefixes(false);
$this->assertEquals(['', 's1'], $result);
}
public function testGetServerConfigurationPrefixesActive(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_configuration_active',
's1ldap_configuration_active',
]);
- $this->config->method('getAppValue')
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
+ $this->appConfig->method('getValueString')
->willReturnCallback(function ($app, $key, $default) {
- if ($app !== 'user_ldap') {
- $this->fail('wrong app');
- }
if ($key === 's1ldap_configuration_active') {
return '1';
}
@@ -67,21 +75,58 @@ class HelperTest extends \Test\TestCase {
$this->assertEquals(['s1'], $result);
}
- public function testGetServerConfigurationHost(): void {
- $this->config->method('getAppKeys')
- ->with($this->equalTo('user_ldap'))
+ public function testGetServerConfigurationHostFromAppKeys(): void {
+ $this->appConfig->method('getKeys')
+ ->with('user_ldap')
->willReturn([
'foo',
'ldap_host',
's1ldap_host',
's02ldap_host',
+ 'ldap_configuration_active',
+ 's1ldap_configuration_active',
+ 's02ldap_configuration_active',
]);
- $this->config->method('getAppValue')
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturnArgument(2);
+
+ $this->appConfig->method('getValueString')
->willReturnCallback(function ($app, $key, $default) {
- if ($app !== 'user_ldap') {
- $this->fail('wrong app');
+ if ($key === 'ldap_host') {
+ return 'example.com';
}
+ if ($key === 's1ldap_host') {
+ return 'foo.bar.com';
+ }
+ return $default;
+ });
+
+ $result = $this->helper->getServerConfigurationHosts();
+
+ $this->assertEquals([
+ '' => 'example.com',
+ 's1' => 'foo.bar.com',
+ 's02' => '',
+ ], $result);
+ }
+
+ public function testGetServerConfigurationHost(): void {
+ $this->appConfig
+ ->expects(self::never())
+ ->method('getKeys');
+
+ $this->appConfig->method('getValueArray')
+ ->with('user_ldap', 'configuration_prefixes')
+ -> willReturn([
+ '',
+ 's1',
+ 's02',
+ ]);
+
+ $this->appConfig->method('getValueString')
+ ->willReturnCallback(function ($app, $key, $default) {
if ($key === 'ldap_host') {
return 'example.com';
}
diff --git a/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php b/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
index be8d7702cd1..00f8be18586 100644
--- a/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
+++ b/apps/user_ldap/tests/Integration/AbstractIntegrationTest.php
@@ -16,7 +16,6 @@ use OCA\User_LDAP\User\Manager;
use OCA\User_LDAP\UserPluginManager;
use OCP\IAvatarManager;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\Image;
use OCP\IUserManager;
use OCP\Server;
@@ -125,7 +124,7 @@ abstract class AbstractIntegrationTest {
* initializes the test Helper
*/
protected function initHelper() {
- $this->helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $this->helper = Server::get(Helper::class);
}
/**
diff --git a/apps/user_ldap/tests/LDAPProviderTest.php b/apps/user_ldap/tests/LDAPProviderTest.php
index a4da4a91948..57323e374aa 100644
--- a/apps/user_ldap/tests/LDAPProviderTest.php
+++ b/apps/user_ldap/tests/LDAPProviderTest.php
@@ -21,7 +21,6 @@ use OCA\User_LDAP\User_LDAP;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\ICacheFactory;
use OCP\IConfig;
-use OCP\IDBConnection;
use OCP\IServerContainer;
use OCP\Server;
use Psr\Log\LoggerInterface;
@@ -199,7 +198,7 @@ class LDAPProviderTest extends \Test\TestCase {
$server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock());
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$ldapProvider = $this->getLDAPProvider($server);
$this->assertEquals(
@@ -212,7 +211,7 @@ class LDAPProviderTest extends \Test\TestCase {
$server = $this->getServerMock($userBackend, $this->getDefaultGroupBackendMock());
- $helper = new Helper(Server::get(IConfig::class), Server::get(IDBConnection::class));
+ $helper = Server::get(Helper::class);
$ldapProvider = $this->getLDAPProvider($server);
$this->assertEquals(