Merge branch 'master' into enh/machine-translation-provider-with-id

pull/42649/head
Marcel Klehr 5 months ago committed by GitHub
commit 477630ed78
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -31,6 +31,7 @@
namespace OCA\DAV\Connector\Sabre;
use OCA\DAV\Upload\FutureFile;
use OCA\DAV\Upload\UploadFolder;
use OCP\Files\StorageNotAvailableException;
use Sabre\DAV\Exception\InsufficientStorage;
use Sabre\DAV\Exception\ServiceUnavailable;
@ -90,6 +91,19 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
* @param bool $modified modified
*/
public function beforeCreateFile($uri, $data, INode $parent, $modified) {
$request = $this->server->httpRequest;
if ($parent instanceof UploadFolder && $request->getHeader('Destination')) {
// If chunked upload and Total-Length header is set, use that
// value for quota check. This allows us to also check quota while
// uploading chunks and not only when the file is assembled.
$length = $request->getHeader('OC-Total-Length');
$destinationPath = $this->server->calculateUri($request->getHeader('Destination'));
$quotaPath = $this->getPathForDestination($destinationPath);
if ($quotaPath && is_numeric($length)) {
return $this->checkQuota($quotaPath, (int)$length);
}
}
if (!$parent instanceof Node) {
return;
}
@ -114,29 +128,20 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
}
/**
* Check if we're moving a Futurefile in which case we need to check
* Check if we're moving a FutureFile in which case we need to check
* the quota on the target destination.
*
* @param string $source source path
* @param string $destination destination path
*/
public function beforeMove($source, $destination) {
$sourceNode = $this->server->tree->getNodeForPath($source);
public function beforeMove(string $sourcePath, string $destinationPath): bool {
$sourceNode = $this->server->tree->getNodeForPath($sourcePath);
if (!$sourceNode instanceof FutureFile) {
return;
return true;
}
// get target node for proper path conversion
if ($this->server->tree->nodeExists($destination)) {
$destinationNode = $this->server->tree->getNodeForPath($destination);
$path = $destinationNode->getPath();
} else {
$parent = dirname($destination);
if ($parent === '.') {
$parent = '';
}
$parentNode = $this->server->tree->getNodeForPath($parent);
$path = $parentNode->getPath();
try {
// The final path is not known yet, we check the quota on the parent
$path = $this->getPathForDestination($destinationPath);
} catch (\Exception $e) {
return true;
}
return $this->checkQuota($path, $sourceNode->getSize());
@ -151,26 +156,36 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
return true;
}
try {
$path = $this->getPathForDestination($destinationPath);
} catch (\Exception $e) {
return true;
}
return $this->checkQuota($path, $sourceNode->getSize());
}
private function getPathForDestination(string $destinationPath): string {
// get target node for proper path conversion
if ($this->server->tree->nodeExists($destinationPath)) {
$destinationNode = $this->server->tree->getNodeForPath($destinationPath);
if (!$destinationNode instanceof Node) {
return true;
}
$path = $destinationNode->getPath();
} else {
$parent = dirname($destinationPath);
if ($parent === '.') {
$parent = '';
}
$parentNode = $this->server->tree->getNodeForPath($parent);
if (!$parentNode instanceof Node) {
return true;
throw new \Exception('Invalid destination node');
}
$path = $parentNode->getPath();
return $destinationNode->getPath();
}
return $this->checkQuota($path, $sourceNode->getSize());
$parent = dirname($destinationPath);
if ($parent === '.') {
$parent = '';
}
$parentNode = $this->server->tree->getNodeForPath($parent);
if (!$parentNode instanceof Node) {
throw new \Exception('Invalid destination node');
}
return $parentNode->getPath();
}
@ -182,7 +197,7 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
* @throws InsufficientStorage
* @return bool
*/
public function checkQuota($path, $length = null) {
public function checkQuota(string $path, $length = null) {
if ($length === null) {
$length = $this->getLength();
}
@ -194,7 +209,7 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
}
$req = $this->server->httpRequest;
// If chunked upload
// If LEGACY chunked upload
if ($req->getHeader('OC-Chunked')) {
$info = \OC_FileChunking::decodeName($newName);
$chunkHandler = $this->getFileChunking($info);
@ -210,12 +225,14 @@ class QuotaPlugin extends \Sabre\DAV\ServerPlugin {
$freeSpace = $this->getFreeSpace($path);
if ($freeSpace >= 0 && $length > $freeSpace) {
// If LEGACY chunked upload, clean up
if (isset($chunkHandler)) {
$chunkHandler->cleanup();
}
throw new InsufficientStorage("Insufficient space in $path, $length required, $freeSpace available");
}
}
return true;
}

@ -97,7 +97,7 @@ class ViewOnlyPlugin extends ServerPlugin {
// Check if read-only and on whether permission can download is both set and disabled.
$canDownload = $attributes->getAttribute('permissions', 'download');
if ($canDownload !== null && !$canDownload) {
throw new Forbidden('Access to this resource has been denied because it is in view-only mode.');
throw new Forbidden('Access to this shared resource has been denied because its download permission is disabled.');
}
} catch (NotFound $e) {
// File not found

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"Search for an account" : "البحث عن حساب",
"Choose" : "إختَر",
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ",
"Chose destination" : "إختَر المَقصَد"
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ"
},
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "لم يمكن عرض هذه القائمة بالكامل بسبب إشكالية في الأداء. سيتم عرض الملفات عندما تمر عليها في القائمة",
"Search for an account" : "البحث عن حساب",
"Choose" : "إختَر",
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ",
"Chose destination" : "إختَر المَقصَد"
"No files or folders have been deleted yet" : "لم يتم حذف أي ملفات أو مجلدات بعدُ"
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Search for an account" : "Cerqueu un compte",
"Choose" : "Tria",
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta",
"Chose destination" : "Tria una destinació"
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta"
},
"nplurals=2; plural=(n != 1);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Aquesta llista no es mostra completament per raons de rendiment. Es mostraran els fitxers a mesura que navegueu per la llista.",
"Search for an account" : "Cerqueu un compte",
"Choose" : "Tria",
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta",
"Chose destination" : "Tria una destinació"
"No files or folders have been deleted yet" : "Encara no s'ha suprimit cap fitxer o carpeta"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Search for an account" : "Hledat účet",
"Choose" : "Vybrat",
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky",
"Chose destination" : "Zvolte cíl"
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Seznam není vykreslen celý z důvodu nároků na výkon. Soubory budou dokreslovány, jak se budete posouvat seznamem.",
"Search for an account" : "Hledat účet",
"Choose" : "Vybrat",
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky",
"Chose destination" : "Zvolte cíl"
"No files or folders have been deleted yet" : "Zatím nebyly smazány žádné soubory či složky"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
}

@ -312,7 +312,6 @@ OC.L10N.register(
"This list is not fully rendered for performances 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.",
"Search for an account" : "Søg efter en konto",
"Choose" : "Vælg",
"No files or folders have been deleted yet" : "Ingen filer eller mappe er slettet endnu",
"Chose destination" : "Vælg destionation"
"No files or folders have been deleted yet" : "Ingen filer eller mappe er slettet endnu"
},
"nplurals=2; plural=(n != 1);");

@ -310,7 +310,6 @@
"This list is not fully rendered for performances 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.",
"Search for an account" : "Søg efter en konto",
"Choose" : "Vælg",
"No files or folders have been deleted yet" : "Ingen filer eller mappe er slettet endnu",
"Chose destination" : "Vælg destionation"
"No files or folders have been deleted yet" : "Ingen filer eller mappe er slettet endnu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -320,7 +320,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Search for an account" : "Nach einem Konto suchen",
"Choose" : "Auswählen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht",
"Chose destination" : "Ziel wählen"
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},
"nplurals=2; plural=(n != 1);");

@ -318,7 +318,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste wird aus Performance-Gründen nicht vollständig angezeigt. Die Dateien werden gerendert, wenn du durch die Liste navigierst.",
"Search for an account" : "Nach einem Konto suchen",
"Choose" : "Auswählen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht",
"Chose destination" : "Ziel wählen"
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -5,7 +5,7 @@ OC.L10N.register(
"Move or copy" : "Verschieben oder kopieren",
"Download" : "Herunterladen",
"Delete" : "Löschen",
"Tags" : "Tags",
"Tags" : "Schlagworte",
"Show list view" : "Listenansicht anzeigen",
"Show grid view" : "Rasteransicht anzeigen",
"Home" : "Home",
@ -114,7 +114,7 @@ OC.L10N.register(
"Not favorited" : "Nicht favorisiert",
"Remove from favorites" : "Von Favoriten entfernen",
"Add to favorites" : "Zu den Favoriten hinzufügen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Schlagworte aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Search for an account" : "Nach einem Konto suchen",
"Choose" : "Auswählen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht",
"Chose destination" : "Ziel wählen"
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},
"nplurals=2; plural=(n != 1);");

@ -3,7 +3,7 @@
"Move or copy" : "Verschieben oder kopieren",
"Download" : "Herunterladen",
"Delete" : "Löschen",
"Tags" : "Tags",
"Tags" : "Schlagworte",
"Show list view" : "Listenansicht anzeigen",
"Show grid view" : "Rasteransicht anzeigen",
"Home" : "Home",
@ -112,7 +112,7 @@
"Not favorited" : "Nicht favorisiert",
"Remove from favorites" : "Von Favoriten entfernen",
"Add to favorites" : "Zu den Favoriten hinzufügen",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten",
"An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Schlagworte aufgetreten",
"Added to favorites" : "Zu den Favoriten hinzugefügt",
"Removed from favorites" : "Aus den Favoriten entfernt",
"You added {file} to your favorites" : "Sie haben {file} zu Ihren Favoriten hinzugefügt",
@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Diese Liste ist aus Performance-Gründen nicht vollständig gerendert. Die Dateien werden gerendert, wenn Sie durch die Liste navigieren.",
"Search for an account" : "Nach einem Konto suchen",
"Choose" : "Auswählen",
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht",
"Chose destination" : "Ziel wählen"
"No files or folders have been deleted yet" : "Es wurden noch keine Dateien oder Ordner gelöscht"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -318,7 +318,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
"Search for an account" : "Αναζήτηση για λογαριασμό",
"Choose" : "Επιλογή",
"No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα",
"Chose destination" : "Επιλέξτε προορισμό"
"No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα"
},
"nplurals=2; plural=(n != 1);");

@ -316,7 +316,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Η λίστα αυτή δεν εμφανίζεται πλήρως για λόγους απόδοσης. Τα αρχεία θα εμφανίζονται καθώς πλοηγείστε στη λίστα.",
"Search for an account" : "Αναζήτηση για λογαριασμό",
"Choose" : "Επιλογή",
"No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα",
"Chose destination" : "Επιλέξτε προορισμό"
"No files or folders have been deleted yet" : "Κανένα αρχείο ή φάκελος δεν έχει διαγραφεί ακόμα"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"Choose" : "Choose",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet",
"Chose destination" : "Choose destination"
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},
"nplurals=2; plural=(n != 1);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"Choose" : "Choose",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet",
"Chose destination" : "Choose destination"
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"Search for an account" : "Buscar una cuenta",
"Choose" : "Selecciona",
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía",
"Chose destination" : "Seleccione el destino"
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista no se renderiza completa por razones de rendimiento. Los archivos serán renderizados mientras ud. navegue por la lista.",
"Search for an account" : "Buscar una cuenta",
"Choose" : "Selecciona",
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía",
"Chose destination" : "Seleccione el destino"
"No files or folders have been deleted yet" : "No se han borrado archivos o carpetas todavía"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

