diff options
Diffstat (limited to 'apps')
184 files changed, 1485 insertions, 509 deletions
diff --git a/apps/admin_audit/l10n/id.js b/apps/admin_audit/l10n/id.js index 441f1940069..144a85299f1 100644 --- a/apps/admin_audit/l10n/id.js +++ b/apps/admin_audit/l10n/id.js @@ -1,7 +1,7 @@ OC.L10N.register( "admin_audit", { - "Auditing / Logging" : "Pemeriksaan / Pencatatan", - "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya." + "Auditing / Logging" : "Pengauditan/Pencatatan", + "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya." }, "nplurals=1; plural=0;"); diff --git a/apps/admin_audit/l10n/id.json b/apps/admin_audit/l10n/id.json index 91af029f895..868f7c94d32 100644 --- a/apps/admin_audit/l10n/id.json +++ b/apps/admin_audit/l10n/id.json @@ -1,5 +1,5 @@ { "translations": { - "Auditing / Logging" : "Pemeriksaan / Pencatatan", - "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud seperti pencatatan akses berkas atau tindakan sensitif lainnya." + "Auditing / Logging" : "Pengauditan/Pencatatan", + "Provides logging abilities for Nextcloud such as logging file accesses or otherwise sensitive actions." : "Menyediakan kemampuan pencatatan untuk Nextcloud, misalnya pencatatan akses file atau tindakan sensitif lainnya." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/dav/appinfo/routes.php b/apps/dav/appinfo/routes.php index d0953add93f..91c1ba58ea2 100644 --- a/apps/dav/appinfo/routes.php +++ b/apps/dav/appinfo/routes.php @@ -11,9 +11,6 @@ return [ ['name' => 'invitation_response#decline', 'url' => '/invitation/decline/{token}', 'verb' => 'GET'], ['name' => 'invitation_response#options', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'GET'], ['name' => 'invitation_response#processMoreOptionsResult', 'url' => '/invitation/moreOptions/{token}', 'verb' => 'POST'], - ['name' => 'example_content#getDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'GET'], - ['name' => 'example_content#setDefaultContact', 'url' => '/api/defaultcontact/contact', 'verb' => 'PUT'], - ['name' => 'example_content#setEnableDefaultContact', 'url' => '/api/defaultcontact/config', 'verb' => 'PUT'], ], 'ocs' => [ ['name' => 'direct#getUrl', 'url' => '/api/v1/direct', 'verb' => 'POST'], diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index 312f30ca8c5..4c48f343c4c 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -366,7 +366,7 @@ return array( 'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php', 'OCA\\DAV\\ServerFactory' => $baseDir . '/../lib/ServerFactory.php', 'OCA\\DAV\\Service\\AbsenceService' => $baseDir . '/../lib/Service/AbsenceService.php', - 'OCA\\DAV\\Service\\DefaultContactService' => $baseDir . '/../lib/Service/DefaultContactService.php', + 'OCA\\DAV\\Service\\ExampleContactService' => $baseDir . '/../lib/Service/ExampleContactService.php', 'OCA\\DAV\\Service\\ExampleEventService' => $baseDir . '/../lib/Service/ExampleEventService.php', 'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => $baseDir . '/../lib/Settings/Admin/SystemAddressBookSettings.php', 'OCA\\DAV\\Settings\\AvailabilitySettings' => $baseDir . '/../lib/Settings/AvailabilitySettings.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index aeb354685bf..4d9166a2d5a 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -381,7 +381,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php', 'OCA\\DAV\\ServerFactory' => __DIR__ . '/..' . '/../lib/ServerFactory.php', 'OCA\\DAV\\Service\\AbsenceService' => __DIR__ . '/..' . '/../lib/Service/AbsenceService.php', - 'OCA\\DAV\\Service\\DefaultContactService' => __DIR__ . '/..' . '/../lib/Service/DefaultContactService.php', + 'OCA\\DAV\\Service\\ExampleContactService' => __DIR__ . '/..' . '/../lib/Service/ExampleContactService.php', 'OCA\\DAV\\Service\\ExampleEventService' => __DIR__ . '/..' . '/../lib/Service/ExampleEventService.php', 'OCA\\DAV\\Settings\\Admin\\SystemAddressBookSettings' => __DIR__ . '/..' . '/../lib/Settings/Admin/SystemAddressBookSettings.php', 'OCA\\DAV\\Settings\\AvailabilitySettings' => __DIR__ . '/..' . '/../lib/Settings/AvailabilitySettings.php', 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/dav/lib/Controller/ExampleContentController.php b/apps/dav/lib/Controller/ExampleContentController.php index 905fd392e6c..e20ee4b7f49 100644 --- a/apps/dav/lib/Controller/ExampleContentController.php +++ b/apps/dav/lib/Controller/ExampleContentController.php @@ -10,6 +10,7 @@ declare(strict_types=1); namespace OCA\DAV\Controller; use OCA\DAV\AppInfo\Application; +use OCA\DAV\Service\ExampleContactService; use OCA\DAV\Service\ExampleEventService; use OCP\AppFramework\ApiController; use OCP\AppFramework\Http; @@ -17,103 +18,50 @@ use OCP\AppFramework\Http\Attribute\FrontpageRoute; use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\JSONResponse; -use OCP\Files\AppData\IAppDataFactory; -use OCP\Files\IAppData; -use OCP\Files\NotFoundException; -use OCP\IAppConfig; -use OCP\IConfig; use OCP\IRequest; use Psr\Log\LoggerInterface; class ExampleContentController extends ApiController { - private IAppData $appData; - public function __construct( IRequest $request, - private IConfig $config, - private IAppConfig $appConfig, - private IAppDataFactory $appDataFactory, - private LoggerInterface $logger, - private ExampleEventService $exampleEventService, + private readonly LoggerInterface $logger, + private readonly ExampleEventService $exampleEventService, + private readonly ExampleContactService $exampleContactService, ) { parent::__construct(Application::APP_ID, $request); - $this->appData = $this->appDataFactory->get('dav'); } - public function setEnableDefaultContact($allow) { - if ($allow === 'yes' && !$this->defaultContactExists()) { + #[FrontpageRoute(verb: 'PUT', url: '/api/defaultcontact/config')] + public function setEnableDefaultContact(bool $allow): JSONResponse { + if ($allow && !$this->exampleContactService->defaultContactExists()) { try { - $this->setCard(); + $this->exampleContactService->setCard(); } catch (\Exception $e) { $this->logger->error('Could not create default contact', ['exception' => $e]); return new JSONResponse([], Http::STATUS_INTERNAL_SERVER_ERROR); } } - $this->config->setAppValue(Application::APP_ID, 'enableDefaultContact', $allow); + $this->exampleContactService->setDefaultContactEnabled($allow); return new JSONResponse([], Http::STATUS_OK); } #[NoCSRFRequired] + #[FrontpageRoute(verb: 'GET', url: '/api/defaultcontact/contact')] public function getDefaultContact(): DataDownloadResponse { - $cardData = $this->getCard() + $cardData = $this->exampleContactService->getCard() ?? file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf'); return new DataDownloadResponse($cardData, 'example_contact.vcf', 'text/vcard'); } + #[FrontpageRoute(verb: 'PUT', url: '/api/defaultcontact/contact')] public function setDefaultContact(?string $contactData = null) { - if (!$this->config->getAppValue(Application::APP_ID, 'enableDefaultContact', 'yes')) { + if (!$this->exampleContactService->isDefaultContactEnabled()) { return new JSONResponse([], Http::STATUS_FORBIDDEN); } - $this->setCard($contactData); + $this->exampleContactService->setCard($contactData); return new JSONResponse([], Http::STATUS_OK); } - private function getCard(): ?string { - try { - $folder = $this->appData->getFolder('defaultContact'); - } catch (NotFoundException $e) { - return null; - } - - if (!$folder->fileExists('defaultContact.vcf')) { - return null; - } - - return $folder->getFile('defaultContact.vcf')->getContent(); - } - - private function setCard(?string $cardData = null) { - try { - $folder = $this->appData->getFolder('defaultContact'); - } catch (NotFoundException $e) { - $folder = $this->appData->newFolder('defaultContact'); - } - - $isCustom = true; - if (is_null($cardData)) { - $cardData = file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf'); - $isCustom = false; - } - - if (!$cardData) { - throw new \Exception('Could not read exampleContact.vcf'); - } - - $file = (!$folder->fileExists('defaultContact.vcf')) ? $folder->newFile('defaultContact.vcf') : $folder->getFile('defaultContact.vcf'); - $file->putContent($cardData); - - $this->appConfig->setValueBool(Application::APP_ID, 'hasCustomDefaultContact', $isCustom); - } - - private function defaultContactExists(): bool { - try { - $folder = $this->appData->getFolder('defaultContact'); - } catch (NotFoundException $e) { - return false; - } - return $folder->fileExists('defaultContact.vcf'); - } - #[FrontpageRoute(verb: 'POST', url: '/api/exampleEvent/enable')] public function setCreateExampleEvent(bool $enable): JSONResponse { $this->exampleEventService->setCreateExampleEvent($enable); diff --git a/apps/dav/lib/Listener/UserEventsListener.php b/apps/dav/lib/Listener/UserEventsListener.php index 67cf228515a..c876192d67f 100644 --- a/apps/dav/lib/Listener/UserEventsListener.php +++ b/apps/dav/lib/Listener/UserEventsListener.php @@ -12,7 +12,7 @@ namespace OCA\DAV\Listener; use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\CardDAV\SyncService; -use OCA\DAV\Service\DefaultContactService; +use OCA\DAV\Service\ExampleContactService; use OCA\DAV\Service\ExampleEventService; use OCP\Accounts\UserUpdatedEvent; use OCP\Defaults; @@ -46,7 +46,7 @@ class UserEventsListener implements IEventListener { private CalDavBackend $calDav, private CardDavBackend $cardDav, private Defaults $themingDefaults, - private DefaultContactService $defaultContactService, + private ExampleContactService $exampleContactService, private ExampleEventService $exampleEventService, private LoggerInterface $logger, ) { @@ -175,7 +175,7 @@ class UserEventsListener implements IEventListener { } } if ($addressBookId) { - $this->defaultContactService->createDefaultContact($addressBookId); + $this->exampleContactService->createDefaultContact($addressBookId); } } } diff --git a/apps/dav/lib/Service/DefaultContactService.php b/apps/dav/lib/Service/DefaultContactService.php deleted file mode 100644 index 24e55ef7b69..00000000000 --- a/apps/dav/lib/Service/DefaultContactService.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php - -declare(strict_types=1); - -/** - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -namespace OCA\DAV\Service; - -use OCA\DAV\AppInfo\Application; -use OCA\DAV\CardDAV\CardDavBackend; -use OCP\App\IAppManager; -use OCP\Files\AppData\IAppDataFactory; -use OCP\IAppConfig; -use Psr\Log\LoggerInterface; -use Symfony\Component\Uid\Uuid; - -class DefaultContactService { - public function __construct( - private CardDavBackend $cardDav, - private IAppManager $appManager, - private IAppDataFactory $appDataFactory, - private IAppConfig $config, - private LoggerInterface $logger, - ) { - } - - public function createDefaultContact(int $addressBookId): void { - $enableDefaultContact = $this->config->getValueString(Application::APP_ID, 'enableDefaultContact', 'yes'); - if ($enableDefaultContact !== 'yes') { - return; - } - $appData = $this->appDataFactory->get('dav'); - try { - $folder = $appData->getFolder('defaultContact'); - $defaultContactFile = $folder->getFile('defaultContact.vcf'); - $data = $defaultContactFile->getContent(); - } catch (\Exception $e) { - $this->logger->error('Couldn\'t get default contact file', ['exception' => $e]); - return; - } - - // Make sure the UID is unique - $newUid = Uuid::v4()->toRfc4122(); - $newRev = date('Ymd\THis\Z'); - $vcard = \Sabre\VObject\Reader::read($data, \Sabre\VObject\Reader::OPTION_FORGIVING); - if ($vcard->UID) { - $vcard->UID->setValue($newUid); - } else { - $vcard->add('UID', $newUid); - } - if ($vcard->REV) { - $vcard->REV->setValue($newRev); - } else { - $vcard->add('REV', $newRev); - } - - // Level 3 means that the document is invalid - // https://sabre.io/vobject/vcard/#validating-vcard - $level3Warnings = array_filter($vcard->validate(), function ($warning) { - return $warning['level'] === 3; - }); - - if (!empty($level3Warnings)) { - $this->logger->error('Default contact is invalid', ['warnings' => $level3Warnings]); - return; - } - try { - $this->cardDav->createCard($addressBookId, 'default', $vcard->serialize(), false); - } catch (\Exception $e) { - $this->logger->error($e->getMessage(), ['exception' => $e]); - } - - } -} diff --git a/apps/dav/lib/Service/ExampleContactService.php b/apps/dav/lib/Service/ExampleContactService.php new file mode 100644 index 00000000000..6ed6c66cbb3 --- /dev/null +++ b/apps/dav/lib/Service/ExampleContactService.php @@ -0,0 +1,132 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\DAV\Service; + +use OCA\DAV\AppInfo\Application; +use OCA\DAV\CardDAV\CardDavBackend; +use OCP\AppFramework\Services\IAppConfig; +use OCP\Files\AppData\IAppDataFactory; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use Psr\Log\LoggerInterface; +use Symfony\Component\Uid\Uuid; + +class ExampleContactService { + private readonly IAppData $appData; + + public function __construct( + IAppDataFactory $appDataFactory, + private readonly IAppConfig $appConfig, + private readonly LoggerInterface $logger, + private readonly CardDavBackend $cardDav, + ) { + $this->appData = $appDataFactory->get(Application::APP_ID); + } + + public function isDefaultContactEnabled(): bool { + return $this->appConfig->getAppValueBool('enableDefaultContact', true); + } + + public function setDefaultContactEnabled(bool $value): void { + $this->appConfig->setAppValueBool('enableDefaultContact', $value); + } + + public function getCard(): ?string { + try { + $folder = $this->appData->getFolder('defaultContact'); + } catch (NotFoundException $e) { + return null; + } + + if (!$folder->fileExists('defaultContact.vcf')) { + return null; + } + + return $folder->getFile('defaultContact.vcf')->getContent(); + } + + public function setCard(?string $cardData = null) { + try { + $folder = $this->appData->getFolder('defaultContact'); + } catch (NotFoundException $e) { + $folder = $this->appData->newFolder('defaultContact'); + } + + $isCustom = true; + if (is_null($cardData)) { + $cardData = file_get_contents(__DIR__ . '/../ExampleContentFiles/exampleContact.vcf'); + $isCustom = false; + } + + if (!$cardData) { + throw new \Exception('Could not read exampleContact.vcf'); + } + + $file = (!$folder->fileExists('defaultContact.vcf')) ? $folder->newFile('defaultContact.vcf') : $folder->getFile('defaultContact.vcf'); + $file->putContent($cardData); + + $this->appConfig->setAppValueBool('hasCustomDefaultContact', $isCustom); + } + + public function defaultContactExists(): bool { + try { + $folder = $this->appData->getFolder('defaultContact'); + } catch (NotFoundException $e) { + return false; + } + return $folder->fileExists('defaultContact.vcf'); + } + + public function createDefaultContact(int $addressBookId): void { + if (!$this->isDefaultContactEnabled()) { + return; + } + + try { + $folder = $this->appData->getFolder('defaultContact'); + $defaultContactFile = $folder->getFile('defaultContact.vcf'); + $data = $defaultContactFile->getContent(); + } catch (\Exception $e) { + $this->logger->error('Couldn\'t get default contact file', ['exception' => $e]); + return; + } + + // Make sure the UID is unique + $newUid = Uuid::v4()->toRfc4122(); + $newRev = date('Ymd\THis\Z'); + $vcard = \Sabre\VObject\Reader::read($data, \Sabre\VObject\Reader::OPTION_FORGIVING); + if ($vcard->UID) { + $vcard->UID->setValue($newUid); + } else { + $vcard->add('UID', $newUid); + } + if ($vcard->REV) { + $vcard->REV->setValue($newRev); + } else { + $vcard->add('REV', $newRev); + } + + // Level 3 means that the document is invalid + // https://sabre.io/vobject/vcard/#validating-vcard + $level3Warnings = array_filter($vcard->validate(), static function ($warning) { + return $warning['level'] === 3; + }); + + if (!empty($level3Warnings)) { + $this->logger->error('Default contact is invalid', ['warnings' => $level3Warnings]); + return; + } + try { + $this->cardDav->createCard($addressBookId, 'default', $vcard->serialize(), false); + } catch (\Exception $e) { + $this->logger->error($e->getMessage(), ['exception' => $e]); + } + } +} diff --git a/apps/dav/lib/Settings/ExampleContentSettings.php b/apps/dav/lib/Settings/ExampleContentSettings.php index fef2d25b8d2..7b6f9b03a3a 100644 --- a/apps/dav/lib/Settings/ExampleContentSettings.php +++ b/apps/dav/lib/Settings/ExampleContentSettings.php @@ -9,21 +9,21 @@ declare(strict_types=1); namespace OCA\DAV\Settings; use OCA\DAV\AppInfo\Application; +use OCA\DAV\Service\ExampleContactService; use OCA\DAV\Service\ExampleEventService; use OCP\App\IAppManager; use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IAppConfig; use OCP\AppFramework\Services\IInitialState; -use OCP\IAppConfig; -use OCP\IConfig; use OCP\Settings\ISettings; class ExampleContentSettings implements ISettings { public function __construct( - private readonly IConfig $config, private readonly IAppConfig $appConfig, private readonly IInitialState $initialState, private readonly IAppManager $appManager, private readonly ExampleEventService $exampleEventService, + private readonly ExampleContactService $exampleContactService, ) { } @@ -43,11 +43,13 @@ class ExampleContentSettings implements ISettings { } if ($contactsEnabled) { - $enableDefaultContact = $this->config->getAppValue(Application::APP_ID, 'enableDefaultContact', 'yes'); - $this->initialState->provideInitialState('enableDefaultContact', $enableDefaultContact); + $this->initialState->provideInitialState( + 'enableDefaultContact', + $this->exampleContactService->isDefaultContactEnabled(), + ); $this->initialState->provideInitialState( 'hasCustomDefaultContact', - $this->appConfig->getValueBool(Application::APP_ID, 'hasCustomDefaultContact'), + $this->appConfig->getAppValueBool('hasCustomDefaultContact'), ); } diff --git a/apps/dav/src/components/ExampleContactSettings.vue b/apps/dav/src/components/ExampleContactSettings.vue index 0e34c7a12da..cdfdc130189 100644 --- a/apps/dav/src/components/ExampleContactSettings.vue +++ b/apps/dav/src/components/ExampleContactSettings.vue @@ -63,7 +63,7 @@ import IconCheck from '@mdi/svg/svg/check.svg?raw' import logger from '../service/logger.js' import ExampleContentDownloadButton from './ExampleContentDownloadButton.vue' -const enableDefaultContact = loadState('dav', 'enableDefaultContact') === 'yes' +const enableDefaultContact = loadState('dav', 'enableDefaultContact') const hasCustomDefaultContact = loadState('dav', 'hasCustomDefaultContact') export default { @@ -106,7 +106,7 @@ export default { methods: { updateEnableDefaultContact() { axios.put(generateUrl('apps/dav/api/defaultcontact/config'), { - allow: this.enableDefaultContact ? 'no' : 'yes', + allow: !this.enableDefaultContact, }).then(() => { this.enableDefaultContact = !this.enableDefaultContact }).catch(() => { diff --git a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php index f03343af008..40d2fb62431 100644 --- a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php +++ b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php @@ -14,7 +14,7 @@ use OCA\DAV\CalDAV\CalDavBackend; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\CardDAV\SyncService; use OCA\DAV\Listener\UserEventsListener; -use OCA\DAV\Service\DefaultContactService; +use OCA\DAV\Service\ExampleContactService; use OCA\DAV\Service\ExampleEventService; use OCP\Defaults; use OCP\IUser; @@ -29,7 +29,7 @@ class UserEventsListenerTest extends TestCase { private CalDavBackend&MockObject $calDavBackend; private CardDavBackend&MockObject $cardDavBackend; private Defaults&MockObject $defaults; - private DefaultContactService&MockObject $defaultContactService; + private ExampleContactService&MockObject $exampleContactService; private ExampleEventService&MockObject $exampleEventService; private LoggerInterface&MockObject $logger; @@ -43,7 +43,7 @@ class UserEventsListenerTest extends TestCase { $this->calDavBackend = $this->createMock(CalDavBackend::class); $this->cardDavBackend = $this->createMock(CardDavBackend::class); $this->defaults = $this->createMock(Defaults::class); - $this->defaultContactService = $this->createMock(DefaultContactService::class); + $this->exampleContactService = $this->createMock(ExampleContactService::class); $this->exampleEventService = $this->createMock(ExampleEventService::class); $this->logger = $this->createMock(LoggerInterface::class); @@ -53,7 +53,7 @@ class UserEventsListenerTest extends TestCase { $this->calDavBackend, $this->cardDavBackend, $this->defaults, - $this->defaultContactService, + $this->exampleContactService, $this->exampleEventService, $this->logger, ); diff --git a/apps/dav/tests/unit/Service/DefaultContactServiceTest.php b/apps/dav/tests/unit/Service/ExampleContactServiceTest.php index 3bd8c9cb6f6..4c8d900ae86 100644 --- a/apps/dav/tests/unit/Service/DefaultContactServiceTest.php +++ b/apps/dav/tests/unit/Service/ExampleContactServiceTest.php @@ -10,56 +10,60 @@ declare(strict_types=1); namespace OCA\DAV\Tests\unit\Service; use OCA\DAV\CardDAV\CardDavBackend; -use OCA\DAV\Service\DefaultContactService; +use OCA\DAV\Service\ExampleContactService; use OCP\App\IAppManager; +use OCP\AppFramework\Services\IAppConfig; use OCP\Files\AppData\IAppDataFactory; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; use OCP\Files\SimpleFS\ISimpleFolder; -use OCP\IAppConfig; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Symfony\Component\Uid\Uuid; use Test\TestCase; -class DefaultContactServiceTest extends TestCase { - protected DefaultContactService $service; +class ExampleContactServiceTest extends TestCase { + protected ExampleContactService $service; protected CardDavBackend&MockObject $cardDav; protected IAppManager&MockObject $appManager; protected IAppDataFactory&MockObject $appDataFactory; protected LoggerInterface&MockObject $logger; - protected IAppConfig&MockObject $config; + protected IAppConfig&MockObject $appConfig; + protected IAppData&MockObject $appData; protected function setUp(): void { parent::setUp(); $this->cardDav = $this->createMock(CardDavBackend::class); - $this->appManager = $this->createMock(IAppManager::class); $this->appDataFactory = $this->createMock(IAppDataFactory::class); $this->logger = $this->createMock(LoggerInterface::class); - $this->config = $this->createMock(IAppConfig::class); + $this->appConfig = $this->createMock(IAppConfig::class); - $this->service = new DefaultContactService( - $this->cardDav, - $this->appManager, + $this->appData = $this->createMock(IAppData::class); + $this->appDataFactory->method('get') + ->with('dav') + ->willReturn($this->appData); + + $this->service = new ExampleContactService( $this->appDataFactory, - $this->config, + $this->appConfig, $this->logger, + $this->cardDav, ); } public function testCreateDefaultContactWithInvalidCard(): void { // Invalid vCard missing required FN property $vcardContent = "BEGIN:VCARD\nVERSION:3.0\nEND:VCARD"; - $this->config->method('getValueString')->willReturn('yes'); - $appData = $this->createMock(IAppData::class); + $this->appConfig->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn(true); $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $file->method('getContent')->willReturn($vcardContent); $folder->method('getFile')->willReturn($file); - $appData->method('getFolder')->willReturn($folder); - $this->appDataFactory->method('get')->willReturn($appData); + $this->appData->method('getFolder')->willReturn($folder); $this->logger->expects($this->once()) ->method('error') @@ -76,14 +80,14 @@ class DefaultContactServiceTest extends TestCase { $originalRev = '20200101T000000Z'; $vcardContent = "BEGIN:VCARD\nVERSION:3.0\nFN:Test User\nUID:$originalUid\nREV:$originalRev\nEND:VCARD"; - $this->config->method('getValueString')->willReturn('yes'); - $appData = $this->createMock(IAppData::class); + $this->appConfig->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn(true); $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $file->method('getContent')->willReturn($vcardContent); $folder->method('getFile')->willReturn($file); - $appData->method('getFolder')->willReturn($folder); - $this->appDataFactory->method('get')->willReturn($appData); + $this->appData->method('getFolder')->willReturn($folder); $capturedCardData = null; $this->cardDav->expects($this->once()) @@ -107,10 +111,10 @@ class DefaultContactServiceTest extends TestCase { } public function testDefaultContactFileDoesNotExist(): void { - $appData = $this->createMock(IAppData::class); - $this->config->method('getValueString')->willReturn('yes'); - $appData->method('getFolder')->willThrowException(new NotFoundException()); - $this->appDataFactory->method('get')->willReturn($appData); + $this->appConfig->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn(true); + $this->appData->method('getFolder')->willThrowException(new NotFoundException()); $this->cardDav->expects($this->never()) ->method('createCard'); @@ -121,14 +125,14 @@ class DefaultContactServiceTest extends TestCase { public function testUidAndRevAreAddedIfMissing(): void { $vcardContent = "BEGIN:VCARD\nVERSION:3.0\nFN:Test User\nEND:VCARD"; - $this->config->method('getValueString')->willReturn('yes'); - $appData = $this->createMock(IAppData::class); + $this->appConfig->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn(true); $folder = $this->createMock(ISimpleFolder::class); $file = $this->createMock(ISimpleFile::class); $file->method('getContent')->willReturn($vcardContent); $folder->method('getFile')->willReturn($file); - $appData->method('getFolder')->willReturn($folder); - $this->appDataFactory->method('get')->willReturn($appData); + $this->appData->method('getFolder')->willReturn($folder); $capturedCardData = 'new-card-data'; @@ -154,7 +158,9 @@ class DefaultContactServiceTest extends TestCase { } public function testDefaultContactIsNotCreatedIfEnabled(): void { - $this->config->method('getValueString')->willReturn('no'); + $this->appConfig->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn(false); $this->logger->expects($this->never()) ->method('error'); $this->cardDav->expects($this->never()) @@ -162,4 +168,27 @@ class DefaultContactServiceTest extends TestCase { $this->service->createDefaultContact(123); } + + public static function provideDefaultContactEnableData(): array { + return [[true], [false]]; + } + + /** @dataProvider provideDefaultContactEnableData */ + public function testIsDefaultContactEnabled(bool $enabled): void { + $this->appConfig->expects(self::once()) + ->method('getAppValueBool') + ->with('enableDefaultContact', true) + ->willReturn($enabled); + + $this->assertEquals($enabled, $this->service->isDefaultContactEnabled()); + } + + /** @dataProvider provideDefaultContactEnableData */ + public function testSetDefaultContactEnabled(bool $enabled): void { + $this->appConfig->expects(self::once()) + ->method('setAppValueBool') + ->with('enableDefaultContact', $enabled); + + $this->service->setDefaultContactEnabled($enabled); + } } diff --git a/apps/encryption/l10n/et_EE.js b/apps/encryption/l10n/et_EE.js index 1dd886792e6..70de2cc0c46 100644 --- a/apps/encryption/l10n/et_EE.js +++ b/apps/encryption/l10n/et_EE.js @@ -1,46 +1,55 @@ OC.L10N.register( "encryption", { - "Missing recovery key password" : "Muuda taastevõtme parool", - "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli", - "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu", + "Missing recovery key password" : "Muuda taastevõtme salasõna", + "Please repeat the recovery key password" : "Palun korda uut taastevõtme salasõna", + "Repeated recovery key password does not match the provided recovery key password" : "Sisestatud taastevõtme salasõna ei kattu", "Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus", - "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud lubada taastevõtit. Palun kontrolli oma taastevõtme parooli!", + "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtit kasutusele võtta. Palun kontrolli oma taastevõtme salasõna!", "Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus", - "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!", + "Could not disable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtme kasutamist lõpetada. Palun kontrolli oma taastevõtme salasõna!", "Missing parameters" : "Parameetrid puuduvad", "Please provide the old recovery password" : "Palun sisesta vana taastevõtme salasõna", "Please provide a new recovery password" : "Palun sisesta uus taastevõtme salasõna", - "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli", - "Password successfully changed." : "Parool edukalt vahetatud.", - "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.", + "Please repeat the new recovery password" : "Palun korda uut taastevõtme salasõna", + "Password successfully changed." : "Salasõna vahetamine õnnestus.", + "Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.", "Recovery Key disabled" : "Taastevõti on välja lülitatud", "Recovery Key enabled" : "Taastevõti on sisse lülitatud", - "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.", - "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.", - "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.", - "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.", + "Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.", + "The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.", + "The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.", + "Private key password successfully updated." : "Privaatvõtme salasõna uuendamine õnnestus.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Krüptimisrakenduse vigane privaatvõti. Taastamaks ligipääsu krüptitud failidele palun uuenda oma isiklikest seadistustest privaatvõtme salasõna.", "Bad Signature" : "Vigane allkiri", "Missing Signature" : "Allkiri puudub", + "one-time password for server-side-encryption" : "ühekordne salasõna serveripoolse krüptimise jaoks", "Encryption password" : "Krüptimise salasõna", "The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga <strong>%s</strong>.", "The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga „%s“.", + "Default encryption module" : "Vaikimisi krüptimismoodul", + "Default encryption module for server-side encryption" : "Vaikimisi krüptimismoodul serveripoolse krüptimise jaoks", + "Encrypt the home storage" : "Krüpti ka sisemine andmeruum", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Selle valiku kasutamisel krüptitakse failid sisemises ja välises andmeruumis. Vastasel juhul vaid välises andmeruumis.", "Enable recovery key" : "Luba taastevõtme kasutamine", "Disable recovery key" : "Keela taastevõtme kasutamine", - "Recovery key password" : "Taastevõtme parool", - "Repeat recovery key password" : "Korda taastevõtme parooli", - "Change recovery key password:" : "Muuda taastevõtme parooli:", - "Old recovery key password" : "Vana taastevõtme parool", - "New recovery key password" : "Uus taastevõtme parool", - "Repeat new recovery key password" : "Korda uut taastevõtme parooli", - "Change Password" : "Muuda parooli", - "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.", - "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.", - "Old log-in password" : "Vana sisselogimise parool", - "Current log-in password" : "Praegune sisselogimise parool", - "Update Private Key Password" : "Uuenda privaatse võtme parooli", - "Enable password recovery:" : "Luba parooli taaste:", - "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul", + "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.", + "Recovery key password" : "Taastevõtme salasõna", + "Repeat recovery key password" : "Korda taastevõtme salasõna", + "Change recovery key password:" : "Muuda taastevõtme salasõna:", + "Old recovery key password" : "Vana taastevõtme salasõna", + "New recovery key password" : "Uus taastevõtme salasõna", + "Repeat new recovery key password" : "Korda uut taastevõtme salasõna", + "Change Password" : "Muuda salasõna", + "Basic encryption module" : "Lihtkrüptimise moodul", + "Your private key password no longer matches your log-in password." : "Sinu privaatvõtme salasõna ei kattu enam sinu sisselogimise salasõna.", + "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme salasõnaks oma praegune sisselogimise salasõna.", + "If you do not remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana salasõna, siis palu oma süsteemihalduril taastada ligipääs failidele.", + "Old log-in password" : "Sisselogimise vana salasõna", + "Current log-in password" : "Sisselogimise praegune salasõna", + "Update Private Key Password" : "Uuenda privaatvõtme salasõna", + "Enable password recovery:" : "Luba salasõna taastamine:", + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele", "Enabled" : "Sisse lülitatud", "Disabled" : "Välja lülitatud" }, diff --git a/apps/encryption/l10n/et_EE.json b/apps/encryption/l10n/et_EE.json index 1f1cad621d0..bd7a9d32858 100644 --- a/apps/encryption/l10n/et_EE.json +++ b/apps/encryption/l10n/et_EE.json @@ -1,44 +1,53 @@ { "translations": { - "Missing recovery key password" : "Muuda taastevõtme parool", - "Please repeat the recovery key password" : "Palun korda uut taastevõtme parooli", - "Repeated recovery key password does not match the provided recovery key password" : "Lahtritesse sisestatud taastevõtme paroolid ei kattu", + "Missing recovery key password" : "Muuda taastevõtme salasõna", + "Please repeat the recovery key password" : "Palun korda uut taastevõtme salasõna", + "Repeated recovery key password does not match the provided recovery key password" : "Sisestatud taastevõtme salasõna ei kattu", "Recovery key successfully enabled" : "Taastevõtme lubamine õnnestus", - "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud lubada taastevõtit. Palun kontrolli oma taastevõtme parooli!", + "Could not enable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtit kasutusele võtta. Palun kontrolli oma taastevõtme salasõna!", "Recovery key successfully disabled" : "Taastevõtme keelamine õnnestus", - "Could not disable recovery key. Please check your recovery key password!" : "Ei suuda keelata taastevõtit. Palun kontrolli oma taastevõtme parooli!", + "Could not disable recovery key. Please check your recovery key password!" : "Ei suutnud taastevõtme kasutamist lõpetada. Palun kontrolli oma taastevõtme salasõna!", "Missing parameters" : "Parameetrid puuduvad", "Please provide the old recovery password" : "Palun sisesta vana taastevõtme salasõna", "Please provide a new recovery password" : "Palun sisesta uus taastevõtme salasõna", - "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli", - "Password successfully changed." : "Parool edukalt vahetatud.", - "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.", + "Please repeat the new recovery password" : "Palun korda uut taastevõtme salasõna", + "Password successfully changed." : "Salasõna vahetamine õnnestus.", + "Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.", "Recovery Key disabled" : "Taastevõti on välja lülitatud", "Recovery Key enabled" : "Taastevõti on sisse lülitatud", - "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.", - "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.", - "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.", - "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.", + "Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.", + "The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.", + "The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.", + "Private key password successfully updated." : "Privaatvõtme salasõna uuendamine õnnestus.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Krüptimisrakenduse vigane privaatvõti. Taastamaks ligipääsu krüptitud failidele palun uuenda oma isiklikest seadistustest privaatvõtme salasõna.", "Bad Signature" : "Vigane allkiri", "Missing Signature" : "Allkiri puudub", + "one-time password for server-side-encryption" : "ühekordne salasõna serveripoolse krüptimise jaoks", "Encryption password" : "Krüptimise salasõna", "The administration enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga <strong>%s</strong>.", "The administration enabled server-side-encryption. Your files were encrypted using the password \"%s\"." : "Serveri peakasutaja lülitas sisse serveripoolse krüptimise. Sinu failid on krüptitud salasõnaga „%s“.", + "Default encryption module" : "Vaikimisi krüptimismoodul", + "Default encryption module for server-side encryption" : "Vaikimisi krüptimismoodul serveripoolse krüptimise jaoks", + "Encrypt the home storage" : "Krüpti ka sisemine andmeruum", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Selle valiku kasutamisel krüptitakse failid sisemises ja välises andmeruumis. Vastasel juhul vaid välises andmeruumis.", "Enable recovery key" : "Luba taastevõtme kasutamine", "Disable recovery key" : "Keela taastevõtme kasutamine", - "Recovery key password" : "Taastevõtme parool", - "Repeat recovery key password" : "Korda taastevõtme parooli", - "Change recovery key password:" : "Muuda taastevõtme parooli:", - "Old recovery key password" : "Vana taastevõtme parool", - "New recovery key password" : "Uus taastevõtme parool", - "Repeat new recovery key password" : "Korda uut taastevõtme parooli", - "Change Password" : "Muuda parooli", - "Your private key password no longer matches your log-in password." : "Sinu provaatvõtme parool ei kattu enam sinu sisselogimise parooliga.", - "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme parooliks oma praegune sisselogimise parool.", - "Old log-in password" : "Vana sisselogimise parool", - "Current log-in password" : "Praegune sisselogimise parool", - "Update Private Key Password" : "Uuenda privaatse võtme parooli", - "Enable password recovery:" : "Luba parooli taaste:", - "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parooli kaotuse puhul", + "The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.", + "Recovery key password" : "Taastevõtme salasõna", + "Repeat recovery key password" : "Korda taastevõtme salasõna", + "Change recovery key password:" : "Muuda taastevõtme salasõna:", + "Old recovery key password" : "Vana taastevõtme salasõna", + "New recovery key password" : "Uus taastevõtme salasõna", + "Repeat new recovery key password" : "Korda uut taastevõtme salasõna", + "Change Password" : "Muuda salasõna", + "Basic encryption module" : "Lihtkrüptimise moodul", + "Your private key password no longer matches your log-in password." : "Sinu privaatvõtme salasõna ei kattu enam sinu sisselogimise salasõna.", + "Set your old private key password to your current log-in password:" : "Pane oma vana privaatvõtme salasõnaks oma praegune sisselogimise salasõna.", + "If you do not remember your old password you can ask your administrator to recover your files." : "Kui sa ei mäleta oma vana salasõna, siis palu oma süsteemihalduril taastada ligipääs failidele.", + "Old log-in password" : "Sisselogimise vana salasõna", + "Current log-in password" : "Sisselogimise praegune salasõna", + "Update Private Key Password" : "Uuenda privaatvõtme salasõna", + "Enable password recovery:" : "Luba salasõna taastamine:", + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele", "Enabled" : "Sisse lülitatud", "Disabled" : "Välja lülitatud" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/federatedfilesharing/l10n/et_EE.js b/apps/federatedfilesharing/l10n/et_EE.js index cc498be6c35..a8d5b5bf547 100644 --- a/apps/federatedfilesharing/l10n/et_EE.js +++ b/apps/federatedfilesharing/l10n/et_EE.js @@ -4,7 +4,7 @@ OC.L10N.register( "Invalid Federated Cloud ID" : "Vigane liitpilve ID", "Server to server sharing is not enabled on this server" : "Serveritevaheline jagamine ei ole selle pilves aktiiveeritud", "Couldn't establish a federated share." : "Liitjagamist ei õnnestunud luua", - "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, ehk oli parool vale.", + "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, vast oli salasõna vale.", "Federated Share request sent, you will receive an invitation. Check your notifications." : "Liitjagamise päring edastatud, sulle saadetakse kutse. Kontrolli oma teateid.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Liitjagamist ei saanud luua, näib, et liitmiseks mõeldud server on liiga vana (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "Sellest serverist ei ole lubatud liitrühma jagamisi saata.", @@ -65,7 +65,7 @@ OC.L10N.register( "Add remote share" : "Lisa kaugjagamine", "Remote share" : "Kaugjagamine", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?", - "Remote share password" : "Kaugjagamise parool", + "Remote share password" : "Kaugjagamise salasõna", "Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/et_EE.json b/apps/federatedfilesharing/l10n/et_EE.json index 81dd979414c..894a5a54dcc 100644 --- a/apps/federatedfilesharing/l10n/et_EE.json +++ b/apps/federatedfilesharing/l10n/et_EE.json @@ -2,7 +2,7 @@ "Invalid Federated Cloud ID" : "Vigane liitpilve ID", "Server to server sharing is not enabled on this server" : "Serveritevaheline jagamine ei ole selle pilves aktiiveeritud", "Couldn't establish a federated share." : "Liitjagamist ei õnnestunud luua", - "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, ehk oli parool vale.", + "Couldn't establish a federated share, maybe the password was wrong." : "Liitjagamist ei õnnestunud luua, vast oli salasõna vale.", "Federated Share request sent, you will receive an invitation. Check your notifications." : "Liitjagamise päring edastatud, sulle saadetakse kutse. Kontrolli oma teateid.", "Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Liitjagamist ei saanud luua, näib, et liitmiseks mõeldud server on liiga vana (Nextcloud <= 9).", "It is not allowed to send federated group shares from this server." : "Sellest serverist ei ole lubatud liitrühma jagamisi saata.", @@ -63,7 +63,7 @@ "Add remote share" : "Lisa kaugjagamine", "Remote share" : "Kaugjagamine", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?", - "Remote share password" : "Kaugjagamise parool", + "Remote share password" : "Kaugjagamise salasõna", "Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index 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..e212852abaa 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", @@ -455,6 +455,7 @@ OC.L10N.register( "New text file.txt" : "Nuovo file di testo.txt", "%1$s (renamed)" : "%1$s (rinominato)", "renamed file" : "file rinominato", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.", "{count} files could not be converted" : "{count} file non possono essere convertiti", "{count} files successfully converted" : "{count} file convertiti con successo" }, diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 0c71fc93b41..c75a3e590ae 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", @@ -453,6 +453,7 @@ "New text file.txt" : "Nuovo file di testo.txt", "%1$s (renamed)" : "%1$s (rinominato)", "renamed file" : "file rinominato", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Dopo aver abilitato i nomi file compatibili con Windows, i file esistenti non potranno più essere modificati, ma potranno essere rinominati con nuovi nomi validi dal rispettivo proprietario.", "{count} files could not be converted" : "{count} file non possono essere convertiti", "{count} files successfully converted" : "{count} file convertiti con successo" },"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" 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..4cbe3219c2f 100644 --- a/apps/files/l10n/sw.js +++ b/apps/files/l10n/sw.js @@ -5,7 +5,7 @@ OC.L10N.register( "Removed from favorites" : "Imeondolewa kutoka vipendwa", "You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako", "You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako", - "Favorites" : "Vipendwa", + "Favorites" : "Vinavyopendwa", "File changes" : "Mabadiliko ya faili", "Created by {user}" : "Imetengenezwa na {user}", "Changed by {user}" : "Imebadilishwa na {user}", @@ -124,7 +124,7 @@ 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", + "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"], "{usedQuotaByte} used" : "{usedQuotaByte}imetumika", "{used} of {quota} used" : "{used} ya {quota}imetumika", "{relative}% used" : "{relative}% imetumika", @@ -186,6 +186,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 +202,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,15 +215,48 @@ 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", "Tags" : "Maoni", + "Blank" : "Mabano", + "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo", + "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}", + "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa", "Creating file" : "Inatengeneza faili", "Save as {displayName}" : "Hifadhi kama {displayName}", "Save as …" : "Hifadhi kama", + "Converting files …" : "Inageuza mafaili", + "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}", + "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa", + "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}", + "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"], + "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"], + "Files successfully converted" : "Faili zimegeuzwa kikamilifu", + "Failed to convert files" : "Imeshindwa kugeuza faili", + "Converting file …" : "Inageuza faili", + "File successfully converted" : "Faili imegeuzwa kikamilifu", + "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}", + "Failed to convert file" : "Imeshindwa kugeuza faili", + "Deletion cancelled" : "Ufutaji umesitishwa", + "Leave this share" : "Ondoa ushirikishaji huu", + "Leave these shares" : "Ondoa shiriki hizi", + "Disconnect storage" : "Achanisha uhifadhi", + "Disconnect storages" : "Achanisha hifadhi", "Delete permanently" : "Futa moja kwa moja", "Delete and unshare" : "Futa na usishirikishe", "Delete file" : "Futa faili", @@ -229,49 +273,190 @@ OC.L10N.register( "You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe", "(copy)" : "(nakili)", "(copy %n)" : "(nakili %n)", + "Move cancelled" : "Uhamishaji umeghairishwa", + "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki", + "The files are locked" : "Faili zimezuiliwa", + "The file does not exist anymore" : "Faili halipo tena", + "Choose destination" : "Chagua eneo lengwa", "Copy to {target}" : "Nakili kwenda {target}", "Copy" : "Nakili", "Move to {target}" : "Hamishia {target}", "Move" : "Hamisha", + "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana", "Move or copy" : "Hamisha au nakili", + "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"", + "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili", "Open folder {displayName}" : "Fungua kisanduku {displayName}", "Open in Files" : "Fungua ndani ya faili", "Open locally" : "Fungua kikawaida", "Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja", "Open file locally" : "Fungua faili kikawaida", + "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.", + "Retry and close" : "Jaribu upya kisha funga", "Open online" : "Fungua mtandaoni", "Rename" : "Ipe jina jipya", "Open details" : "Fungua maelezo", + "View in folder" : "Angalia ndani ya kisanduku", "Today" : "Leo", "Last 7 days" : "Siku 7 zilizopita", "Last 30 days" : "Siku 30 zilizopita", "This year ({year})" : "Mwaka huu {year}", "Last year ({year})" : "Mwaka uliopita {year}", "Documents" : "Nyaraka", + "Spreadsheets" : "Lahajedwali", "Presentations" : "Uwasilishaji", "PDFs" : "PDFs", "Folders" : "Visanduku", "Audio" : "Sauti", + "Photos and images" : "Picha na taswira", "Videos" : "Picha mjongeo", + "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa", + "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"", + "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo", + "Create templates folder" : "Imetengeneza kisanduku cha violezo", + "Templates" : "Violezo", + "New template folder" : "Kisanduku kipya cha violezo", "In folder" : "Ndani ya kisanduku", "Search in folder: {folder}" : "Tafuta katika kisanduku {folder}", + "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa", + "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa\n ", "No files to upload" : "Hakuna faili la kupakia", + "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}", + "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa", + "Files uploaded successfully" : "Faili zimepakiwa kikamilifu", "No files to process" : "Hakuna faili la kuchakata", + "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa", + "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa", "Files copied successfully" : "Faili limenakiliwa kikamilifu", "Files moved successfully" : "Faili limeondolewa kikamilifu", + "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa", "Upload cancelled" : "Upakiaji umesitishwa", + "This operation is forbidden" : "Opereshini hii imezuiwa", + "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi", + "Storage is temporarily not available" : "Uhifadhi haupo kwa muda", "Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}", + "_%n file_::_%n files_" : ["%n file","%n faili"], + "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"], + "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"], + "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu", + "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili", + "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili", + "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa", + "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"", + "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa", + "No favorites yet" : "Bado hakuna vinavyopendwa", + "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa", + "All files" : "Faili zote", + "List of your files and folders." : "Orodha ya faili na vikasha vyako", + "All folders" : "Vikasha vyote", + "Personal files" : "Faili binafsi", + "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa", + "No personal files found" : "Hakuna faili binafsi zilizopatikana", + "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa", + "Recent" : "Hivi karibuni", + "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni", + "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni", + "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa", + "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili", + "Select all" : "Chagua zote", + "Upload too large" : "Upakiaji mkubwa mno", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.", + "File could not be found" : "Faili isingeweza kupatikana", "Download" : "Pakua", + "Show list view" : "Onesha mwonekeno wa orodha", + "Show grid view" : "Onesha mwonekano wa mstariramani", "Close" : "Funga", + "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"", + "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa", + "Upload cancelled." : "Upakiaji umesitishwa ", + "Processing files …" : "Faili zinazochakatwa", + "…" : "...", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee", + "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena", + "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea", + "File could not be uploaded" : "Faili isingeweza kupakia", "Uploading …" : "Inapakia", + "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})", + "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})", + "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi", + "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}", + "Choose target folder" : "Chagua kasha lililolengwa", + "Set reminder" : "Weka ukumbusho", + "Edit locally" : "Hariri kikawaida", "Open" : "Fungua", + "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"", "Details" : "Maelezo ya kina", + "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi", + "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi", + "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"", + "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"", + "Unable to determine date" : "Haiwezi kuamua tarehe", + "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo", + "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"", "copy" : "Nakili", + "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo", "Could not copy \"{file}\"" : "Haikuweza kunakili {file}", + "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}", + "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}", + "{newName} already exists" : "{newName} lipo tayari", + "Could not rename \"{fileName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{fileName}\", halipo tena", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{targetName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti", + "Could not rename \"{fileName}\"" : "Haikuweza kuita jina jipya \"{fileName}\"", + "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari", + "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari", + "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"", + "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"", + "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}", + "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine", + "{dirs} and {files}" : "{dirs} na {files}", + "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"], + "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa", + "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"], "New" : "Mpya", + "New file/folder menu" : "Faili mpya/ menyu ya kisanduku", + "Select file range" : "Chagua safu ya faili", + "{used}%" : "{used} %", "{used} used" : "{used}imetumika", + "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali", + "File name cannot be empty." : "Jina la faili haliwezi kawa tupu", + "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili", + "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa", + "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)", + "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)", + "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).", + "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""], + "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)", + "Path" : "Njia", + "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"], + "Favored" : "Imependelewa", + "Favor" : "Upendeleo", + "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)", "Upload file" : "Pakia faili", "Not favored" : "Haikupendwa", - "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao." + "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo", + "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)", + "Submitting fields…" : "Inawasilisha migunda", + "Filter filenames…" : "Chuja majina ya faili", + "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "], + "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "], + "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"], + "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"], + "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha", + "Personal Files" : "Faili binafsi", + "Text file" : "Faili ya maandishi", + "New text file.txt" : "Faili mpya ya maandishi.txt", + "%1$s (renamed)" : "%1$s (iliyopew jina jipya)", + "renamed file" : "Faili iliyopewa jina jipya", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.", + "{count} files could not be converted" : "{count} files could not be converted", + "{count} files successfully converted" : "{count} files successfully converted" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sw.json b/apps/files/l10n/sw.json index 868a65e86f2..3142db10ae0 100644 --- a/apps/files/l10n/sw.json +++ b/apps/files/l10n/sw.json @@ -3,7 +3,7 @@ "Removed from favorites" : "Imeondolewa kutoka vipendwa", "You added {file} to your favorites" : "Umeongeza {file}kwa vipendwa vyako", "You removed {file} from your favorites" : "Umeondoa {file}kwenye vipendwa vyako", - "Favorites" : "Vipendwa", + "Favorites" : "Vinavyopendwa", "File changes" : "Mabadiliko ya faili", "Created by {user}" : "Imetengenezwa na {user}", "Changed by {user}" : "Imebadilishwa na {user}", @@ -122,7 +122,7 @@ "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", + "_{count} selected_::_{count} selected_" : ["{count} selected","{count} iliyochaguliwa"], "{usedQuotaByte} used" : "{usedQuotaByte}imetumika", "{used} of {quota} used" : "{used} ya {quota}imetumika", "{relative}% used" : "{relative}% imetumika", @@ -184,6 +184,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 +200,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,15 +213,48 @@ "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", "Tags" : "Maoni", + "Blank" : "Mabano", + "Unable to create new file from template" : "Imeshindwa kutengeneza faili jipya kutoka kwenye sampuli/kiolezo", + "Pick a template for {name}" : "Chagua sampuli/kiolezo kwa {name}", + "Create a new file with the selected template" : "Tengeneza faili jipya na kiolezo/sampuli iliyochaguliwa", "Creating file" : "Inatengeneza faili", "Save as {displayName}" : "Hifadhi kama {displayName}", "Save as …" : "Hifadhi kama", + "Converting files …" : "Inageuza mafaili", + "Failed to convert files: {message}" : "Imeshindwa kugeuza faili {message}", + "All files failed to be converted" : "Faili zote zimeshindwa kugeuzwa", + "One file could not be converted: {message}" : "Faili moja isingeweza kugeuzwa {message}", + "_One file could not be converted_::_%n files could not be converted_" : ["One file could not be converted","%n faili zisingeweza kugeuzwa"], + "_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n faili zimegeuzwa kikamilifu"], + "Files successfully converted" : "Faili zimegeuzwa kikamilifu", + "Failed to convert files" : "Imeshindwa kugeuza faili", + "Converting file …" : "Inageuza faili", + "File successfully converted" : "Faili imegeuzwa kikamilifu", + "Failed to convert file: {message}" : "Imeshindwa kugeuza faili {message}", + "Failed to convert file" : "Imeshindwa kugeuza faili", + "Deletion cancelled" : "Ufutaji umesitishwa", + "Leave this share" : "Ondoa ushirikishaji huu", + "Leave these shares" : "Ondoa shiriki hizi", + "Disconnect storage" : "Achanisha uhifadhi", + "Disconnect storages" : "Achanisha hifadhi", "Delete permanently" : "Futa moja kwa moja", "Delete and unshare" : "Futa na usishirikishe", "Delete file" : "Futa faili", @@ -227,49 +271,190 @@ "You cannot move a file/folder onto itself or into a subfolder of itself" : "Huwezi kuhamisha faili/folda kwenye yenyewe au kwenye folda yenyewe", "(copy)" : "(nakili)", "(copy %n)" : "(nakili %n)", + "Move cancelled" : "Uhamishaji umeghairishwa", + "A file or folder with that name already exists in this folder" : "Faili au kisanduku chenye jina hilo tayari kipo katika kisanduku hiki", + "The files are locked" : "Faili zimezuiliwa", + "The file does not exist anymore" : "Faili halipo tena", + "Choose destination" : "Chagua eneo lengwa", "Copy to {target}" : "Nakili kwenda {target}", "Copy" : "Nakili", "Move to {target}" : "Hamishia {target}", "Move" : "Hamisha", + "Move or copy operation failed" : "Operesheni ya kuhamisha au kunakili imeshindikana", "Move or copy" : "Hamisha au nakili", + "Cancelled move or copy of \"{filename}\"." : "Imesitisha uhamishaji au unakili wa \"{filename}\"", + "Cancelled move or copy operation" : "Imesitisha operesheni ya uhamishaji au unakili", "Open folder {displayName}" : "Fungua kisanduku {displayName}", "Open in Files" : "Fungua ndani ya faili", "Open locally" : "Fungua kikawaida", "Failed to redirect to client" : "Imeshindwa kuielekeza kwa mteja", "Open file locally" : "Fungua faili kikawaida", + "The file should now open on your device. If it doesn't, please check that you have the desktop app installed." : "Sasa faili inapaswa kufunguliwa kwenye kifaa chako. Ikiwa sivyo, tafadhali hakikisha kuwa umesakinisha programu ya eneo-kazi.", + "Retry and close" : "Jaribu upya kisha funga", "Open online" : "Fungua mtandaoni", "Rename" : "Ipe jina jipya", "Open details" : "Fungua maelezo", + "View in folder" : "Angalia ndani ya kisanduku", "Today" : "Leo", "Last 7 days" : "Siku 7 zilizopita", "Last 30 days" : "Siku 30 zilizopita", "This year ({year})" : "Mwaka huu {year}", "Last year ({year})" : "Mwaka uliopita {year}", "Documents" : "Nyaraka", + "Spreadsheets" : "Lahajedwali", "Presentations" : "Uwasilishaji", "PDFs" : "PDFs", "Folders" : "Visanduku", "Audio" : "Sauti", + "Photos and images" : "Picha na taswira", "Videos" : "Picha mjongeo", + "New folder creation cancelled" : "Utengenezaji wa kisanduku kipya umesitishwa", + "Created new folder \"{name}\"" : "Imetengeneza kisanduku kipya \"{name}\"", + "Unable to initialize the templates directory" : "Haikuweza kuanzisha saraka ya violezo", + "Create templates folder" : "Imetengeneza kisanduku cha violezo", + "Templates" : "Violezo", + "New template folder" : "Kisanduku kipya cha violezo", "In folder" : "Ndani ya kisanduku", "Search in folder: {folder}" : "Tafuta katika kisanduku {folder}", + "One of the dropped files could not be processed" : "Moja ya faili zilizodondoshwa isingeweza kuchakatwa", + "Your browser does not support the Filesystem API. Directories will not be uploaded" : "Kivinjari chako hakitumii API ya mfumo wa faili. Orodha hazitapakiwa\n ", "No files to upload" : "Hakuna faili la kupakia", + "Unable to create the directory {directory}" : "Haiwezi kutengeneza orodha {directory}", + "Some files could not be uploaded" : "Faili kadhaa zisingeweza kupakiwa", + "Files uploaded successfully" : "Faili zimepakiwa kikamilifu", "No files to process" : "Hakuna faili la kuchakata", + "Some files could not be copied" : "Faili baadhi zisingeweza kunakiliwa", + "Some files could not be moved" : "Faili baadhi zisingeweza kuhamishwa", "Files copied successfully" : "Faili limenakiliwa kikamilifu", "Files moved successfully" : "Faili limeondolewa kikamilifu", + "Conflicts resolution skipped" : "Utatuzi wa migogoro ulirukwa", "Upload cancelled" : "Upakiaji umesitishwa", + "This operation is forbidden" : "Opereshini hii imezuiwa", + "This directory is unavailable, please check the logs or contact the administrator" : "Orodha haipatikani, tafadhali angalia uingiaji au wasiliana na msimamizi", + "Storage is temporarily not available" : "Uhifadhi haupo kwa muda", "Unexpected error: {error}" : "Hitilafu isiyotarajiwa {error}", + "_%n file_::_%n files_" : ["%n file","%n faili"], + "_%n folder_::_%n folders_" : ["%n folder","%n visanduku/vikasha"], + "_%n hidden_::_%n hidden_" : ["%n hidden","%n imefichwa"], + "Filename must not be empty." : "Jina la faili halipaswi kuwa tupu", + "\"{char}\" is not allowed inside a filename." : "\"{char}\" hairuhusiwi ndani ya jina la faili", + "\"{segment}\" is a reserved name and not allowed for filenames." : "\"{segment}\" ni jina la akiba na haliruhusiwi kwa majina ya faili", + "\"{extension}\" is not an allowed filetype." : "\"{extension}\" si aina ya faili inayoruhusiwa", + "Filenames must not end with \"{extension}\"." : "Majina ya faili hayapaswi kuishia na \"{extension}\"", + "List of favorite files and folders." : "Orodha ya faili na visanduku vinanyopendwa", + "No favorites yet" : "Bado hakuna vinavyopendwa", + "Files and folders you mark as favorite will show up here" : "Faili na visunduku ulivyoweka alama kama vipendwa vitaonekana hapa", + "All files" : "Faili zote", + "List of your files and folders." : "Orodha ya faili na vikasha vyako", + "All folders" : "Vikasha vyote", + "Personal files" : "Faili binafsi", + "List of your files and folders that are not shared." : "Orodha ya faili na vikasha ambavyo havijashirikishwa", + "No personal files found" : "Hakuna faili binafsi zilizopatikana", + "Files that are not shared will show up here." : "Faili ambazo hazija shirikishwa zitaonekana hapa", + "Recent" : "Hivi karibuni", + "List of recently modified files and folders." : "Orodha ya faili na vikasha vilivyoboreshwa hivi karibuni", + "No recently modified files" : "Hakuna faili zilizoboreshwa hivi karibuni", + "Files and folders you recently modified will show up here." : "Faili na vikasha ulivyoboresha hivi karibuni vitaonekana hapa", + "No entries found in this folder" : "Hakuna maingizo yaliyopatikana katika kasha hili", + "Select all" : "Chagua zote", + "Upload too large" : "Upakiaji mkubwa mno", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Faili unazojaribu kupakia zinazidi ukubwa wa juu zaidi wa upakiaji wa faili kwenye seva hii.", + "File could not be found" : "Faili isingeweza kupatikana", "Download" : "Pakua", + "Show list view" : "Onesha mwonekeno wa orodha", + "Show grid view" : "Onesha mwonekano wa mstariramani", "Close" : "Funga", + "Could not create folder \"{dir}\"" : "Isingeweza kutengeneza kasha \"{dir}\"", + "This will stop your current uploads." : "Hii itasimamisha ukakiaji wako wa sasa", + "Upload cancelled." : "Upakiaji umesitishwa ", + "Processing files …" : "Faili zinazochakatwa", + "…" : "...", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Haiwezi kupakia {filename} kama ilivyo orodha au ina baiti 0", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Hakuna nafasi ya kutosha, unapakia {size1} lakini imesalia {size2} pekee", + "Target folder \"{dir}\" does not exist any more" : "Kasha lengwa \"{dir}\" halipatikani tena", + "An unknown error has occurred" : "Hitilafu isiyojulikana imetokea", + "File could not be uploaded" : "Faili isingeweza kupakia", "Uploading …" : "Inapakia", + "{remainingTime} ({currentNumber}/{total})" : "{remainingTime}({currentNumber}/{total})", + "Uploading … ({currentNumber}/{total})" : "Inapakia... ({currentNumber}/{total})", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} ya {totalSize} ({bitrate})", + "Uploading that item is not supported" : "Upakiaji wa kipengele hicho hauwezeshwi", + "Error when assembling chunks, status code {status}" : "Hitilafu wakakti wa kukusanya vipande, nambari ya hali {status}", + "Choose target folder" : "Chagua kasha lililolengwa", + "Set reminder" : "Weka ukumbusho", + "Edit locally" : "Hariri kikawaida", "Open" : "Fungua", + "Could not load info for file \"{file}\"" : "Isingeweza kupakia taarifa kwa faili \"{file}\"", "Details" : "Maelezo ya kina", + "Please select tag(s) to add to the selection" : "Tafadhali chagua lebo za kuongeza kwenye uteuzi", + "Apply tag(s) to selection" : "Omba lebo kwenye uteuzi", + "Select directory \"{dirName}\"" : "Teua orodha \"{dirName}\"", + "Select file \"{fileName}\"" : "Teua faili \"{fileName}\"", + "Unable to determine date" : "Haiwezi kuamua tarehe", + "Could not move \"{file}\", target exists" : "Haikuweza kuhamisha \"{file}\" lengo lililopo", + "Could not move \"{file}\"" : "Haiwezi kuhamisha \"{file}\"", "copy" : "Nakili", + "Could not copy \"{file}\", target exists" : "Haiwezi kunakili \"{file}\" lengo lililopo", "Could not copy \"{file}\"" : "Haikuweza kunakili {file}", + "Copied {origin} inside {destination}" : "Imenakili {origin} ndani ya {destination}", + "Copied {origin} and {nbfiles} other files inside {destination}" : "Imenakili {origin} na {nbfiles} faili zingine ndani ya {destination}", + "{newName} already exists" : "{newName} lipo tayari", + "Could not rename \"{fileName}\", it does not exist any more" : "Haikuweza kuita jina jipya \"{fileName}\", halipo tena", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jina \"{targetName}\" tayari linatumika katika kisanduku \"{dir}\". Tafadhali chagua jina tofauti", + "Could not rename \"{fileName}\"" : "Haikuweza kuita jina jipya \"{fileName}\"", + "Could not create file \"{file}\"" : "Haikuweza kutengeneza faili \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Haikuweza kuteengeneza faili \"{file}\" kwa sababu lipo tayari", + "Could not create folder \"{dir}\" because it already exists" : "Haikuweza kutengeneza kisanduku \"{dir}\" kwa sababu kipo tayari", + "Could not fetch file details \"{file}\"" : "Haikuleta maelezo ya faili \"{file}\"", + "Error deleting file \"{fileName}\"." : "Hitilafu kufuta faili \"{fileName}\"", + "No search results in other folders for {tag}{filter}{endtag}" : "Hakuna matokeo ya utafutaji ndani ya masanduku mengine {tag}{filter}{endtag}", + "Enter more than two characters to search in other folders" : "Ingiza wahusika zaidi ya wawili kutafuta ndani ya masanduku mengine", + "{dirs} and {files}" : "{dirs} na {files}", + "_including %n hidden_::_including %n hidden_" : ["including %n hidden","inajumuisha %n iliyofichwa"], + "You do not have permission to upload or create files here" : "Huna ruhusa ya kupakia au kutengeneza faili hapa", + "_Uploading %n file_::_Uploading %n files_" : ["Uploading %n file","Inapakia faili %n"], "New" : "Mpya", + "New file/folder menu" : "Faili mpya/ menyu ya kisanduku", + "Select file range" : "Chagua safu ya faili", + "{used}%" : "{used} %", "{used} used" : "{used}imetumika", + "\"{name}\" is an invalid file name." : "\"{name}\" ni jina la faili lisilo halali", + "File name cannot be empty." : "Jina la faili haliwezi kawa tupu", + "\"/\" is not allowed inside a file name." : "\"/\" hairuhusiwi ndani ya jina la faili", + "\"{name}\" is not an allowed filetype" : "\"{name}\" si aina ya faili iliyoruhusiwa", + "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Uhifadhi wa {owner} umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Kundi la vikasha \"{mountPoint}\" limejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Uhifadhi wa nje \"{mountPoint}\" umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Your storage is full, files cannot be updated or synced anymore!" : "Uhifadhi wako umejaa, faili haziwezi kusasishwa au kusawazishwa zaidi", + "Storage of {owner} is almost full ({usedSpacePercent}%)." : "Uhafidhi wa {owner} unakaribia kujaa ({usedSpacePercent}%)", + "Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Kundi la vikasha \"{mountPoint}linakaribia kujaa ({usedSpacePercent}%)", + "External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Uhifadhi wa nje \"{mountPoint}\" unakaribia kujaa ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)." : "Uhafadhi wako unakaribia kujaa ({usedSpacePercent}%).", + "_matches \"{filter}\"_::_match \"{filter}\"_" : ["matches \"{filter}\"","linganisha \"{filter}\""], + "Direct link was copied (only works for people who have access to this file/folder)" : "Kiungo cha moja kwa moja kilinakiliwa (hufanya kazi tu kwa watu wanaoweza kufikia faili/kikasha hiki)", + "Path" : "Njia", + "_%n byte_::_%n bytes_" : ["%n byte","%n baiti"], + "Favored" : "Imependelewa", + "Favor" : "Upendeleo", + "Copy direct link (only works for people who have access to this file/folder)" : "Nakili kiungo cha moja kwa moja (inafanya kazi tu kwa watu wanaoweza kufikia faili/folda hii)", "Upload file" : "Pakia faili", "Not favored" : "Haikupendwa", - "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao." + "An error occurred while trying to update the tags" : "Hitilafu imetokea wakati ikijaribu kusasisha lebo", + "Upload (max. %s)" : "Pakia (kiwango cha juu. %s)", + "Submitting fields…" : "Inawasilisha migunda", + "Filter filenames…" : "Chuja majina ya faili", + "_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} folder","Visandiku {folderCount} "], + "_{fileCount} file_::_{fileCount} files_" : ["{fileCount} file","Faili {fileCount} "], + "_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 file and {folderCount} folder","Faili 1 na {folderCount} makasha"], + "_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} file and 1 folder","{fileCount} faili na kasha 1"], + "{fileCount} files and {folderCount} folders" : "{fileCount} faili na {folderCount}makasha", + "Personal Files" : "Faili binafsi", + "Text file" : "Faili ya maandishi", + "New text file.txt" : "Faili mpya ya maandishi.txt", + "%1$s (renamed)" : "%1$s (iliyopew jina jipya)", + "renamed file" : "Faili iliyopewa jina jipya", + "After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Baada ya kuwezesha majina ya windows ya faili yanayooana, faili zilizopo haziwezi kurekebishwa tena lakini zinaweza kubadilishwa kuwa majina mapya halali na mmiliki wao.", + "{count} files could not be converted" : "{count} files could not be converted", + "{count} files successfully converted" : "{count} files successfully converted" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th.js b/apps/files/l10n/th.js 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..f471afe54e7 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.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} ","Вибрано {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..f44dd661ca8 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.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} ","Вибрано {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_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index fc1f9b9ecd1..fe5f3adb25e 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -198,7 +198,7 @@ class SMB extends Common implements INotifyStorage { try { $acls = $file->getAcls(); } catch (Exception $e) { - $this->logger->error('Error while getting file acls', ['exception' => $e]); + $this->logger->warning('Error while getting file acls', ['exception' => $e]); return null; } foreach ($acls as $user => $acl) { @@ -426,6 +426,7 @@ class SMB extends Common implements INotifyStorage { case 'r': case 'rb': if (!$this->file_exists($path)) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', file doesn\'t exist.'); return false; } return $this->share->read($fullPath); @@ -453,11 +454,13 @@ class SMB extends Common implements INotifyStorage { } if ($this->file_exists($path)) { if (!$this->isUpdatable($path)) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', file not updatable.'); return false; } $tmpFile = $this->getCachedFile($path); } else { if (!$this->isCreatable(dirname($path))) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', parent directory not writable.'); return false; } $tmpFile = \OCP\Server::get(ITempManager::class)->getTemporaryFile($ext); @@ -472,13 +475,16 @@ class SMB extends Common implements INotifyStorage { } return false; } catch (NotFoundException $e) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', not found.', ['exception' => $e]); return false; } catch (ForbiddenException $e) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', forbidden.', ['exception' => $e]); return false; } catch (OutOfSpaceException $e) { + $this->logger->warning('Failed to open ' . $path . ' on ' . $this->getId() . ', out of space.', ['exception' => $e]); throw new EntityTooLargeException('not enough available space to create file', 0, $e); } catch (ConnectException $e) { - $this->logger->error('Error while opening file', ['exception' => $e]); + $this->logger->error('Error while opening file ' . $path . ' on ' . $this->getId(), ['exception' => $e]); throw new StorageNotAvailableException($e->getMessage(), (int)$e->getCode(), $e); } } diff --git a/apps/files_sharing/l10n/cs.js b/apps/files_sharing/l10n/cs.js index f216d185224..8753dc54d64 100644 --- a/apps/files_sharing/l10n/cs.js +++ b/apps/files_sharing/l10n/cs.js @@ -185,6 +185,7 @@ OC.L10N.register( "Set default folder for accepted shares" : "Nastavit výchozí složku pro přijatá sdílení", "Reset" : "Vrátit na výchozí hodnoty", "Reset folder to system default" : "Resetovat složku na systémovou výchozí", + "Share expiration: {date}" : "Skončení platnosti sdílení: {date}", "Share Expiration" : "Skončení platnosti sdílení", "group" : "skupina", "conversation" : "konverzace", @@ -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." : "Sdílení, která nejsou součástí interních nebo externích sdílení. Toto mohou být sdílení z aplikací nebo jiných zdrojů.", "Share with accounts, teams, federated cloud IDs" : "Nasdílejte účtům, týmům, identifikátorům v rámci federovaného cloudu", "Share with accounts and teams" : "Nasdílet účtům a týmům", + "Federated cloud ID" : "Identifikátor v rámci federovaného cloudu", "Email, federated cloud ID" : "E-mail, identif. federovaného cloudu", "Unable to load the shares list" : "Nedaří se načíst seznam sdílení", "Expires {relativetime}" : "Platnost končí {relativetime}", diff --git a/apps/files_sharing/l10n/cs.json b/apps/files_sharing/l10n/cs.json index de776d1f283..50059aea129 100644 --- a/apps/files_sharing/l10n/cs.json +++ b/apps/files_sharing/l10n/cs.json @@ -183,6 +183,7 @@ "Set default folder for accepted shares" : "Nastavit výchozí složku pro přijatá sdílení", "Reset" : "Vrátit na výchozí hodnoty", "Reset folder to system default" : "Resetovat složku na systémovou výchozí", + "Share expiration: {date}" : "Skončení platnosti sdílení: {date}", "Share Expiration" : "Skončení platnosti sdílení", "group" : "skupina", "conversation" : "konverzace", @@ -307,6 +308,7 @@ "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Sdílení, která nejsou součástí interních nebo externích sdílení. Toto mohou být sdílení z aplikací nebo jiných zdrojů.", "Share with accounts, teams, federated cloud IDs" : "Nasdílejte účtům, týmům, identifikátorům v rámci federovaného cloudu", "Share with accounts and teams" : "Nasdílet účtům a týmům", + "Federated cloud ID" : "Identifikátor v rámci federovaného cloudu", "Email, federated cloud ID" : "E-mail, identif. federovaného cloudu", "Unable to load the shares list" : "Nedaří se načíst seznam sdílení", "Expires {relativetime}" : "Platnost končí {relativetime}", 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/it.js b/apps/files_sharing/l10n/it.js index be78bc7fce6..ade501b3d13 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -185,6 +185,7 @@ OC.L10N.register( "Set default folder for accepted shares" : "Imposta cartella predefinita per condivisioni accettate", "Reset" : "Ripristina", "Reset folder to system default" : "Ripristina la cartella alla predefinita di sistema", + "Share expiration: {date}" : "Scadenza condivisione: {date}", "Share Expiration" : "Scadenza Condivisione", "group" : "gruppo", "conversation" : "conversazione", @@ -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." : "Condivisioni che non fanno parte delle condivisioni interne o esterne. Possono essere condivisioni da app o altre fonti.", "Share with accounts, teams, federated cloud IDs" : "Condividi con account, team, ID cloud federati", "Share with accounts and teams" : "Condividi con account e team", + "Federated cloud ID" : "ID cloud federato", "Email, federated cloud ID" : "E-mail, ID cloud federato", "Unable to load the shares list" : "Impossibile caricare l'elenco delle condivisioni", "Expires {relativetime}" : "Scade il {relativetime}", diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index 3ac41b2d53d..f87b0a5cd74 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -183,6 +183,7 @@ "Set default folder for accepted shares" : "Imposta cartella predefinita per condivisioni accettate", "Reset" : "Ripristina", "Reset folder to system default" : "Ripristina la cartella alla predefinita di sistema", + "Share expiration: {date}" : "Scadenza condivisione: {date}", "Share Expiration" : "Scadenza Condivisione", "group" : "gruppo", "conversation" : "conversazione", @@ -307,6 +308,7 @@ "Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Condivisioni che non fanno parte delle condivisioni interne o esterne. Possono essere condivisioni da app o altre fonti.", "Share with accounts, teams, federated cloud IDs" : "Condividi con account, team, ID cloud federati", "Share with accounts and teams" : "Condividi con account e team", + "Federated cloud ID" : "ID cloud federato", "Email, federated cloud ID" : "E-mail, ID cloud federato", "Unable to load the shares list" : "Impossibile caricare l'elenco delle condivisioni", "Expires {relativetime}" : "Scade il {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/sr.js b/apps/files_sharing/l10n/sr.js index 6fe45426dc5..413fccb634c 100644 --- a/apps/files_sharing/l10n/sr.js +++ b/apps/files_sharing/l10n/sr.js @@ -185,6 +185,7 @@ OC.L10N.register( "Set default folder for accepted shares" : "Подесите подразумевани фолдер за прихваћена дељења", "Reset" : "Ресетуј", "Reset folder to system default" : "Vratite fasciklu na podrazumevane vrednosti sistema", + "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" : "ИД Здруженог облака", "Email, federated cloud ID" : "И-мејл, ID здруженог облака", "Unable to load the shares list" : "Неуспело учитавање листе дељења", "Expires {relativetime}" : "Истиче {relativetime}", diff --git a/apps/files_sharing/l10n/sr.json b/apps/files_sharing/l10n/sr.json index 5a3ea2dadd3..a9bd75ab333 100644 --- a/apps/files_sharing/l10n/sr.json +++ b/apps/files_sharing/l10n/sr.json @@ -183,6 +183,7 @@ "Set default folder for accepted shares" : "Подесите подразумевани фолдер за прихваћена дељења", "Reset" : "Ресетуј", "Reset folder to system default" : "Vratite fasciklu na podrazumevane vrednosti sistema", + "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" : "ИД Здруженог облака", "Email, federated cloud ID" : "И-мејл, ID здруженог облака", "Unable to load the shares list" : "Неуспело учитавање листе дељења", "Expires {relativetime}" : "Истиче {relativetime}", 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/uk.js b/apps/files_sharing/l10n/uk.js index 3cde1e83f93..f1d8ed89a22 100644 --- a/apps/files_sharing/l10n/uk.js +++ b/apps/files_sharing/l10n/uk.js @@ -184,6 +184,7 @@ OC.L10N.register( "Set default folder for accepted shares" : "Встановити типовий каталог для прийнятих спільних ресурсів", "Reset" : "Скидання", "Reset folder to system default" : "Відновити типові системні налаштування для каталогу", + "Share expiration: {date}" : "У спільному доступі до: {date}", "Share Expiration" : "Термін дії спільного ресурсу:", "group" : "група", "conversation" : "розмова", @@ -308,6 +309,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" : "Поділитися з користувачами, командами, об'єднаними хмарами", "Share with accounts and teams" : "Поділитися з користувачами або командами", + "Federated cloud ID" : "Ідентифікатор об'єднаної хмари", "Email, federated cloud ID" : "Ел. пошта, ID об'єднаної хмари", "Unable to load the shares list" : "Не вдалося завантажити список спільних ресурсів", "Expires {relativetime}" : "Термін дії закінчується {relativetime}", diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json index 742fc80c355..395814ab6f4 100644 --- a/apps/files_sharing/l10n/uk.json +++ b/apps/files_sharing/l10n/uk.json @@ -182,6 +182,7 @@ "Set default folder for accepted shares" : "Встановити типовий каталог для прийнятих спільних ресурсів", "Reset" : "Скидання", "Reset folder to system default" : "Відновити типові системні налаштування для каталогу", + "Share expiration: {date}" : "У спільному доступі до: {date}", "Share Expiration" : "Термін дії спільного ресурсу:", "group" : "група", "conversation" : "розмова", @@ -306,6 +307,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" : "Поділитися з користувачами, командами, об'єднаними хмарами", "Share with accounts and teams" : "Поділитися з користувачами або командами", + "Federated cloud ID" : "Ідентифікатор об'єднаної хмари", "Email, federated cloud ID" : "Ел. пошта, ID об'єднаної хмари", "Unable to load the shares list" : "Не вдалося завантажити список спільних ресурсів", "Expires {relativetime}" : "Термін дії закінчується {relativetime}", 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_trashbin/l10n/uk.js b/apps/files_trashbin/l10n/uk.js index c5c8319afb1..43f6a021a09 100644 --- a/apps/files_trashbin/l10n/uk.js +++ b/apps/files_trashbin/l10n/uk.js @@ -15,6 +15,7 @@ OC.L10N.register( "Original location" : "Звідки вилучено", "Deleted by" : "Ким вилучено", "Deleted" : "Вилучено", + "few seconds ago" : "кілька секунд тому", "A long time ago" : "Давно", "Unknown" : "Невідомо", "All files" : "Усі файли", diff --git a/apps/files_trashbin/l10n/uk.json b/apps/files_trashbin/l10n/uk.json index 3c4160893a2..dcef4ac3b36 100644 --- a/apps/files_trashbin/l10n/uk.json +++ b/apps/files_trashbin/l10n/uk.json @@ -13,6 +13,7 @@ "Original location" : "Звідки вилучено", "Deleted by" : "Ким вилучено", "Deleted" : "Вилучено", + "few seconds ago" : "кілька секунд тому", "A long time ago" : "Давно", "Unknown" : "Невідомо", "All files" : "Усі файли", diff --git a/apps/provisioning_api/l10n/de.js b/apps/provisioning_api/l10n/de.js index e407741f9d5..155d7f9c848 100644 --- a/apps/provisioning_api/l10n/de.js +++ b/apps/provisioning_api/l10n/de.js @@ -29,11 +29,11 @@ OC.L10N.register( "Email address not available" : "E-Mail-Adresse nicht verfügbar", "Sending email failed" : "Senden der E-Mail ist fehlgeschlagen", "Email confirmation" : "E-Mail-Bestätigung", - "To enable the email address %s please click the button below." : "Um die E-Mail-Adresse %s zu bestätigen, klicke bitte auf die untenstehende Schaltfläche.", + "To enable the email address %s please click the button below." : "Um die E-Mailadresse %s zu bestätigen, auf die untenstehende Schaltfläche klicken.", "Confirm" : "Bestätigen", "Email was already removed from account and cannot be confirmed anymore." : "Diese E-Mail-Adresse wurde bereits aus dem Konto entfernt und kann nicht mehr bestätigt werden.", - "Could not verify mail because the token is expired." : "Die E-Mail konnte nicht verifiziert werden, da die Frist des Tokens abgelaufen ist.", - "Could not verify mail because the token is invalid." : "Die E-Mail konnte nicht verifiziert werden, da der Token ungültig ist.", + "Could not verify mail because the token is expired." : "Die E-Mailadresse konnte nicht verifiziert werden, da das Token abgelaufen ist.", + "Could not verify mail because the token is invalid." : "Die E-Mailadresse konnte nicht verifiziert werden, da der Token ungültig ist.", "An unexpected error occurred. Please contact your admin." : "Es ist ein unerwarteter Fehler aufgetreten, bitte kontaktiere deine Administration.", "Email confirmation successful" : "Die E-Mail Bestätigung war erfolgreich.", "Provisioning API" : "Bereitstellungs-API", diff --git a/apps/provisioning_api/l10n/de.json b/apps/provisioning_api/l10n/de.json index 36249979fa4..0fa532f48cd 100644 --- a/apps/provisioning_api/l10n/de.json +++ b/apps/provisioning_api/l10n/de.json @@ -27,11 +27,11 @@ "Email address not available" : "E-Mail-Adresse nicht verfügbar", "Sending email failed" : "Senden der E-Mail ist fehlgeschlagen", "Email confirmation" : "E-Mail-Bestätigung", - "To enable the email address %s please click the button below." : "Um die E-Mail-Adresse %s zu bestätigen, klicke bitte auf die untenstehende Schaltfläche.", + "To enable the email address %s please click the button below." : "Um die E-Mailadresse %s zu bestätigen, auf die untenstehende Schaltfläche klicken.", "Confirm" : "Bestätigen", "Email was already removed from account and cannot be confirmed anymore." : "Diese E-Mail-Adresse wurde bereits aus dem Konto entfernt und kann nicht mehr bestätigt werden.", - "Could not verify mail because the token is expired." : "Die E-Mail konnte nicht verifiziert werden, da die Frist des Tokens abgelaufen ist.", - "Could not verify mail because the token is invalid." : "Die E-Mail konnte nicht verifiziert werden, da der Token ungültig ist.", + "Could not verify mail because the token is expired." : "Die E-Mailadresse konnte nicht verifiziert werden, da das Token abgelaufen ist.", + "Could not verify mail because the token is invalid." : "Die E-Mailadresse konnte nicht verifiziert werden, da der Token ungültig ist.", "An unexpected error occurred. Please contact your admin." : "Es ist ein unerwarteter Fehler aufgetreten, bitte kontaktiere deine Administration.", "Email confirmation successful" : "Die E-Mail Bestätigung war erfolgreich.", "Provisioning API" : "Bereitstellungs-API", 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/settings/l10n/et_EE.js b/apps/settings/l10n/et_EE.js index e7fe29f42dd..82324a67341 100644 --- a/apps/settings/l10n/et_EE.js +++ b/apps/settings/l10n/et_EE.js @@ -33,8 +33,8 @@ OC.L10N.register( "Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud", "{actor} changed your password" : "{actor} muutis sinu salasõna", "You changed your password" : "Sa muutsid oma salasõna", - "Your password was reset by an administrator" : "Administraator lähtestas sinu parooli", - "Your password was reset" : "Sinu parool lähtestati", + "Your password was reset by an administrator" : "Peakasutaja lähtestas sinu salasõna", + "Your password was reset" : "Sinu salasõna on lähtestatud", "{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi", "You changed your email address" : "Sa muutsid oma e-posti aadressi", "Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi", @@ -49,7 +49,7 @@ OC.L10N.register( "A login attempt using two-factor authentication failed (%1$s)" : "Sisselogimiskatse kaheastmelise autentimisega ebaõnnestus (%1$s)", "Remote wipe was started on %1$s" : "Kaugkustutamine algas: %1$s", "Remote wipe has finished on %1$s" : "Kaugkustutamine lõppes: %1$s", - "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>parooli</strong> või <strong>e-posti aadressi</strong> muudeti", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>salasõna</strong> või <strong>e-posti aadress</strong> on muudetud", "Settings" : "Seaded", "Could not remove app." : "Rakenduse eemaldamine ei õnnestunud.", "Could not update app." : "Rakenduse uuendamine ei õnnestunud.", @@ -65,7 +65,7 @@ OC.L10N.register( "Administrator documentation" : "Administraatori dokumentatsioon", "User documentation" : "Kasutaja dokumentatsioon", "Nextcloud help overview" : "Nextcloudi abiteabe ülevaade", - "Invalid SMTP password." : "Vale SMTP parool.", + "Invalid SMTP password." : "Vale SMTP salasõna.", "Email setting test" : "E-posti sätete kontroll", "Well done, %s!" : "Hästi tehtud, %s!", "If you received this email, the email configuration seems to be correct." : "Kui said selle kirja, näib e-posti seadistus õige.", @@ -83,12 +83,13 @@ OC.L10N.register( "Unable to set invalid website" : "Vigase veebisaidi lisamine pole võimalik", "Some account data was invalid" : "Osa kasutajakonto andmeid olid vigased", "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Selleks, et tuvastada, et tegemist tõesti on sinu X-i / Twitteri kasutajakontoga, palun postita oma kontole järgnev säuts (palun kontrolli, et sinna ei satuks reavahetusi):", - "%1$s changed your password on %2$s." : "%1$s muutis su parooli %2$s.", - "Your password on %s was changed." : "Sinu %s parool muudeti.", - "Your password on %s was reset by an administrator." : "Administraator lähtestas sinu %s parooli.", + "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Sinu veebisaidi õigsuse kontrolliks palun salvesta järgnev sisu oma saiti asukohta „.well-known/CloudIdVerificationCode.txt“ (ning kontrolli, et järgnev tekst on seal failis ühel real):", + "%1$s changed your password on %2$s." : "%1$s muutis sinu salasõna teenuses %2$s.", + "Your password on %s was changed." : "Sinu %s salasõna on muudetud.", + "Your password on %s was reset by an administrator." : "Peakasutaja lähtestas sinu %s salasõna.", "Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.", - "Password for %1$s changed on %2$s" : "%1$s parool muudetud %2$s", - "Password changed for %s" : "%s parool muudetud", + "Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud", + "Password changed for %s" : "%s salasõna on muudetud", "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.", "Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.", "Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.", @@ -100,7 +101,7 @@ OC.L10N.register( "Welcome aboard %s" : "Tere tulemast %s", "Welcome to your %s account, you can add, protect, and share your data." : "Tere tulemast oma %s kontole. Sa saad lisada, kaitsta ja jagada oma andmeid.", "Your Login is: %s" : "Sinu kasutajanimi on: %s", - "Set your password" : "Määra oma parool", + "Set your password" : "Sisesta oma salasõna", "Go to %s" : "Mine %s", "Install Client" : "Paigalda kliendiprogramm", "Logged in account must be a sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige", @@ -121,17 +122,22 @@ OC.L10N.register( "Mobile & desktop" : "Mobiil ja töölaud", "Email server" : "E-kirjade server", "Mail Providers" : "E-posti teenusepakkujad", - "User's email account" : "Kasutaja e-postikonto", - "System email account" : "Süsteemi e-posti konto", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.", + "Send emails using" : "E-kirjade saatmisel on kasutusel", + "User's email account" : "Kasutaja seadistatud e-postikonto", + "System email account" : "Süsteemis seadistatud e-postikonto", "Security & setup checks" : "Turva- ja paigalduse kontrollid", "Background jobs" : "Taustal toimivad haldustoimingud", "Unlimited" : "Piiramatult", "Verifying" : "Kontrollin", - "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside filtreerimine", - "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine pole kasutusel.", + "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus", + "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.", "Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.", "Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“", "Admin IP filtering is correctly configured." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine on korrektselt seadistatud.", + "App directories owner" : "Rakenduste kausta omanik", + "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Mõnede rakenduste kaustade omanik erinev kogu Nextcloudi serveri omanikust. Nii võib juhtuda, kui rakendused on paigaldatud käsitsi. Palun kontrolli järgnevate rakenduste kaustade omanikke:\n%s", + "App directories have the correct owner \"%s\"" : "Rakenduste kaustadel on korrektne omanik: „%s“", "Your remote address could not be determined." : "Sinu kaugaadressi tuvastamine ei õnnestunud.", "No altered files" : "Muudetud faile pole", "Database missing primary keys" : "Andmebaasis on puudu primaarvõtmed", @@ -141,6 +147,7 @@ OC.L10N.register( "Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.", "Email test was successfully sent" : "Testkirja saatmine õnnestus", "Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Serveri „trusted_proxies“ seadistus pole korrektne - seal peab leiduma massiiv, aga hetkel on midagi muud.", + "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Sellel serveril puudub toimiv internetiühendus: mitmete otspunktidega ei ole leitavad. See tähendab, et mõned funktsionaalsused, nagu näiteks väliste andmehoidlate ühendamine, uuenduste teavitused või kolmandate osapoolte rakenduste paigaldamine ei tööta. Ligipääs failidele eemalt ning teavistuste saatmine e-kirjaga ei pruugi samuti toimida. Kui soovid kasutada täielikku funktsionaalsust, siis palun taga toimiv internetiühendus.", "Old server-side-encryption" : "Vana serveripoolne krüptimine", "Disabled" : "Keelatud", "The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.", @@ -208,8 +215,8 @@ OC.L10N.register( "Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires", "Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist", "Allow public uploads" : "Luba avalikud üleslaadimised", - "Always ask for a password" : "Alati küsi parooli", - "Enforce password protection" : "Jõusta paroolikaitse", + "Always ask for a password" : "Alati küsi salasõna", + "Enforce password protection" : "Jõusta salasõnakaitse", "Exclude groups from password requirements" : "Välista grupid salasõnareeglitest", "Exclude groups from creating link shares" : "Välista grupid jagamislinkide loomisest", "Limit sharing based on groups" : "Piira jagamist gruppide alusel", @@ -217,9 +224,11 @@ OC.L10N.register( "Exclude some groups from sharing" : "Välista mõned grupid jagamisest", "Limit sharing to some groups" : "Piira jagamist mõnede gruppidega", "Groups excluded from sharing" : "Jagamisest välistatud grupid", + "Set default expiration date for internal shares" : "Jagamisel selle serveri piires kasuta vaikimisi aegumist", "Enforce expiration date" : "Sunnitud aegumise kuupäev", "Default expiration time of new shares in days" : "Uue jaosmeedia vaikimisi aegumine päevades", "Expire shares after x days" : "Jaosmeedia aegub x päeva möödudes", + "Set default expiration date for shares to other servers" : "Jagamisel teistesse serveritesse kasuta vaikimisi aegumist", "Enforce expiration date for remote shares" : "Määra lingi kaugserverid asuva jaosmeedia vaikimisi aegumiskuupäev ", "Default expiration time of remote shares in days" : "Kaugserveris asuva jaosmeedia vaikimisi aegumine päevades", "Expire remote shares after x days" : "Jaosmeedia aegub x päeva möödudes", @@ -229,6 +238,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Kuva avaliku lingiga üleslaadimise lehel lahtiütluste tekst (vaid siis, kui failide loend on peidetud)", "Disclaimer text" : "Vastutusest lahtiütluse tekst", "This text will be shown on the public link upload page when the file list is hidden." : "Seda teksti näidatakse avaliku lingiga üleslaadimise lehel kui failide loend on peidetud.", + "Default share permissions" : "Vaikimisi õigusel jagamisel", "Two-Factor Authentication" : "Kaheastmeline autentimine", "Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Kaheastmelist autentimist on võimalik teha kohustuslikuks kas kõikidele kasutajakontodele või konkreetsete gruppide kaupa. Kui kaheastmelise autentimise kohustuslikkus on määratud, kuid on kasutajal seadistamata, siis ta ei saa siia serverisse sisse logida.", "Enforce two-factor authentication" : "Tee kaheastmeline autentimine kohustuslikuks", @@ -349,7 +359,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Sinu kontole hetkel sisse loginud veebi-, töölaua-, ja mobiilsed kliendid.", "Error while creating device token" : "Tõrge seadme märke loomisel", "App name" : "Rakenduse nimi", - "Create new app password" : "Loo uus rakenduse parool", + "Create new app password" : "Loo uus rakenduse salasõna", "App password copied!" : "Rakenduse salasõna on kopeeritud!", "Copy app password" : "Kopeeri rakenduse salasõna", "Login name copied!" : "Kasutajanimi on koeeritud!", @@ -529,6 +539,7 @@ OC.L10N.register( "Set account as admin for" : "Määra kasutajakonto peakasutajaks siin:", "Select account quota" : "Määra kasutajakonto kvoot", "Set the language" : "Vali keel", + "Toggle account actions menu" : "Lülita kasutajakonto tegevuste menüü sisse/välja", "Done" : "Valmis", "Edit" : "Muuda", "Account management settings" : "Kasutajakontode halduse seadistused", @@ -560,8 +571,13 @@ OC.L10N.register( "No devices configured." : "Ühtegi seadet pole seadistatud.", "The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:", "Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.", - "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", "You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.", + "App Store" : "Rakendustepood", + "Loading app list" : "Laadin rakenduste loendit", + "Loading categories" : "Laadin kategooriaid", + "Developer documentation ↗" : "Dokumentatsioon arendajatele ↗", + "Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel", "Version {version}" : "Versioon {version}", "All accounts" : "Kõik kasutajakontod", "Admins" : "Haldurid", diff --git a/apps/settings/l10n/et_EE.json b/apps/settings/l10n/et_EE.json index a27534910f2..d23ba11a232 100644 --- a/apps/settings/l10n/et_EE.json +++ b/apps/settings/l10n/et_EE.json @@ -31,8 +31,8 @@ "Your <strong>group memberships</strong> were modified" : "Sinu <strong>grupide liikmelisus</strong> on muutunud", "{actor} changed your password" : "{actor} muutis sinu salasõna", "You changed your password" : "Sa muutsid oma salasõna", - "Your password was reset by an administrator" : "Administraator lähtestas sinu parooli", - "Your password was reset" : "Sinu parool lähtestati", + "Your password was reset by an administrator" : "Peakasutaja lähtestas sinu salasõna", + "Your password was reset" : "Sinu salasõna on lähtestatud", "{actor} changed your email address" : "{actor} muutis sinu e-posti aadressi", "You changed your email address" : "Sa muutsid oma e-posti aadressi", "Your email address was changed by an administrator" : "Administraator muutis sinu e-posti aadressi", @@ -47,7 +47,7 @@ "A login attempt using two-factor authentication failed (%1$s)" : "Sisselogimiskatse kaheastmelise autentimisega ebaõnnestus (%1$s)", "Remote wipe was started on %1$s" : "Kaugkustutamine algas: %1$s", "Remote wipe has finished on %1$s" : "Kaugkustutamine lõppes: %1$s", - "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>parooli</strong> või <strong>e-posti aadressi</strong> muudeti", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Sinu <strong>salasõna</strong> või <strong>e-posti aadress</strong> on muudetud", "Settings" : "Seaded", "Could not remove app." : "Rakenduse eemaldamine ei õnnestunud.", "Could not update app." : "Rakenduse uuendamine ei õnnestunud.", @@ -63,7 +63,7 @@ "Administrator documentation" : "Administraatori dokumentatsioon", "User documentation" : "Kasutaja dokumentatsioon", "Nextcloud help overview" : "Nextcloudi abiteabe ülevaade", - "Invalid SMTP password." : "Vale SMTP parool.", + "Invalid SMTP password." : "Vale SMTP salasõna.", "Email setting test" : "E-posti sätete kontroll", "Well done, %s!" : "Hästi tehtud, %s!", "If you received this email, the email configuration seems to be correct." : "Kui said selle kirja, näib e-posti seadistus õige.", @@ -81,12 +81,13 @@ "Unable to set invalid website" : "Vigase veebisaidi lisamine pole võimalik", "Some account data was invalid" : "Osa kasutajakonto andmeid olid vigased", "In order to verify your Twitter account, post the following tweet on Twitter (please make sure to post it without any line breaks):" : "Selleks, et tuvastada, et tegemist tõesti on sinu X-i / Twitteri kasutajakontoga, palun postita oma kontole järgnev säuts (palun kontrolli, et sinna ei satuks reavahetusi):", - "%1$s changed your password on %2$s." : "%1$s muutis su parooli %2$s.", - "Your password on %s was changed." : "Sinu %s parool muudeti.", - "Your password on %s was reset by an administrator." : "Administraator lähtestas sinu %s parooli.", + "In order to verify your Website, store the following content in your web-root at '.well-known/CloudIdVerificationCode.txt' (please make sure that the complete text is in one line):" : "Sinu veebisaidi õigsuse kontrolliks palun salvesta järgnev sisu oma saiti asukohta „.well-known/CloudIdVerificationCode.txt“ (ning kontrolli, et järgnev tekst on seal failis ühel real):", + "%1$s changed your password on %2$s." : "%1$s muutis sinu salasõna teenuses %2$s.", + "Your password on %s was changed." : "Sinu %s salasõna on muudetud.", + "Your password on %s was reset by an administrator." : "Peakasutaja lähtestas sinu %s salasõna.", "Your password on %s was reset." : "Sinu salasõna „%s“ sai lähtestatud.", - "Password for %1$s changed on %2$s" : "%1$s parool muudetud %2$s", - "Password changed for %s" : "%s parool muudetud", + "Password for %1$s changed on %2$s" : "%1$s salasõna teenuses %2$s on muutunud", + "Password changed for %s" : "%s salasõna on muudetud", "If you did not request this, please contact an administrator." : "Kui sa pole seda taotlenud, võta ühendust administraatoriga.", "Your email address on %s was changed." : "Sinu %s e-posti aadressi muudeti.", "Your email address on %s was changed by an administrator." : "Administraator muutis sinu %s e-posti aadressi.", @@ -98,7 +99,7 @@ "Welcome aboard %s" : "Tere tulemast %s", "Welcome to your %s account, you can add, protect, and share your data." : "Tere tulemast oma %s kontole. Sa saad lisada, kaitsta ja jagada oma andmeid.", "Your Login is: %s" : "Sinu kasutajanimi on: %s", - "Set your password" : "Määra oma parool", + "Set your password" : "Sisesta oma salasõna", "Go to %s" : "Mine %s", "Install Client" : "Paigalda kliendiprogramm", "Logged in account must be a sub admin" : "Sisselogitud kasutajakonto peab olema peakasutajate alamgrupi liige", @@ -119,17 +120,22 @@ "Mobile & desktop" : "Mobiil ja töölaud", "Email server" : "E-kirjade server", "Mail Providers" : "E-posti teenusepakkujad", - "User's email account" : "Kasutaja e-postikonto", - "System email account" : "Süsteemi e-posti konto", + "Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.", + "Send emails using" : "E-kirjade saatmisel on kasutusel", + "User's email account" : "Kasutaja seadistatud e-postikonto", + "System email account" : "Süsteemis seadistatud e-postikonto", "Security & setup checks" : "Turva- ja paigalduse kontrollid", "Background jobs" : "Taustal toimivad haldustoimingud", "Unlimited" : "Piiramatult", "Verifying" : "Kontrollin", - "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside filtreerimine", - "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine pole kasutusel.", + "Allowed admin IP ranges" : "Süsteemihalduseks lubatud IP-aadresside vahemikus", + "Admin IP filtering isn't applied." : "Süsteemihalduseks lubatud IP-aadresside vahemikud pole seadistatud.", "Configuration key \"%1$s\" expects an array (%2$s found). Admin IP range validation will not be applied." : "Seadistuste võtmes „%1$s“ peab olema kirjas massiiv ( aga leidsime „%2$s“). Süsteemihalduseks lubatud IP-aadresside filtreerimine hetkel ei toimi.", "Configuration key \"%1$s\" contains invalid IP range(s): \"%2$s\"" : "Seadistuste võtmes „%1$s“ on vigane IP-aadressi(de) vahemik: „%2$s“", "Admin IP filtering is correctly configured." : "Süsteemihalduseks lubatud IP-aadresside filtreerimine on korrektselt seadistatud.", + "App directories owner" : "Rakenduste kausta omanik", + "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Mõnede rakenduste kaustade omanik erinev kogu Nextcloudi serveri omanikust. Nii võib juhtuda, kui rakendused on paigaldatud käsitsi. Palun kontrolli järgnevate rakenduste kaustade omanikke:\n%s", + "App directories have the correct owner \"%s\"" : "Rakenduste kaustadel on korrektne omanik: „%s“", "Your remote address could not be determined." : "Sinu kaugaadressi tuvastamine ei õnnestunud.", "No altered files" : "Muudetud faile pole", "Database missing primary keys" : "Andmebaasis on puudu primaarvõtmed", @@ -139,6 +145,7 @@ "Mail delivery is disabled by instance config \"%s\"." : "Selles serveris piirab e-kirjade edasisaatmist seadistus „%s“.", "Email test was successfully sent" : "Testkirja saatmine õnnestus", "Your \"trusted_proxies\" setting is not correctly set, it should be an array." : "Serveri „trusted_proxies“ seadistus pole korrektne - seal peab leiduma massiiv, aga hetkel on midagi muud.", + "This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Sellel serveril puudub toimiv internetiühendus: mitmete otspunktidega ei ole leitavad. See tähendab, et mõned funktsionaalsused, nagu näiteks väliste andmehoidlate ühendamine, uuenduste teavitused või kolmandate osapoolte rakenduste paigaldamine ei tööta. Ligipääs failidele eemalt ning teavistuste saatmine e-kirjaga ei pruugi samuti toimida. Kui soovid kasutada täielikku funktsionaalsust, siis palun taga toimiv internetiühendus.", "Old server-side-encryption" : "Vana serveripoolne krüptimine", "Disabled" : "Keelatud", "The old server-side-encryption format is enabled. We recommend disabling this." : "Vana serveripoolse krüptimise vorming on kasutusel. Mes soovitame, et lülitad selle välja.", @@ -206,8 +213,8 @@ "Restrict users to only share with users in their groups" : "Luba kasutajatel jagada kasutajatega ainult oma grupi piires", "Allow users to share via link and emails" : "Luba kasutajatel lingiga ja e-postiga jagamist", "Allow public uploads" : "Luba avalikud üleslaadimised", - "Always ask for a password" : "Alati küsi parooli", - "Enforce password protection" : "Jõusta paroolikaitse", + "Always ask for a password" : "Alati küsi salasõna", + "Enforce password protection" : "Jõusta salasõnakaitse", "Exclude groups from password requirements" : "Välista grupid salasõnareeglitest", "Exclude groups from creating link shares" : "Välista grupid jagamislinkide loomisest", "Limit sharing based on groups" : "Piira jagamist gruppide alusel", @@ -215,9 +222,11 @@ "Exclude some groups from sharing" : "Välista mõned grupid jagamisest", "Limit sharing to some groups" : "Piira jagamist mõnede gruppidega", "Groups excluded from sharing" : "Jagamisest välistatud grupid", + "Set default expiration date for internal shares" : "Jagamisel selle serveri piires kasuta vaikimisi aegumist", "Enforce expiration date" : "Sunnitud aegumise kuupäev", "Default expiration time of new shares in days" : "Uue jaosmeedia vaikimisi aegumine päevades", "Expire shares after x days" : "Jaosmeedia aegub x päeva möödudes", + "Set default expiration date for shares to other servers" : "Jagamisel teistesse serveritesse kasuta vaikimisi aegumist", "Enforce expiration date for remote shares" : "Määra lingi kaugserverid asuva jaosmeedia vaikimisi aegumiskuupäev ", "Default expiration time of remote shares in days" : "Kaugserveris asuva jaosmeedia vaikimisi aegumine päevades", "Expire remote shares after x days" : "Jaosmeedia aegub x päeva möödudes", @@ -227,6 +236,7 @@ "Show disclaimer text on the public link upload page (only shown when the file list is hidden)" : "Kuva avaliku lingiga üleslaadimise lehel lahtiütluste tekst (vaid siis, kui failide loend on peidetud)", "Disclaimer text" : "Vastutusest lahtiütluse tekst", "This text will be shown on the public link upload page when the file list is hidden." : "Seda teksti näidatakse avaliku lingiga üleslaadimise lehel kui failide loend on peidetud.", + "Default share permissions" : "Vaikimisi õigusel jagamisel", "Two-Factor Authentication" : "Kaheastmeline autentimine", "Two-factor authentication can be enforced for all accounts and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system." : "Kaheastmelist autentimist on võimalik teha kohustuslikuks kas kõikidele kasutajakontodele või konkreetsete gruppide kaupa. Kui kaheastmelise autentimise kohustuslikkus on määratud, kuid on kasutajal seadistamata, siis ta ei saa siia serverisse sisse logida.", "Enforce two-factor authentication" : "Tee kaheastmeline autentimine kohustuslikuks", @@ -347,7 +357,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Sinu kontole hetkel sisse loginud veebi-, töölaua-, ja mobiilsed kliendid.", "Error while creating device token" : "Tõrge seadme märke loomisel", "App name" : "Rakenduse nimi", - "Create new app password" : "Loo uus rakenduse parool", + "Create new app password" : "Loo uus rakenduse salasõna", "App password copied!" : "Rakenduse salasõna on kopeeritud!", "Copy app password" : "Kopeeri rakenduse salasõna", "Login name copied!" : "Kasutajanimi on koeeritud!", @@ -527,6 +537,7 @@ "Set account as admin for" : "Määra kasutajakonto peakasutajaks siin:", "Select account quota" : "Määra kasutajakonto kvoot", "Set the language" : "Vali keel", + "Toggle account actions menu" : "Lülita kasutajakonto tegevuste menüü sisse/välja", "Done" : "Valmis", "Edit" : "Muuda", "Account management settings" : "Kasutajakontode halduse seadistused", @@ -558,8 +569,13 @@ "No devices configured." : "Ühtegi seadet pole seadistatud.", "The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:", "Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.", - "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saate jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Administraatorina saad jagamise valikuid täpselt seadistada. Lisateavet leiad dokumentatsioonist.", "You need to enable the File sharing App." : "Sa pead kasutusele võtma Failijagamise rakenduse.", + "App Store" : "Rakendustepood", + "Loading app list" : "Laadin rakenduste loendit", + "Loading categories" : "Laadin kategooriaid", + "Developer documentation ↗" : "Dokumentatsioon arendajatele ↗", + "Version {version}, {license}-licensed" : "Versioon {version}, avaldatud {license} litsentsi alusel", "Version {version}" : "Versioon {version}", "All accounts" : "Kõik kasutajakontod", "Admins" : "Haldurid", diff --git a/apps/settings/l10n/lv.js b/apps/settings/l10n/lv.js index f22d5e9ac96..0516783f8b2 100644 --- a/apps/settings/l10n/lv.js +++ b/apps/settings/l10n/lv.js @@ -122,7 +122,7 @@ OC.L10N.register( "Create new app password" : "Izveidot jaunu lietotnes paroli", "New app password" : "Jauna lietotnes parole", "Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Zemāk esošie piekļuves dati jāizmanto, lai konfigurētu lietotni vai ierīci. Drošības iemeslu dēļ šī parole tiks parādīta tikai vienu reizi.", - "Login" : "Pieteikumvārds", + "Login" : "Pieteikties", "Password" : "Parole", "Show QR code for mobile apps" : "Parādīt kvadrātkodu tālruņa lietotnēm", "Profile" : "Profils", diff --git a/apps/settings/l10n/lv.json b/apps/settings/l10n/lv.json index 5c87992b05b..11de016ba60 100644 --- a/apps/settings/l10n/lv.json +++ b/apps/settings/l10n/lv.json @@ -120,7 +120,7 @@ "Create new app password" : "Izveidot jaunu lietotnes paroli", "New app password" : "Jauna lietotnes parole", "Use the credentials below to configure your app or device. For security reasons this password will only be shown once." : "Zemāk esošie piekļuves dati jāizmanto, lai konfigurētu lietotni vai ierīci. Drošības iemeslu dēļ šī parole tiks parādīta tikai vienu reizi.", - "Login" : "Pieteikumvārds", + "Login" : "Pieteikties", "Password" : "Parole", "Show QR code for mobile apps" : "Parādīt kvadrātkodu tālruņa lietotnēm", "Profile" : "Profils", diff --git a/apps/sharebymail/l10n/et_EE.js b/apps/sharebymail/l10n/et_EE.js index 47f81d56824..c47755cfca4 100644 --- a/apps/sharebymail/l10n/et_EE.js +++ b/apps/sharebymail/l10n/et_EE.js @@ -3,6 +3,8 @@ OC.L10N.register( { "Shared with {email}" : "Jagatud aadressile {email}", "Shared with {email} by {actor}" : "Jagatud aadressile {email} {actor} poolt", + "Unshared from {email}" : "Jagamine {email} aadressile on lõpetatud", + "Unshared from {email} by {actor}" : "{actor} lõpetas jagamise {email} aadressile", "Password for mail share sent to {email}" : "E-kirjaga jagamise salasõna on saadetud aadressile {email}", "Password for mail share sent to you" : "Sulle saadetud e-kirjaga jagamise salasõna", "Password to access {file} was sent to {email}" : "Salasõna ligipääsuks „{file}“ failile saadeti aadressile {email}", @@ -10,6 +12,7 @@ OC.L10N.register( "Share by mail" : "Jaga e-postiga", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "%1$s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %2$s", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Me ei saa sulle automaatselt loodud salasõna saata. Palun määra oma isiklikes seadistustes korrektne e-posti aadress ja proovi uuesti.", + "Failed to send share by email. Got an invalid email address" : "Jaosmeedia saatmine e-postiga ei õnnestunud. Ilmselt oli e-posti aadress vale.", "Failed to send share by email" : "Jaosmeediat polnud võimalik e-kirjaga saata", "%1$s shared %2$s with you" : "%1$s jagas sinuga: %2$s", "Note:" : "Märkus:", @@ -31,7 +34,8 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Salasõna saad alati jagamisvaatest muuta.", "Could not find share" : "Jagamist ei leitud.", "Share provider which allows you to share files by mail" : "Jagamisteenuse pakkuja, mis võimaldab sul meediat jagada e-posti vahendusel", - "Send password by mail" : "Saada parool e-postiga", + "Unable to update share by mail config" : "E-postiga jagamise seadistuste uuendamine ei õnnestu.", + "Send password by mail" : "Saada salasõna e-postiga", "Reply to initiator" : "Vasta algatajale" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/et_EE.json b/apps/sharebymail/l10n/et_EE.json index ce01d8465ad..ad4029da1e0 100644 --- a/apps/sharebymail/l10n/et_EE.json +++ b/apps/sharebymail/l10n/et_EE.json @@ -1,6 +1,8 @@ { "translations": { "Shared with {email}" : "Jagatud aadressile {email}", "Shared with {email} by {actor}" : "Jagatud aadressile {email} {actor} poolt", + "Unshared from {email}" : "Jagamine {email} aadressile on lõpetatud", + "Unshared from {email} by {actor}" : "{actor} lõpetas jagamise {email} aadressile", "Password for mail share sent to {email}" : "E-kirjaga jagamise salasõna on saadetud aadressile {email}", "Password for mail share sent to you" : "Sulle saadetud e-kirjaga jagamise salasõna", "Password to access {file} was sent to {email}" : "Salasõna ligipääsuks „{file}“ failile saadeti aadressile {email}", @@ -8,6 +10,7 @@ "Share by mail" : "Jaga e-postiga", "Sharing %1$s failed, because this item is already shared with the account %2$s" : "%1$s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %2$s", "We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Me ei saa sulle automaatselt loodud salasõna saata. Palun määra oma isiklikes seadistustes korrektne e-posti aadress ja proovi uuesti.", + "Failed to send share by email. Got an invalid email address" : "Jaosmeedia saatmine e-postiga ei õnnestunud. Ilmselt oli e-posti aadress vale.", "Failed to send share by email" : "Jaosmeediat polnud võimalik e-kirjaga saata", "%1$s shared %2$s with you" : "%1$s jagas sinuga: %2$s", "Note:" : "Märkus:", @@ -29,7 +32,8 @@ "You can choose a different password at any time in the share dialog." : "Salasõna saad alati jagamisvaatest muuta.", "Could not find share" : "Jagamist ei leitud.", "Share provider which allows you to share files by mail" : "Jagamisteenuse pakkuja, mis võimaldab sul meediat jagada e-posti vahendusel", - "Send password by mail" : "Saada parool e-postiga", + "Unable to update share by mail config" : "E-postiga jagamise seadistuste uuendamine ei õnnestu.", + "Send password by mail" : "Saada salasõna e-postiga", "Reply to initiator" : "Vasta algatajale" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file 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/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( |