Compare commits

..

1 Commits

Author SHA1 Message Date
Git'Fellow ffca01a648 fix(previewCleanup): Also cleanup the database
Signed-off-by: Git'Fellow <12234510+solracsf@users.noreply.github.com>
2025-10-13 19:26:49 +02:00
1125 changed files with 18407 additions and 73384 deletions
+1 -4
View File
@@ -38,10 +38,7 @@ updates:
# Main master npm frontend dependencies
- package-ecosystem: npm
directories:
- "/"
- "/build/frontend"
- "/build/frontend-legacy"
directory: "/"
schedule:
interval: weekly
day: saturday
+12 -11
View File
@@ -102,8 +102,8 @@ jobs:
matrix:
# Run multiple copies of the current job in parallel
# Please increase the number or runners as your tests suite grows (0 based index for e2e tests)
containers: ['setup', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# Hack as strategy.job-total includes the "setup" and GitHub does not allow math expressions
containers: ['component', 'setup', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# Hack as strategy.job-total includes the component and GitHub does not allow math expressions
# Always align this number with the total of e2e runners (max. index + 1)
total-containers: [10]
@@ -205,19 +205,20 @@ jobs:
cypress/snapshots
cypress/videos
- name: Show logs
- name: Extract NC logs
if: failure() && matrix.containers != 'component'
run: |
for id in $(docker ps -aq); do
docker container inspect "$id" --format '=== Logs for container {{.Name}} ==='
docker logs "$id" >> nextcloud.log
done
echo '=== Nextcloud server logs ==='
docker exec nextcloud-e2e-test-server_${{ env.APP_NAME }} cat data/nextcloud.log
run: docker logs nextcloud-cypress-tests_${{ env.APP_NAME }} > nextcloud.log
- name: Upload NC logs
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
if: failure() && matrix.containers != 'component'
with:
name: nc_logs_${{ matrix.containers }}
path: nextcloud.log
- name: Create data dir archive
if: failure() && matrix.containers != 'component'
run: docker exec nextcloud-e2e-test-server_${{ env.APP_NAME }} tar -cvjf - data > data.tar
run: docker exec nextcloud-cypress-tests_${{ env.APP_NAME }} tar -cvjf - data > data.tar
- name: Upload data dir archive
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
+1 -2
View File
@@ -84,10 +84,9 @@ jobs:
ports:
- 6379:6379/tcp
openldap:
image: ghcr.io/nextcloud/continuous-integration-openldap:openldap-8 # zizmor: ignore[unpinned-images]
image: ghcr.io/nextcloud/continuous-integration-openldap:openldap-7 # zizmor: ignore[unpinned-images]
ports:
- 389:389
- 636:636
env:
SLAPD_DOMAIN: nextcloud.ci
SLAPD_ORGANIZATION: Nextcloud
+8 -1
View File
@@ -11,7 +11,7 @@
/apps/inc.php
/assets
/.htaccess
node_modules/
/node_modules
/translationfiles
/translationtool.phar
@@ -55,6 +55,10 @@ node_modules/
/apps/files_external/3rdparty/irodsphp/prods/test*
/apps/files_external/tests/config.*.php
# apps modules
/apps/*/node_modules
# ignore themes except the example and the README
/themes/*
!/themes/example
@@ -127,6 +131,9 @@ nbproject
# Tests
/tests/phpunit.xml
# Node Modules
/build/node_modules/
# nodejs
/build/bin
/build/lib/
+1 -7
View File
@@ -3,12 +3,6 @@ SPDX-PackageName = "nextcloud"
SPDX-PackageSupplier = "Nextcloud <info@nextcloud.com>"
SPDX-PackageDownloadLocation = "https://github.com/nextcloud/server"
[[annotations]]
path = ["dist/rolldown-runtime-*.js"]
precedence = "aggregate"
SPDX-FileCopyrightText = "rolldown contributors"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = ["lib/l10n/**.js", "lib/l10n/**.json", "core/l10n/**.js", "core/l10n/**.json", "apps/admin_audit/l10n/**.js", "apps/admin_audit/l10n/**.json", "apps/comments/l10n/**.js", "apps/comments/l10n/**.json", "apps/dav/l10n/**.js", "apps/dav/l10n/**.json", "apps/encryption/l10n/**.js", "apps/encryption/l10n/**.json", "apps/federatedfilesharing/l10n/**.js", "apps/federatedfilesharing/l10n/**.json", "apps/federation/l10n/**.js", "apps/federation/l10n/**.json", "apps/files/l10n/**.js", "apps/files/l10n/**.json", "apps/files_external/l10n/**.js", "apps/files_external/l10n/**.json", "apps/files_sharing/l10n/**.js", "apps/files_sharing/l10n/**.json", "apps/files_trashbin/l10n/**.js", "apps/files_trashbin/l10n/**.json", "apps/files_versions/l10n/**.js", "apps/files_versions/l10n/**.json", "apps/provisioning_api/l10n/**.js", "apps/provisioning_api/l10n/**.json", "apps/settings/l10n/**.js", "apps/settings/l10n/**.json", "apps/systemtags/l10n/**.js", "apps/systemtags/l10n/**.json", "apps/updatenotification/l10n/**.js", "apps/updatenotification/l10n/**.json", "apps/user_ldap/l10n/**.js", "apps/user_ldap/l10n/**.json"]
precedence = "aggregate"
@@ -184,7 +178,7 @@ SPDX-FileCopyrightText = "2020 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
[[annotations]]
path = ["cypress/tsconfig.json", "cypress/fixtures/appstore/apps.json", "dist/*.css"]
path = ["cypress/tsconfig.json", "cypress/fixtures/appstore/apps.json", "dist/icons.css"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2022 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
-1
View File
@@ -2,7 +2,6 @@
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/
export function setup() {
process.env.TZ = 'UTC'
}
-1
View File
@@ -2,6 +2,5 @@
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*/
import '@testing-library/jest-dom/vitest'
import 'core-js/stable/index.js'
-1
View File
@@ -17,7 +17,6 @@ OC.L10N.register(
"Delete comment" : "Slet kommentar",
"Cancel edit" : "Annullér redigering",
"New comment" : "Ny kommentar",
"Write a comment …" : "Skriv kommentar …",
"Post comment" : "Skriv kommentar",
"@ for mentions, : for emoji, / for smart picker" : "\"@\" for at omtale, \":\" for emojis, \"/\" for Smart Vælger",
"Could not reload comments" : "Kunne ikke indlæse kommentarer",
-1
View File
@@ -15,7 +15,6 @@
"Delete comment" : "Slet kommentar",
"Cancel edit" : "Annullér redigering",
"New comment" : "Ny kommentar",
"Write a comment …" : "Skriv kommentar …",
"Post comment" : "Skriv kommentar",
"@ for mentions, : for emoji, / for smart picker" : "\"@\" for at omtale, \":\" for emojis, \"/\" for Smart Vælger",
"Could not reload comments" : "Kunne ikke indlæse kommentarer",
+1 -1
View File
@@ -17,7 +17,7 @@ OC.L10N.register(
"Delete comment" : "Kommentar löschen",
"Cancel edit" : "Bearbeiten abbrechen",
"New comment" : "Neuer Kommentar",
"Write a comment …" : "Einen Kommentar schreiben …",
"Write a comment …" : "Schreiben Sie einen Kommentar  …",
"Post comment" : "Kommentar veröffentlichen",
"@ for mentions, : for emoji, / for smart picker" : "@ für Erwähnungen, : für Emoji, / für Smart Picker",
"Could not reload comments" : "Kommentare konnten nicht erneut geladen werden",
+1 -1
View File
@@ -15,7 +15,7 @@
"Delete comment" : "Kommentar löschen",
"Cancel edit" : "Bearbeiten abbrechen",
"New comment" : "Neuer Kommentar",
"Write a comment …" : "Einen Kommentar schreiben …",
"Write a comment …" : "Schreiben Sie einen Kommentar  …",
"Post comment" : "Kommentar veröffentlichen",
"@ for mentions, : for emoji, / for smart picker" : "@ für Erwähnungen, : für Emoji, / für Smart Picker",
"Could not reload comments" : "Kommentare konnten nicht erneut geladen werden",
-1
View File
@@ -17,7 +17,6 @@ OC.L10N.register(
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"New comment" : "New comment",
"Write a comment …" : "Write a comment …",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
-1
View File
@@ -15,7 +15,6 @@
"Delete comment" : "Delete comment",
"Cancel edit" : "Cancel edit",
"New comment" : "New comment",
"Write a comment …" : "Write a comment …",
"Post comment" : "Post comment",
"@ for mentions, : for emoji, / for smart picker" : "@ for mentions, : for emoji, / for smart picker",
"Could not reload comments" : "Could not reload comments",
-1
View File
@@ -17,7 +17,6 @@ OC.L10N.register(
"Delete comment" : "Вилучити коментар",
"Cancel edit" : "Скасувати редагування",
"New comment" : "Новий коментар",
"Write a comment …" : "Додайте коментар …",
"Post comment" : "Опублікувати коментар",
"@ for mentions, : for emoji, / for smart picker" : "@ згадати, : емоційки, / асистент вибору",
"Could not reload comments" : "Не вдалося перезавантажити коментарі",
-1
View File
@@ -15,7 +15,6 @@
"Delete comment" : "Вилучити коментар",
"Cancel edit" : "Скасувати редагування",
"New comment" : "Новий коментар",
"Write a comment …" : "Додайте коментар …",
"Post comment" : "Опублікувати коментар",
"@ for mentions, : for emoji, / for smart picker" : "@ згадати, : емоційки, / асистент вибору",
"Could not reload comments" : "Не вдалося перезавантажити коментарі",
-1
View File
@@ -20,7 +20,6 @@ OC.L10N.register(
"Edit widgets" : "Tilpas widgets",
"Get more widgets from the App Store" : "Få flere widgets fra App Store",
"Weather service" : "Vejret",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Af hensyn til dit privatliv anmoder din {productName} server om vejrdata på dine vegne, så vejrtjenesten ikke modtager personlige oplysninger.",
"Weather data from Met.no" : "Vejr-data leveres af Met.no",
"geocoding with Nominatim" : "Geocoding med Nominatim",
"elevation data from OpenTopoData" : "Højde-data fra OpenTopoData",
-1
View File
@@ -18,7 +18,6 @@
"Edit widgets" : "Tilpas widgets",
"Get more widgets from the App Store" : "Få flere widgets fra App Store",
"Weather service" : "Vejret",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Af hensyn til dit privatliv anmoder din {productName} server om vejrdata på dine vegne, så vejrtjenesten ikke modtager personlige oplysninger.",
"Weather data from Met.no" : "Vejr-data leveres af Met.no",
"geocoding with Nominatim" : "Geocoding med Nominatim",
"elevation data from OpenTopoData" : "Højde-data fra OpenTopoData",
+3 -11
View File
@@ -81,7 +81,7 @@ $linkCheckPlugin = new PublicLinkCheckPlugin();
$filesDropPlugin = new FilesDropPlugin();
/** @var string $baseuri defined in public.php */
$server = $serverFactory->createServer(true, $baseuri, $requestUri, $authPlugin, function (\Sabre\DAV\Server $server) use ($baseuri, $requestUri, $authBackend, $linkCheckPlugin, $filesDropPlugin) {
$server = $serverFactory->createServer(true, $baseuri, $requestUri, $authPlugin, function (\Sabre\DAV\Server $server) use ($authBackend, $linkCheckPlugin, $filesDropPlugin) {
// GET must be allowed for e.g. showing images and allowing Zip downloads
if ($server->httpRequest->getMethod() !== 'GET') {
// If this is *not* a GET request we only allow access to public DAV from AJAX or when Server2Server is allowed
@@ -103,16 +103,8 @@ $server = $serverFactory->createServer(true, $baseuri, $requestUri, $authPlugin,
$previousLog = Filesystem::logWarningWhenAddingStorageWrapper(false);
/** @psalm-suppress MissingClosureParamType */
Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($requestUri, $baseuri, $share) {
$mask = $share->getPermissions() | Constants::PERMISSION_SHARE;
// For chunked uploads it is necessary to have read and delete permission,
// so the temporary directory, chunks and destination file can be read and delete after the assembly.
if (str_starts_with(substr($requestUri, strlen($baseuri) - 1), '/uploads/')) {
$mask |= Constants::PERMISSION_READ | Constants::PERMISSION_DELETE;
}
return new PermissionsMask(['storage' => $storage, 'mask' => $mask]);
Filesystem::addStorageWrapper('sharePermissions', function ($mountPoint, $storage) use ($share) {
return new PermissionsMask(['storage' => $storage, 'mask' => $share->getPermissions() | Constants::PERMISSION_SHARE]);
});
/** @psalm-suppress MissingClosureParamType */
-1
View File
@@ -252,7 +252,6 @@ OC.L10N.register(
"Completed on %s" : "Dokončeno %s",
"Due on %s by %s" : "Termín do %s od %s",
"Due on %s" : "Termín do %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Vítejte v Nextcloud Kalendáři!\n\nToto je událost pro ukázku prozkoumejte flexibilitu plánování pomoc Nextcloud Kalendáře upravením čeho chcete!\n\nS Nextcloud Kalendářem je možné:\n- Jednoduše vytvářet, upravovat a spravovat události.\n- Vytvářet vícero kalendářů a sdílet je s kolegy, přáteli či rodinou.\n- Zjišťovat dostupnost a zobrazovat své doby nedostupnosti ostatním.\n- Hladce napojovat na aplikace a zřízení prostřednictvím CalDAV.\n- Přizpůsobit si svůj dojem z používání: plánovat opakující se události, upravovat notifikace a ostatní nastavení.",
"Example event - open me!" : "Událost pro ukázku otevřete ji!",
"System Address Book" : "Systémový adresář kontaktů",
"The system address book contains contact information for all users in your instance." : "Systémový adresář kontaktů obsahuje informace pro všechny uživatele ve vámi využívané instanci.",
-1
View File
@@ -250,7 +250,6 @@
"Completed on %s" : "Dokončeno %s",
"Due on %s by %s" : "Termín do %s od %s",
"Due on %s" : "Termín do %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Vítejte v Nextcloud Kalendáři!\n\nToto je událost pro ukázku prozkoumejte flexibilitu plánování pomoc Nextcloud Kalendáře upravením čeho chcete!\n\nS Nextcloud Kalendářem je možné:\n- Jednoduše vytvářet, upravovat a spravovat události.\n- Vytvářet vícero kalendářů a sdílet je s kolegy, přáteli či rodinou.\n- Zjišťovat dostupnost a zobrazovat své doby nedostupnosti ostatním.\n- Hladce napojovat na aplikace a zřízení prostřednictvím CalDAV.\n- Přizpůsobit si svůj dojem z používání: plánovat opakující se události, upravovat notifikace a ostatní nastavení.",
"Example event - open me!" : "Událost pro ukázku otevřete ji!",
"System Address Book" : "Systémový adresář kontaktů",
"The system address book contains contact information for all users in your instance." : "Systémový adresář kontaktů obsahuje informace pro všechny uživatele ve vámi využívané instanci.",
-6
View File
@@ -220,8 +220,6 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} opdaterede kontakten {card} i adressebog {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Du opdaterede kontakten {card} i adressebog {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressebog</strong> blev ændret",
"System address book disabled" : "Systemadressebog deaktiveret",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Adressebogen for systemkontakter er automatisk blevet deaktiveret under opgraderingen. Det betyder, at adressebogen ikke længere vil være tilgængelig for brugere i kontaktappen eller andre klienter. Adressebogen for systemkontakter blev deaktiveret, fordi antallet af kontakter i adressebogen oversteg det maksimale anbefalede antal kontakter. Denne grænse er indstillet for at forhindre problemer med ydeevnen. Du kan genaktivere systemadressebogen med følgende kommando {command}",
"Accounts" : "Konti",
"System address book which holds all accounts" : "Systemets adressebog, som indeholder alle konti",
"File is not updatable: %1$s" : "Filen kan ikke updateres: %1$s",
@@ -260,10 +258,6 @@ OC.L10N.register(
"DAV system address book" : "DAV system adressebog",
"No outstanding DAV system address book sync." : "Ingen udestående synkronisering af DAV-systemets adressebog.",
"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-systemets adressebogssynkronisering er ikke kørt endnu, da din instans har mere end 1000 brugere, eller fordi der opstod en fejl. Kør det manuelt ved at kalde \"occ dav:sync-system-addressbook\".",
"DAV system address book size" : "Størrelse på DAV-systemets adressebog",
"The system address book is disabled" : "Systemets adressebog er deaktiveret",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Systemadressebogen er aktiveret, men indeholder mere end den konfigurerede grænse på %d kontakter",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Systemadressebogen er aktiveret og indeholder mindre end den konfigurerede grænse på %d kontakter",
"WebDAV endpoint" : "WebDAV endpoint",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere, at din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV. Tjek venligst manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
-6
View File
@@ -218,8 +218,6 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} opdaterede kontakten {card} i adressebog {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Du opdaterede kontakten {card} i adressebog {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressebog</strong> blev ændret",
"System address book disabled" : "Systemadressebog deaktiveret",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Adressebogen for systemkontakter er automatisk blevet deaktiveret under opgraderingen. Det betyder, at adressebogen ikke længere vil være tilgængelig for brugere i kontaktappen eller andre klienter. Adressebogen for systemkontakter blev deaktiveret, fordi antallet af kontakter i adressebogen oversteg det maksimale anbefalede antal kontakter. Denne grænse er indstillet for at forhindre problemer med ydeevnen. Du kan genaktivere systemadressebogen med følgende kommando {command}",
"Accounts" : "Konti",
"System address book which holds all accounts" : "Systemets adressebog, som indeholder alle konti",
"File is not updatable: %1$s" : "Filen kan ikke updateres: %1$s",
@@ -258,10 +256,6 @@
"DAV system address book" : "DAV system adressebog",
"No outstanding DAV system address book sync." : "Ingen udestående synkronisering af DAV-systemets adressebog.",
"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-systemets adressebogssynkronisering er ikke kørt endnu, da din instans har mere end 1000 brugere, eller fordi der opstod en fejl. Kør det manuelt ved at kalde \"occ dav:sync-system-addressbook\".",
"DAV system address book size" : "Størrelse på DAV-systemets adressebog",
"The system address book is disabled" : "Systemets adressebog er deaktiveret",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Systemadressebogen er aktiveret, men indeholder mere end den konfigurerede grænse på %d kontakter",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Systemadressebogen er aktiveret og indeholder mindre end den konfigurerede grænse på %d kontakter",
"WebDAV endpoint" : "WebDAV endpoint",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Kunne ikke kontrollere, at din webserver er korrekt konfigureret til at tillade filsynkronisering over WebDAV. Tjek venligst manuelt.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Din webserver er endnu ikke sat korrekt op til at tillade filsynkronisering, fordi WebDAV-grænsefladen ser ud til at være i stykker.",
+7 -7
View File
@@ -308,14 +308,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",
"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 Termins wird den bestehenden Termin überschreiben.",
"Upload event" : "Termin hochladen",
"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",
+7 -7
View File
@@ -306,14 +306,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",
"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 Termins wird den bestehenden Termin überschreiben.",
"Upload event" : "Termin hochladen",
"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",
+1 -1
View File
@@ -24,7 +24,7 @@ class Capabilities implements ICapability {
$capabilities = [
'dav' => [
'chunking' => '1.0',
'public_shares_chunking' => false,
'public_shares_chunking' => true,
]
];
if ($this->config->getSystemValueBool('bulkupload.enabled', true)) {
+1 -4
View File
@@ -11,7 +11,6 @@ declare(strict_types=1);
namespace OCA\DAV\Command;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\RemoteUserPrincipalBackend;
use OCP\IDBConnection;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
@@ -25,7 +24,6 @@ class RemoveInvalidShares extends Command {
public function __construct(
private IDBConnection $connection,
private Principal $principalBackend,
private RemoteUserPrincipalBackend $remoteUserPrincipalBackend,
) {
parent::__construct();
}
@@ -44,8 +42,7 @@ class RemoveInvalidShares extends Command {
while ($row = $result->fetch()) {
$principaluri = $row['principaluri'];
$p = $this->principalBackend->getPrincipalByPath($principaluri)
?? $this->remoteUserPrincipalBackend->getPrincipalByPath($principaluri);
$p = $this->principalBackend->getPrincipalByPath($principaluri);
if ($p === null) {
$this->deleteSharesForPrincipal($principaluri);
}
+7 -47
View File
@@ -566,18 +566,6 @@ class CustomPropertiesBackend implements BackendInterface {
return $path;
}
private static function checkIsArrayOfScalar(string $name, array $array): void {
foreach ($array as $item) {
if (is_array($item)) {
self::checkIsArrayOfScalar($name, $item);
} elseif ($item !== null && !is_scalar($item)) {
throw new DavException(
"Property \"$name\" has an invalid value of array containing " . gettype($item),
);
}
}
}
/**
* @throws ParseException If parsing a \Sabre\DAV\Xml\Property\Complex value fails
* @throws DavException If the property value is invalid
@@ -612,23 +600,6 @@ class CustomPropertiesBackend implements BackendInterface {
$valueType = self::PROPERTY_TYPE_HREF;
$value = $value->getHref();
} else {
if (is_array($value)) {
// For array only allow scalar values
self::checkIsArrayOfScalar($name, $value);
} elseif (!is_object($value)) {
throw new DavException(
"Property \"$name\" has an invalid value of type " . gettype($value),
);
} else {
if (!str_starts_with($value::class, 'Sabre\\DAV\\Xml\\Property\\')
&& !str_starts_with($value::class, 'Sabre\\CalDAV\\Xml\\Property\\')
&& !str_starts_with($value::class, 'Sabre\\CardDAV\\Xml\\Property\\')
&& !str_starts_with($value::class, 'OCA\\DAV\\')) {
throw new DavException(
"Property \"$name\" has an invalid value of class " . $value::class,
);
}
}
$valueType = self::PROPERTY_TYPE_OBJECT;
// serialize produces null character
// these can not be properly stored in some databases and need to be replaced
@@ -641,24 +612,13 @@ class CustomPropertiesBackend implements BackendInterface {
* @return mixed|Complex|string
*/
private function decodeValueFromDatabase(string $value, int $valueType): mixed {
switch ($valueType) {
case self::PROPERTY_TYPE_XML:
return new Complex($value);
case self::PROPERTY_TYPE_HREF:
return new Href($value);
case self::PROPERTY_TYPE_OBJECT:
if (preg_match('/^a:/', $value)) {
// Array, unserialize only scalar values
return unserialize(str_replace('\x00', chr(0), $value), ['allowed_classes' => false]);
}
if (!preg_match('/^O\:\d+\:\"(OCA\\\\DAV\\\\|Sabre\\\\(Cal|Card)?DAV\\\\Xml\\\\Property\\\\)/', $value)) {
throw new \LogicException('Found an object class serialized in DB that is not allowed');
}
// some databases can not handel null characters, these are custom encoded during serialization
// this custom encoding needs to be first reversed before unserializing
return unserialize(str_replace('\x00', chr(0), $value));
default:
return $value;
return match ($valueType) {
self::PROPERTY_TYPE_XML => new Complex($value),
self::PROPERTY_TYPE_HREF => new Href($value),
// some databases can not handel null characters, these are custom encoded during serialization
// this custom encoding needs to be first reversed before unserializing
self::PROPERTY_TYPE_OBJECT => unserialize(str_replace('\x00', chr(0), $value)),
default => $value,
};
}
+18 -37
View File
@@ -42,10 +42,6 @@ class FilesDropPlugin extends ServerPlugin {
}
public function onMkcol(RequestInterface $request, ResponseInterface $response) {
if ($this->isChunkedUpload($request)) {
return;
}
if (!$this->enabled || $this->share === null) {
return;
}
@@ -62,18 +58,7 @@ class FilesDropPlugin extends ServerPlugin {
return false;
}
private function isChunkedUpload(RequestInterface $request): bool {
return str_starts_with(substr($request->getUrl(), strlen($request->getBaseUrl()) - 1), '/uploads/');
}
public function beforeMethod(RequestInterface $request, ResponseInterface $response) {
$isChunkedUpload = $this->isChunkedUpload($request);
// For the final MOVE request of a chunked upload it is necessary to modify the Destination header.
if ($isChunkedUpload && $request->getMethod() !== 'MOVE') {
return;
}
if (!$this->enabled || $this->share === null) {
return;
}
@@ -83,8 +68,21 @@ class FilesDropPlugin extends ServerPlugin {
return;
}
if ($request->getMethod() !== 'PUT' && $request->getMethod() !== 'MKCOL' && (!$isChunkedUpload || $request->getMethod() !== 'MOVE')) {
throw new MethodNotAllowed('Only PUT, MKCOL and MOVE are allowed on files drop');
// Retrieve the nickname from the request
$nickname = $request->hasHeader('X-NC-Nickname')
? trim(urldecode($request->getHeader('X-NC-Nickname')))
: null;
if ($request->getMethod() !== 'PUT') {
// If uploading subfolders we need to ensure they get created
// within the nickname folder
if ($request->getMethod() === 'MKCOL') {
if (!$nickname) {
throw new BadRequest('A nickname header is required when uploading subfolders');
}
} else {
throw new MethodNotAllowed('Only PUT is allowed on files drop');
}
}
// If this is a folder creation request
@@ -97,16 +95,8 @@ class FilesDropPlugin extends ServerPlugin {
// full path along the way. We'll only handle conflict
// resolution on file conflicts, but not on folders.
if ($isChunkedUpload) {
$destination = $request->getHeader('destination');
$baseUrl = $request->getBaseUrl();
// e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
$path = substr($destination, strpos($destination, $baseUrl) + strlen($baseUrl));
} else {
// e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
$path = $request->getPath();
}
// e.g files/dCP8yn3N86EK9sL/Folder/image.jpg
$path = $request->getPath();
$token = $this->share->getToken();
// e.g files/dCP8yn3N86EK9sL
@@ -122,11 +112,6 @@ class FilesDropPlugin extends ServerPlugin {
$isFileRequest = $attributes->getAttribute('fileRequest', 'enabled') === true;
}
// Retrieve the nickname from the request
$nickname = $request->hasHeader('X-NC-Nickname')
? trim(urldecode($request->getHeader('X-NC-Nickname')))
: null;
// We need a valid nickname for file requests
if ($isFileRequest && !$nickname) {
throw new BadRequest('A nickname header is required for file requests');
@@ -202,11 +187,7 @@ class FilesDropPlugin extends ServerPlugin {
$relativePath = substr($folder->getPath(), strlen($node->getPath()));
$path = '/files/' . $token . '/' . $relativePath . '/' . $uniqueName;
$url = rtrim($request->getBaseUrl(), '/') . str_replace('//', '/', $path);
if ($isChunkedUpload) {
$request->setHeader('destination', $url);
} else {
$request->setUrl($url);
}
$request->setUrl($url);
}
private function getPathSegments(string $path): array {
@@ -56,8 +56,6 @@ class AvailabilitySettings implements ISettings {
}
}
\OCP\Util::addStyle(Application::APP_ID, 'settings-personal-availability');
\OCP\Util::addScript(Application::APP_ID, 'settings-personal-availability');
return new TemplateResponse(Application::APP_ID, 'settings-personal-availability');
}
-3
View File
@@ -44,9 +44,6 @@ class CalDAVSettings implements IDelegatedSettings {
$value = $this->config->getAppValue(Application::APP_ID, $key, $default);
$this->initialState->provideInitialState($key, $value === 'yes');
}
\OCP\Util::addScript(Application::APP_ID, 'settings-admin-caldav');
\OCP\Util::addStyle(Application::APP_ID, 'settings-admin-caldav');
return new TemplateResponse(Application::APP_ID, 'settings-admin-caldav');
}
@@ -53,9 +53,7 @@ class ExampleContentSettings implements ISettings {
);
}
\OCP\Util::addStyle(Application::APP_ID, 'settings-admin-example-content');
\OCP\Util::addScript(Application::APP_ID, 'settings-admin-example-content');
return new TemplateResponse(Application::APP_ID, 'settings-admin-example-content');
return new TemplateResponse(Application::APP_ID, 'settings-example-content');
}
public function getSection(): ?string {
+26 -23
View File
@@ -9,39 +9,46 @@
<NcDateTimePickerNative
id="absence-first-day"
v-model="firstDay"
:label="t('dav', 'First day')"
:label="$t('dav', 'First day')"
class="absence__dates__picker"
:required="true" />
<NcDateTimePickerNative
id="absence-last-day"
v-model="lastDay"
:label="t('dav', 'Last day (inclusive)')"
:label="$t('dav', 'Last day (inclusive)')"
class="absence__dates__picker"
:required="true" />
</div>
<label for="replacement-search-input">{{ t('dav', 'Out of office replacement (optional)') }}</label>
<NcSelectUsers
<label for="replacement-search-input">{{ $t('dav', 'Out of office replacement (optional)') }}</label>
<NcSelect
ref="select"
v-model="replacementUser"
input-id="replacement-search-input"
:loading="searchLoading"
:placeholder="t('dav', 'Name of the replacement')"
:placeholder="$t('dav', 'Name of the replacement')"
:clear-search-on-blur="() => false"
user-select
:options="options"
@search="asyncFind" />
<NcTextField v-model="status" :label="t('dav', 'Short absence status')" :required="true" />
<NcTextArea v-model="message" :label="t('dav', 'Long absence Message')" :required="true" />
@search="asyncFind">
<template #no-options="{ search }">
{{ search ? $t('dav', 'No results.') : $t('dav', 'Start typing.') }}
</template>
</NcSelect>
<NcTextField :value.sync="status" :label="$t('dav', 'Short absence status')" :required="true" />
<NcTextArea :value.sync="message" :label="$t('dav', 'Long absence Message')" :required="true" />
<div class="absence__buttons">
<NcButton
:disabled="loading || !valid"
variant="primary"
type="submit">
{{ t('dav', 'Save') }}
{{ $t('dav', 'Save') }}
</NcButton>
<NcButton
:disabled="loading || !valid"
variant="error"
@click="clearAbsence">
{{ t('dav', 'Disable absence') }}
{{ $t('dav', 'Disable absence') }}
</NcButton>
</div>
</form>
@@ -52,18 +59,18 @@ import { getCurrentUser } from '@nextcloud/auth'
import axios from '@nextcloud/axios'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { generateOcsUrl } from '@nextcloud/router'
import { ShareType } from '@nextcloud/sharing'
import debounce from 'debounce'
import NcButton from '@nextcloud/vue/components/NcButton'
import NcDateTimePickerNative from '@nextcloud/vue/components/NcDateTimePickerNative'
import NcSelectUsers from '@nextcloud/vue/components/NcSelectUsers'
import NcSelect from '@nextcloud/vue/components/NcSelect'
import NcTextArea from '@nextcloud/vue/components/NcTextArea'
import NcTextField from '@nextcloud/vue/components/NcTextField'
import { logger } from '../service/logger.ts'
import { formatDateAsYMD } from '../utils/date.ts'
import logger from '../service/logger.js'
import { formatDateAsYMD } from '../utils/date.js'
/* eslint @nextcloud/vue/no-deprecated-props: "warn" */
export default {
name: 'AbsenceForm',
components: {
@@ -71,11 +78,7 @@ export default {
NcTextField,
NcTextArea,
NcDateTimePickerNative,
NcSelectUsers,
},
setup() {
return { t }
NcSelect,
},
data() {
@@ -225,9 +228,9 @@ export default {
message: this.message,
replacementUserId: this.replacementUser?.user ?? null,
})
showSuccess(t('dav', 'Absence saved'))
showSuccess(this.$t('dav', 'Absence saved'))
} catch (error) {
showError(t('dav', 'Failed to save your absence settings'))
showError(this.$t('dav', 'Failed to save your absence settings'))
logger.error('Could not save absence', { error })
} finally {
this.loading = false
@@ -239,9 +242,9 @@ export default {
try {
await axios.delete(generateOcsUrl('/apps/dav/api/v1/outOfOffice/{userId}', { userId: getCurrentUser().uid }))
this.resetForm()
showSuccess(t('dav', 'Absence cleared'))
showSuccess(this.$t('dav', 'Absence cleared'))
} catch (error) {
showError(t('dav', 'Failed to clear your absence settings'))
showError(this.$t('dav', 'Failed to clear your absence settings'))
logger.error('Could not clear absence', { error })
} finally {
this.loading = false
+37 -35
View File
@@ -2,11 +2,46 @@
- SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<template>
<div>
<CalendarAvailability
:slots.sync="slots"
:loading="loading"
:l10n-to="t('dav', 'to')"
:l10n-delete-slot="t('dav', 'Delete slot')"
:l10n-empty-day="t('dav', 'No working hours set')"
:l10n-add-slot="t('dav', 'Add slot')"
:l10n-week-day-list-label="t('dav', 'Weekdays')"
:l10n-monday="t('dav', 'Monday')"
:l10n-tuesday="t('dav', 'Tuesday')"
:l10n-wednesday="t('dav', 'Wednesday')"
:l10n-thursday="t('dav', 'Thursday')"
:l10n-friday="t('dav', 'Friday')"
:l10n-saturday="t('dav', 'Saturday')"
:l10n-sunday="t('dav', 'Sunday')"
:l10n-start-picker-label="(dayName) => t('dav', 'Pick a start time for {dayName}', { dayName })"
:l10n-end-picker-label="(dayName) => t('dav', 'Pick a end time for {dayName}', { dayName })" />
<NcCheckboxRadioSwitch v-model="automated">
{{ t('dav', 'Automatically set user status to "Do not disturb" outside of availability to mute all notifications.') }}
</NcCheckboxRadioSwitch>
<NcButton
:disabled="loading || saving"
variant="primary"
@click="save">
{{ t('dav', 'Save') }}
</NcButton>
</div>
</template>
<script setup lang="ts">
import { CalendarAvailability } from '@nextcloud/calendar-availability-vue'
import { getCapabilities } from '@nextcloud/capabilities'
import { showError, showSuccess } from '@nextcloud/dialogs'
import {
showError,
showSuccess,
} from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { onMounted, ref } from 'vue'
@@ -17,7 +52,7 @@ import {
getEmptySlots,
saveScheduleInboxAvailability,
} from '../service/CalendarService.js'
import { logger } from '../service/logger.ts'
import logger from '../service/logger.js'
import {
disableUserStatusAutomation,
enableUserStatusAutomation,
@@ -71,39 +106,6 @@ async function save() {
}
</script>
<template>
<div>
<CalendarAvailability
v-model:slots="slots"
:loading="loading"
:l10n-to="t('dav', 'to')"
:l10n-delete-slot="t('dav', 'Delete slot')"
:l10n-empty-day="t('dav', 'No working hours set')"
:l10n-add-slot="t('dav', 'Add slot')"
:l10n-week-day-list-label="t('dav', 'Weekdays')"
:l10n-monday="t('dav', 'Monday')"
:l10n-tuesday="t('dav', 'Tuesday')"
:l10n-wednesday="t('dav', 'Wednesday')"
:l10n-thursday="t('dav', 'Thursday')"
:l10n-friday="t('dav', 'Friday')"
:l10n-saturday="t('dav', 'Saturday')"
:l10n-sunday="t('dav', 'Sunday')"
:l10n-start-picker-label="(dayName) => t('dav', 'Pick a start time for {dayName}', { dayName })"
:l10n-end-picker-label="(dayName) => t('dav', 'Pick a end time for {dayName}', { dayName })" />
<NcCheckboxRadioSwitch v-model="automated">
{{ t('dav', 'Automatically set user status to "Do not disturb" outside of availability to mute all notifications.') }}
</NcCheckboxRadioSwitch>
<NcButton
:disabled="loading || saving"
variant="primary"
@click="save">
{{ t('dav', 'Save') }}
</NcButton>
</div>
</template>
<style lang="scss" scoped>
:deep(.availability-day) {
padding: 0 10px 0 10px;
@@ -9,7 +9,7 @@
:checked="enableDefaultContact"
type="switch"
@update:model-value="updateEnableDefaultContact">
{{ t('dav', "Add example contact to user's address book when they first log in") }}
{{ $t('dav', "Add example contact to user's address book when they first log in") }}
</NcCheckboxRadioSwitch>
<div v-if="enableDefaultContact" class="example-contact-settings__buttons">
<ExampleContentDownloadButton :href="downloadUrl">
@@ -24,7 +24,7 @@
<template #icon>
<IconUpload :size="20" />
</template>
{{ t('dav', 'Import contact') }}
{{ $t('dav', 'Import contact') }}
</NcButton>
<NcButton
v-if="hasCustomDefaultContact"
@@ -33,15 +33,15 @@
<template #icon>
<IconRestore :size="20" />
</template>
{{ t('dav', 'Reset to default') }}
{{ $t('dav', 'Reset to default') }}
</NcButton>
</div>
<NcDialog
v-model:open="isModalOpen"
:name="t('dav', 'Import contacts')"
:open.sync="isModalOpen"
:name="$t('dav', 'Import contacts')"
:buttons="buttons">
<div>
<p>{{ t('dav', 'Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?') }}</p>
<p>{{ $t('dav', 'Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?') }}</p>
</div>
</NcDialog>
<input
@@ -61,17 +61,16 @@ import IconCheck from '@mdi/svg/svg/check.svg?raw'
import axios from '@nextcloud/axios'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { generateUrl } from '@nextcloud/router'
import { NcButton, NcCheckboxRadioSwitch, NcDialog } from '@nextcloud/vue'
import IconAccount from 'vue-material-design-icons/Account.vue'
import IconRestore from 'vue-material-design-icons/Restore.vue'
import IconUpload from 'vue-material-design-icons/TrayArrowUp.vue'
import ExampleContentDownloadButton from './ExampleContentDownloadButton.vue'
import { logger } from '../service/logger.ts'
import logger from '../service/logger.js'
const enableDefaultContact = loadState('dav', 'enableDefaultContact', false)
const hasCustomDefaultContact = loadState('dav', 'hasCustomDefaultContact', false)
const enableDefaultContact = loadState('dav', 'enableDefaultContact')
const hasCustomDefaultContact = loadState('dav', 'hasCustomDefaultContact')
export default {
name: 'ExampleContactSettings',
@@ -85,10 +84,6 @@ export default {
ExampleContentDownloadButton,
},
setup() {
return { t }
},
data() {
return {
enableDefaultContact,
@@ -97,14 +92,14 @@ export default {
loading: false,
buttons: [
{
label: t('dav', 'Cancel'),
label: this.$t('dav', 'Cancel'),
icon: IconCancel,
callback: () => { this.isModalOpen = false },
},
{
label: t('dav', 'Import'),
label: this.$t('dav', 'Import'),
type: 'primary',
icon: IconCheck,
variant: 'primary',
callback: () => { this.clickImportInput() },
},
],
@@ -124,7 +119,7 @@ export default {
}).then(() => {
this.enableDefaultContact = !this.enableDefaultContact
}).catch(() => {
showError(t('dav', 'Error while saving settings'))
showError(this.$t('dav', 'Error while saving settings'))
})
},
@@ -141,11 +136,11 @@ export default {
axios.put(generateUrl('/apps/dav/api/defaultcontact/contact'))
.then(() => {
this.hasCustomDefaultContact = false
showSuccess(t('dav', 'Contact reset successfully'))
showSuccess(this.$t('dav', 'Contact reset successfully'))
})
.catch((error) => {
logger.error('Error importing contact:', { error })
showError(t('dav', 'Error while resetting contact'))
showError(this.$t('dav', 'Error while resetting contact'))
})
.finally(() => {
this.loading = false
@@ -163,10 +158,10 @@ export default {
try {
await axios.put(generateUrl('/apps/dav/api/defaultcontact/contact'), { contactData: reader.result })
this.hasCustomDefaultContact = true
showSuccess(t('dav', 'Contact imported successfully'))
showSuccess(this.$t('dav', 'Contact imported successfully'))
} catch (error) {
logger.error('Error importing contact:', { error })
showError(t('dav', 'Error while importing contact'))
showError(this.$t('dav', 'Error while importing contact'))
} finally {
this.loading = false
event.target.value = ''
@@ -3,20 +3,8 @@
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { NcButton } from '@nextcloud/vue'
import IconDownload from 'vue-material-design-icons/TrayArrowDown.vue'
defineProps<{
/**
* The href link for the download
*/
href: string
}>()
</script>
<template>
<NcButton variant="tertiary" :href>
<NcButton variant="tertiary" :href="href">
<template #icon>
<slot name="icon" />
</template>
@@ -31,6 +19,26 @@ defineProps<{
</NcButton>
</template>
<script>
import { NcButton } from '@nextcloud/vue'
import IconDownload from 'vue-material-design-icons/TrayArrowDown.vue'
export default {
name: 'ExampleContentDownloadButton',
components: {
NcButton,
IconDownload,
},
props: {
href: {
type: String,
required: true,
},
},
}
</script>
<style lang="scss" scoped>
.download-button {
display: flex;
@@ -41,7 +41,7 @@
</NcButton>
</div>
<NcDialog
v-model:open="showImportModal"
:open.sync="showImportModal"
:name="t('dav', 'Import calendar event')">
<div class="import-event-modal">
<p>
@@ -73,7 +73,6 @@
<script>
import { showError, showSuccess } from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { generateUrl } from '@nextcloud/router'
import { NcButton, NcCheckboxRadioSwitch, NcDialog } from '@nextcloud/vue'
import IconCalendarBlank from 'vue-material-design-icons/CalendarBlank.vue'
@@ -81,7 +80,7 @@ import IconRestore from 'vue-material-design-icons/Restore.vue'
import IconUpload from 'vue-material-design-icons/TrayArrowUp.vue'
import ExampleContentDownloadButton from './ExampleContentDownloadButton.vue'
import * as ExampleEventService from '../service/ExampleEventService.js'
import { logger } from '../service/logger.ts'
import logger from '../service/logger.js'
export default {
name: 'ExampleEventSettings',
@@ -95,10 +94,6 @@ export default {
ExampleContentDownloadButton,
},
setup() {
return { t }
},
data() {
return {
createExampleEvent: loadState('dav', 'create_example_event', false),
+31
View File
@@ -0,0 +1,31 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { generateRemoteUrl } from '@nextcloud/router'
import memoize from 'lodash/fp/memoize.js'
import { createClient } from 'webdav'
export const getClient = memoize((service) => {
// init webdav client
const remote = generateRemoteUrl(`dav/${service}/${getCurrentUser().uid}`)
const client = createClient(remote)
// set CSRF token header
const setHeaders = (token) => {
client.setHeaders({
// Add this so the server knows it is an request from the browser
'X-Requested-With': 'XMLHttpRequest',
// Inject user auth
requesttoken: token ?? '',
})
}
// refresh headers when request token changes
onRequestTokenUpdate(setHeaders)
setHeaders(getRequestToken())
return client
})
-39
View File
@@ -1,39 +0,0 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import type { WebDAVClient } from 'webdav'
import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'
import { generateRemoteUrl } from '@nextcloud/router'
import { createClient } from 'webdav'
let client: WebDAVClient | undefined = undefined
/**
* Get the WebDAV client for the current user on the calendars endpoint.
*/
export function getClient(): WebDAVClient {
if (!client) {
// init webdav client
const remote = generateRemoteUrl(`dav/calendars/${getCurrentUser()!.uid}`)
client = createClient(remote)
// set CSRF token header
const setHeaders = (token) => {
client!.setHeaders({
// Add this so the server knows it is an request from the browser
'X-Requested-With': 'XMLHttpRequest',
// Inject user auth
requesttoken: token ?? '',
})
}
// refresh headers when request token changes
onRequestTokenUpdate(setHeaders)
setHeaders(getRequestToken())
}
return client
}
@@ -1,18 +1,17 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import {
slotsToVavailability,
vavailabilityToSlots,
} from '@nextcloud/calendar-availability-vue'
import { parseXML } from 'webdav'
import { getClient } from '../dav/client.ts'
import { logger } from './logger.ts'
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getClient } from '../dav/client.js'
import logger from './logger.js'
/**
* Get an object representing empty time slots for each day of the week.
*
*/
export function getEmptySlots() {
return {
@@ -27,10 +26,12 @@ export function getEmptySlots() {
}
/**
* Find the availability of the schedule inbox.
*
*/
export async function findScheduleInboxAvailability() {
const response = await getClient().customRequest('inbox', {
const client = getClient('calendars')
const response = await client.customRequest('inbox', {
method: 'PROPFIND',
data: `<?xml version="1.0"?>
<x0:propfind xmlns:x0="DAV:">
@@ -55,10 +56,8 @@ export async function findScheduleInboxAvailability() {
}
/**
* Save the availability of the schedule inbox.
*
* @param slots - The availability slots to save.
* @param timezoneId - The timezone identifier.
* @param {any} slots -
* @param {any} timezoneId -
*/
export async function saveScheduleInboxAvailability(slots, timezoneId) {
const all = [...Object.keys(slots).flatMap((dayId) => slots[dayId].map((slot) => ({
@@ -72,7 +71,8 @@ export async function saveScheduleInboxAvailability(slots, timezoneId) {
vavailability,
})
await getClient().customRequest('inbox', {
const client = getClient('calendars')
await client.customRequest('inbox', {
method: 'PROPPATCH',
data: `<?xml version="1.0"?>
<x0:propertyupdate xmlns:x0="DAV:">
@@ -9,9 +9,10 @@ import { generateUrl } from '@nextcloud/router'
/**
* Configure the creation of example events on a user's first login.
*
* @param enable - Whether to enable or disable the feature.
* @param {boolean} enable Whether to enable or disable the feature.
* @return {Promise<void>}
*/
export async function setCreateExampleEvent(enable: boolean): Promise<void> {
export async function setCreateExampleEvent(enable) {
const url = generateUrl('/apps/dav/api/exampleEvent/enable')
await axios.post(url, {
enable,
@@ -21,9 +22,10 @@ export async function setCreateExampleEvent(enable: boolean): Promise<void> {
/**
* Upload a custom example event.
*
* @param ics - The ICS data of the event.
* @param {string} ics The ICS data of the event.
* @return {Promise<void>}
*/
export async function uploadExampleEvent(ics: string): Promise<void> {
export async function uploadExampleEvent(ics) {
const url = generateUrl('/apps/dav/api/exampleEvent/event')
await axios.post(url, {
ics,
@@ -32,8 +34,10 @@ export async function uploadExampleEvent(ics: string): Promise<void> {
/**
* Delete a previously uploaded custom example event.
*
* @return {Promise<void>}
*/
export async function deleteExampleEvent(): Promise<void> {
export async function deleteExampleEvent() {
const url = generateUrl('/apps/dav/api/exampleEvent/event')
await axios.delete(url)
}
@@ -1,4 +1,4 @@
/*!
/**
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
@@ -9,8 +9,8 @@ import { generateOcsUrl } from '@nextcloud/router'
/**
* Enable user status automation based on availability
*/
export async function enableUserStatusAutomation(): Promise<void> {
await axios.post(
export async function enableUserStatusAutomation() {
return await axios.post(
generateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
appId: 'dav',
configKey: 'user_status_automation',
@@ -24,8 +24,8 @@ export async function enableUserStatusAutomation(): Promise<void> {
/**
* Disable user status automation based on availability
*/
export async function disableUserStatusAutomation(): Promise<void> {
await axios.delete(generateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
export async function disableUserStatusAutomation() {
return await axios.delete(generateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {
appId: 'dav',
configKey: 'user_status_automation',
}))
@@ -2,10 +2,11 @@
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { getLoggerBuilder } from '@nextcloud/logger'
export const logger = getLoggerBuilder()
const logger = getLoggerBuilder()
.setApp('dav')
.detectUser()
.build()
export default logger
-10
View File
@@ -1,10 +0,0 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { createApp } from 'vue'
import CalDavSettings from './views/CalDavSettings.vue'
const app = createApp(CalDavSettings)
app.mount('#settings-admin-caldav')
@@ -3,8 +3,17 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { createApp } from 'vue'
import { t } from '@nextcloud/l10n'
import Vue from 'vue'
import ExampleContentSettingsSection from './views/ExampleContentSettingsSection.vue'
const app = createApp(ExampleContentSettingsSection)
app.mount('#settings-example-content')
Vue.mixin({
methods: {
t,
$t: t,
},
})
const View = Vue.extend(ExampleContentSettingsSection);
(new View({})).$mount('#settings-example-content')
@@ -0,0 +1,14 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { t } from '@nextcloud/l10n'
import Vue from 'vue'
import Availability from './views/Availability.vue'
Vue.prototype.$t = t
const View = Vue.extend(Availability);
(new View({})).$mount('#settings-personal-availability')
@@ -1,10 +0,0 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { createApp } from 'vue'
import UserAvailability from './views/UserAvailability.vue'
const app = createApp(UserAvailability)
app.mount('#settings-personal-availability')
+33
View File
@@ -0,0 +1,33 @@
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import Vue from 'vue'
import CalDavSettings from './views/CalDavSettings.vue'
Vue.prototype.$t = t
const View = Vue.extend(CalDavSettings)
const CalDavSettingsView = new View({
name: 'CalDavSettingsView',
data() {
return {
sendInvitations: loadState('dav', 'sendInvitations'),
generateBirthdayCalendar: loadState(
'dav',
'generateBirthdayCalendar',
),
sendEventReminders: loadState('dav', 'sendEventReminders'),
sendEventRemindersToSharedUsers: loadState(
'dav',
'sendEventRemindersToSharedUsers',
),
sendEventRemindersPush: loadState('dav', 'sendEventRemindersPush'),
}
},
})
CalDavSettingsView.$mount('#settings-admin-caldav')
@@ -6,11 +6,12 @@
/**
* Format a date as 'YYYY-MM-DD'.
*
* @param date - A date instance to format.
* @param {Date} date A date instance to format.
* @return {string} 'YYYY-MM-DD'
*/
export function formatDateAsYMD(date: Date): `${number}-${number}-${number}` {
export function formatDateAsYMD(date) {
const year = date.getFullYear()
const month = (date.getMonth() + 1).toString().padStart(2, '0') as `${number}`
const day = date.getDate().toString().padStart(2, '0') as `${number}`
const month = (date.getMonth() + 1).toString().padStart(2, '0')
const day = date.getDate().toString().padStart(2, '0')
return `${year}-${month}-${day}`
}
@@ -2,31 +2,43 @@
- SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
import AbsenceForm from '../components/AbsenceForm.vue'
import AvailabilityForm from '../components/AvailabilityForm.vue'
const hideAbsenceSettings = loadState('dav', 'hide_absence_settings', true)
</script>
<template>
<div>
<NcSettingsSection
id="availability"
:name="t('dav', 'Availability')"
:description="t('dav', 'If you configure your working hours, other people will see when you are out of office when they book a meeting.')">
:name="$t('dav', 'Availability')"
:description="$t('dav', 'If you configure your working hours, other people will see when you are out of office when they book a meeting.')">
<AvailabilityForm />
</NcSettingsSection>
<NcSettingsSection
v-if="!hideAbsenceSettings"
id="absence"
:name="t('dav', 'Absence')"
:description="t('dav', 'Configure your next absence period.')">
:name="$t('dav', 'Absence')"
:description="$t('dav', 'Configure your next absence period.')">
<AbsenceForm />
</NcSettingsSection>
</div>
</template>
<script>
import { loadState } from '@nextcloud/initial-state'
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
import AbsenceForm from '../components/AbsenceForm.vue'
import AvailabilityForm from '../components/AvailabilityForm.vue'
/* eslint vue/multi-word-component-names: "warn" */
export default {
name: 'Availability',
components: {
NcSettingsSection,
AbsenceForm,
AvailabilityForm,
},
data() {
return {
hideAbsenceSettings: loadState('dav', 'hide_absence_settings', true),
}
},
}
</script>
+18 -11
View File
@@ -7,15 +7,6 @@ import { render } from '@testing-library/vue'
import { beforeEach, describe, expect, test, vi } from 'vitest'
import CalDavSettings from './CalDavSettings.vue'
const initialState = vi.hoisted(() => ({
userSyncCalendarsDocUrl: 'https://docs.nextcloud.com/server/23/go.php?to=user-sync-calendars',
sendInvitations: true,
generateBirthdayCalendar: true,
sendEventReminders: true,
sendEventRemindersToSharedUsers: true,
sendEventRemindersPush: true,
}))
vi.mock('@nextcloud/axios')
vi.mock('@nextcloud/router', () => {
return {
@@ -26,7 +17,7 @@ vi.mock('@nextcloud/router', () => {
})
vi.mock('@nextcloud/initial-state', () => {
return {
loadState: vi.fn((app, key) => app === 'dav' && initialState[key]),
loadState: vi.fn(() => 'https://docs.nextcloud.com/server/23/go.php?to=user-sync-calendars'),
}
})
@@ -41,7 +32,23 @@ describe('CalDavSettings', () => {
})
test('interactions', async () => {
const TLUtils = render(CalDavSettings)
const TLUtils = render(
CalDavSettings,
{
data() {
return {
sendInvitations: true,
generateBirthdayCalendar: true,
sendEventReminders: true,
sendEventRemindersToSharedUsers: true,
sendEventRemindersPush: true,
}
},
},
(Vue) => {
Vue.prototype.$t = vi.fn((app, text) => text)
},
)
const sendInvitations = TLUtils.getByLabelText('Send invitations to attendees')
expect(sendInvitations).toBeChecked()
const generateBirthdayCalendar = TLUtils.getByLabelText('Automatically generate a birthday calendar')
+21 -39
View File
@@ -4,22 +4,22 @@
-->
<template>
<NcSettingsSection
:name="t('dav', 'Calendar server')"
:name="$t('dav', 'Calendar server')"
:doc-url="userSyncCalendarsDocUrl">
<!-- Can use v-html as:
- t passes the translated string through DOMPurify.sanitize,
- $t passes the translated string through DOMPurify.sanitize,
- replacement strings are not user-controlled. -->
<!-- eslint-disable-next-line vue/no-v-html -->
<p class="settings-hint" v-html="hint" />
<p>
<NcCheckboxRadioSwitch
id="caldavSendInvitations"
v-model="sendInvitations"
:checked.sync="sendInvitations"
type="switch">
{{ t('dav', 'Send invitations to attendees') }}
{{ $t('dav', 'Send invitations to attendees') }}
</NcCheckboxRadioSwitch>
<!-- Can use v-html as:
- t passes the translated string through DOMPurify.sanitize,
- $t passes the translated string through DOMPurify.sanitize,
- replacement strings are not user-controlled. -->
<!-- eslint-disable-next-line vue/no-v-html -->
<em v-html="sendInvitationsHelpText" />
@@ -27,55 +27,55 @@
<p>
<NcCheckboxRadioSwitch
id="caldavGenerateBirthdayCalendar"
v-model="generateBirthdayCalendar"
:checked.sync="generateBirthdayCalendar"
type="switch"
class="checkbox">
{{ t('dav', 'Automatically generate a birthday calendar') }}
{{ $t('dav', 'Automatically generate a birthday calendar') }}
</NcCheckboxRadioSwitch>
<em>
{{ t('dav', 'Birthday calendars will be generated by a background job.') }}
{{ $t('dav', 'Birthday calendars will be generated by a background job.') }}
</em>
<br>
<em>
{{ t('dav', 'Hence they will not be available immediately after enabling but will show up after some time.') }}
{{ $t('dav', 'Hence they will not be available immediately after enabling but will show up after some time.') }}
</em>
</p>
<p>
<NcCheckboxRadioSwitch
id="caldavSendEventReminders"
v-model="sendEventReminders"
:checked.sync="sendEventReminders"
type="switch">
{{ t('dav', 'Send notifications for events') }}
{{ $t('dav', 'Send notifications for events') }}
</NcCheckboxRadioSwitch>
<!-- Can use v-html as:
- t passes the translated string through DOMPurify.sanitize,
- $t passes the translated string through DOMPurify.sanitize,
- replacement strings are not user-controlled. -->
<!-- eslint-disable-next-line vue/no-v-html -->
<em v-html="sendEventRemindersHelpText" />
<br>
<em>
{{ t('dav', 'Notifications are sent via background jobs, so these must occur often enough.') }}
{{ $t('dav', 'Notifications are sent via background jobs, so these must occur often enough.') }}
</em>
</p>
<p class="indented">
<NcCheckboxRadioSwitch
id="caldavSendEventRemindersToSharedGroupMembers"
v-model="sendEventRemindersToSharedUsers"
:checked.sync="sendEventRemindersToSharedUsers"
type="switch"
:disabled="!sendEventReminders">
{{ t('dav', 'Send reminder notifications to calendar sharees as well') }}
{{ $t('dav', 'Send reminder notifications to calendar sharees as well') }}
</NcCheckboxRadioSwitch>
<em>
{{ t('dav', 'Reminders are always sent to organizers and attendees.') }}
{{ $t('dav', 'Reminders are always sent to organizers and attendees.') }}
</em>
</p>
<p class="indented">
<NcCheckboxRadioSwitch
id="caldavSendEventRemindersPush"
v-model="sendEventRemindersPush"
:checked.sync="sendEventRemindersPush"
type="switch"
:disabled="!sendEventReminders">
{{ t('dav', 'Enable notifications for events via push') }}
{{ $t('dav', 'Enable notifications for events via push') }}
</NcCheckboxRadioSwitch>
</p>
</NcSettingsSection>
@@ -84,7 +84,6 @@
<script>
import axios from '@nextcloud/axios'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { generateUrl } from '@nextcloud/router'
import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
@@ -98,32 +97,15 @@ export default {
NcSettingsSection,
},
setup() {
return { t }
},
data() {
return {
userSyncCalendarsDocUrl,
sendInvitations: loadState('dav', 'sendInvitations'),
generateBirthdayCalendar: loadState(
'dav',
'generateBirthdayCalendar',
),
sendEventReminders: loadState('dav', 'sendEventReminders'),
sendEventRemindersToSharedUsers: loadState(
'dav',
'sendEventRemindersToSharedUsers',
),
sendEventRemindersPush: loadState('dav', 'sendEventRemindersPush'),
}
},
computed: {
hint() {
const translated = t(
const translated = this.$t(
'dav',
'Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}.',
)
@@ -134,14 +116,14 @@ export default {
},
sendInvitationsHelpText() {
const translated = t('dav', 'Please make sure to properly set up {emailopen}the email server{linkclose}.')
const translated = this.$t('dav', 'Please make sure to properly set up {emailopen}the email server{linkclose}.')
return translated
.replace('{emailopen}', '<a href="../admin#mail_general_settings">')
.replace('{linkclose}', '</a>')
},
sendEventRemindersHelpText() {
const translated = t('dav', 'Please make sure to properly set up {emailopen}the email server{linkclose}.')
const translated = this.$t('dav', 'Please make sure to properly set up {emailopen}the email server{linkclose}.')
return translated
.replace('{emailopen}', '<a href="../admin#mail_general_settings">')
.replace('{linkclose}', '</a>')
@@ -3,23 +3,39 @@
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<script setup lang="ts">
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'
import { NcSettingsSection } from '@nextcloud/vue'
import ExampleContactSettings from '../components/ExampleContactSettings.vue'
import ExampleEventSettings from '../components/ExampleEventSettings.vue'
const hasContactsApp = loadState('dav', 'contactsEnabled')
const hasCalendarApp = loadState('dav', 'calendarEnabled')
</script>
<template>
<NcSettingsSection
id="example-content"
:name="t('dav', 'Example content')"
:description="t('dav', 'Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content.')">
:name="$t('dav', 'Example content')"
class="example-content-setting"
:description="$t('dav', 'Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content.')">
<ExampleContactSettings v-if="hasContactsApp" />
<ExampleEventSettings v-if="hasCalendarApp" />
</NcSettingsSection>
</template>
<script>
import { loadState } from '@nextcloud/initial-state'
import { NcSettingsSection } from '@nextcloud/vue'
import ExampleContactSettings from '../components/ExampleContactSettings.vue'
import ExampleEventSettings from '../components/ExampleEventSettings.vue'
export default {
name: 'ExampleContentSettingsSection',
components: {
NcSettingsSection,
ExampleContactSettings,
ExampleEventSettings,
},
computed: {
hasContactsApp() {
return loadState('dav', 'contactsEnabled')
},
hasCalendarApp() {
return loadState('dav', 'calendarEnabled')
},
},
}
</script>
@@ -4,6 +4,8 @@
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
\OCP\Util::addScript('dav', 'settings-admin-caldav', 'core');
?>
<div id="settings-admin-caldav"></div>
@@ -4,6 +4,8 @@
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
\OCP\Util::addScript('dav', 'settings-example-content', 'core');
?>
<div id="settings-example-content"></div>
@@ -4,6 +4,8 @@
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
\OCP\Util::addScript('dav', 'settings-personal-availability', 'core');
?>
<div id="settings-personal-availability"></div>
+3 -3
View File
@@ -30,7 +30,7 @@ class CapabilitiesTest extends TestCase {
$expected = [
'dav' => [
'chunking' => '1.0',
'public_shares_chunking' => false,
'public_shares_chunking' => true,
],
];
$this->assertSame($expected, $capabilities->getCapabilities());
@@ -50,7 +50,7 @@ class CapabilitiesTest extends TestCase {
$expected = [
'dav' => [
'chunking' => '1.0',
'public_shares_chunking' => false,
'public_shares_chunking' => true,
'bulkupload' => '1.0',
],
];
@@ -71,7 +71,7 @@ class CapabilitiesTest extends TestCase {
$expected = [
'dav' => [
'chunking' => '1.0',
'public_shares_chunking' => false,
'public_shares_chunking' => true,
'absence-supported' => true,
'absence-replacement' => true,
],
@@ -10,11 +10,8 @@ namespace OCA\DAV\Tests\unit\Command;
use OCA\DAV\Command\RemoveInvalidShares;
use OCA\DAV\Connector\Sabre\Principal;
use OCA\DAV\DAV\RemoteUserPrincipalBackend;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\Server;
use PHPUnit\Framework\MockObject\MockObject;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
@@ -26,118 +23,32 @@ use Test\TestCase;
* @group DB
*/
class RemoveInvalidSharesTest extends TestCase {
private RemoveInvalidShares $command;
private IDBConnection $db;
private Principal&MockObject $principalBackend;
private RemoteUserPrincipalBackend&MockObject $remoteUserPrincipalBackend;
protected function setUp(): void {
parent::setUp();
$db = Server::get(IDBConnection::class);
$this->db = Server::get(IDBConnection::class);
$this->principalBackend = $this->createMock(Principal::class);
$this->remoteUserPrincipalBackend = $this->createMock(RemoteUserPrincipalBackend::class);
$this->db->insertIfNotExist('*PREFIX*dav_shares', [
$db->insertIfNotExist('*PREFIX*dav_shares', [
'principaluri' => 'principal:unknown',
'type' => 'calendar',
'access' => 2,
'resourceid' => 666,
]);
$this->db->insertIfNotExist('*PREFIX*dav_shares', [
'principaluri' => 'principals/remote-users/foobar',
'type' => 'calendar',
'access' => 2,
'resourceid' => 666,
]);
$this->command = new RemoveInvalidShares(
$this->db,
$this->principalBackend,
$this->remoteUserPrincipalBackend,
);
}
private function selectShares(): array {
$query = $this->db->getQueryBuilder();
public function test(): void {
$db = Server::get(IDBConnection::class);
$principal = $this->createMock(Principal::class);
$repair = new RemoveInvalidShares($db, $principal);
$this->invokePrivate($repair, 'run', [$this->createMock(InputInterface::class), $this->createMock(OutputInterface::class)]);
$query = $db->getQueryBuilder();
$query->select('*')
->from('dav_shares')
->where($query->expr()->in(
'principaluri',
$query->createNamedParameter(
['principal:unknown', 'principals/remote-users/foobar'],
IQueryBuilder::PARAM_STR_ARRAY,
),
));
->where($query->expr()->eq('principaluri', $query->createNamedParameter('principal:unknown')));
$result = $query->executeQuery();
$data = $result->fetchAll();
$result->closeCursor();
return $data;
}
public function testWithoutPrincipals(): void {
$this->principalBackend->method('getPrincipalByPath')
->willReturnMap([
['principal:unknown', null],
['principals/remote-users/foobar', null],
]);
$this->remoteUserPrincipalBackend->method('getPrincipalByPath')
->willReturnMap([
['principal:unknown', null],
['principals/remote-users/foobar', null],
]);
$this->command->run(
$this->createMock(InputInterface::class),
$this->createMock(OutputInterface::class),
);
$data = $this->selectShares();
$this->assertCount(0, $data);
}
public function testWithLocalPrincipal(): void {
$this->principalBackend->method('getPrincipalByPath')
->willReturnMap([
['principal:unknown', ['uri' => 'principal:unknown']],
['principals/remote-users/foobar', null],
]);
$this->remoteUserPrincipalBackend->method('getPrincipalByPath')
->willReturnMap([
['principals/remote-users/foobar', null],
]);
$this->command->run(
$this->createMock(InputInterface::class),
$this->createMock(OutputInterface::class),
);
$data = $this->selectShares();
$this->assertCount(1, $data);
$this->assertEquals('principal:unknown', $data[0]['principaluri']);
}
public function testWithRemotePrincipal() {
$this->principalBackend->method('getPrincipalByPath')
->willReturnMap([
['principal:unknown', null],
['principals/remote-users/foobar', null],
]);
$this->remoteUserPrincipalBackend->method('getPrincipalByPath')
->willReturnMap([
['principal:unknown', null],
['principals/remote-users/foobar', ['uri' => 'principals/remote-users/foobar']],
]);
$this->command->run(
$this->createMock(InputInterface::class),
$this->createMock(OutputInterface::class),
);
$data = $this->selectShares();
$this->assertCount(1, $data);
$this->assertEquals('principals/remote-users/foobar', $data[0]['principaluri']);
$this->assertEquals(0, count($data));
}
}
@@ -13,6 +13,7 @@ use OCP\Files\NotFoundException;
use OCP\Share\IAttributes;
use OCP\Share\IShare;
use PHPUnit\Framework\MockObject\MockObject;
use Sabre\DAV\Exception\BadRequest;
use Sabre\DAV\Server;
use Sabre\HTTP\RequestInterface;
use Sabre\HTTP\ResponseInterface;
@@ -55,6 +56,13 @@ class FilesDropPluginTest extends TestCase {
->willReturn('token');
}
public function testNotEnabled(): void {
$this->request->expects($this->never())
->method($this->anything());
$this->plugin->beforeMethod($this->request, $this->response);
}
public function testValid(): void {
$this->plugin->enable();
$this->plugin->setShare($this->share);
@@ -104,13 +112,32 @@ class FilesDropPluginTest extends TestCase {
$this->plugin->beforeMethod($this->request, $this->response);
}
public function testMKCOL(): void {
public function testNoMKCOLWithoutNickname(): void {
$this->plugin->enable();
$this->plugin->setShare($this->share);
$this->request->method('getMethod')
->willReturn('MKCOL');
$this->expectException(BadRequest::class);
$this->plugin->beforeMethod($this->request, $this->response);
}
public function testMKCOLWithNickname(): void {
$this->plugin->enable();
$this->plugin->setShare($this->share);
$this->request->method('getMethod')
->willReturn('MKCOL');
$this->request->method('hasHeader')
->with('X-NC-Nickname')
->willReturn(true);
$this->request->method('getHeader')
->with('X-NC-Nickname')
->willReturn('nickname');
$this->expectNotToPerformAssertions();
$this->plugin->beforeMethod($this->request, $this->response);
-1
View File
@@ -34,7 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Log venligst ind på webgrænsefladen, gå til afsnittet \"Sikkerhed\" i dine personlige indstillinger og opdater din krypteringsadgangskode ved at indtaste denne adgangskode i feltet \"Gammel loginadgangskode\" og din nuværende loginadgangskode.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne fil, sandsynligvis er dette en delt fil. Bed filejeren om at videredele filen med dig.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke læse denne fil, sandsynligvis er dette en delt fil. Bed filejeren om at videredele filen med dig.",
"Default Encryption Module" : "Standard krypteringsmodul",
"Default encryption module" : "Standard krypterings modul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret men dine nøgler er ikke indlæst, log venligst ud og ind igen",
"Encrypt the home storage" : "Krypter hjemmelageret",
-1
View File
@@ -32,7 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Log venligst ind på webgrænsefladen, gå til afsnittet \"Sikkerhed\" i dine personlige indstillinger og opdater din krypteringsadgangskode ved at indtaste denne adgangskode i feltet \"Gammel loginadgangskode\" og din nuværende loginadgangskode.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne fil, sandsynligvis er dette en delt fil. Bed filejeren om at videredele filen med dig.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke læse denne fil, sandsynligvis er dette en delt fil. Bed filejeren om at videredele filen med dig.",
"Default Encryption Module" : "Standard krypteringsmodul",
"Default encryption module" : "Standard krypterings modul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret men dine nøgler er ikke indlæst, log venligst ud og ind igen",
"Encrypt the home storage" : "Krypter hjemmelageret",
+1 -1
View File
@@ -23,7 +23,7 @@ OC.L10N.register(
"Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde aktualisiert.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Falscher privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisiere deinen privaten Schlüssel in deinen persönlichen Einstellungen, um wieder Zugriff auf die verschlüsselten Dateien zu erhalten.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind nicht initialisiert. Bitte ab- und wieder anmelden",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Bitte die serverseitige Verschlüsselung in den Administrationseinstellungen aktivieren, um das Verschlüsselungsmodul nutzen zu können.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Bitte die serverseitige Verschlüsselung in den Verwaltungseinstellungen aktivieren, um das Verschlüsselungsmodul nutzen zu können.",
"Encryption app is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit",
"Bad Signature" : "Ungültige Signatur",
"Missing Signature" : "Fehlende Signatur",
+1 -1
View File
@@ -21,7 +21,7 @@
"Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde aktualisiert.",
"Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Falscher privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisiere deinen privaten Schlüssel in deinen persönlichen Einstellungen, um wieder Zugriff auf die verschlüsselten Dateien zu erhalten.",
"Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Verschlüsselungs-App ist aktiviert, aber die Schlüssel sind nicht initialisiert. Bitte ab- und wieder anmelden",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Bitte die serverseitige Verschlüsselung in den Administrationseinstellungen aktivieren, um das Verschlüsselungsmodul nutzen zu können.",
"Please enable server side encryption in the admin settings in order to use the encryption module." : "Bitte die serverseitige Verschlüsselung in den Verwaltungseinstellungen aktivieren, um das Verschlüsselungsmodul nutzen zu können.",
"Encryption app is enabled and ready" : "Verschlüsselungs-App ist aktiviert und bereit",
"Bad Signature" : "Ungültige Signatur",
"Missing Signature" : "Fehlende Signatur",
-3
View File
@@ -34,9 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you.",
"Default Encryption Module" : "Default Encryption Module",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Default encryption module for Nextcloud Server-side Encryption (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss.",
"Default encryption module" : "Default encryption module",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption app is enabled but your keys are not initialised, please log-out and log-in again",
"Encrypt the home storage" : "Encrypt the home storage",
-3
View File
@@ -32,9 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you.",
"Default Encryption Module" : "Default Encryption Module",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Default encryption module for Nextcloud Server-side Encryption (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss.",
"Default encryption module" : "Default encryption module",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption app is enabled but your keys are not initialised, please log-out and log-in again",
"Encrypt the home storage" : "Encrypt the home storage",
-2
View File
@@ -34,8 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Default Encryption Module" : "Module de chiffrement par défaut",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Module de chiffrement par défaut pour le chiffrement côté serveur (SSE)",
"Default encryption module" : "Module de chiffrement par défaut",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
-2
View File
@@ -32,8 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Connectez-vous depuis l'interface web, allez dans la section « Sécurité » de vos paramètres personnels et mettez à jour votre mot de passe de chiffrement en entrant ce mot de passe dans le champ « Ancien mot de passe de connexion » et dans votre mot de passe de connexion actuel.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de lire ce fichier, il s'agit probablement d'un fichier partagé. Merci de demander à son propriétaire de repartager le fichier avec vous.",
"Default Encryption Module" : "Module de chiffrement par défaut",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Module de chiffrement par défaut pour le chiffrement côté serveur (SSE)",
"Default encryption module" : "Module de chiffrement par défaut",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées. Veuillez vous déconnecter puis vous reconnecter.",
"Encrypt the home storage" : "Chiffrer l'espace de stockage principal",
-3
View File
@@ -34,9 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Logáil isteach sa chomhéadan gréasáin le do thoil, téigh go dtí an rannán \"Slándáil\" de do shocruithe pearsanta agus nuashonraigh do phasfhocal criptithe tríd an bhfocal faire seo a chur isteach sa réimse \"Sean-phasfhocal logála isteach\" agus do phasfhocal logála isteach reatha.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ní féidir an comhad seo a dhíchriptiú, is dócha gur comhad roinnte é seo. Iarr ar úinéir an chomhaid an comhad a athroinnt leat le do thoil.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ní féidir an comhad seo a léamh, is dócha gur comhad roinnte é seo. Iarr ar úinéir an chomhaid an comhad a athroinnt leat le do thoil.",
"Default Encryption Module" : "Modúl Criptithe Réamhshocraithe",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Modúl criptithe réamhshocraithe le haghaidh Criptiú Taobh an Fhreastalaí (SSE) Nextcloud",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Soláthraíonn an aip seo an cur i bhfeidhm cripteagrafaíochta (réamhshocraithe) do ghné Criptiú Taobh an Fhreastalaí (SSE) Nextcloud.\n\n\t\t\t**Sonraí Criptithe**\n\t\t\t* **Mód Criptithe:** AES-256-CTR (réamhshocraithe)\n\t\t\t* **Fíordheimhniú:** HMAC-SHA256\n\n\t\t\t**Rabhaidh Thábhachtacha**\n\t\t\t* **CONTÚIRT:** Ná díchumasaigh an feidhmchlár seo go dtí go mbeidh na comhaid go léir díchriptithe (`occ encryption:decrypt-all`).\n\n\t\t\t* **RABHADH**: Éilíonn filleadh ar stóráil comhad neamhchriptithe tar éis gníomhachtaithe rochtain líne ordaithe. Is buan an gníomh tríd an Chomhéadan Gréasáin.\"\n\n\t\t\t**Nótaí do Chomhaid atá ann cheana**\n\t\t\t* De réir réamhshocraithe, ní chriptítear comhaid atá ann cheana nuair a chuirtear SSE ar chumas; ní chripteofar ach comhaid nua.\n\t\t\t* Chun gach comhad atá ann cheana a chriptiú, bain úsáid as an ordú `occ encryption:encrypt-all`.\n\n\t\t\t**Sula dTosaíonn Tú**\n\t\t\t* **Léigh an Doiciméadú:** Sula gcumasaíonn tú SSE, sula ndéanann tú comhaid atá ann cheana a chriptiú, nó sula ndíchumasaíonn tú SSE, tá sé ríthábhachtach\n\t\t\t\t an doiciméadú a léamh chun impleachtaí agus na nósanna imeachta cuí a thuiscint chun cailliúint sonraí a sheachaint.",
"Default encryption module" : "Modúl criptithe réamhshocraithe",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Tá aip criptiúcháin cumasaithe ach níl d'eochracha tosaithe, logáil amach agus logáil isteach arís le do thoil",
"Encrypt the home storage" : "Criptigh an stóráil sa bhaile",
-3
View File
@@ -32,9 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Logáil isteach sa chomhéadan gréasáin le do thoil, téigh go dtí an rannán \"Slándáil\" de do shocruithe pearsanta agus nuashonraigh do phasfhocal criptithe tríd an bhfocal faire seo a chur isteach sa réimse \"Sean-phasfhocal logála isteach\" agus do phasfhocal logála isteach reatha.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ní féidir an comhad seo a dhíchriptiú, is dócha gur comhad roinnte é seo. Iarr ar úinéir an chomhaid an comhad a athroinnt leat le do thoil.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ní féidir an comhad seo a léamh, is dócha gur comhad roinnte é seo. Iarr ar úinéir an chomhaid an comhad a athroinnt leat le do thoil.",
"Default Encryption Module" : "Modúl Criptithe Réamhshocraithe",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Modúl criptithe réamhshocraithe le haghaidh Criptiú Taobh an Fhreastalaí (SSE) Nextcloud",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Soláthraíonn an aip seo an cur i bhfeidhm cripteagrafaíochta (réamhshocraithe) do ghné Criptiú Taobh an Fhreastalaí (SSE) Nextcloud.\n\n\t\t\t**Sonraí Criptithe**\n\t\t\t* **Mód Criptithe:** AES-256-CTR (réamhshocraithe)\n\t\t\t* **Fíordheimhniú:** HMAC-SHA256\n\n\t\t\t**Rabhaidh Thábhachtacha**\n\t\t\t* **CONTÚIRT:** Ná díchumasaigh an feidhmchlár seo go dtí go mbeidh na comhaid go léir díchriptithe (`occ encryption:decrypt-all`).\n\n\t\t\t* **RABHADH**: Éilíonn filleadh ar stóráil comhad neamhchriptithe tar éis gníomhachtaithe rochtain líne ordaithe. Is buan an gníomh tríd an Chomhéadan Gréasáin.\"\n\n\t\t\t**Nótaí do Chomhaid atá ann cheana**\n\t\t\t* De réir réamhshocraithe, ní chriptítear comhaid atá ann cheana nuair a chuirtear SSE ar chumas; ní chripteofar ach comhaid nua.\n\t\t\t* Chun gach comhad atá ann cheana a chriptiú, bain úsáid as an ordú `occ encryption:encrypt-all`.\n\n\t\t\t**Sula dTosaíonn Tú**\n\t\t\t* **Léigh an Doiciméadú:** Sula gcumasaíonn tú SSE, sula ndéanann tú comhaid atá ann cheana a chriptiú, nó sula ndíchumasaíonn tú SSE, tá sé ríthábhachtach\n\t\t\t\t an doiciméadú a léamh chun impleachtaí agus na nósanna imeachta cuí a thuiscint chun cailliúint sonraí a sheachaint.",
"Default encryption module" : "Modúl criptithe réamhshocraithe",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Tá aip criptiúcháin cumasaithe ach níl d'eochracha tosaithe, logáil amach agus logáil isteach arís le do thoil",
"Encrypt the home storage" : "Criptigh an stóráil sa bhaile",
-2
View File
@@ -34,8 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Por favor, faça login na interface web, vá para a seção \"Segurança\" de suas configurações pessoais e atualize sua senha de criptografia inserindo esta senha no campo \"Senha de login antiga\" e sua senha de login atual.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível descriptografar este arquivo, provavelmente é um arquivo compartilhado. Por favor, solicite ao proprietário do arquivo para recompartilhá-lo com você.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo, provavelmente é um arquivo compartilhado. Por favor, solicite ao proprietário do arquivo para recompartilhá-lo com você.",
"Default Encryption Module" : "Módulo de Criptografia Padrão",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Módulo de criptografia padrão para criptografia do lado do servidor (SSE) do Nextcloud",
"Default encryption module" : "Módulo de criptografia padrão",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.",
"Encrypt the home storage" : "Criptografar a pasta de armazenamento home",
-2
View File
@@ -32,8 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Por favor, faça login na interface web, vá para a seção \"Segurança\" de suas configurações pessoais e atualize sua senha de criptografia inserindo esta senha no campo \"Senha de login antiga\" e sua senha de login atual.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível descriptografar este arquivo, provavelmente é um arquivo compartilhado. Por favor, solicite ao proprietário do arquivo para recompartilhá-lo com você.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não foi possível ler este arquivo, provavelmente é um arquivo compartilhado. Por favor, solicite ao proprietário do arquivo para recompartilhá-lo com você.",
"Default Encryption Module" : "Módulo de Criptografia Padrão",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Módulo de criptografia padrão para criptografia do lado do servidor (SSE) do Nextcloud",
"Default encryption module" : "Módulo de criptografia padrão",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.",
"Encrypt the home storage" : "Criptografar a pasta de armazenamento home",
-3
View File
@@ -34,9 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Молимо вас да се пријавите на веб интерфејс, одете на одељак „Безбедност” ваших личник подешавања и ажурирате своју лозинку за шифровање уносећи ову лозинку у поље „Стара лозинка за пријаву” и своју текућу лозинку за пријаву.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Овај фајл не може да се дешифрује, то је вероватно дељени фајл. Молимо вас да замолите власника да га поново подели са вама.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Овај фајл не може да се прочита, то је вероватно дељени фајл. Молимо вас да замолите власника да га поново подели са вама.",
"Default Encryption Module" : "Подразумевани модул за шифровање",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Подразумевани модул за Nextcloud шифровање на серверској страни (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ова апликација обезбеђује (подразумевану) криптографску имплементацију за Nextcloud функционалност шифровање на серверској страни (SSE) feature.\n\n\t\t\t**Детаљи шифровања**\n\t\t\t* **Режим шифрирања:** AES-256-CTR (подразумевани)\n\t\t\t* **Провера идентитета:** HMAC-SHA256\n\n\t\t\t**Важна упозорења**\n\t\t\t* **ОПАСНОСТ:** немојте да искључујете апликаију све док се сви фајлови не дешифрују (`occ encryption:decrypt-all`).\n\t\t\t* **УПОЗОРЕЊЕ**: враћање на нешифрирано складиште фајлове након активирања захтева приступ командној линији. Акција је трајна преко Веб КИ.\"\n\n\t\t\t**Напомене за постојеће фајлове**\n\t\t\t* Укључивање SSE подразумевано не шифрује постојеће фајлове; шифроваће се само нови фајлови.\n\t\t\t* Ако желите да шифрујете постојеће фајлове, употребите команду `occ encryption:encrypt-all`.\n\n\t\t\t**Пре него што почнете**\n\t\t\t* **Прочитајте документацију:** пре него што укључите SSE, шифрујете постојеће фајлове, или искључите SSE, веома је \n\t\t\t\tважно да прочитате документацију и у потпуности разумете последице и одговарајуће процедуре и тако спречите губитак података.",
"Default encryption module" : "Подразумевани модул за шифровање",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.",
"Encrypt the home storage" : "Шифровање главног складишта",
-3
View File
@@ -32,9 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Молимо вас да се пријавите на веб интерфејс, одете на одељак „Безбедност” ваших личник подешавања и ажурирате своју лозинку за шифровање уносећи ову лозинку у поље „Стара лозинка за пријаву” и своју текућу лозинку за пријаву.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Овај фајл не може да се дешифрује, то је вероватно дељени фајл. Молимо вас да замолите власника да га поново подели са вама.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Овај фајл не може да се прочита, то је вероватно дељени фајл. Молимо вас да замолите власника да га поново подели са вама.",
"Default Encryption Module" : "Подразумевани модул за шифровање",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Подразумевани модул за Nextcloud шифровање на серверској страни (SSE)",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Ова апликација обезбеђује (подразумевану) криптографску имплементацију за Nextcloud функционалност шифровање на серверској страни (SSE) feature.\n\n\t\t\t**Детаљи шифровања**\n\t\t\t* **Режим шифрирања:** AES-256-CTR (подразумевани)\n\t\t\t* **Провера идентитета:** HMAC-SHA256\n\n\t\t\t**Важна упозорења**\n\t\t\t* **ОПАСНОСТ:** немојте да искључујете апликаију све док се сви фајлови не дешифрују (`occ encryption:decrypt-all`).\n\t\t\t* **УПОЗОРЕЊЕ**: враћање на нешифрирано складиште фајлове након активирања захтева приступ командној линији. Акција је трајна преко Веб КИ.\"\n\n\t\t\t**Напомене за постојеће фајлове**\n\t\t\t* Укључивање SSE подразумевано не шифрује постојеће фајлове; шифроваће се само нови фајлови.\n\t\t\t* Ако желите да шифрујете постојеће фајлове, употребите команду `occ encryption:encrypt-all`.\n\n\t\t\t**Пре него што почнете**\n\t\t\t* **Прочитајте документацију:** пре него што укључите SSE, шифрујете постојеће фајлове, или искључите SSE, веома је \n\t\t\t\tважно да прочитате документацију и у потпуности разумете последице и одговарајуће процедуре и тако спречите губитак података.",
"Default encryption module" : "Подразумевани модул за шифровање",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.",
"Encrypt the home storage" : "Шифровање главног складишта",
-2
View File
@@ -34,8 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Будь ласка, увійдіть до вебінтерфейсу хмари, перейдіть до розділу \"Безпека\" ваших особистих налаштувань та оновіть ваш пароль шифрування даних: для цього зазначте пароль у полі \"Старий пароль входу\" та ваш поточний пароль входу.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається розшифрувати цей файл, ймовірно, він знаходиться у спільному доступі. Будь ласка, зверніться до власника файлу з проханням надати вам доступ до нього.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається прочитати цей файл, ймовірно, це файл із загальним доступом. Будь ласка, попросіть власника файлу надати вам спільний доступ до нього. ",
"Default Encryption Module" : "Типовий модуль шифрування",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Типовий модуль шифрування для шифрування Nextcloud на стороні сервера (SSE)",
"Default encryption module" : "Типовий модуль шифрування",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Застосунок для шифрування увімкнено, але ваші ключі не ініціалізовано. Будь ласка, вийдіть із системи та увійдіть знову",
"Encrypt the home storage" : "Зашифрувати домашній каталог",
-2
View File
@@ -32,8 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "Будь ласка, увійдіть до вебінтерфейсу хмари, перейдіть до розділу \"Безпека\" ваших особистих налаштувань та оновіть ваш пароль шифрування даних: для цього зазначте пароль у полі \"Старий пароль входу\" та ваш поточний пароль входу.",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається розшифрувати цей файл, ймовірно, він знаходиться у спільному доступі. Будь ласка, зверніться до власника файлу з проханням надати вам доступ до нього.",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не вдається прочитати цей файл, ймовірно, це файл із загальним доступом. Будь ласка, попросіть власника файлу надати вам спільний доступ до нього. ",
"Default Encryption Module" : "Типовий модуль шифрування",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Типовий модуль шифрування для шифрування Nextcloud на стороні сервера (SSE)",
"Default encryption module" : "Типовий модуль шифрування",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Застосунок для шифрування увімкнено, але ваші ключі не ініціалізовано. Будь ласка, вийдіть із системи та увійдіть знову",
"Encrypt the home storage" : "Зашифрувати домашній каталог",
-3
View File
@@ -34,9 +34,6 @@ OC.L10N.register(
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "請登入網頁介面,請到個人設定中的「安全」區塊,透過輸入此密碼至「舊登入密碼」欄位與您目前的登入密碼,來更新您的加密密碼。",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請要求檔案所有人重新分享檔案給您。",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法讀取這個檔案,也許這是分享的檔案。請要求檔案所有人重新分享檔案給您。",
"Default Encryption Module" : "預設加密模組",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Nextcloud 伺服器端加密 (SSE) 的預設加密模組",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "此應用程式提供了 Nextcloud 伺服器端加密 (SSE) 功能的(預設)密碼學實作。\n\n\t\t\t**加密詳細資訊**\n\t\t\t* **加密模式:**AES-256-CTR(預設)\n\t\t\t* **驗證:**HMAC-SHA256\n\n\t\t\t**重要警告**\n\t\t\t* **危險:**在解密所有檔案 (`occ encryption:decrypt-all`) 完成前請勿停用此應用程式。\n\t\t\t* **警告:**啟用後若要恢復為未加密的檔案儲存模式,需透過命令列介面進行操作。若透過網頁使用者介面執行此操作,該設定將永久生效。\n\n\t\t\t**既有檔案的備註**\n\t\t\t* 預設情況下,啟用 SSE 並不會加密既有檔案;僅會加密新的檔案。\n\t\t\t* 要加密所有既有檔案,請使用 `occ encryption:encrypt-all` 命令。\n\n\t\t\t**在您開始前**\n\t\t\t* **請讀文件:**在您啟用 SSE、加密既有檔案或停用 SSE 前,閱讀文件以理解其影響及避免資料遺失的適當程序至關重要。",
"Default encryption module" : "預設加密模組",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "已啟用加密應用程式,但您的金鑰並未初始化,請登出並再次登入",
"Encrypt the home storage" : "加密家目錄儲存空間",
-3
View File
@@ -32,9 +32,6 @@
"Please login to the web interface, go to the \"Security\" section of your personal settings and update your encryption password by entering this password into the \"Old login password\" field and your current login password." : "請登入網頁介面,請到個人設定中的「安全」區塊,透過輸入此密碼至「舊登入密碼」欄位與您目前的登入密碼,來更新您的加密密碼。",
"Cannot decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請要求檔案所有人重新分享檔案給您。",
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法讀取這個檔案,也許這是分享的檔案。請要求檔案所有人重新分享檔案給您。",
"Default Encryption Module" : "預設加密模組",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Nextcloud 伺服器端加密 (SSE) 的預設加密模組",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to \n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "此應用程式提供了 Nextcloud 伺服器端加密 (SSE) 功能的(預設)密碼學實作。\n\n\t\t\t**加密詳細資訊**\n\t\t\t* **加密模式:**AES-256-CTR(預設)\n\t\t\t* **驗證:**HMAC-SHA256\n\n\t\t\t**重要警告**\n\t\t\t* **危險:**在解密所有檔案 (`occ encryption:decrypt-all`) 完成前請勿停用此應用程式。\n\t\t\t* **警告:**啟用後若要恢復為未加密的檔案儲存模式,需透過命令列介面進行操作。若透過網頁使用者介面執行此操作,該設定將永久生效。\n\n\t\t\t**既有檔案的備註**\n\t\t\t* 預設情況下,啟用 SSE 並不會加密既有檔案;僅會加密新的檔案。\n\t\t\t* 要加密所有既有檔案,請使用 `occ encryption:encrypt-all` 命令。\n\n\t\t\t**在您開始前**\n\t\t\t* **請讀文件:**在您啟用 SSE、加密既有檔案或停用 SSE 前,閱讀文件以理解其影響及避免資料遺失的適當程序至關重要。",
"Default encryption module" : "預設加密模組",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "已啟用加密應用程式,但您的金鑰並未初始化,請登出並再次登入",
"Encrypt the home storage" : "加密家目錄儲存空間",
+6 -6
View File
@@ -7,9 +7,9 @@ OC.L10N.register(
"Couldn't establish a federated share, maybe the password was wrong." : "Federierte Freigabe konnte nicht erstellt werden, vielleicht ist das Passwort falsch.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Anfrage für die federierte Freigabe gesendet, du solltest eine Einladung erhalten. Bitte in Deinen Benachrichtigungen nachsehen. ",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Federierte Freigabe konnte nicht aufgebaut werden, da der Zielserver eine zu alte Version verwendet (Nextcloud <=9).",
"It is not allowed to send federated group shares from this server." : "Das Erstellen einer Federated-Cloud-Freigabe ist von diesem Server aus nicht erlaubt.",
"It is not allowed to send federated group shares from this server." : "Das Erstellen einer Federated Cloud Freigabe ist von diesem Server aus nicht erlaubt.",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde",
"Not allowed to create a federated share to the same account" : "Das Erstellen einer Federated-Cloud-Freigabe mit dem selben Konto ist unzulässig",
"Not allowed to create a federated share to the same account" : "Das Erstellen einer Federated-Cloud-Freigabe mit dem selben Konto ist uzulässig",
"Federated shares require read permissions" : "Federated-Freigaben benötigen Leseberechtigungen",
"File is already shared with %s" : "Datei wird bereits mit %s geteilt",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Freigabe von %1$s fehlgeschlagen, da %2$s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar oder nutzt ein selbst-erstelltes Zertifikat.",
@@ -19,9 +19,9 @@ OC.L10N.register(
"You received {share} as a remote share from {user}" : "Du hast {share} als externe Freigabe von {user} empfangen",
"Accept" : "Ok",
"Decline" : "Abgelehnt",
"Federated Cloud Sharing" : "Federated-Cloud-Freigabe",
"Federated Cloud Sharing" : "Federierte-Cloud-Freigabe",
"Sharing" : "Teilen",
"Federated file sharing" : "Federated Datei-Freigabe",
"Federated file sharing" : "Federierte Datei-Freigabe",
"Provide federated file sharing across servers" : "Bietet Federated Datei-Freigaben über Servergrenzen hinweg",
"Confirm data upload to lookup server" : "Hochladen der Daten zum Lookup-Server bestätigen",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Wenn diese Option aktiviert ist, werden alle Kontoeigenschaften (z. B. E-Mail-Adresse) mit der auf „veröffentlicht“ eingestellten Bereichssichtbarkeit automatisch synchronisiert und an ein externes System übertragen sowie in einem öffentlichen, globalen Adressbuch verfügbar gemacht.",
@@ -39,11 +39,11 @@ OC.L10N.register(
"Allow people on this server to receive shares from other servers" : "Ermögliche es Personen auf diesem Server, Freigaben von anderen Servern zu erhalten",
"Allow people on this server to send shares to groups on other servers" : "Ermögliche es Personen auf diesem Server, Freigaben an Gruppen auf anderen Servern zu senden",
"Allow people on this server to receive group shares from other servers" : "Ermögliche es Personen auf diesem Server, Gruppenfreigaben von anderen Servern zu erhalten",
"The lookup server is only available for global scale." : "Der Lookup-Server ist nur für Global Scale verfügbar.",
"The lookup server is only available for global scale." : "Der Lookup-Server ist nur für den globalen Scale verfügbar.",
"Search global and public address book for people" : "Durchsuche globales und öffentliches Adressbuch nach Personen",
"Allow people to publish their data to a global and public address book" : "Erlaube es Personen, ihre Daten in einem globalen und öffentlichen Adressbuch zu veröffentlichen",
"Trusted federation" : "Vertrauenswürdige Federation",
"Automatically accept shares from trusted federated accounts and groups by default" : "Freigaben von vertrauenswürdigen Federated-Konten und -Gruppen standardmäßig automatisch akzeptieren",
"Automatically accept shares from trusted federated accounts and groups by default" : "Freigaben von vertrauenswürdigen Federations-Konten und -Gruppen standardmäßig automatisch akzeptieren",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID",
"Share with me via Nextcloud" : "Teile mit mir über Nextcloud",
+6 -6
View File
@@ -5,9 +5,9 @@
"Couldn't establish a federated share, maybe the password was wrong." : "Federierte Freigabe konnte nicht erstellt werden, vielleicht ist das Passwort falsch.",
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Anfrage für die federierte Freigabe gesendet, du solltest eine Einladung erhalten. Bitte in Deinen Benachrichtigungen nachsehen. ",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Federierte Freigabe konnte nicht aufgebaut werden, da der Zielserver eine zu alte Version verwendet (Nextcloud <=9).",
"It is not allowed to send federated group shares from this server." : "Das Erstellen einer Federated-Cloud-Freigabe ist von diesem Server aus nicht erlaubt.",
"It is not allowed to send federated group shares from this server." : "Das Erstellen einer Federated Cloud Freigabe ist von diesem Server aus nicht erlaubt.",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Freigeben von %1$s ist fehlgeschlagen, da dieses Element schon mit dem Konto %2$s geteilt wurde",
"Not allowed to create a federated share to the same account" : "Das Erstellen einer Federated-Cloud-Freigabe mit dem selben Konto ist unzulässig",
"Not allowed to create a federated share to the same account" : "Das Erstellen einer Federated-Cloud-Freigabe mit dem selben Konto ist uzulässig",
"Federated shares require read permissions" : "Federated-Freigaben benötigen Leseberechtigungen",
"File is already shared with %s" : "Datei wird bereits mit %s geteilt",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Freigabe von %1$s fehlgeschlagen, da %2$s nicht gefunden wurde. Möglicherweise ist der Server nicht erreichbar oder nutzt ein selbst-erstelltes Zertifikat.",
@@ -17,9 +17,9 @@
"You received {share} as a remote share from {user}" : "Du hast {share} als externe Freigabe von {user} empfangen",
"Accept" : "Ok",
"Decline" : "Abgelehnt",
"Federated Cloud Sharing" : "Federated-Cloud-Freigabe",
"Federated Cloud Sharing" : "Federierte-Cloud-Freigabe",
"Sharing" : "Teilen",
"Federated file sharing" : "Federated Datei-Freigabe",
"Federated file sharing" : "Federierte Datei-Freigabe",
"Provide federated file sharing across servers" : "Bietet Federated Datei-Freigaben über Servergrenzen hinweg",
"Confirm data upload to lookup server" : "Hochladen der Daten zum Lookup-Server bestätigen",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Wenn diese Option aktiviert ist, werden alle Kontoeigenschaften (z. B. E-Mail-Adresse) mit der auf „veröffentlicht“ eingestellten Bereichssichtbarkeit automatisch synchronisiert und an ein externes System übertragen sowie in einem öffentlichen, globalen Adressbuch verfügbar gemacht.",
@@ -37,11 +37,11 @@
"Allow people on this server to receive shares from other servers" : "Ermögliche es Personen auf diesem Server, Freigaben von anderen Servern zu erhalten",
"Allow people on this server to send shares to groups on other servers" : "Ermögliche es Personen auf diesem Server, Freigaben an Gruppen auf anderen Servern zu senden",
"Allow people on this server to receive group shares from other servers" : "Ermögliche es Personen auf diesem Server, Gruppenfreigaben von anderen Servern zu erhalten",
"The lookup server is only available for global scale." : "Der Lookup-Server ist nur für Global Scale verfügbar.",
"The lookup server is only available for global scale." : "Der Lookup-Server ist nur für den globalen Scale verfügbar.",
"Search global and public address book for people" : "Durchsuche globales und öffentliches Adressbuch nach Personen",
"Allow people to publish their data to a global and public address book" : "Erlaube es Personen, ihre Daten in einem globalen und öffentlichen Adressbuch zu veröffentlichen",
"Trusted federation" : "Vertrauenswürdige Federation",
"Automatically accept shares from trusted federated accounts and groups by default" : "Freigaben von vertrauenswürdigen Federated-Konten und -Gruppen standardmäßig automatisch akzeptieren",
"Automatically accept shares from trusted federated accounts and groups by default" : "Freigaben von vertrauenswürdigen Federations-Konten und -Gruppen standardmäßig automatisch akzeptieren",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID",
"Share with me via Nextcloud" : "Teile mit mir über Nextcloud",
@@ -108,7 +108,7 @@ class CloudFederationProviderFiles implements ISignedCloudFederationProvider {
$token = $share->getShareSecret();
$name = $share->getResourceName();
$owner = $share->getOwnerDisplayName() ?: $share->getOwner();
$owner = $share->getOwnerDisplayName();
$sharedBy = $share->getSharedByDisplayName();
$shareWith = $share->getShareWith();
$remoteId = $share->getProviderId();
@@ -74,7 +74,7 @@
<script>
import axios from '@nextcloud/axios'
import { DialogBuilder, showError } from '@nextcloud/dialogs'
import { DialogBuilder, DialogSeverity, showError } from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import { confirmPassword } from '@nextcloud/password-confirmation'
import { generateOcsUrl } from '@nextcloud/router'
@@ -82,6 +82,8 @@ import NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwit
import NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'
import logger from '../services/logger.ts'
import '@nextcloud/password-confirmation/dist/style.css'
export default {
name: 'AdminSettings',
@@ -122,7 +124,7 @@ export default {
const dialog = new DialogBuilder(t('federatedfilesharing', 'Confirm data upload to lookup server'))
await dialog
.setSeverity('warning')
.setSeverity(DialogSeverity.Warning)
.setText(t('federatedfilesharing', 'When enabled, all account properties (e.g. email address) with scope visibility set to "published", will be automatically synced and transmitted to an external system and made available in a public, global address book.'))
.addButton({
callback: () => this.setLookupServerUploadEnabled(false),
@@ -153,7 +155,7 @@ export default {
const dialog = new DialogBuilder(t('federatedfilesharing', 'Confirm querying lookup server'))
await dialog
.setSeverity('warning')
.setSeverity(DialogSeverity.Warning)
.setText(t('federatedfilesharing', 'When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book.')
+ t('federatedfilesharing', 'This is used to retrieve the federated cloud ID to make federated sharing easier.')
+ t('federatedfilesharing', 'Moreover, email addresses of users might be sent to that system in order to verify them.'))
@@ -0,0 +1,123 @@
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import RemoteShareDialog from './RemoteShareDialog.vue'
describe('RemoteShareDialog', () => {
it('can be mounted', () => {
cy.mount(RemoteShareDialog, {
propsData: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
cy.findByRole('dialog')
.should('be.visible')
.and('contain.text', 'user123@nextcloud.local')
.and('contain.text', 'my-photos')
cy.findByRole('button', { name: 'Cancel' })
.should('be.visible')
cy.findByRole('button', { name: /add remote share/i })
.should('be.visible')
})
it('does not show password input if not enabled', () => {
cy.mount(RemoteShareDialog, {
propsData: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
cy.findByRole('dialog')
.should('be.visible')
.find('input[type="password"]')
.should('not.exist')
})
it('emits true when accepted', () => {
const onClose = cy.spy().as('onClose')
cy.mount(RemoteShareDialog, {
listeners: {
close: onClose,
},
propsData: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
cy.findByRole('button', { name: 'Cancel' }).click()
cy.get('@onClose')
.should('have.been.calledWith', false)
})
it('show password input if needed', () => {
cy.mount(RemoteShareDialog, {
propsData: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
cy.findByRole('dialog')
.should('be.visible')
.find('input[type="password"]')
.should('be.visible')
})
it('emits the submitted password', () => {
const onClose = cy.spy().as('onClose')
cy.mount(RemoteShareDialog, {
listeners: {
close: onClose,
},
propsData: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
cy.get('input[type="password"]')
.type('my password{enter}')
cy.get('@onClose')
.should('have.been.calledWith', true, 'my password')
})
it('emits no password if cancelled', () => {
const onClose = cy.spy().as('onClose')
cy.mount(RemoteShareDialog, {
listeners: {
close: onClose,
},
propsData: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
cy.get('input[type="password"]')
.type('my password')
cy.findByRole('button', { name: 'Cancel' }).click()
cy.get('@onClose')
.should('have.been.calledWith', false)
})
})
@@ -1,115 +0,0 @@
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { cleanup, fireEvent, render } from '@testing-library/vue'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import RemoteShareDialog from './RemoteShareDialog.vue'
describe('RemoteShareDialog', () => {
beforeEach(cleanup)
it('can be mounted', async () => {
const component = render(RemoteShareDialog, {
props: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
await expect(component.findByRole('dialog', { name: 'Remote share' })).resolves.not.toThrow()
expect(component.getByRole('dialog').innerText).toContain(/my-photos from user123@nextcloud.local/)
await expect(component.findByRole('button', { name: 'Cancel' })).resolves.not.toThrow()
await expect(component.findByRole('button', { name: /Add remote share/ })).resolves.not.toThrow()
})
it('does not show password input if not enabled', async () => {
const component = render(RemoteShareDialog, {
props: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
await expect(component.findByLabelText('Remote share password')).rejects.toThrow()
})
it('emits true when accepted', () => {
const onClose = vi.fn()
const component = render(RemoteShareDialog, {
listeners: {
close: onClose,
},
props: {
owner: 'user123',
name: 'my-photos',
remote: 'nextcloud.local',
passwordRequired: false,
},
})
component.getByRole('button', { name: 'Cancel' }).click()
expect(onClose).toHaveBeenCalledWith(false)
})
it('show password input if needed', async () => {
const component = render(RemoteShareDialog, {
props: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
await expect(component.findByLabelText('Remote share password')).resolves.not.toThrow()
})
it('emits the submitted password', async () => {
const onClose = vi.fn()
const component = render(RemoteShareDialog, {
listeners: {
close: onClose,
},
props: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
const input = component.getByLabelText('Remote share password')
await fireEvent.update(input, 'my password')
component.getByRole('button', { name: 'Add remote share' }).click()
expect(onClose).toHaveBeenCalledWith(true, 'my password')
})
it('emits no password if cancelled', async () => {
const onClose = vi.fn()
const component = render(RemoteShareDialog, {
listeners: {
close: onClose,
},
props: {
owner: 'admin',
name: 'secret-data',
remote: 'nextcloud.local',
passwordRequired: true,
},
})
const input = component.getByLabelText('Remote share password')
await fireEvent.update(input, 'my password')
component.getByRole('button', { name: 'Cancel' }).click()
expect(onClose).toHaveBeenCalledWith(false)
})
})
@@ -35,8 +35,8 @@ const buttons = computed(() => [
},
{
label: t('federatedfilesharing', 'Add remote share'),
type: props.passwordRequired ? 'submit' : undefined,
variant: 'primary',
nativeType: props.passwordRequired ? 'submit' : undefined,
type: 'primary',
callback: () => emit('close', true, password.value),
},
])
@@ -3,7 +3,7 @@
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import { spawnDialog } from '@nextcloud/vue/functions/dialog'
import { spawnDialog } from '@nextcloud/dialogs'
import RemoteShareDialog from '../components/RemoteShareDialog.vue'
/**
-1
View File
@@ -142,7 +142,6 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Nepodařilo se znovu načíst stav sanitizace názvů souborů.",
"Filename sanitization in progress." : "Probíhá sanitizace názvu souboru.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "V tuto chvíli je už zpracováno {processedUsers} z {totalUsers} účtů.",
"Preparing …" : "Příprava …",
"Refresh" : "Znovu načíst",
"All files have been santized for Windows filename support." : "Všechny soubory byly sanitizovány ohledně podpory názvů souborů ve Windows.",
"Some files could not be sanitized, please check your logs." : "Některé soubory nebylo možné sanitizovat podívejte se do záznamu událostí.",
-1
View File
@@ -140,7 +140,6 @@
"Failed to refresh filename sanitization status." : "Nepodařilo se znovu načíst stav sanitizace názvů souborů.",
"Filename sanitization in progress." : "Probíhá sanitizace názvu souboru.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "V tuto chvíli je už zpracováno {processedUsers} z {totalUsers} účtů.",
"Preparing …" : "Příprava …",
"Refresh" : "Znovu načíst",
"All files have been santized for Windows filename support." : "Všechny soubory byly sanitizovány ohledně podpory názvů souborů ve Windows.",
"Some files could not be sanitized, please check your logs." : "Některé soubory nebylo možné sanitizovat podívejte se do záznamu událostí.",
+2 -11
View File
@@ -124,8 +124,6 @@ OC.L10N.register(
"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} selected_" : ["{count} valgt","{count} valgt"],
"Search everywhere …" : "Søg over alt ...",
"Search here …" : "Søg her ...",
"Search scope options" : "Indstillinger for søgeområde",
"Search here" : "Søg her",
"{usedQuotaByte} used" : "{usedQuotaByte} brugt",
@@ -144,7 +142,6 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Kunne ikke genopfriske status for filnavnsrensning.",
"Filename sanitization in progress." : "Filnavnsrensning i gang.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Aktuelt er {processedUsers} ud af {totalUsers} konti allerede processeret.",
"Preparing …" : "Forbereder ...",
"Refresh" : "Opdatér",
"All files have been santized for Windows filename support." : "Alle filer er blevet filnavnsrensede af hensyn til Windows filnavnsunderstøttelse.",
"Some files could not be sanitized, please check your logs." : "Nogle filer kunne ikke blive filnavnsrensede, kontroller venligst dine logfiler.",
@@ -159,7 +156,6 @@ OC.L10N.register(
"Sanitize filenames" : "Rens filnavne",
"(starting)" : "(starter)",
"Fill template fields" : "Udfyld skabelonfelter",
"Submitting fields …" : "Indsender felter ...",
"Submit" : "Tilføj",
"Choose a file or folder to transfer" : "Vælg en fil eller mappe til overførsel",
"Transfer" : "Overfør",
@@ -272,8 +268,6 @@ OC.L10N.register(
"Create a new file with the selected template" : "Opret en ny fil med den valgte skabelon",
"Creating file" : "Opretter fil",
"Save as {displayName}" : "Gem som {displayName}",
"Save as …" : "Gem som ...",
"Converting files …" : "Konverterer filer ...",
"Failed to convert files: {message}" : "Kunne ikke konvertere filer: {message}",
"All files failed to be converted" : "Alle filer kunne ikke konverteres",
"One file could not be converted: {message}" : "En fil kunne ikke konverteres: {message}",
@@ -281,7 +275,6 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["En fil konverteret","%n filer konverteret"],
"Files successfully converted" : "Filer konverteret",
"Failed to convert files" : "Kunne ikke konvertere filer",
"Converting file …" : "Konverterer fil …",
"File successfully converted" : "Filen konverteret",
"Failed to convert file: {message}" : "Kunne ikke konvertere fil: {message}",
"Failed to convert file" : "Kunne ikke konvertere fil",
@@ -302,8 +295,6 @@ OC.L10N.register(
"Download" : "Download",
"The requested file is not available." : "Den forespurgte fil er ikke tilgængelig.",
"The requested files are not available." : "De forespurgte filer er ikke tilgængelige.",
"Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierer \"{source}\" til \"{destination}\" …",
"Destination is not a folder" : "Destinationen er ikke en mappe",
"This file/folder is already in that directory" : "Filen/mappen er allerede i denne mappe",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe ind i sig selv, eller til en mappe inden i sig selv",
@@ -313,11 +304,11 @@ OC.L10N.register(
"The files are locked" : "Filerne er låste",
"The file does not exist anymore" : "Filen findes ikke længere",
"Choose destination" : "Vælg destination",
"Copy to {target}" : "Kopiér til {target}",
"Copy to {target}" : "Kopier til {target}",
"Move to {target}" : "Flyt til {target}",
"Move" : "Flyt",
"Move or copy operation failed" : "Flytte- eller kopioperationen fejlede",
"Move or copy" : "Flyt eller kopiér",
"Move or copy" : "Flyt eller kopier",
"Open folder {displayName}" : "Åben mappe {displayName}",
"Open in Files" : "Åben i Filer",
"Open locally" : "Åben lokalt",
+2 -11
View File
@@ -122,8 +122,6 @@
"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} selected_" : ["{count} valgt","{count} valgt"],
"Search everywhere …" : "Søg over alt ...",
"Search here …" : "Søg her ...",
"Search scope options" : "Indstillinger for søgeområde",
"Search here" : "Søg her",
"{usedQuotaByte} used" : "{usedQuotaByte} brugt",
@@ -142,7 +140,6 @@
"Failed to refresh filename sanitization status." : "Kunne ikke genopfriske status for filnavnsrensning.",
"Filename sanitization in progress." : "Filnavnsrensning i gang.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Aktuelt er {processedUsers} ud af {totalUsers} konti allerede processeret.",
"Preparing …" : "Forbereder ...",
"Refresh" : "Opdatér",
"All files have been santized for Windows filename support." : "Alle filer er blevet filnavnsrensede af hensyn til Windows filnavnsunderstøttelse.",
"Some files could not be sanitized, please check your logs." : "Nogle filer kunne ikke blive filnavnsrensede, kontroller venligst dine logfiler.",
@@ -157,7 +154,6 @@
"Sanitize filenames" : "Rens filnavne",
"(starting)" : "(starter)",
"Fill template fields" : "Udfyld skabelonfelter",
"Submitting fields …" : "Indsender felter ...",
"Submit" : "Tilføj",
"Choose a file or folder to transfer" : "Vælg en fil eller mappe til overførsel",
"Transfer" : "Overfør",
@@ -270,8 +266,6 @@
"Create a new file with the selected template" : "Opret en ny fil med den valgte skabelon",
"Creating file" : "Opretter fil",
"Save as {displayName}" : "Gem som {displayName}",
"Save as …" : "Gem som ...",
"Converting files …" : "Konverterer filer ...",
"Failed to convert files: {message}" : "Kunne ikke konvertere filer: {message}",
"All files failed to be converted" : "Alle filer kunne ikke konverteres",
"One file could not be converted: {message}" : "En fil kunne ikke konverteres: {message}",
@@ -279,7 +273,6 @@
"_One file successfully converted_::_%n files successfully converted_" : ["En fil konverteret","%n filer konverteret"],
"Files successfully converted" : "Filer konverteret",
"Failed to convert files" : "Kunne ikke konvertere filer",
"Converting file …" : "Konverterer fil …",
"File successfully converted" : "Filen konverteret",
"Failed to convert file: {message}" : "Kunne ikke konvertere fil: {message}",
"Failed to convert file" : "Kunne ikke konvertere fil",
@@ -300,8 +293,6 @@
"Download" : "Download",
"The requested file is not available." : "Den forespurgte fil er ikke tilgængelig.",
"The requested files are not available." : "De forespurgte filer er ikke tilgængelige.",
"Moving \"{source}\" to \"{destination}\" …" : "Flytter \"{source}\" til \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopierer \"{source}\" til \"{destination}\" …",
"Destination is not a folder" : "Destinationen er ikke en mappe",
"This file/folder is already in that directory" : "Filen/mappen er allerede i denne mappe",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan ikke flytte en fil/mappe ind i sig selv, eller til en mappe inden i sig selv",
@@ -311,11 +302,11 @@
"The files are locked" : "Filerne er låste",
"The file does not exist anymore" : "Filen findes ikke længere",
"Choose destination" : "Vælg destination",
"Copy to {target}" : "Kopiér til {target}",
"Copy to {target}" : "Kopier til {target}",
"Move to {target}" : "Flyt til {target}",
"Move" : "Flyt",
"Move or copy operation failed" : "Flytte- eller kopioperationen fejlede",
"Move or copy" : "Flyt eller kopiér",
"Move or copy" : "Flyt eller kopier",
"Open folder {displayName}" : "Åben mappe {displayName}",
"Open in Files" : "Åben i Filer",
"Open locally" : "Åben lokalt",
+3 -3
View File
@@ -66,7 +66,7 @@ OC.L10N.register(
"Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} von {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.",
"Ownership transfer done" : "Besitzübertragung abgeschlossen",
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
@@ -319,7 +319,7 @@ OC.L10N.register(
"Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
"Move or copy" : "Verschieben oder kopieren",
"Open folder {displayName}" : "Ordner {displayName} öffnen",
"Open in Files" : "In Dateien öffnen",
"Open in Files" : "In \"Dateien\" öffnen",
"Open locally" : "Lokal öffnen",
"Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
"Open file locally" : "Datei lokal öffnen",
@@ -398,7 +398,7 @@ OC.L10N.register(
"renamed file" : "Umbenannte Datei",
"Upload (max. %s)" : "Hochladen (max. %s)",
"After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
"It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum \"occ“-Befehl.",
"It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl „occ“.",
"\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
"\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
"\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
+3 -3
View File
@@ -64,7 +64,7 @@
"Your ownership transfer of {path} was denied by {user}." : "Die Besitzübertragung von {path} wurde von {user} abgelehnt.",
"Ownership transfer failed" : "Besitzübertragung fehlgeschlagen",
"Your ownership transfer of {path} to {user} failed." : "Die Besitzübertragung von {path} an {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} von {user} ist fehlgeschlagen.",
"The ownership transfer of {path} from {user} failed." : "Die Übertragung von {path} ist fehlgeschlagen.",
"Ownership transfer done" : "Besitzübertragung abgeschlossen",
"Your ownership transfer of {path} to {user} has completed." : "Die Besitzübertragung von {path} an {user} wurde fertiggestellt.",
"The ownership transfer of {path} from {user} has completed." : "Die Besitzübertragung von {path} durch {user} wurde fertiggestellt.",
@@ -317,7 +317,7 @@
"Move or copy operation failed" : "Verschiebe- oder Kopieroperation ist fehlgeschlagen.",
"Move or copy" : "Verschieben oder kopieren",
"Open folder {displayName}" : "Ordner {displayName} öffnen",
"Open in Files" : "In Dateien öffnen",
"Open in Files" : "In \"Dateien\" öffnen",
"Open locally" : "Lokal öffnen",
"Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
"Open file locally" : "Datei lokal öffnen",
@@ -396,7 +396,7 @@
"renamed file" : "Umbenannte Datei",
"Upload (max. %s)" : "Hochladen (max. %s)",
"After enabling the windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Nach Aktivierung der Windows-kompatiblen Dateinamen können vorhandene Dateien nicht mehr geändert, aber von ihrem Besitzer in gültige neue Namen umbenannt werden.",
"It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum \"occ“-Befehl.",
"It is also possible to migrate files automatically after enabling this setting, please refer to the documentation about the occ command." : "Nach dem Aktivieren dieser Einstellung ist es auch möglich, Dateien automatisch zu migrieren. Weitere Informationen finden sich in der Dokumentation zum Befehl „occ“.",
"\"{displayName}\" failed on some elements" : "\"{displayName}\" ist bei einigen Elementen fehlgeschlagen",
"\"{displayName}\" batch action executed successfully" : "Stapelaktion \"{displayName}\" ausgeführt",
"\"{displayName}\" action failed" : "Aktion \"{displayName}\" fehlgeschlagen",
-9
View File
@@ -124,8 +124,6 @@ OC.L10N.register(
"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"],
"Search everywhere …" : "Search everywhere …",
"Search here …" : "Search here …",
"Search scope options" : "Search scope options",
"Search here" : "Search here",
"{usedQuotaByte} used" : "{usedQuotaByte} used",
@@ -144,7 +142,6 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Failed to refresh filename sanitization status.",
"Filename sanitization in progress." : "Filename sanitization in progress.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Currently {processedUsers} of {totalUsers} accounts are already processed.",
"Preparing …" : "Preparing …",
"Refresh" : "Refresh",
"All files have been santized for Windows filename support." : "All files have been santized for Windows filename support.",
"Some files could not be sanitized, please check your logs." : "Some files could not be sanitized, please check your logs.",
@@ -159,7 +156,6 @@ OC.L10N.register(
"Sanitize filenames" : "Sanitize filenames",
"(starting)" : "(starting)",
"Fill template fields" : "Fill template fields",
"Submitting fields …" : "Submitting fields …",
"Submit" : "Submit",
"Choose a file or folder to transfer" : "Choose a file or folder to transfer",
"Transfer" : "Transfer",
@@ -272,8 +268,6 @@ OC.L10N.register(
"Create a new file with the selected template" : "Create a new file with the selected template",
"Creating file" : "Creating file",
"Save as {displayName}" : "Save as {displayName}",
"Save as …" : "Save as …",
"Converting files …" : "Converting files …",
"Failed to convert files: {message}" : "Failed to convert files: {message}",
"All files failed to be converted" : "All files failed to be converted",
"One file could not be converted: {message}" : "One file could not be converted: {message}",
@@ -281,7 +275,6 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
"Files successfully converted" : "Files successfully converted",
"Failed to convert files" : "Failed to convert files",
"Converting file …" : "Converting file …",
"File successfully converted" : "File successfully converted",
"Failed to convert file: {message}" : "Failed to convert file: {message}",
"Failed to convert file" : "Failed to convert file",
@@ -302,8 +295,6 @@ OC.L10N.register(
"Download" : "Download",
"The requested file is not available." : "The requested file is not available.",
"The requested files are not available." : "The requested files are not available.",
"Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
"Destination is not a folder" : "Destination is not a folder",
"This file/folder is already in that directory" : "This file/folder is already in that directory",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
-9
View File
@@ -122,8 +122,6 @@
"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"],
"Search everywhere …" : "Search everywhere …",
"Search here …" : "Search here …",
"Search scope options" : "Search scope options",
"Search here" : "Search here",
"{usedQuotaByte} used" : "{usedQuotaByte} used",
@@ -142,7 +140,6 @@
"Failed to refresh filename sanitization status." : "Failed to refresh filename sanitization status.",
"Filename sanitization in progress." : "Filename sanitization in progress.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Currently {processedUsers} of {totalUsers} accounts are already processed.",
"Preparing …" : "Preparing …",
"Refresh" : "Refresh",
"All files have been santized for Windows filename support." : "All files have been santized for Windows filename support.",
"Some files could not be sanitized, please check your logs." : "Some files could not be sanitized, please check your logs.",
@@ -157,7 +154,6 @@
"Sanitize filenames" : "Sanitize filenames",
"(starting)" : "(starting)",
"Fill template fields" : "Fill template fields",
"Submitting fields …" : "Submitting fields …",
"Submit" : "Submit",
"Choose a file or folder to transfer" : "Choose a file or folder to transfer",
"Transfer" : "Transfer",
@@ -270,8 +266,6 @@
"Create a new file with the selected template" : "Create a new file with the selected template",
"Creating file" : "Creating file",
"Save as {displayName}" : "Save as {displayName}",
"Save as …" : "Save as …",
"Converting files …" : "Converting files …",
"Failed to convert files: {message}" : "Failed to convert files: {message}",
"All files failed to be converted" : "All files failed to be converted",
"One file could not be converted: {message}" : "One file could not be converted: {message}",
@@ -279,7 +273,6 @@
"_One file successfully converted_::_%n files successfully converted_" : ["One file successfully converted","%n files successfully converted"],
"Files successfully converted" : "Files successfully converted",
"Failed to convert files" : "Failed to convert files",
"Converting file …" : "Converting file …",
"File successfully converted" : "File successfully converted",
"Failed to convert file: {message}" : "Failed to convert file: {message}",
"Failed to convert file" : "Failed to convert file",
@@ -300,8 +293,6 @@
"Download" : "Download",
"The requested file is not available." : "The requested file is not available.",
"The requested files are not available." : "The requested files are not available.",
"Moving \"{source}\" to \"{destination}\" …" : "Moving \"{source}\" to \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Copying \"{source}\" to \"{destination}\" …",
"Destination is not a folder" : "Destination is not a folder",
"This file/folder is already in that directory" : "This file/folder is already in that directory",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "You cannot move a file/folder onto itself or into a subfolder of itself",
-9
View File
@@ -124,8 +124,6 @@ OC.L10N.register(
"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} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
"Search everywhere …" : "Rechercher partout …",
"Search here …" : "Rechercher ici …",
"Search scope options" : "Options de portée de recherche",
"Search here" : "Rechercher ici",
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
@@ -144,7 +142,6 @@ OC.L10N.register(
"Failed to refresh filename sanitization status." : "Impossible d'actualiser le statut du nettoyage de nom de fichier.",
"Filename sanitization in progress." : "Nettoyage de nom de fichier en cours.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Actuellement, {processedUsers} sur {totalUsers} comptes ont déjà été traités.",
"Preparing …" : "Préparation …",
"Refresh" : "Actualiser",
"All files have been santized for Windows filename support." : "Tous les fichiers ont été nettoyés pour être compatibles avec Windows.",
"Some files could not be sanitized, please check your logs." : "Certains fichiers n'ont pas pu être nettoyés, veuillez vérifier les logs du serveur.",
@@ -159,7 +156,6 @@ OC.L10N.register(
"Sanitize filenames" : "Nettoyer les noms de fichiers",
"(starting)" : "(démarrage)",
"Fill template fields" : "Remplir les champs modèle",
"Submitting fields …" : "Soumission des champs …",
"Submit" : "Envoyer",
"Choose a file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
"Transfer" : "Transférer",
@@ -272,8 +268,6 @@ OC.L10N.register(
"Create a new file with the selected template" : "Créer un nouveau fichier avec le modèle sélectionné",
"Creating file" : "Créer un fichier",
"Save as {displayName}" : "Enregistrer sous {displayName}",
"Save as …" : "Enregistrer sous …",
"Converting files …" : "Conversion des fichiers …",
"Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}",
"All files failed to be converted" : "Aucun fichier n'a pu être converti",
"One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti",
@@ -281,7 +275,6 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"],
"Files successfully converted" : "Fichiers convertis avec succès",
"Failed to convert files" : "Impossible de convertir les fichiers",
"Converting file …" : "Conversion du fichier …",
"File successfully converted" : "Fichier converti avec succès",
"Failed to convert file: {message}" : "Impossible de convertir le fichier : {message}",
"Failed to convert file" : "Impossible de convertir le fichier",
@@ -302,8 +295,6 @@ OC.L10N.register(
"Download" : "Télécharger",
"The requested file is not available." : "Le fichier demandé n'est pas disponible.",
"The requested files are not available." : "Les fichiers demandés ne sont pas disponibles.",
"Moving \"{source}\" to \"{destination}\" …" : "Déplacement de \"{source}\" vers \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Copie de \"{source}\" vers \"{destination}\" …",
"Destination is not a folder" : "La destination n'est pas un dossier",
"This file/folder is already in that directory" : "Ce fichier/dossier se trouve déjà dans ce dossier",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Vous ne pouvez pas déplacer un fichier/dossier sur lui-même ou dans un sous-dossier de celui-ci",
-9
View File
@@ -122,8 +122,6 @@
"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} selected_" : ["{count} sélectionné","{count} sélectionné(s)","{count} sélectionné(s)"],
"Search everywhere …" : "Rechercher partout …",
"Search here …" : "Rechercher ici …",
"Search scope options" : "Options de portée de recherche",
"Search here" : "Rechercher ici",
"{usedQuotaByte} used" : "{usedQuotaByte} utilisés",
@@ -142,7 +140,6 @@
"Failed to refresh filename sanitization status." : "Impossible d'actualiser le statut du nettoyage de nom de fichier.",
"Filename sanitization in progress." : "Nettoyage de nom de fichier en cours.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "Actuellement, {processedUsers} sur {totalUsers} comptes ont déjà été traités.",
"Preparing …" : "Préparation …",
"Refresh" : "Actualiser",
"All files have been santized for Windows filename support." : "Tous les fichiers ont été nettoyés pour être compatibles avec Windows.",
"Some files could not be sanitized, please check your logs." : "Certains fichiers n'ont pas pu être nettoyés, veuillez vérifier les logs du serveur.",
@@ -157,7 +154,6 @@
"Sanitize filenames" : "Nettoyer les noms de fichiers",
"(starting)" : "(démarrage)",
"Fill template fields" : "Remplir les champs modèle",
"Submitting fields …" : "Soumission des champs …",
"Submit" : "Envoyer",
"Choose a file or folder to transfer" : "Sélectionnez un fichier ou un dossier à transférer",
"Transfer" : "Transférer",
@@ -270,8 +266,6 @@
"Create a new file with the selected template" : "Créer un nouveau fichier avec le modèle sélectionné",
"Creating file" : "Créer un fichier",
"Save as {displayName}" : "Enregistrer sous {displayName}",
"Save as …" : "Enregistrer sous …",
"Converting files …" : "Conversion des fichiers …",
"Failed to convert files: {message}" : "Impossible de convertir les fichiers : {message}",
"All files failed to be converted" : "Aucun fichier n'a pu être converti",
"One file could not be converted: {message}" : "Le fichier {message} n'a pas pu être converti",
@@ -279,7 +273,6 @@
"_One file successfully converted_::_%n files successfully converted_" : ["Un fichier converti avec succès","%n fichiers convertis avec succès","%n fichiers convertis avec succès"],
"Files successfully converted" : "Fichiers convertis avec succès",
"Failed to convert files" : "Impossible de convertir les fichiers",
"Converting file …" : "Conversion du fichier …",
"File successfully converted" : "Fichier converti avec succès",
"Failed to convert file: {message}" : "Impossible de convertir le fichier : {message}",
"Failed to convert file" : "Impossible de convertir le fichier",
@@ -300,8 +293,6 @@
"Download" : "Télécharger",
"The requested file is not available." : "Le fichier demandé n'est pas disponible.",
"The requested files are not available." : "Les fichiers demandés ne sont pas disponibles.",
"Moving \"{source}\" to \"{destination}\" …" : "Déplacement de \"{source}\" vers \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Copie de \"{source}\" vers \"{destination}\" …",
"Destination is not a folder" : "La destination n'est pas un dossier",
"This file/folder is already in that directory" : "Ce fichier/dossier se trouve déjà dans ce dossier",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Vous ne pouvez pas déplacer un fichier/dossier sur lui-même ou dans un sous-dossier de celui-ci",
+1 -25
View File
@@ -110,9 +110,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" : "파일을 찾을 수 없음",
"Search everywhere …" : "모든 곳에서 검색 ...",
"Search here …" : "여기서 검색 ...",
"Search here" : "여기서 검색",
"{usedQuotaByte} used" : "{usedQuotaByte} 사용",
"{used} of {quota} used" : "{quota} 중 {used} 사용함",
"{relative}% used" : "{relative}% 사용",
@@ -152,46 +149,27 @@ OC.L10N.register(
"Clipboard is not available" : "클립보드를 사용할 수 없습니다.",
"Files settings" : "파일 설정",
"General" : "일반",
"Default view" : "기본 보기",
"All files" : "모든 파일",
"Personal files" : "개인 파일",
"Sort favorites first" : "즐겨찾기를 처음에 나열",
"Sort folders before files" : "폴더를 파일보다 먼저 정렬",
"Folder tree" : "폴더 트리",
"Appearance" : "외형",
"Show hidden files" : "숨김 파일 보이기",
"Show file type column" : "파일 형식 열 보이기",
"Show file extensions" : "파일 확장자 보이기",
"Crop image previews" : "이미지 미리보기 확대",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy" : "복사",
"How to access files using WebDAV" : "WebDAV를 사용해 파일에 접근하는 방법",
"Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2단계 인증이 활성화되어 있어 외부 WebDAV 클라이언트를 연결할 때 앱 암호를 사용해야 합니다.",
"Warnings" : "경고",
"Warn before changing a file extension" : "파일 확장자 변경 시 경고",
"Warn before deleting files" : "파일 삭제 시 경고",
"Keyboard shortcuts" : "키보드 단축키",
"File actions" : "파일 동작",
"Rename" : "이름 바꾸기",
"Delete" : "삭제",
"Add or remove favorite" : "즐겨찾기 추가 또는 삭제",
"Manage tags" : "태그 관리하기",
"Selection" : "선택",
"Select all files" : "모든 파일 선택",
"Deselect all" : "모두 선택 해제",
"Select or deselect" : "선택 또는 선택 해제",
"Select a range" : "범위 선택",
"Navigation" : "탐색",
"Go to parent folder" : "상위 폴더로 이동",
"Go to file above" : "위 파일로 이동",
"Go to file below" : "아래 파일로 이동",
"Go left in grid" : "그리드에서 왼쪽으로 이동",
"Go right in grid" : "그리드에서 오른쪽으로 이동",
"View" : "보기",
"Toggle grid view" : "그리드뷰 전환",
"Open file sidebar" : "파일 사이드바 열기",
"Show those shortcuts" : "다음 단축키 표시",
"Share" : "공유하기",
"Shared by link" : "링크로 공유됨",
@@ -376,8 +354,6 @@ OC.L10N.register(
"Photos and images" : "사진과 이미지",
"New folder creation cancelled" : "새 폴더 생성 취소됨",
"This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"All folders" : "모든 폴더",
"Search everywhere …" : "모든 곳에서 검색 ...",
"Search here …" : "여기서 검색 ..."
"All folders" : "모든 폴더"
},
"nplurals=1; plural=0;");
+1 -25
View File
@@ -108,9 +108,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" : "파일을 찾을 수 없음",
"Search everywhere …" : "모든 곳에서 검색 ...",
"Search here …" : "여기서 검색 ...",
"Search here" : "여기서 검색",
"{usedQuotaByte} used" : "{usedQuotaByte} 사용",
"{used} of {quota} used" : "{quota} 중 {used} 사용함",
"{relative}% used" : "{relative}% 사용",
@@ -150,46 +147,27 @@
"Clipboard is not available" : "클립보드를 사용할 수 없습니다.",
"Files settings" : "파일 설정",
"General" : "일반",
"Default view" : "기본 보기",
"All files" : "모든 파일",
"Personal files" : "개인 파일",
"Sort favorites first" : "즐겨찾기를 처음에 나열",
"Sort folders before files" : "폴더를 파일보다 먼저 정렬",
"Folder tree" : "폴더 트리",
"Appearance" : "외형",
"Show hidden files" : "숨김 파일 보이기",
"Show file type column" : "파일 형식 열 보이기",
"Show file extensions" : "파일 확장자 보이기",
"Crop image previews" : "이미지 미리보기 확대",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy" : "복사",
"How to access files using WebDAV" : "WebDAV를 사용해 파일에 접근하는 방법",
"Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "2단계 인증이 활성화되어 있어 외부 WebDAV 클라이언트를 연결할 때 앱 암호를 사용해야 합니다.",
"Warnings" : "경고",
"Warn before changing a file extension" : "파일 확장자 변경 시 경고",
"Warn before deleting files" : "파일 삭제 시 경고",
"Keyboard shortcuts" : "키보드 단축키",
"File actions" : "파일 동작",
"Rename" : "이름 바꾸기",
"Delete" : "삭제",
"Add or remove favorite" : "즐겨찾기 추가 또는 삭제",
"Manage tags" : "태그 관리하기",
"Selection" : "선택",
"Select all files" : "모든 파일 선택",
"Deselect all" : "모두 선택 해제",
"Select or deselect" : "선택 또는 선택 해제",
"Select a range" : "범위 선택",
"Navigation" : "탐색",
"Go to parent folder" : "상위 폴더로 이동",
"Go to file above" : "위 파일로 이동",
"Go to file below" : "아래 파일로 이동",
"Go left in grid" : "그리드에서 왼쪽으로 이동",
"Go right in grid" : "그리드에서 오른쪽으로 이동",
"View" : "보기",
"Toggle grid view" : "그리드뷰 전환",
"Open file sidebar" : "파일 사이드바 열기",
"Show those shortcuts" : "다음 단축키 표시",
"Share" : "공유하기",
"Shared by link" : "링크로 공유됨",
@@ -374,8 +352,6 @@
"Photos and images" : "사진과 이미지",
"New folder creation cancelled" : "새 폴더 생성 취소됨",
"This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오",
"All folders" : "모든 폴더",
"Search everywhere …" : "모든 곳에서 검색 ...",
"Search here …" : "여기서 검색 ..."
"All folders" : "모든 폴더"
},"pluralForm" :"nplurals=1; plural=0;"
}
+2 -55
View File
@@ -13,7 +13,7 @@ OC.L10N.register(
"Restored by {user}" : "Hersteld door {user}",
"Renamed by {user}" : "Hernoemd door {user}",
"Moved by {user}" : "Verplaatst door {user}",
"\"remote account\"" : "\"extern account\"",
"\"remote account\"" : "\"remote account\"",
"You created {file}" : "Je creëerde {file}",
"You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
"{user} created {file}" : "{user} creëerde {file}",
@@ -51,10 +51,6 @@ OC.L10N.register(
"You do not have permission to create a file at the specified location" : "Je hebt geen toestemming om een bestand aan te maken op de opgegeven locatie",
"The file could not be converted." : "Het bestand kon niet worden geconverteerd.",
"Could not get relative path to converted file" : "Kon geen relatief pad naar geconverteerd bestand achterhalen",
"Limit must be a positive integer." : "Limiet moet een positief integer getal zijn.",
"The replacement character may only be a single character." : "Het vervangende teken kan alleen maar een enkel teken zijn",
"Filename sanitization already started." : "Opschonen bestandsnaam is al actief",
"No filename sanitization in progress." : "Opschonen bestandsnaam niet actief",
"Favorite files" : "Favoriete bestanden",
"No favorites" : "Geen favorieten",
"More favorites" : "Meer favorieten",
@@ -113,9 +109,6 @@ OC.L10N.register(
"Name" : "Naam",
"File type" : "Bestandstype",
"Size" : "Grootte",
"{displayName}: failed on some elements" : "{displayName}: sommige onderdelen zijn mislukt",
"{displayName}: done" : "{displayName}: compleet",
"{displayName}: failed" : "{displayName}: mislukt",
"Actions" : "Acties",
"(selected)" : "(geselecteerd)",
"List of files and folders." : "Lijst van bestanden en mappen.",
@@ -124,10 +117,7 @@ OC.L10N.register(
"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} selected_" : ["{count} geselecteerd","{count} geselecteerd"],
"Search everywhere …" : "Zoek in alles …",
"Search here …" : "Zoek hier …",
"Search scope options" : "Zoek bereikopties",
"Search here" : "Zoek hier",
"{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
"{used} of {quota} used" : "{used} van {quota} gebruikt",
"{relative}% used" : "{relative}% gebruikt",
@@ -140,26 +130,9 @@ OC.L10N.register(
"This name is already in use." : "De naam is al in gebruik.",
"Create" : "Aanmaken",
"Files starting with a dot are hidden by default" : "Bestanden die met een punt beginnen, worden standaard verborgen",
"Failed to start filename sanitization." : "Opschonen bestandsnaam is mislukt.",
"Failed to refresh filename sanitization status." : "Update van opschonen bestandsnaam status mislukt",
"Filename sanitization in progress." : "Opschonen bestandsnaam wordt uitgevoerd.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "{processedUsers} van {totalUsers} accounts zijn al verwerkt.",
"Preparing …" : "Voorbereiden …",
"Refresh" : "Verversen",
"All files have been santized for Windows filename support." : "Alle bestanden zijn opgeschoond voor ondersteuning van Windows bestandsnamen.",
"Some files could not be sanitized, please check your logs." : "Enkele bestanden kunnen niet opgeschoond worden, controleer je logs.",
"Sanitization errors" : "Opschoon fouten",
"Not sanitized filenames" : "Niet opgeschoonde bestanden",
"Windows filename support has been enabled." : "Ondersteuning voor Windows bestanden is ingeschakeld",
"While this blocks users from creating new files with unsupported filenames, existing files are not yet renamed and thus still may break sync on Windows." : "Ondanks dat dit gebruikers stopt om niet niet ondersteunde bestanden aan te maken, zijn bestaande bestanden nog niet hernoemd en kunnen dus de sync met Windows afbreken.",
"You can trigger a rename of files with invalid filenames, this will be done in the background and may take some time." : "Je kan het hernoemen van ongeldige bestandsnamen starten, dit wordt gedaan in de achtergrond en duurt mogelijk even.",
"Please note that this may cause high workload on the sync clients." : "Wees gewaarschuwd dat dit een hoge werklast voor het syncen van clients kan opleveren.",
"Limit" : "Limiet",
"This allows to configure how many users should be processed in one background job run." : "Met dit kan je configureren hoeveel gebruikers verwerkt worden tijdens een achtergrond taak. ",
"Sanitize filenames" : "Opschonen bestanden",
"(starting)" : "(begonnen)",
"Fill template fields" : "Vul de velden van het sjabloon in",
"Submitting fields …" : "Toevoegen velden …",
"Submit" : "Verwerken",
"Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
"Transfer" : "Overdragen",
@@ -184,7 +157,6 @@ OC.L10N.register(
"Select file or folder to link to" : "Selecteer een bestand of map om naar te linken",
"Choose {file}" : "Kies {file}",
"Clipboard is not available" : "Klembord niet beschikbaar",
"WebDAV URL copied" : "WebDAV URL gekopieerd",
"Files settings" : "Instellingen voor bestanden",
"General" : "Algemeen",
"Default view" : "Standaardweergave",
@@ -196,37 +168,24 @@ OC.L10N.register(
"Appearance" : "Uiterlijk",
"Show hidden files" : "Toon verborgen bestanden",
"Show file type column" : "Toon bestandstypekolom",
"Show file extensions" : "Laat bestand extensies zien",
"Crop image previews" : "Snij afbeeldingvoorbeelden bij",
"Additional settings" : "Aanvullende instellingen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy" : "Kopiëren",
"How to access files using WebDAV" : "Hoe bestanden te benaderen met WebDAV",
"Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tweefactorauthenticatie is ingeschakeld voor jouw account en daarom moet je een app-wachtwoord gebruiken om een externe WebDAV-client aan te sluiten.",
"Warnings" : "Waarschuwingen",
"Warn before changing a file extension" : "Waarschuw voordat een bestand extensie wordt gewijzigd",
"Warn before deleting files" : "Waarschuw voordat bestanden worden verwijderd",
"Keyboard shortcuts" : "Toetsenbord sneltoetsen",
"File actions" : "Bestandsacties",
"Rename" : "Naam wijzigen",
"Delete" : "Verwijderen",
"Add or remove favorite" : "Verwijder of voeg een favoriet toe",
"Manage tags" : "Berichttags",
"Selection" : "Selectie",
"Select all files" : "Selecteer alle bestanden",
"Deselect all" : "Deselecteer alles",
"Select or deselect" : "Selecteren of deselecteren",
"Select a range" : "Selecteer een bereik",
"Navigation" : "Navigatie",
"Go to parent folder" : "Ga naar bovenliggende map",
"Go to file above" : "Ga naar bovenliggend bestand",
"Go to file below" : "Ga naar onderliggend bestand",
"Go left in grid" : "Ga naar links in raster",
"Go right in grid" : "Ga naar rechts in raster",
"View" : "Bekijken",
"Toggle grid view" : "Omschakelen roosterweergave",
"Open file sidebar" : "Open bestands zijbalk",
"Show those shortcuts" : "Toon die snelkoppelingen",
"Share" : "Delen",
"Shared by link" : "Gedeeld via link",
@@ -262,7 +221,6 @@ OC.L10N.register(
"Search for files" : "Zoeken naar bestanden",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Toestaan om bestandsnamen te beperken om te borgen dat bestanden met alle cliënts gesynchroniseerd kunnen worden. Standaard zijn alle bestandsnamen valide die zijn toegestaan op POSIX (zoals Linux en macOS.)",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
"Failed to toggle Windows filename support" : "Omschakelen naar Windows bestand ondersteuning mislukt",
"Files compatibility" : "Bestandscompatibiliteit",
"Enforce Windows compatibility" : "Dwing Windows-compatibiliteit af",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dit zal bestandsnamen blokkeren die niet toegestaan zijn op Windows-systemen, zoals gereserveerde namen of speciale tekens. Dit dwingt niet tot compatibiliteit voor hoofd- en kleine letters.",
@@ -272,8 +230,6 @@ OC.L10N.register(
"Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
"Creating file" : "Maken bestand",
"Save as {displayName}" : "Opslaan als {displayName}",
"Save as …" : "Bewaar als …",
"Converting files …" : "Bestanden converteren …",
"Failed to convert files: {message}" : "Conversie van bestanden mislukt: {message} ",
"All files failed to be converted" : "De conversie van alle bestanden is mislukt",
"One file could not be converted: {message}" : "Een bestand kon niet worden geconverteerd: {message}",
@@ -281,7 +237,6 @@ OC.L10N.register(
"_One file successfully converted_::_%n files successfully converted_" : ["Een bestand succesvol geconverteerd","%n bestanden succesvol geconverteerd"],
"Files successfully converted" : "Bestanden succesvol geconverteerd",
"Failed to convert files" : "Conversie van bestanden mislukt",
"Converting file …" : "Bestand converteren …",
"File successfully converted" : "Bestand succesvol geconverteerd",
"Failed to convert file: {message}" : "Conversie van bestand mislukt: {message} ",
"Failed to convert file" : "Conversie van bestand mislukt",
@@ -300,10 +255,6 @@ OC.L10N.register(
"Confirm deletion" : "Bevestig verwijderen",
"Cancel" : "Annuleren",
"Download" : "Downloaden",
"The requested file is not available." : "Het gevraagde bestand is niet beschikbaar.",
"The requested files are not available." : "De gevraagde bestanden zijn niet beschikbaar.",
"Moving \"{source}\" to \"{destination}\" …" : "Verplaatsen \"{source}\" naar \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopieren \"{source}\" naar \"{destination}\" …",
"Destination is not a folder" : "Bestemming is geen map",
"This file/folder is already in that directory" : "Dit bestand/deze map staat al in die map",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Je kan een bestand/map niet verplaatsen naar zichzelf of naar een subfolder van zichzelf.",
@@ -366,7 +317,6 @@ OC.L10N.register(
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{newName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
"Could not rename \"{oldName}\"" : "Kon \"{oldName}\" niet hernoemen",
"This operation is forbidden" : "Deze taak is verboden",
"This folder is unavailable, please try again later or contact the administration" : "Deze map is niet beschikbaar, probeer het later nog eens of neem contact op met de beheerder",
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Unexpected error: {error}" : "Onverwachte fout: {error}",
"_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
@@ -443,9 +393,6 @@ OC.L10N.register(
"Photos and images" : "Foto's en afbeeldingen",
"New folder creation cancelled" : "Maken van nieuwe map geannuleerd",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"All folders" : "Alle mappen",
"Search everywhere …" : "Zoek in alles...",
"Search here …" : "Zoek hier ...",
"Preparing …" : "Voorbereiden ..."
"All folders" : "Alle mappen"
},
"nplurals=2; plural=(n != 1);");
+2 -55
View File
@@ -11,7 +11,7 @@
"Restored by {user}" : "Hersteld door {user}",
"Renamed by {user}" : "Hernoemd door {user}",
"Moved by {user}" : "Verplaatst door {user}",
"\"remote account\"" : "\"extern account\"",
"\"remote account\"" : "\"remote account\"",
"You created {file}" : "Je creëerde {file}",
"You created an encrypted file in {file}" : "Je creëerde een versleuteld bestand in {file}",
"{user} created {file}" : "{user} creëerde {file}",
@@ -49,10 +49,6 @@
"You do not have permission to create a file at the specified location" : "Je hebt geen toestemming om een bestand aan te maken op de opgegeven locatie",
"The file could not be converted." : "Het bestand kon niet worden geconverteerd.",
"Could not get relative path to converted file" : "Kon geen relatief pad naar geconverteerd bestand achterhalen",
"Limit must be a positive integer." : "Limiet moet een positief integer getal zijn.",
"The replacement character may only be a single character." : "Het vervangende teken kan alleen maar een enkel teken zijn",
"Filename sanitization already started." : "Opschonen bestandsnaam is al actief",
"No filename sanitization in progress." : "Opschonen bestandsnaam niet actief",
"Favorite files" : "Favoriete bestanden",
"No favorites" : "Geen favorieten",
"More favorites" : "Meer favorieten",
@@ -111,9 +107,6 @@
"Name" : "Naam",
"File type" : "Bestandstype",
"Size" : "Grootte",
"{displayName}: failed on some elements" : "{displayName}: sommige onderdelen zijn mislukt",
"{displayName}: done" : "{displayName}: compleet",
"{displayName}: failed" : "{displayName}: mislukt",
"Actions" : "Acties",
"(selected)" : "(geselecteerd)",
"List of files and folders." : "Lijst van bestanden en mappen.",
@@ -122,10 +115,7 @@
"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} selected_" : ["{count} geselecteerd","{count} geselecteerd"],
"Search everywhere …" : "Zoek in alles …",
"Search here …" : "Zoek hier …",
"Search scope options" : "Zoek bereikopties",
"Search here" : "Zoek hier",
"{usedQuotaByte} used" : "{usedQuotaByte} gebruikt",
"{used} of {quota} used" : "{used} van {quota} gebruikt",
"{relative}% used" : "{relative}% gebruikt",
@@ -138,26 +128,9 @@
"This name is already in use." : "De naam is al in gebruik.",
"Create" : "Aanmaken",
"Files starting with a dot are hidden by default" : "Bestanden die met een punt beginnen, worden standaard verborgen",
"Failed to start filename sanitization." : "Opschonen bestandsnaam is mislukt.",
"Failed to refresh filename sanitization status." : "Update van opschonen bestandsnaam status mislukt",
"Filename sanitization in progress." : "Opschonen bestandsnaam wordt uitgevoerd.",
"Currently {processedUsers} of {totalUsers} accounts are already processed." : "{processedUsers} van {totalUsers} accounts zijn al verwerkt.",
"Preparing …" : "Voorbereiden …",
"Refresh" : "Verversen",
"All files have been santized for Windows filename support." : "Alle bestanden zijn opgeschoond voor ondersteuning van Windows bestandsnamen.",
"Some files could not be sanitized, please check your logs." : "Enkele bestanden kunnen niet opgeschoond worden, controleer je logs.",
"Sanitization errors" : "Opschoon fouten",
"Not sanitized filenames" : "Niet opgeschoonde bestanden",
"Windows filename support has been enabled." : "Ondersteuning voor Windows bestanden is ingeschakeld",
"While this blocks users from creating new files with unsupported filenames, existing files are not yet renamed and thus still may break sync on Windows." : "Ondanks dat dit gebruikers stopt om niet niet ondersteunde bestanden aan te maken, zijn bestaande bestanden nog niet hernoemd en kunnen dus de sync met Windows afbreken.",
"You can trigger a rename of files with invalid filenames, this will be done in the background and may take some time." : "Je kan het hernoemen van ongeldige bestandsnamen starten, dit wordt gedaan in de achtergrond en duurt mogelijk even.",
"Please note that this may cause high workload on the sync clients." : "Wees gewaarschuwd dat dit een hoge werklast voor het syncen van clients kan opleveren.",
"Limit" : "Limiet",
"This allows to configure how many users should be processed in one background job run." : "Met dit kan je configureren hoeveel gebruikers verwerkt worden tijdens een achtergrond taak. ",
"Sanitize filenames" : "Opschonen bestanden",
"(starting)" : "(begonnen)",
"Fill template fields" : "Vul de velden van het sjabloon in",
"Submitting fields …" : "Toevoegen velden …",
"Submit" : "Verwerken",
"Choose a file or folder to transfer" : "Kies een bestand of map om over te dragen",
"Transfer" : "Overdragen",
@@ -182,7 +155,6 @@
"Select file or folder to link to" : "Selecteer een bestand of map om naar te linken",
"Choose {file}" : "Kies {file}",
"Clipboard is not available" : "Klembord niet beschikbaar",
"WebDAV URL copied" : "WebDAV URL gekopieerd",
"Files settings" : "Instellingen voor bestanden",
"General" : "Algemeen",
"Default view" : "Standaardweergave",
@@ -194,37 +166,24 @@
"Appearance" : "Uiterlijk",
"Show hidden files" : "Toon verborgen bestanden",
"Show file type column" : "Toon bestandstypekolom",
"Show file extensions" : "Laat bestand extensies zien",
"Crop image previews" : "Snij afbeeldingvoorbeelden bij",
"Additional settings" : "Aanvullende instellingen",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy" : "Kopiëren",
"How to access files using WebDAV" : "Hoe bestanden te benaderen met WebDAV",
"Two-Factor Authentication is enabled for your account, and therefore you need to use an app password to connect an external WebDAV client." : "Tweefactorauthenticatie is ingeschakeld voor jouw account en daarom moet je een app-wachtwoord gebruiken om een externe WebDAV-client aan te sluiten.",
"Warnings" : "Waarschuwingen",
"Warn before changing a file extension" : "Waarschuw voordat een bestand extensie wordt gewijzigd",
"Warn before deleting files" : "Waarschuw voordat bestanden worden verwijderd",
"Keyboard shortcuts" : "Toetsenbord sneltoetsen",
"File actions" : "Bestandsacties",
"Rename" : "Naam wijzigen",
"Delete" : "Verwijderen",
"Add or remove favorite" : "Verwijder of voeg een favoriet toe",
"Manage tags" : "Berichttags",
"Selection" : "Selectie",
"Select all files" : "Selecteer alle bestanden",
"Deselect all" : "Deselecteer alles",
"Select or deselect" : "Selecteren of deselecteren",
"Select a range" : "Selecteer een bereik",
"Navigation" : "Navigatie",
"Go to parent folder" : "Ga naar bovenliggende map",
"Go to file above" : "Ga naar bovenliggend bestand",
"Go to file below" : "Ga naar onderliggend bestand",
"Go left in grid" : "Ga naar links in raster",
"Go right in grid" : "Ga naar rechts in raster",
"View" : "Bekijken",
"Toggle grid view" : "Omschakelen roosterweergave",
"Open file sidebar" : "Open bestands zijbalk",
"Show those shortcuts" : "Toon die snelkoppelingen",
"Share" : "Delen",
"Shared by link" : "Gedeeld via link",
@@ -260,7 +219,6 @@
"Search for files" : "Zoeken naar bestanden",
"Allow to restrict filenames to ensure files can be synced with all clients. By default all filenames valid on POSIX (e.g. Linux or macOS) are allowed." : "Toestaan om bestandsnamen te beperken om te borgen dat bestanden met alle cliënts gesynchroniseerd kunnen worden. Standaard zijn alle bestandsnamen valide die zijn toegestaan op POSIX (zoals Linux en macOS.)",
"After enabling the Windows compatible filenames, existing files cannot be modified anymore but can be renamed to valid new names by their owner." : "Na inschakeling van Windows-compatibele bestandsnamen, kunnen bestaande bestanden niet meer worden gewijzigd, maar kunnen ze door de eigenaar worden hernoemd naar geldige nieuwe namen.",
"Failed to toggle Windows filename support" : "Omschakelen naar Windows bestand ondersteuning mislukt",
"Files compatibility" : "Bestandscompatibiliteit",
"Enforce Windows compatibility" : "Dwing Windows-compatibiliteit af",
"This will block filenames not valid on Windows systems, like using reserved names or special characters. But this will not enforce compatibility of case sensitivity." : "Dit zal bestandsnamen blokkeren die niet toegestaan zijn op Windows-systemen, zoals gereserveerde namen of speciale tekens. Dit dwingt niet tot compatibiliteit voor hoofd- en kleine letters.",
@@ -270,8 +228,6 @@
"Create a new file with the selected template" : "Maak een nieuw bestand met het geselecteerde sjabloon",
"Creating file" : "Maken bestand",
"Save as {displayName}" : "Opslaan als {displayName}",
"Save as …" : "Bewaar als …",
"Converting files …" : "Bestanden converteren …",
"Failed to convert files: {message}" : "Conversie van bestanden mislukt: {message} ",
"All files failed to be converted" : "De conversie van alle bestanden is mislukt",
"One file could not be converted: {message}" : "Een bestand kon niet worden geconverteerd: {message}",
@@ -279,7 +235,6 @@
"_One file successfully converted_::_%n files successfully converted_" : ["Een bestand succesvol geconverteerd","%n bestanden succesvol geconverteerd"],
"Files successfully converted" : "Bestanden succesvol geconverteerd",
"Failed to convert files" : "Conversie van bestanden mislukt",
"Converting file …" : "Bestand converteren …",
"File successfully converted" : "Bestand succesvol geconverteerd",
"Failed to convert file: {message}" : "Conversie van bestand mislukt: {message} ",
"Failed to convert file" : "Conversie van bestand mislukt",
@@ -298,10 +253,6 @@
"Confirm deletion" : "Bevestig verwijderen",
"Cancel" : "Annuleren",
"Download" : "Downloaden",
"The requested file is not available." : "Het gevraagde bestand is niet beschikbaar.",
"The requested files are not available." : "De gevraagde bestanden zijn niet beschikbaar.",
"Moving \"{source}\" to \"{destination}\" …" : "Verplaatsen \"{source}\" naar \"{destination}\" …",
"Copying \"{source}\" to \"{destination}\" …" : "Kopieren \"{source}\" naar \"{destination}\" …",
"Destination is not a folder" : "Bestemming is geen map",
"This file/folder is already in that directory" : "Dit bestand/deze map staat al in die map",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Je kan een bestand/map niet verplaatsen naar zichzelf of naar een subfolder van zichzelf.",
@@ -364,7 +315,6 @@
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{newName}\" bestaat al in map \"{dir}\". Kies een andere naam.",
"Could not rename \"{oldName}\"" : "Kon \"{oldName}\" niet hernoemen",
"This operation is forbidden" : "Deze taak is verboden",
"This folder is unavailable, please try again later or contact the administration" : "Deze map is niet beschikbaar, probeer het later nog eens of neem contact op met de beheerder",
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Unexpected error: {error}" : "Onverwachte fout: {error}",
"_%n file_::_%n files_" : ["%n bestand","%n bestanden"],
@@ -441,9 +391,6 @@
"Photos and images" : "Foto's en afbeeldingen",
"New folder creation cancelled" : "Maken van nieuwe map geannuleerd",
"This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder",
"All folders" : "Alle mappen",
"Search everywhere …" : "Zoek in alles...",
"Search here …" : "Zoek hier ...",
"Preparing …" : "Voorbereiden ..."
"All folders" : "Alle mappen"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+3 -3
View File
@@ -106,8 +106,8 @@ OC.L10N.register(
"Actions" : "Dejanja",
"(selected)" : "(izbrano)",
"List of files and folders." : "Seznam datotek in map",
"You have used your space quota and cannot upload files anymore." : "Porabili ste dodeljeno količino prostora, zato datotek ni mogoče več pošiljati.",
"Column headers with buttons are sortable." : "Stolpce z gumbi je mogoče razvrščati.",
"You have used your space quota and cannot upload files anymore." : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
"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",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
@@ -356,7 +356,7 @@ OC.L10N.register(
"Navigate to the file on the left (in grid mode)" : "Pojdi na datoteko na levi (v mrežnem načinu)",
"Navigate to the file on the right (in grid mode)" : "Pojdi na datoteko na desni (v mrežnem načinu)",
"Toggle the grid view" : "Preklopi mrežni način",
"Open the sidebar for a file" : "Odpri stransko okno za datoteko",
"Open the sidebar for a file" : "Odpri stranski pano datoteke",
"Save as …" : "Shrani kot ...",
"Converting files …" : "Poteka pretvarjanje datotek ...",
"Converting file …" : "Poteka pretvarjanje datoteke ...",
+3 -3
View File
@@ -104,8 +104,8 @@
"Actions" : "Dejanja",
"(selected)" : "(izbrano)",
"List of files and folders." : "Seznam datotek in map",
"You have used your space quota and cannot upload files anymore." : "Porabili ste dodeljeno količino prostora, zato datotek ni mogoče več pošiljati.",
"Column headers with buttons are sortable." : "Stolpce z gumbi je mogoče razvrščati.",
"You have used your space quota and cannot upload files anymore." : "Porabili ste svojo količino prostora in datotek več ne morete nalagati",
"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",
"{usedQuotaByte} used" : "Zasedeno {usedQuotaByte}",
@@ -354,7 +354,7 @@
"Navigate to the file on the left (in grid mode)" : "Pojdi na datoteko na levi (v mrežnem načinu)",
"Navigate to the file on the right (in grid mode)" : "Pojdi na datoteko na desni (v mrežnem načinu)",
"Toggle the grid view" : "Preklopi mrežni način",
"Open the sidebar for a file" : "Odpri stransko okno za datoteko",
"Open the sidebar for a file" : "Odpri stranski pano datoteke",
"Save as …" : "Shrani kot ...",
"Converting files …" : "Poteka pretvarjanje datotek ...",
"Converting file …" : "Poteka pretvarjanje datoteke ...",

Some files were not shown because too many files have changed in this diff Show More