@ -310,7 +310,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Search for an account" : "Bilatu kontu bat",
"Choose" : "Aukeratu",
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik",
"Chose destination" : "Aukeratu helburua"
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik"
},
"nplurals=2; plural=(n != 1);");

@ -308,7 +308,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Zerrenda hau ez da guztiz ikusten errendimendu arrazoiengatik. Fitxategiak zerrendan zehar nabigatzen duten heinean bistaratuko dira.",
"Search for an account" : "Bilatu kontu bat",
"Choose" : "Aukeratu",
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik",
"Chose destination" : "Aukeratu helburua"
"No files or folders have been deleted yet" : "Oraindik ez da ezabatu fitxategirik edo karpetarik"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -301,7 +301,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Search for an account" : "Etsi tiliä",
"Choose" : "Valitse",
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu",
"Chose destination" : "Valitse kohde"
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu"
},
"nplurals=2; plural=(n != 1);");

@ -299,7 +299,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tätä luetteloa ei ole esitetty täysin suorituskykyyn liittyvistä syistä. Tiedostot esitetään sitä mukaa, kun selaat luetteloa.",
"Search for an account" : "Etsi tiliä",
"Choose" : "Valitse",
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu",
"Chose destination" : "Valitse kohde"
"No files or folders have been deleted yet" : "Tiedostoja tai kansioita ei ole vielä poistettu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"Search for an account" : "Chercher un compte",
"Choose" : "Choisir",
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé",
"Chose destination" : "Choisir la destination"
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Cette liste n'est pas affichée en totalité pour des raisons de performances. Les fichiers seront affichés au fur et à mesure que vous parcourrez la liste.",
"Search for an account" : "Chercher un compte",
"Choose" : "Choisir",
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé",
"Chose destination" : "Choisir la destination"
"No files or folders have been deleted yet" : "Aucun fichier ou dossier n'a encore été supprimé"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

@ -320,7 +320,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse se despraza pola lista.",
"Search for an account" : "Buscar por unha conta",
"Choose" : "Escoller",
"No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol",
"Chose destination" : "Escoller o destino"
"No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol"
},
"nplurals=2; plural=(n != 1);");

@ -318,7 +318,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista non se representa de xeito completo por mor do rendemento. Os ficheiros represéntanse se despraza pola lista.",
"Search for an account" : "Buscar por unha conta",
"Choose" : "Escoller",
"No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol",
"Chose destination" : "Escoller o destino"
"No files or folders have been deleted yet" : "Aínda non se eliminou ningún ficheiro nin cartafol"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -320,7 +320,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg, ",
"Search for an account" : "Fiók keresése",
"Choose" : "Válasszon",
"No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve",
"Chose destination" : "Válasszon célt"
"No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve"
},
"nplurals=2; plural=(n != 1);");

@ -318,7 +318,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ez a lista teljesítménybeli okokból nincs teljes egészében megjelenítve. A fájlok a listában navigálás során jelennek meg, ",
"Search for an account" : "Fiók keresése",
"Choose" : "Válasszon",
"No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve",
"Chose destination" : "Válasszon célt"
"No files or folders have been deleted yet" : "Még nem lettek fájlok vagy mappák törölve"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -320,7 +320,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
"Search for an account" : "Leita að notandaaðgangi",
"Choose" : "Velja",
"No files or folders have been deleted yet" : "Engum skrám eða möppum hefur enn verið eytt",
"Chose destination" : "Veldu áfangastað"
"No files or folders have been deleted yet" : "Engum skrám eða möppum hefur enn verið eytt"
},
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");

@ -318,7 +318,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Til að halda sem bestum afköstum er þessi listi ekki myndgerður að fullu. Skrárnar munu birtast eftir því sem farið er í gegnum listann.",
"Search for an account" : "Leita að notandaaðgangi",
"Choose" : "Velja",
"No files or folders have been deleted yet" : "Engum skrám eða möppum hefur enn verið eytt",
"Chose destination" : "Veldu áfangastað"
"No files or folders have been deleted yet" : "Engum skrám eða möppum hefur enn verið eytt"
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di performances. I file verranno mostrati durante la navigazione della lista.",
"Search for an account" : "Cerca un account",
"Choose" : "Scegli",
"No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato",
"Chose destination" : "Scegli destinazione"
"No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Questa lista non è stata mostrata completamente per ragioni di performances. I file verranno mostrati durante la navigazione della lista.",
"Search for an account" : "Cerca un account",
"Choose" : "Scegli",
"No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato",
"Chose destination" : "Scegli destinazione"
"No files or folders have been deleted yet" : "Nessun file o cartella è stato ancora eliminato"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
"Search for an account" : "アカウントを検索",
"Choose" : "選択",
"No files or folders have been deleted yet" : "まだ削除されたファイルやフォルダはありません",
"Chose destination" : "目的地を選ぶ"
"No files or folders have been deleted yet" : "まだ削除されたファイルやフォルダはありません"
},
"nplurals=1; plural=0;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "このリストはパフォーマンスの都合上、すべてレンダリングされているわけではありません。リスト内を移動すると、ファイルが次々と表示されていきます。",
"Search for an account" : "アカウントを検索",
"Choose" : "選択",
"No files or folders have been deleted yet" : "まだ削除されたファイルやフォルダはありません",
"Chose destination" : "目的地を選ぶ"
"No files or folders have been deleted yet" : "まだ削除されたファイルやフォルダはありません"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"Choose" : "Choose",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet",
"Chose destination" : "Chose destination"
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},
"nplurals=2; plural=(n!=1);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list.",
"Search for an account" : "Search for an account",
"Choose" : "Choose",
"No files or folders have been deleted yet" : "No files or folders have been deleted yet",
"Chose destination" : "Chose destination"
"No files or folders have been deleted yet" : "No files or folders have been deleted yet"
},"pluralForm" :"nplurals=2; plural=(n!=1);"
}

@ -22,6 +22,7 @@ OC.L10N.register(
"An unknown error has occurred" : "알 수 없는 에러 발생",
"File could not be uploaded" : "파일을 업로드할 수 없음",
"Uploading …" : "업로드 중…",
"{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
"Uploading … ({currentNumber}/{total})" : "업로드 중… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
"Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다.",
@ -168,9 +169,11 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "{user}(으)로부터 {path}의 소유권을 받았습니다.",
"in %s" : "%s",
"File Management" : "파일 관리",
"Current directory path" : "현재 디렉토리 경로",
"Reload current directory" : "이 경로를 새로고침",
"Go to the \"{dir}\" directory" : "\"{dir}\" 경로로 이동",
"Drag and drop files here to upload" : "이곳에 파일을 드래그 앤 드롭해 업로드",
"Your have used your space quota and cannot upload files anymore" : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다",
"You dont have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다",
"Upload successful" : "업로드 성공",
"\"{displayName}\" action executed successfully" : "\"{displayName}\" 작업을 성공적으로 실행함",
@ -199,6 +202,7 @@ OC.L10N.register(
"\"{displayName}\" batch action executed successfully" : "\"{displayName}\" 일괄 작업을 성공적으로 실행함",
"{summaryFile} and {summaryFolder}" : "{summaryFile}(과)와 {summaryFolder}",
"List of files and folders." : "파일과 폴더의 목록",
"Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
"File not found" : "파일을 찾을 수 없음",
"_{count} file_::_{count} files_" : ["{count}개 파일"],
@ -245,6 +249,7 @@ OC.L10N.register(
"Enable the grid view" : "바둑판식 보기 활성화",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "클립보드로 복사",
"Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
@ -276,6 +281,7 @@ OC.L10N.register(
"Templates" : "템플릿",
"Unable to initialize the templates directory" : "템플릿 디렉터리를 설정할 수 없음",
"Created new folder \"{name}\"" : "\"{name}\" 폴더를 새로 만듦",
"One of the dropped files could not be processed" : "드롭한 파일 중 하나를 처리할 수 없습니다",
"Uploading \"{filename}\" failed" : "\"{filename}\" 업로드가 실패함",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
@ -316,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "이 목록은 성능 상의 이유로 완전히 표시되지 않았습니다. 목록을 탐색하면 파일이 표시됩니다.",
"Search for an account" : "계정 검색",
"Choose" : "선택",
"No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다.",
"Chose destination" : "대상 선택"
"No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다."
},
"nplurals=1; plural=0;");

@ -20,6 +20,7 @@
"An unknown error has occurred" : "알 수 없는 에러 발생",
"File could not be uploaded" : "파일을 업로드할 수 없음",
"Uploading …" : "업로드 중…",
"{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
"Uploading … ({currentNumber}/{total})" : "업로드 중… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize}/{totalSize}({bitrate})",
"Uploading that item is not supported" : "이 항목의 업로드를 지원하지 않습니다.",
@ -166,9 +167,11 @@
"The ownership transfer of {path} from {user} has completed." : "{user}(으)로부터 {path}의 소유권을 받았습니다.",
"in %s" : "%s",
"File Management" : "파일 관리",
"Current directory path" : "현재 디렉토리 경로",
"Reload current directory" : "이 경로를 새로고침",
"Go to the \"{dir}\" directory" : "\"{dir}\" 경로로 이동",
"Drag and drop files here to upload" : "이곳에 파일을 드래그 앤 드롭해 업로드",
"Your have used your space quota and cannot upload files anymore" : "저장소 할당량을 모두 사용하여 더 이상 파일을 업로드할 수 없습니다",
"You dont have permission to upload or create files here" : "여기에 파일을 업로드하거나 만들 권한이 없습니다",
"Upload successful" : "업로드 성공",
"\"{displayName}\" action executed successfully" : "\"{displayName}\" 작업을 성공적으로 실행함",
@ -197,6 +200,7 @@
"\"{displayName}\" batch action executed successfully" : "\"{displayName}\" 일괄 작업을 성공적으로 실행함",
"{summaryFile} and {summaryFolder}" : "{summaryFile}(과)와 {summaryFolder}",
"List of files and folders." : "파일과 폴더의 목록",
"Column headers with buttons are sortable." : "버튼이 있는 열 머리글은 정렬할 수 있습니다.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "성능 상의 이유로 목록을 전부 표시하지 않았습니다. 목록을 탐색하면 파일들이 표시됩니다.",
"File not found" : "파일을 찾을 수 없음",
"_{count} file_::_{count} files_" : ["{count}개 파일"],
@ -243,6 +247,7 @@
"Enable the grid view" : "바둑판식 보기 활성화",
"Additional settings" : "고급 설정",
"WebDAV" : "WebDAV",
"WebDAV URL" : "WebDAV URL",
"Copy to clipboard" : "클립보드로 복사",
"Use this address to access your Files via WebDAV" : "이 주소를 사용하여 WebDAV를 통해 내 파일에 접근하세요.",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "2단계 인증을 활성화했다면, 이곳을 클릭해 새로운 앱 암호를 만들어 사용해야 합니다.",
@ -274,6 +279,7 @@
"Templates" : "템플릿",
"Unable to initialize the templates directory" : "템플릿 디렉터리를 설정할 수 없음",
"Created new folder \"{name}\"" : "\"{name}\" 폴더를 새로 만듦",
"One of the dropped files could not be processed" : "드롭한 파일 중 하나를 처리할 수 없습니다",
"Uploading \"{filename}\" failed" : "\"{filename}\" 업로드가 실패함",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount}개 폴더"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount}개 파일"],
@ -314,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "이 목록은 성능 상의 이유로 완전히 표시되지 않았습니다. 목록을 탐색하면 파일이 표시됩니다.",
"Search for an account" : "계정 검색",
"Choose" : "선택",
"No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다.",
"Chose destination" : "대상 선택"
"No files or folders have been deleted yet" : "아직 삭제된 파일이나 폴더가 없습니다."
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
"Search for an account" : "Пребарај сметка",
"Choose" : "Избери",
"No files or folders have been deleted yet" : "Нема датотеки или папки што се избришани",
"Chose destination" : "Избери дестинација"
"No files or folders have been deleted yet" : "Нема датотеки или папки што се избришани"
},
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Оваа листа не е целосно прикажана поради заштеда на перформанси. Датотеките ќе се прикажуваат додека се движите низ листата.",
"Search for an account" : "Пребарај сметка",
"Choose" : "Избери",
"No files or folders have been deleted yet" : "Нема датотеки или папки што се избришани",
"Chose destination" : "Избери дестинација"
"No files or folders have been deleted yet" : "Нема датотеки или папки што се избришани"
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
}

@ -312,7 +312,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
"Search for an account" : "Wyszukaj konto",
"Choose" : "Wybierz",
"No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte",
"Chose destination" : "Wybierz miejsce docelowe"
"No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte"
},
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");

@ -310,7 +310,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ta lista nie jest w pełni renderowana ze względu na wydajność. Pliki będą renderowane podczas poruszania się po liście.",
"Search for an account" : "Wyszukaj konto",
"Choose" : "Wybierz",
"No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte",
"Chose destination" : "Wybierz miejsce docelowe"
"No files or folders have been deleted yet" : "Żadne pliki ani katalogi nie zostały jeszcze usunięte"
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
}

@ -169,6 +169,7 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "A transferência da propriedade de {path} de {user} foi concluída.",
"in %s" : "em %s",
"File Management" : "Gerenciamento de Arquivos",
"Current directory path" : "Caminho do diretório atual",
"Reload current directory" : "Recarregar diretório atual",
"Go to the \"{dir}\" directory" : "Vá para o diretório \"{dir}\"",
"Drag and drop files here to upload" : "Arraste e solte os arquivos aqui para fazer upload",
@ -321,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados conforme você navega pela lista.",
"Search for an account" : "Pesquisar uma conta",
"Choose" : "Escolher",
"No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda",
"Chose destination" : "Escolha o destino"
"No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");

@ -167,6 +167,7 @@
"The ownership transfer of {path} from {user} has completed." : "A transferência da propriedade de {path} de {user} foi concluída.",
"in %s" : "em %s",
"File Management" : "Gerenciamento de Arquivos",
"Current directory path" : "Caminho do diretório atual",
"Reload current directory" : "Recarregar diretório atual",
"Go to the \"{dir}\" directory" : "Vá para o diretório \"{dir}\"",
"Drag and drop files here to upload" : "Arraste e solte os arquivos aqui para fazer upload",
@ -319,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta lista não é totalmente renderizada por motivos de desempenho. Os arquivos serão renderizados conforme você navega pela lista.",
"Search for an account" : "Pesquisar uma conta",
"Choose" : "Escolher",
"No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda",
"Chose destination" : "Escolha o destino"
"No files or folders have been deleted yet" : "Nenhum arquivo ou pasta foi excluído ainda"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
}

@ -310,7 +310,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați în listă.",
"Search for an account" : "Căutați un cont",
"Choose" : "Alege",
"No files or folders have been deleted yet" : "Niciun fișier sau folder nu a fost șters încă",
"Chose destination" : "Selectați destinația"
"No files or folders have been deleted yet" : "Niciun fișier sau folder nu a fost șters încă"
},
"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));");

@ -308,7 +308,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Această lista este incomplet afișată din motive de performanță. Fișierele vor fi afișate pe măsură ce navigați în listă.",
"Search for an account" : "Căutați un cont",
"Choose" : "Alege",
"No files or folders have been deleted yet" : "Niciun fișier sau folder nu a fost șters încă",
"Chose destination" : "Selectați destinația"
"No files or folders have been deleted yet" : "Niciun fișier sau folder nu a fost șters încă"
},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
"Search for an account" : "Поиск по учетной записи",
"Choose" : "Выберите",
"No files or folders have been deleted yet" : "Файлы или папки еще не удалены",
"Chose destination" : "Выбор места назначения"
"No files or folders have been deleted yet" : "Файлы или папки еще не удалены"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Этот список отображается не полностью из соображений производительности. Файлы будут отображаться по мере перемещения по списку.",
"Search for an account" : "Поиск по учетной записи",
"Choose" : "Выберите",
"No files or folders have been deleted yet" : "Файлы или папки еще не удалены",
"Chose destination" : "Выбор места назначения"
"No files or folders have been deleted yet" : "Файлы или папки еще не удалены"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
}

@ -317,7 +317,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzat zoznamom.",
"Search for an account" : "Vyhľadať účet",
"Choose" : "Vybrať",
"No files or folders have been deleted yet" : "Žiadne súbory alebo priečinky neboli ešte vymazané",
"Chose destination" : "Vyberte cieľ"
"No files or folders have been deleted yet" : "Žiadne súbory alebo priečinky neboli ešte vymazané"
},
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");

@ -315,7 +315,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Tento zoznam nie je úplne vykreslený z dôvodov výkonu. Súbory budú vykreslené, keď budete prechádzat zoznamom.",
"Search for an account" : "Vyhľadať účet",
"Choose" : "Vybrať",
"No files or folders have been deleted yet" : "Žiadne súbory alebo priečinky neboli ešte vymazané",
"Chose destination" : "Vyberte cieľ"
"No files or folders have been deleted yet" : "Žiadne súbory alebo priečinky neboli ešte vymazané"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
}

@ -312,7 +312,6 @@ OC.L10N.register(
"This list is not fully rendered for performances 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 ob brskanju.",
"Search for an account" : "Poišči račun",
"Choose" : "Izbor",
"No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map",
"Chose destination" : "Izbor ciljnega mesta"
"No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map"
},
"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);");

@ -310,7 +310,6 @@
"This list is not fully rendered for performances 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 ob brskanju.",
"Search for an account" : "Poišči račun",
"Choose" : "Izbor",
"No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map",
"Chose destination" : "Izbor ciljnega mesta"
"No files or folders have been deleted yet" : "Ni še izbrisanih datotek in map"
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"
}

@ -321,7 +321,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
"Search for an account" : "Претражите налог",
"Choose" : "Изаберите",
"No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер",
"Chose destination" : "Изаберите одредиште"
"No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");

@ -319,7 +319,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Ова листа није у потпуности приказана из разлога перформанси. Фајлови ће се приказивати како се крећете кроз листу.",
"Search for an account" : "Претражите налог",
"Choose" : "Изаберите",
"No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер",
"Chose destination" : "Изаберите одредиште"
"No files or folders have been deleted yet" : "Још увек није обрисан ниједан фајл или фолдер"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
"Search for an account" : "Sök efter ett konto",
"Choose" : "Välj",
"No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än",
"Chose destination" : "Välj destination"
"No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än"
},
"nplurals=2; plural=(n != 1);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Denna lista är inte helt återgiven av prestandaskäl. Filerna kommer att renderas när du navigerar genom listan.",
"Search for an account" : "Sök efter ett konto",
"Choose" : "Välj",
"No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än",
"Chose destination" : "Välj destination"
"No files or folders have been deleted yet" : "Inga filer eller mappar har tagits bort än"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"Search for an account" : "Hesap ara",
"Choose" : "Seçin",
"No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok",
"Chose destination" : "Hedefi seçin"
"No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok"
},
"nplurals=2; plural=(n > 1);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Başarımı olumsuz etkilememek için listenin tümü görüntülenmiyor. Listede ilerledikçe dosyalar görüntülenecek.",
"Search for an account" : "Hesap ara",
"Choose" : "Seçin",
"No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok",
"Chose destination" : "Hedefi seçin"
"No files or folders have been deleted yet" : "Henüz silinmiş bir dosya ya da klasör yok"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Через обмеження, пов'язані з потужністю, список не показується повністю. Файли показуватимуться, щойно ви рухатиметеся списком.",
"Search for an account" : "Пошук облікового запису",
"Choose" : "Вибрати",
"No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено",
"Chose destination" : "Виберіть місце призначення"
"No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Через обмеження, пов'язані з потужністю, список не показується повністю. Файли показуватимуться, щойно ви рухатиметеся списком.",
"Search for an account" : "Пошук облікового запису",
"Choose" : "Вибрати",
"No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено",
"Chose destination" : "Виберіть місце призначення"
"No files or folders have been deleted yet" : "Поки жодного каталогу чи файлу не було вилучено"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
}

@ -312,7 +312,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "anh sách này không được hiển thị đầy đủ vì lý do hiệu suất. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
"Search for an account" : "Tìm kiếm tài khoản",
"Choose" : "Chọn",
"No files or folders have been deleted yet" : "Chưa có tập tin hoặc thư mục nào bị xóa",
"Chose destination" : "Chọn điểm đến"
"No files or folders have been deleted yet" : "Chưa có tập tin hoặc thư mục nào bị xóa"
},
"nplurals=1; plural=0;");

@ -310,7 +310,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "anh sách này không được hiển thị đầy đủ vì lý do hiệu suất. Các tập tin sẽ được hiển thị khi bạn điều hướng qua danh sách.",
"Search for an account" : "Tìm kiếm tài khoản",
"Choose" : "Chọn",
"No files or folders have been deleted yet" : "Chưa có tập tin hoặc thư mục nào bị xóa",
"Chose destination" : "Chọn điểm đến"
"No files or folders have been deleted yet" : "Chưa có tập tin hoặc thư mục nào bị xóa"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -315,7 +315,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "因为性能原因,该列表没有完全加载。这些文件将会在您浏览列表的时候加载。",
"Search for an account" : "搜索一个账户",
"Choose" : "选择",
"No files or folders have been deleted yet" : "尚未删除任何文件或文件夹",
"Chose destination" : "选择目的地"
"No files or folders have been deleted yet" : "尚未删除任何文件或文件夹"
},
"nplurals=1; plural=0;");

@ -313,7 +313,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "因为性能原因,该列表没有完全加载。这些文件将会在您浏览列表的时候加载。",
"Search for an account" : "搜索一个账户",
"Choose" : "选择",
"No files or folders have been deleted yet" : "尚未删除任何文件或文件夹",
"Chose destination" : "选择目的地"
"No files or folders have been deleted yet" : "尚未删除任何文件或文件夹"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"Search for an account" : "搜尋賬號",
"Choose" : "選擇",
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾",
"Chose destination" : "選擇目標地"
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾"
},
"nplurals=1; plural=0;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於性能考慮,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"Search for an account" : "搜尋賬號",
"Choose" : "選擇",
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾",
"Chose destination" : "選擇目標地"
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -322,7 +322,6 @@ OC.L10N.register(
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"Search for an account" : "搜尋帳號",
"Choose" : "選擇",
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾",
"Chose destination" : "選擇目的地"
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾"
},
"nplurals=1; plural=0;");

@ -320,7 +320,6 @@
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "出於效能考量,此清單未完全呈現。檔案將在您瀏覽清單時呈現。",
"Search for an account" : "搜尋帳號",
"Choose" : "選擇",
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾",
"Chose destination" : "選擇目的地"
"No files or folders have been deleted yet" : "尚未刪除任何檔案或資料夾"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -22,6 +22,7 @@
import { action } from './deleteAction'
import { expect } from '@jest/globals'
import { File, Folder, Permission, View, FileAction } from '@nextcloud/files'
import * as auth from '@nextcloud/auth'
import * as eventBus from '@nextcloud/event-bus'
import axios from '@nextcloud/axios'
import logger from '../logger'
@ -37,17 +38,46 @@ const trashbinView = {
} as View
describe('Delete action conditions tests', () => {
afterEach(() => {
jest.restoreAllMocks()
})
const file = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.ALL,
})
const file2 = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
owner: 'admin',
mime: 'text/plain',
permissions: Permission.ALL,
})
test('Default values', () => {
expect(action).toBeInstanceOf(FileAction)
expect(action.id).toBe('delete')
expect(action.displayName([], view)).toBe('Delete')
expect(action.displayName([file], view)).toBe('Delete')
expect(action.iconSvgInline([], view)).toBe('<svg>SvgMock</svg>')
expect(action.default).toBeUndefined()
expect(action.order).toBe(100)
})
test('Default trashbin view values', () => {
expect(action.displayName([], trashbinView)).toBe('Delete permanently')
expect(action.displayName([file], trashbinView)).toBe('Delete permanently')
})
test('Shared node values', () => {
jest.spyOn(auth, 'getCurrentUser').mockReturnValue(null)
expect(action.displayName([file2], view)).toBe('Unshare')
})
test('Shared and owned nodes values', () => {
expect(action.displayName([file, file2], view)).toBe('Delete and unshare')
})
})
@ -55,8 +85,8 @@ describe('Delete action enabled tests', () => {
test('Enabled with DELETE permissions', () => {
const file = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.ALL,
})
@ -68,8 +98,8 @@ describe('Delete action enabled tests', () => {
test('Disabled without DELETE permissions', () => {
const file = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.READ,
})
@ -86,14 +116,14 @@ describe('Delete action enabled tests', () => {
test('Disabled if not all nodes can be deleted', () => {
const folder1 = new Folder({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/Foo/',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/Foo/',
owner: 'test',
permissions: Permission.DELETE,
})
const folder2 = new Folder({
id: 2,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/Bar/',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/Bar/',
owner: 'test',
permissions: Permission.READ,
})
@ -111,8 +141,8 @@ describe('Delete action execute tests', () => {
const file = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
})
@ -121,7 +151,7 @@ describe('Delete action execute tests', () => {
expect(exec).toBe(true)
expect(axios.delete).toBeCalledTimes(1)
expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt')
expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/test/foobar.txt')
expect(eventBus.emit).toBeCalledTimes(1)
expect(eventBus.emit).toBeCalledWith('files:node:deleted', file)
@ -133,16 +163,16 @@ describe('Delete action execute tests', () => {
const file1 = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
})
const file2 = new File({
id: 2,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
})
@ -151,8 +181,8 @@ describe('Delete action execute tests', () => {
expect(exec).toStrictEqual([true, true])
expect(axios.delete).toBeCalledTimes(2)
expect(axios.delete).toHaveBeenNthCalledWith(1, 'https://cloud.domain.com/remote.php/dav/files/admin/foo.txt')
expect(axios.delete).toHaveBeenNthCalledWith(2, 'https://cloud.domain.com/remote.php/dav/files/admin/bar.txt')
expect(axios.delete).toHaveBeenNthCalledWith(1, 'https://cloud.domain.com/remote.php/dav/files/test/foo.txt')
expect(axios.delete).toHaveBeenNthCalledWith(2, 'https://cloud.domain.com/remote.php/dav/files/test/bar.txt')
expect(eventBus.emit).toBeCalledTimes(2)
expect(eventBus.emit).toHaveBeenNthCalledWith(1, 'files:node:deleted', file1)
@ -165,8 +195,8 @@ describe('Delete action execute tests', () => {
const file = new File({
id: 1,
source: 'https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt',
owner: 'admin',
source: 'https://cloud.domain.com/remote.php/dav/files/test/foobar.txt',
owner: 'test',
mime: 'text/plain',
permissions: Permission.READ | Permission.UPDATE | Permission.DELETE,
})
@ -175,7 +205,7 @@ describe('Delete action execute tests', () => {
expect(exec).toBe(false)
expect(axios.delete).toBeCalledTimes(1)
expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/admin/foobar.txt')
expect(axios.delete).toBeCalledWith('https://cloud.domain.com/remote.php/dav/files/test/foobar.txt')
expect(eventBus.emit).toBeCalledTimes(0)
expect(logger.error).toBeCalledTimes(1)

@ -24,17 +24,42 @@ import { Permission, Node, View, FileAction } from '@nextcloud/files'
import { translate as t } from '@nextcloud/l10n'
import axios from '@nextcloud/axios'
import TrashCanSvg from '@mdi/svg/svg/trash-can.svg?raw'
import CloseSvg from '@mdi/svg/svg/close.svg?raw'
import logger from '../logger.js'
import { getCurrentUser } from '@nextcloud/auth'
const isAllUnshare = (nodes: Node[]) => {
return !nodes.some(node => node.owner === getCurrentUser()?.uid)
}
const isMixedUnshareAndDelete = (nodes: Node[]) => {
const hasUnshareItems = nodes.some(node => node.owner !== getCurrentUser()?.uid)
const hasDeleteItems = nodes.some(node => node.owner === getCurrentUser()?.uid)
return hasUnshareItems && hasDeleteItems
}
export const action = new FileAction({
id: 'delete',
displayName(nodes: Node[], view: View) {
if (isMixedUnshareAndDelete(nodes)) {
return t('files', 'Delete and unshare')
}
if (isAllUnshare(nodes)) {
return t('files', 'Unshare')
}
return view.id === 'trashbin'
? t('files', 'Delete permanently')
: t('files', 'Delete')
},
iconSvgInline: () => TrashCanSvg,
iconSvgInline: (nodes: Node[]) => {
if (isAllUnshare(nodes)) {
return CloseSvg
}
return TrashCanSvg
},
enabled(nodes: Node[]) {
return nodes.length > 0 && nodes

@ -26,53 +26,47 @@
<NcCheckboxRadioSwitch v-bind="selectAllBind" @update:checked="onToggleAll" />
</th>
<!-- Actions multiple if some are selected -->
<FilesListTableHeaderActions v-if="!isNoneSelected"
:current-view="currentView"
:selected-nodes="selectedNodes" />
<!-- Columns display -->
<template v-else>
<!-- Link to file -->
<th class="files-list__column files-list__row-name files-list__column--sortable"
:aria-sort="ariaSortForMode('basename')">
<!-- Icon or preview -->
<span class="files-list__row-icon" />
<!-- Name -->
<FilesListTableHeaderButton :name="t('files', 'Name')" mode="basename" />
</th>
<!-- Actions -->
<th class="files-list__row-actions" />
<!-- Size -->
<th v-if="isSizeAvailable"
:class="{'files-list__column--sortable': isSizeAvailable}"
class="files-list__column files-list__row-size"
:aria-sort="ariaSortForMode('size')">
<FilesListTableHeaderButton :name="t('files', 'Size')" mode="size" />
</th>
<!-- Mtime -->
<th v-if="isMtimeAvailable"
:class="{'files-list__column--sortable': isMtimeAvailable}"
class="files-list__column files-list__row-mtime"
:aria-sort="ariaSortForMode('mtime')">
<FilesListTableHeaderButton :name="t('files', 'Modified')" mode="mtime" />
</th>
<!-- Custom views columns -->
<th v-for="column in columns"
:key="column.id"
:class="classForColumn(column)"
:aria-sort="ariaSortForMode(column.id)">
<FilesListTableHeaderButton v-if="!!column.sort" :name="column.title" :mode="column.id" />
<span v-else>
{{ column.title }}
</span>
</th>
</template>
<!-- Link to file -->
<th class="files-list__column files-list__row-name files-list__column--sortable"
:aria-sort="ariaSortForMode('basename')">
<!-- Icon or preview -->
<span class="files-list__row-icon" />
<!-- Name -->
<FilesListTableHeaderButton :name="t('files', 'Name')" mode="basename" />
</th>
<!-- Actions -->
<th class="files-list__row-actions" />
<!-- Size -->
<th v-if="isSizeAvailable"
class="files-list__column files-list__row-size"
:class="{ 'files-list__column--sortable': isSizeAvailable }"
:aria-sort="ariaSortForMode('size')">
<FilesListTableHeaderButton :name="t('files', 'Size')" mode="size" />
</th>
<!-- Mtime -->
<th v-if="isMtimeAvailable"
class="files-list__column files-list__row-mtime"
:class="{ 'files-list__column--sortable': isMtimeAvailable }"
:aria-sort="ariaSortForMode('mtime')">
<FilesListTableHeaderButton :name="t('files', 'Modified')" mode="mtime" />
</th>
<!-- Custom views columns -->
<th v-for="column in columns"
:key="column.id"
:class="classForColumn(column)"
:aria-sort="ariaSortForMode(column.id)">
<FilesListTableHeaderButton v-if="!!column.sort" :name="column.title" :mode="column.id" />
<span v-else>
{{ column.title }}
</span>
</th>
</tr>
</template>

@ -20,7 +20,7 @@
-
-->
<template>
<th class="files-list__column files-list__row-actions-batch" colspan="2">
<div class="files-list__column files-list__row-actions-batch">
<NcActions ref="actionsMenu"
:disabled="!!loading || areSomeNodesLoading"
:force-name="true"
@ -38,7 +38,7 @@
{{ action.displayName(nodes, currentView) }}
</NcActionButton>
</NcActions>
</th>
</div>
</template>
<script lang="ts">
@ -218,15 +218,6 @@ export default Vue.extend({
<style scoped lang="scss">
.files-list__row-actions-batch {
flex: 1 1 100% !important;
// Remove when https://github.com/nextcloud/nextcloud-vue/pull/3936 is merged
::v-deep .button-vue__wrapper {
width: 100%;
span.button-vue__text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
max-width: 100%;
}
</style>

@ -33,6 +33,11 @@
}"
:scroll-to-index="scrollToIndex"
:caption="caption">
<template v-if="!isNoneSelected" #header-overlay>
<FilesListTableHeaderActions :current-view="currentView"
:selected-nodes="selectedNodes" />
</template>
<template #before>
<!-- Headers -->
<FilesListHeader v-for="header in sortedHeaders"
@ -76,6 +81,7 @@ import { defineComponent } from 'vue'
import { action as sidebarAction } from '../actions/sidebarAction.ts'
import { useUserConfigStore } from '../store/userconfig.ts'
import { useSelectionStore } from '../store/selection.js'
import FileEntry from './FileEntry.vue'
import FileEntryGrid from './FileEntryGrid.vue'
@ -85,6 +91,7 @@ import FilesListTableHeader from './FilesListTableHeader.vue'
import filesListWidthMixin from '../mixins/filesListWidth.ts'
import VirtualList from './VirtualList.vue'
import logger from '../logger.js'
import FilesListTableHeaderActions from './FilesListTableHeaderActions.vue'
export default defineComponent({
name: 'FilesListVirtual',
@ -94,6 +101,7 @@ export default defineComponent({
FilesListTableFooter,
FilesListTableHeader,
VirtualList,
FilesListTableHeaderActions,
},
mixins: [
@ -117,8 +125,10 @@ export default defineComponent({
setup() {
const userConfigStore = useUserConfigStore()
const selectionStore = useSelectionStore()
return {
userConfigStore,
selectionStore,
}
},
@ -185,6 +195,14 @@ export default defineComponent({
const virtualListNote = t('files', 'This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list.')
return `${viewCaption}\n${sortableCaption}\n${virtualListNote}`
},
selectedNodes() {
return this.selectionStore.selected
},
isNoneSelected() {
return this.selectedNodes.length === 0
},
},
watch: {
@ -298,6 +316,7 @@ export default defineComponent({
--clickable-area: 44px;
--icon-preview-size: 32px;
position: relative;
overflow: auto;
height: 100%;
will-change: scroll-position;
@ -333,6 +352,22 @@ export default defineComponent({
display: block;
}
.files-list__thead-overlay {
position: absolute;
top: 0;
left: var(--row-height); // Save space for a row checkbox
right: 0;
z-index: 1000;
display: flex;
align-items: center;
// Reuse row styles
background-color: var(--color-main-background);
border-bottom: 1px solid var(--color-border);
height: var(--row-height);
}
.files-list__thead,
.files-list__tfoot {
display: flex;

@ -50,10 +50,11 @@
@search="findUserDebounced" />
</p>
<p>
<input type="submit"
class="primary"
:value="submitButtonText"
<NcButton native-type="submit"
type="primary"
:disabled="!canSubmit">
{{ submitButtonText }}
</NcButton>
<span class="error">{{ submitError }}</span>
</p>
</form>

@ -1,5 +1,9 @@
<template>
<div class="files-list" data-cy-files-list>
<div v-if="!!$scopedSlots['header-overlay']" class="files-list__thead-overlay">
<slot name="header-overlay" />
</div>
<!-- Header -->
<div ref="before" class="files-list__before">
<slot name="before" />

@ -42,7 +42,7 @@ interface ResponseProps extends DAVResultResponseProps {
export const resultToNode = function(node: FileStat): File | Folder {
const props = node.props as ResponseProps
const permissions = davParsePermissions(props?.permissions)
const owner = getCurrentUser()?.uid as string
const owner = (props['owner-id'] || getCurrentUser()?.uid) as string
const source = generateRemoteUrl('dav' + rootPath + node.filename)
const id = props?.fileid < 0

@ -62,6 +62,11 @@ export const action = new FileAction({
const ownerId = node?.attributes?.['owner-id']
const ownerDisplayName = node?.attributes?.['owner-display-name']
// Mixed share types
if (Array.isArray(node.attributes?.['share-types'])) {
return t('files_sharing', 'Shared multiple times with different people')
}
if (ownerId && ownerId !== getCurrentUser()?.uid) {
return t('files_sharing', 'Shared by {ownerDisplayName}', { ownerDisplayName })
}
@ -73,6 +78,11 @@ export const action = new FileAction({
const node = nodes[0]
const shareTypes = Object.values(node?.attributes?.['share-types'] || {}).flat() as number[]
// Mixed share types
if (Array.isArray(node.attributes?.['share-types'])) {
return AccountPlusSvg
}
// Link shares
if (shareTypes.includes(Type.SHARE_TYPE_LINK)
|| shareTypes.includes(Type.SHARE_TYPE_EMAIL)) {
@ -105,6 +115,15 @@ export const action = new FileAction({
const node = nodes[0]
const ownerId = node?.attributes?.['owner-id']
const isMixed = Array.isArray(node.attributes?.['share-types'])
// If the node is shared multiple times with
// different share types to the current user
if (isMixed) {
return true
}
// If the node is shared by someone else
if (ownerId && ownerId !== getCurrentUser()?.uid) {
return true
}

@ -76,6 +76,10 @@ const ocsEntryToNode = function(ocsEntry: any): Folder | File | null {
attributes: {
...ocsEntry,
'has-preview': hasPreview,
// Also check the sharingStatusAction.ts code
'owner-id': ocsEntry?.uid_owner,
'owner-display-name': ocsEntry?.displayname_owner,
'share-types': ocsEntry?.share_type,
favorite: ocsEntry?.tags?.includes(window.OC.TAG_FAVORITE) ? 1 : 0,
},
})
@ -144,6 +148,17 @@ const getDeletedShares = function(): AxiosPromise<OCSResponse<any>> {
})
}
/**
* Group an array of objects (here Nodes) by a key
* and return an array of arrays of them.
*/
const groupBy = function(nodes: (Folder | File)[], key: string) {
return Object.values(nodes.reduce(function(acc, curr) {
(acc[curr[key]] = acc[curr[key]] || []).push(curr)
return acc
}, {})) as (Folder | File)[][]
}
export const getContents = async (sharedWithYou = true, sharedWithOthers = true, pendingShares = false, deletedshares = false, filterTypes: number[] = []): Promise<ContentsWithRoot> => {
const promises = [] as AxiosPromise<OCSResponse<any>>[]
@ -162,12 +177,21 @@ export const getContents = async (sharedWithYou = true, sharedWithOthers = true,
const responses = await Promise.all(promises)
const data = responses.map((response) => response.data.ocs.data).flat()
let contents = data.map(ocsEntryToNode).filter((node) => node !== null) as (Folder | File)[]
let contents = data.map(ocsEntryToNode)
.filter((node) => node !== null) as (Folder | File)[]
if (filterTypes.length > 0) {
contents = contents.filter((node) => filterTypes.includes(node.attributes?.share_type))
}
// Merge duplicate shares and group their attributes
// Also check the sharingStatusAction.ts code
contents = groupBy(contents, 'source').map((nodes) => {
const node = nodes[0]
node.attributes['share-types'] = nodes.map(node => node.attributes['share-types'])
return node
})
return {
folder: new Folder({
id: 0,

@ -30,10 +30,10 @@ use OCA\Files_Trashbin\Trashbin;
class TrashFile extends AbstractTrashFile {
public function get() {
return $this->data->getStorage()->fopen(Trashbin::getTrashFilename($this->data->getInternalPath(), $this->getLastModified()), 'rb');
return $this->data->getStorage()->fopen(Trashbin::getTrashFilename($this->data->getInternalPath(), $this->getDeletionTime()), 'rb');
}
public function getName(): string {
return Trashbin::getTrashFilename($this->data->getName(), $this->getLastModified());
return Trashbin::getTrashFilename($this->data->getName(), $this->getDeletionTime());
}
}

@ -30,6 +30,6 @@ use OCA\Files_Trashbin\Trashbin;
class TrashFolder extends AbstractTrashFolder {
public function getName(): string {
return Trashbin::getTrashFilename($this->data->getName(), $this->getLastModified());
return Trashbin::getTrashFilename($this->data->getName(), $this->getDeletionTime());
}
}

@ -3,11 +3,24 @@ OC.L10N.register(
{
"Versions" : "버전",
"This application automatically maintains older versions of files that are changed." : "이 앱은 변경된 파일의 이전 버전을 관리합니다.",
"Version" : "버전",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every users directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesnt run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the users currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "이 앱은 변경된 파일의 이전 버전을 관리합니다. 이 앱을 활성화하면 개별 사용자 디렉터리 아래에 숨김 버전 폴더를 생성하며 이전 버전의 파일을 저장합니다. 웹 인터페이스를 사용하여 파일의 이전 버전으로 복원할 수 있으며, 대체된 파일은 새로운 버전으로 간주됩니다. 앱에서 버전 폴더의 크기를 자동으로 관리하여 이전 버전 때문에 할당량을 초과하는 일을 방지합니다.\n\t\t이전 버전 자동 삭제 외에도 버전 앱에서는 사용자의 현재 남은 공간의 50% 이상을 사용하지 않습니다. 저장된 버전이 해당 할당량을 초과한다면 할당량 이하로 떨어질 때까지 앱에서 가장 오래된 버전을 삭제합니다. 자세한 정보를 보려면 버전 문서를 참조하십시오.",
"Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}(으)로 되돌리는 데 실패했습니다.",
"_%n byte_::_%n bytes_" : ["%n바이트"],
"Restore" : "복원",
"No other versions available" : "다른 버전을 사용할 수 없음"
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "이 애플리케이션은 변경된 파일의 이전 버전을 자동으로 유지합니다. 활성화되면 각 사용자 디렉토리에 숨겨진 버전 폴더가 생성되며 이전 파일 버전을 저장하는 데 사용됩니다. 사용자는 웹 인터페이스를 통해 언제든지 이전 버전으로 복원할 수 있으며 교체된 파일이 버전으로 변합니다. 이 앱은 사용자가 버전으로 인해 할당량을 모두 사용하지 않도록 버전 폴더를 자동으로 관리합니다. 또한 버전의 만료 외에도, 버전 앱은 사용 가능한 무료 공간의 50%를 초과하여 사용하지 않도록 합니다. 저장된 버전이 이 제한을 초과하는 경우, 앱은 가장 오래된 버전을 먼저 삭제하여 이 제한을 준수하도록 합니다. 더 자세한 정보는 버전 문서에서 확인할 수 있습니다.",
"Name this version" : "이 버전의 이름",
"Edit version name" : "버전 이름 수정",
"Compare to current version" : "현재 버전과 비교하기",
"Restore version" : "버전 복원",
"Download version" : "버전 다운로드",
"Delete version" : "버전 삭제",
"Version name" : "버전 이름",
"Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "이름이 지정된 버전은 유지되며, 저장 공간 할당량이 가득 찼을 때의 자동 정리 목록에서 제외됩니다.",
"Remove version name" : "버전 이름 제거",
"Save version name" : "버전 이름 저장",
"Current version" : "현재 버전",
"Initial version" : "초기 버전",
"Initial version restored" : "초기 버전이 복원됨",
"Version restored" : "버전이 복원됨",
"Could not restore version" : "버전을 복원할 수 없음",
"Could not set version name" : "버전 이름을 설정할 수 없음",
"Could not delete version" : "버전을 삭제할 수 없음",
"${version.label} restored" : "${version.label} 복원됨"
},
"nplurals=1; plural=0;");

@ -1,11 +1,24 @@
{ "translations": {
"Versions" : "버전",
"This application automatically maintains older versions of files that are changed." : "이 앱은 변경된 파일의 이전 버전을 관리합니다.",
"Version" : "버전",
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every users directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesnt run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the users currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "이 앱은 변경된 파일의 이전 버전을 관리합니다. 이 앱을 활성화하면 개별 사용자 디렉터리 아래에 숨김 버전 폴더를 생성하며 이전 버전의 파일을 저장합니다. 웹 인터페이스를 사용하여 파일의 이전 버전으로 복원할 수 있으며, 대체된 파일은 새로운 버전으로 간주됩니다. 앱에서 버전 폴더의 크기를 자동으로 관리하여 이전 버전 때문에 할당량을 초과하는 일을 방지합니다.\n\t\t이전 버전 자동 삭제 외에도 버전 앱에서는 사용자의 현재 남은 공간의 50% 이상을 사용하지 않습니다. 저장된 버전이 해당 할당량을 초과한다면 할당량 이하로 떨어질 때까지 앱에서 가장 오래된 버전을 삭제합니다. 자세한 정보를 보려면 버전 문서를 참조하십시오.",
"Failed to revert {file} to revision {timestamp}." : "{file}을(를) 리비전 {timestamp}(으)로 되돌리는 데 실패했습니다.",
"_%n byte_::_%n bytes_" : ["%n바이트"],
"Restore" : "복원",
"No other versions available" : "다른 버전을 사용할 수 없음"
"This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "이 애플리케이션은 변경된 파일의 이전 버전을 자동으로 유지합니다. 활성화되면 각 사용자 디렉토리에 숨겨진 버전 폴더가 생성되며 이전 파일 버전을 저장하는 데 사용됩니다. 사용자는 웹 인터페이스를 통해 언제든지 이전 버전으로 복원할 수 있으며 교체된 파일이 버전으로 변합니다. 이 앱은 사용자가 버전으로 인해 할당량을 모두 사용하지 않도록 버전 폴더를 자동으로 관리합니다. 또한 버전의 만료 외에도, 버전 앱은 사용 가능한 무료 공간의 50%를 초과하여 사용하지 않도록 합니다. 저장된 버전이 이 제한을 초과하는 경우, 앱은 가장 오래된 버전을 먼저 삭제하여 이 제한을 준수하도록 합니다. 더 자세한 정보는 버전 문서에서 확인할 수 있습니다.",
"Name this version" : "이 버전의 이름",
"Edit version name" : "버전 이름 수정",
"Compare to current version" : "현재 버전과 비교하기",
"Restore version" : "버전 복원",
"Download version" : "버전 다운로드",
"Delete version" : "버전 삭제",
"Version name" : "버전 이름",
"Named versions are persisted, and excluded from automatic cleanups when your storage quota is full." : "이름이 지정된 버전은 유지되며, 저장 공간 할당량이 가득 찼을 때의 자동 정리 목록에서 제외됩니다.",
"Remove version name" : "버전 이름 제거",
"Save version name" : "버전 이름 저장",
"Current version" : "현재 버전",
"Initial version" : "초기 버전",
"Initial version restored" : "초기 버전이 복원됨",
"Version restored" : "버전이 복원됨",
"Could not restore version" : "버전을 복원할 수 없음",
"Could not set version name" : "버전 이름을 설정할 수 없음",
"Could not delete version" : "버전을 삭제할 수 없음",
"${version.label} restored" : "${version.label} 복원됨"
},"pluralForm" :"nplurals=1; plural=0;"
}

@ -127,6 +127,9 @@ OC.L10N.register(
"Background jobs" : "Hintergrund-Aufgaben",
"Unlimited" : "Unbegrenzt",
"Verifying" : "Überprüfe",
"App directories owner" : "Besitzer der App-Ordner",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Einige App-Ordner werden von einem anderen Benutzer als dem des Web-Servers besessen. Dies kann der Fall sein, wenn Apps manuell installiert wurden. Überprüfen Sie die Berechtigungen der folgenden App-Ordner:\n%s",
"App directories have the correct owner \"%s\"" : "App-Ordner haben den richtigen Besitzer \"%s\"",
"Brute-force Throttle" : "Brute-Force-Drosselung",
"Your remote address could not be determined." : "Ihre Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ihre Remote-Adresse wurde als „%s“ erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht Ihre Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
@ -182,16 +185,16 @@ OC.L10N.register(
"PHP modules" : "PHP-Module",
"This instance is missing some required PHP modules. It is required to install them: %s." : "Dieser Instanz fehlen einige erforderliche PHP-Module. Folgende Module müssen installiert sein:%s .",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "In dieser Instanz fehlen einige empfohlene PHP-Module. Für eine verbesserte Leistung und bessere Kompatibilität wird dringend empfohlen, sie zu installieren: %s.",
"PHP opcache" : "PHP opcache",
"PHP opcache" : "PHP OPcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Das PHP-OPcache-Modul ist nicht geladen. Für eine bessere Leistung empfiehlt es sich, das Modul in Ihre PHP-Installation zu laden.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache ist deaktiviert. Für eine bessere Leistung empfiehlt es sich, in der PHP-Konfiguration \"opcache.enable=1\" zu setzen.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "Der OPcache mit gemeinsamem Speicher ist deaktiviert. Für eine bessere Leistung wird empfohlen, \"opcache.file_cache_only=0\" in die PHP-Konfiguration aufzunehmen und den Dateicache nur als Second Level Cache zu verwenden.",
"OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache funktioniert nicht wie erwartet, opcache_get_status() gibt false zurück, bitte die Konfiguration überprüfen.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Die maximale Anzahl der OPcache-Schlüssel wird annähernd überschritten. Um sicherzustellen, dass alle Skripte im Cache gespeichert werden können, empfiehlt es sich, \"opcache.max_accelerated_files\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Der OPcache-Puffer ist fast voll. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, \"opcache.memory_consumption\" in der PHP-Konfiguration mit einem Wert höher als \"%s\" zu setzen.",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Der OPcache interned strings Puffer ist fast voll. Um sicherzustellen, dass sich wiederholende Strings effektiv zwischengespeichert werden können, wird empfohlen, \"opcache.interned_strings_buffer\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Der \"OPcache interned strings\"-Puffer ist fast voll. Um sicherzustellen, dass sich wiederholende Strings effektiv zwischengespeichert werden können, wird empfohlen, \"opcache.interned_strings_buffer\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache ist so konfiguriert, dass Code-Kommentare entfernt werden Mit aktiviertem OPcache muss \"opcache.save_comments=1\" gesetzt werden, damit die Nextcloud funktioniert.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud darf die OPcache API nicht verwenden. Mit aktiviertem OPcache wird empfohlen, alle Nextcloud-Verzeichnisse mit \"opcache.restrict_api\" einzuschließen oder diese Einstellung zu deaktivieren, um OPcache API-Beschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud darf die OPcache-API nicht verwenden. Mit aktiviertem OPcache wird empfohlen, alle Nextcloud-Verzeichnisse mit \"opcache.restrict_api\" einzuschließen oder diese Einstellung zu deaktivieren, um OPcache API-Beschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.",
"The PHP OPcache module is not properly configured. %s." : "Das PHP OPcache-Modul ist nicht ordnungsgemäß konfiguriert. %s.",
"Correctly configured" : "Korrekt konfiguriert",
"PHP version" : "PHP-Version",

@ -125,6 +125,9 @@
"Background jobs" : "Hintergrund-Aufgaben",
"Unlimited" : "Unbegrenzt",
"Verifying" : "Überprüfe",
"App directories owner" : "Besitzer der App-Ordner",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Einige App-Ordner werden von einem anderen Benutzer als dem des Web-Servers besessen. Dies kann der Fall sein, wenn Apps manuell installiert wurden. Überprüfen Sie die Berechtigungen der folgenden App-Ordner:\n%s",
"App directories have the correct owner \"%s\"" : "App-Ordner haben den richtigen Besitzer \"%s\"",
"Brute-force Throttle" : "Brute-Force-Drosselung",
"Your remote address could not be determined." : "Ihre Remote-Adresse konnte nicht ermittelt werden.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Ihre Remote-Adresse wurde als „%s“ erkannt und wird derzeit durch die Brute-Force-Erkennung gedrosselt, was die Leistung verschiedener Anfragen verlangsamt. Wenn die Remote-Adresse nicht Ihre Adresse ist, kann dies ein Hinweis darauf sein, dass ein Proxy nicht richtig konfiguriert ist.",
@ -180,16 +183,16 @@
"PHP modules" : "PHP-Module",
"This instance is missing some required PHP modules. It is required to install them: %s." : "Dieser Instanz fehlen einige erforderliche PHP-Module. Folgende Module müssen installiert sein:%s .",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "In dieser Instanz fehlen einige empfohlene PHP-Module. Für eine verbesserte Leistung und bessere Kompatibilität wird dringend empfohlen, sie zu installieren: %s.",
"PHP opcache" : "PHP opcache",
"PHP opcache" : "PHP OPcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Das PHP-OPcache-Modul ist nicht geladen. Für eine bessere Leistung empfiehlt es sich, das Modul in Ihre PHP-Installation zu laden.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache ist deaktiviert. Für eine bessere Leistung empfiehlt es sich, in der PHP-Konfiguration \"opcache.enable=1\" zu setzen.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "Der OPcache mit gemeinsamem Speicher ist deaktiviert. Für eine bessere Leistung wird empfohlen, \"opcache.file_cache_only=0\" in die PHP-Konfiguration aufzunehmen und den Dateicache nur als Second Level Cache zu verwenden.",
"OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache funktioniert nicht wie erwartet, opcache_get_status() gibt false zurück, bitte die Konfiguration überprüfen.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Die maximale Anzahl der OPcache-Schlüssel wird annähernd überschritten. Um sicherzustellen, dass alle Skripte im Cache gespeichert werden können, empfiehlt es sich, \"opcache.max_accelerated_files\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Der OPcache-Puffer ist fast voll. Um sicherzustellen, dass alle Skripte im Cache gehalten werden können, wird empfohlen, \"opcache.memory_consumption\" in der PHP-Konfiguration mit einem Wert höher als \"%s\" zu setzen.",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Der OPcache interned strings Puffer ist fast voll. Um sicherzustellen, dass sich wiederholende Strings effektiv zwischengespeichert werden können, wird empfohlen, \"opcache.interned_strings_buffer\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Der \"OPcache interned strings\"-Puffer ist fast voll. Um sicherzustellen, dass sich wiederholende Strings effektiv zwischengespeichert werden können, wird empfohlen, \"opcache.interned_strings_buffer\" mit einem Wert größer als \"%s\" in der PHP-Konfiguration zu setzen.",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache ist so konfiguriert, dass Code-Kommentare entfernt werden Mit aktiviertem OPcache muss \"opcache.save_comments=1\" gesetzt werden, damit die Nextcloud funktioniert.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud darf die OPcache API nicht verwenden. Mit aktiviertem OPcache wird empfohlen, alle Nextcloud-Verzeichnisse mit \"opcache.restrict_api\" einzuschließen oder diese Einstellung zu deaktivieren, um OPcache API-Beschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud darf die OPcache-API nicht verwenden. Mit aktiviertem OPcache wird empfohlen, alle Nextcloud-Verzeichnisse mit \"opcache.restrict_api\" einzuschließen oder diese Einstellung zu deaktivieren, um OPcache API-Beschränkungen zu deaktivieren und Fehler während Nextcloud-Core- oder App-Aktualisierungen zu vermeiden.",
"The PHP OPcache module is not properly configured. %s." : "Das PHP OPcache-Modul ist nicht ordnungsgemäß konfiguriert. %s.",
"Correctly configured" : "Korrekt konfiguriert",
"PHP version" : "PHP-Version",

@ -127,6 +127,9 @@ OC.L10N.register(
"Background jobs" : "Background jobs",
"Unlimited" : "Unlimited",
"Verifying" : "Verifying",
"App directories owner" : "App directories owner",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s",
"App directories have the correct owner \"%s\"" : "App directories have the correct owner \"%s\"",
"Brute-force Throttle" : "Brute-force Throttle",
"Your remote address could not be determined." : "Your remote address could not be determined.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly.",

@ -125,6 +125,9 @@
"Background jobs" : "Background jobs",
"Unlimited" : "Unlimited",
"Verifying" : "Verifying",
"App directories owner" : "App directories owner",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s",
"App directories have the correct owner \"%s\"" : "App directories have the correct owner \"%s\"",
"Brute-force Throttle" : "Brute-force Throttle",
"Your remote address could not be determined." : "Your remote address could not be determined.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly.",

@ -127,6 +127,9 @@ OC.L10N.register(
"Background jobs" : "Tâches d'arrière-plan",
"Unlimited" : "Illimité",
"Verifying" : "Vérification en cours",
"App directories owner" : "Propriétaire des répertoires dapplications ",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Certains répertoires d'applications appartiennent à un utilisateur différent de celui du serveur web. Cela peut être le cas si les applications ont été installées manuellement. Vérifiez les permissions des répertoires d'applications suivants :\n%s",
"App directories have the correct owner \"%s\"" : "Répertoires d'applications ayant le propriétaire adéquat : « %s »",
"Your remote address could not be determined." : "Votre adresse à distance n'a pas pu être déterminée.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Votre adresse réseau a été identifiée comme « %s » et elle est bridée par le mécanisme anti-intrusion ce qui ralentit la performance de certaines requêtes. Si cette adresse réseau n'est pas la vôtre, cela peut signifier qu'il y a une erreur de configuration d'un proxy.",
"A background job is pending that checks for user imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par lutilisateur est en attente. Veuillez vérifier plus tard.",
@ -176,6 +179,15 @@ OC.L10N.register(
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "Cette instance ne dispose pas de plusieurs modules PHP recommandés. Il est recommandé de les installer pour améliorer les performances, et la compatibilité : %s.",
"PHP opcache" : "opcache PHP",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Le module PHP 'OPcache' n'est pas chargé. Pour de meilleures performances, il est recommandé de le charger dans votre installation PHP.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache est désactivé. Pour de meilleures performances, il est recommandé de définir « opcache.enable=1 » dans votre fichier configuration PHP.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "L'OPcache basé sur la mémoire partagée est désactivé. Pour de meilleures performances, il est recommandé de paramétrer « opcache.file_cache_only=0 » dans votre configuration PHP et d'utiliser le cache fichier comme cache de second niveau seulement.",
"OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache ne fonctionne pas comme prévu, opcache_get_status() retourne faux, veuillez vérifier la configuration.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Le nombre maximum de clés OPcache est presque dépassé. Pour vous assurer que tous les scripts puissent être conservés en cache, il est recommandé de définir la variable « opcache.max_accelerated_files » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Le tampon mémoire OPcache est presque plein. Pour vous assurer que tous les scripts peuvent être conservés en cache, il est recommandé de définir la variable « opcache.memory_consumption » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Le tampon mémoire des chaînes internes OPcache est presque plein. Pour vous assurer que les chaînes répétitives peuvent être mise en cache, il est recommandé de définir la variable « opcache.interned_strings_buffer » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache est configuré pour retirer les commentaires du code. Avec OPcache activé, « opcache.save_comments=1 » doit être ajouté au fichier de configuration PHP pour que Nextcloud fonctionne.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud n'est pas autorisé à utiliser l'API de OPcache. Avec OPcache activé, il est fortement recommandé d'inclure tous les répertoires de Nextcloud dans la variable « opcache.restrict_api » du fichier de configuration PHP ou de désactiver ces restrictions de l'API OPcache, pour éviter les erreurs pendant les mises à jour de Nextcloud ou des applications.",
"The PHP OPcache module is not properly configured. %s." : "Le module PHP OPcache n'est pas correctement configuré. %s.",
"Correctly configured" : "Configuré correctement",
"PHP version" : "Version PHP",
"You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Vous exécutez actuellement PHP %s. PHP 8.0 est maintenant obsolète pour Nextcloud 27. Nextcloud 28 nécessite au moins PHP 8.1. Veuillez mettre à jour vers l'une des versions PHP officiellement compatibles fournies par le PHP Group dès que possible.",

@ -125,6 +125,9 @@
"Background jobs" : "Tâches d'arrière-plan",
"Unlimited" : "Illimité",
"Verifying" : "Vérification en cours",
"App directories owner" : "Propriétaire des répertoires dapplications ",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "Certains répertoires d'applications appartiennent à un utilisateur différent de celui du serveur web. Cela peut être le cas si les applications ont été installées manuellement. Vérifiez les permissions des répertoires d'applications suivants :\n%s",
"App directories have the correct owner \"%s\"" : "Répertoires d'applications ayant le propriétaire adéquat : « %s »",
"Your remote address could not be determined." : "Votre adresse à distance n'a pas pu être déterminée.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Votre adresse réseau a été identifiée comme « %s » et elle est bridée par le mécanisme anti-intrusion ce qui ralentit la performance de certaines requêtes. Si cette adresse réseau n'est pas la vôtre, cela peut signifier qu'il y a une erreur de configuration d'un proxy.",
"A background job is pending that checks for user imported SSL certificates. Please check back later." : "Une tâche en arrière-plan qui vérifie les certificats SSL importés par lutilisateur est en attente. Veuillez vérifier plus tard.",
@ -174,6 +177,15 @@
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "Cette instance ne dispose pas de plusieurs modules PHP recommandés. Il est recommandé de les installer pour améliorer les performances, et la compatibilité : %s.",
"PHP opcache" : "opcache PHP",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "Le module PHP 'OPcache' n'est pas chargé. Pour de meilleures performances, il est recommandé de le charger dans votre installation PHP.",
"OPcache is disabled. For better performance, it is recommended to apply \"opcache.enable=1\" to your PHP configuration." : "OPcache est désactivé. Pour de meilleures performances, il est recommandé de définir « opcache.enable=1 » dans votre fichier configuration PHP.",
"The shared memory based OPcache is disabled. For better performance, it is recommended to apply \"opcache.file_cache_only=0\" to your PHP configuration and use the file cache as second level cache only." : "L'OPcache basé sur la mémoire partagée est désactivé. Pour de meilleures performances, il est recommandé de paramétrer « opcache.file_cache_only=0 » dans votre configuration PHP et d'utiliser le cache fichier comme cache de second niveau seulement.",
"OPcache is not working as it should, opcache_get_status() returns false, please check configuration." : "OPcache ne fonctionne pas comme prévu, opcache_get_status() retourne faux, veuillez vérifier la configuration.",
"The maximum number of OPcache keys is nearly exceeded. To assure that all scripts can be kept in the cache, it is recommended to apply \"opcache.max_accelerated_files\" to your PHP configuration with a value higher than \"%s\"." : "Le nombre maximum de clés OPcache est presque dépassé. Pour vous assurer que tous les scripts puissent être conservés en cache, il est recommandé de définir la variable « opcache.max_accelerated_files » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"The OPcache buffer is nearly full. To assure that all scripts can be hold in cache, it is recommended to apply \"opcache.memory_consumption\" to your PHP configuration with a value higher than \"%s\"." : "Le tampon mémoire OPcache est presque plein. Pour vous assurer que tous les scripts peuvent être conservés en cache, il est recommandé de définir la variable « opcache.memory_consumption » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"The OPcache interned strings buffer is nearly full. To assure that repeating strings can be effectively cached, it is recommended to apply \"opcache.interned_strings_buffer\" to your PHP configuration with a value higher than \"%s\"." : "Le tampon mémoire des chaînes internes OPcache est presque plein. Pour vous assurer que les chaînes répétitives peuvent être mise en cache, il est recommandé de définir la variable « opcache.interned_strings_buffer » de votre fichier de configuration PHP à une valeur supérieure à « %s ».",
"OPcache is configured to remove code comments. With OPcache enabled, \"opcache.save_comments=1\" must be set for Nextcloud to function." : "OPcache est configuré pour retirer les commentaires du code. Avec OPcache activé, « opcache.save_comments=1 » doit être ajouté au fichier de configuration PHP pour que Nextcloud fonctionne.",
"Nextcloud is not allowed to use the OPcache API. With OPcache enabled, it is highly recommended to include all Nextcloud directories with \"opcache.restrict_api\" or unset this setting to disable OPcache API restrictions, to prevent errors during Nextcloud core or app upgrades." : "Nextcloud n'est pas autorisé à utiliser l'API de OPcache. Avec OPcache activé, il est fortement recommandé d'inclure tous les répertoires de Nextcloud dans la variable « opcache.restrict_api » du fichier de configuration PHP ou de désactiver ces restrictions de l'API OPcache, pour éviter les erreurs pendant les mises à jour de Nextcloud ou des applications.",
"The PHP OPcache module is not properly configured. %s." : "Le module PHP OPcache n'est pas correctement configuré. %s.",
"Correctly configured" : "Configuré correctement",
"PHP version" : "Version PHP",
"You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Vous exécutez actuellement PHP %s. PHP 8.0 est maintenant obsolète pour Nextcloud 27. Nextcloud 28 nécessite au moins PHP 8.1. Veuillez mettre à jour vers l'une des versions PHP officiellement compatibles fournies par le PHP Group dès que possible.",

@ -140,6 +140,7 @@ OC.L10N.register(
"MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "현재 MariaDB \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MariaDB 10.2 이상을 사용하십시오.",
"MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "현재 MySQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MySQL 8.0 혹은 MariaDB 10.2 이상을 사용하십시오.",
"PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "현재 PostgreSQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. PostgreSQL 9.6 이상을 사용하십시오.",
"Architecture" : "건축",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "데이터베이스가 \"READ COMMITTED\" 트랜잭션 격리 수준에서 실행되고 있지 않습니다. 여러 작업이 동시에 실행될 때 문제가 발생할 수 있습니다.",
"Profile information" : "프로필 정보",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "프로필 사진, 전체 이름, 이메일, 전화번호, 주소, 웹사이트, 트위터, 조직, 직책, 표제, 소개문구 및 프로필 활성화 여부",

@ -138,6 +138,7 @@
"MariaDB version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MariaDB 10.2 or higher." : "현재 MariaDB \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MariaDB 10.2 이상을 사용하십시오.",
"MySQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require MySQL 8.0 or MariaDB 10.2 or higher." : "현재 MySQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. MySQL 8.0 혹은 MariaDB 10.2 이상을 사용하십시오.",
"PostgreSQL version \"%s\" is used. Nextcloud 21 and higher do not support this version and require PostgreSQL 9.6 or higher." : "현재 PostgreSQL \"%s\" 버전이 사용되고 있습니다. Nextcloud 21 및 그 이상의 버전은 이를 지원하지 않습니다. PostgreSQL 9.6 이상을 사용하십시오.",
"Architecture" : "건축",
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "데이터베이스가 \"READ COMMITTED\" 트랜잭션 격리 수준에서 실행되고 있지 않습니다. 여러 작업이 동시에 실행될 때 문제가 발생할 수 있습니다.",
"Profile information" : "프로필 정보",
"Profile picture, full name, email, phone number, address, website, Twitter, organisation, role, headline, biography, and whether your profile is enabled" : "프로필 사진, 전체 이름, 이메일, 전화번호, 주소, 웹사이트, 트위터, 조직, 직책, 표제, 소개문구 및 프로필 활성화 여부",

@ -127,6 +127,8 @@ OC.L10N.register(
"Background jobs" : "Tarefas em segundo plano",
"Unlimited" : "Ilimitado",
"Verifying" : "Verificando",
"App directories owner" : "Proprietário de diretórios de aplicativos",
"App directories have the correct owner \"%s\"" : "Os diretórios de aplicativos têm o proprietário correto \"%s\"",
"Brute-force Throttle" : "Acelerador de força bruta",
"Your remote address could not be determined." : "Seu endereço remoto não pode ser determinado.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Seu endereço remoto foi identificado como \"%s\" e está sendo limitado por força bruta no momento, diminuindo o desempenho de diversas solicitações. Se o endereço remoto não for o seu, isso pode ser uma indicação de que um proxy não está configurado corretamente.",
@ -182,6 +184,7 @@ OC.L10N.register(
"PHP modules" : "Módulos PHP",
"This instance is missing some required PHP modules. It is required to install them: %s." : "Esta instância está faltando alguns módulos PHP necessários. É necessário instalá-los:: %s.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "Esta instância está faltando alguns módulos PHP recomendados. Para melhor desempenho e melhor compatibilidade é altamente recomendável instalá-los:%s.",
"PHP opcache" : "PHP opcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "O módulo PHP OPcache não está carregado. Para um melhor desempenho, é recomendável carregá-lo em sua instalação do PHP.",
"PHP version" : "Versão do PHP",
"You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Você está executando PHP no momento %s.PHP 8.0 agora está obsoleto no Nextcloud 27. Nextcloud 28 pode exigir pelo menos PHP 8.1. Atualize para uma das versões PHP com suporte oficial fornecidas pelo PHP Group o mais rápido possível.",

@ -125,6 +125,8 @@
"Background jobs" : "Tarefas em segundo plano",
"Unlimited" : "Ilimitado",
"Verifying" : "Verificando",
"App directories owner" : "Proprietário de diretórios de aplicativos",
"App directories have the correct owner \"%s\"" : "Os diretórios de aplicativos têm o proprietário correto \"%s\"",
"Brute-force Throttle" : "Acelerador de força bruta",
"Your remote address could not be determined." : "Seu endereço remoto não pode ser determinado.",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "Seu endereço remoto foi identificado como \"%s\" e está sendo limitado por força bruta no momento, diminuindo o desempenho de diversas solicitações. Se o endereço remoto não for o seu, isso pode ser uma indicação de que um proxy não está configurado corretamente.",
@ -180,6 +182,7 @@
"PHP modules" : "Módulos PHP",
"This instance is missing some required PHP modules. It is required to install them: %s." : "Esta instância está faltando alguns módulos PHP necessários. É necessário instalá-los:: %s.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them: %s." : "Esta instância está faltando alguns módulos PHP recomendados. Para melhor desempenho e melhor compatibilidade é altamente recomendável instalá-los:%s.",
"PHP opcache" : "PHP opcache",
"The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation." : "O módulo PHP OPcache não está carregado. Para um melhor desempenho, é recomendável carregá-lo em sua instalação do PHP.",
"PHP version" : "Versão do PHP",
"You are currently running PHP %s. PHP 8.0 is now deprecated in Nextcloud 27. Nextcloud 28 may require at least PHP 8.1. Please upgrade to one of the officially supported PHP versions provided by the PHP Group as soon as possible." : "Você está executando PHP no momento %s.PHP 8.0 agora está obsoleto no Nextcloud 27. Nextcloud 28 pode exigir pelo menos PHP 8.1. Atualize para uma das versões PHP com suporte oficial fornecidas pelo PHP Group o mais rápido possível.",

@ -127,6 +127,9 @@ OC.L10N.register(
"Background jobs" : "後台作業",
"Unlimited" : "無限制",
"Verifying" : "正在驗證",
"App directories owner" : "應用程式目錄擁有者",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "某些應用程式的資料夾所有者與網頁伺服器預設用戶不同。這可能是因為您手動安裝了這些應用程式。請檢查以下應用程式資料夾的相關權限:\n%s",
"App directories have the correct owner \"%s\"" : "應用程式目錄有正確的擁有者 \"%s\"",
"Brute-force Throttle" : "暴力攻擊限制",
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」且目前正受到強力限制導致降低了各種請求的效能。若遠端地址不是您的地址可能代表代理伺服器設定不正確。",

@ -125,6 +125,9 @@
"Background jobs" : "後台作業",
"Unlimited" : "無限制",
"Verifying" : "正在驗證",
"App directories owner" : "應用程式目錄擁有者",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "某些應用程式的資料夾所有者與網頁伺服器預設用戶不同。這可能是因為您手動安裝了這些應用程式。請檢查以下應用程式資料夾的相關權限:\n%s",
"App directories have the correct owner \"%s\"" : "應用程式目錄有正確的擁有者 \"%s\"",
"Brute-force Throttle" : "暴力攻擊限制",
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」且目前正受到強力限制導致降低了各種請求的效能。若遠端地址不是您的地址可能代表代理伺服器設定不正確。",

@ -127,6 +127,9 @@ OC.L10N.register(
"Background jobs" : "背景工作",
"Unlimited" : "無限制",
"Verifying" : "正在驗證",
"App directories owner" : "應用程式目錄擁有者",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "某些應用程式的資料夾所有者與網頁伺服器預設使用者不同。這可能是因為您手動安裝了這些應用程式。請檢查以下應用程式資料夾的相關權限:\n%s",
"App directories have the correct owner \"%s\"" : "應用程式目錄有正確的擁有者「%s」",
"Brute-force Throttle" : "暴力攻擊限制",
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」且目前正受到強力限制導致降低了各種請求的效能。若遠端地址不是您的地址可能代表代理伺服器設定不正確。",

@ -125,6 +125,9 @@
"Background jobs" : "背景工作",
"Unlimited" : "無限制",
"Verifying" : "正在驗證",
"App directories owner" : "應用程式目錄擁有者",
"Some app directories are owned by a different user than the web server one. This may be the case if apps have been installed manually. Check the permissions of the following app directories:\n%s" : "某些應用程式的資料夾所有者與網頁伺服器預設使用者不同。這可能是因為您手動安裝了這些應用程式。請檢查以下應用程式資料夾的相關權限:\n%s",
"App directories have the correct owner \"%s\"" : "應用程式目錄有正確的擁有者「%s」",
"Brute-force Throttle" : "暴力攻擊限制",
"Your remote address could not be determined." : "無法確定您的遠端位址。",
"Your remote address was identified as \"%s\" and is brute-force throttled at the moment slowing down the performance of various requests. If the remote address is not your address this can be an indication that a proxy is not configured correctly." : "您的遠端地址被識別為「%s」且目前正受到強力限制導致降低了各種請求的效能。若遠端地址不是您的地址可能代表代理伺服器設定不正確。",

@ -27,25 +27,18 @@ declare(strict_types=1);
namespace OCA\WeatherStatus;
/**
* https://api.met.no/doc/ForecastJSON
* https://api.met.no/doc/ForecastJSON compact format according to https://docs.api.met.no/doc/locationforecast/datamodel
* @psalm-type WeatherStatusForecast = array{
* time: string,
* data: array{
* instant: array{
* details: array{
* air_pressure_at_sea_level: float,
* air_temperature: float,
* cloud_area_fraction: float,
* cloud_area_fraction_high: float,
* cloud_area_fraction_low: float,
* cloud_area_fraction_medium: float,
* dew_point_temperature: float,
* fog_area_fraction: float,
* relative_humidity: float,
* ultraviolet_index_clear_sky: float,
* wind_from_direction: float,
* wind_speed: float,
* wind_speed_of_gust: float,
* air_pressure_at_sea_level: numeric,
* air_temperature: numeric,
* cloud_area_fraction: numeric,
* relative_humidity: numeric,
* wind_from_direction: numeric,
* wind_speed: numeric,
* },
* },
* next_12_hours: array{
@ -53,7 +46,7 @@ namespace OCA\WeatherStatus;
* symbol_code: string,
* },
* details: array{
* probability_of_precipitation: float,
* precipitation_amount?: numeric,
* },
* },
* next_1_hours: array{
@ -61,11 +54,7 @@ namespace OCA\WeatherStatus;
* symbol_code: string,
* },
* details: array{
* precipitation_amount: float,
* precipitation_amount_max: float,
* precipitation_amount_min: float,
* probability_of_precipitation: float,
* probability_of_thunder: float,
* precipitation_amount?: numeric,
* },
* },
* next_6_hours: array{
@ -73,12 +62,7 @@ namespace OCA\WeatherStatus;
* symbol_code: string,
* },
* details: array{
* air_temperature_max: float,
* air_temperature_min: float,
* precipitation_amount: float,
* precipitation_amount_max: float,
* precipitation_amount_min: float,
* probability_of_precipitation: float,
* precipitation_amount?: numeric,
* },
* },
* },

@ -70,69 +70,28 @@
"air_pressure_at_sea_level",
"air_temperature",
"cloud_area_fraction",
"cloud_area_fraction_high",
"cloud_area_fraction_low",
"cloud_area_fraction_medium",
"dew_point_temperature",
"fog_area_fraction",
"relative_humidity",
"ultraviolet_index_clear_sky",
"wind_from_direction",
"wind_speed",
"wind_speed_of_gust"
"wind_speed"
],
"properties": {
"air_pressure_at_sea_level": {
"type": "number",
"format": "float"
"type": "number"
},
"air_temperature": {
"type": "number",
"format": "float"
"type": "number"
},
"cloud_area_fraction": {
"type": "number",
"format": "float"
},
"cloud_area_fraction_high": {
"type": "number",
"format": "float"
},
"cloud_area_fraction_low": {
"type": "number",
"format": "float"
},
"cloud_area_fraction_medium": {
"type": "number",
"format": "float"
},
"dew_point_temperature": {
"type": "number",
"format": "float"
},
"fog_area_fraction": {
"type": "number",
"format": "float"
"type": "number"
},
"relative_humidity": {
"type": "number",
"format": "float"
},
"ultraviolet_index_clear_sky": {
"type": "number",
"format": "float"
"type": "number"
},
"wind_from_direction": {
"type": "number",
"format": "float"
"type": "number"
},
"wind_speed": {
"type": "number",
"format": "float"
},
"wind_speed_of_gust": {
"type": "number",
"format": "float"
"type": "number"
}
}
}
@ -158,13 +117,9 @@
},
"details": {
"type": "object",
"required": [
"probability_of_precipitation"
],
"properties": {
"probability_of_precipitation": {
"type": "number",
"format": "float"
"precipitation_amount": {
"type": "number"
}
}
}
@ -190,33 +145,9 @@
},
"details": {
"type": "object",
"required": [
"precipitation_amount",
"precipitation_amount_max",
"precipitation_amount_min",
"probability_of_precipitation",
"probability_of_thunder"
],
"properties": {
"precipitation_amount": {
"type": "number",
"format": "float"
},
"precipitation_amount_max": {
"type": "number",
"format": "float"
},
"precipitation_amount_min": {
"type": "number",
"format": "float"
},
"probability_of_precipitation": {
"type": "number",
"format": "float"
},
"probability_of_thunder": {
"type": "number",
"format": "float"
"type": "number"
}
}
}
@ -242,38 +173,9 @@
},
"details": {
"type": "object",
"required": [
"air_temperature_max",
"air_temperature_min",
"precipitation_amount",
"precipitation_amount_max",
"precipitation_amount_min",
"probability_of_precipitation"
],
"properties": {
"air_temperature_max": {
"type": "number",
"format": "float"
},
"air_temperature_min": {
"type": "number",
"format": "float"
},
"precipitation_amount": {
"type": "number",
"format": "float"
},
"precipitation_amount_max": {
"type": "number",
"format": "float"
},
"precipitation_amount_min": {
"type": "number",
"format": "float"
},
"probability_of_precipitation": {
"type": "number",
"format": "float"
"type": "number"
}
}
}

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

Loading…
Cancel
Save