migrate therinaldos.com data
Build & Deploy to DigitalOcean Space / build (push) Failing after 2m38s

This commit is contained in:
2024-05-05 15:50:45 -04:00
commit ef1ff240d4
23182 changed files with 3801898 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Andreas Fischer <bantu@owncloud.com>
* @author Björn Schießle <bjoern@schiessle.org>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Piotr Filiciak <piotr@filiciak.pl>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
// Check if we are a user
OC_Util::checkLoggedIn();
\OC::$server->getSession()->close();
$files = isset($_GET['files']) ? (string)$_GET['files'] : '';
$dir = isset($_GET['dir']) ? (string)$_GET['dir'] : '';
$files_list = json_decode($files);
// in case we get only a single file
if (!is_array($files_list)) {
$files_list = [$files];
}
/**
* @psalm-taint-escape cookie
*/
function cleanCookieInput(string $value): string {
if (strlen($value) > 32) {
return '';
}
if (preg_match('!^[a-zA-Z0-9]+$!', $_GET['downloadStartSecret']) !== 1) {
return '';
}
return $value;
}
/**
* this sets a cookie to be able to recognize the start of the download
* the content must not be longer than 32 characters and must only contain
* alphanumeric characters
*/
if (isset($_GET['downloadStartSecret'])) {
$value = cleanCookieInput($_GET['downloadStartSecret']);
if ($value !== '') {
setcookie('ocDownloadStarted', $value, time() + 20, '/');
}
}
$server_params = [ 'head' => \OC::$server->getRequest()->getMethod() === 'HEAD' ];
/**
* Http range requests support
*/
if (isset($_SERVER['HTTP_RANGE'])) {
$server_params['range'] = \OC::$server->getRequest()->getHeader('Range');
}
OC_Files::get($dir, $files_list, $server_params);
+79
View File
@@ -0,0 +1,79 @@
<?xml version="1.0"?>
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>files</id>
<name>Files</name>
<summary>File Management</summary>
<description>File Management</description>
<version>2.0.0</version>
<licence>agpl</licence>
<author>John Molakvoæ</author>
<author>Robin Appelman</author>
<author>Vincent Petry</author>
<types>
<filesystem/>
</types>
<documentation>
<user>user-files</user>
</documentation>
<category>files</category>
<bugs>https://github.com/nextcloud/server/issues</bugs>
<dependencies>
<nextcloud min-version="28" max-version="28"/>
</dependencies>
<background-jobs>
<job>OCA\Files\BackgroundJob\ScanFiles</job>
<job>OCA\Files\BackgroundJob\DeleteOrphanedItems</job>
<job>OCA\Files\BackgroundJob\CleanupFileLocks</job>
<job>OCA\Files\BackgroundJob\CleanupDirectEditingTokens</job>
<job>OCA\Files\BackgroundJob\DeleteExpiredOpenLocalEditor</job>
</background-jobs>
<commands>
<command>OCA\Files\Command\Scan</command>
<command>OCA\Files\Command\DeleteOrphanedFiles</command>
<command>OCA\Files\Command\TransferOwnership</command>
<command>OCA\Files\Command\ScanAppData</command>
<command>OCA\Files\Command\RepairTree</command>
<command>OCA\Files\Command\Get</command>
<command>OCA\Files\Command\Put</command>
<command>OCA\Files\Command\Delete</command>
<command>OCA\Files\Command\Copy</command>
<command>OCA\Files\Command\Move</command>
<command>OCA\Files\Command\Object\Delete</command>
<command>OCA\Files\Command\Object\Get</command>
<command>OCA\Files\Command\Object\Put</command>
</commands>
<activity>
<settings>
<setting>OCA\Files\Activity\Settings\FavoriteAction</setting>
<setting>OCA\Files\Activity\Settings\FileChanged</setting>
<setting>OCA\Files\Activity\Settings\FileFavoriteChanged</setting>
</settings>
<filters>
<filter>OCA\Files\Activity\Filter\FileChanges</filter>
<filter>OCA\Files\Activity\Filter\Favorites</filter>
</filters>
<providers>
<provider>OCA\Files\Activity\FavoriteProvider</provider>
<provider>OCA\Files\Activity\Provider</provider>
</providers>
</activity>
<navigations>
<navigation>
<name>Files</name>
<route>files.view.index</route>
<order>0</order>
</navigation>
</navigations>
<settings>
<personal>OCA\Files\Settings\PersonalSettings</personal>
</settings>
</info>
+212
View File
@@ -0,0 +1,212 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Felix Nüsse <Felix.nuesse@t-online.de>
* @author fnuesse <felix.nuesse@t-online.de>
* @author fnuesse <fnuesse@techfak.uni-bielefeld.de>
* @author Joas Schilling <coding@schilljs.com>
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Julius Härtl <jus@bitgrid.net>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Nina Pypchenko <22447785+nina-py@users.noreply.github.com>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Tobias Kaminsky <tobias@kaminsky.me>
* @author Vincent Petry <vincent@nextcloud.com>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OCA\Files\AppInfo;
use OCA\Files\Controller\OpenLocalEditorController;
// Legacy routes above
/** @var \OC\Route\Router $this */
$this->create('files_ajax_download', 'apps/files/ajax/download.php')
->actionInclude('files/ajax/download.php');
/** @var Application $application */
$application = \OC::$server->get(Application::class);
$application->registerRoutes(
$this,
[
'routes' => [
[
'name' => 'view#index',
'url' => '/',
'verb' => 'GET',
],
[
'name' => 'View#showFile',
'url' => '/f/{fileid}',
'verb' => 'GET',
'root' => '',
],
[
'name' => 'Api#getThumbnail',
'url' => '/api/v1/thumbnail/{x}/{y}/{file}',
'verb' => 'GET',
'requirements' => ['file' => '.+']
],
[
'name' => 'Api#updateFileTags',
'url' => '/api/v1/files/{path}',
'verb' => 'POST',
'requirements' => ['path' => '.+'],
],
[
'name' => 'Api#getRecentFiles',
'url' => '/api/v1/recent/',
'verb' => 'GET'
],
[
'name' => 'Api#getStorageStats',
'url' => '/api/v1/stats',
'verb' => 'GET'
],
[
'name' => 'Api#setViewConfig',
'url' => '/api/v1/views/{view}/{key}',
'verb' => 'PUT'
],
[
'name' => 'Api#getViewConfigs',
'url' => '/api/v1/views',
'verb' => 'GET'
],
[
'name' => 'Api#setConfig',
'url' => '/api/v1/config/{key}',
'verb' => 'PUT'
],
[
'name' => 'Api#getConfigs',
'url' => '/api/v1/configs',
'verb' => 'GET'
],
[
'name' => 'Api#showHiddenFiles',
'url' => '/api/v1/showhidden',
'verb' => 'POST'
],
[
'name' => 'Api#cropImagePreviews',
'url' => '/api/v1/cropimagepreviews',
'verb' => 'POST'
],
[
'name' => 'Api#showGridView',
'url' => '/api/v1/showgridview',
'verb' => 'POST'
],
[
'name' => 'Api#getGridView',
'url' => '/api/v1/showgridview',
'verb' => 'GET'
],
[
'name' => 'DirectEditingView#edit',
'url' => '/directEditing/{token}',
'verb' => 'GET'
],
[
'name' => 'Api#serviceWorker',
'url' => '/preview-service-worker.js',
'verb' => 'GET'
],
[
'name' => 'view#indexView',
'url' => '/{view}',
'verb' => 'GET',
],
[
'name' => 'view#indexViewFileid',
'url' => '/{view}/{fileid}',
'verb' => 'GET',
],
],
'ocs' => [
[
'name' => 'DirectEditing#info',
'url' => '/api/v1/directEditing',
'verb' => 'GET'
],
[
'name' => 'DirectEditing#templates',
'url' => '/api/v1/directEditing/templates/{editorId}/{creatorId}',
'verb' => 'GET'
],
[
'name' => 'DirectEditing#open',
'url' => '/api/v1/directEditing/open',
'verb' => 'POST'
],
[
'name' => 'DirectEditing#create',
'url' => '/api/v1/directEditing/create',
'verb' => 'POST'
],
[
'name' => 'Template#list',
'url' => '/api/v1/templates',
'verb' => 'GET'
],
[
'name' => 'Template#create',
'url' => '/api/v1/templates/create',
'verb' => 'POST'
],
[
'name' => 'Template#path',
'url' => '/api/v1/templates/path',
'verb' => 'POST'
],
[
'name' => 'TransferOwnership#transfer',
'url' => '/api/v1/transferownership',
'verb' => 'POST',
],
[
'name' => 'TransferOwnership#accept',
'url' => '/api/v1/transferownership/{id}',
'verb' => 'POST',
],
[
'name' => 'TransferOwnership#reject',
'url' => '/api/v1/transferownership/{id}',
'verb' => 'DELETE',
],
[
/** @see OpenLocalEditorController::create() */
'name' => 'OpenLocalEditor#create',
'url' => '/api/v1/openlocaleditor',
'verb' => 'POST',
],
[
/** @see OpenLocalEditorController::validate() */
'name' => 'OpenLocalEditor#validate',
'url' => '/api/v1/openlocaleditor/{token}',
'verb' => 'POST',
],
],
]
);
@@ -0,0 +1,372 @@
{
"hashes": {
"ajax\/download.php": "1d192b4d8ad96501c07f34316fcea5a1fde6d664aaf35426f93e630505243e207a143388978f63869e2d4e1905603e3df5ba88fc7a5f47c8c715bb6cd08430f1",
"appinfo\/info.xml": "c6b32ea2a99fbb0ef1746a3f2ccf42237fff4e2b6633c073de9800752c1365d233b4fab8c0e71e86ecbbe41fad13e79c6d0197d101cb1faf524c2fbd4cec2dd9",
"appinfo\/routes.php": "b210b50a9b31531bda0ed4d21952ccb3c8d9b00dc83fc32cb65375bd0bb7d1006bf3ee8d53054c2f1d73f5bdb65b54bf97fd28d1deebeecea30eb492a17908c1",
"composer\/autoload.php": "958a72a456822370ea53af16d60229b022ab2fcf8f0faf163fe08c0dc0bfb3649d38b8011f5e5b84819780046e1c5a7b92800d272f47238c31c0142aaa59750e",
"composer\/composer.json": "e2abdfc083c6d1cdc93a4847a455bc1d0e71016fac97d100fc3e08442609acb623a14272406a371a168f0614c6dfd3e5e7b509521a434450bda7f19c86542412",
"composer\/composer.lock": "aba0413aa705be0d0570c496a43249c551836824e7a2b4673b51838fe0d9f425ddd07b6c4b95aa74ca549f58e90f2a7d78b51a2a3080749a5dc2e4a46d04fd1e",
"composer\/composer\/ClassLoader.php": "f73af132ef1159370f4da75d1477541c8fd55e82d64e1a29b199e8963597b3558853edd48f703118bb139680e80bbae5cd601580c9f62355f3e749214b40e162",
"composer\/composer\/InstalledVersions.php": "733e68c171cb9e44868bb0f105850fbd0e4f225c67235bf30fb2ac5c3443c6edfb722d4b33aa91c82bb600e937cb6392eb1883694d41616e66969d7d42e23b4f",
"composer\/composer\/LICENSE": "f3bb64009f41a425df5a9bbab53490f0eb9b74fa8d6aaa2f57efb928edc4ffff330260666edeaa04a91fed708c3663371cf01b284f3a08d6698aaef7a23f355a",
"composer\/composer\/autoload_classmap.php": "8376a325fd69e4b9d45c0525493be9521d8ea1bda0d4184a931411f116168a47c86437c4efedfb8cfe48ecd630f7b9cd094c60d9ca810aa8da48089025ef15e2",
"composer\/composer\/autoload_namespaces.php": "5b2571f3b573a778d362b8c7412787b4084c7f27d3f5bba1585243f3ccbb0b9054e68522a22a1ad59ec11097b03a0e343865c0188c65b25f0a97e24e120339d1",
"composer\/composer\/autoload_psr4.php": "ef0190381adae06ca73c67a2be4c703a0b8e2b778562f3094c00df979a857b446fa2dee9c7e3bbe5faabc634e3059e4c26c06141d0fb1e6e522788d804f278e0",
"composer\/composer\/autoload_real.php": "fb52be18727ea8deb6811cdef2cd275d0075f4554228b766bb958e2afb8d23a74ac17f2891ae5fef665036ace243c2c1ead199d1884e72537c41f36983ee26cd",
"composer\/composer\/autoload_static.php": "a090d939565d9285e197b2af9502a57a24a8c101c1c778dd18ef6f7a84dde6f0fd3846daed46012d7ec39f62df5327e6d22159f88605322c58790d97ea9ebbe0",
"composer\/composer\/installed.json": "0a3ed51f953eb945b970a8eb21957ca2beee4669c7d0d9be97b8259c391b60688f8abb78d4b1fae5e4e2ea5e3d8747f4d35f066a2605e9a76f5b45ec3f1da357",
"composer\/composer\/installed.php": "8bad4f4fc9e29d0064846bd5632729d8ba9ef0bdce2c679d79cbe48c268ca2d568b095da89bb259dc34257651d032e0efc94e35216a561adf1452d4fe012d767",
"css\/detailsView.css": "fff7fc7882bd0c3b93dd4d7cb1b51e01c73c083669c6709414d2b8a98a3c37696699b38951d5ad95d594c0b789c5e9efcc854a4bf8ec20b5cc8aa5c0b6fc5df6",
"css\/detailsView.css.map": "3b04317b2a31c3c3759e39868f2a6b56b70d72dbabefc516b70525a84e1f10c337a17911c3a9f402f871da86d66c4d297dbd29ce87cc44554452e8202ddc3943",
"css\/detailsView.scss": "21795e79995a2a2aba6b60c1d8eb7cf1046be94d0b9fef6219ee29dfdf1ee3bb4167c53d39efe496f1d6d9204166e8b75d2fd74f92d09fbb574e13c7a0745677",
"css\/files.css": "58fc537f940a5f62b8ca7980d71895cc33faa8958766ef6f8be75346df4a3ed75d2623afda137fa4531a5512eefe7ff2b60c053f14f981ddc6e64de4b93814b0",
"css\/files.css.map": "ae9e7ebe4dc17e0de1f1fbf1f9e720c4b45db17074e252624fa62eda09917dc6ede6b1def0c34fa47bb2b9f907e106112bdebfd9e85f465380da044e82e891c4",
"css\/files.scss": "96750a50dfac9f83db3e08178704bd89789ce433d88f64d6eca354a7882cd75a5a37caaa94781ee0487454af48ad6d6360f92e75f4890d6dc36c30dc4c9780b9",
"css\/merged.css": "efb58652886b7f2331301323398a2ab7a25f98ac53c24461a385b8aa4d5793ccf49f25772aeedc858957183c5899a53a2b573119827de0fffe95705568504c79",
"css\/merged.css.map": "b98f37b05f0045af40fd7e0a00d98e2401f47cbab286155b9a2403fa738460f4cc51d9832a8c86a7fbd10340b4dcee8ae085ed0d2e2df71d7a7aaa460c3d41d9",
"css\/merged.scss": "f5246215021e65e08b1f87b40461168ebf5dbe356cd143179e062fe5267542eb5e2e2e0492008279ffb46d9234d64d92aecaedbc3466f792c46078bb4c75b99f",
"css\/mobile.css": "2e2b5c129413d68d3ec9ad39aa157853568b041d4f00bb3f1306975aca14ece2a8f0d5c924fd13774fd2640da0ebdc682732a28203ef2eef23930305f4c5d483",
"css\/mobile.css.map": "d42be955733cc9502279b59483fce18ced9991650338ee077ef9f8a8fb7c27f15c2507759fd87889838bb93780f3b9f90002cd0f668cc474e823831ac4f64f6c",
"css\/mobile.scss": "b8e11c337001ddbaec03ec9691be47e5ed169406b7480052984748ac17c77cbe0ed9a3c995c094cdb127e99c5a20a4d56ec761a64e303d786bd01dddbbf04b3c",
"css\/upload.css": "d49f56c0546d3db13c9284ab85b953a57947e777ec9351db130dabfe401e2ddf26001cd2f488d7daf49226f2998392d2c5488dd3b47d43714c65004040e9ac6b",
"css\/upload.css.map": "ac9ef09351d4c5b57fb3a43b6456de6af143ba8b23f98eeb9582f83b7b9ef1f013c64197cbb60b7e7379d9ab68ae28a160ee86e2974c3a0dbf442836cd6a21e1",
"css\/upload.scss": "b11766d5eb063957d349496e838654e172bc387529e6923cfe814d39352b817adfcd8674cd7ecfc4da63396012f89f6e988aa6ec6e596c288016e5db1a9a9d51",
"img\/add-color.png": "32477e0d97502ae81f874b466dfa3a6d7308dd8d15b7276a760445c9c0789c09ab1ac3d0cc5f5901b80e4676ee986658c7e2989b0183f65c71b9adbeb4050271",
"img\/add-color.svg": "283c6ad8610e0f83034064f6c5bee39187822e4e1f71482b87ee7913b59a040b29fa0f79e87de52b339a28714a0b2f41df8b4e2925736f739c2cf88a3acf737a",
"img\/app-dark.svg": "14128815602efb0c3ec9f8b346a8330b76239c993e9638774088b0b01d2c12a8a687827352f4bd264c001ca59e8e4cf5c50aa715ecd781d5101aa6249a50f996",
"img\/app.svg": "fd38168a066c0d3042c9424e1938b366f46785046b997fe5d326f5f2915727b8d5de031a1058da03de98743f9318b8657c351388837e9bce38e588103666421f",
"img\/change.png": "2a082891ff8b670036f134397dc74eb729919737fbc6bc46ec6e52b02c5abf00456ca545c8ae52a521f398c6ba7e49f2a68727b2b66ee352ccc2b6ec1193d142",
"img\/change.svg": "83e05266e50c1514d95049804ce89e74b054bdf70be5c054d612b2fe79545fed40509f37e830f5312682dfeb4827948e24661c5cf3bb93ab8e646f5c57d73f6e",
"img\/delete-color.png": "61c2e75aa3b21b3b0be1614cce07a5a9ceafd6bd4450de994b5938e2175760e4a7bb9195c3cd2a98f31c8e6f85a485c8cb0d34e26930cd239d2be12577daf755",
"img\/delete-color.svg": "7a7552cd69b291cfbdaf09394ed3a64a72ba5b9e47e9a0f41a9986e516316c868db41331c36851f64ca82481f590d82dcecf74a24d07bf04abc2c41a358cf2d9",
"img\/folder.svg": "14128815602efb0c3ec9f8b346a8330b76239c993e9638774088b0b01d2c12a8a687827352f4bd264c001ca59e8e4cf5c50aa715ecd781d5101aa6249a50f996",
"js\/app.js": "b842a5acb9e303fe5ce68a3b8e79d8c85adfb5c58dc6239f3c01ed35a3b942298b5030f06e72b2c8fd0cad28dc1856a3d8f0e7470839acc35bf25c090c2249f6",
"js\/breadcrumb.js": "9f8119a5c7c4ec8b6e8e8148aeafe051b96ce548509de3bed4a4d917cd7f9e85764967f68d4b5b0357c78d1b1453723b51b61fd577f6f49f5c144dff740b38a9",
"js\/detailfileinfoview.js": "ff58bddc899a9fd5b079fade26c32e718ef4f270d3c5a0e8222977472e8d257c1bfbb0670e7ce0735838b3cafc2e17437f54492590d8ecf0918c23a5f9a6dda8",
"js\/detailsview.js": "d1a62736f7bd2fcdf9e0701703b25f653ad58ec55d6c90d1385b49039e9479f0199a11c2e8e3bbc2bc59842f1766b5da2d6931b7292321e6398860f7978082a2",
"js\/detailtabview.js": "e69dacb252e3f5c10941cc082a4f409d4054b7866bec6b0e4959dac8fd021f39b23d5b046b529ba0e0926c6a1755eb5a7de7bde4b7e2c2b1e92aa8f8b59583b7",
"js\/file-upload.js": "3c30b1e481f3913773fb906154b164b47947391b1e01e23d874cefdf676fc8695851359622ee22612b64e2640af56ac2340a30e6d95742bd24d7a9582c639a4f",
"js\/fileactions.js": "13fb3767c57c71726ad482f2b28763e6ccf2696a0084c142f221821121dca9186ccfd8d5ce97e93c9b5415ef2192060f277c1bc7ec02f877c4d0fef85f679f3a",
"js\/fileactionsmenu.js": "aa286fe1a7ec3f240625e37aa16a3b1df7617e9dc4f09711c74b7077a34ca3135c6dd321b48729b5f7fe402e5b22c977c5fdb0a6e3f3b98325fb37c108cb5f3c",
"js\/fileinfomodel.js": "734f4e6fa647b4be6f81ac62b59d03ea17516c52590007c1c7437cc8e8ba732981ea4c8a8f853cfb9bdc45280ad5a3fbd265da9b8ca46b690bd03c1150175d6f",
"js\/filelist.js": "9baa7794a67f6e3a265ca0643ed129db0c55e101f73cfda526b3b51b69ed49b2675a747758c9548af7a1a2ea3e336f99dfbb107f1224d65c0d5d707062752648",
"js\/filemultiselectmenu.js": "fff3aa6f187973dafd78de2d7132cdc32be08e417cd075a11863f4c1b38b4c8c2bf16ba3058eaabd973c8cc01bc3b9e8b9c7fdfc9f0e20d14ef5c332dd10bae0",
"js\/files.js": "bfa11c37ba283b20cab5fb2eb27d854c5e9bcb0af333137d81b0764429f491c2cd47b141029025b8de61f5d2370132b956a6044be6b8ec867b410b4af06c70bf",
"js\/filesummary.js": "9e161c7259ada891ad88a4fee505560a87b786e63f2c1301fbb6fad5340929d1c69a46bba76aae67d72d4aaf9142386a6a6548bb1580e94fecd65437f76dd33f",
"js\/gotoplugin.js": "d8772729d803320d9421d49894d84b93cd331030fe3a72f0124497a401cebf6f8b84cebbc04e73e2046d7ab8090f851fec62c1db88c26757382b41d4580dd4a1",
"js\/jquery-visibility.js": "9ee5b0ea09d8323b0eed212a05c9bc5870e302b41e579f339beb778010222bd5ca1a8f1bd7bb64265f72fcbaee03500697534d27011cca0644a016ef619124aa",
"js\/jquery.fileupload.js": "137e4522762602cdf8286868b60e65799ff1b500f47939fd53ed20b4c0286cfe2659f391096e42e149d86ecfcea05365448b85372e5a141fa07b98713341e541",
"js\/keyboardshortcuts.js": "0d359b87da6caf1f6e8ea9d0e7cb3979aeba3d41ac48c6a52a647340b6ccdf2c4c11e9c308a56eadf089a99090c8878984166076a38d592d53bad244a4c41704",
"js\/mainfileinfodetailview.js": "b8e3dc1836b145729596d7a65fc52552afe40b5c2ca1eff90dccf48f2d58b8eac457b9e6b33c0fcaebeebff81281d5fb7240f196e10289c0b139b149efc1814e",
"js\/merged-index.json": "76cc84eb9f90208e1170ee16474974f53fffdd7fc2264ea74ebcb8329a840b726ff64c9ff4a303ad92f198e01f583b850df09153c931be39f247c0b6eead61ac",
"js\/newfilemenu.js": "dc35b698f8d2b1e43547805e1db5763be38d41c7e065097a89c12c06c869c900f04d6c3db64b658fae3e8d047d135e77593977cad66bb984e053da1cb90a4ef4",
"js\/operationprogressbar.js": "ff141bc93f2d1e87689fb764a385a1e487cb5d1c9139635a1fc52479085857d4cbeff533f899279544cd5a83d96ed16f74d85b567e4b1f20bafcccad16013cd0",
"js\/recentfilelist.js": "42813198d4681f43f536c7b5e91551f837305cb5f325a07261e5f9379df6fec1504118c67797562dd6c8a70f0740504c676dc9343adb8f03f2677672ce2b8f73",
"js\/semaphore.js": "d52348efc9e14e9ff8b7d010e88a8819d56e49ba541aae55bd2d4ff05efe72055f74fb0ae3745156c4c445c669deb777ea14eb99f762b93fa2e33893fe51ed01",
"js\/sidebarpreviewmanager.js": "16395cc123d695fa9d78f9fe4ef9d385307d72f8bc9b8233a0c31a43148801fba668c90aa4f6ba40afab5b8c905abd5a8cc47dfb8d91dd278e8dd9fde727e324",
"js\/sidebarpreviewtext.js": "cf8853667342f8734b827507753b99a5c4ab07d804530d419fab3c5c65d1dbaf26eb2476546ec8ac28b08e5fc3ca7a6b97ef454c5498efce61d00464f22b913e",
"js\/tagsplugin.js": "f0ef0d023e89e024587172f0db2b70c1e705ac362a9c618816470ff10f52d25197efa36eece4c13d689bceef0fa7f62cd2e29b4f54ac1b3931310230399a621c",
"js\/templates.js": "25534fd92c93f111c3b68de6919e98ba457e8c111dd1b5666efa6a7d25997d705f058cf9508711c74acb5ec4864221e721ef0aea13afd1ab336c681d0bf5964e",
"js\/templates\/detailsview.handlebars": "2bdc4129436fec8e09c912bbee10bd336256aeccecceba49aaec43afce3bb96b48ea87c4893ee3f97aa343991dd5821fe40575bb7edfdc99c8952d8fccdb4b9f",
"js\/templates\/favorite_mark.handlebars": "f794dda28b8e4be653121a8a215a849cfe6526c7a99bb4473fe99420631e3ad1fe6c32036379c723d8518b04fc83b00758e78be4aad8647f365339140c1503b6",
"js\/templates\/file_action_trigger.handlebars": "8cecbc022fe26a29b70df8d9ade451bc5a941cace105e88686902828862a5babb166d810e62e00c9be1e0b7014d6317ea080911dc141f88641f337c3e68ab92c",
"js\/templates\/fileactionsmenu.handlebars": "ded3479518e4c7d10813dc59f3ca3a1acfd4cc17050ad5d8343eabffdbbda15d93b10d4af1b3456beddf3870c29ae63989eb0d0c32f9877d3c15096d880f2536",
"js\/templates\/filemultiselectmenu.handlebars": "18a943b4b04024743772b1bd022857d932eb98a9c884346e0c85030e6006a4d2432e38648cd31508727ba9c86dbe8a206159c4cb98edac5a237dfeea1d7115d9",
"js\/templates\/filesummary.handlebars": "b5e3a2a4a5dda6e5a941763dde7749970ee8ba1b053a9ae7335005695bdecd1c0582dad9adf248a5647136e14027221b76fd39c1cdc50a102e38ec44fbc37039",
"js\/templates\/mainfileinfodetailsview.handlebars": "2316c4b96734a0e5e34251c39e1bfda7ecde83e6f64b858da58ce958f481b7b7391a36979517ec043e8e5d3dcd17317f06599fadcf354fe585118a494032bb5e",
"js\/templates\/newfilemenu.handlebars": "3cc29aea796aef5cf394f7e61c84921a1ee78d74e12383524043d31484846a5070074e59f992b149df8b25cfecee88b79c5fe04553a3910badbbe650e319eceb",
"js\/templates\/newfilemenu_filename_form.handlebars": "709b917e2ab7e91fb9ca7672755fd6c764d4eadee6a4fe6431bd77cec0e6cae9e48ec4c6d61066c62d8189fd47322228e3be2e888d14c6e97827b43ddd656ca1",
"js\/templates\/operationprogressbar.handlebars": "11314b97b700606d5c3ecbc2e395b704dfa889d44e30eb9ff3ffba6fe3fe2f6131c36608398835b096ad41d8cc56325b19dd6718dfc3858742f03e339b96cbf2",
"js\/templates\/operationprogressbarlabel.handlebars": "5e338af1192f685a51c2bc39e5a05a2b0b028515d924d63afc87ba7489ce16da5923314b5b7547c8d68c16320e33fad96f0b124aea8d3ffed331b6fce528e918",
"js\/templates\/template_addbutton.handlebars": "aec8c2a0d11fae0c32ac3d4dadaa06092b4bc0a8a02959c3317567c0755573c23afa121f97c3dd340e090c36c78e23f0dc49429779eef837af0fa74c89223899",
"js\/upload.js": "6686c9b1b447dccd2c3741fbf9016d74b9154d542511299790db9538b114014871c3860d9802af3ad35f89c9a1e4e46a47f81b2b9d9e0ae77220131e5ee5034c",
"l10n\/ach.js": "f7833f3cc41bf6f1bb322f862286f60f519857769070555353fd6f7a7883615605453bd4c481f6b5b0e11ecd7f14044df76329305e34cce5aa17fed9daba0c94",
"l10n\/ach.json": "2a46965641683a82e4d758a942990b1f43e6cc43c0643e1381d92e968daf554ba00fff3d11265405447d1d683f216ac1d2d75cc28b95dd495a39f0e1648efad9",
"l10n\/ady.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/ady.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/af.js": "34f13466446e075afc7059cabbbfed62a956c534ac7ff753182ac28012b5cf48dadab41b9b88e2c946eac2f5cf2e5a1e105fe0b24d22f25d9260e84941348a12",
"l10n\/af.json": "af9cfb40f8f85c9ff74cf53d5ed534cd57e5625bc29f701ef275fa79b59b9f4fda91af1cb37342af32e320cae4ebf686c24de169970bb31eb94c9c5b182469dc",
"l10n\/ak.js": "f61a7393310c169bdd14d39cfdec9aa51723eeffa409210be8cc9b4e42e6b0374f857a072abb35a90cc2f2f6ebda7da70c61c0c5e63bb2baf9082c0292b8a049",
"l10n\/ak.json": "81c75a71dd3c04781fe262b6a8337d435536a93c0e7521108b20025090d40fd43dcb2b111c81163c8b718202583ea14cda35a93604cc2b29f6a03daaee864263",
"l10n\/am_ET.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/am_ET.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/ar.js": "be0ee87bddf805c90c1f0dfb472ac2655ab4bad5408c17d10bf9feabfffb71d9a06b7c8aa8447780ad9a5351a9dfae85b1afb974ab5ad7c805d8d239c7c52e67",
"l10n\/ar.json": "cc9abd3a2d6d19cfd96a937a6297ce682c5c7e45ed08ed6269d9028163f168b81d77ee847b44ebfe9840b60521f4f6e29de08a04615a604d25e1cb26795b132a",
"l10n\/ast.js": "69bca40ebab1d54bbd34c5c5eadc3b09379a5404066260634f6dce7c111625236f6de295c0be8e082758abaa1e5ac251041e52d745135aecb3f30cb2b13d547c",
"l10n\/ast.json": "e47da4b5b21e9ba27fb7406e87f537d1aa095189d9eb9d7064c91cc4160e8a99cf0585ba2bde50910f5ffaec395a143e36f49b4175aba534a0c4bd987e71893b",
"l10n\/az.js": "7d1490901a09cec491bad3f6420a243af836623f2360dcdd2c257cf1f485e5550b3857abb5304cf33cf410fa0b350e1265918da9f2acba23b358c2de463e7a4c",
"l10n\/az.json": "d467c484c35987abfb5efbff939843d35547e1813bc13fa7028124304f8fe0b7c872d63101106c69b53fa070b440876e2d032fce45d91c3720802869b7f47ad4",
"l10n\/be.js": "e725694114c6426489725d2841e0e973166ac96e8fc999d9a848a9fbea623a1b189c6801d95e1e52693e72db23209f0113f47483cc2ea9085656bad4cd9cef0d",
"l10n\/be.json": "3a622a21cd3661ddc633f01bbc4a2cfbd3477c8ae7ead7a510de82935679cd3b9a88d55a6f9accbeb62d743fb01754d60ce7cd9e4be9251abb520b6385d041d4",
"l10n\/bg.js": "84db16e1f3f754fb6679dabb433863695317ab8713c1c0ba710d9370644a3ed43fa5872c7f7ff5a337fb4cb54699c3e9df35601eee50600cd44e48314f10ec18",
"l10n\/bg.json": "ebf90fe1346fad37d198f61c67c457e1f3414d867f6d0d96cfd184ee73e8a3247c4fb228c7d68bdfe89f656e954151bf042ef04720a1ce0bdc136c002cfae8dd",
"l10n\/bn_BD.js": "2457f663469706c8f6d6e1f666d6a13f9bcb8ccf99b412006a42ed984411ecb327dee7b5e1818f29f41b135e6a990b7980bb24aaa0de6291aef61dc624377be0",
"l10n\/bn_BD.json": "22de5e5bedda491822a5870780276374149cb164909506e38acbc48a71ad6fd6aac4240afea3ababbb97625a5c8ccf249b2b774fa54aa2bc0fb64756ee5679a9",
"l10n\/br.js": "acd748ea0f37b5e3428f505b9b9353ec0b16247d5c901748e439ba48658804632a726ae992b2b15f14291fc2077b473f7b3b370c11188e4ce75b2a74b423b2cf",
"l10n\/br.json": "0177006705efc846c96642e4faaa53460f9197038b1f323d7f63dfa399e4ed8999a661b3ae1ef594a7e4ea841d85d23bd932722eec5a133f4acf4b37cb1d8297",
"l10n\/bs.js": "db283829eef9dfc786fb3f5a349779ca1b873f8a97dcd6b0944c1215175380c408c7668730bc4ad6e9522c05e6820d52b624a94db4c05d5338c908078f0cb003",
"l10n\/bs.json": "7c453bd97108c8edf0a4fd34ec0ce6544866f4ec7c30c46d0b7d63f2b91601420cda7e8c5cabff620bb0b6c174c871ce24817b529088238a29a18ce652be354e",
"l10n\/ca.js": "3b81f360aa15e53f6550323565e5efa226897e10be1c3c0058df2c3f03d3061219fce4ed27baabafd4b08b95a7529c70fda80112ed85f906ceddf87e781dd872",
"l10n\/ca.json": "cbb779f239fe5a3ad15043939fda608d68557ec867cb549c4a135fc0e08df06060ea8f668002c428ecf07d93142b4482a0b29ca646c801c480e457508d57b5d0",
"l10n\/cs.js": "dc7d4c88c7716b7dd740f406454e318baaaa76c8fea9b1d8e184c476c02d9c518fa8fe9b480fd8c25ead71a438aa37806c998739d1fbe8cf20274077b47f8ec6",
"l10n\/cs.json": "5a76a88838cb5f076da12ad82990532bc44be25a2e4327ee1e4ee442b4fe194974a17b2c711fa4f90f0e380b1debfb9a0f2c0425f26fbebef63573083d0bce8d",
"l10n\/cy_GB.js": "7c2b2a6ce6d1fa909a23985dcedf7b34a56e478a6ad9db56f34fec32d13c1b8429bbd2b72b599a2da51a6306fe20fbfdfdd4a82b1b0a7b565fa851b344fbd817",
"l10n\/cy_GB.json": "8e0dd7bd54f00b54200ee12f0d42712c8658c8e097abd404da8c80e77bec53217aed9d37da687aeee000c63756b56e2128718862727416d70a41245f2790a062",
"l10n\/da.js": "445de87e24901403d70393060c15d533899de78bb18c53fdda5d15f2e3d774ec04c0494abc69ba2fb35f6dc9a8d334897a249a48f14c4440778316c6fe79cdaa",
"l10n\/da.json": "7e0e24c99dea6d7be95aadbdf453a75a0dc8d0437d10c0ff559b5b1ef4143f66722225906869815405202c475246413e91acaa93fea7c975101e876c5364bf91",
"l10n\/de.js": "d52000d352d543b75c0518b8e5841477f1a8a82b30d514cab50e120baa047dd268e6cb3323c23769bc129acaa7ee53adb7c3271f8ed4ef3eb0385b3f63a01691",
"l10n\/de.json": "5e9c320ba8c5d51f3ec30fef6a5fa79bcaf53ff24221838a67d274089cdd5558499eb5332f2bcaf9e89fe0e1a7e9400d7cee277dfd9110587fd570f602a58df7",
"l10n\/de_DE.js": "a69a3d39ed6ac3ae5e81b0a93ccb2f7e9b0709646a611a00a61883afd9f15b7234e1178cc1213a0325dbfe201a6aeeda4239f576390ae28aed36c0b6453c37b9",
"l10n\/de_DE.json": "b74ca268f1d9f377fec864cc2f2d2d0d4ef6dcf42a249e5fced98ffca36e642932a72473c530b32770fe14ad8235930d12f3a7278a72609af82908fd4c511d48",
"l10n\/el.js": "ddeb1b2e216e7d8960ce043d60453c6637a2b18179495d49fceb559fac0fd8241c3e1c7bdeb3326104e4fde924e8ef965a3bd612e29c0fe1260030b773c1b484",
"l10n\/el.json": "76071af85d5a0b3e5f61cca326d9a2bd5e37e0443c294762bd5b47cc4d1d8178bb79f13826802a04e250e15459549068254c7db4afb86170061a9fdb90949b8b",
"l10n\/en_GB.js": "da5753484765e6e71ed8585d5c96a06dce6c35774f7f557483e7a38f90c2c9ecd3c278003ccde2122bcd930e1261c65e87e6ff9acac91f4a174ab0fbc4a04d94",
"l10n\/en_GB.json": "59b04cead39995d0d58eb65459a0bee4072eb0cb872e60d98a2db2e78e6a750aa2c1b2eb85c1c40343451fffbbdfb94abe8c83efa68bfaae7f401df19803a4d9",
"l10n\/eo.js": "c74c7b951d0ac091fec6c3306dbe6070d0d0ccb38f1357be8c4e4a4bb6faa116c45776a21e558d9dc1c032b6c670ad7cb1b006f07c7c3e6c97f4fe9f224e853e",
"l10n\/eo.json": "6e4eaa4e12f9e4360de8aa2a717eece778770d9d4f7f71eb3fe76b35ea6deb48db0f632545697977fc9605b4617e9120e2327e7cc67e864b6655616fb668b537",
"l10n\/es.js": "d329baa6a15d87bfab60e90ddc3ae0c397afb31d739fac0676c49d197e1012b1a0a92f07082e41f3f637ff6dcf3fb6ec631014bc20c104153f615548f7cd4faa",
"l10n\/es.json": "61f94af4d10d7e0fd9b7ef6d4294934ae47ec618df64bce7f63446fdbc383d60fbd766e375d9094f1ce5bf9192b16bf9dbfa9d20fa9a8a4c72ca876338fea555",
"l10n\/es_419.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_419.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/es_AR.js": "88bc022a7523b027a088b3dbf3d366f15ddd1574a9c1ad153e97c3217efe7837368ea741241568662f69383373ec0378a318e3655df7c0189b24f812ee1b60d8",
"l10n\/es_AR.json": "2d1f609b2b8ac0ab267796e0c580e52b15b7ceecec7bf5b320ea91ee53accc92ad85ea68a60b9e206e1552cca3493759ab2ab6dc54adb490f6295f56ddc30eb1",
"l10n\/es_CL.js": "e8184ec0915b530dfa6e23dc726d614a856e72315a4b8cf1bf90561c0a038945d29aa3ea7f7f3b6fd2fae1355c88d8f2a386a762e2761558863bf94e49d22614",
"l10n\/es_CL.json": "13fa1dc57f948c6a24240452ff9cd00ea190ed4b49657f76e93dab79163369c28a2a0c9c63ea56a9e44944104776c56cec79dec8c89e9317192e1cc7e96854a1",
"l10n\/es_CO.js": "2ae29fc223a1fda3d05897880172b6df982e1c6a63253eab08049736b4a500f826d8000d690db91ebb7200649b83a9b8db9611f53cad03eb1d92718159b2f8c8",
"l10n\/es_CO.json": "f9ea3227bcd8249c5c454ca10cfd2b398a7ad067ad606bcbfbd9fd123dda0aa62052648e2f02b5f9a690e2b5426a21bda97a3fd079e7033ca51a1f2b2edb8828",
"l10n\/es_CR.js": "69d39fee045348b050c2ed46cbcd97cb7e987855ed436df7f9aa81f789394ba1041804f7399790d1fc6e7c32bcf0c96c428fc58c57cb0441fe297423da868384",
"l10n\/es_CR.json": "f2722ce3224c0b4b31695d570851acbb734c32390cc553af183898a1bb63fe8b4f5d35bbffc00f5032e10c4e23601772ddd8d8dae36f3655ec0611b58534612f",
"l10n\/es_DO.js": "b3a6af8779ac243c9c9b988f3a54c96d44c42f26e533fda693e25645130e33b6620e193fb83c50251e6866e6b014bfce0b94b51b8e2d0f1bea3a98fa9ebe6a24",
"l10n\/es_DO.json": "ed32ca22547d65b85fad743e1854aad305bc72b962a780f2b62250da3e15fc405189e37eed57234e5de94532aa60376dc1ae65bd421fd90b41d5225d2873e729",
"l10n\/es_EC.js": "e852a8e351c007db550d6424d3182c5d342b6036dcb7af94ba0b3aa75a6f30549269d49c39ff9aebfd0089a577d15cda1c47fc0c9a8d8167a1ae3a1cafcd3cbb",
"l10n\/es_EC.json": "2a029e6f621612dae3a3619eeaa66aad618c1ade729c74c64aab38078e98349ff6f7a119b50be4eecb9d512b42213a360d9b455106fb45ee88da30f5bb2127c3",
"l10n\/es_GT.js": "69d39fee045348b050c2ed46cbcd97cb7e987855ed436df7f9aa81f789394ba1041804f7399790d1fc6e7c32bcf0c96c428fc58c57cb0441fe297423da868384",
"l10n\/es_GT.json": "f2722ce3224c0b4b31695d570851acbb734c32390cc553af183898a1bb63fe8b4f5d35bbffc00f5032e10c4e23601772ddd8d8dae36f3655ec0611b58534612f",
"l10n\/es_HN.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_HN.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/es_MX.js": "b3c15e9279100743e1b3c0dd41bab9872baa87b8bc1bab91bf5da5118cc2af346f6671618b799d278a3c7b2c27f596764fb71a033e6efa49cd67cd5c662209f6",
"l10n\/es_MX.json": "9ae43da5695e21dcbf38e61279015961ae520c9349961d815781f6ebc998555416c629492146cae951485ea00454c7bf4e21027c760330909574b9659dc19edf",
"l10n\/es_NI.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_NI.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/es_PA.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_PA.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/es_PE.js": "c75d6730cbc8ce7aa0a265109a5a7db31878ae0b09d7353aee7dfd19b7cf70da7089fdf657920e2be7bb7cb317006e5fa0dd2c1a54516177412cb295ef5bf8bc",
"l10n\/es_PE.json": "914b8070041ffea15713388e82f4641fef1babd5e5de5bd36da2c552b653ef50ac6339ad6498a75bd8949430b4bbd7889c8a113d4d9e0d4a1f1f7e5f647a0ac7",
"l10n\/es_PR.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_PR.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/es_PY.js": "7a835ff3d7934830527741f030ed1e5f73e985d7a0b13a9ecf98c4767280db7bfe5e9e1169823e2c9188d7784d726f70e45c2e8c62b152d431758e4bafdf6120",
"l10n\/es_PY.json": "3c4d3d853c79b696a84dfa370653f3902b08e9397ba12fd3cc4a73a8c88c55e92c41ccd06ad1adac30ce1c37fcfdbe117da225a061206eaf05cb21860e02fd7f",
"l10n\/es_SV.js": "b3a6af8779ac243c9c9b988f3a54c96d44c42f26e533fda693e25645130e33b6620e193fb83c50251e6866e6b014bfce0b94b51b8e2d0f1bea3a98fa9ebe6a24",
"l10n\/es_SV.json": "ed32ca22547d65b85fad743e1854aad305bc72b962a780f2b62250da3e15fc405189e37eed57234e5de94532aa60376dc1ae65bd421fd90b41d5225d2873e729",
"l10n\/es_UY.js": "c6347541fc06b13efd6df90d66e283f5aaefa9b1d6dfe9e1d3d1b300c139fb71fb21b5465fdf7d7dbec0168ab1440b372cd0b681032ac47ffc5f30c0677b4b40",
"l10n\/es_UY.json": "1e9cbfd23b5943cd74c022fed2cb301fe41de7f908bacf9dc7a1cf02f9782315ea597140b4efc66f6f33a9f6ece48fab8b9a82c8fb211bb0c265c94fe678bd59",
"l10n\/et_EE.js": "6947076816f6ae8a6183272e5c7252ee2c5ac7fa4e9800ae257016a3487016db4ce800d3c2f6fec3aabac8fc1892f5d9f9e458f4ef41366c387555d6b8fef9ba",
"l10n\/et_EE.json": "ab9e63b711cb2062e5cb4dad262209376a4f47cdb1eacf3a76734d722bade1ef5036b83d9b9970bf2e0217b9173e94f9996266b991d580f158197e957bba48b4",
"l10n\/eu.js": "c2e727daa0aa5eb9fcf844fc7d6ee7ebafc2b2003730ab54855faca553b880d305e709cd32cac10fe046ffc34bb9d1b795719c74b699a72d6fe4e5fe9a945fe9",
"l10n\/eu.json": "b044df1a573951436416b18b83689022f344216fd0e25fce00d219378c19e28bacdd01034903b32748428b5abfd7e14ca1e7d219cf0fae3e10ed322873b97343",
"l10n\/fa.js": "a6d8115f9ecf5fbd8e9ea54c2bc5fd77d57b8d2034bbe5553dfa72fe1a604aad684b8325b968c3812d56ab9cda9c92b9bdbd3affee3c23d7ddb9e9a12aabae55",
"l10n\/fa.json": "ff23c3d5eff4bd23e67ae0573c28e1d72718d38525e1dcad02cc8f52d3bb6ca2cd6b766a3c386667c39895254d680edc21132d53f28866daba0a630147279dfe",
"l10n\/fi.js": "090313db4e2c700e2afda8f03656f7ba8387c321a0706aa759190074b02da4341192afcf2f46467de7d3d05d5e431118e221161bfd876c4267b6e284e88009a2",
"l10n\/fi.json": "7690cf9a7165133cf3ec1cbf6990bfdd80421c4acac786f28a395af991a4244c640bd38e7ea68c017c698b09f2cdd1568382aca38743236ddbcd951e25c97bbc",
"l10n\/fr.js": "6d512ba1525a8739329416373994ecf97651d0926e2fe7c5f2ffd6e3d865fbe946f84e90308f73ff82546576eaa500645a0b433271140bef9651f82b017d2fb5",
"l10n\/fr.json": "a3403d4b5605ce88613a2398dc1dfbb1b62380a1213624ad3b235a5d4660e02dbc5c660c759c08fb8c19f5d287f016c3d3f5621ff0bb58245c0063740ae0f6b9",
"l10n\/fy_NL.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/fy_NL.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/gl.js": "6362ed0c5ee1994499ee5d0d0a6ddc38601898201e807d486ab025f4adf5d391c3a6df1ca0269893a381c5165e8153406a86a9d64ca670d38a7d032a55354e80",
"l10n\/gl.json": "e0b5c5ff8866409c0303b79789cb82fb7119b02b20bbbd9c502fcc0a39ab96936b286c857a46aeaa899ed13b9081a04201d11f29605e56971a5d3d3533579544",
"l10n\/gu.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/gu.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/he.js": "d1c33752038a455ecd2b8e56cb250b5b7c6256e2f5577297fbee2173e95ab57e5d916a3d36421cf36c0db86c69959efafbb872abd1cbe16b5b8c54daa1e60a24",
"l10n\/he.json": "3c4b27d909e5eff3f71ad78095f09826a1093ac06bbdd774f4d259f79de34dc32947d2f4f04379915a21be5889f7e9f00477539a2e149d74dc3b3f6980d8ef4f",
"l10n\/hr.js": "ed33e67c131c3878929ef6b13b656848aa690cebb7f318e28c7cb47af8eb0b274e97c19a3bebf3d81c28a8d053bff39c1a0651b94be18bddf7c15b30fc9bbcba",
"l10n\/hr.json": "435c23e2944f57242cb17f10eed5f017450a3d8226dee73037fb6d17bc69e5339651ae914e0d117f8d21a3b753330a0d26e6584bf9116081f8534a799d7d49ba",
"l10n\/hu.js": "a193a12d3a2fbf17dd368cf1f508ee71cecc5d93d372a0ad1be2d7499ad3159da4112ab2a9ec5df3cbec9107326e2daf094023098c307cc94dcc3d38960ecf11",
"l10n\/hu.json": "3d901f2e1ad5a3ffa9dd9804333e3e373716fe0854de2eadb8ff37fa74e79cf1cbbc50e1a3b2b32f1053bc7bbe716725f28c467669be31f0e9a1ea68983aa505",
"l10n\/hy.js": "73bb09378ae20096ef04c5b9b10d9bf5f4f95b07cf2e0bb47154f96d4d0b7f7d9383a29d6ba649d6dade507a0849ff3af6a0d481758561a9949320160e406006",
"l10n\/hy.json": "7ba674d1ede45ebf9df391bfd66e9614f93199c72282d82027eda4ab3341167beb6fe000f60e1c2ea457f12b60ef1630552b3c497d755389a804a37f629fcaa4",
"l10n\/ia.js": "b8dfc9c0e1f2b19792b2743a4e7a6c01c13043bcb62640a6d21fa3ef1e467991f52414bfe285f249de6d155d9548e2b7bc8ebf8c667a1526fb891abc99f1bec2",
"l10n\/ia.json": "a23cb1202a376995dc9ff79d6d3eb37f855fd232422bcd0d487c490afba41868d25a5b930d35fffa30cf992e5848b1b7c629b123e4df27e3bc1f36875f590ecc",
"l10n\/id.js": "fcb32ca8ee1972b8f783530a8c3cb2dc95566f07ca56011583786d0e97dc6152b669ac203e34756bd82b3c778b05f1097c45d6ea57ab595a90f084f4075ab577",
"l10n\/id.json": "dd1bb2752352bac2aaa5b56fb9ecf51be94e34907acf55131e30db7515252598040bbdce267bc64e5b54bf6c75a785c43ee2a07b47f27a7e2c137e0b19ee87fd",
"l10n\/io.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/io.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/is.js": "36d6e8d15b3676954039015eb2039a49aa1b344c9e8a97427599a393c137112e2482da548db2a7722ef2cabee911113a046e9c39e1d5a14778649ba3ee1b9a19",
"l10n\/is.json": "33b5bd32da15131dd96bfce3616f971b9e8e881c8380a961ab4c7fac9b122d85ffa06eb1207ef873adb9366c9a2dd4448fe7ae1f067a78ff1037ac0a8f0d3855",
"l10n\/it.js": "9b28870f58fe1c41ca31fa41c036e01df7ed59beac3637764fccd581f1a995546a9c658a76bb169dc1f212ad3544df9ae1f702b3d7601fef0955e5ba5c0711e1",
"l10n\/it.json": "5df2c8a8dba1bba9f59217b7119eb99d021dd024d85f438155bd6ff46ee7d8ba95ee2fdc90d8c282a96024473f95da0ae67c6ae8ab686e9b868bce8af2c1de42",
"l10n\/ja.js": "d579c95f6e6b2803f90cedd8ebcb2f206cadfe8e5911801b89bc43a0e6de71432f5f3df5bfbe157087eb33b22adcd310f9802ce32451d80923426b9f4425cbe1",
"l10n\/ja.json": "1fe76559af9a5f4027d155be4d80bf1d36b99592f2bf30e03fcafa44f86893fa2a92111e029e688daf08c7246ff4d73ff4677b655987b8db76eae428de36045b",
"l10n\/ka.js": "ef05016630ca95449171a3420c594a4d8484b1423c97821364057414c3dd5bd4e434d928475a7b731588eb1466b0aa0936dc6e7f8dcafda3779fd604ea4349b8",
"l10n\/ka.json": "255fc522f23cf0b3c6cb972ef0420428d981f76667c102beb8c72414aabafaaa79a8260a3d6d89983a4c5c2b4b7c64bfc46a750e6449720b7c227179465c35b2",
"l10n\/ka_GE.js": "e57fa84b1db4e7ccf558c1ab54e3ad3d8ccb5aa6c18e337309bf84154f3807de810b9c1fff3d8e6baab7f9a883cc85117ef1b314a4cd8a941cead1e4d98d5458",
"l10n\/ka_GE.json": "1fd91aa2cfa1e01d8de5c0c20978a4930179f4d455a0f13ddb3bdb32609e6c6f4f50554e85b102f1b00f65aa93556dde8fc01158c7429761378de820a7a8df9c",
"l10n\/km.js": "a493ca542cbfe1694576aea51ffc10068385551b0c162de7c561c6751693881360ba59365b090408b4e571eda41af8e190cc9bcec16033284fa81112c80591a9",
"l10n\/km.json": "3cdd557459be0b145989cf0e1acd924d804809cb87b63a93bb81b7ea499e5df80c0ecb08f0a1e11360015e776fee82cf41d5faa8f8148d381ec11ce1b2c6cce9",
"l10n\/kn.js": "62f150807e79b954c9caa72386d3b50658bd6556aa69e552e1aae64424e469e74f6cfb233c37cfcdf284bb49cebb5f7655387049b30ed47c299aa8041a8bcf9d",
"l10n\/kn.json": "e0aff8ca5e19b804e48d8938d16e89b546457afff62195b3eb0cd01b16539dffe57bbfc9e85547fd34713735419ee3264b5f0843054824b3f37dcac8d087891a",
"l10n\/ko.js": "c8b658ad90f9c04d28addd51412abc9d025966e8d70e7c1b95c53ca11b64e7b42e92eed145f9835391c3720aa4bb937e1999f945ab97c353b679f71ebf0d86d5",
"l10n\/ko.json": "ead24ac1cb22cdb40c386765839eaadeb7e5ce783d1fa4b2504232f92d509b06b1abbe395fd38606454eb1cadafc27eb320cb75bb7bcca1b96414232627ebe14",
"l10n\/lb.js": "cbefc1860a550ca7b2e3eef41b12620647221fb22978f38a7a84c805e169aa77967f06e153f7564f871114c8795b34a6347a3d327d6060691e52030d268a7079",
"l10n\/lb.json": "c7d57c1ae44642bbccc2be9a9e72d004df3cba8a2babe0ddf60dbc2e45b9d771f4a968408bb90d51e1bc9264ac89ec82599f4206aba190fe3b897dbe6caf3bc7",
"l10n\/lo.js": "6d0b03c5ff36ce50ba66b0e462ec7516d440755fb2c506ce58cf8358c5b9d58d541834d3cad23b2f71127da1698d26ff6bd082a01393190aaa530ecffb2b7546",
"l10n\/lo.json": "68b43785875044b12865c73d5fda1bb5133580a1985aa8752f5643a09ba2fd5765d4721fb8d8d63a0ae5f90db0e0870230e79ee71229c6a5ee48e64c35024184",
"l10n\/lt_LT.js": "352e09a4dd50bd258d848abcb26bc6338f11398e998d70b5e142c5b983e8972891f2e826ec16d165c3155e6de8f4aced5dc4a7d5201ba034bd080f57a89da940",
"l10n\/lt_LT.json": "817df7bdbbe5f43d207c117ac47e5eb0923014337ecd423ae7b1e1894c54d1db155fbe02e6480c32c6670038cf56306dbd9d780f5522df7f5a6009602c5d0bd9",
"l10n\/lv.js": "2fba18b38cf6536b52a1bd8015dceb72da2a06609dd4219bdf3ca351fbab8042d8fe100e5c4d41e66b8f866d2c6fb351f3cfb01534b9f77a4101079c39972825",
"l10n\/lv.json": "1f36ebb41d7c18b343c1c8f9cf8bf47761d5be7aff9481dc16e6a0888d2878e5b7920cf883cf8d250f08ccb19286fc93a3399a6154a0c53d2e3c863a2a032bc2",
"l10n\/mg.js": "f7833f3cc41bf6f1bb322f862286f60f519857769070555353fd6f7a7883615605453bd4c481f6b5b0e11ecd7f14044df76329305e34cce5aa17fed9daba0c94",
"l10n\/mg.json": "2a46965641683a82e4d758a942990b1f43e6cc43c0643e1381d92e968daf554ba00fff3d11265405447d1d683f216ac1d2d75cc28b95dd495a39f0e1648efad9",
"l10n\/mk.js": "60612e5b3eafd3ae596a7e880d4b755e93050dd330a9e865d083d5ca5d395cd6545ab24c2ec3c07f713f93ee19b70b0cb727bb4f4826a62c44a81fb1bf1e45de",
"l10n\/mk.json": "7b580b3b39edb45cfa4462b011b8302edc0e6253dcf90b9e3167df8d1264521d191b5fa52b15349266b7278f0bcf4189541acf8a84b1b116d2cc1f20c058a606",
"l10n\/ml.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/ml.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/mn.js": "97252f603e0850dcd589f28ce16385883585b1be1fc8e6c6afae602604cb69213de6dbafa3a49c003e18448da30fd89fc42a94adbbdd6f8a0521f1ce4f1f3754",
"l10n\/mn.json": "87234aa7f9684a615f1bc7eb2be8a2ef1489084fe47ac4fee7d64539d6d42a1d2e54cd71d3c3ce875d79c06a4d192dcad547ac7709a183ea9375631670babab6",
"l10n\/mr.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/mr.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/ms_MY.js": "0a121de6b24d4ef5d45fb9820c50c635aa46599333926ae53e8029d9f9903bdc5d45b4ba6a301ed970192460cfad4ba7902601ba3bf2362088850e96cff8cec5",
"l10n\/ms_MY.json": "1da6bf7f2fb0cc6080a00fdf5fa816cc3fd9d256da77f5f2e44019705c4d79a8602f7cef795c30273057bb2479f5cf96ef16bfe9d67d768380431f7af4cb5ec5",
"l10n\/mt_MT.js": "11fcf3489e44ab63c40fa44e155f96980d0f6c985447e196d6c3b9e16e6e803ecfe2de3621f31444a913b23c5e8f420eb82b616f8dcbe7ec59db2e895df59762",
"l10n\/mt_MT.json": "6e3b4161f622b1b4eda4e08911e0a4269c07041fb950eb60d4b970b1badf5e1a2eb849af63d36cc543769ca4d6e15f57b59ffc30ba50ee55ad3c72d66e760eed",
"l10n\/nb.js": "100352d402bd7af00d3045f4a838a75d133b9705de6918288b841f7a7ef157d073776f8eda996ce1802daee6fbe871e58a2e4ac246f7c651f19c2c8199907f06",
"l10n\/nb.json": "b95b8dbad976ebfde3d289ef756c88bde5046964f82fbecd71f74ef7382f054b88b06e0813c479c0c5fb7b0e5c5ffa386c4c962e3da386989650e06d68f07153",
"l10n\/nl.js": "0171a15e7bec43feefdc15ce76793af9fb60b767590870a08fa6c77a3343c732aed465af20df9cb8dbb71874b5522ccc558aeb11124450b884710d55f74543c3",
"l10n\/nl.json": "9122773070545e2079bc356aeadd384ae3a7239c10d0c123c03d377a5fbbde0f22f4159542fb93a3850d3b40cee9955e0905d7df32304b07f8d496c60fcf2cb8",
"l10n\/nn_NO.js": "b037214217dc0f84d607ba7c074411211dd3bf7ff9a8ec45d0412cb3c59c40f487414841607979d9fc56d112bd4f8cf571493ffc86484a4e39730adaf09e7005",
"l10n\/nn_NO.json": "49ece3b55875d5afda07688fce03848ad1210f2749fcce4af537e2e5c1bc23a7ffa547ddfc91c0dd1801c70dd9aac4ba55e03b9c22343887acbdb926f1df1117",
"l10n\/nqo.js": "d9ba6fb2a6bdc5a0436caaebb9266b124ea4fbac3de4e2e220b8ffbbbbc41aa9b0c92412627c185f2fdbee3150fd24a02545b5b8d20f25f04aa96a0cc1441e84",
"l10n\/nqo.json": "6b0e3fcb5c2989890c2190d27d7d751c2c2d99f29019c017722a0f4155963e9a896e840d21cf3aa93d34a094150207a5def61b734d3e5f300f39055c20707bee",
"l10n\/oc.js": "1572a5472d8072318ece85b7df500095e000e9960e4d4cfddbe455656e458e88d69c422c2d23b098f147ef22d3a122e319edd6cf8a2aa67c1b07b33ef0a94e1d",
"l10n\/oc.json": "5f79dc6844a686bfa871de121fddfc5cef48294709a31640d230b192d65680270d94175518a2fa51a22a3d256eb0803e0ead0fc1a0eeb3be4adb99932797d446",
"l10n\/pl.js": "505cbed4b7b2ad4c108b593b5d3c4a18205acd6384398952fed0466f10f8018b402573dca163cdd9e0a20f34a3758f2ffd9cc8013d3ff4784ea0d764453c1412",
"l10n\/pl.json": "ca2d961fe68c7428d43dd87aaa338458eeb9a5e377305038215f35e0c5502c0a096fc6e9c5cd32c126cbaf6bb64558e8ab4ae25672e32e4afd9e8986e3e927d0",
"l10n\/ps.js": "4a3479139a72692393a691e8b442e46c7a9bee59ee444188651602e54d203508259cf1aec045f1d8b85e4d2821daef7bd842acd66c630af4b826ddf7160b3b81",
"l10n\/ps.json": "f30243cc880bd42744e29cd78c9cc81d134e94b421ee0a8254c40bb979a34551766b320d19d4735f75a3e29866cc7d6fdc7e4355ddc203d161a4f007efbdd5ee",
"l10n\/pt_BR.js": "45fe764d732b4bcaa727b247d552ee1985a5a05e4cef28acecf36829c46719c59d009b763582edbc9866aced34be8d2b57d2dfec57ef58300640d96c2e59c93c",
"l10n\/pt_BR.json": "71e2ad97b7321c56df82700890a133c3bca8ae066d629ff8d12ccb3f17fc8c16476ab147937b51a7dca30bbe1004200a56059734b75a54162e2a9498de886c98",
"l10n\/pt_PT.js": "0c00c2afdc3f55cb92bdc3ba33896f63f1c2117a0bf1efbd6d0a085b648e5c6d748ffd1cb23ec5281426f591358a7cc187e5b03e1e27549b19c1d2882e34b979",
"l10n\/pt_PT.json": "ad4f7f533f168652f4529d34942d89f66ecc8df6ff8bf61348511dc8a19e99ac711e1a3c01ff1a89af2604b6b313709867a0a7eb9efdd7d6ac711d460db9a5c0",
"l10n\/ro.js": "55bfca095bec44be04e70342d0a7484092de58cfdaf282b386c0e85d7fcf546e28fade6c2362fcfcb836f20a5380cdcac91bd07d2f3d43228942cbced5a82af9",
"l10n\/ro.json": "a8f2e20ca9dee7f2a5a11c91835065710f74ddbf25574340c874ea0b1f678b70b8879185661e237246ec33002749a59568e2744fcd4e7fb1e37b34ba514131c9",
"l10n\/ru.js": "9c6f7afe653db80f19f8a1f8ea8ed23823684912686b86a317b4f834479f8b43639796870e75304d7e5f55f31b4f9be5a89f08ac6683ba64119b25704fa7901c",
"l10n\/ru.json": "d5da20630056a7ea4de7322f850555c89be2a5f21f8134909820a261cd55e88dd4b245ab09b5133c9855b50baac8257f9ac5da7107fd02564db6408ef5a659b7",
"l10n\/sc.js": "84f23cabba1f4da194670fc1e829827198f1bfdd29684c3bb7f31e3a8cec4de487903b7fe3b4004507d8c6178fe57921565a4faf85f2ea8d3aaf534878b566af",
"l10n\/sc.json": "ed20c53e469d9fa3a33f42af67acaca93110bf5080f8174f5c0aacc843d0b54f1054cc4c4614c83e2963847156e44d4715d6969deaf2612e8d75c72bef379ecf",
"l10n\/sk.js": "6fbee65798f13a93b5e8f7e45d862ba9694766198bfe203869073db521205690d070e76219fd24600162c62e1a8c229e755720d649371e72dfa72372e470695b",
"l10n\/sk.json": "ddfca23953da5a99c34c03bae86a2727501dec3f6ba874e315b276c727b9a774ee2094d1f639e45c7790ab8017c540833be31b1c068df6b68da0bd0758554b7b",
"l10n\/sl.js": "21a2c2435b2a60ea66c39b8067cbf66e90a6fad0d5029013bae8648954ba19373d214763b90792c77e4f5b71653bf1cde4c79ea63f149e0f4f85726fe43aa81e",
"l10n\/sl.json": "068afa66a4c616315fdda24674f87474b60cf604c951ecb083161a51bf18248f57cd93353e22cfdc1e64264e537facbb1bd64d5e83ea2ebc2f45089388d87d4e",
"l10n\/sq.js": "616d2a6cfadf375b61b8ffb06ab555fafbf3457c7bf193312433636a22de9564fa8cad9216227a28b03d254e398b00477d23d7aa4ff439b038658c4858b07b95",
"l10n\/sq.json": "96b072a8f142cb56d5b69f21f7a7868640a5250c8cb875a38734a5503d350091af80ab46255f63c8e4553bee9827fdb123d124fb186d1a7e25cd0b832e0b9d26",
"l10n\/sr.js": "83cb7f954bef6910ec90c22542ebae83e457c1a3ade2c822448cdfbe5fe859f1b6d063f65fc84c786c2a55e60566135121de098d11e98e88d7b32e69867e236a",
"l10n\/sr.json": "873d54fd43d02cb5af4c7dad0765097922407bd99d24bbf3bfbed2c713e7a53b18c16805cebbc89501dd2bfd7c58922d17976d2dfbf51cfaa295b1b8bd57e3ad",
"l10n\/sr@latin.js": "b0f5d295d5f57bababcf30f785b5f3b08552149a18144dd2d80bab26b349c8e797fc3569d895c8557d4490fd1574f5c48471649a893cd7383e13ba38b45ee8a7",
"l10n\/sr@latin.json": "9354625483d142368c13a8daff4f054cb8b9212e925c1313576aa5074b22e78fbfb377f2d9e80fe7864125e5b32ae3a165d5e2a9ea56e0974445d08c9331eee5",
"l10n\/su.js": "d9ba6fb2a6bdc5a0436caaebb9266b124ea4fbac3de4e2e220b8ffbbbbc41aa9b0c92412627c185f2fdbee3150fd24a02545b5b8d20f25f04aa96a0cc1441e84",
"l10n\/su.json": "6b0e3fcb5c2989890c2190d27d7d751c2c2d99f29019c017722a0f4155963e9a896e840d21cf3aa93d34a094150207a5def61b734d3e5f300f39055c20707bee",
"l10n\/sv.js": "4d4bf30c8f4715cbce2a8f8962d76ecb2d07754f25cc4bff45b1fb1164cced29b66ed822ed6aa2c62823bd530bfa42203669c6a9ee506df777947daad830fa45",
"l10n\/sv.json": "fa8dd67376cf221fd23bb8eaadd526acbb46fdafec0bc4602b463239916083bd5661684d76d2b0ccdcf9c8837df3ad684756667052d501a835c34e376eec577b",
"l10n\/sw_KE.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/sw_KE.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/tg_TJ.js": "a40954bb6233ea1f0171fb0b1c99fd8d011783f23bc6f9f4817c08a3a5df5d0f5113c2f3d7128534ec3bf4a0e723cedeedacbaecae1dfdecfd490ee6a24ba04f",
"l10n\/tg_TJ.json": "17bb226326509d39f8eae5b3e6d2d1ee21a82a1bc8d66d1177f261729097980f8a899133475837cb603377b8907019190225ef3b05f4dd3151aa25079e50e7b0",
"l10n\/th.js": "6c3593b7dd089fabc2756e7a39e43f08b00a910164ccfdb2ce8285d1bb51f4fbadccc904dd47f339b05f7812a9812a367eae271dec0171d07f4a516f11a1e2a6",
"l10n\/th.json": "d06b66b50ca3a587a88bdcecd2d04ccfb3116114da920f2a7b83771f9475c7b5c10b1b0ae0753a669403e9a4c089a3b0b2112048efce15dd27a45533ee7da385",
"l10n\/tl_PH.js": "f7833f3cc41bf6f1bb322f862286f60f519857769070555353fd6f7a7883615605453bd4c481f6b5b0e11ecd7f14044df76329305e34cce5aa17fed9daba0c94",
"l10n\/tl_PH.json": "2a46965641683a82e4d758a942990b1f43e6cc43c0643e1381d92e968daf554ba00fff3d11265405447d1d683f216ac1d2d75cc28b95dd495a39f0e1648efad9",
"l10n\/tr.js": "e3a8ef2cf3aee57205e8f6d2d15f53c8d106f6a827bc3e6630fa71bfc77785eda29744a5cb174f215cee6b957f445730cfe0a4e67c55aca0a9bdab17d4d8590e",
"l10n\/tr.json": "bb9195c52bb1a883e679e90524baf4a3c42936d53ae392710555842c75bf44c911b7aca728a93e2afa416df7540bb987d1925cf44b76cd0fcf68898a28bb023c",
"l10n\/tzm.js": "833b356f081e4d4827c634bc9d8899a777fe85a2d914bb20112a9abee9d9484def19d140ffae8ae803e4dfb616a8bd0b5ce7d5d18de506f404904c93637b1d8c",
"l10n\/tzm.json": "88293d49f3febd10e3696e5e2c849144800dd043aec301ba78f3a7bf991239af38ad4802a7e36e4145990f2db80136317975040bce0bed4026803fe75aa8ff81",
"l10n\/ug.js": "bd630f671c77b46704eccfff4a59c3ff6d857000b8d6ffac0555e18b0ed352952328f6c2a7d568f74c4df6c7b18efcb43fb24149d3222c4ccfce56ee82ff83c4",
"l10n\/ug.json": "0cb60fe5f18527a5f534949587f990aaf720205891ec449800cbe568b9bc6f1064e125da4e1dce07c679c0db0fad40347eabbab4020ed4f8416b3557fd7a488e",
"l10n\/uk.js": "e98dbfd62a14a7a7039db619bfc1479985ee1549066d420dd05b1504f1462287c74018992924029f15746be3ae72724b9f09fa1b62caf4b1a5bd42445ddfbb52",
"l10n\/uk.json": "c92ed1e4ccc9d9855d8554ea7944eece3c1b60c80984ecf3648777d340d06dc3d9ebc9c1d346f2514bc10d1a908166b679a6bfdbc568f8f47d975e22eb82d410",
"l10n\/ur_PK.js": "6551647175bcb05709c2bdf8b9588832ec4434000cabec4e29865c8016f85188ef961a9fdcb949e630ec3b846c4ccf0fd1458adc32d3db6a0d26f97a80b14d3b",
"l10n\/ur_PK.json": "861f2d407ecc0b80ff3624049547d74d278fc5e22df752981ed62be0cba8e4172c9b5f6cb5febf51a0029d6da1b4dfa0c53c5990d18594f39495b0cee13cd39f",
"l10n\/vi.js": "349bf21cc9cc51604cd0d2938eb389d3a7eae2e8fd79528900952aec83c105bde6f87c76e0a27e3be70c99c6b16a9607e976d8f59b9d6a247692fa1944407458",
"l10n\/vi.json": "19831e2a52cf6e6af4d211b88e54c214d62ec63e6940e2b21c279f2d5b6e8a81f1b8164846eb8ba7f506fc50a3ad60d6699c94545213e9c7fa50d9fbb3deeb18",
"l10n\/xgettextfiles": "822f50b4b5a608aee17c95e5db400db4288ad08a555f32d55903001bf0ebf910f83571718071dfe4476f5d35fddb360254fea1c3d4bd2d98e59bde7220242793",
"l10n\/zh_CN.js": "dc151d863bd7498250c544efe5af3c1436573fe083e35673c4b0be0b2a1d6ed61f40b1848cba3679b349c7e9b75b7ef8c51d50646831357ac4652648f79535f8",
"l10n\/zh_CN.json": "26f7c458d05ecd5159c96e095b9772de4e612c3e2e462f1efb0d536b5c1df2960795830151a915f83da778d9f50bad0ded511db6ce636aff34a787b0d02c155c",
"l10n\/zh_HK.js": "3f309d2d07715fae2a23e39fccbd0ff296157b8fdacb4f880da9b417bcef822837df25d3efdcf063c6a631409cedc2a6e1f3239bb380ec3ebc7dbeee9a578d80",
"l10n\/zh_HK.json": "05c839068352129bc11534d1aa43ddb6f7e70fed1ab6578e981ddf0630a40008b44e0bae3bb40395dd561414e68c531396a522e55891b9248e6e1e1ce9ba527f",
"l10n\/zh_TW.js": "645c011d307a41d963448cb9df94e0326d4dbda37ea2ab696166d2314190960c7ad8503dccc21a9d64f369651a72273baa6d3819dec5b5d0b30ff4c7728ad8db",
"l10n\/zh_TW.json": "d2f2ac0cd9fdc4f560cea1f888e49c436e7cfde9fa4b8382bbd2da76af14849ee207ef27033eac01ec2e9a189e39dd4eb4c675e7a940548b9598d45424cd6214",
"lib\/Activity\/FavoriteProvider.php": "e14effc123d712e1b1c0569730efdc093150ef181e6d2ab21c608505a4883389101612903dc8486119aeb46d58ba2ea44177f23105488b5c86ed17b9cc0166bf",
"lib\/Activity\/Filter\/Favorites.php": "71a14b569f9bb5b35e5ae1370cb21bcbd6c4ba085e01863f2934a2abaf11ff18ff14ec560a2fadc95e840919de9a16fe6c1a7560f2dab80d0eaad89b7049f6bd",
"lib\/Activity\/Filter\/FileChanges.php": "46ea987c7d44732ed07775a70ec231ff3a9ad24c6143b70042d8de5e884e07b1ba0494d45cfe5949bbf4d695d1e88216fabad8a06dae27483508197df35dd0b0",
"lib\/Activity\/Helper.php": "9b59c8c3546aa0f236f48c451b6157b77da7550e6a3377264e5949b2dc6038a907db7221d21f32581383d0cfd78b08cc14ed93a3dd47ce0acb117e6b7357af80",
"lib\/Activity\/Provider.php": "a90af74320888971c3fbd49578c26dbd208376d84a9d6d0e744448f6b410ee7362e5ef7b602084eed9eb7cc95a28fa48e0cd3d8947a5e8f5f16b2d03e42259df",
"lib\/Activity\/Settings\/FavoriteAction.php": "0196cf9dbecb9d0030e7a3bbe746a3bbf8b9963091800a8e9f7351da6bbc08f17b434a66f44f96b839f38835c703a146eb792d6f3fd45041edf120302881dc35",
"lib\/Activity\/Settings\/FileActivitySettings.php": "6fbe53f8696bcf76fd3ac77a2944bb94282756030565f14370b1b868555434b8317ac189d81eb67952a9e939bb0ce923f8b8a137471f68bd98abcbd0420b9246",
"lib\/Activity\/Settings\/FileChanged.php": "923a95ca34efeeedd48d1046b51788f2cd885d7212126dfde1e4bc7d92896f8c9913230840148c9e7f715283efbcebe15a28692f921dc927ecf20270acede675",
"lib\/Activity\/Settings\/FileFavoriteChanged.php": "69566495859561e653b596fdcf59b8e759f47e597e7ede4a0e08c4ce9b4ec79f737b37c8f0b8121ca5f529f17cba590a43a8a48880db23fbc243a53b2ca8faf5",
"lib\/App.php": "feda50af528af0f0696468bc163360751565b4d89dd484d1941a9d27c800a97a6a44ef00b0ebdaa93c354cc64456f4c7916da1e378ed1119f45e3909bf7fed27",
"lib\/AppInfo\/Application.php": "d109ae43ab2a5879ee2e08551f3e04fd1c09c8800ec3f5b9fd1647b4fe86eebdc535c08bd3eaac995b1097bb68e1d00ad33208cf884c777d2f55bde62b1aa0fe",
"lib\/BackgroundJob\/CleanupDirectEditingTokens.php": "63b2686a0fd0767c90edd29e49a100ed075800642ba939773ad9c6018495ec4632dd7ab3aafac9a100f9a035789c810cf52cd2e7064de512fd43147f3d7b1938",
"lib\/BackgroundJob\/CleanupFileLocks.php": "a4ac7100eae7163d475feabf1d59441fc02202024af475e4d62c94040ea6b385e201326bec8ca1da9772085185493b803e5483ab0ca293a706c7a75ef653eff2",
"lib\/BackgroundJob\/DeleteExpiredOpenLocalEditor.php": "a5d44a46a5b0918ba6370a401341367236bbc3ef7e38895069ae60ec33d141b5956a526bbd07bc95b207c24ecae73c7309729908df34cd624460c065c3de1d42",
"lib\/BackgroundJob\/DeleteOrphanedItems.php": "1f1079cd13f6c61751a37a27edd487993fa2c596f1602d41f35a72a01b82e0af49d5578918dc9864aeba464c0418c70c6b3884cdbcf8da63e09e4a88349ff514",
"lib\/BackgroundJob\/ScanFiles.php": "b17cf9eb7973a339fab0319d3c87206cba73babf60e2a08637125dc3eabd27484bd730ad7cd052c7de2a657794ae2fed181ff68af25b0d27e1a0fa313b4c49fb",
"lib\/BackgroundJob\/TransferOwnership.php": "153e609070673f31edecd48bb7a571a914e5e3c9ccc8f84f3f9622bf5d8d80d73010ef49c331c91207b101c2e81a89b9a2be6b5373dbd28ed77333a9bc3d5dc2",
"lib\/Capabilities.php": "af4f1764f0bbce6fc03f696409d5a2885c4c739e4427c9752b25f5ed7b95256a258af94d1e67f7d5e38ef08fdad461038e20e5398a4e923711757b9d21db86a3",
"lib\/Collaboration\/Resources\/Listener.php": "c54d63b7707b1884b19a28fa0ae412c71d43bc03a1e558a1b2a4a29ef6b7665e64ee1c381848feedc4e151932e3caf2da56ce3f97856f77650f4e75c8f43c33e",
"lib\/Collaboration\/Resources\/ResourceProvider.php": "e8ef14234dfa5ec33bd2f821daa05540ae6ea11e75e8271e145ca7670e5119055258c859952235504751f3687808d1765ae6d26feb4ff1d6c8d9bab244ebd6e1",
"lib\/Command\/Copy.php": "6f0b9448bb39deb183015689d8d947f9785c80190294a5274ef6ba880041c6685f2f42852bd16a78871858862b9d045eb709f2f2be3e6b1c583251a9c28458ae",
"lib\/Command\/Delete.php": "c1f8103796d438b2925c32e003012f664157d684a1aa4f4ba776e7cfcad2d116394475d59b94f30938a667b132e4a8d8e4fc8724d7eabb8da4db74fb8eff3fce",
"lib\/Command\/DeleteOrphanedFiles.php": "a21976b8c31d349b913d59a92f9dbc9c99fbc8d76a8ee3f0b2026f84c484f080c3201717cd8aa1031b314f9ca1fda15d933b6822f9acea0b4109514729018b91",
"lib\/Command\/Get.php": "48e7c4876fed0fcdfe75c08b1fbcdc37a32113f096405f12ea27e5bf5e4aa8201c4f0acadb509426406f4b6eb3dc81153bd68b7d74645d50c745542857d2cc73",
"lib\/Command\/Move.php": "2f797cde8e70a0f00090787570227e2df0d4098a4a795ade431576de5866498264138d555a4dbc4d84a76e121a1e119c08e9e3d4d2f4df69d25e2493269d896c",
"lib\/Command\/Object\/Delete.php": "a50b010ed5c18f9692059b8f5bb38812c3729c364b021ae0f6d1037ce6adbeed91e6523fa2fa5e5d82e686161cf846f3e2a366265f90f74f33d59ee9c7680d1e",
"lib\/Command\/Object\/Get.php": "190f289a24b1d375cdc680480e306f1dbf9066a9b26ecbec315483e93966d849b15c744c14e0072b5b58f5fdb749bfc9127040b0d93b9ebb53c2d2989f305764",
"lib\/Command\/Object\/ObjectUtil.php": "05f75329baf8c93c8fc155e4ee51c30a0337df62fe1f7cd607604db61919362b7a6e5d8c5b848b9f5b7f26dc679dfaccc1db1afd4166c7508487dc9edcb3e3f6",
"lib\/Command\/Object\/Put.php": "11da1387eb10c2233088cbc8e7e253032b68f4d66b0e10a4cbf0464cae10df6f394a6a29f1c38fce3903763bf6eb6dfce00005cb9faf7e5392fabf0160814a1e",
"lib\/Command\/Put.php": "8778f21c92770eca9a5cd9498b35d73837a706bc5b056dc264156ec0f4a347826930ba2d08ae819812b9b7337d48daa29a3b929e7b534ca710f5b2f5c0d02f20",
"lib\/Command\/RepairTree.php": "d9228e001da3a15b8899764dac10649530f6864e927c3111df07368d0bfd8740d70cbe4a4f29ba0080a1da4d79b43e307d287529630188d379f7a41457b8b1ee",
"lib\/Command\/Scan.php": "ed2fd62db4da1fd48eabad049912c4ea0af7841d33ba5adb177cd80d71f5baf09858cc18d55299efa449724ed8ebb94706e523664578cb37ba3c84ba5e838562",
"lib\/Command\/ScanAppData.php": "fd833b7e3e3b5ad974e4d16c0d419d73195473b7bd4a823982efe7170d93c8d2a1dad4d858ed4f8dd0196b3c232b6529dd770ca1894688712691966537daec19",
"lib\/Command\/TransferOwnership.php": "8493df6c5f81dff82d62da3e206ac208bd83041696af3729c80f792bf90d1cc2b6505b4de67d3a8dbc119637fb86eed439a7e6828fb92d76e3ea1ce762b5b584",
"lib\/Controller\/ApiController.php": "38b37e04c93af336de4326f80d7190bd17c7fa9035da13b580bb3a44dadfde0e8caa028963fb4d0b7fd40553eedf6e70f314ca7e734ba959cf2bf0ed15791cbd",
"lib\/Controller\/DirectEditingController.php": "1592b7a297d19d06468c70e80258f0d933ea53f8d473e9983534f6e6409112e387362b5b5c2a61c95f7c6e0ffe60786d4600ef18439489ca1d93614c0ca401ea",
"lib\/Controller\/DirectEditingViewController.php": "4f402540df410952c237a4518b48c92b49fc49bdd937f5a441113c2023a371bae8926c5b5b1fc495e04bfd39243fe9c7b3bcc6e75d9091a8318cd43087e52295",
"lib\/Controller\/OpenLocalEditorController.php": "0770056396275c661cd48781081516aea671e2f89873ebf57f0bd8077fee1965c0693d4bf6af1f7800310a994b5a9a490e79a348e96877528035f4fbe006cedd",
"lib\/Controller\/TemplateController.php": "83d7c62e49448021a9d520ba2b90429b7393ce3d6efcc0ada36f044ccc0736f56eeeb158799e996ab9483171f9c3a2b902f3e9e1b68c59c1ee8d75b7385638e9",
"lib\/Controller\/TransferOwnershipController.php": "c162ea154a71053995605a7dbfa1dfb5d7385830f8f1a3c523749ee9da847924fd51650b71f80ef7a8cb769971eba47795c986d1f410e8958535116bb552c89f",
"lib\/Controller\/ViewController.php": "61e1814bceb495ee3fbfba66dd3d6031390936a526ff7ace95972e5af9f40c975ffdadb61b476078afeb954998957e50981e8b413e6f767a7291291dc30bfc3a",
"lib\/Db\/OpenLocalEditor.php": "c599d0c714a554baddb57b5cbced64bf58933689ba3c4b56e8ce4dde14d5a949e10117225154b083d6dfb5e5dccd5d4a2a26aca277462654dbb1beb190d15152",
"lib\/Db\/OpenLocalEditorMapper.php": "30f97da00aeeae1ac61809003385a05cfd3d8e232b0eb703f744f9e86da98666d04abbd0be2bfdeb417be44229af8fa5e70ec1511855074e8d3eef86359f81fc",
"lib\/Db\/TransferOwnership.php": "b8c4099ee353461e3e16f4f1ca75250280390ebe10cad9a995e2254992a532d09cf2e2a1a9e12e69cf59b3c1542663f41174b6b30a50671fc8d54a7fa2908e8f",
"lib\/Db\/TransferOwnershipMapper.php": "4bfbabad8cd01749b05974a1446a220e6a9d0d283b27443031980ff5adcf4c8da80ab44e064aff0b9ea47b09acd2068bfa82e8ad7105339828734e81f04779ea",
"lib\/DirectEditingCapabilities.php": "99b8adf770999f2ae3279e810c25a69078a70ee574972e9af8dd52a0ce317f2c21ab08edd3bc6a91c875d2b9be280fb7ebad0db3595b3eee7eca10c1135cd2a9",
"lib\/Event\/LoadAdditionalScriptsEvent.php": "71603ea7c4ae4351a4b726728dff6df8cadb871c57db80a3b40571cd68be5e6d439139756f56c247b53f66468a8c5e8653193ed73b55c424f969b115977e878f",
"lib\/Event\/LoadSidebar.php": "f546cb8c37f6145c6ae01a5056dd67000cca2a3fccebaac17a33d3460f3a3e838e9abf5fb2a66d3731401836f9be77a830680d1becbdafe5b704a2d95e1fa388",
"lib\/Exception\/TransferOwnershipException.php": "0611a8a9841f9cce429387968d134accc27c070b4bdfc4295ea544a77a71ebe31e7026e96bb0dc87010ec9d6aaaa9186c079f606fff8444025b578571d28976e",
"lib\/Helper.php": "aef05a1c9d2c94fb58b3c4a1a3c535ed35851071f9a96f80d12a2e0dca00689f43233b0dd5e5e6ca8c38b9e701b6359344cdb7b3c491ee804cbac943972e5ce2",
"lib\/Listener\/LoadSidebarListener.php": "cc9aeb7273a5bc06b5fe82d48275d7d9f6b3f0b0aee49e758eba2bb9a18ae2436d2c6e9b54da8be197ad5013a53856d6699c09bcb38be6df5980e0c3d9c853ae",
"lib\/Listener\/RenderReferenceEventListener.php": "36db340374e39fddd9c907a602def5331c8df9aef8f699863c9e69dcc4f9def32e961600e853de8e5920607c0da3379fe96f16db6d0d2ec3cc5b1a3a40c9a231",
"lib\/Listener\/SyncLivePhotosListener.php": "6ead61f05ca2422cea9facf5a0fbf1fdaf7f7aac6da234979ee890f90d32f56cf40c825125633780109b963d721ce5b1781057cd6a636516afeefcd035cb57c1",
"lib\/Migration\/Version11301Date20191205150729.php": "69fb375582284ce705eef03009b447577819cdb6a3541435a4bf3d48062daeaf194271ea56eb622a596842d853673a988908fbc6b31f5b77c1bb946b9276afb0",
"lib\/Migration\/Version12101Date20221011153334.php": "78849f1854b3b49f28a00598a7b835de6c8863f08b96ebac161be7f49d99f36e2baa8d9f9ae4818cb44ebfea7325fc768bc790561ea8161132e3fdc8f3cbcd82",
"lib\/Notification\/Notifier.php": "9787b5a07379ce7f76167fa074317a4e6ad1b99672e4e74df2a58227dbeba440aa682c59e4b0583bc9a50c11a5d7d793bd98aa074f9e8e27fd7da7fb60a4f33a",
"lib\/ResponseDefinitions.php": "7664d5625a2cb1ff02ba58ae16d88a3253bd8aab64e9085441fe6064e49523ee3ac7b11c6530f31dc38ffe3709a5325e8adb61f468f389bc673b32a0392e1333",
"lib\/Search\/FilesSearchProvider.php": "7457085d8a691913574101fe242f32d410dab72434e9f4fa253c0e432779b47e452a026bd2173a97178e92b6760474eb5c4d844f5d3a7760a32e99fb9a332ce3",
"lib\/Service\/DirectEditingService.php": "af2523df038344a07827d6fc35830ac67a4bea81d63962b5e5db58a5922059da0e2abd1a728053f890d7f244ba42110e4ad8445f3f67cea4ee4edae6b30380a0",
"lib\/Service\/OwnershipTransferService.php": "1cef73654a42c8661415aa0236a98a39ebe9c65084b9e400bc4b269147846b7fadcfda63501414c44e8380bd4a4dfe55ab2d94d31919ca780ab7fb87d5924d95",
"lib\/Service\/TagService.php": "98a18b66c909c416dab16ed000e569f74331c6dfdc57459bcee320ac3dac90aa464cf216607db843c2a38bb3733ac9d5a0b942e1be0edf1e0be9607265a68014",
"lib\/Service\/UserConfig.php": "265843ba08a29f49b103113d52c018ad2a0372b15183f2864b34b377831d471674f20eba8c00a10b6a4b4ceb7d8ad1d4fb06ef8917a85ef5b38418a689aaa388",
"lib\/Service\/ViewConfig.php": "516ad2481cf328e9aa17300f7770b69c12468fb03c67f77da208d01f9ac4aaba0d611497ee5b2d54eb8f66a477d315648b55b9a8f5d40ff27a8d0ef9be0b2e63",
"lib\/Settings\/PersonalSettings.php": "c862ccdc6de7bcc4a44b9c3541c9f817ab3c0e9011409bfa2a0a21cd18e0853648219918c145e007c1359b5a8a2a5401d5843c8a1d5bf31ab7126f082f2379b2",
"list.php": "3834c0071d71a42d0cd66929486855e1b33ff9385f4c5ff615ba849a93cccf834e72433c410d0ba43ed29fb7d76b5c073fa7d7263ee8b3192a5e27563e29e76f",
"openapi.json": "c0018fd2a7944f62a6ca071ea03f8814a56cfae40a4cb1f8c60e265cca9bd4f31513bc009e7ca88769c2d00ecd041cc62a97c7e47a3458b44a14f4f490b2ade5",
"simplelist.php": "398687c7df56ea4318c97c2fb8072ca0c546a009ef38e6e60e0941c9b8c8b0c3a5cd4794d6c763cfafd10922a4943b12569ec59a5287a602501a7e05b078e699",
"templates\/appnavigation.php": "b6fe862ba281df6a279242cfa65b82129cad2b0f11305574927471e24b7684028bc21994a66051c2d9cde500f82fe625b5b56448bbdfcd8a14cdf6733fdaf59c",
"templates\/fileexists.html": "e39f438d54b86c0b9b5bdf5a167ab41564348cd12d47303371d68671d588d0202d6648423d46d351597fe763afd3833879fab49212135b45c79892e1eecedde1",
"templates\/index.php": "e5126576d3e90587eff77a763162c3e42dc7b971662100e4ab26fdc9e16783a19d0255dc1bebb302d587d9388f158bc5fe37330d3a41d9d1c269ba22f84ba1d8",
"templates\/list.php": "2d0dbaabe4d3bc948c0e5fa83d2357e5e0f2731e948ccca8a50fd60d12500b8e7eaa25cfe141b8b1f8a8f50be5f51d4e987f1b21da693d67c894258808d1dc01",
"templates\/settings-personal.php": "216881ec310fa509fe8caa132b207232b2f6e42a1a43838079f0dfd7168b016da347400c349f9db586cbd7f24c424fb5205d7dbb02f4665eca3d94e16e7ff0a9",
"templates\/simplelist.php": "23c861d9718a5dc991d8c605fa2f2c5a3441fe5033072527cda4ca84f9a3c7a33232dd801d99f5e46c86608582e9edf2b7fd7394cc3c3bba6bb4b25acf8f0402"
},
"signature": "XIpd3BAJvlmO6\/9Zk2WNIRTil5z+nXea+2ZU8l3wc8DOBywgDlf4r+ihVwRzWVnLGA+xZiAwpxQP\/mbIW7PWjm2Pj2SyXvUrfnffSJkR\/HaIZIzTfZiRQbLZjd2vcw3kh3sum2h6CFf0qgs\/PA5Mwzi2ALY1a6AhjoGCVauz1CK54pQy1n65ttYC+JC3cMFaoovi\/5D+7XYW8sJrUAmlDkX+f6ofHJOnJR1C2lpuMMoNbrblb6xNp1IKlGm3c2BjH1Mh1WICImm97lR9LrO6O8xCCZSXK8TMXIV0V1i+ZbNGEajU4my0OecFVzeYY3JCpX0hfQ1+Z4gtbUrvEhz5IA==",
"certificate": "-----BEGIN CERTIFICATE-----\r\nMIIEojCCA4qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwezELMAkGA1UEBhMCREUx\r\nGzAZBgNVBAgMEkJhZGVuLVd1ZXJ0dGVtYmVyZzEXMBUGA1UECgwOTmV4dGNsb3Vk\r\nIEdtYkgxNjA0BgNVBAMMLU5leHRjbG91ZCBDb2RlIFNpZ25pbmcgSW50ZXJtZWRp\r\nYXRlIEF1dGhvcml0eTAeFw0xNjA2MTIyMTA1MDZaFw00MTA2MDYyMTA1MDZaMGYx\r\nCzAJBgNVBAYTAkRFMRswGQYDVQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxEjAQBgNV\r\nBAcMCVN0dXR0Z2FydDEXMBUGA1UECgwOTmV4dGNsb3VkIEdtYkgxDTALBgNVBAMM\r\nBGNvcmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUxcrn2DC892IX\r\n8+dJjZVh9YeHF65n2ha886oeAizOuHBdWBfzqt+GoUYTOjqZF93HZMcwy0P+xyCf\r\nQqak5Ke9dybN06RXUuGP45k9UYBp03qzlUzCDalrkj+Jd30LqcSC1sjRTsfuhc+u\r\nvH1IBuBnf7SMUJUcoEffbmmpAPlEcLHxlUGlGnz0q1e8UFzjbEFj3JucMO4ys35F\r\nqZS4dhvCngQhRW3DaMlQLXEUL9k3kFV+BzlkPzVZEtSmk4HJujFCnZj1vMcjQBg\/\r\nBqq1HCmUB6tulnGcxUzt\/Z\/oSIgnuGyENeke077W3EyryINL7EIyD4Xp7sxLizTM\r\nFCFCjjH1AgMBAAGjggFDMIIBPzAJBgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIG\r\nQDAzBglghkgBhvhCAQ0EJhYkT3BlblNTTCBHZW5lcmF0ZWQgU2VydmVyIENlcnRp\r\nZmljYXRlMB0GA1UdDgQWBBQwc1H9AL8pRlW2e5SLCfPPqtqc0DCBpQYDVR0jBIGd\r\nMIGagBRt6m6qqTcsPIktFz79Ru7DnnjtdKF+pHwwejELMAkGA1UEBhMCREUxGzAZ\r\nBgNVBAgMEkJhZGVuLVd1ZXJ0dGVtYmVyZzESMBAGA1UEBwwJU3R1dHRnYXJ0MRcw\r\nFQYDVQQKDA5OZXh0Y2xvdWQgR21iSDEhMB8GA1UEAwwYTmV4dGNsb3VkIFJvb3Qg\r\nQXV0aG9yaXR5ggIQADAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH\r\nAwEwDQYJKoZIhvcNAQELBQADggEBADZ6+HV\/+0NEH3nahTBFxO6nKyR\/VWigACH0\r\nnaV0ecTcoQwDjKDNNFr+4S1WlHdwITlnNabC7v9rZ\/6QvbkrOTuO9fOR6azp1EwW\r\n2pixWqj0Sb9\/dSIVRpSq+jpBE6JAiX44dSR7zoBxRB8DgVO2Afy0s80xEpr5JAzb\r\nNYuPS7M5UHdAv2dr16fDcDIvn+vk92KpNh1NTeZFjBbRVQ9DXrgkRGW34TK8uSLI\r\nYG6jnfJ6eJgTaO431ywWPXNg1mUMaT\/+QBOgB299QVCKQU+lcZWptQt+RdsJUm46\r\nNY\/nARy4Oi4uOe88SuWITj9KhrFmEvrUlgM8FvoXA1ldrR7KiEg=\r\n-----END CERTIFICATE-----"
}
@@ -0,0 +1,25 @@
<?php
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInitFiles::getLoader();
@@ -0,0 +1,13 @@
{
"config" : {
"vendor-dir": ".",
"optimize-autoloader": true,
"classmap-authoritative": true,
"autoloader-suffix": "Files"
},
"autoload" : {
"psr-4": {
"OCA\\Files\\": "../lib/"
}
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d751713988987e9331980363e24189ce",
"packages": [],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.1.0"
}
@@ -0,0 +1,579 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see https://www.php-fig.org/psr/psr-0/
* @see https://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var string|null */
private $vendorDir;
// PSR-4
/**
* @var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array<string, list<string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* List of PSR-0 prefixes
*
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
*
* @var array<string, array<string, list<string>>>
*/
private $prefixesPsr0 = array();
/**
* @var list<string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var array<string, bool>
*/
private $missingClasses = array();
/** @var string|null */
private $apcuPrefix;
/**
* @var array<string, self>
*/
private static $registeredLoaders = array();
/**
* @param string|null $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
}
return array();
}
/**
* @return array<string, list<string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return list<string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return list<string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return array<string, string> Array of classname => path
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array<string, string> $classMap Class to filename map
*
* @return void
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
$paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
$paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
$paths = (array) $paths;
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
$paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
$paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
$paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param list<string>|string $paths The PSR-0 base directories
*
* @return void
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param list<string>|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
self::$registeredLoaders[$this->vendorDir] = $this;
}
}
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
if (null !== $this->vendorDir) {
unset(self::$registeredLoaders[$this->vendorDir]);
}
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
return true;
}
return null;
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
/**
* Returns the currently registered loaders keyed by their corresponding vendor directories.
*
* @return array<string, self>
*/
public static function getRegisteredLoaders()
{
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
include $file;
}, null, null);
}
}
@@ -0,0 +1,359 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer;
use Composer\Autoload\ClassLoader;
use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
/**
* @var bool|null
*/
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
/**
* Returns a list of all package names which are present, either by being installed, replaced or provided
*
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackages()
{
$packages = array();
foreach (self::getInstalled() as $installed) {
$packages[] = array_keys($installed['versions']);
}
if (1 === \count($packages)) {
return $packages[0];
}
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName, $includeDevRequirements = true)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
}
}
return false;
}
/**
* Checks whether the given package satisfies a version constraint
*
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
*
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
*
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints((string) $constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
/**
* Returns a version constraint representing all the range(s) which are installed for a given package
*
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
* whether a given version of a package is installed, and not just whether it exists
*
* @param string $packageName
* @return string Version constraint usable with composer/semver
*/
public static function getVersionRanges($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
$ranges = array();
if (isset($installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', $installed['versions'][$packageName])) {
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['version'])) {
return null;
}
return $installed['versions'][$packageName]['version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
*/
public static function getPrettyVersion($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return $installed['versions'][$packageName]['pretty_version'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
*/
public static function getReference($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
if (!isset($installed['versions'][$packageName]['reference'])) {
return null;
}
return $installed['versions'][$packageName]['reference'];
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
*/
public static function getRootPackage()
{
$installed = self::getInstalled();
return $installed[0]['root'];
}
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
*
* This is only useful for complex integrations in which a project needs to use
* this class but then also needs to execute another project's autoloader in process,
* and wants to ensure both projects have access to their version of installed.php.
*
* A typical case would be PHPUnit, where it would need to make sure it reads all
* the data it needs from this class, then call reload() with
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
* the project in which it runs can then also use this class safely, without
* interference between PHPUnit's dependencies and the project's dependencies.
*
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
*/
public static function reload($data)
{
self::$installed = $data;
self::$installedByVendor = array();
}
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
if (null === self::$canGetVendors) {
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
}
$installed = array();
if (self::$canGetVendors) {
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require $vendorDir.'/composer/installed.php';
$installed[] = self::$installedByVendor[$vendorDir] = $required;
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
$required = require __DIR__ . '/installed.php';
self::$installed = $required;
} else {
self::$installed = array();
}
}
if (self::$installed !== array()) {
$installed[] = self::$installed;
}
return $installed;
}
}
@@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
@@ -0,0 +1,74 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
'OCA\\Files\\Activity\\FavoriteProvider' => $baseDir . '/../lib/Activity/FavoriteProvider.php',
'OCA\\Files\\Activity\\Filter\\Favorites' => $baseDir . '/../lib/Activity/Filter/Favorites.php',
'OCA\\Files\\Activity\\Filter\\FileChanges' => $baseDir . '/../lib/Activity/Filter/FileChanges.php',
'OCA\\Files\\Activity\\Helper' => $baseDir . '/../lib/Activity/Helper.php',
'OCA\\Files\\Activity\\Provider' => $baseDir . '/../lib/Activity/Provider.php',
'OCA\\Files\\Activity\\Settings\\FavoriteAction' => $baseDir . '/../lib/Activity/Settings/FavoriteAction.php',
'OCA\\Files\\Activity\\Settings\\FileActivitySettings' => $baseDir . '/../lib/Activity/Settings/FileActivitySettings.php',
'OCA\\Files\\Activity\\Settings\\FileChanged' => $baseDir . '/../lib/Activity/Settings/FileChanged.php',
'OCA\\Files\\Activity\\Settings\\FileFavoriteChanged' => $baseDir . '/../lib/Activity/Settings/FileFavoriteChanged.php',
'OCA\\Files\\App' => $baseDir . '/../lib/App.php',
'OCA\\Files\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => $baseDir . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php',
'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => $baseDir . '/../lib/BackgroundJob/CleanupFileLocks.php',
'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => $baseDir . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php',
'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => $baseDir . '/../lib/BackgroundJob/DeleteOrphanedItems.php',
'OCA\\Files\\BackgroundJob\\ScanFiles' => $baseDir . '/../lib/BackgroundJob/ScanFiles.php',
'OCA\\Files\\BackgroundJob\\TransferOwnership' => $baseDir . '/../lib/BackgroundJob/TransferOwnership.php',
'OCA\\Files\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => $baseDir . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => $baseDir . '/../lib/Collaboration/Resources/ResourceProvider.php',
'OCA\\Files\\Command\\Copy' => $baseDir . '/../lib/Command/Copy.php',
'OCA\\Files\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => $baseDir . '/../lib/Command/DeleteOrphanedFiles.php',
'OCA\\Files\\Command\\Get' => $baseDir . '/../lib/Command/Get.php',
'OCA\\Files\\Command\\Move' => $baseDir . '/../lib/Command/Move.php',
'OCA\\Files\\Command\\Object\\Delete' => $baseDir . '/../lib/Command/Object/Delete.php',
'OCA\\Files\\Command\\Object\\Get' => $baseDir . '/../lib/Command/Object/Get.php',
'OCA\\Files\\Command\\Object\\ObjectUtil' => $baseDir . '/../lib/Command/Object/ObjectUtil.php',
'OCA\\Files\\Command\\Object\\Put' => $baseDir . '/../lib/Command/Object/Put.php',
'OCA\\Files\\Command\\Put' => $baseDir . '/../lib/Command/Put.php',
'OCA\\Files\\Command\\RepairTree' => $baseDir . '/../lib/Command/RepairTree.php',
'OCA\\Files\\Command\\Scan' => $baseDir . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => $baseDir . '/../lib/Command/ScanAppData.php',
'OCA\\Files\\Command\\TransferOwnership' => $baseDir . '/../lib/Command/TransferOwnership.php',
'OCA\\Files\\Controller\\ApiController' => $baseDir . '/../lib/Controller/ApiController.php',
'OCA\\Files\\Controller\\DirectEditingController' => $baseDir . '/../lib/Controller/DirectEditingController.php',
'OCA\\Files\\Controller\\DirectEditingViewController' => $baseDir . '/../lib/Controller/DirectEditingViewController.php',
'OCA\\Files\\Controller\\OpenLocalEditorController' => $baseDir . '/../lib/Controller/OpenLocalEditorController.php',
'OCA\\Files\\Controller\\TemplateController' => $baseDir . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => $baseDir . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => $baseDir . '/../lib/Controller/ViewController.php',
'OCA\\Files\\Db\\OpenLocalEditor' => $baseDir . '/../lib/Db/OpenLocalEditor.php',
'OCA\\Files\\Db\\OpenLocalEditorMapper' => $baseDir . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => $baseDir . '/../lib/Db/TransferOwnership.php',
'OCA\\Files\\Db\\TransferOwnershipMapper' => $baseDir . '/../lib/Db/TransferOwnershipMapper.php',
'OCA\\Files\\DirectEditingCapabilities' => $baseDir . '/../lib/DirectEditingCapabilities.php',
'OCA\\Files\\Event\\LoadAdditionalScriptsEvent' => $baseDir . '/../lib/Event/LoadAdditionalScriptsEvent.php',
'OCA\\Files\\Event\\LoadSidebar' => $baseDir . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => $baseDir . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => $baseDir . '/../lib/Helper.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Listener\\SyncLivePhotosListener' => $baseDir . '/../lib/Listener/SyncLivePhotosListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => $baseDir . '/../lib/Migration/Version11301Date20191205150729.php',
'OCA\\Files\\Migration\\Version12101Date20221011153334' => $baseDir . '/../lib/Migration/Version12101Date20221011153334.php',
'OCA\\Files\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
'OCA\\Files\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => $baseDir . '/../lib/Search/FilesSearchProvider.php',
'OCA\\Files\\Service\\DirectEditingService' => $baseDir . '/../lib/Service/DirectEditingService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => $baseDir . '/../lib/Service/OwnershipTransferService.php',
'OCA\\Files\\Service\\TagService' => $baseDir . '/../lib/Service/TagService.php',
'OCA\\Files\\Service\\UserConfig' => $baseDir . '/../lib/Service/UserConfig.php',
'OCA\\Files\\Service\\ViewConfig' => $baseDir . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\PersonalSettings' => $baseDir . '/../lib/Settings/PersonalSettings.php',
);
@@ -0,0 +1,9 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
);
@@ -0,0 +1,10 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$baseDir = $vendorDir;
return array(
'OCA\\Files\\' => array($baseDir . '/../lib'),
);
@@ -0,0 +1,37 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitFiles
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitFiles', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitFiles', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitFiles::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
return $loader;
}
}
@@ -0,0 +1,100 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInitFiles
{
public static $prefixLengthsPsr4 = array (
'O' =>
array (
'OCA\\Files\\' => 10,
),
);
public static $prefixDirsPsr4 = array (
'OCA\\Files\\' =>
array (
0 => __DIR__ . '/..' . '/../lib',
),
);
public static $classMap = array (
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
'OCA\\Files\\Activity\\FavoriteProvider' => __DIR__ . '/..' . '/../lib/Activity/FavoriteProvider.php',
'OCA\\Files\\Activity\\Filter\\Favorites' => __DIR__ . '/..' . '/../lib/Activity/Filter/Favorites.php',
'OCA\\Files\\Activity\\Filter\\FileChanges' => __DIR__ . '/..' . '/../lib/Activity/Filter/FileChanges.php',
'OCA\\Files\\Activity\\Helper' => __DIR__ . '/..' . '/../lib/Activity/Helper.php',
'OCA\\Files\\Activity\\Provider' => __DIR__ . '/..' . '/../lib/Activity/Provider.php',
'OCA\\Files\\Activity\\Settings\\FavoriteAction' => __DIR__ . '/..' . '/../lib/Activity/Settings/FavoriteAction.php',
'OCA\\Files\\Activity\\Settings\\FileActivitySettings' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileActivitySettings.php',
'OCA\\Files\\Activity\\Settings\\FileChanged' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileChanged.php',
'OCA\\Files\\Activity\\Settings\\FileFavoriteChanged' => __DIR__ . '/..' . '/../lib/Activity/Settings/FileFavoriteChanged.php',
'OCA\\Files\\App' => __DIR__ . '/..' . '/../lib/App.php',
'OCA\\Files\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
'OCA\\Files\\BackgroundJob\\CleanupDirectEditingTokens' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupDirectEditingTokens.php',
'OCA\\Files\\BackgroundJob\\CleanupFileLocks' => __DIR__ . '/..' . '/../lib/BackgroundJob/CleanupFileLocks.php',
'OCA\\Files\\BackgroundJob\\DeleteExpiredOpenLocalEditor' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteExpiredOpenLocalEditor.php',
'OCA\\Files\\BackgroundJob\\DeleteOrphanedItems' => __DIR__ . '/..' . '/../lib/BackgroundJob/DeleteOrphanedItems.php',
'OCA\\Files\\BackgroundJob\\ScanFiles' => __DIR__ . '/..' . '/../lib/BackgroundJob/ScanFiles.php',
'OCA\\Files\\BackgroundJob\\TransferOwnership' => __DIR__ . '/..' . '/../lib/BackgroundJob/TransferOwnership.php',
'OCA\\Files\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/ResourceProvider.php',
'OCA\\Files\\Command\\Copy' => __DIR__ . '/..' . '/../lib/Command/Copy.php',
'OCA\\Files\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => __DIR__ . '/..' . '/../lib/Command/DeleteOrphanedFiles.php',
'OCA\\Files\\Command\\Get' => __DIR__ . '/..' . '/../lib/Command/Get.php',
'OCA\\Files\\Command\\Move' => __DIR__ . '/..' . '/../lib/Command/Move.php',
'OCA\\Files\\Command\\Object\\Delete' => __DIR__ . '/..' . '/../lib/Command/Object/Delete.php',
'OCA\\Files\\Command\\Object\\Get' => __DIR__ . '/..' . '/../lib/Command/Object/Get.php',
'OCA\\Files\\Command\\Object\\ObjectUtil' => __DIR__ . '/..' . '/../lib/Command/Object/ObjectUtil.php',
'OCA\\Files\\Command\\Object\\Put' => __DIR__ . '/..' . '/../lib/Command/Object/Put.php',
'OCA\\Files\\Command\\Put' => __DIR__ . '/..' . '/../lib/Command/Put.php',
'OCA\\Files\\Command\\RepairTree' => __DIR__ . '/..' . '/../lib/Command/RepairTree.php',
'OCA\\Files\\Command\\Scan' => __DIR__ . '/..' . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => __DIR__ . '/..' . '/../lib/Command/ScanAppData.php',
'OCA\\Files\\Command\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Command/TransferOwnership.php',
'OCA\\Files\\Controller\\ApiController' => __DIR__ . '/..' . '/../lib/Controller/ApiController.php',
'OCA\\Files\\Controller\\DirectEditingController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingController.php',
'OCA\\Files\\Controller\\DirectEditingViewController' => __DIR__ . '/..' . '/../lib/Controller/DirectEditingViewController.php',
'OCA\\Files\\Controller\\OpenLocalEditorController' => __DIR__ . '/..' . '/../lib/Controller/OpenLocalEditorController.php',
'OCA\\Files\\Controller\\TemplateController' => __DIR__ . '/..' . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => __DIR__ . '/..' . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => __DIR__ . '/..' . '/../lib/Controller/ViewController.php',
'OCA\\Files\\Db\\OpenLocalEditor' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditor.php',
'OCA\\Files\\Db\\OpenLocalEditorMapper' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Db/TransferOwnership.php',
'OCA\\Files\\Db\\TransferOwnershipMapper' => __DIR__ . '/..' . '/../lib/Db/TransferOwnershipMapper.php',
'OCA\\Files\\DirectEditingCapabilities' => __DIR__ . '/..' . '/../lib/DirectEditingCapabilities.php',
'OCA\\Files\\Event\\LoadAdditionalScriptsEvent' => __DIR__ . '/..' . '/../lib/Event/LoadAdditionalScriptsEvent.php',
'OCA\\Files\\Event\\LoadSidebar' => __DIR__ . '/..' . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => __DIR__ . '/..' . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
'OCA\\Files\\Listener\\SyncLivePhotosListener' => __DIR__ . '/..' . '/../lib/Listener/SyncLivePhotosListener.php',
'OCA\\Files\\Migration\\Version11301Date20191205150729' => __DIR__ . '/..' . '/../lib/Migration/Version11301Date20191205150729.php',
'OCA\\Files\\Migration\\Version12101Date20221011153334' => __DIR__ . '/..' . '/../lib/Migration/Version12101Date20221011153334.php',
'OCA\\Files\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
'OCA\\Files\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
'OCA\\Files\\Search\\FilesSearchProvider' => __DIR__ . '/..' . '/../lib/Search/FilesSearchProvider.php',
'OCA\\Files\\Service\\DirectEditingService' => __DIR__ . '/..' . '/../lib/Service/DirectEditingService.php',
'OCA\\Files\\Service\\OwnershipTransferService' => __DIR__ . '/..' . '/../lib/Service/OwnershipTransferService.php',
'OCA\\Files\\Service\\TagService' => __DIR__ . '/..' . '/../lib/Service/TagService.php',
'OCA\\Files\\Service\\UserConfig' => __DIR__ . '/..' . '/../lib/Service/UserConfig.php',
'OCA\\Files\\Service\\ViewConfig' => __DIR__ . '/..' . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\PersonalSettings' => __DIR__ . '/..' . '/../lib/Settings/PersonalSettings.php',
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitFiles::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitFiles::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitFiles::$classMap;
}, null, ClassLoader::class);
}
}
@@ -0,0 +1,5 @@
{
"packages": [],
"dev": false,
"dev-package-names": []
}
@@ -0,0 +1,23 @@
<?php return array(
'root' => array(
'name' => '__root__',
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'ba1af2b22e5409c62ea2bdf7eb0e13c282ed70e8',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
'dev' => false,
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'ba1af2b22e5409c62ea2bdf7eb0e13c282ed70e8',
'type' => 'library',
'install_path' => __DIR__ . '/../',
'aliases' => array(),
'dev_requirement' => false,
),
),
);
@@ -0,0 +1 @@
.app-sidebar .detailFileInfoContainer{min-height:50px;padding:15px}.app-sidebar .detailFileInfoContainer>div{clear:both}.app-sidebar .mainFileInfoView .icon{display:inline-block;background-size:16px 16px}.app-sidebar .mainFileInfoView .permalink{padding:6px 10px;vertical-align:top;opacity:.6}.app-sidebar .mainFileInfoView .permalink:hover,.app-sidebar .mainFileInfoView .permalink:focus{opacity:1}.app-sidebar .mainFileInfoView .permalink-field>input{clear:both;width:90%}.app-sidebar .thumbnailContainer.large{margin-left:-15px;margin-right:-35px;margin-top:-15px}.app-sidebar .thumbnailContainer.large.portrait{margin:0}.app-sidebar .large .thumbnail{width:100%;display:block;background-repeat:no-repeat;background-position:center;background-size:100%;float:none;margin:0;height:auto}.app-sidebar .large .thumbnail .stretcher{content:"";display:block;padding-bottom:56.25%}.app-sidebar .large.portrait .thumbnail{background-position:50% top}.app-sidebar .large.portrait .thumbnail{background-size:contain}.app-sidebar .large.text{overflow-y:scroll;overflow-x:hidden;padding-top:14px;font-size:80%;margin-left:0}.app-sidebar .thumbnail{width:100%;min-height:75px;display:inline-block;float:left;margin-right:10px;background-size:contain;background-repeat:no-repeat}.app-sidebar .ellipsis{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.app-sidebar .fileName{font-size:16px;padding-top:13px;padding-bottom:3px}.app-sidebar .fileName h3{width:calc(100% - 42px);display:inline-block;padding:5px 0;margin:-5px 0}.app-sidebar .file-details{color:var(--color-text-maxcontrast)}.app-sidebar .action-favorite{vertical-align:sub;padding:10px;margin:-10px}.app-sidebar .action-favorite>span{opacity:.7 !important}.app-sidebar .detailList{float:left}.app-sidebar .close{position:absolute;top:0;right:0;opacity:.5;z-index:1;width:44px;height:44px}/*# sourceMappingURL=detailsView.css.map */
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["detailsView.scss"],"names":[],"mappings":"AAAA,sCACC,gBACA,aAGD,0CACC,WAID,qCACC,qBACA,0BAGD,0CACC,iBACA,mBACA,WAEA,gGAEC,UAGF,sDACC,WACA,UAGD,uCACC,kBACA,mBACA,iBAGD,gDACC,SAGD,+BACC,WACA,cACA,4BACA,2BACA,qBACA,WACA,SACA,YAGD,0CACC,WACA,cACA,sBAGD,wCACC,4BAGD,wCACC,wBAGD,yBACC,kBACA,kBACA,iBACA,cACA,cAGD,wBACC,WACA,gBACA,qBACA,WACA,kBACA,wBACA,4BAGD,uBACC,mBACA,uBACA,gBAGD,uBACC,eACA,iBACA,mBAGD,0BACC,wBACA,qBACA,cACA,cAGD,2BACC,oCAGD,8BACC,mBACA,aACA,aAGD,mCACC,sBAGD,yBACC,WAGD,oBACC,kBACA,MACA,QACA,WACA,UACA,WACA","file":"detailsView.css"}
@@ -0,0 +1,129 @@
.app-sidebar .detailFileInfoContainer {
min-height: 50px;
padding: 15px;
}
.app-sidebar .detailFileInfoContainer > div {
clear: both;
}
.app-sidebar .mainFileInfoView .icon {
display: inline-block;
background-size: 16px 16px;
}
.app-sidebar .mainFileInfoView .permalink {
padding: 6px 10px;
vertical-align: top;
opacity: .6;
&:hover,
&:focus {
opacity: 1;
}
}
.app-sidebar .mainFileInfoView .permalink-field>input {
clear: both;
width: 90%;
}
.app-sidebar .thumbnailContainer.large {
margin-left: -15px;
margin-right: -35px; /* 15 + 20 for the close button */
margin-top: -15px;
}
.app-sidebar .thumbnailContainer.large.portrait {
margin: 0; /* if we don't fit the image anyway we give it back the margin */
}
.app-sidebar .large .thumbnail {
width:100%;
display:block;
background-repeat: no-repeat;
background-position: center;
background-size: 100%;
float: none;
margin: 0;
height: auto;
}
.app-sidebar .large .thumbnail .stretcher {
content: '';
display: block;
padding-bottom: 56.25%; /* sets height of .thumbnail to 9/16 of the width */
}
.app-sidebar .large.portrait .thumbnail {
background-position: 50% top;
}
.app-sidebar .large.portrait .thumbnail {
background-size: contain;
}
.app-sidebar .large.text {
overflow-y: scroll;
overflow-x: hidden;
padding-top: 14px;
font-size: 80%;
margin-left: 0;
}
.app-sidebar .thumbnail {
width: 100%;
min-height: 75px;
display: inline-block;
float: left;
margin-right: 10px;
background-size: contain;
background-repeat: no-repeat;
}
.app-sidebar .ellipsis {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.app-sidebar .fileName {
font-size: 16px;
padding-top: 13px;
padding-bottom: 3px;
}
.app-sidebar .fileName h3 {
width: calc(100% - 42px); /* 36px is the with of the copy link icon, but this breaks so we add some more to be sure */
display: inline-block;
padding: 5px 0;
margin: -5px 0;
}
.app-sidebar .file-details {
color: var(--color-text-maxcontrast);
}
.app-sidebar .action-favorite {
vertical-align: sub;
padding: 10px;
margin: -10px;
}
.app-sidebar .action-favorite > span{
opacity: .7 !important;
}
.app-sidebar .detailList {
float: left;
}
.app-sidebar .close {
position: absolute;
top: 0;
right: 0;
opacity: .5;
z-index: 1;
width: 44px;
height: 44px;
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["files.scss"],"names":[],"mappings":"AAWA,SAEC,YACA,YACA,qBACA,WAED,oEACA,8BACA,kDAEC,+CAED,0BACC,oDAGD,mBACC,kBACA,aACA,SACA,4CACC,iBACA,YACA,SACA,oDACA,8CACA,aACA,iBAIF,gBACC,aAGD,OACC,iBACA,YACA,aACA,aACA,mBAGD,6EAGC,yBACA,gCAID,kBACC,kBACA,WACA,gBACA,cACA,sBAEA,6CACC,aAGD,wBACC,wBACA,gBAEA,SAEA,WACA,cACA,0DAMD,wBACC,cACA,WAEA,mGAEC,8CAEA,6KACC,oCAKF,8DACC,oBAKH,yBACC,aAID,uCACC,cACA,WAGD,wBAGC,yBAEA,qBAGD,6FACC,+DAGD,iCACC,yDAGD,kFACC,0CAGD,4EACC,+DAID,iCACC,WACA,YACA,eACA,SACA,eAGD,wCACC,aAGD,0CACC,WAGD,2BACC,YAED,4KAKC,+CAED,wMAKC,oDAGD,qCAEA,yDACC,oCAED,kCACC,iCACA,8BACA,4BACA,yBACA,mBAED,wGAIC,UACA,oCAGD,oBACC,oCAED,uBACC,6BAED,sBACC,cACA,aACA,YACA,sBACA,2BACA,sBACA,oCACC,kBAGF,kCACC,qBACA,mBAED,2BACC,eACA,iBAGD,uCACC,cAGD,yBACC,WACA,WACA,gBACA,qBACA,2BACA,WAED,wJAIC,kBAED,2CACC,eAED,4EAEC,mBAGD,kBAEC,4CACA,gBACA,mBAED,SACC,eACA,kBACA,+BACA,4BAED,qBACC,kBACA,aACA,UAGD,uBACC,kBACA,YAGD,0BACC,gBAED,uCACC,iBAED,8EAEC,2BACA,sBACA,kBAEA,gBAGD,qMAQC,gBACA,qPACC,MAIF,2BACC,0DACA,iBAGD,sDACC,iBAGD,+BACC,kBACA,aAED,kCACC,aAGD,0DAGC,WACA,kBAED,kDAEC,aACA,kBACA,2BACA,sBACA,YACA,iBACA,UAED,qCAEC,QACA,eACA,eACA,YAGA,8DACC,WAED,mEACC,WAGF,6BACC,qBACA,WACA,YACA,wBACA,2BACA,4BACA,gBACA,eACA,mCACA,eACA,kBACA,UAED,oCACC,eAID,2CACC,qCAGD,iDACC,qBACA,4BACA,YAED,uBACC,iBACA,kBACA,SAGD,6IACA,8FAEA,wCACC,kBACA,gBACA,uBACA,YAKA,kBACC,YACA,4BACC,QACA,YACA,aACA,gBACA,mBACA,uBACA,YACA,WACA,mBAKH,iJAEC,wBAGD,mCACC,iCACA,8BACA,4BACA,yBAED,4BACC,WAGD,2CACC,uBACA,gBACA,kBACA,mBAKD,8BACC,kBACA,mBAEA,iBACA,OACA,SACA,YACA,cAEA,iBACA,eAEA,iBACA,oCACA,uBACA,mBAGD,mBACC,UAID,6DACC,WACA,eAID,iRAIC,UAID,0EACC,WAMA,wEACC,aAGD,oGACC,+CACA,wCACA,wBACA,yDACA,aAIF,oGAEC,mBAGD,+BACC,kBACA,WACA,eACA,gBACA,wJAGD,wFAEC,kBACA,UACA,YAGD,yCACC,qBACA,WAED,8CACC,kBACA,cACA,SACA,WACA,iBACA,kBACA,wDAEC,8CACA,8CACA,oBAEA,WACA,YACA,aACA,qBACA,uBAGF,8DACC,+CAGD,iDAGA,aACC,WAGD,iCACC,kBAID,mDAEC,gBAID,oCACC,qBACA,0BAGD,8EACC,0BAOA,kCACC,eAGD,sEACC,eAGD,sCACC,gBAIF,aACC,YACA,WACA,2BAKA,0EACC,wCAKF,iBACI,kBACA,qBACA,sBAEJ,wBACI,aAEJ,mBACC,eACA,iBACA,iBAGD,0BACC,aAED,uBACC,kBACA,2BACA,mBAGD,8CACC,gBAIA,8BACC,eACA,iBACA,iBACA,WACA,2CACC,kBACA,0FAGC,kBACA,cACA,SACA,UACA,WACA,gBAED,mDACC,qBACA,sBAGF,0CACC,iBACA,oBACA,kBACA,mBAGA,oGACC,WAID,qIAEC,WAED,uDACC,WACA,0HACC,WAIH,wEACC,UAED,oCACC,+CACA,wCAGF,uGACC,WAED,wDACC,UAKF,4EACC,qBACA,eACA,gBACA,uBACA,sBACA,gBAGD,2CACC,yBAGD,yCACC,UAGD,kNAKC,UAGD,qCACC,gBAGD,0FAEC,WAGD,mDACC,eAGD,SACC,oCAGA,aAED,wCACC,WAEA,mBAKD,sBACC,aAED,2DAIC,+BAED,YACC,mBACA,mBACA,iBAED,wBACC,UAED,YACC,qBAGD,iBACC,WACA,aAED,6BACC,kBACA,mBACA,YAGA,gBAED,yBACC,kBAED,MACC,WACA,kBACA,MACA,OACA,QACA,SACA,8CACA,sCACA,wBACA,WACA,yBACA,8BACA,4BACA,6BACA,iCAED,kBACC,UAGD,aACC,gBACA,SACA,sBACA,eACA,gBACA,aAGA,oBACC,qBAKF,gBACC,sBACA,wBACA,gBACA,YACA,UACA,SACA,0DACA,WACA,yBACA,sBACA,qBACA,iBACA,aACA,MACA,kBAKE,0IACC,sBACA,qBACA,aACA,YACA,WACA,YACA,mBACA,uBAED,oFACC,aAQJ,0DACC,OAGD,6KAIC,qBACA,sBACA,0BAMA,sDACC,sBAED,yDACC,uDAIF,iJAGC,aAGD,oJAGC,WACA,YAGD,gCACC,kBACA,YACA,SACA,oDACA,8CACA,aACA,iBAGD,YACC,mBAEA,uBACC,mCAIF,0DAEC,oCAED,qBACC,oCACA,4BACC,2BAIF,cACC,iBACA,kBACA,gBACA,6BACA,cACA,gBACA,YAEA,2BACC,aAGD,kCACC,UACA,kBACA,iBAIF,uBACC,oBACA,YACA,gBACA,+BACA,UACA,YACA,wBACA,sBAEA,6BACC,YAKA,oEACC,0BAIF,kCACC,WACA,mCAWA,kDACC,cACA,4CACA,0DACA,qDACC,WACA,YAMH,+CACC,aACA,+CACA,6BACA,aACA,cAGA,+DACC,cACA,kBACA,aACA,mCAEA,0fAKC,+BAEA,oxDAGC,+CAKH,kDACC,eACA,mBAGC,8EACC,YACA,eACA,kBACA,MAvDQ,MAwDR,OAxDQ,MAyDR,QAxDO,KAyDP,MACA,OACA,WAEA,yFACC,0BACA,2BACA,wBACA,SACA,mCACA,4BACA,2BAKA,wGACC,UACA,UACA,YAKH,uEACC,WACA,SACA,MACA,YAEA,YACA,gBAEA,kBAGD,iEACC,YACA,mCAIA,gBAKA,0BAEA,2EACC,aACA,YACA,iBACA,kBACA,iBACA,UAEA,0FACC,qBACA,kBACA,gBACA,uBACA,mBAED,kFACC,WACA,OACA,eAED,iFACC,WACA,OACA,eAID,sFACC,aAKF,8EACC,aAGD,8EACC,eACA,iBACA,aACA,mBACA,kBACA,QAEA,sFACC,QAxJK,KAyJL,WACA,YACA,aACA,mBACA,uBAGA,wGACC,aAQH,2GACC,yBAEA,6HACC,YACA,kBAIF,6GACC,yBAGD,6GACC,yBAIF,gEACC,iBACA,mCAEA,+EACC,WACA,cACA,YAMH,kHAEC,aAGD,sIAEC,kBACA,SACA,UACA,aACA,WAEA,kJACC,WACA,YACA,oBACA,QAzNO,KA0NP,kKACC,SACA,MA5NM,KA6NN,OA7NM,KAmOT,+DACC,OACA,YACA,aAGA,yFACC,gBACA,uBAMJ,+FACC,cAID,+CACC,aAEA,qEACC,qBACA,cAEA,aAEA,wEACC,iBAEA,iKAEC,aAGD,8EACI,cAQR,aACC,0DACA,YACA,SACA,aACA,WACA,YACA,mCACA,iCACA,YACA,gBAEA,uEAGC,UAGD,oEAEC,mEASF,cACC,eACA,MAOC,uGACC,gBAID,4EACC,WAKF,0BACC,kBACA,QACA,MAKF,gBACC,aAGD,8BACC,gBACA,sBACA,kBACA,kBACA,aACA,eACA,mBAEA,iCACC,WACA,eAGD,6DACC,aACA,YACA","file":"files.css"}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+5
View File
@@ -0,0 +1,5 @@
@import 'files.scss';
@import 'upload.scss';
@import 'mobile.scss';
@import 'detailsView.scss';
@import '../../../core/css/whatsnew.scss';
+1
View File
@@ -0,0 +1 @@
@media only screen and (max-width: 988px)and (min-width: 1025px),only screen and (max-width: 688px){.app-files #app-content.dir-drop{background-color:#fff !important}table th.column-size,table td.filesize,table th.column-mtime,table td.date{display:none}table td{padding:0}table.multiselect thead{padding-left:0}.fileList a.action.action-menu img{padding-left:0}.fileList .fileActionsMenu{margin-right:6px}.fileList a.action-share span:not(.icon):not(.avatar){position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}td.filename a.name .system-tags{display:none}#uploadprogressbar,#uploadprogressbar .label.inner{width:50px}#uploadprogressbar .desktop{display:none !important}#uploadprogressbar .mobile{display:block !important}table.dragshadow{z-index:1000}}@media only screen and (max-width: 480px){table th .selectedActions{float:right}table th .selectedActions>a span:not(.icon){display:none}table th .selectedActions a{padding:17px 14px}table.multiselect th .columntitle.name{margin-left:0}}/*# sourceMappingURL=mobile.css.map */
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["mobile.scss"],"names":[],"mappings":"AAMA,oGAEA,iCACC,iCAGD,2EAIC,aAID,SACC,UAID,wBACC,eAGD,mCACC,eAGD,2BACC,iBAID,sDACC,kBACA,cACA,SACA,UACA,WACA,gBAID,gCACC,aAKD,mDACC,WAGD,4BACC,wBAED,2BACC,yBAID,iBACC,cAID,0CAEC,0BACC,YAED,4CACC,aAID,4BACC,kBAID,uCACC","file":"mobile.css"}
+90
View File
@@ -0,0 +1,90 @@
@use 'variables';
/* 938 = table min-width(688) + app-navigation width: 250\
$breakpoint-mobile +1 = size where app-navigation is hidden +1
688 = table min-width */
$min-table-width: 688px;
@media only screen and (max-width: $min-table-width + variables.$navigation-width) and (min-width: variables.$breakpoint-mobile + 1), only screen and (max-width: $min-table-width) {
.app-files #app-content.dir-drop{
background-color: rgba(255, 255, 255, 1)!important;
}
table th.column-size,
table td.filesize,
table th.column-mtime,
table td.date {
display: none;
}
/* remove padding to let border bottom fill the whole width*/
table td {
padding: 0;
}
/* remove shift for multiselect bar to account for missing navigation */
table.multiselect thead {
padding-left: 0;
}
.fileList a.action.action-menu img {
padding-left: 0;
}
.fileList .fileActionsMenu {
margin-right: 6px;
}
/* hide text of the share action on mobile */
/* .hidden-visually for accessbility */
.fileList a.action-share span:not(.icon):not(.avatar) {
position: absolute;
left:-10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}
// Hide system tags on mobile
td.filename a.name .system-tags {
display: none;
}
/* shorten elements for mobile */
#uploadprogressbar, #uploadprogressbar .label.inner {
width: 50px;
}
/* hide desktop-only parts */
#uploadprogressbar .desktop {
display: none !important;
}
#uploadprogressbar .mobile {
display: block !important;
}
/* ensure that it is visible over #app-content */
table.dragshadow {
z-index: 1000;
}
}
@media only screen and (max-width: 480px) {
/* Only show icons */
table th .selectedActions {
float: right;
}
table th .selectedActions > a span:not(.icon) {
display: none;
}
/* Increase touch area for the icons */
table th .selectedActions a {
padding: 17px 14px;
}
/* Remove the margin to reduce the overlap between the name and the icons */
table.multiselect th .columntitle.name {
margin-left: 0;
}
}
+1
View File
@@ -0,0 +1 @@
#upload{box-sizing:border-box;height:36px;width:39px;padding:0 !important;margin-left:3px;overflow:hidden;vertical-align:top;position:relative;z-index:-20}#upload .icon-upload{position:relative;display:block;width:100%;height:44px;width:44px;margin:-5px -3px;cursor:pointer;z-index:10;opacity:.65}.file_upload_target{display:none}.file_upload_form{display:inline;float:left;margin:0;padding:0;cursor:pointer;overflow:visible}.uploadprogresswrapper,.uploadprogresswrapper *{box-sizing:border-box}.uploadprogresswrapper{display:inline-block;vertical-align:top;height:36px;margin-left:3px}.uploadprogresswrapper>input[type=button]{height:36px;margin-left:3px}#uploadprogressbar{border-color:var(--color-border-dark);border-radius:var(--border-radius-pill) 0 0 var(--border-radius-pill);border-right:0;position:relative;float:left;width:200px;height:44px;display:inline-block;text-align:center}#uploadprogressbar .ui-progressbar-value{margin-top:.1em}#uploadprogressbar .ui-progressbar-value.ui-widget-header.ui-corner-left{height:calc(100% + 2px);top:-2px;left:-1px;position:absolute;overflow:hidden;background-color:var(--color-primary-element)}#uploadprogressbar .label{top:8px;opacity:1;overflow:hidden;white-space:nowrap;font-weight:normal}#uploadprogressbar .label.inner{color:var(--color-primary-element-text);position:absolute;display:block;width:200px}#uploadprogressbar .label.outer{position:relative;color:var(--color-main-text)}#uploadprogressbar .desktop{display:block}#uploadprogressbar .mobile{display:none}#uploadprogressbar+.stop{border-top-left-radius:0;border-bottom-left-radius:0}.oc-dialog .fileexists{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-bottom:30px}.oc-dialog .fileexists .conflict .filename,.oc-dialog .fileexists .conflict .mtime,.oc-dialog .fileexists .conflict .size{-webkit-touch-callout:initial;-webkit-user-select:initial;-khtml-user-select:initial;-moz-user-select:initial;-ms-user-select:initial;user-select:initial}.oc-dialog .fileexists .conflict .message{color:#e9322d}.oc-dialog .fileexists table{width:100%}.oc-dialog .fileexists th{padding-left:0;padding-right:0}.oc-dialog .fileexists th input[type=checkbox]{margin-right:3px}.oc-dialog .fileexists th:first-child{width:225px}.oc-dialog .fileexists th label{font-weight:normal;color:var(--color-main-text)}.oc-dialog .fileexists th .count{margin-left:3px}.oc-dialog .fileexists .conflicts .template{display:none}.oc-dialog .fileexists .conflict{width:100%;height:85px}.oc-dialog .fileexists .conflict .filename{color:#777;word-break:break-all;clear:left}.oc-dialog .fileexists .icon{width:64px;height:64px;margin:0px 5px 5px 5px;background-repeat:no-repeat;background-size:64px 64px;float:left}.oc-dialog .fileexists .original,.oc-dialog .fileexists .replacement{float:left;width:50%}.oc-dialog .fileexists .conflicts{overflow-y:auto;max-height:225px}.oc-dialog .fileexists .conflict input[type=checkbox]{float:left}.oc-dialog .fileexists #allfileslabel{float:right}.oc-dialog .fileexists #allfiles{vertical-align:bottom;position:relative;top:-3px}.oc-dialog .fileexists #allfiles+span{vertical-align:bottom}.oc-dialog .oc-dialog-buttonrow{width:100%;text-align:right}.oc-dialog .oc-dialog-buttonrow .cancel{float:left}.highlightUploaded{-webkit-animation:highlightAnimation 2s 1;-moz-animation:highlightAnimation 2s 1;-o-animation:highlightAnimation 2s 1;animation:highlightAnimation 2s 1}@-webkit-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-moz-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@-o-keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}@keyframes highlightAnimation{0%{background-color:#ffff8c}100%{background-color:rgba(0,0,0,0)}}/*# sourceMappingURL=upload.css.map */
@@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["upload.scss"],"names":[],"mappings":"AAAA,QACC,sBACA,YACA,WACA,qBACA,gBACA,gBACA,mBACA,kBACA,YAED,qBACC,kBACA,cACA,WACA,YACA,WACA,iBACA,eACA,WACA,YAED,iCACA,+FAEA,gDACC,sBAGD,uBACC,qBACA,mBACA,YACA,gBAED,0CACC,YACA,gBAED,mBACC,sCACA,sEACA,eACA,kBACA,WACA,YACA,YACA,qBACA,kBAEA,yCACC,gBAGF,yEACC,wBACA,SACA,UACA,kBACA,gBACA,8CAED,0BACC,QACA,UACA,gBACA,mBACA,mBAED,gCACC,wCACA,kBACA,cACA,YAED,gCACC,kBACA,6BAED,4BACC,cAED,2BACC,aAGD,yBACC,yBACA,4BAGD,uBACC,2BACA,yBACA,wBACA,sBACA,qBACA,iBACA,mBAGD,0HAGC,8BACA,4BACA,2BACA,yBACA,wBACA,oBAED,0CACC,cAED,6BACC,WAED,0BACC,eACA,gBAED,+CACC,iBAED,sCACC,YAED,gCACC,mBACA,6BAED,iCACC,gBAED,4CACC,aAED,iCACC,WACA,YAED,2CACC,WACA,qBACA,WAED,6BACC,WACA,YACA,uBACA,4BACA,0BACA,WAGD,qEAEC,WACA,UAED,kCACC,gBACA,iBAED,sDACC,WAED,sCACC,YAED,iCACC,sBACA,kBACA,SAED,sCACC,sBAGD,gCACC,WACA,iBAEA,wCACC,WAIF,mBACC,0CACA,uCACA,qCACA,kCAGD,sCACE,4BACA,qCAEF,mCACE,4BACA,qCAEF,iCACE,4BACA,qCAEF,8BACE,4BACA","file":"upload.css"}
+211
View File
@@ -0,0 +1,211 @@
#upload {
box-sizing: border-box;
height: 36px;
width: 39px;
padding: 0 !important; /* override default control bar button padding */
margin-left: 3px;
overflow: hidden;
vertical-align: top;
position: relative;
z-index: -20;
}
#upload .icon-upload {
position: relative;
display: block;
width: 100%;
height: 44px;
width: 44px;
margin: -5px -3px;
cursor: pointer;
z-index: 10;
opacity: .65;
}
.file_upload_target { display:none; }
.file_upload_form { display:inline; float:left; margin:0; padding:0; cursor:pointer; overflow:visible; }
.uploadprogresswrapper, .uploadprogresswrapper * {
box-sizing: border-box;
}
.uploadprogresswrapper {
display: inline-block;
vertical-align: top;
height: 36px;
margin-left: 3px;
}
.uploadprogresswrapper > input[type='button'] {
height: 36px;
margin-left: 3px;
}
#uploadprogressbar {
border-color: var(--color-border-dark);
border-radius: var(--border-radius-pill) 0 0 var(--border-radius-pill);
border-right: 0;
position:relative;
float: left;
width: 200px;
height: 44px;
display:inline-block;
text-align: center;
.ui-progressbar-value {
margin-top:.1em;
}
}
#uploadprogressbar .ui-progressbar-value.ui-widget-header.ui-corner-left {
height: calc(100% + 2px);
top: -2px;
left: -1px;
position: absolute;
overflow: hidden;
background-color: var(--color-primary-element);
}
#uploadprogressbar .label {
top: 8px;
opacity: 1;
overflow: hidden;
white-space: nowrap;
font-weight: normal;
}
#uploadprogressbar .label.inner {
color: var(--color-primary-element-text);
position: absolute;
display: block;
width: 200px;
}
#uploadprogressbar .label.outer {
position: relative;
color: var(--color-main-text);
}
#uploadprogressbar .desktop {
display: block;
}
#uploadprogressbar .mobile {
display: none;
}
#uploadprogressbar + .stop {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.oc-dialog .fileexists {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
margin-bottom: 30px;
}
.oc-dialog .fileexists .conflict .filename,
.oc-dialog .fileexists .conflict .mtime,
.oc-dialog .fileexists .conflict .size {
-webkit-touch-callout: initial;
-webkit-user-select: initial;
-khtml-user-select: initial;
-moz-user-select: initial;
-ms-user-select: initial;
user-select: initial;
}
.oc-dialog .fileexists .conflict .message {
color: #e9322d;
}
.oc-dialog .fileexists table {
width: 100%;
}
.oc-dialog .fileexists th {
padding-left: 0;
padding-right: 0;
}
.oc-dialog .fileexists th input[type='checkbox'] {
margin-right: 3px;
}
.oc-dialog .fileexists th:first-child {
width: 225px;
}
.oc-dialog .fileexists th label {
font-weight: normal;
color: var(--color-main-text);
}
.oc-dialog .fileexists th .count {
margin-left: 3px;
}
.oc-dialog .fileexists .conflicts .template {
display: none;
}
.oc-dialog .fileexists .conflict {
width: 100%;
height: 85px;
}
.oc-dialog .fileexists .conflict .filename {
color:#777;
word-break: break-all;
clear: left;
}
.oc-dialog .fileexists .icon {
width: 64px;
height: 64px;
margin: 0px 5px 5px 5px;
background-repeat: no-repeat;
background-size: 64px 64px;
float: left;
}
.oc-dialog .fileexists .original,
.oc-dialog .fileexists .replacement {
float: left;
width: 50%;
}
.oc-dialog .fileexists .conflicts {
overflow-y: auto;
max-height: 225px;
}
.oc-dialog .fileexists .conflict input[type='checkbox'] {
float: left;
}
.oc-dialog .fileexists #allfileslabel {
float:right;
}
.oc-dialog .fileexists #allfiles {
vertical-align: bottom;
position: relative;
top: -3px;
}
.oc-dialog .fileexists #allfiles + span{
vertical-align: bottom;
}
.oc-dialog .oc-dialog-buttonrow {
width:100%;
text-align:right;
.cancel {
float:left;
}
}
.highlightUploaded {
-webkit-animation: highlightAnimation 2s 1;
-moz-animation: highlightAnimation 2s 1;
-o-animation: highlightAnimation 2s 1;
animation: highlightAnimation 2s 1;
}
@-webkit-keyframes highlightAnimation {
0% { background-color: rgba(255, 255, 140, 1); }
100% { background-color: rgba(0, 0, 0, 0); }
}
@-moz-keyframes highlightAnimation {
0% { background-color: rgba(255, 255, 140, 1); }
100% { background-color: rgba(0, 0, 0, 0); }
}
@-o-keyframes highlightAnimation {
0% { background-color: rgba(255, 255, 140, 1); }
100% { background-color: rgba(0, 0, 0, 0); }
}
@keyframes highlightAnimation {
0% { background-color: rgba(255, 255, 140, 1); }
100% { background-color: rgba(0, 0, 0, 0); }
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewbox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M9.02 13.98h-2v-5h-5v-2h5v-5h2v5l5-.028V8.98h-5z" fill="#00d400"/></svg>

After

Width:  |  Height:  |  Size: 179 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>

After

Width:  |  Height:  |  Size: 188 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" fill="#fff" /></svg>

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 B

+1
View File
@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m8 2c-2.142 0-4.125 1.145-5.196 3l1.948 1.125c0.671-1.162 1.906-1.875 3.2476-1.875 1.1906 0 2.297 0.56157 3 1.5l-1.5 1.5h4.5v-4.5l-1.406 1.406c-1.129-1.348-2.802-2.1563-4.594-2.1563z"/><path d="m2 8.75v4.5l1.408-1.41c1.116 1.334 2.817 2.145 4.592 2.16 2.16 0.01827 4.116-1.132 5.196-3.002l-1.948-1.125c-0.677 1.171-1.9005 1.886-3.248 1.875-1.18-0.01-2.3047-0.572-3-1.5l1.5-1.5z"/></svg>

After

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

@@ -0,0 +1 @@
<svg width="16" height="16" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="m3.0503 4.4645 3.5355 3.5355-3.5355 3.536 1.4142 1.414 3.5355-3.5358 3.536 3.5358 1.414-1.414-3.5358-3.536 3.5358-3.5355-1.414-1.4142-3.536 3.5355-3.5355-3.5355-1.4142 1.4142z" fill="#d40000"/></svg>

After

Width:  |  Height:  |  Size: 306 B

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" id="mdi-folder" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>

After

Width:  |  Height:  |  Size: 188 B

+405
View File
@@ -0,0 +1,405 @@
/*
* Copyright (c) 2014
*
* @author Vincent Petry
* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* global dragOptions, folderDropOptions, OC */
(function() {
if (!OCA.Files) {
/**
* Namespace for the files app
* @namespace OCA.Files
*/
OCA.Files = {};
}
/**
* @namespace OCA.Files.App
*/
OCA.Files.App = {
/**
* Navigation instance
*
* @member {OCP.Files.Navigation}
*/
navigation: null,
/**
* File list for the "All files" section.
*
* @member {OCA.Files.FileList}
*/
fileList: null,
currentFileList: null,
/**
* Backbone model for storing files preferences
*/
_filesConfig: null,
/**
* Initializes the files app
*/
initialize: function() {
this.$showHiddenFiles = $('input#showhiddenfilesToggle');
var showHidden = $('#showHiddenFiles').val() === "1";
this.$showHiddenFiles.prop('checked', showHidden);
// Toggle for grid view
this.$showGridView = $('input#showgridview');
this.$showGridView.on('change', _.bind(this._onGridviewChange, this));
if ($('#fileNotFound').val() === "1") {
OC.Notification.show(t('files', 'File could not be found'), {type: 'error'});
}
this._filesConfig = OCP.InitialState.loadState('files', 'config', {})
var { fileid, scrollto, openfile } = OC.Util.History.parseUrlQuery();
var fileActions = new OCA.Files.FileActions();
// default actions
fileActions.registerDefaultActions();
// regular actions
fileActions.merge(OCA.Files.fileActions);
this._onActionsUpdated = _.bind(this._onActionsUpdated, this);
OCA.Files.fileActions.on('setDefault.app-files', this._onActionsUpdated);
OCA.Files.fileActions.on('registerAction.app-files', this._onActionsUpdated);
this.files = OCA.Files.Files;
// TODO: ideally these should be in a separate class / app (the embedded "all files" app)
this.fileList = new OCA.Files.FileList(
$('#app-content-files'), {
dragOptions: dragOptions,
folderDropOptions: folderDropOptions,
fileActions: fileActions,
allowLegacyActions: true,
scrollTo: scrollto,
openFile: openfile,
filesClient: OC.Files.getClient(),
multiSelectMenu: [
{
name: 'copyMove',
displayName: t('files', 'Move or copy'),
iconClass: 'icon-external',
order: 10,
},
{
name: 'download',
displayName: t('files', 'Download'),
iconClass: 'icon-download',
order: 10,
},
OCA.Files.FileList.MultiSelectMenuActions.ToggleSelectionModeAction,
{
name: 'delete',
displayName: t('files', 'Delete'),
iconClass: 'icon-delete',
order: 99,
},
...(
OCA?.SystemTags === undefined ? [] : ([{
name: 'tags',
displayName: t('files', 'Tags'),
iconClass: 'icon-tag',
order: 100,
}])
),
],
sorting: {
mode: $('#defaultFileSorting').val() === 'basename'
? 'name'
: $('#defaultFileSorting').val(),
direction: $('#defaultFileSortingDirection').val()
},
config: this._filesConfig,
enableUpload: true,
maxChunkSize: OC.appConfig.files && OC.appConfig.files.max_chunk_size
}
);
this.updateCurrentFileList(this.fileList)
this.files.initialize();
// for backward compatibility, the global FileList will
// refer to the one of the "files" view
window.FileList = this.fileList;
OC.Plugins.attach('OCA.Files.App', this);
this._setupEvents();
if (sessionStorage.getItem('WhatsNewServerCheck') < (Date.now() - 3600*1000)) {
OCP.WhatsNew.query(); // for Nextcloud server
sessionStorage.setItem('WhatsNewServerCheck', Date.now());
}
window._nc_event_bus.emit('files:legacy-view:initialized', this);
this.navigation = OCP.Files.Navigation
},
/**
* Destroy the app
*/
destroy: function() {
this.fileList.destroy();
this.fileList = null;
this.files = null;
OCA.Files.fileActions.off('setDefault.app-files', this._onActionsUpdated);
OCA.Files.fileActions.off('registerAction.app-files', this._onActionsUpdated);
},
_onActionsUpdated: function(ev) {
// forward new action to the file list
if (ev.action) {
this.fileList.fileActions.registerAction(ev.action);
} else if (ev.defaultAction) {
this.fileList.fileActions.setDefault(
ev.defaultAction.mime,
ev.defaultAction.name
);
}
},
/**
* Set the currently active file list
*
* Due to the file list implementations being registered after clicking the
* navigation item for the first time, OCA.Files.App is not aware of those until
* they have initialized themselves. Therefore the files list needs to call this
* method manually
*
* @param {OCA.Files.FileList} newFileList -
*/
updateCurrentFileList: function(newFileList) {
if (this.currentFileList === newFileList) {
return
}
this.currentFileList = newFileList;
if (this.currentFileList !== null) {
// update grid view to the current value
const isGridView = this.$showGridView.is(':checked');
this.currentFileList.setGridView(isGridView);
}
},
/**
* Return the currently active file list
* @return {?OCA.Files.FileList}
*/
getCurrentFileList: function () {
return this.currentFileList;
},
/**
* Returns the container of the currently visible app.
*
* @return app container
*/
getCurrentAppContainer: function() {
var viewId = this.getActiveView();
return $('#app-content-' + viewId);
},
/**
* Sets the currently active view
* @param viewId view id
*/
setActiveView: function(viewId) {
// The Navigation API will handle the final event
window._nc_event_bus.emit('files:legacy-navigation:changed', { id: viewId })
},
/**
* Returns the view id of the currently active view
* @return view id
*/
getActiveView: function() {
return this.navigation
&& this.navigation.active
&& this.navigation.active.id;
},
/**
*
* @returns {Backbone.Model}
*/
getFilesConfig: function() {
return this._filesConfig;
},
/**
* Setup events based on URL changes
*/
_setupEvents: function() {
OC.Util.History.addOnPopStateHandler(_.bind(this._onPopState, this));
// detect when app changed their current directory
$('#app-content').delegate('>div', 'changeDirectory', _.bind(this._onDirectoryChanged, this));
$('#app-content').delegate('>div', 'afterChangeDirectory', _.bind(this._onAfterDirectoryChanged, this));
$('#app-content').delegate('>div', 'changeViewerMode', _.bind(this._onChangeViewerMode, this));
},
/**
* Event handler for when the current navigation item has changed
*/
_onNavigationChanged: function(view) {
var params;
if (view && (view.itemId || view.id)) {
if (view.id) {
params = {
view: view.id,
dir: '/',
}
} else {
// Legacy handling
params = {
view: typeof view.view === 'string' && view.view !== '' ? view.view : view.itemId,
dir: view.dir ? view.dir : '/'
}
}
this._changeUrl(params.view, params.dir);
OCA.Files.Sidebar.close();
this.getCurrentAppContainer().trigger(new $.Event('urlChanged', params));
window._nc_event_bus.emit('files:navigation:changed')
}
},
/**
* Event handler for when an app notified that its directory changed
*/
_onDirectoryChanged: function(e) {
if (e.dir && !e.changedThroughUrl) {
this._changeUrl(this.getActiveView(), e.dir, e.fileId);
}
},
/**
* Event handler for when an app notified that its directory changed
*/
_onAfterDirectoryChanged: function(e) {
if (e.dir && e.fileId) {
this._changeUrl(this.getActiveView(), e.dir, e.fileId);
}
},
/**
* Event handler for when an app notifies that it needs space
* for viewer mode.
*/
_onChangeViewerMode: function(e) {
var state = !!e.viewerModeEnabled;
if (e.viewerModeEnabled) {
OCA.Files.Sidebar.close();
}
$('#app-navigation').toggleClass('hidden', state);
$('.app-files').toggleClass('viewer-mode no-sidebar', state);
},
/**
* Event handler for when the URL changed
*/
_onPopState: function(params) {
params = _.extend({
dir: '/',
view: 'files'
}, params);
var lastId = this.getActiveView();
if (!this.navigation.views.find(view => view.id === params.view)) {
params.view = 'files';
}
this.setActiveView(params.view, {silent: true});
if (lastId !== this.getActiveView()) {
this.getCurrentAppContainer().trigger(new $.Event('show', params));
window._nc_event_bus.emit('files:navigation:changed')
}
this.getCurrentAppContainer().trigger(new $.Event('urlChanged', params));
},
/**
* Encode URL params into a string, except for the "dir" attribute
* that gets encoded as path where "/" is not encoded
*
* @param {Object.<string>} params
* @return {string} encoded params
*/
_makeUrlParams: function(params) {
var dir = params.dir;
delete params.dir;
return 'dir=' + OC.encodePath(dir) + '&' + OC.buildQueryString(params);
},
/**
* Change the URL to point to the given dir and view
*/
_changeUrl: function(view, dir, fileId) {
var params = { dir: dir };
if (view !== 'files') {
params.view = view;
} else if (fileId) {
params.fileid = fileId;
}
var currentParams = OC.Util.History.parseUrlQuery();
if (currentParams.dir === params.dir && currentParams.view === params.view) {
if (currentParams.fileid !== params.fileid) {
// if only fileid changed or was added, replace instead of push
OC.Util.History.replaceState(this._makeUrlParams(params));
return
}
} else {
OC.Util.History.pushState(this._makeUrlParams(params));
return
}
},
/**
* Toggle showing gridview by default or not
*
* @returns {undefined}
*/
_onGridviewChange: function() {
const isGridView = this.$showGridView.is(':checked');
// only save state if user is logged in
if (OC.currentUser) {
$.post(OC.generateUrl('/apps/files/api/v1/showgridview'), {
show: isGridView,
});
}
this.$showGridView.next('#view-toggle')
.removeClass('icon-toggle-filelist icon-toggle-pictures')
.addClass(isGridView ? 'icon-toggle-filelist' : 'icon-toggle-pictures')
this.$showGridView.next('#view-toggle')
.attr('title', isGridView ? t('files', 'Show list view') : t('files', 'Show grid view'))
this.$showGridView.attr('aria-label', isGridView ? t('files', 'Show list view') : t('files', 'Show grid view'))
if (this.currentFileList) {
this.currentFileList.setGridView(isGridView);
}
},
};
})();
window.addEventListener('DOMContentLoaded', function() {
// wait for other apps/extensions to register their event handlers and file actions
// in the "ready" clause
_.defer(function() {
OCA.Files.App.initialize();
});
});
+367
View File
@@ -0,0 +1,367 @@
/**
* ownCloud
*
* @author Vincent Petry
* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
(function() {
/**
* @class BreadCrumb
* @memberof OCA.Files
* @classdesc Breadcrumbs that represent the current path.
*
* @param {Object} [options] options
* @param {Function} [options.onClick] click event handler
* @param {Function} [options.onDrop] drop event handler
* @param {Function} [options.getCrumbUrl] callback that returns
* the URL of a given breadcrumb
*/
var BreadCrumb = function(options){
this.$el = $('<nav></nav>');
this.$menu = $('<div class="popovermenu menu-center"><ul></ul></div>');
this.crumbSelector = '.crumb:not(.hidden):not(.crumbhome):not(.crumbmenu)';
this.hiddenCrumbSelector = '.crumb.hidden:not(.crumbhome):not(.crumbmenu)';
options = options || {};
if (options.onClick) {
this.onClick = options.onClick;
}
if (options.onDrop) {
this.onDrop = options.onDrop;
this.onOver = options.onOver;
this.onOut = options.onOut;
}
if (options.getCrumbUrl) {
this.getCrumbUrl = options.getCrumbUrl;
}
this._detailViews = [];
};
/**
* @memberof OCA.Files
*/
BreadCrumb.prototype = {
$el: null,
dir: null,
dirInfo: null,
/**
* Total width of all breadcrumbs
* @type int
* @private
*/
totalWidth: 0,
breadcrumbs: [],
onClick: null,
onDrop: null,
onOver: null,
onOut: null,
/**
* Sets the directory to be displayed as breadcrumb.
* This will re-render the breadcrumb.
* @param dir path to be displayed as breadcrumb
*/
setDirectory: function(dir) {
dir = dir.replace(/\\/g, '/');
dir = dir || '/';
if (dir !== this.dir) {
this.dir = dir;
this.render();
}
},
setDirectoryInfo: function(dirInfo) {
if (dirInfo !== this.dirInfo) {
this.dirInfo = dirInfo;
this.render();
}
},
/**
* @param {Backbone.View} detailView
*/
addDetailView: function(detailView) {
this._detailViews.push(detailView);
},
/**
* Returns the full URL to the given directory
*
* @param {Object.<String, String>} part crumb data as map
* @param {number} index crumb index
* @return full URL
*/
getCrumbUrl: function(part, index) {
return '#';
},
/**
* Renders the breadcrumb elements
*/
render: function() {
// Menu is destroyed on every change, we need to init it
OC.unregisterMenu($('.crumbmenu > .icon-more'), $('.crumbmenu > .popovermenu'));
var parts = this._makeCrumbs(this.dir || '/');
var $crumb;
var $menuItem;
this.$el.empty();
this.breadcrumbs = [];
var $crumbList = $('<ul class="breadcrumb"></ul>');
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
var $image;
var $link = $('<a></a>');
$crumb = $('<li class="crumb svg"></li>');
if(part.dir) {
$link.attr('href', this.getCrumbUrl(part, i));
}
if(part.name) {
$link.text(part.name);
}
$link.addClass(part.linkclass);
$crumb.append($link);
$crumb.data('dir', part.dir);
// Ignore menu button
$crumb.data('crumb-id', i - 1);
$crumb.addClass(part.class);
if (part.img) {
$image = $('<img class="svg"></img>');
$image.attr('src', part.img);
$image.attr('alt', part.alt);
$link.append($image);
}
this.breadcrumbs.push($crumb);
$crumbList.append($crumb);
// Only add feedback if not menu
if (this.onClick && i !== 0) {
$link.on('click', this.onClick);
}
}
this.$el.append($crumbList);
// Menu creation
this._createMenu();
for (var j = 0; j < parts.length; j++) {
var menuPart = parts[j];
if(menuPart.dir) {
$menuItem = $('<li class="crumblist"><a><span class="icon-folder"></span><span></span></a></li>');
$menuItem.data('dir', menuPart.dir);
$menuItem.find('a').attr('href', this.getCrumbUrl(part, j));
$menuItem.find('span:eq(1)').text(menuPart.name);
this.$menu.children('ul').append($menuItem);
if (this.onClick) {
$menuItem.on('click', this.onClick);
}
}
}
_.each(this._detailViews, function(view) {
view.render({
dirInfo: this.dirInfo
});
$crumb.append(view.$el);
$menuItem.append(view.$el.clone(true));
}, this);
// setup drag and drop
if (this.onDrop) {
this.$el.find('.crumb:not(:last-child):not(.crumbmenu), .crumblist:not(:last-child)').droppable({
drop: this.onDrop,
over: this.onOver,
out: this.onOut,
tolerance: 'pointer',
hoverClass: 'canDrop',
greedy: true
});
}
// Menu is destroyed on every change, we need to init it
OC.registerMenu($('.crumbmenu > .icon-more'), $('.crumbmenu > .popovermenu'));
this._resize();
},
/**
* Makes a breadcrumb structure based on the given path
*
* @param {String} dir path to split into a breadcrumb structure
* @param {String} [rootIcon=icon-home] icon to use for root
* @return {Object.<String, String>} map of {dir: path, name: displayName}
*/
_makeCrumbs: function(dir, rootIcon) {
var crumbs = [];
var pathToHere = '';
// trim leading and trailing slashes
dir = dir.replace(/^\/+|\/+$/g, '');
var parts = dir.split('/');
if (dir === '') {
parts = [];
}
// menu part
crumbs.push({
class: 'crumbmenu hidden',
linkclass: 'icon-more menutoggle'
});
// root part
crumbs.push({
name: t('files', 'Home'),
dir: '/',
class: 'crumbhome',
linkclass: rootIcon || 'icon-home'
});
for (var i = 0; i < parts.length; i++) {
var part = parts[i];
pathToHere = pathToHere + '/' + part;
crumbs.push({
dir: pathToHere,
name: part
});
}
return crumbs;
},
/**
* Calculate real width based on individual crumbs
*
* @param {boolean} ignoreHidden ignore hidden crumbs
*/
getTotalWidth: function(ignoreHidden) {
// The width has to be calculated by adding up the width of all the
// crumbs; getting the width of the breadcrumb element is not a
// valid approach, as the returned value could be clamped to its
// parent width.
var totalWidth = 0;
for (var i = 0; i < this.breadcrumbs.length; i++ ) {
var $crumb = $(this.breadcrumbs[i]);
if(!$crumb.hasClass('hidden') || ignoreHidden === true) {
totalWidth += $crumb.outerWidth(true);
}
}
return totalWidth;
},
/**
* Hide the middle crumb
*/
_hideCrumb: function() {
var length = this.$el.find(this.crumbSelector).length;
// Get the middle one floored down
var elmt = Math.floor(length / 2 - 0.5);
this.$el.find(this.crumbSelector+':eq('+elmt+')').addClass('hidden');
},
/**
* Get the crumb to show
*/
_getCrumbElement: function() {
var hidden = this.$el.find(this.hiddenCrumbSelector).length;
var shown = this.$el.find(this.crumbSelector).length;
// Get the outer one with priority to the highest
var elmt = (1 - shown % 2) * (hidden - 1);
return this.$el.find(this.hiddenCrumbSelector + ':eq('+elmt+')');
},
/**
* Show the middle crumb
*/
_showCrumb: function() {
if(this.$el.find(this.hiddenCrumbSelector).length === 1) {
this.$el.find(this.hiddenCrumbSelector).removeClass('hidden');
}
this._getCrumbElement().removeClass('hidden');
},
/**
* Create and append the popovermenu
*/
_createMenu: function() {
this.$el.find('.crumbmenu').append(this.$menu);
this.$menu.children('ul').empty();
},
/**
* Update the popovermenu
*/
_updateMenu: function() {
var menuItems = this.$el.find(this.hiddenCrumbSelector);
this.$menu.find('li').addClass('in-breadcrumb');
for (var i = 0; i < menuItems.length; i++) {
var crumbId = $(menuItems[i]).data('crumb-id');
this.$menu.find('li:eq('+crumbId+')').removeClass('in-breadcrumb');
}
},
_resize: function() {
if (this.breadcrumbs.length <= 2) {
// home & menu
return;
}
// Always hide the menu to ensure that it does not interfere with
// the width calculations; otherwise, the result could be different
// depending on whether the menu was previously being shown or not.
this.$el.find('.crumbmenu').addClass('hidden');
// Show the crumbs to compress the siblings before hiding again the
// crumbs. This is needed when the siblings expand to fill all the
// available width, as in that case their old width would limit the
// available width for the crumbs.
// Note that the crumbs shown always overflow the parent width
// (except, of course, when they all fit in).
while (this.$el.find(this.hiddenCrumbSelector).length > 0
&& Math.round(this.getTotalWidth()) <= Math.round(this.$el.parent().width())) {
this._showCrumb();
}
var siblingsWidth = 0;
this.$el.prevAll(':visible').each(function () {
siblingsWidth += $(this).outerWidth(true);
});
this.$el.nextAll(':visible').each(function () {
siblingsWidth += $(this).outerWidth(true);
});
var availableWidth = this.$el.parent().width() - siblingsWidth;
// If container is smaller than content
// AND if there are crumbs left to hide
while (Math.round(this.getTotalWidth()) > Math.round(availableWidth)
&& this.$el.find(this.crumbSelector).length > 0) {
// As soon as one of the crumbs is hidden the menu will be
// shown. This is needed for proper results in further width
// checks.
// Note that the menu is not shown only when all the crumbs were
// being shown and they all fit the available space; if any of
// the crumbs was not being shown then those shown would
// overflow the available width, so at least one will be hidden
// and thus the menu will be shown.
this.$el.find('.crumbmenu').removeClass('hidden');
this._hideCrumb();
}
this._updateMenu();
}
};
OCA.Files.BreadCrumb = BreadCrumb;
})();
@@ -0,0 +1,56 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* @class OCA.Files.DetailFileInfoView
* @classdesc
*
* Displays a block of details about the file info.
*
*/
var DetailFileInfoView = OC.Backbone.View.extend({
tagName: 'div',
className: 'detailFileInfoView',
_template: null,
/**
* returns the jQuery object for HTML output
*
* @returns {jQuery}
*/
get$: function() {
return this.$el;
},
/**
* Sets the file info to be displayed in the view
*
* @param {OCA.Files.FileInfo} fileInfo file info to set
*/
setFileInfo: function(fileInfo) {
this.model = fileInfo;
this.render();
},
/**
* Returns the file info.
*
* @return {OCA.Files.FileInfo} file info
*/
getFileInfo: function() {
return this.model;
}
});
OCA.Files.DetailFileInfoView = DetailFileInfoView;
})();
+288
View File
@@ -0,0 +1,288 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* @class OCA.Files.DetailsView
* @classdesc
*
* The details view show details about a selected file.
*
*/
var DetailsView = OC.Backbone.View.extend({
id: 'app-sidebar',
tabName: 'div',
className: 'detailsView scroll-container',
/**
* List of detail tab views
*
* @type Array<OCA.Files.DetailTabView>
*/
_tabViews: [],
/**
* List of detail file info views
*
* @type Array<OCA.Files.DetailFileInfoView>
*/
_detailFileInfoViews: [],
/**
* Id of the currently selected tab
*
* @type string
*/
_currentTabId: null,
/**
* Dirty flag, whether the view needs to be rerendered
*/
_dirty: false,
events: {
'click a.close': '_onClose',
'click .tabHeaders .tabHeader': '_onClickTab',
'keyup .tabHeaders .tabHeader': '_onKeyboardActivateTab'
},
/**
* Initialize the details view
*/
initialize: function() {
this._tabViews = [];
this._detailFileInfoViews = [];
this._dirty = true;
},
_onClose: function(event) {
OC.Apps.hideAppSidebar(this.$el);
event.preventDefault();
},
_onClickTab: function(e) {
var $target = $(e.target);
e.preventDefault();
if (!$target.hasClass('tabHeader')) {
$target = $target.closest('.tabHeader');
}
var tabId = $target.attr('data-tabid');
if (_.isUndefined(tabId)) {
return;
}
this.selectTab(tabId);
},
_onKeyboardActivateTab: function (event) {
if (event.key === " " || event.key === "Enter") {
this._onClickTab(event);
}
},
template: function(vars) {
return OCA.Files.Templates['detailsview'](vars);
},
/**
* Renders this details view
*/
render: function() {
var templateVars = {
closeLabel: t('files', 'Close')
};
this._tabViews = this._tabViews.sort(function(tabA, tabB) {
var orderA = tabA.order || 0;
var orderB = tabB.order || 0;
if (orderA === orderB) {
return OC.Util.naturalSortCompare(tabA.getLabel(), tabB.getLabel());
}
return orderA - orderB;
});
templateVars.tabHeaders = _.map(this._tabViews, function(tabView, i) {
return {
tabId: tabView.id,
label: tabView.getLabel(),
tabIcon: tabView.getIcon()
};
});
this.$el.html(this.template(templateVars));
var $detailsContainer = this.$el.find('.detailFileInfoContainer');
// render details
_.each(this._detailFileInfoViews, function(detailView) {
$detailsContainer.append(detailView.get$());
});
if (!this._currentTabId && this._tabViews.length > 0) {
this._currentTabId = this._tabViews[0].id;
}
this.selectTab(this._currentTabId);
this._updateTabVisibilities();
this._dirty = false;
},
/**
* Selects the given tab by id
*
* @param {string} tabId tab id
*/
selectTab: function(tabId) {
if (!tabId) {
return;
}
var tabView = _.find(this._tabViews, function(tab) {
return tab.id === tabId;
});
if (!tabView) {
console.warn('Details view tab with id "' + tabId + '" not found');
return;
}
this._currentTabId = tabId;
var $tabsContainer = this.$el.find('.tabsContainer');
var $tabEl = $tabsContainer.find('#' + tabId);
// hide other tabs
$tabsContainer.find('.tab').addClass('hidden');
$tabsContainer.attr('class', 'tabsContainer');
$tabsContainer.addClass(tabView.getTabsContainerExtraClasses());
// tab already rendered ?
if (!$tabEl.length) {
// render tab
$tabsContainer.append(tabView.$el);
$tabEl = tabView.$el;
}
// this should trigger tab rendering
tabView.setFileInfo(this.model);
$tabEl.removeClass('hidden');
// update tab headers
var $tabHeaders = this.$el.find('.tabHeaders li');
$tabHeaders.removeClass('selected');
$tabHeaders.filterAttr('data-tabid', tabView.id).addClass('selected');
},
/**
* Sets the file info to be displayed in the view
*
* @param {OCA.Files.FileInfoModel} fileInfo file info to set
*/
setFileInfo: function(fileInfo) {
this.model = fileInfo;
if (this._dirty) {
this.render();
} else {
this._updateTabVisibilities();
}
if (this._currentTabId) {
// only update current tab, others will be updated on-demand
var tabId = this._currentTabId;
var tabView = _.find(this._tabViews, function(tab) {
return tab.id === tabId;
});
tabView.setFileInfo(fileInfo);
}
_.each(this._detailFileInfoViews, function(detailView) {
detailView.setFileInfo(fileInfo);
});
},
/**
* Update tab headers based on the current model
*/
_updateTabVisibilities: function() {
// update tab header visibilities
var self = this;
var deselect = false;
var countVisible = 0;
var $tabHeaders = this.$el.find('.tabHeaders li');
_.each(this._tabViews, function(tabView) {
var isVisible = tabView.canDisplay(self.model);
if (isVisible) {
countVisible += 1;
}
if (!isVisible && self._currentTabId === tabView.id) {
deselect = true;
}
$tabHeaders.filterAttr('data-tabid', tabView.id).toggleClass('hidden', !isVisible);
});
// hide the whole container if there is only one tab
this.$el.find('.tabHeaders').toggleClass('hidden', countVisible <= 1);
if (deselect) {
// select the first visible tab instead
var visibleTabId = this.$el.find('.tabHeader:not(.hidden):first').attr('data-tabid');
this.selectTab(visibleTabId);
}
},
/**
* Returns the file info.
*
* @return {OCA.Files.FileInfoModel} file info
*/
getFileInfo: function() {
return this.model;
},
/**
* Adds a tab in the tab view
*
* @param {OCA.Files.DetailTabView} tab view
*/
addTabView: function(tabView) {
this._tabViews.push(tabView);
this._dirty = true;
},
/**
* Adds a detail view for file info.
*
* @param {OCA.Files.DetailFileInfoView} detail view
*/
addDetailView: function(detailView) {
this._detailFileInfoViews.push(detailView);
this._dirty = true;
},
/**
* Returns an array with the added DetailFileInfoViews.
*
* @return Array<OCA.Files.DetailFileInfoView> an array with the added
* DetailFileInfoViews.
*/
getDetailViews: function() {
return [].concat(this._detailFileInfoViews);
}
});
OCA.Files.DetailsView = DetailsView;
})();
+141
View File
@@ -0,0 +1,141 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* @class OCA.Files.DetailTabView
* @classdesc
*
* Base class for tab views to display file information.
*
*/
var DetailTabView = OC.Backbone.View.extend({
tag: 'div',
className: 'tab',
/**
* Tab label
*/
_label: null,
_template: null,
initialize: function(options) {
options = options || {};
if (!this.id) {
this.id = 'detailTabView' + DetailTabView._TAB_COUNT;
DetailTabView._TAB_COUNT++;
}
if (options.order) {
this.order = options.order || 0;
}
},
/**
* Returns the extra CSS classes used by the tabs container when this
* tab is the selected one.
*
* In general you should not extend this method, as tabs should not
* modify the classes of its container; this is reserved as a last
* resort for very specific cases in which there is no other way to get
* the proper style or behaviour.
*
* @return {String} space-separated CSS classes
*/
getTabsContainerExtraClasses: function() {
return '';
},
/**
* Returns the tab label
*
* @return {String} label
*/
getLabel: function() {
return 'Tab ' + this.id;
},
/**
* Returns the tab label
*
* @return {String}|{null} icon class
*/
getIcon: function() {
return null
},
/**
* returns the jQuery object for HTML output
*
* @returns {jQuery}
*/
get$: function() {
return this.$el;
},
/**
* Renders this details view
*
* @abstract
*/
render: function() {
// to be implemented in subclass
// FIXME: code is only for testing
this.$el.html('<div>Hello ' + this.id + '</div>');
},
/**
* Sets the file info to be displayed in the view
*
* @param {OCA.Files.FileInfoModel} fileInfo file info to set
*/
setFileInfo: function(fileInfo) {
if (this.model !== fileInfo) {
this.model = fileInfo;
this.render();
}
},
/**
* Returns the file info.
*
* @return {OCA.Files.FileInfoModel} file info
*/
getFileInfo: function() {
return this.model;
},
/**
* Load the next page of results
*/
nextPage: function() {
// load the next page, if applicable
},
/**
* Returns whether the current tab is able to display
* the given file info, for example based on mime type.
*
* @param {OCA.Files.FileInfoModel} fileInfo file info model
* @return {boolean} whether to display this tab
*/
canDisplay: function(fileInfo) {
return true;
}
});
DetailTabView._TAB_COUNT = 0;
OCA.Files = OCA.Files || {};
OCA.Files.DetailTabView = DetailTabView;
})();
File diff suppressed because it is too large Load Diff
+919
View File
@@ -0,0 +1,919 @@
/*
* Copyright (c) 2014
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* Construct a new FileActions instance
* @constructs FileActions
* @memberof OCA.Files
*/
var FileActions = function() {
this.initialize();
};
FileActions.TYPE_DROPDOWN = 0;
FileActions.TYPE_INLINE = 1;
FileActions.prototype = {
/** @lends FileActions.prototype */
actions: {},
defaults: {},
icons: {},
/**
* @deprecated
*/
currentFile: null,
/**
* Dummy jquery element, for events
*/
$el: null,
_fileActionTriggerTemplate: null,
/**
* @private
*/
initialize: function() {
this.clear();
// abusing jquery for events until we get a real event lib
this.$el = $('<div class="dummy-fileactions hidden"></div>');
$('body').append(this.$el);
this._showMenuClosure = _.bind(this._showMenu, this);
},
/**
* Adds an event handler
*
* @param {String} eventName event name
* @param {Function} callback
*/
on: function(eventName, callback) {
this.$el.on(eventName, callback);
},
/**
* Removes an event handler
*
* @param {String} eventName event name
* @param {Function} callback
*/
off: function(eventName, callback) {
this.$el.off(eventName, callback);
},
/**
* Notifies the event handlers
*
* @param {String} eventName event name
* @param {Object} data data
*/
_notifyUpdateListeners: function(eventName, data) {
this.$el.trigger(new $.Event(eventName, data));
},
/**
* Merges the actions from the given fileActions into
* this instance.
*
* @param {OCA.Files.FileActions} fileActions instance of OCA.Files.FileActions
*/
merge: function(fileActions) {
var self = this;
// merge first level to avoid unintended overwriting
_.each(fileActions.actions, function(sourceMimeData, mime) {
var targetMimeData = self.actions[mime];
if (!targetMimeData) {
targetMimeData = {};
}
self.actions[mime] = _.extend(targetMimeData, sourceMimeData);
});
this.defaults = _.extend(this.defaults, fileActions.defaults);
this.icons = _.extend(this.icons, fileActions.icons);
},
/**
* @deprecated use #registerAction() instead
*/
register: function(mime, name, permissions, icon, action, displayName) {
return this.registerAction({
name: name,
mime: mime,
permissions: permissions,
icon: icon,
actionHandler: action,
displayName: displayName || name
});
},
/**
* Register action
*
* @param {OCA.Files.FileAction} action object
*/
registerAction: function (action) {
var mime = action.mime;
var name = action.name;
var actionSpec = {
action: function(fileName, context) {
// Actions registered in one FileAction may be executed on a
// different one (for example, due to the "merge" function),
// so the listeners have to be updated on the FileActions
// from the context instead of on the one in which it was
// originally registered.
if (context && context.fileActions) {
context.fileActions._notifyUpdateListeners('beforeTriggerAction', {action: actionSpec, fileName: fileName, context: context});
}
action.actionHandler(fileName, context);
if (context && context.fileActions) {
context.fileActions._notifyUpdateListeners('afterTriggerAction', {action: actionSpec, fileName: fileName, context: context});
}
},
name: name,
displayName: action.displayName,
mime: mime,
filename: action.filename,
order: action.order || 0,
icon: action.icon,
iconClass: action.iconClass,
permissions: action.permissions,
type: action.type || FileActions.TYPE_DROPDOWN,
altText: action.altText || ''
};
if (_.isUndefined(action.displayName)) {
actionSpec.displayName = t('files', name);
}
if (_.isFunction(action.render)) {
actionSpec.render = action.render;
}
if (_.isFunction(action.shouldRender)) {
actionSpec.shouldRender = action.shouldRender;
}
if (!this.actions[mime]) {
this.actions[mime] = {};
}
this.actions[mime][name] = actionSpec;
this.icons[name] = action.icon;
this._notifyUpdateListeners('registerAction', {action: action});
},
/**
* Clears all registered file actions.
*/
clear: function() {
this.actions = {};
this.defaults = {};
this.icons = {};
this.currentFile = null;
},
/**
* Sets the default action for a given mime type.
*
* @param {String} mime mime type
* @param {String} name action name
*/
setDefault: function (mime, name) {
this.defaults[mime] = name;
this._notifyUpdateListeners('setDefault', {defaultAction: {mime: mime, name: name}});
},
/**
* Returns a map of file actions handlers matching the given conditions
*
* @param {string} mime mime type
* @param {string} type "dir" or "file"
* @param {number} permissions permissions
* @param {string} filename filename
*
* @return {Object.<string,OCA.Files.FileActions~actionHandler>} map of action name to action spec
*/
get: function(mime, type, permissions, filename) {
var actions = this.getActions(mime, type, permissions, filename);
var filteredActions = {};
$.each(actions, function (name, action) {
filteredActions[name] = action.action;
});
return filteredActions;
},
/**
* Returns an array of file actions matching the given conditions
*
* @param {string} mime mime type
* @param {string} type "dir" or "file"
* @param {number} permissions permissions
* @param {string} filename filename
*
* @return {Array.<OCA.Files.FileAction>} array of action specs
*/
getActions: function(mime, type, permissions, filename) {
var actions = {};
if (this.actions.all) {
actions = $.extend(actions, this.actions.all);
}
if (type) {//type is 'dir' or 'file'
if (this.actions[type]) {
actions = $.extend(actions, this.actions[type]);
}
}
if (mime) {
var mimePart = mime.substr(0, mime.indexOf('/'));
if (this.actions[mimePart]) {
actions = $.extend(actions, this.actions[mimePart]);
}
if (this.actions[mime]) {
actions = $.extend(actions, this.actions[mime]);
}
}
var filteredActions = {};
var self = this;
$.each(actions, function(name, action) {
if (self.allowedPermissions(action.permissions, permissions) &&
self.allowedFilename(action.filename, filename)) {
filteredActions[name] = action;
}
});
return filteredActions;
},
allowedPermissions: function(actionPermissions, permissions) {
return (actionPermissions === OC.PERMISSION_NONE || (actionPermissions & permissions));
},
allowedFilename: function(actionFilename, filename) {
return (!filename || filename === '' || !actionFilename
|| actionFilename === '' || actionFilename === filename);
},
/**
* Returns the default file action handler for the given conditions
*
* @param {string} mime mime type
* @param {string} type "dir" or "file"
* @param {number} permissions permissions
*
* @return {OCA.Files.FileActions~actionHandler} action handler
*
* @deprecated use getDefaultFileAction instead
*/
getDefault: function (mime, type, permissions) {
var defaultActionSpec = this.getDefaultFileAction(mime, type, permissions);
if (defaultActionSpec) {
return defaultActionSpec.action;
}
return undefined;
},
/**
* Returns the default file action handler for the current file
*
* @return {OCA.Files.FileActions~actionSpec} action spec
* @since 8.2
*/
getCurrentDefaultFileAction: function() {
var mime = this.getCurrentMimeType();
var type = this.getCurrentType();
var permissions = this.getCurrentPermissions();
return this.getDefaultFileAction(mime, type, permissions);
},
/**
* Returns the default file action handler for the given conditions
*
* @param {string} mime mime type
* @param {string} type "dir" or "file"
* @param {number} permissions permissions
*
* @return {OCA.Files.FileActions~actionSpec} action spec
* @since 8.2
*/
getDefaultFileAction: function(mime, type, permissions) {
var mimePart;
if (mime) {
mimePart = mime.substr(0, mime.indexOf('/'));
}
var name = false;
if (mime && this.defaults[mime]) {
name = this.defaults[mime];
} else if (mime && this.defaults[mimePart]) {
name = this.defaults[mimePart];
} else if (type && this.defaults[type]) {
name = this.defaults[type];
} else {
name = this.defaults.all;
}
var actions = this.getActions(mime, type, permissions);
return actions[name];
},
/**
* Default function to render actions
*
* @param {OCA.Files.FileAction} actionSpec file action spec
* @param {boolean} isDefault true if the action is a default one,
* false otherwise
* @param {OCA.Files.FileActionContext} context action context
*/
_defaultRenderAction: function(actionSpec, isDefault, context) {
if (!isDefault) {
var params = {
name: actionSpec.name,
nameLowerCase: actionSpec.name.toLowerCase(),
displayName: actionSpec.displayName,
icon: actionSpec.icon,
iconClass: actionSpec.iconClass,
altText: actionSpec.altText,
hasDisplayName: !!actionSpec.displayName
};
if (_.isFunction(actionSpec.icon)) {
params.icon = actionSpec.icon(context.$file.attr('data-file'), context);
}
if (_.isFunction(actionSpec.iconClass)) {
params.iconClass = actionSpec.iconClass(context.$file.attr('data-file'), context);
}
var $actionLink = this._makeActionLink(params, context);
context.$file.find('a.name>span.fileactions').append($actionLink);
$actionLink.addClass('permanent');
return $actionLink;
}
},
/**
* Renders the action link element
*
* @param {Object} params action params
*/
_makeActionLink: function(params) {
return $(OCA.Files.Templates['file_action_trigger'](params));
},
/**
* Displays the file actions dropdown menu
*
* @param {string} fileName file name
* @param {OCA.Files.FileActionContext} context rendering context
*/
_showMenu: function(fileName, context) {
var menu;
var $trigger = context.$file.closest('tr').find('.fileactions .action-menu');
$trigger.addClass('open');
$trigger.attr('aria-expanded', 'true');
menu = new OCA.Files.FileActionsMenu();
context.$file.find('td.filename').append(menu.$el);
menu.$el.on('afterHide', function() {
context.$file.removeClass('mouseOver');
$trigger.removeClass('open');
$trigger.attr('aria-expanded', 'false');
menu.remove();
});
context.$file.addClass('mouseOver');
menu.show(context);
},
/**
* Renders the menu trigger on the given file list row
*
* @param {Object} $tr file list row element
* @param {OCA.Files.FileActionContext} context rendering context
*/
_renderMenuTrigger: function($tr, context) {
// remove previous
$tr.find('.action-menu').remove();
var $el = this._renderInlineAction({
name: 'menu',
displayName: '',
iconClass: 'icon-more',
altText: t('files', 'Actions'),
action: this._showMenuClosure
}, false, context);
$el.addClass('permanent');
$el.attr('aria-expanded', 'false');
},
/**
* Renders the action element by calling actionSpec.render() and
* registers the click event to process the action.
*
* @param {OCA.Files.FileAction} actionSpec file action to render
* @param {boolean} isDefault true if the action is a default action,
* false otherwise
* @param {OCA.Files.FileActionContext} context rendering context
*/
_renderInlineAction: function(actionSpec, isDefault, context) {
if (actionSpec.shouldRender) {
if (!actionSpec.shouldRender(context)) {
return;
}
}
var renderFunc = actionSpec.render || _.bind(this._defaultRenderAction, this);
var $actionEl = renderFunc(actionSpec, isDefault, context);
if (!$actionEl || !$actionEl.length) {
return;
}
$actionEl.on(
'click', {
a: null
},
function(event) {
event.stopPropagation();
event.preventDefault();
if ($actionEl.hasClass('open')) {
return;
}
var $file = $(event.target).closest('tr');
if ($file.hasClass('busy')) {
return;
}
var currentFile = $file.find('td.filename');
var fileName = $file.attr('data-file');
context.fileActions.currentFile = currentFile;
var callContext = _.extend({}, context);
if (!context.dir && context.fileList) {
callContext.dir = $file.attr('data-path') || context.fileList.getCurrentDirectory();
}
if (!context.fileInfoModel && context.fileList) {
callContext.fileInfoModel = context.fileList.getModelForFile(fileName);
if (!callContext.fileInfoModel) {
console.warn('No file info model found for file "' + fileName + '"');
}
}
actionSpec.action(
fileName,
callContext
);
}
);
return $actionEl;
},
/**
* Trigger the given action on the given file.
*
* @param {string} actionName action name
* @param {OCA.Files.FileInfoModel} fileInfoModel file info model
* @param {OCA.Files.FileList} [fileList] file list, for compatibility with older action handlers [DEPRECATED]
*
* @return {boolean} true if the action handler was called, false otherwise
*
* @since 8.2
*/
triggerAction: function(actionName, fileInfoModel, fileList) {
var actionFunc;
var actions = this.get(
fileInfoModel.get('mimetype'),
fileInfoModel.isDirectory() ? 'dir' : 'file',
fileInfoModel.get('permissions'),
fileInfoModel.get('name')
);
if (actionName) {
actionFunc = actions[actionName];
} else {
actionFunc = this.getDefault(
fileInfoModel.get('mimetype'),
fileInfoModel.isDirectory() ? 'dir' : 'file',
fileInfoModel.get('permissions')
);
}
if (!actionFunc) {
actionFunc = actions['Download'];
}
if (!actionFunc) {
return false;
}
var context = {
fileActions: this,
fileInfoModel: fileInfoModel,
dir: fileInfoModel.get('path')
};
var fileName = fileInfoModel.get('name');
this.currentFile = fileName;
if (fileList) {
// compatibility with action handlers that expect these
context.fileList = fileList;
context.$file = fileList.findFileEl(fileName);
}
actionFunc(fileName, context);
},
/**
* Display file actions for the given element
* @param parent "td" element of the file for which to display actions
* @param triggerEvent if true, triggers the fileActionsReady on the file
* list afterwards (false by default)
* @param fileList OCA.Files.FileList instance on which the action is
* done, defaults to OCA.Files.App.fileList
*/
display: function (parent, triggerEvent, fileList) {
if (!fileList) {
console.warn('FileActions.display() MUST be called with a OCA.Files.FileList instance');
return;
}
this.currentFile = parent;
var self = this;
var $tr = parent.closest('tr');
var actions = this.getActions(
this.getCurrentMimeType(),
this.getCurrentType(),
this.getCurrentPermissions(),
this.getCurrentFile()
);
var nameLinks;
if ($tr.data('renaming')) {
return;
}
// recreate fileactions container
nameLinks = parent.children('a.name');
nameLinks.find('.fileactions, .nametext .action').remove();
nameLinks.append('<span class="fileactions"></span>');
var defaultAction = this.getDefaultFileAction(
this.getCurrentMimeType(),
this.getCurrentType(),
this.getCurrentPermissions()
);
var context = {
$file: $tr,
fileActions: this,
fileList: fileList
};
$.each(actions, function (name, actionSpec) {
if (actionSpec.type === FileActions.TYPE_INLINE) {
self._renderInlineAction(
actionSpec,
defaultAction && actionSpec.name === defaultAction.name,
context
);
}
});
function objectValues(obj) {
var res = [];
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
res.push(obj[i]);
}
}
return res;
}
// polyfill
if (!Object.values) {
Object.values = objectValues;
}
var menuActions = Object.values(actions).filter(function (action) {
return action.type !== OCA.Files.FileActions.TYPE_INLINE && (!defaultAction || action.name !== defaultAction.name)
});
// do not render the menu if nothing is in it
if (menuActions.length > 0) {
this._renderMenuTrigger($tr, context);
}
if (triggerEvent){
fileList.$fileList.trigger(jQuery.Event("fileActionsReady", {fileList: fileList, $files: $tr}));
}
},
getCurrentFile: function () {
return this.currentFile.parent().attr('data-file');
},
getCurrentMimeType: function () {
return this.currentFile.parent().attr('data-mime');
},
getCurrentType: function () {
return this.currentFile.parent().attr('data-type');
},
getCurrentPermissions: function () {
return this.currentFile.parent().data('permissions');
},
/**
* Register the actions that are used by default for the files app.
*/
registerDefaultActions: function() {
this.registerAction({
name: 'Download',
displayName: t('files', 'Download'),
order: -20,
mime: 'all',
permissions: OC.PERMISSION_READ,
iconClass: 'icon-download',
actionHandler: function (filename, context) {
var dir = context.dir || context.fileList.getCurrentDirectory();
var isDir = context.$file.attr('data-type') === 'dir';
var url = context.fileList.getDownloadUrl(filename, dir, isDir);
var downloadFileaction = $(context.$file).find('.fileactions .action-download');
// don't allow a second click on the download action
if(downloadFileaction.hasClass('disabled')) {
return;
}
if (url) {
var disableLoadingState = function() {
context.fileList.showFileBusyState(filename, false);
};
context.fileList.showFileBusyState(filename, true);
OCA.Files.Files.handleDownload(url, disableLoadingState);
}
}
});
this.registerAction({
name: 'Rename',
displayName: t('files', 'Rename'),
mime: 'all',
order: -30,
permissions: OC.PERMISSION_UPDATE,
iconClass: 'icon-rename',
actionHandler: function (filename, context) {
context.fileList.rename(filename);
}
});
this.registerAction({
name: 'MoveCopy',
displayName: function(context) {
var permissions = context.fileInfoModel.attributes.permissions;
if (permissions & OC.PERMISSION_UPDATE) {
if (!context.fileInfoModel.canDownload()) {
return t('files', 'Move');
}
return t('files', 'Move or copy');
}
return t('files', 'Copy');
},
mime: 'all',
order: -25,
permissions: $('#isPublic').val() ? OC.PERMISSION_UPDATE : OC.PERMISSION_READ,
iconClass: 'icon-external',
actionHandler: function (filename, context) {
var permissions = context.fileInfoModel.attributes.permissions;
var actions = OC.dialogs.FILEPICKER_TYPE_COPY;
if (permissions & OC.PERMISSION_UPDATE) {
if (!context.fileInfoModel.canDownload()) {
actions = OC.dialogs.FILEPICKER_TYPE_MOVE;
} else {
actions = OC.dialogs.FILEPICKER_TYPE_COPY_MOVE;
}
}
var dialogDir = context.dir;
if (typeof context.fileList.dirInfo.dirLastCopiedTo !== 'undefined') {
dialogDir = context.fileList.dirInfo.dirLastCopiedTo;
}
OC.dialogs.filepicker(t('files', 'Choose target folder'), function(targetPath, type) {
if (type === OC.dialogs.FILEPICKER_TYPE_COPY) {
context.fileList.copy(filename, targetPath, false, context.dir);
}
if (type === OC.dialogs.FILEPICKER_TYPE_MOVE) {
context.fileList.move(filename, targetPath, false, context.dir);
}
context.fileList.dirInfo.dirLastCopiedTo = targetPath;
}, false, "httpd/unix-directory", true, actions, dialogDir);
}
});
if (Boolean(OC.appswebroots.files_reminders) && Boolean(OC.appswebroots.notifications)) {
this.registerAction({
name: 'SetReminder',
displayName: function(_context) {
return t('files', 'Set reminder');
},
mime: 'all',
order: -24,
icon: function(_filename, _context) {
return OC.imagePath('files_reminders', 'alarm.svg')
},
permissions: $('#isPublic').val() ? null : OC.PERMISSION_READ,
actionHandler: function(_filename, _context) {},
});
}
if (!/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {
this.registerAction({
name: 'EditLocally',
displayName: function(context) {
var locked = context.$file.data('locked');
if (!locked) {
return t('files', 'Edit locally');
}
},
mime: 'all',
order: -23,
icon: function(filename, context) {
var locked = context.$file.data('locked');
if (!locked) {
return OC.imagePath('files', 'computer.svg')
}
},
permissions: OC.PERMISSION_UPDATE,
actionHandler: function (filename, context) {
var dir = context.dir || context.fileList.getCurrentDirectory();
var path = dir === '/' ? dir + filename : dir + '/' + filename;
context.fileList.openLocalClient(path);
},
});
}
this.registerAction({
name: 'Open',
mime: 'dir',
permissions: OC.PERMISSION_READ,
icon: '',
actionHandler: function (filename, context) {
let dir, id
if (context.$file) {
dir = context.$file.attr('data-path')
id = context.$file.attr('data-id')
} else {
dir = context.fileList.getCurrentDirectory()
id = context.fileId
}
if (OCA.Files.App && OCA.Files.App.getActiveView() !== 'files') {
OCA.Files.App.setActiveView('files', {silent: true});
OCA.Files.App.fileList.changeDirectory(OC.joinPaths(dir, filename), true, true);
} else {
context.fileList.changeDirectory(OC.joinPaths(dir, filename), true, false, parseInt(id, 10));
}
},
displayName: t('files', 'Open')
});
this.registerAction({
name: 'Delete',
displayName: function(context) {
var mountType = context.$file.attr('data-mounttype');
var type = context.$file.attr('data-type');
var deleteTitle = (type && type === 'file')
? t('files', 'Delete file')
: t('files', 'Delete folder')
if (mountType === 'external-root') {
deleteTitle = t('files', 'Disconnect storage');
} else if (mountType === 'shared-root') {
deleteTitle = t('files', 'Leave this share');
}
return deleteTitle;
},
mime: 'all',
order: 1000,
// permission is READ because we show a hint instead if there is no permission
permissions: OC.PERMISSION_DELETE,
iconClass: 'icon-delete',
actionHandler: function(fileName, context) {
// if there is no permission to delete do nothing
if((context.$file.data('permissions') & OC.PERMISSION_DELETE) === 0) {
return;
}
context.fileList.do_delete(fileName, context.dir);
$('.tipsy').remove();
// close sidebar on delete
const path = context.dir + '/' + fileName
if (OCA.Files.Sidebar && OCA.Files.Sidebar.file === path) {
OCA.Files.Sidebar.close()
}
}
});
this.setDefault('dir', 'Open');
}
};
OCA.Files.FileActions = FileActions;
/**
* Replaces the button icon with a loading spinner and vice versa
* - also adds the class disabled to the passed in element
*
* @param {jQuery} $buttonElement The button element
* @param {boolean} showIt whether to show the spinner(true) or to hide it(false)
*/
OCA.Files.FileActions.updateFileActionSpinner = function($buttonElement, showIt) {
var $icon = $buttonElement.find('.icon');
if (showIt) {
var $loadingIcon = $('<span class="icon icon-loading-small"></span>');
$icon.after($loadingIcon);
$icon.addClass('hidden');
} else {
$buttonElement.find('.icon-loading-small').remove();
$buttonElement.find('.icon').removeClass('hidden');
}
};
/**
* File action attributes.
*
* @todo make this a real class in the future
* @typedef {Object} OCA.Files.FileAction
*
* @property {String} name identifier of the action
* @property {(String|OCA.Files.FileActions~displayNameFunction)} displayName
* display name string for the action, or function that returns the display name.
* Defaults to the name given in name property
* @property {String} mime mime type
* @property {String} filename filename
* @property {number} permissions permissions
* @property {(Function|String)} icon icon path to the icon or function that returns it (deprecated, use iconClass instead)
* @property {(String|OCA.Files.FileActions~iconClassFunction)} iconClass class name of the icon (recommended for theming)
* @property {OCA.Files.FileActions~renderActionFunction} [render] optional rendering function
* @property {OCA.Files.FileActions~actionHandler} actionHandler action handler function
*/
/**
* File action context attributes.
*
* @typedef {Object} OCA.Files.FileActionContext
*
* @property {Object} $file jQuery file row element
* @property {OCA.Files.FileActions} fileActions file actions object
* @property {OCA.Files.FileList} fileList file list object
*/
/**
* Render function for actions.
* The function must render a link element somewhere in the DOM
* and return it. The function should NOT register the event handler
* as this will be done after the link was returned.
*
* @callback OCA.Files.FileActions~renderActionFunction
* @param {OCA.Files.FileAction} actionSpec action definition
* @param {Object} $row row container
* @param {boolean} isDefault true if the action is the default one,
* false otherwise
* @return {Object} jQuery link object
*/
/**
* Display name function for actions.
* The function returns the display name of the action using
* the given context information..
*
* @callback OCA.Files.FileActions~displayNameFunction
* @param {OCA.Files.FileActionContext} context action context
* @return {String} display name
*/
/**
* Icon class function for actions.
* The function returns the icon class of the action using
* the given context information.
*
* @callback OCA.Files.FileActions~iconClassFunction
* @param {String} fileName name of the file on which the action must be performed
* @param {OCA.Files.FileActionContext} context action context
* @return {String} icon class
*/
/**
* Action handler function for file actions
*
* @callback OCA.Files.FileActions~actionHandler
* @param {String} fileName name of the file on which the action must be performed
* @param context context
* @param {String} context.dir directory of the file
* @param {OCA.Files.FileInfoModel} fileInfoModel file info model
* @param {Object} [context.$file] jQuery element of the file [DEPRECATED]
* @param {OCA.Files.FileList} [context.fileList] the FileList instance on which the action occurred [DEPRECATED]
* @param {OCA.Files.FileActions} context.fileActions the FileActions instance on which the action occurred
*/
// global file actions to be used by all lists
OCA.Files.fileActions = new OCA.Files.FileActions();
})();
@@ -0,0 +1,147 @@
/*
* Copyright (c) 2014
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* Construct a new FileActionsMenu instance
* @constructs FileActionsMenu
* @memberof OCA.Files
*/
var FileActionsMenu = OC.Backbone.View.extend({
tagName: 'div',
className: 'fileActionsMenu popovermenu bubble hidden open menu',
/**
* Current context
*
* @type OCA.Files.FileActionContext
*/
_context: null,
events: {
'click a.action': '_onClickAction'
},
template: function(data) {
return OCA.Files.Templates['fileactionsmenu'](data);
},
/**
* Event handler whenever an action has been clicked within the menu
*
* @param {Object} event event object
*/
_onClickAction: function(event) {
var $target = $(event.target);
if (!$target.is('a')) {
$target = $target.closest('a');
}
var fileActions = this._context.fileActions;
var actionName = $target.attr('data-action');
var actions = fileActions.getActions(
fileActions.getCurrentMimeType(),
fileActions.getCurrentType(),
fileActions.getCurrentPermissions(),
fileActions.getCurrentFile()
);
var actionSpec = actions[actionName];
var fileName = this._context.$file.attr('data-file');
event.stopPropagation();
event.preventDefault();
OC.hideMenus();
actionSpec.action(
fileName,
this._context
);
},
/**
* Renders the menu with the currently set items
*/
render: function() {
var self = this;
var fileActions = this._context.fileActions;
var actions = fileActions.getActions(
fileActions.getCurrentMimeType(),
fileActions.getCurrentType(),
fileActions.getCurrentPermissions(),
fileActions.getCurrentFile()
);
var defaultAction = fileActions.getCurrentDefaultFileAction();
var items = _.filter(actions, function(actionSpec) {
return !defaultAction || actionSpec.name !== defaultAction.name;
});
items = _.map(items, function(item) {
if (_.isFunction(item.displayName)) {
item = _.extend({}, item);
item.displayName = item.displayName(self._context);
}
if (_.isFunction(item.iconClass)) {
var fileName = self._context.$file.attr('data-file');
item = _.extend({}, item);
item.iconClass = item.iconClass(fileName, self._context);
}
if (_.isFunction(item.icon)) {
var fileName = self._context.$file.attr('data-file');
item = _.extend({}, item);
item.icon = item.icon(fileName, self._context);
}
item.inline = item.type === OCA.Files.FileActions.TYPE_INLINE
return item;
});
items = items.sort(function(actionA, actionB) {
var orderA = actionA.order || 0;
var orderB = actionB.order || 0;
if (orderB === orderA) {
return OC.Util.naturalSortCompare(actionA.displayName, actionB.displayName);
}
return orderA - orderB;
});
items = _.map(items, function(item) {
item.nameLowerCase = item.name.toLowerCase();
return item;
});
this.$el.html(this.template({
items: items
}));
},
/**
* Displays the menu under the given element
*
* @param {OCA.Files.FileActionContext} context context
* @param {Object} $trigger trigger element
*/
show: function(context) {
this._context = context;
this.render();
this.$el.removeClass('hidden');
window._nc_event_bus.emit('files:action-menu:opened', {
el: this.$el[0],
context,
})
OC.showMenu(null, this.$el);
}
});
OCA.Files.FileActionsMenu = FileActionsMenu;
})();
+148
View File
@@ -0,0 +1,148 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function(OC, OCA) {
/**
* @class OC.Files.FileInfo
* @classdesc File information
*
* @param {Object} attributes file data
* @param {number} attributes.id file id
* @param {string} attributes.name file name
* @param {string} attributes.path path leading to the file,
* without the file name and with a leading slash
* @param {number} attributes.size size
* @param {string} attributes.mimetype mime type
* @param {string} attributes.icon icon URL
* @param {number} attributes.permissions permissions
* @param {Date} attributes.mtime modification time
* @param {string} attributes.etag etag
* @param {string} mountType mount type
*
* @since 8.2
*/
var FileInfoModel = OC.Backbone.Model.extend({
defaults: {
mimetype: 'application/octet-stream',
path: ''
},
_filesClient: null,
initialize: function(data, options) {
if (!_.isUndefined(data.id)) {
data.id = parseInt(data.id, 10);
}
if( options ){
if (options.filesClient) {
this._filesClient = options.filesClient;
}
}
},
/**
* Returns whether this file is a directory
*
* @return {boolean} true if this is a directory, false otherwise
*/
isDirectory: function() {
return this.get('mimetype') === 'httpd/unix-directory';
},
/**
* Returns whether this file is an image
*
* @return {boolean} true if this is an image, false otherwise
*/
isImage: function() {
if (!this.has('mimetype')) {
return false;
}
return this.get('mimetype').substr(0, 6) === 'image/'
|| this.get('mimetype') === 'application/postscript'
|| this.get('mimetype') === 'application/illustrator'
|| this.get('mimetype') === 'application/x-photoshop';
},
/**
* Returns the full path to this file
*
* @return {string} full path
*/
getFullPath: function() {
return OC.joinPaths(this.get('path'), this.get('name'));
},
/**
* Returns the mimetype of the file
*
* @return {string} mimetype
*/
getMimeType: function() {
return this.get('mimetype');
},
/**
* Reloads missing properties from server and set them in the model.
* @param properties array of properties to be reloaded
* @return ajax call object
*/
reloadProperties: function(properties) {
if( !this._filesClient ){
return;
}
var self = this;
var deferred = $.Deferred();
var targetPath = OC.joinPaths(this.get('path') + '/', this.get('name'));
this._filesClient.getFileInfo(targetPath, {
properties: properties
})
.then(function(status, data) {
// the following lines should be extracted to a mapper
if( properties.indexOf(OC.Files.Client.PROPERTY_GETCONTENTLENGTH) !== -1
|| properties.indexOf(OC.Files.Client.PROPERTY_SIZE) !== -1 ) {
self.set('size', data.size);
}
deferred.resolve(status, data);
})
.fail(function(status) {
OC.Notification.show(t('files', 'Could not load info for file "{file}"', {file: self.get('name')}), {type: 'error'});
deferred.reject(status);
});
return deferred.promise();
},
canDownload: function() {
for (const i in this.attributes.shareAttributes) {
const attr = this.attributes.shareAttributes[i]
if (attr.scope === 'permissions' && attr.key === 'download') {
return attr.enabled
}
}
return true
},
});
if (!OCA.Files) {
OCA.Files = {};
}
OCA.Files.FileInfoModel = FileInfoModel;
})(OC, OCA);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,97 @@
/*
* Copyright (c) 2018
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
var FileMultiSelectMenu = OC.Backbone.View.extend({
tagName: 'div',
className: 'filesSelectMenu popovermenu bubble menu-center',
_scopes: null,
initialize: function(menuItems) {
this._scopes = menuItems;
},
events: {
'click a.action': '_onClickAction'
},
/**
* Renders the menu with the currently set items
*/
render: function() {
this.$el.html(OCA.Files.Templates['filemultiselectmenu']({
items: this._scopes
}));
},
/**
* Displays the menu under the given element
*
* @param {OCA.Files.FileActionContext} context context
* @param {Object} $trigger trigger element
*/
show: function(context) {
this._context = context;
this.$el.removeClass('hidden');
if (window.innerWidth < 480) {
this.$el.removeClass('menu-center').addClass('menu-right');
} else {
this.$el.removeClass('menu-right').addClass('menu-center');
}
OC.showMenu(null, this.$el);
return false;
},
toggleItemVisibility: function (itemName, show) {
if (show) {
this.$el.find('.item-' + itemName).removeClass('hidden');
} else {
this.$el.find('.item-' + itemName).addClass('hidden');
}
},
updateItemText: function (itemName, translation) {
this.$el.find('.item-' + itemName).find('.label').text(translation);
},
toggleLoading: function (itemName, showLoading) {
var $actionElement = this.$el.find('.item-' + itemName);
if ($actionElement.length === 0) {
return;
}
var $icon = $actionElement.find('.icon');
if (showLoading) {
var $loadingIcon = $('<span class="icon icon-loading-small"></span>');
$icon.after($loadingIcon);
$icon.addClass('hidden');
$actionElement.addClass('disabled');
} else {
$actionElement.find('.icon-loading-small').remove();
$actionElement.find('.icon').removeClass('hidden');
$actionElement.removeClass('disabled');
}
},
isDisabled: function (itemName) {
var $actionElement = this.$el.find('.item-' + itemName);
return $actionElement.hasClass('disabled');
},
/**
* Event handler whenever an action has been clicked within the menu
*
* @param {Object} event event object
*/
_onClickAction: function (event) {
var $target = $(event.currentTarget);
if (!$target.hasClass('menuitem')) {
$target = $target.closest('.menuitem');
}
OC.hideMenus();
this._context.multiSelectMenuClick(event, $target.data('action'));
return false;
}
});
OCA.Files.FileMultiSelectMenu = FileMultiSelectMenu;
})(OC, OCA);
+547
View File
@@ -0,0 +1,547 @@
/*
* Copyright (c) 2014
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* global getURLParameter */
/**
* Utility class for file related operations
*/
(function() {
var Files = {
// file space size sync
_updateStorageStatistics: function(currentDir) {
var state = Files.updateStorageStatistics;
if (state.dir){
if (state.dir === currentDir) {
return;
}
// cancel previous call, as it was for another dir
state.call.abort();
}
state.dir = currentDir;
state.call = $.getJSON(OC.generateUrl('apps/files/api/v1/stats?dir={dir}', {
dir: currentDir,
}), function(response) {
state.dir = null;
state.call = null;
Files.updateMaxUploadFilesize(response);
});
},
// update quota
updateStorageQuotas: function() {
Files._updateStorageQuotasThrottled();
},
_updateStorageQuotas: function() {
var state = Files.updateStorageQuotas;
state.call = $.getJSON(OC.generateUrl('apps/files/api/v1/stats'), function(response) {
Files.updateQuota(response);
});
},
/**
* Update storage statistics such as free space, max upload,
* etc based on the given directory.
*
* Note this function is debounced to avoid making too
* many ajax calls in a row.
*
* @param dir directory
* @param force whether to force retrieving
*/
updateStorageStatistics: function(dir, force) {
if (!OC.currentUser) {
return;
}
if (force) {
Files._updateStorageStatistics(dir);
}
else {
Files._updateStorageStatisticsDebounced(dir);
}
},
updateMaxUploadFilesize:function(response) {
if (response === undefined) {
return;
}
if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) {
$('#free_space').val(response.data.freeSpace);
$('#upload.button').attr('title', response.data.maxHumanFilesize);
$('#usedSpacePercent').val(response.data.usedSpacePercent);
$('#usedSpacePercent').data('mount-type', response.data.mountType);
$('#usedSpacePercent').data('mount-point', response.data.mountPoint);
$('#owner').val(response.data.owner);
$('#ownerDisplayName').val(response.data.ownerDisplayName);
Files.displayStorageWarnings();
OCA.Files.App.fileList._updateDirectoryPermissions();
}
if (response[0] === undefined) {
return;
}
if (response[0].uploadMaxFilesize !== undefined) {
$('#upload.button').attr('title', response[0].maxHumanFilesize);
$('#usedSpacePercent').val(response[0].usedSpacePercent);
Files.displayStorageWarnings();
}
},
updateQuota:function(response) {
if (response === undefined) {
return;
}
if (response.data !== undefined
&& response.data.quota !== undefined
&& response.data.total !== undefined
&& response.data.used !== undefined
&& response.data.usedSpacePercent !== undefined) {
var humanUsed = OC.Util.humanFileSize(response.data.used, true, false);
var humanTotal = OC.Util.humanFileSize(response.data.total, true, false);
if (response.data.quota > 0) {
$('#quota').attr('title', t('files', '{used}%', {used: Math.round(response.data.usedSpacePercent)}));
$('#quota progress').val(response.data.usedSpacePercent);
$('#quotatext').html(t('files', '{used} of {quota} used', {used: humanUsed, quota: humanTotal}));
} else {
$('#quotatext').html(t('files', '{used} used', {used: humanUsed}));
}
if (response.data.usedSpacePercent > 80) {
$('#quota progress').addClass('warn');
} else {
$('#quota progress').removeClass('warn');
}
}
},
/**
* Fix path name by removing double slash at the beginning, if any
*/
fixPath: function(fileName) {
if (fileName.substr(0, 2) == '//') {
return fileName.substr(1);
}
return fileName;
},
/**
* Checks whether the given file name is valid.
* @param name file name to check
* @return true if the file name is valid.
* Throws a string exception with an error message if
* the file name is not valid
*
* NOTE: This function is duplicated in the filepicker inside core/src/OC/dialogs.js
*/
isFileNameValid: function (name) {
var trimmedName = name.trim();
if (trimmedName === '.' || trimmedName === '..')
{
throw t('files', '"{name}" is an invalid file name.', {name: name});
} else if (trimmedName.length === 0) {
throw t('files', 'File name cannot be empty.');
} else if (trimmedName.indexOf('/') !== -1) {
throw t('files', '"/" is not allowed inside a file name.');
} else if (!!(trimmedName.match(OC.config.blacklist_files_regex))) {
throw t('files', '"{name}" is not an allowed filetype', {name: name});
}
return true;
},
displayStorageWarnings: function() {
if (!OC.Notification.isHidden()) {
return;
}
var usedSpacePercent = $('#usedSpacePercent').val(),
owner = $('#owner').val(),
ownerDisplayName = $('#ownerDisplayName').val(),
mountType = $('#usedSpacePercent').data('mount-type'),
mountPoint = $('#usedSpacePercent').data('mount-point');
if (usedSpacePercent > 98) {
if (owner !== OC.getCurrentUser().uid) {
OC.Notification.show(t('files', 'Storage of {owner} is full, files cannot be updated or synced anymore!',
{owner: ownerDisplayName}), {type: 'error'}
);
} else if (mountType === 'group') {
OC.Notification.show(t('files',
'Group folder "{mountPoint}" is full, files cannot be updated or synced anymore!',
{mountPoint: mountPoint}),
{type: 'error'}
);
} else if (mountType === 'external') {
OC.Notification.show(t('files',
'External storage "{mountPoint}" is full, files cannot be updated or synced anymore!',
{mountPoint: mountPoint}),
{type : 'error'}
);
} else {
OC.Notification.show(t('files',
'Your storage is full, files cannot be updated or synced anymore!'),
{type: 'error'}
);
}
} else if (usedSpacePercent > 90) {
if (owner !== OC.getCurrentUser().uid) {
OC.Notification.show(t('files', 'Storage of {owner} is almost full ({usedSpacePercent}%).',
{
usedSpacePercent: usedSpacePercent,
owner: ownerDisplayName
}),
{
type: 'error'
}
);
} else if (mountType === 'group') {
OC.Notification.show(t('files',
'Group folder "{mountPoint}" is almost full ({usedSpacePercent}%).',
{mountPoint: mountPoint, usedSpacePercent: usedSpacePercent}),
{type : 'error'}
);
} else if (mountType === 'external') {
OC.Notification.show(t('files',
'External storage "{mountPoint}" is almost full ({usedSpacePercent}%).',
{mountPoint: mountPoint, usedSpacePercent: usedSpacePercent}),
{type : 'error'}
);
} else {
OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%).',
{usedSpacePercent: usedSpacePercent}),
{type : 'error'}
);
}
}
},
/**
* Returns the download URL of the given file(s)
* @param {string} filename string or array of file names to download
* @param {string} [dir] optional directory in which the file name is, defaults to the current directory
* @param {boolean} [isDir=false] whether the given filename is a directory and might need a special URL
*/
getDownloadUrl: function(filename, dir, isDir) {
if (!_.isArray(filename) && !isDir) {
var pathSections = dir.split('/');
pathSections.push(filename);
var encodedPath = '';
_.each(pathSections, function(section) {
if (section !== '') {
encodedPath += '/' + encodeURIComponent(section);
}
});
return OC.linkToRemoteBase('webdav') + encodedPath;
}
if (_.isArray(filename)) {
filename = JSON.stringify(filename);
}
var params = {
dir: dir,
files: filename
};
return this.getAjaxUrl('download', params);
},
/**
* Returns the ajax URL for a given action
* @param action action string
* @param params optional params map
*/
getAjaxUrl: function(action, params) {
var q = '';
if (params) {
q = '?' + OC.buildQueryString(params);
}
return OC.filePath('files', 'ajax', action + '.php') + q;
},
/**
* Fetch the icon url for the mimetype
* @param {string} mime The mimetype
* @param {Files~mimeicon} ready Function to call when mimetype is retrieved
* @deprecated use OC.MimeType.getIconUrl(mime)
*/
getMimeIcon: function(mime, ready) {
ready(OC.MimeType.getIconUrl(mime));
},
/**
* Generates a preview URL based on the URL space.
* @param urlSpec attributes for the URL
* @param {number} urlSpec.x width
* @param {number} urlSpec.y height
* @param {String} urlSpec.file path to the file
* @return preview URL
* @deprecated used OCA.Files.FileList.generatePreviewUrl instead
*/
generatePreviewUrl: function(urlSpec) {
OC.debug && console.warn('DEPRECATED: please use generatePreviewUrl() from an OCA.Files.FileList instance');
return OCA.Files.App.fileList.generatePreviewUrl(urlSpec);
},
/**
* Lazy load preview
* @deprecated used OCA.Files.FileList.lazyLoadPreview instead
*/
lazyLoadPreview : function(path, mime, ready, width, height, etag) {
OC.debug && console.warn('DEPRECATED: please use lazyLoadPreview() from an OCA.Files.FileList instance');
return FileList.lazyLoadPreview({
path: path,
mime: mime,
callback: ready,
width: width,
height: height,
etag: etag
});
},
/**
* Initialize the files view
*/
initialize: function() {
Files.bindKeyboardShortcuts(document, $);
// drag&drop support using jquery.fileupload
// TODO use OC.dialogs
$(document).bind('drop dragover', function (e) {
e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
});
// display storage warnings
setTimeout(Files.displayStorageWarnings, 100);
// only possible at the moment if user is logged in or the files app is loaded
if (OC.currentUser && OCA.Files.App && OC.config.session_keepalive) {
// start on load - we ask the server every 5 minutes
var func = _.bind(OCA.Files.App.fileList.updateStorageStatistics, OCA.Files.App.fileList);
var updateStorageStatisticsInterval = 5*60*1000;
var updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
// TODO: this should also stop when switching to another view
// Use jquery-visibility to de-/re-activate file stats sync
if ($.support.pageVisibility) {
$(document).on({
'show': function() {
if (!updateStorageStatisticsIntervalId) {
updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
}
},
'hide': function() {
clearInterval(updateStorageStatisticsIntervalId);
updateStorageStatisticsIntervalId = 0;
}
});
}
}
$('#webdavurl').on('click touchstart', function () {
this.focus();
this.setSelectionRange(0, this.value.length);
});
//FIXME scroll to and highlight preselected file
/*
if (getURLParameter('scrollto')) {
FileList.scrollTo(getURLParameter('scrollto'));
}
*/
},
/**
* Handles the download and calls the callback function once the download has started
* - browser sends download request and adds parameter with a token
* - server notices this token and adds a set cookie to the download response
* - browser now adds this cookie for the domain
* - JS periodically checks for this cookie and then knows when the download has started to call the callback
*
* @param {string} url download URL
* @param {Function} callback function to call once the download has started
*/
handleDownload: function(url, callback) {
var randomToken = Math.random().toString(36).substring(2),
checkForDownloadCookie = function() {
if (!OC.Util.isCookieSetToValue('ocDownloadStarted', randomToken)){
return false;
} else {
callback();
return true;
}
};
if (url.indexOf('?') >= 0) {
url += '&';
} else {
url += '?';
}
OC.redirect(url + 'downloadStartSecret=' + randomToken);
OC.Util.waitFor(checkForDownloadCookie, 500);
}
};
Files._updateStorageStatisticsDebounced = _.debounce(Files._updateStorageStatistics, 250);
Files._updateStorageQuotasThrottled = _.throttle(Files._updateStorageQuotas, 30000);
OCA.Files.Files = Files;
})();
// TODO: move to FileList
var createDragShadow = function(event) {
// FIXME: inject file list instance somehow
/* global FileList, Files */
//select dragged file
var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
if (!isDragSelected) {
//select dragged file
FileList._selectFileEl($(event.target).parents('tr:first'), true, false);
}
// do not show drag shadow for too many files
var selectedFiles = _.first(FileList.getSelectedFiles(), FileList.pageSize());
selectedFiles = _.sortBy(selectedFiles, FileList._fileInfoCompare);
if (!isDragSelected && selectedFiles.length === 1) {
//revert the selection
FileList._selectFileEl($(event.target).parents('tr:first'), false, false);
}
// build dragshadow
var dragshadow = $('<table class="dragshadow"></table>');
var tbody = $('<tbody></tbody>');
dragshadow.append(tbody);
var dir = FileList.getCurrentDirectory();
$(selectedFiles).each(function(i,elem) {
// TODO: refactor this with the table row creation code
var newtr = $('<tr></tr>')
.attr('data-dir', dir)
.attr('data-file', elem.name)
.attr('data-origin', elem.origin);
newtr.append($('<td class="filename"></td>').text(elem.name).css('background-size', 32));
newtr.append($('<td class="size"></td>').text(OC.Util.humanFileSize(elem.size, false, false)));
tbody.append(newtr);
if (elem.type === 'dir') {
newtr.find('td.filename')
.css('background-image', 'url(' + OC.MimeType.getIconUrl('folder') + ')');
} else {
var path = dir + '/' + elem.name;
Files.lazyLoadPreview(path, elem.mimetype, function(previewpath) {
newtr.find('td.filename')
.css('background-image', 'url(' + previewpath + ')');
}, null, null, elem.etag);
}
});
return dragshadow;
};
//options for file drag/drop
//start&stop handlers needs some cleaning up
// TODO: move to FileList class
var dragOptions={
revert: 'invalid',
revertDuration: 300,
opacity: 0.7,
cursorAt: { left: 24, top: 18 },
helper: createDragShadow,
cursor: 'move',
start: function(event, ui){
var $selectedFiles = $('td.filename input:checkbox:checked');
if (!$selectedFiles.length) {
$selectedFiles = $(this);
}
$selectedFiles.closest('tr').addClass('animate-opacity dragging');
$selectedFiles.closest('tr').filter('.ui-droppable').droppable( 'disable' );
// Show breadcrumbs menu
$('.crumbmenu').addClass('canDropChildren');
},
stop: function(event, ui) {
var $selectedFiles = $('td.filename input:checkbox:checked');
if (!$selectedFiles.length) {
$selectedFiles = $(this);
}
var $tr = $selectedFiles.closest('tr');
$tr.removeClass('dragging');
$tr.filter('.ui-droppable').droppable( 'enable' );
setTimeout(function() {
$tr.removeClass('animate-opacity');
}, 300);
// Hide breadcrumbs menu
$('.crumbmenu').removeClass('canDropChildren');
},
drag: function(event, ui) {
// Prevent scrolling when hovering .files-controls
if ($(event.originalEvent.target).parents('.files-controls').length > 0) {
return
}
/** @type {JQuery<HTMLDivElement>} */
const scrollingArea = FileList.$container;
// Get the top and bottom scroll trigger y positions
const containerHeight = scrollingArea.innerHeight() ?? 0
const scrollTriggerArea = Math.min(Math.floor(containerHeight / 2), 100);
const bottomTriggerY = containerHeight - scrollTriggerArea;
const topTriggerY = scrollTriggerArea;
// Get the cursor position relative to the container
const containerOffset = scrollingArea.offset() ?? {left: 0, top: 0}
const cursorPositionY = event.pageY - containerOffset.top
const currentScrollTop = scrollingArea.scrollTop() ?? 0
if (cursorPositionY < topTriggerY) {
scrollingArea.scrollTop(currentScrollTop - 10)
} else if (cursorPositionY > bottomTriggerY) {
scrollingArea.scrollTop(currentScrollTop + 10)
}
}
};
// sane browsers support using the distance option
if ( $('html.ie').length === 0) {
dragOptions['distance'] = 20;
}
// TODO: move to FileList class
var folderDropOptions = {
hoverClass: "canDrop",
drop: function( event, ui ) {
// don't allow moving a file into a selected folder
/* global FileList */
if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) {
return false;
}
var $tr = $(this).closest('tr');
if (($tr.data('permissions') & OC.PERMISSION_CREATE) === 0) {
FileList._showPermissionDeniedNotification();
return false;
}
var targetPath = FileList.getCurrentDirectory() + '/' + $tr.data('file');
var files = FileList.getSelectedFiles();
if (files.length === 0) {
// single one selected without checkbox?
files = _.map(ui.helper.find('tr'), function(el) {
return FileList.elementToFile($(el));
});
}
FileList.move(_.pluck(files, 'name'), targetPath);
},
tolerance: 'pointer'
};
// for backward compatibility
window.Files = OCA.Files.Files;
+282
View File
@@ -0,0 +1,282 @@
/**
* ownCloud
*
* @author Vincent Petry
* @copyright 2014 Vincent Petry <pvince81@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
(function() {
/**
* The FileSummary class encapsulates the file summary values and
* the logic to render it in the given container
*
* @constructs FileSummary
* @memberof OCA.Files
*
* @param $tr table row element
* @param {OC.Backbone.Model} [options.filesConfig] files app configuration
*/
var FileSummary = function($tr, options) {
options = options || {};
var self = this;
this.$el = $tr;
var filesConfig = options.config;
if (filesConfig) {
this._showHidden = !!filesConfig.show_hidden;
window._nc_event_bus.subscribe('files:config:updated', ({ key, value }) => {
if (key === 'show_hidden') {
self._showHidden = !!value;
self.update();
}
});
}
this.clear();
this.render();
};
FileSummary.prototype = {
_showHidden: null,
summary: {
totalFiles: 0,
totalDirs: 0,
totalHidden: 0,
totalSize: 0,
filter:'',
sumIsPending:false
},
/**
* Returns whether the given file info must be hidden
*
* @param {OC.Files.FileInfo} fileInfo file info
*
* @return {boolean} true if the file is a hidden file, false otherwise
*/
_isHiddenFile: function(file) {
return file.name && file.name.charAt(0) === '.';
},
/**
* Adds file
* @param {OC.Files.FileInfo} file file to add
* @param {boolean} update whether to update the display
*/
add: function(file, update) {
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
return;
}
if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
this.summary.totalDirs++;
}
else {
this.summary.totalFiles++;
}
if (this._isHiddenFile(file)) {
this.summary.totalHidden++;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
this.summary.totalSize += size;
} else {
this.summary.sumIsPending = true;
}
if (!!update) {
this.update();
}
},
/**
* Removes file
* @param {OC.Files.FileInfo} file file to remove
* @param {boolean} update whether to update the display
*/
remove: function(file, update) {
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
return;
}
if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
this.summary.totalDirs--;
}
else {
this.summary.totalFiles--;
}
if (this._isHiddenFile(file)) {
this.summary.totalHidden--;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
this.summary.totalSize -= size;
}
if (!!update) {
this.update();
}
},
setFilter: function(filter, files){
this.summary.filter = filter.toLowerCase();
this.calculate(files);
},
/**
* Returns the total of files and directories
*/
getTotal: function() {
return this.summary.totalDirs + this.summary.totalFiles;
},
/**
* Recalculates the summary based on the given files array
* @param files array of files
*/
calculate: function(files) {
var file;
var summary = {
totalDirs: 0,
totalFiles: 0,
totalHidden: 0,
totalSize: 0,
filter: this.summary.filter,
sumIsPending: false
};
for (var i = 0; i < files.length; i++) {
file = files[i];
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
continue;
}
if (file.type === 'dir' || file.mime === 'httpd/unix-directory') {
summary.totalDirs++;
}
else {
summary.totalFiles++;
}
if (this._isHiddenFile(file)) {
summary.totalHidden++;
}
var size = parseInt(file.size, 10) || 0;
if (size >=0) {
summary.totalSize += size;
} else {
summary.sumIsPending = true;
}
}
this.setSummary(summary);
},
/**
* Clears the summary
*/
clear: function() {
this.calculate([]);
},
/**
* Sets the current summary values
* @param summary map
*/
setSummary: function(summary) {
this.summary = summary;
if (typeof this.summary.filter === 'undefined') {
this.summary.filter = '';
}
this.update();
},
_infoTemplate: function(data) {
/* NOTE: To update the template make changes in filesummary.handlebars
* and run:
*
* handlebars -n OCA.Files.FileSummary.Templates filesummary.handlebars -f filesummary_template.js
*/
return OCA.Files.Templates['filesummary'](_.extend({
connectorLabel: t('files', '{dirs} and {files}', {dirs: '', files: ''})
}, data));
},
/**
* Renders the file summary element
*/
update: function() {
if (!this.$el) {
return;
}
if (!this.summary.totalFiles && !this.summary.totalDirs) {
this.$el.addClass('hidden');
return;
}
// There's a summary and data -> Update the summary
this.$el.removeClass('hidden');
var $dirInfo = this.$el.find('.dirinfo');
var $fileInfo = this.$el.find('.fileinfo');
var $connector = this.$el.find('.connector');
var $filterInfo = this.$el.find('.filter');
var $hiddenInfo = this.$el.find('.hiddeninfo');
// Substitute old content with new translations
$dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs));
$fileInfo.html(n('files', '%n file', '%n files', this.summary.totalFiles));
$hiddenInfo.html(' (' + n('files', 'including %n hidden', 'including %n hidden', this.summary.totalHidden) + ')');
var fileSize = this.summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(this.summary.totalSize, false, false);
this.$el.find('.filesize').html(fileSize);
// Show only what's necessary (may be hidden)
if (this.summary.totalDirs === 0) {
$dirInfo.addClass('hidden');
$connector.addClass('hidden');
} else {
$dirInfo.removeClass('hidden');
}
if (this.summary.totalFiles === 0) {
$fileInfo.addClass('hidden');
$connector.addClass('hidden');
} else {
$fileInfo.removeClass('hidden');
}
if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) {
$connector.removeClass('hidden');
}
$hiddenInfo.toggleClass('hidden', this.summary.totalHidden === 0 || this._showHidden)
if (this.summary.filter === '') {
$filterInfo.html('');
$filterInfo.addClass('hidden');
} else {
$filterInfo.html(' ' + n('files', 'matches "{filter}"', 'match "{filter}"', this.summary.totalDirs + this.summary.totalFiles, {filter: this.summary.filter}));
$filterInfo.removeClass('hidden');
}
},
render: function() {
if (!this.$el) {
return;
}
var summary = this.summary;
// don't show the filesize column, if filesize is NaN (e.g. in trashbin)
var fileSize = '';
if (!isNaN(summary.totalSize)) {
fileSize = summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(summary.totalSize, false, false);
fileSize = '<td class="filesize">' + fileSize + '</td>';
}
var $summary = $(
'<td class="filesummary">'+ this._infoTemplate() + '</td>' +
fileSize +
'<td class="date"></td>'
);
this.$el.addClass('hidden');
this.$el.append($summary);
this.update();
}
};
OCA.Files.FileSummary = FileSummary;
})();
+64
View File
@@ -0,0 +1,64 @@
/*
* Copyright (c) 2016 Robin Appelman <robin@icewind.nl>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function (OCA) {
OCA.Files = OCA.Files || {};
/**
* @namespace OCA.Files.GotoPlugin
*
*/
OCA.Files.GotoPlugin = {
name: 'Goto',
disallowedLists: [
'files',
'trashbin'
],
attach: function (fileList) {
if (this.disallowedLists.indexOf(fileList.id) !== -1) {
return;
}
// lists where the "Open" default action is disabled should
// also have the goto action disabled
if (fileList._defaultFileActionsDisabled) {
return
}
var fileActions = fileList.fileActions;
fileActions.registerAction({
name: 'Goto',
displayName: t('files', 'View in folder'),
mime: 'all',
permissions: OC.PERMISSION_ALL,
iconClass: 'icon-goto nav-icon-extstoragemounts',
type: OCA.Files.FileActions.TYPE_DROPDOWN,
actionHandler: function (fileName, context) {
var fileModel = context.fileInfoModel;
OCA.Files.Sidebar.close();
OCA.Files.App.setActiveView('files', { silent: true });
OCA.Files.App.fileList.changeDirectory(fileModel.get('path'), true, true).then(function() {
OCA.Files.App.fileList.scrollTo(fileModel.get('name'));
});
},
render: function (actionSpec, isDefault, context) {
return fileActions._defaultRenderAction.call(fileActions, actionSpec, isDefault, context)
.removeClass('permanent');
}
});
}
};
})(OCA);
OC.Plugins.register('OCA.Files.FileList', OCA.Files.GotoPlugin);
+88
View File
@@ -0,0 +1,88 @@
/*!
* jquery-visibility v1.0.11
* Page visibility shim for jQuery.
*
* Project Website: http://mths.be/visibility
*
* @version 1.0.11
* @license MIT.
* @author Mathias Bynens - @mathias
* @author Jan Paepke - @janpaepke
*/
;(function (root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], function ($) {
return factory(root, $);
});
} else if (typeof exports === 'object') {
// Node/CommonJS
module.exports = factory(root, require('jquery'));
} else {
// Browser globals
factory(root, jQuery);
}
}(this, function(window, $, undefined) {
"use strict";
var
document = window.document,
property, // property name of document, that stores page visibility
vendorPrefixes = ['webkit', 'o', 'ms', 'moz', ''],
$support = $.support || {},
// In Opera, `'onfocusin' in document == true`, hence the extra `hasFocus` check to detect IE-like behavior
eventName = 'onfocusin' in document && 'hasFocus' in document ?
'focusin focusout' :
'focus blur';
var prefix;
while ((prefix = vendorPrefixes.pop()) !== undefined) {
property = (prefix ? prefix + 'H': 'h') + 'idden';
$support.pageVisibility = document[property] !== undefined;
if ($support.pageVisibility) {
eventName = prefix + 'visibilitychange';
break;
}
}
// normalize to and update document hidden property
function updateState() {
if (property !== 'hidden') {
document.hidden = $support.pageVisibility ? document[property] : undefined;
}
}
updateState();
$(/blur$/.test(eventName) ? window : document).on(eventName, function(event) {
var type = event.type;
var originalEvent = event.originalEvent;
// Avoid errors from triggered native events for which `originalEvent` is
// not available.
if (!originalEvent) {
return;
}
var toElement = originalEvent.toElement;
// If its a `{focusin,focusout}` event (IE), `fromElement` and `toElement`
// should both be `null` or `undefined`; else, the page visibility hasnt
// changed, but the user just clicked somewhere in the doc. In IE9, we need
// to check the `relatedTarget` property instead.
if (
!/^focus./.test(type) || (
toElement === undefined &&
originalEvent.fromElement === undefined &&
originalEvent.relatedTarget === undefined
)
) {
$(document).triggerHandler(
property && document[property] || /^(?:blur|focusout)$/.test(type) ?
'hide' :
'show'
);
}
// and update the current state
updateState();
});
}));
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,169 @@
/**
* Copyright (c) 2012 Erik Sargent <esthepiking at gmail dot com>
* This file is licensed under the Affero General Public License version 3 or
* later.
*/
/*****************************
* Keyboard shortcuts for Files app
* ctrl/cmd+n: new folder
* ctrl/cmd+shift+n: new file
* esc (while new file context menu is open): close menu
* up/down: select file/folder
* enter: open file/folder
* delete/backspace: delete file/folder
*****************************/
(function(Files) {
var keys = [];
var keyCodes = {
shift: 16,
n: 78,
cmdFirefox: 224,
cmdOpera: 17,
leftCmdWebKit: 91,
rightCmdWebKit: 93,
ctrl: 17,
esc: 27,
downArrow: 40,
upArrow: 38,
enter: 13,
del: 46
};
function removeA(arr) {
var what, a = arguments,
L = a.length,
ax;
while (L > 1 && arr.length) {
what = a[--L];
while ((ax = arr.indexOf(what)) !== -1) {
arr.splice(ax, 1);
}
}
return arr;
}
function newFile() {
$("#new").addClass("active");
$(".popup.popupTop").toggle(true);
$('#new li[data-type="file"]').trigger('click');
removeA(keys, keyCodes.n);
}
function newFolder() {
$("#new").addClass("active");
$(".popup.popupTop").toggle(true);
$('#new li[data-type="folder"]').trigger('click');
removeA(keys, keyCodes.n);
}
function esc() {
$(".files-controls").trigger('click');
}
function down() {
var select = -1;
$(".files-fileList tr").each(function(index) {
if ($(this).hasClass("mouseOver")) {
select = index + 1;
$(this).removeClass("mouseOver");
}
});
if (select === -1) {
$(".files-fileList tr:first").addClass("mouseOver");
} else {
$(".files-fileList tr").each(function(index) {
if (index === select) {
$(this).addClass("mouseOver");
}
});
}
}
function up() {
var select = -1;
$(".files-fileList tr").each(function(index) {
if ($(this).hasClass("mouseOver")) {
select = index - 1;
$(this).removeClass("mouseOver");
}
});
if (select === -1) {
$(".files-fileList tr:last").addClass("mouseOver");
} else {
$(".files-fileList tr").each(function(index) {
if (index === select) {
$(this).addClass("mouseOver");
}
});
}
}
function enter() {
$(".files-fileList tr").each(function(index) {
if ($(this).hasClass("mouseOver")) {
$(this).removeClass("mouseOver");
$(this).find("span.nametext").trigger('click');
}
});
}
function del() {
$(".files-fileList tr").each(function(index) {
if ($(this).hasClass("mouseOver")) {
$(this).removeClass("mouseOver");
$(this).find("a.action.delete").trigger('click');
}
});
}
function rename() {
$(".files-fileList tr").each(function(index) {
if ($(this).hasClass("mouseOver")) {
$(this).removeClass("mouseOver");
$(this).find("a[data-action='Rename']").trigger('click');
}
});
}
Files.bindKeyboardShortcuts = function(document, $) {
$(document).keydown(function(event) { //check for modifier keys
if(!$(event.target).is('body')) {
return;
}
var preventDefault = false;
if ($.inArray(event.keyCode, keys) === -1) {
keys.push(event.keyCode);
}
if (
$.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) {
preventDefault = true; //new file/folder prevent browser from responding
}
if (preventDefault) {
event.preventDefault(); //Prevent web browser from responding
event.stopPropagation();
return false;
}
});
$(document).keyup(function(event) {
// do your event.keyCode checks in here
if (
$.inArray(keyCodes.n, keys) !== -1 && ($.inArray(keyCodes.cmdFirefox, keys) !== -1 || $.inArray(keyCodes.cmdOpera, keys) !== -1 || $.inArray(keyCodes.leftCmdWebKit, keys) !== -1 || $.inArray(keyCodes.rightCmdWebKit, keys) !== -1 || $.inArray(keyCodes.ctrl, keys) !== -1 || event.ctrlKey)) {
if ($.inArray(keyCodes.shift, keys) !== -1) { //16=shift, New File
newFile();
} else { //New Folder
newFolder();
}
} else if ($("#new").hasClass("active") && $.inArray(keyCodes.esc, keys) !== -1) { //close new window
esc();
} else if ($.inArray(keyCodes.downArrow, keys) !== -1) { //select file
down();
} else if ($.inArray(keyCodes.upArrow, keys) !== -1) { //select file
up();
} else if (!$("#new").hasClass("active") && $.inArray(keyCodes.enter, keys) !== -1) { //open file
enter();
} else if (!$("#new").hasClass("active") && $.inArray(keyCodes.del, keys) !== -1) { //delete file
del();
}
removeA(keys, event.keyCode);
});
};
})((OCA.Files && OCA.Files.Files) || {});
@@ -0,0 +1,195 @@
/*
* Copyright (c) 2015
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
/**
* @class OCA.Files.MainFileInfoDetailView
* @classdesc
*
* Displays main details about a file
*
*/
var MainFileInfoDetailView = OCA.Files.DetailFileInfoView.extend(
/** @lends OCA.Files.MainFileInfoDetailView.prototype */ {
className: 'mainFileInfoView',
/**
* Associated file list instance, for file actions
*
* @type {OCA.Files.FileList}
*/
_fileList: null,
/**
* File actions
*
* @type {OCA.Files.FileActions}
*/
_fileActions: null,
/**
* @type {OCA.Files.SidebarPreviewManager}
*/
_previewManager: null,
events: {
'click a.action-favorite': '_onClickFavorite',
'click a.action-default': '_onClickDefaultAction',
'click a.permalink': '_onClickPermalink',
'focus .permalink-field>input': '_onFocusPermalink'
},
template: function(data) {
return OCA.Files.Templates['mainfileinfodetailsview'](data);
},
initialize: function(options) {
options = options || {};
this._fileList = options.fileList;
this._fileActions = options.fileActions;
if (!this._fileList) {
throw 'Missing required parameter "fileList"';
}
if (!this._fileActions) {
throw 'Missing required parameter "fileActions"';
}
this._previewManager = new OCA.Files.SidebarPreviewManager(this._fileList);
this._setupClipboard();
},
_setupClipboard: function() {
var clipboard = new Clipboard('.permalink');
clipboard.on('success', function(e) {
OC.Notification.show(t('files', 'Direct link was copied (only works for users who have access to this file/folder)'), {type: 'success'});
});
clipboard.on('error', function(e) {
var $row = this.$('.permalink-field');
$row.toggleClass('hidden');
if (!$row.hasClass('hidden')) {
$row.find('>input').focus();
}
});
},
_onClickPermalink: function(e) {
e.preventDefault();
return;
},
_onFocusPermalink: function() {
this.$('.permalink-field>input').select();
},
_onClickFavorite: function(event) {
event.preventDefault();
this._fileActions.triggerAction('Favorite', this.model, this._fileList);
},
_onClickDefaultAction: function(event) {
event.preventDefault();
this._fileActions.triggerAction(null, this.model, this._fileList);
},
_onModelChanged: function() {
// simply re-render
this.render();
},
_makePermalink: function(fileId) {
var baseUrl = OC.getProtocol() + '://' + OC.getHost();
return baseUrl + OC.generateUrl('/f/{fileId}', {fileId: fileId});
},
setFileInfo: function(fileInfo) {
if (this.model) {
this.model.off('change', this._onModelChanged, this);
}
this.model = fileInfo;
if (this.model) {
this.model.on('change', this._onModelChanged, this);
}
if (this.model) {
var properties = [];
if( !this.model.has('size') ) {
properties.push(OC.Files.Client.PROPERTY_SIZE);
properties.push(OC.Files.Client.PROPERTY_GETCONTENTLENGTH);
}
if( properties.length > 0){
this.model.reloadProperties(properties);
}
}
this.render();
},
/**
* Renders this details view
*/
render: function() {
this.trigger('pre-render');
if (this.model) {
var isFavorite = (this.model.get('tags') || []).indexOf(OC.TAG_FAVORITE) >= 0;
var availableActions = this._fileActions.get(
this.model.get('mimetype'),
this.model.get('type'),
this.model.get('permissions'),
this.model.get('name')
);
var hasFavoriteAction = 'Favorite' in availableActions;
this.$el.html(this.template({
type: this.model.isImage()? 'image': '',
nameLabel: t('files', 'Name'),
name: this.model.get('displayName') || this.model.get('name'),
pathLabel: t('files', 'Path'),
path: this.model.get('path'),
hasSize: this.model.has('size'),
sizeLabel: t('files', 'Size'),
size: OC.Util.humanFileSize(this.model.get('size'), true, false),
altSize: n('files', '%n byte', '%n bytes', this.model.get('size')),
dateLabel: t('files', 'Modified'),
altDate: OC.Util.formatDate(this.model.get('mtime')),
timestamp: this.model.get('mtime'),
date: OC.Util.relativeModifiedDate(this.model.get('mtime')),
hasFavoriteAction: hasFavoriteAction,
starAltText: isFavorite ? t('files', 'Favorited') : t('files', 'Favorite'),
starClass: isFavorite ? 'icon-starred' : 'icon-star',
permalink: this._makePermalink(this.model.get('id')),
permalinkTitle: t('files', 'Copy direct link (only works for users who have access to this file/folder)')
}));
// TODO: we really need OC.Previews
var $iconDiv = this.$el.find('.thumbnail');
var $container = this.$el.find('.thumbnailContainer');
if (!this.model.isDirectory()) {
$iconDiv.addClass('icon-loading icon-32');
this._previewManager.loadPreview(this.model, $iconDiv, $container);
} else {
var iconUrl = this.model.get('icon') || OC.MimeType.getIconUrl('dir');
if (typeof this.model.get('mountType') !== 'undefined') {
iconUrl = OC.MimeType.getIconUrl('dir-' + this.model.get('mountType'))
}
$iconDiv.css('background-image', 'url("' + iconUrl + '")');
}
} else {
this.$el.empty();
}
this.delegateEvents();
this.trigger('post-render');
}
});
OCA.Files.MainFileInfoDetailView = MainFileInfoDetailView;
})();
@@ -0,0 +1,28 @@
[
"app.js",
"breadcrumb.js",
"detailfileinfoview.js",
"detailsview.js",
"detailtabview.js",
"file-upload.js",
"fileactions.js",
"fileactionsmenu.js",
"fileinfomodel.js",
"filelist.js",
"filemultiselectmenu.js",
"files.js",
"filesummary.js",
"gotoplugin.js",
"jquery-visibility.js",
"jquery.fileupload.js",
"keyboardshortcuts.js",
"mainfileinfodetailview.js",
"newfilemenu.js",
"operationprogressbar.js",
"recentfilelist.js",
"semaphore.js",
"sidebarpreviewmanager.js",
"sidebarpreviewtext.js",
"tagsplugin.js",
"templates.js"
]
+265
View File
@@ -0,0 +1,265 @@
/*
* Copyright (c) 2014
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* global Files */
(function() {
/**
* Construct a new NewFileMenu instance
* @constructs NewFileMenu
*
* @memberof OCA.Files
*/
var NewFileMenu = OC.Backbone.View.extend({
tagName: 'div',
// Menu is opened by default because it's rendered on "add-button" click
className: 'newFileMenu popovermenu bubble menu open menu-left',
events: {
'click .menuitem': '_onClickAction'
},
/**
* @type OCA.Files.FileList
*/
fileList: null,
initialize: function(options) {
var self = this;
var $uploadEl = $('#file_upload_start');
if ($uploadEl.length) {
$uploadEl.on('fileuploadstart', function() {
self.trigger('actionPerformed', 'upload');
});
} else {
console.warn('Missing upload element "file_upload_start"');
}
this.fileList = options && options.fileList;
this._menuItems = [{
id: 'folder',
displayName: t('files', 'New folder'),
templateName: t('files', 'New folder'),
iconClass: 'icon-folder',
fileType: 'folder',
actionLabel: t('files', 'Create new folder'),
actionHandler: function(name) {
self.fileList.createDirectory(name);
}
}];
OC.Plugins.attach('OCA.Files.NewFileMenu', this);
},
template: function(data) {
return OCA.Files.Templates['newfilemenu'](data);
},
/**
* Event handler whenever an action has been clicked within the menu
*
* @param {Object} event event object
*/
_onClickAction: function(event) {
var $target = $(event.target);
if (!$target.hasClass('menuitem')) {
$target = $target.closest('.menuitem');
}
var action = $target.attr('data-action');
// note: clicking the upload label will automatically
// set the focus on the "file_upload_start" hidden field
// which itself triggers the upload dialog.
// Currently the upload logic is still in file-upload.js and filelist.js
if (action === 'upload') {
OC.hideMenus();
} else {
var actionItem = _.filter(this._menuItems, function(item) {
return item.id === action
}).pop();
if (typeof actionItem.useInput === 'undefined' || actionItem.useInput === true) {
event.preventDefault();
this.$el.find('.menuitem.active').removeClass('active');
$target.addClass('active');
this._promptFileName($target);
} else {
actionItem.actionHandler();
OC.hideMenus();
}
}
},
_promptFileName: function($target) {
var self = this;
if ($target.find('form').length) {
$target.find('input[type=\'text\']').focus();
return;
}
// discard other forms
this.$el.find('form').remove();
this.$el.find('.displayname').removeClass('hidden');
$target.find('.displayname').addClass('hidden');
var newName = $target.attr('data-templatename');
var fileType = $target.attr('data-filetype');
var actionLabel = $target.attr('data-action-label');
var $form = $(OCA.Files.Templates['newfilemenu_filename_form']({
fileName: newName,
cid: this.cid,
fileType: fileType,
actionLabel,
}));
//this.trigger('actionPerformed', action);
$target.append($form);
// here comes the OLD code
var $input = $form.find('input[type=\'text\']');
var $submit = $form.find('input[type=\'submit\']');
var lastPos;
var checkInput = function () {
// Special handling for the setup template directory
if ($target.attr('data-action') === 'template-init') {
return true;
}
var filename = $input.val();
try {
if (!Files.isFileNameValid(filename)) {
// Files.isFileNameValid(filename) throws an exception itself
} else if (self.fileList.inList(filename)) {
throw t('files', '{newName} already exists', {newName: filename}, undefined, {
escape: false
});
} else {
return true;
}
} catch (error) {
$input.attr('title', error);
$input.addClass('error');
}
return false;
};
// verify filename on typing
$input.keyup(function() {
if (checkInput()) {
$input.removeClass('error');
}
});
$submit.click(function(event) {
event.stopPropagation();
event.preventDefault();
$form.submit();
});
$input.focus();
// pre select name up to the extension
lastPos = newName.lastIndexOf('.');
if (lastPos === -1) {
lastPos = newName.length;
}
$input.selectRange(0, lastPos);
$form.submit(function(event) {
event.stopPropagation();
event.preventDefault();
if (checkInput()) {
var newname = $input.val().trim();
/* Find the right actionHandler that should be called.
* Actions is retrieved by using `actionSpec.id` */
var action = _.filter(self._menuItems, function(item) {
return item.id == $target.attr('data-action');
}).pop();
action.actionHandler(newname);
$form.remove();
$target.find('.displayname').removeClass('hidden');
OC.hideMenus();
}
});
},
/**
* Add a new item menu entry in the New file menu (in
* last position). By clicking on the item, the
* `actionHandler` function is called.
*
* @param {Object} actionSpec items properties
*/
addMenuEntry: function(actionSpec) {
this._menuItems.push({
id: actionSpec.id,
displayName: actionSpec.displayName,
templateName: actionSpec.templateName,
iconClass: actionSpec.iconClass,
fileType: actionSpec.fileType,
useInput: actionSpec.useInput,
actionLabel: actionSpec.actionLabel,
actionHandler: actionSpec.actionHandler,
checkFilename: actionSpec.checkFilename,
shouldShow: actionSpec.shouldShow,
});
},
/**
* Remove a menu item from the "New" file menu
* @param {string} actionId
*/
removeMenuEntry: function(actionId) {
var index = this._menuItems.findIndex(function (actionSpec) {
return actionSpec.id === actionId;
});
if (index > -1) {
this._menuItems.splice(index, 1);
}
},
/**
* Renders the menu with the currently set items
*/
render: function() {
const menuItems = this._menuItems.filter(item => !item.shouldShow || (item.shouldShow instanceof Function && item.shouldShow() === true))
this.$el.html(this.template({
uploadMaxHumanFileSize: 'TODO',
uploadLabel: t('files', 'Upload file'),
items: menuItems
}));
// Trigger upload action also with keyboard navigation on enter
this.$el.find('[for="file_upload_start"]').on('keyup', function(event) {
if (event.key === " " || event.key === "Enter") {
$('#file_upload_start').trigger('click');
}
});
},
/**
* Displays the menu under the given element
*
* @param {Object} $target target element
*/
showAt: function($target) {
this.render();
OC.showMenu($target, this.$el);
}
});
OCA.Files.NewFileMenu = NewFileMenu;
})();
@@ -0,0 +1,82 @@
/*
* Copyright (c) 2018
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function() {
var OperationProgressBar = OC.Backbone.View.extend({
tagName: 'div',
id: 'uploadprogresswrapper',
events: {
'click button.stop': '_onClickCancel'
},
render: function() {
this.$el.html(OCA.Files.Templates['operationprogressbar']({
textCancelButton: t('Cancel operation')
}));
this.setProgressBarText(t('Uploading …'), t('…'));
},
hideProgressBar: function() {
var self = this;
$('#uploadprogresswrapper .stop').fadeOut();
$('#uploadprogressbar').fadeOut(function() {
self.$el.trigger(new $.Event('resized'));
});
},
hideCancelButton: function() {
var self = this;
$('#uploadprogresswrapper .stop').fadeOut(function() {
self.$el.trigger(new $.Event('resized'));
});
},
showProgressBar: function(showCancelButton) {
if (showCancelButton) {
showCancelButton = true;
}
$('#uploadprogressbar').progressbar({value: 0});
if(showCancelButton) {
$('#uploadprogresswrapper .stop').show();
} else {
$('#uploadprogresswrapper .stop').hide();
}
$('#uploadprogresswrapper .label').show();
$('#uploadprogressbar').fadeIn();
this.$el.trigger(new $.Event('resized'));
},
setProgressBarValue: function(value) {
$('#uploadprogressbar').progressbar({value: value});
},
setProgressBarText: function(textDesktop, textMobile, title) {
var labelHtml = OCA.Files.Templates['operationprogressbarlabel']({textDesktop: textDesktop, textMobile: textMobile});
$('#uploadprogressbar .ui-progressbar-value').html(labelHtml);
$('#uploadprogressbar .ui-progressbar-value>em').addClass('inner');
$('#uploadprogressbar>em').replaceWith(labelHtml);
$('#uploadprogressbar>em').addClass('outer');
if (title) {
$('#uploadprogressbar').attr('title', title);
$('#uploadprogresswrapper .tooltip-inner').text(title);
}
if(textDesktop || textMobile) {
$('#uploadprogresswrapper .stop').show();
}
},
_onClickCancel: function (event) {
this.trigger('cancel');
return false;
}
});
OCA.Files.OperationProgressBar = OperationProgressBar;
})(OC, OCA);
@@ -0,0 +1,106 @@
/*
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
// HACK: this piece needs to be loaded AFTER the files app (for unit tests)
window.addEventListener('DOMContentLoaded', function () {
(function (OCA) {
/**
* @class OCA.Files.RecentFileList
* @augments OCA.Files.RecentFileList
*
* @classdesc Recent file list.
* Displays the list of recently modified files
*
* @param $el container element with existing markup for the .files-controls
* and a table
* @param [options] map of options, see other parameters
*/
var RecentFileList = function ($el, options) {
options.sorting = {
mode: 'mtime',
direction: 'desc'
};
this.initialize($el, options);
this._allowSorting = false;
};
RecentFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,
/** @lends OCA.Files.RecentFileList.prototype */ {
id: 'recent',
appName: t('files', 'Recent'),
_clientSideSort: true,
_allowSelection: false,
/**
* @private
*/
initialize: function () {
OCA.Files.FileList.prototype.initialize.apply(this, arguments);
if (this.initialized) {
return;
}
OC.Plugins.attach('OCA.Files.RecentFileList', this);
},
updateEmptyContent: function () {
var dir = this.getCurrentDirectory();
if (dir === '/') {
// root has special permissions
this.$el.find('.emptyfilelist.emptycontent').toggleClass('hidden', !this.isEmpty);
this.$el.find('.files-filestable thead th').toggleClass('hidden', this.isEmpty);
}
else {
OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments);
}
},
getDirectoryPermissions: function () {
return OC.PERMISSION_READ | OC.PERMISSION_DELETE;
},
updateStorageStatistics: function () {
// no op because it doesn't have
// storage info like free space / used space
},
reload: function () {
this.showMask();
if (this._reloadCall?.abort) {
this._reloadCall.abort();
}
// there is only root
this._setCurrentDir('/', false);
this._reloadCall = $.ajax({
url: OC.generateUrl('/apps/files/api/v1/recent'),
type: 'GET',
dataType: 'json'
});
var callBack = this.reloadCallback.bind(this);
return this._reloadCall.then(callBack, callBack);
},
reloadCallback: function (result) {
delete this._reloadCall;
this.hideMask();
if (result.files) {
this.setFiles(result.files.sort(this._sortComparator));
return true;
}
return false;
}
});
OCA.Files.RecentFileList = RecentFileList;
})(OCA);
});
+41
View File
@@ -0,0 +1,41 @@
/*
* Copyright (c) 2018
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function(){
var Semaphore = function(max) {
var counter = 0;
var waiting = [];
this.acquire = function() {
if(counter < max) {
counter++;
return new Promise(function(resolve) { resolve(); });
} else {
return new Promise(function(resolve) { waiting.push(resolve); });
}
};
this.release = function() {
counter--;
if (waiting.length > 0 && counter < max) {
counter++;
var promise = waiting.shift();
promise();
}
};
};
// needed on public share page to properly register this
if (!OCA.Files) {
OCA.Files = {};
}
OCA.Files.Semaphore = Semaphore;
})();
@@ -0,0 +1,135 @@
/*
* Copyright (c) 2016
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function () {
var SidebarPreviewManager = function (fileList) {
this._fileList = fileList;
this._previewHandlers = {};
OC.Plugins.attach('OCA.Files.SidebarPreviewManager', this);
};
SidebarPreviewManager.prototype = {
addPreviewHandler: function (mime, handler) {
this._previewHandlers[mime] = handler;
},
getMimeTypePreviewHandler: function(mime) {
var mimePart = mime.split('/').shift();
if (this._previewHandlers[mime]) {
return this._previewHandlers[mime];
} else if (this._previewHandlers[mimePart]) {
return this._previewHandlers[mimePart];
} else {
return null;
}
},
getPreviewHandler: function (mime) {
var mimetypeHandler = this.getMimeTypePreviewHandler(mime);
if (mimetypeHandler) {
return mimetypeHandler;
} else {
return this.fallbackPreview.bind(this);
}
},
loadPreview: function (model, $thumbnailDiv, $thumbnailContainer) {
if (model.get('hasPreview') === false && this.getMimeTypePreviewHandler(model.get('mimetype')) === null) {
var mimeIcon = OC.MimeType.getIconUrl(model.get('mimetype'));
$thumbnailDiv.removeClass('icon-loading icon-32');
$thumbnailContainer.removeClass('image'); //fall back to regular view
$thumbnailDiv.css({
'background-image': 'url("' + mimeIcon + '")'
});
} else {
var handler = this.getPreviewHandler(model.get('mimetype'));
var fallback = this.fallbackPreview.bind(this, model, $thumbnailDiv, $thumbnailContainer);
handler(model, $thumbnailDiv, $thumbnailContainer, fallback);
}
},
// previews for images and mimetype icons
fallbackPreview: function (model, $thumbnailDiv, $thumbnailContainer) {
var isImage = model.isImage();
var maxImageWidth = $thumbnailContainer.parent().width() + 50; // 50px for negative margins
var maxImageHeight = maxImageWidth / (16 / 9);
var isLandscape = function (img) {
return img.width > (img.height * 1.2);
};
var isSmall = function (img) {
return (img.width * 1.1) < (maxImageWidth * window.devicePixelRatio);
};
var getTargetHeight = function (img) {
var targetHeight = img.height / window.devicePixelRatio;
if (targetHeight <= maxImageHeight) {
targetHeight = maxImageHeight;
}
return targetHeight;
};
var getTargetRatio = function (img) {
var ratio = img.width / img.height;
if (ratio > 16 / 9) {
return ratio;
} else {
return 16 / 9;
}
};
this._fileList.lazyLoadPreview({
fileId: model.get('id'),
path: model.getFullPath(),
mime: model.get('mimetype'),
etag: model.get('etag'),
y: maxImageHeight,
x: maxImageWidth,
a: 1,
mode: 'cover',
callback: function (previewUrl, img) {
$thumbnailDiv.previewImg = previewUrl;
// as long as we only have the mimetype icon, we only save it in case there is no preview
if (!img) {
return;
}
$thumbnailDiv.removeClass('icon-loading icon-32');
var targetHeight = getTargetHeight(img);
$thumbnailContainer.addClass((isLandscape(img) && !isSmall(img)) ? 'landscape' : 'portrait');
$thumbnailContainer.addClass('large');
// only set background when we have an actual preview
// when we don't have a preview we show the mime icon in the error handler
$thumbnailDiv.css({
'background-image': 'url("' + previewUrl + '")',
height: (targetHeight > maxImageHeight) ? 'auto' : targetHeight,
'max-height': isSmall(img) ? targetHeight : null
});
var targetRatio = getTargetRatio(img);
$thumbnailDiv.find('.stretcher').css({
'padding-bottom': (100 / targetRatio) + '%'
});
},
error: function () {
$thumbnailDiv.removeClass('icon-loading icon-32');
$thumbnailContainer.removeClass('image'); //fall back to regular view
$thumbnailDiv.css({
'background-image': 'url("' + $thumbnailDiv.previewImg + '")'
});
}
});
}
};
OCA.Files.SidebarPreviewManager = SidebarPreviewManager;
})();
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2016
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
(function () {
var SidebarPreview = function () {
};
SidebarPreview.prototype = {
attach: function (manager) {
manager.addPreviewHandler('text', this.handlePreview.bind(this));
},
handlePreview: function (model, $thumbnailDiv, $thumbnailContainer, fallback) {
var previewWidth = $thumbnailContainer.parent().width() + 50; // 50px for negative margins
var previewHeight = previewWidth / (16 / 9);
this.getFileContent(model.getFullPath()).then(function (content) {
$thumbnailDiv.removeClass('icon-loading icon-32');
$thumbnailContainer.addClass('large');
$thumbnailContainer.addClass('text');
var $textPreview = $('<pre></pre>').text(content);
$thumbnailDiv.children('.stretcher').remove();
$thumbnailDiv.append($textPreview);
$thumbnailContainer.css("max-height", previewHeight);
}, function () {
fallback();
});
},
getFileContent: function (path) {
return $.ajax({
url: OC.linkToRemoteBase('files' + path),
headers: {
'Range': 'bytes=0-10240'
}
});
}
};
OC.Plugins.register('OCA.Files.SidebarPreviewManager', new SidebarPreview());
})();
+271
View File
@@ -0,0 +1,271 @@
/*
* Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
/* global Handlebars */
(function (OCA) {
_.extend(OC.Files.Client, {
PROPERTY_TAGS: '{' + OC.Files.Client.NS_OWNCLOUD + '}tags',
PROPERTY_FAVORITE: '{' + OC.Files.Client.NS_OWNCLOUD + '}favorite'
});
/**
* Returns the icon class for the matching state
*
* @param {boolean} state true if starred, false otherwise
* @return {string} icon class for star image
*/
function getStarIconClass (state) {
return state ? 'icon-starred' : 'icon-star';
}
/**
* Render the star icon with the given state
*
* @param {boolean} state true if starred, false otherwise
* @return {Object} jQuery object
*/
function renderStar (state) {
return OCA.Files.Templates['favorite_mark']({
isFavorite: state,
altText: state ? t('files', 'Favorited') : t('files', 'Not favorited'),
iconClass: getStarIconClass(state)
});
}
/**
* Toggle star icon on favorite mark element
*
* @param {Object} $favoriteMarkEl favorite mark element
* @param {boolean} state true if starred, false otherwise
*/
function toggleStar ($favoriteMarkEl, state) {
$favoriteMarkEl.removeClass('icon-star icon-starred').addClass(getStarIconClass(state));
$favoriteMarkEl.toggleClass('permanent', state);
}
OCA.Files = OCA.Files || {};
/**
* Extends the file actions and file list to include a favorite mark icon
* and a favorite action in the file actions menu; it also adds "data-tags"
* and "data-favorite" attributes to file elements.
*
* @namespace OCA.Files.TagsPlugin
*/
OCA.Files.TagsPlugin = {
name: 'Tags',
allowedLists: [
'files',
'favorites',
'systemtags',
'shares.self',
'shares.others',
'shares.link'
],
_extendFileActions: function (fileActions) {
var self = this;
fileActions.registerAction({
name: 'Favorite',
displayName: function (context) {
var $file = context.$file;
var isFavorite = $file.data('favorite') === true;
if (isFavorite) {
return t('files', 'Remove from favorites');
}
// As it is currently not possible to provide a context for
// the i18n strings "Add to favorites" was used instead of
// "Favorite" to remove the ambiguity between verb and noun
// when it is translated.
return t('files', 'Add to favorites');
},
mime: 'all',
order: -100,
permissions: OC.PERMISSION_NONE,
iconClass: function (fileName, context) {
var $file = context.$file;
var isFavorite = $file.data('favorite') === true;
if (isFavorite) {
return 'icon-favorite';
}
return 'icon-starred';
},
actionHandler: function (fileName, context) {
var $favoriteMarkEl = context.$file.find('.favorite-mark');
var $file = context.$file;
var fileInfo = context.fileList.files[$file.index()];
var dir = context.dir || context.fileList.getCurrentDirectory();
var tags = $file.attr('data-tags');
var isFile = $file.attr('data-type') === 'file';
if (_.isUndefined(tags)) {
tags = '';
}
tags = tags.split('|');
tags = _.without(tags, '');
var isFavorite = tags.indexOf(OC.TAG_FAVORITE) >= 0;
// Fake Node object for vue compatibility
const node = {
type: isFile ? 'file' : 'folder',
path: (dir + '/' + fileName).replace(/\/\/+/g, '/'),
root: '/files/' + OC.getCurrentUser().uid
}
if (isFavorite) {
// remove tag from list
tags = _.without(tags, OC.TAG_FAVORITE);
// vue compatibility
window._nc_event_bus.emit('files:favorites:removed', node)
} else {
tags.push(OC.TAG_FAVORITE);
// vue compatibility
window._nc_event_bus.emit('files:favorites:added', node)
}
// pre-toggle the star
toggleStar($favoriteMarkEl, !isFavorite);
context.fileInfoModel.trigger('busy', context.fileInfoModel, true);
self.applyFileTags(
dir + '/' + fileName,
tags,
$favoriteMarkEl,
isFavorite
).then(function (result) {
context.fileInfoModel.trigger('busy', context.fileInfoModel, false);
// response from server should contain updated tags
var newTags = result.tags;
if (_.isUndefined(newTags)) {
newTags = tags;
}
context.fileInfoModel.set({
'tags': newTags,
'favorite': !isFavorite
});
});
}
});
},
_extendFileList: function (fileList) {
// extend row prototype
var oldCreateRow = fileList._createRow;
fileList._createRow = function (fileData) {
var $tr = oldCreateRow.apply(this, arguments);
var isFavorite = false;
if (fileData.tags) {
$tr.attr('data-tags', fileData.tags.join('|'));
if (fileData.tags.indexOf(OC.TAG_FAVORITE) >= 0) {
$tr.attr('data-favorite', true);
isFavorite = true;
}
}
var $icon = $(renderStar(isFavorite));
$tr.find('td.filename .thumbnail').append($icon);
return $tr;
};
var oldElementToFile = fileList.elementToFile;
fileList.elementToFile = function ($el) {
var fileInfo = oldElementToFile.apply(this, arguments);
var tags = $el.attr('data-tags');
if (_.isUndefined(tags)) {
tags = '';
}
tags = tags.split('|');
tags = _.without(tags, '');
fileInfo.tags = tags;
return fileInfo;
};
var oldGetWebdavProperties = fileList._getWebdavProperties;
fileList._getWebdavProperties = function () {
var props = oldGetWebdavProperties.apply(this, arguments);
props.push(OC.Files.Client.PROPERTY_TAGS);
props.push(OC.Files.Client.PROPERTY_FAVORITE);
return props;
};
fileList.filesClient.addFileInfoParser(function (response) {
var data = {};
var props = response.propStat[0].properties;
var tags = props[OC.Files.Client.PROPERTY_TAGS];
var favorite = props[OC.Files.Client.PROPERTY_FAVORITE];
if (tags && tags.length) {
tags = _.chain(tags).filter(function (xmlvalue) {
return (xmlvalue.namespaceURI === OC.Files.Client.NS_OWNCLOUD && xmlvalue.nodeName.split(':')[1] === 'tag');
}).map(function (xmlvalue) {
return xmlvalue.textContent || xmlvalue.text;
}).value();
}
if (tags) {
data.tags = tags;
}
if (favorite && parseInt(favorite, 10) !== 0) {
data.tags = data.tags || [];
data.tags.push(OC.TAG_FAVORITE);
}
return data;
});
},
attach: function (fileList) {
if (this.allowedLists.indexOf(fileList.id) < 0) {
return;
}
this._extendFileActions(fileList.fileActions);
this._extendFileList(fileList);
},
/**
* Replaces the given files' tags with the specified ones.
*
* @param {String} fileName path to the file or folder to tag
* @param {Array.<String>} tagNames array of tag names
* @param {Object} $favoriteMarkEl favorite mark element
* @param {boolean} isFavorite Was the item favorited before
*/
applyFileTags: function (fileName, tagNames, $favoriteMarkEl, isFavorite) {
var encodedPath = OC.encodePath(fileName);
while (encodedPath[0] === '/') {
encodedPath = encodedPath.substr(1);
}
return $.ajax({
url: OC.generateUrl('/apps/files/api/v1/files/') + encodedPath,
contentType: 'application/json',
data: JSON.stringify({
tags: tagNames || []
}),
dataType: 'json',
type: 'POST'
}).fail(function (response) {
var message = '';
// show message if it is available
if (response.responseJSON && response.responseJSON.message) {
message = ': ' + response.responseJSON.message;
}
OC.Notification.show(t('files', 'An error occurred while trying to update the tags' + message), {type: 'error'});
toggleStar($favoriteMarkEl, isFavorite);
});
}
};
})
(OCA);
OC.Plugins.register('OCA.Files.FileList', OCA.Files.TagsPlugin);
+430
View File
@@ -0,0 +1,430 @@
(function() {
var template = Handlebars.template, templates = OCA.Files.Templates = OCA.Files.Templates || {};
templates['detailsview'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<ul class=\"tabHeaders\">\n"
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"tabHeaders") : depth0),{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":4,"column":1},"end":{"line":9,"column":10}}})) != null ? stack1 : "")
+ "</ul>\n";
},"2":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <li class=\"tabHeader\" data-tabid=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"tabId") || (depth0 != null ? lookupProperty(depth0,"tabId") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tabId","hash":{},"data":data,"loc":{"start":{"line":5,"column":35},"end":{"line":5,"column":44}}}) : helper)))
+ "\" tabindex=\"0\">\n "
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"tabIcon") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":6,"column":5},"end":{"line":6,"column":65}}})) != null ? stack1 : "")
+ "\n <a href=\"#\" tabindex=\"-1\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"label") || (depth0 != null ? lookupProperty(depth0,"label") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"label","hash":{},"data":data,"loc":{"start":{"line":7,"column":28},"end":{"line":7,"column":37}}}) : helper)))
+ "</a>\n </li>\n";
},"3":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<span class=\"icon "
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"tabIcon") || (depth0 != null ? lookupProperty(depth0,"tabIcon") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"tabIcon","hash":{},"data":data,"loc":{"start":{"line":6,"column":38},"end":{"line":6,"column":49}}}) : helper)))
+ "\"></span>";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<div class=\"detailFileInfoContainer\"></div>\n"
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"tabHeaders") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":0},"end":{"line":11,"column":7}}})) != null ? stack1 : "")
+ "<div class=\"tabsContainer\"></div>\n<a class=\"close icon-close\" href=\"#\"><span class=\"hidden-visually\">"
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"closeLabel") || (depth0 != null ? lookupProperty(depth0,"closeLabel") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"closeLabel","hash":{},"data":data,"loc":{"start":{"line":13,"column":67},"end":{"line":13,"column":81}}}) : helper)))
+ "</span></a>\n";
},"useData":true});
templates['favorite_mark'] = template({"1":function(container,depth0,helpers,partials,data) {
return "permanent";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, options, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
}, buffer =
"<div class=\"favorite-mark ";
stack1 = ((helper = (helper = lookupProperty(helpers,"isFavorite") || (depth0 != null ? lookupProperty(depth0,"isFavorite") : depth0)) != null ? helper : alias2),(options={"name":"isFavorite","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":1,"column":26},"end":{"line":1,"column":65}}}),(typeof helper === alias3 ? helper.call(alias1,options) : helper));
if (!lookupProperty(helpers,"isFavorite")) { stack1 = container.hooks.blockHelperMissing.call(depth0,stack1,options)}
if (stack1 != null) { buffer += stack1; }
return buffer + "\">\n <span class=\"icon "
+ alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}}}) : helper)))
+ "\" />\n <span class=\"hidden-visually\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":3,"column":31},"end":{"line":3,"column":42}}}) : helper)))
+ "</span>\n</div>\n";
},"useData":true});
templates['file_action_trigger'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <img class=\"svg\" alt=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":3,"column":24},"end":{"line":3,"column":35}}}) : helper)))
+ "\" src=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"icon") || (depth0 != null ? lookupProperty(depth0,"icon") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"icon","hash":{},"data":data,"loc":{"start":{"line":3,"column":42},"end":{"line":3,"column":50}}}) : helper)))
+ "\" />\n";
},"3":function(container,depth0,helpers,partials,data) {
var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":9}}})) != null ? stack1 : "")
+ ((stack1 = lookupProperty(helpers,"unless").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasDisplayName") : depth0),{"name":"unless","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":8,"column":2},"end":{"line":10,"column":13}}})) != null ? stack1 : "");
},"4":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <span class=\"icon "
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":6,"column":21},"end":{"line":6,"column":34}}}) : helper)))
+ "\"></span>\n";
},"6":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <span class=\"hidden-visually\">"
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"altText") || (depth0 != null ? lookupProperty(depth0,"altText") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"altText","hash":{},"data":data,"loc":{"start":{"line":9,"column":33},"end":{"line":9,"column":44}}}) : helper)))
+ "</span>\n";
},"8":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<span> "
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":12,"column":27},"end":{"line":12,"column":42}}}) : helper)))
+ "</span>";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<a class=\"action action-"
+ alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":1,"column":24},"end":{"line":1,"column":41}}}) : helper)))
+ "\" href=\"#\" data-action=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":1,"column":65},"end":{"line":1,"column":73}}}) : helper)))
+ "\">\n"
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"icon") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":11,"column":8}}})) != null ? stack1 : "")
+ " "
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"displayName") : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":12,"column":1},"end":{"line":12,"column":56}}})) != null ? stack1 : "")
+ "\n</a>\n";
},"useData":true});
templates['fileactionsmenu'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <li class=\""
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"inline") : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":3,"column":13},"end":{"line":3,"column":40}}})) != null ? stack1 : "")
+ " action-"
+ alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":3,"column":48},"end":{"line":3,"column":65}}}) : helper)))
+ "-container\">\n <a href=\"#\" class=\"menuitem action action-"
+ alias4(((helper = (helper = lookupProperty(helpers,"nameLowerCase") || (depth0 != null ? lookupProperty(depth0,"nameLowerCase") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"nameLowerCase","hash":{},"data":data,"loc":{"start":{"line":4,"column":45},"end":{"line":4,"column":62}}}) : helper)))
+ " permanent\" data-action=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":87},"end":{"line":4,"column":95}}}) : helper)))
+ "\">\n "
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"icon") : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":12,"column":11}}})) != null ? stack1 : "")
+ " <span>"
+ alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":13,"column":10},"end":{"line":13,"column":25}}}) : helper)))
+ "</span>\n </a>\n </li>\n";
},"2":function(container,depth0,helpers,partials,data) {
return "hidden";
},"4":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<img class=\"icon\" src=\""
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"icon") || (depth0 != null ? lookupProperty(depth0,"icon") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"icon","hash":{},"data":data,"loc":{"start":{"line":5,"column":39},"end":{"line":5,"column":47}}}) : helper)))
+ "\"/>\n";
},"6":function(container,depth0,helpers,partials,data) {
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return ((stack1 = lookupProperty(helpers,"if").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.program(9, data, 0),"data":data,"loc":{"start":{"line":7,"column":5},"end":{"line":11,"column":12}}})) != null ? stack1 : "");
},"7":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <span class=\"icon "
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":8,"column":24},"end":{"line":8,"column":37}}}) : helper)))
+ "\"></span>\n";
},"9":function(container,depth0,helpers,partials,data) {
return " <span class=\"no-icon\"></span>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<ul>\n"
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":16,"column":10}}})) != null ? stack1 : "")
+ "</ul>\n";
},"useData":true});
templates['filemultiselectmenu'] = template({"1":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <li class=\"item-"
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":26}}}) : helper)))
+ "\">\n <a href=\"#\" class=\"menuitem action "
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":38},"end":{"line":4,"column":46}}}) : helper)))
+ " permanent\" data-action=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":71},"end":{"line":4,"column":79}}}) : helper)))
+ "\">\n"
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"iconClass") : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(4, data, 0),"data":data,"loc":{"start":{"line":5,"column":4},"end":{"line":9,"column":11}}})) != null ? stack1 : "")
+ " <span class=\"label\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":10,"column":24},"end":{"line":10,"column":39}}}) : helper)))
+ "</span>\n </a>\n </li>\n";
},"2":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <span class=\"icon "
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":6,"column":23},"end":{"line":6,"column":36}}}) : helper)))
+ "\"></span>\n";
},"4":function(container,depth0,helpers,partials,data) {
return " <span class=\"no-icon\"></span>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<ul>\n"
+ ((stack1 = lookupProperty(helpers,"each").call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":2,"column":1},"end":{"line":13,"column":10}}})) != null ? stack1 : "")
+ "</ul>\n";
},"useData":true});
templates['filesummary'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<span class=\"info\">\n <span class=\"dirinfo\"></span>\n <span class=\"connector\">"
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"connectorLabel") || (depth0 != null ? lookupProperty(depth0,"connectorLabel") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"connectorLabel","hash":{},"data":data,"loc":{"start":{"line":3,"column":25},"end":{"line":3,"column":43}}}) : helper)))
+ "</span>\n <span class=\"fileinfo\"></span>\n <span class=\"hiddeninfo\"></span>\n <span class=\"filter\"></span>\n</span>\n";
},"useData":true});
templates['mainfileinfodetailsview'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <a href=\"#\" class=\"action action-favorite favorite permanent\">\n <span class=\"icon "
+ alias4(((helper = (helper = lookupProperty(helpers,"starClass") || (depth0 != null ? lookupProperty(depth0,"starClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"starClass","hash":{},"data":data,"loc":{"start":{"line":13,"column":22},"end":{"line":13,"column":35}}}) : helper)))
+ "\" title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"starAltText") || (depth0 != null ? lookupProperty(depth0,"starAltText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"starAltText","hash":{},"data":data,"loc":{"start":{"line":13,"column":44},"end":{"line":13,"column":59}}}) : helper)))
+ "\"></span>\n </a>\n";
},"3":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<span class=\"size\" title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"altSize") || (depth0 != null ? lookupProperty(depth0,"altSize") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altSize","hash":{},"data":data,"loc":{"start":{"line":16,"column":43},"end":{"line":16,"column":54}}}) : helper)))
+ "\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"size") || (depth0 != null ? lookupProperty(depth0,"size") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"size","hash":{},"data":data,"loc":{"start":{"line":16,"column":56},"end":{"line":16,"column":64}}}) : helper)))
+ "</span>, ";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<div class=\"thumbnailContainer\"><a href=\"#\" class=\"thumbnail action-default\"><div class=\"stretcher\"></div></a></div>\n<div class=\"file-details-container\">\n <div class=\"fileName\">\n <h3 title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":13},"end":{"line":4,"column":21}}}) : helper)))
+ "\" class=\"ellipsis\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"name") || (depth0 != null ? lookupProperty(depth0,"name") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data,"loc":{"start":{"line":4,"column":40},"end":{"line":4,"column":48}}}) : helper)))
+ "</h3>\n <a class=\"permalink\" href=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":5,"column":29},"end":{"line":5,"column":42}}}) : helper)))
+ "\" title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":5,"column":51},"end":{"line":5,"column":69}}}) : helper)))
+ "\" data-clipboard-text=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":5,"column":92},"end":{"line":5,"column":105}}}) : helper)))
+ "\">\n <span class=\"icon icon-clippy\"></span>\n <span class=\"hidden-visually\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":7,"column":33},"end":{"line":7,"column":51}}}) : helper)))
+ "</span>\n </a>\n </div>\n <div class=\"file-details ellipsis\">\n"
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasFavoriteAction") : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":11,"column":2},"end":{"line":15,"column":9}}})) != null ? stack1 : "")
+ " "
+ ((stack1 = lookupProperty(helpers,"if").call(alias1,(depth0 != null ? lookupProperty(depth0,"hasSize") : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":16,"column":2},"end":{"line":16,"column":80}}})) != null ? stack1 : "")
+ "<span class=\"date live-relative-timestamp\" data-timestamp=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"timestamp") || (depth0 != null ? lookupProperty(depth0,"timestamp") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"timestamp","hash":{},"data":data,"loc":{"start":{"line":16,"column":139},"end":{"line":16,"column":152}}}) : helper)))
+ "\" title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"altDate") || (depth0 != null ? lookupProperty(depth0,"altDate") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"altDate","hash":{},"data":data,"loc":{"start":{"line":16,"column":161},"end":{"line":16,"column":172}}}) : helper)))
+ "\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"date") || (depth0 != null ? lookupProperty(depth0,"date") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"date","hash":{},"data":data,"loc":{"start":{"line":16,"column":174},"end":{"line":16,"column":182}}}) : helper)))
+ "</span>\n </div>\n</div>\n<div class=\"hidden permalink-field\">\n <input type=\"text\" value=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"permalink") || (depth0 != null ? lookupProperty(depth0,"permalink") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalink","hash":{},"data":data,"loc":{"start":{"line":20,"column":27},"end":{"line":20,"column":40}}}) : helper)))
+ "\" placeholder=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"permalinkTitle") || (depth0 != null ? lookupProperty(depth0,"permalinkTitle") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"permalinkTitle","hash":{},"data":data,"loc":{"start":{"line":20,"column":55},"end":{"line":20,"column":73}}}) : helper)))
+ "\" readonly=\"readonly\"/>\n</div>\n";
},"useData":true});
templates['newfilemenu'] = template({"1":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return " <li>\n <a href=\"#\" class=\"menuitem\" data-templatename=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"templateName") || (depth0 != null ? lookupProperty(depth0,"templateName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"templateName","hash":{},"data":data,"loc":{"start":{"line":7,"column":51},"end":{"line":7,"column":67}}}) : helper)))
+ "\" data-filetype=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"fileType") || (depth0 != null ? lookupProperty(depth0,"fileType") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileType","hash":{},"data":data,"loc":{"start":{"line":7,"column":84},"end":{"line":7,"column":96}}}) : helper)))
+ "\" data-action=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"id") || (depth0 != null ? lookupProperty(depth0,"id") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"id","hash":{},"data":data,"loc":{"start":{"line":7,"column":111},"end":{"line":7,"column":117}}}) : helper)))
+ "\" data-action-label=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"actionLabel") || (depth0 != null ? lookupProperty(depth0,"actionLabel") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"actionLabel","hash":{},"data":data,"loc":{"start":{"line":7,"column":138},"end":{"line":7,"column":153}}}) : helper)))
+ "\"><span class=\"icon "
+ alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":7,"column":173},"end":{"line":7,"column":186}}}) : helper)))
+ " svg\"></span><span class=\"displayname\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"displayName") || (depth0 != null ? lookupProperty(depth0,"displayName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayName","hash":{},"data":data,"loc":{"start":{"line":7,"column":225},"end":{"line":7,"column":240}}}) : helper)))
+ "</span></a>\n </li>\n";
},"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<ul>\n <li>\n <label for=\"file_upload_start\" class=\"menuitem\" data-action=\"upload\" title=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"uploadMaxHumanFilesize") || (depth0 != null ? lookupProperty(depth0,"uploadMaxHumanFilesize") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"uploadMaxHumanFilesize","hash":{},"data":data,"loc":{"start":{"line":3,"column":78},"end":{"line":3,"column":104}}}) : helper)))
+ "\" tabindex=\"0\"><span class=\"svg icon icon-upload\"></span><span class=\"displayname\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"uploadLabel") || (depth0 != null ? lookupProperty(depth0,"uploadLabel") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"uploadLabel","hash":{},"data":data,"loc":{"start":{"line":3,"column":187},"end":{"line":3,"column":202}}}) : helper)))
+ "</span></label>\n </li>\n"
+ ((stack1 = lookupProperty(helpers,"each").call(alias1,(depth0 != null ? lookupProperty(depth0,"items") : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data,"loc":{"start":{"line":5,"column":1},"end":{"line":9,"column":10}}})) != null ? stack1 : "")
+ "</ul>\n";
},"useData":true});
templates['newfilemenu_filename_form'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<form class=\"filenameform\">\n <input id=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"cid") || (depth0 != null ? lookupProperty(depth0,"cid") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"cid","hash":{},"data":data,"loc":{"start":{"line":2,"column":12},"end":{"line":2,"column":19}}}) : helper)))
+ "-input-"
+ alias4(((helper = (helper = lookupProperty(helpers,"fileType") || (depth0 != null ? lookupProperty(depth0,"fileType") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileType","hash":{},"data":data,"loc":{"start":{"line":2,"column":26},"end":{"line":2,"column":38}}}) : helper)))
+ "\" type=\"text\" value=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"fileName") || (depth0 != null ? lookupProperty(depth0,"fileName") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fileName","hash":{},"data":data,"loc":{"start":{"line":2,"column":59},"end":{"line":2,"column":71}}}) : helper)))
+ "\" autocomplete=\"off\" autocapitalize=\"off\">\n <input type=\"submit\" value=\" \" class=\"icon-confirm\" aria-label=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"actionLabel") || (depth0 != null ? lookupProperty(depth0,"actionLabel") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"actionLabel","hash":{},"data":data,"loc":{"start":{"line":3,"column":65},"end":{"line":3,"column":80}}}) : helper)))
+ "\" />\n</form>\n";
},"useData":true});
templates['operationprogressbar'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var helper, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<div id=\"uploadprogressbar\">\n <em class=\"label outer\" style=\"display:none\"></em>\n</div>\n<button class=\"stop icon-close\" style=\"display:none\">\n <span class=\"hidden-visually\">"
+ container.escapeExpression(((helper = (helper = lookupProperty(helpers,"textCancelButton") || (depth0 != null ? lookupProperty(depth0,"textCancelButton") : depth0)) != null ? helper : container.hooks.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"textCancelButton","hash":{},"data":data,"loc":{"start":{"line":5,"column":31},"end":{"line":5,"column":51}}}) : helper)))
+ "</span>\n</button>\n";
},"useData":true});
templates['operationprogressbarlabel'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<em class=\"label\">\n <span class=\"desktop\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"textDesktop") || (depth0 != null ? lookupProperty(depth0,"textDesktop") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"textDesktop","hash":{},"data":data,"loc":{"start":{"line":2,"column":23},"end":{"line":2,"column":38}}}) : helper)))
+ "</span>\n <span class=\"mobile\">"
+ alias4(((helper = (helper = lookupProperty(helpers,"textMobile") || (depth0 != null ? lookupProperty(depth0,"textMobile") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"textMobile","hash":{},"data":data,"loc":{"start":{"line":3,"column":22},"end":{"line":3,"column":36}}}) : helper)))
+ "</span>\n</em>\n";
},"useData":true});
templates['template_addbutton'] = template({"compiler":[8,">= 4.3.0"],"main":function(container,depth0,helpers,partials,data) {
var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.hooks.helperMissing, alias3="function", alias4=container.escapeExpression, lookupProperty = container.lookupProperty || function(parent, propertyName) {
if (Object.prototype.hasOwnProperty.call(parent, propertyName)) {
return parent[propertyName];
}
return undefined
};
return "<a href=\"#\" class=\"button new\" aria-label=\""
+ alias4(((helper = (helper = lookupProperty(helpers,"addLongText") || (depth0 != null ? lookupProperty(depth0,"addLongText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addLongText","hash":{},"data":data,"loc":{"start":{"line":1,"column":43},"end":{"line":1,"column":58}}}) : helper)))
+ "\">\n <span class=\"icon "
+ alias4(((helper = (helper = lookupProperty(helpers,"iconClass") || (depth0 != null ? lookupProperty(depth0,"iconClass") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"iconClass","hash":{},"data":data,"loc":{"start":{"line":2,"column":19},"end":{"line":2,"column":32}}}) : helper)))
+ "\"></span>\n <span>"
+ alias4(((helper = (helper = lookupProperty(helpers,"addText") || (depth0 != null ? lookupProperty(depth0,"addText") : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"addText","hash":{},"data":data,"loc":{"start":{"line":3,"column":7},"end":{"line":3,"column":18}}}) : helper)))
+ "</span>\n</a>\n";
},"useData":true});
})();
@@ -0,0 +1,13 @@
<div class="detailFileInfoContainer"></div>
{{#if tabHeaders}}
<ul class="tabHeaders">
{{#each tabHeaders}}
<li class="tabHeader" data-tabid="{{tabId}}" tabindex="0">
{{#if tabIcon}}<span class="icon {{tabIcon}}"></span>{{/if}}
<a href="#" tabindex="-1">{{label}}</a>
</li>
{{/each}}
</ul>
{{/if}}
<div class="tabsContainer"></div>
<a class="close icon-close" href="#"><span class="hidden-visually">{{closeLabel}}</span></a>
@@ -0,0 +1,4 @@
<div class="favorite-mark {{#isFavorite}}permanent{{/isFavorite}}">
<span class="icon {{iconClass}}" />
<span class="hidden-visually">{{altText}}</span>
</div>
@@ -0,0 +1,13 @@
<a class="action action-{{nameLowerCase}}" href="#" data-action="{{name}}">
{{#if icon}}
<img class="svg" alt="{{altText}}" src="{{icon}}" />
{{else}}
{{#if iconClass}}
<span class="icon {{iconClass}}"></span>
{{/if}}
{{#unless hasDisplayName}}
<span class="hidden-visually">{{altText}}</span>
{{/unless}}
{{/if}}
{{#if displayName}}<span> {{displayName}}</span>{{/if}}
</a>
@@ -0,0 +1,17 @@
<ul>
{{#each items}}
<li class="{{#if inline}}hidden{{/if}} action-{{nameLowerCase}}-container">
<a href="#" class="menuitem action action-{{nameLowerCase}} permanent" data-action="{{name}}">
{{#if icon}}<img class="icon" src="{{icon}}"/>
{{else}}
{{#if iconClass}}
<span class="icon {{iconClass}}"></span>
{{else}}
<span class="no-icon"></span>
{{/if}}
{{/if}}
<span>{{displayName}}</span>
</a>
</li>
{{/each}}
</ul>
@@ -0,0 +1,14 @@
<ul>
{{#each items}}
<li class="item-{{name}}">
<a href="#" class="menuitem action {{name}} permanent" data-action="{{name}}">
{{#if iconClass}}
<span class="icon {{iconClass}}"></span>
{{else}}
<span class="no-icon"></span>
{{/if}}
<span class="label">{{displayName}}</span>
</a>
</li>
{{/each}}
</ul>
@@ -0,0 +1,7 @@
<span class="info">
<span class="dirinfo"></span>
<span class="connector">{{connectorLabel}}</span>
<span class="fileinfo"></span>
<span class="hiddeninfo"></span>
<span class="filter"></span>
</span>
@@ -0,0 +1,21 @@
<div class="thumbnailContainer"><a href="#" class="thumbnail action-default"><div class="stretcher"></div></a></div>
<div class="file-details-container">
<div class="fileName">
<h3 title="{{name}}" class="ellipsis">{{name}}</h3>
<a class="permalink" href="{{permalink}}" title="{{permalinkTitle}}" data-clipboard-text="{{permalink}}">
<span class="icon icon-clippy"></span>
<span class="hidden-visually">{{permalinkTitle}}</span>
</a>
</div>
<div class="file-details ellipsis">
{{#if hasFavoriteAction}}
<a href="#" class="action action-favorite favorite permanent">
<span class="icon {{starClass}}" title="{{starAltText}}"></span>
</a>
{{/if}}
{{#if hasSize}}<span class="size" title="{{altSize}}">{{size}}</span>, {{/if}}<span class="date live-relative-timestamp" data-timestamp="{{timestamp}}" title="{{altDate}}">{{date}}</span>
</div>
</div>
<div class="hidden permalink-field">
<input type="text" value="{{permalink}}" placeholder="{{permalinkTitle}}" readonly="readonly"/>
</div>
@@ -0,0 +1,10 @@
<ul>
<li>
<label for="file_upload_start" class="menuitem" data-action="upload" title="{{uploadMaxHumanFilesize}}" tabindex="0"><span class="svg icon icon-upload"></span><span class="displayname">{{uploadLabel}}</span></label>
</li>
{{#each items}}
<li>
<a href="#" class="menuitem" data-templatename="{{templateName}}" data-filetype="{{fileType}}" data-action="{{id}}" data-action-label="{{actionLabel}}"><span class="icon {{iconClass}} svg"></span><span class="displayname">{{displayName}}</span></a>
</li>
{{/each}}
</ul>
@@ -0,0 +1,4 @@
<form class="filenameform">
<input id="{{cid}}-input-{{fileType}}" type="text" value="{{fileName}}" autocomplete="off" autocapitalize="off">
<input type="submit" value=" " class="icon-confirm" aria-label="{{actionLabel}}" />
</form>
@@ -0,0 +1,6 @@
<div id="uploadprogressbar">
<em class="label outer" style="display:none"></em>
</div>
<button class="stop icon-close" style="display:none">
<span class="hidden-visually">{{textCancelButton}}</span>
</button>
@@ -0,0 +1,4 @@
<em class="label">
<span class="desktop">{{textDesktop}}</span>
<span class="mobile">{{textMobile}}</span>
</em>
@@ -0,0 +1,4 @@
<a href="#" class="button new" aria-label="{{addLongText}}">
<span class="icon {{iconClass}}"></span>
<span>{{addText}}</span>
</a>
+18
View File
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2014
*
* This file is licensed under the Affero General Public License version 3
* or later.
*
* See the COPYING-README file.
*
*/
function Upload(fileSelector) {
if ($.support.xhrFileUpload) {
return new XHRUpload(fileSelector.target.files);
} else {
return new FormUpload(fileSelector);
}
}
Upload.target = OC.filePath('files', 'ajax', 'upload.php');
+9
View File
@@ -0,0 +1,9 @@
OC.L10N.register(
"files",
{
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},
"nplurals=2; plural=(n > 1);");
+7
View File
@@ -0,0 +1,7 @@
{ "translations": {
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},"pluralForm" :"nplurals=2; plural=(n > 1);"
}
+9
View File
@@ -0,0 +1,9 @@
OC.L10N.register(
"files",
{
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},
"nplurals=2; plural=(n != 1);");
+7
View File
@@ -0,0 +1,7 @@
{ "translations": {
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+137
View File
@@ -0,0 +1,137 @@
OC.L10N.register(
"files",
{
"File could not be found" : "Lêer kon nie gevind word nie",
"Move or copy" : "Kopieer of skuif",
"Download" : "Laai af",
"Delete" : "Skrap",
"Tags" : "Merkers",
"Home" : "Tuis",
"Close" : "Sluit",
"Favorites" : "Gunstelinge",
"Could not create folder \"{dir}\"" : "Kan nie vouer “{dir}” skep nie",
"This will stop your current uploads." : "Dit sal u huidige oplaaie stop.",
"Upload cancelled." : "Oplaai gekanselleer.",
"Processing files …" : "Verwerk tans lêers …",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan nie {filename} oplaai nie aangesien dit óf 'n gids is óf 0 grepe groot is",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie genoeg oop spasie nie, u laai {size1} op maar slegs {size2} is oor",
"Target folder \"{dir}\" does not exist any more" : "Teikengids \"{dir}\" bestaan nie meer nie",
"Not enough free space" : "Nie genoeg oop spasie nie",
"An unknown error has occurred" : "n Onbekende fout het voorgekom",
"Uploading …" : "Laai tans op …",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Teikengids bestaan nie meer nie",
"Actions" : "Aksies",
"Rename" : "Hernoem",
"Move" : "Skuif",
"Copy" : "Kopieer",
"Choose target folder" : "Kies teikenvouer",
"Open" : "Open",
"Delete file" : "Skrap lêer",
"Delete folder" : "Skrap vouer",
"Disconnect storage" : "Ontkoppel berging",
"Could not load info for file \"{file}\"" : "Kon nie inligting vir lêer: “{file}” laai nie ",
"Files" : "Lêers",
"Details" : "Besonderhede",
"Pending" : "Hangend",
"Unable to determine date" : "Kan nie datum bepaal nie",
"This operation is forbidden" : "Die operasie is verbode",
"This directory is unavailable, please check the logs or contact the administrator" : "Hierdie gids is onbeskikbaar, gaan die logs na of kontak die administrateur",
"Storage is temporarily not available" : "Berging is tydelik onbeskikbaar",
"Could not move \"{file}\", target exists" : "Kon nie \"{file}\" skuif nie, teiken bestaan",
"Could not move \"{file}\"" : "Kon nie \"{file}\" skuif nie",
"copy" : "kopie",
"Could not copy \"{file}\", target exists" : "Kon nie \"{file}\" kopieer nie, teiken bestaan",
"Could not copy \"{file}\"" : "Kon nie \"{file}\" kopieer nie",
"Copied {origin} inside {destination}" : "{origin} binne {destination} gekopieer",
"Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} en {nbfiles} ander lêers binne {destination} gekopieer",
"{newName} already exists" : "{newName} bestaan reeds",
"Could not rename \"{fileName}\", it does not exist any more" : "Kon nie “{fileName}” hernoem nie, dit bestaan nie meer nie",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Die naam “{targetName}” word reeds in vouer “{dir}” gebruik. Kies asb. n ander naam.",
"Could not rename \"{fileName}\"" : "Kon nie “{file}” hernoem nie",
"Could not create file \"{file}\"" : "Kan nie lêer “{file}” skep nie",
"Could not create file \"{file}\" because it already exists" : "Kon nie lêer “{file}” skep nie omdat dit reeds bestaan",
"Could not create folder \"{dir}\" because it already exists" : "Kon nie vouer “{dir}” skep nie omdat dit reeds bestaan",
"Name" : "Naam",
"Size" : "Grootte",
"Modified" : "Gewysig",
"_%n folder_::_%n folders_" : ["%n gids","%n gidse"],
"_%n file_::_%n files_" : ["%n lêer","%n lêers"],
"{dirs} and {files}" : "{dirs} en {files}",
"_including %n hidden_::_including %n hidden_" : ["insluitend %n verborge","insluitende %n verborge"],
"_Uploading %n file_::_Uploading %n files_" : ["Laai tans %n lêer op ","Laai tans %n lêers op"],
"{used} of {quota} used" : "{used} van {quota} gebruik",
"{used} used" : "{used} gebruik",
"\"{name}\" is an invalid file name." : "\"{name}\" is nie 'n geldige lêer naam nie.",
"File name cannot be empty." : "Lêernaam kan nie leeg wees nie.",
"\"/\" is not allowed inside a file name." : "\"/\" word nie binne 'n lêernaam toegelaat nie.",
"View in folder" : "Vertoon in gids",
"Path" : "Roete",
"_%n byte_::_%n bytes_" : ["%n greep","%n grepe"],
"Favorited" : "As gunsteling ",
"Favorite" : "Gunsteling",
"New folder" : "Nuwe gids",
"Create new folder" : "Skep nuwe gids",
"Upload file" : "Laai lêer op",
"Recent" : "Onlangs",
"Not favorited" : "Nie as gunsteling",
"Remove from favorites" : "Verwyder uit gunstelinge",
"Add to favorites" : "Voeg by gunstelinge",
"An error occurred while trying to update the tags" : "'n Fout het voorgekom terwyl die merkers opgedateer word",
"Added to favorites" : "Tot gunstelinge bygevoeg",
"Removed from favorites" : "Uit gunstelinge verwyder",
"You added {file} to your favorites" : "U het {file} tot u gunstelinge bygevoeg",
"You removed {file} from your favorites" : "U het {file} uit u gunstelinge verwyder",
"File changes" : "Lêer veranderinge ",
"Created by {user}" : "Geskep deur {user}",
"Changed by {user}" : "Verander deur {user}",
"Deleted by {user}" : "Geskrap deur {user}",
"Restored by {user}" : "Herstel deur {user}",
"Renamed by {user}" : "Naam verander deur {user}",
"Moved by {user}" : "Geskuif deur {user}",
"\"remote user\"" : "“afstandsgebruiker”",
"You created {file}" : "U het {file} geskep",
"{user} created {file}" : "{user} het {file} geskep",
"{file} was created in a public folder" : "{file} is in 'n publieke gids geskep",
"You changed {file}" : "U het {file} verander",
"{user} changed {file}" : "{user} het {file} verander",
"You deleted {file}" : "U het {file} geskrap",
"{user} deleted {file}" : "{user} het {file} geskrap",
"You restored {file}" : "U het {file} herstel",
"{user} restored {file}" : "{user} het {file} herstel",
"You renamed {oldfile} to {newfile}" : "U het die naam van {oldfile} na {newfile} verander",
"{user} renamed {oldfile} to {newfile}" : "{user} het die naam van {oldfile} na {newfile} verander",
"You moved {oldfile} to {newfile}" : "U het {oldfile} na {newfile} geskuif",
"{user} moved {oldfile} to {newfile}" : "{user} het {oldfile} na {newfile} geskuif",
"All files" : "Alle lêers",
"Upload (max. %s)" : "Oplaai (maks. %s)",
"Accept" : "Aanvaar",
"in %s" : "in %s",
"File Management" : "Lêerbestuur",
"Select all" : "Merk alles",
"Unknown error" : "Onbekende fout",
"No files in here" : "Geen lêers hierbinne nie",
"Go back" : "Gaan terug",
"Show hidden files" : "Vertoon verborge lêers ",
"WebDAV" : "WebDAV",
"Create" : "Skep",
"Delete permanently" : "Skrap permanent",
"Upload some content or sync with your devices!" : "Laai 'n paar lêers op of sinchroniseer met u toestelle",
"No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind",
"Upload too large" : "Oplaai te groot",
"No favorites yet" : "Tans geen gunstelinge ",
"Files and folders you mark as favorite will show up here" : "Lêers en gidse wat u as gunsteling merk sal hier vertoon word",
"Shared with others" : "Gedeel met ander",
"Shared with you" : "Met u gedeel",
"Shared by link" : "Gedeel per skakel",
"Text file" : "Tekslêer",
"New text file.txt" : "Nuwe tekslêer.txt",
"Storage invalid" : "Berging ongeldig",
"Unlimited" : "Onbeperkte",
"Cancel" : "Kanselleer",
"%s used" : "%s gebruik",
"%1$s of %2$s used" : "%1$s van %2$s gebruik",
"Deleted files" : "Geskrapte lêers"
},
"nplurals=2; plural=(n != 1);");
+135
View File
@@ -0,0 +1,135 @@
{ "translations": {
"File could not be found" : "Lêer kon nie gevind word nie",
"Move or copy" : "Kopieer of skuif",
"Download" : "Laai af",
"Delete" : "Skrap",
"Tags" : "Merkers",
"Home" : "Tuis",
"Close" : "Sluit",
"Favorites" : "Gunstelinge",
"Could not create folder \"{dir}\"" : "Kan nie vouer “{dir}” skep nie",
"This will stop your current uploads." : "Dit sal u huidige oplaaie stop.",
"Upload cancelled." : "Oplaai gekanselleer.",
"Processing files …" : "Verwerk tans lêers …",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan nie {filename} oplaai nie aangesien dit óf 'n gids is óf 0 grepe groot is",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie genoeg oop spasie nie, u laai {size1} op maar slegs {size2} is oor",
"Target folder \"{dir}\" does not exist any more" : "Teikengids \"{dir}\" bestaan nie meer nie",
"Not enough free space" : "Nie genoeg oop spasie nie",
"An unknown error has occurred" : "n Onbekende fout het voorgekom",
"Uploading …" : "Laai tans op …",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} van {totalSize} ({bitrate})",
"Target folder does not exist any more" : "Teikengids bestaan nie meer nie",
"Actions" : "Aksies",
"Rename" : "Hernoem",
"Move" : "Skuif",
"Copy" : "Kopieer",
"Choose target folder" : "Kies teikenvouer",
"Open" : "Open",
"Delete file" : "Skrap lêer",
"Delete folder" : "Skrap vouer",
"Disconnect storage" : "Ontkoppel berging",
"Could not load info for file \"{file}\"" : "Kon nie inligting vir lêer: “{file}” laai nie ",
"Files" : "Lêers",
"Details" : "Besonderhede",
"Pending" : "Hangend",
"Unable to determine date" : "Kan nie datum bepaal nie",
"This operation is forbidden" : "Die operasie is verbode",
"This directory is unavailable, please check the logs or contact the administrator" : "Hierdie gids is onbeskikbaar, gaan die logs na of kontak die administrateur",
"Storage is temporarily not available" : "Berging is tydelik onbeskikbaar",
"Could not move \"{file}\", target exists" : "Kon nie \"{file}\" skuif nie, teiken bestaan",
"Could not move \"{file}\"" : "Kon nie \"{file}\" skuif nie",
"copy" : "kopie",
"Could not copy \"{file}\", target exists" : "Kon nie \"{file}\" kopieer nie, teiken bestaan",
"Could not copy \"{file}\"" : "Kon nie \"{file}\" kopieer nie",
"Copied {origin} inside {destination}" : "{origin} binne {destination} gekopieer",
"Copied {origin} and {nbfiles} other files inside {destination}" : "{origin} en {nbfiles} ander lêers binne {destination} gekopieer",
"{newName} already exists" : "{newName} bestaan reeds",
"Could not rename \"{fileName}\", it does not exist any more" : "Kon nie “{fileName}” hernoem nie, dit bestaan nie meer nie",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Die naam “{targetName}” word reeds in vouer “{dir}” gebruik. Kies asb. n ander naam.",
"Could not rename \"{fileName}\"" : "Kon nie “{file}” hernoem nie",
"Could not create file \"{file}\"" : "Kan nie lêer “{file}” skep nie",
"Could not create file \"{file}\" because it already exists" : "Kon nie lêer “{file}” skep nie omdat dit reeds bestaan",
"Could not create folder \"{dir}\" because it already exists" : "Kon nie vouer “{dir}” skep nie omdat dit reeds bestaan",
"Name" : "Naam",
"Size" : "Grootte",
"Modified" : "Gewysig",
"_%n folder_::_%n folders_" : ["%n gids","%n gidse"],
"_%n file_::_%n files_" : ["%n lêer","%n lêers"],
"{dirs} and {files}" : "{dirs} en {files}",
"_including %n hidden_::_including %n hidden_" : ["insluitend %n verborge","insluitende %n verborge"],
"_Uploading %n file_::_Uploading %n files_" : ["Laai tans %n lêer op ","Laai tans %n lêers op"],
"{used} of {quota} used" : "{used} van {quota} gebruik",
"{used} used" : "{used} gebruik",
"\"{name}\" is an invalid file name." : "\"{name}\" is nie 'n geldige lêer naam nie.",
"File name cannot be empty." : "Lêernaam kan nie leeg wees nie.",
"\"/\" is not allowed inside a file name." : "\"/\" word nie binne 'n lêernaam toegelaat nie.",
"View in folder" : "Vertoon in gids",
"Path" : "Roete",
"_%n byte_::_%n bytes_" : ["%n greep","%n grepe"],
"Favorited" : "As gunsteling ",
"Favorite" : "Gunsteling",
"New folder" : "Nuwe gids",
"Create new folder" : "Skep nuwe gids",
"Upload file" : "Laai lêer op",
"Recent" : "Onlangs",
"Not favorited" : "Nie as gunsteling",
"Remove from favorites" : "Verwyder uit gunstelinge",
"Add to favorites" : "Voeg by gunstelinge",
"An error occurred while trying to update the tags" : "'n Fout het voorgekom terwyl die merkers opgedateer word",
"Added to favorites" : "Tot gunstelinge bygevoeg",
"Removed from favorites" : "Uit gunstelinge verwyder",
"You added {file} to your favorites" : "U het {file} tot u gunstelinge bygevoeg",
"You removed {file} from your favorites" : "U het {file} uit u gunstelinge verwyder",
"File changes" : "Lêer veranderinge ",
"Created by {user}" : "Geskep deur {user}",
"Changed by {user}" : "Verander deur {user}",
"Deleted by {user}" : "Geskrap deur {user}",
"Restored by {user}" : "Herstel deur {user}",
"Renamed by {user}" : "Naam verander deur {user}",
"Moved by {user}" : "Geskuif deur {user}",
"\"remote user\"" : "“afstandsgebruiker”",
"You created {file}" : "U het {file} geskep",
"{user} created {file}" : "{user} het {file} geskep",
"{file} was created in a public folder" : "{file} is in 'n publieke gids geskep",
"You changed {file}" : "U het {file} verander",
"{user} changed {file}" : "{user} het {file} verander",
"You deleted {file}" : "U het {file} geskrap",
"{user} deleted {file}" : "{user} het {file} geskrap",
"You restored {file}" : "U het {file} herstel",
"{user} restored {file}" : "{user} het {file} herstel",
"You renamed {oldfile} to {newfile}" : "U het die naam van {oldfile} na {newfile} verander",
"{user} renamed {oldfile} to {newfile}" : "{user} het die naam van {oldfile} na {newfile} verander",
"You moved {oldfile} to {newfile}" : "U het {oldfile} na {newfile} geskuif",
"{user} moved {oldfile} to {newfile}" : "{user} het {oldfile} na {newfile} geskuif",
"All files" : "Alle lêers",
"Upload (max. %s)" : "Oplaai (maks. %s)",
"Accept" : "Aanvaar",
"in %s" : "in %s",
"File Management" : "Lêerbestuur",
"Select all" : "Merk alles",
"Unknown error" : "Onbekende fout",
"No files in here" : "Geen lêers hierbinne nie",
"Go back" : "Gaan terug",
"Show hidden files" : "Vertoon verborge lêers ",
"WebDAV" : "WebDAV",
"Create" : "Skep",
"Delete permanently" : "Skrap permanent",
"Upload some content or sync with your devices!" : "Laai 'n paar lêers op of sinchroniseer met u toestelle",
"No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind",
"Upload too large" : "Oplaai te groot",
"No favorites yet" : "Tans geen gunstelinge ",
"Files and folders you mark as favorite will show up here" : "Lêers en gidse wat u as gunsteling merk sal hier vertoon word",
"Shared with others" : "Gedeel met ander",
"Shared with you" : "Met u gedeel",
"Shared by link" : "Gedeel per skakel",
"Text file" : "Tekslêer",
"New text file.txt" : "Nuwe tekslêer.txt",
"Storage invalid" : "Berging ongeldig",
"Unlimited" : "Onbeperkte",
"Cancel" : "Kanselleer",
"%s used" : "%s gebruik",
"%1$s of %2$s used" : "%1$s van %2$s gebruik",
"Deleted files" : "Geskrapte lêers"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+9
View File
@@ -0,0 +1,9 @@
OC.L10N.register(
"files",
{
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},
"nplurals=2; plural=n > 1;");
+7
View File
@@ -0,0 +1,7 @@
{ "translations": {
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},"pluralForm" :"nplurals=2; plural=n > 1;"
}
+9
View File
@@ -0,0 +1,9 @@
OC.L10N.register(
"files",
{
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},
"nplurals=2; plural=(n != 1);");
+7
View File
@@ -0,0 +1,7 @@
{ "translations": {
"_%n folder_::_%n folders_" : ["",""],
"_%n file_::_%n files_" : ["",""],
"_Uploading %n file_::_Uploading %n files_" : ["",""],
"_matches '{filter}'_::_match '{filter}'_" : ["",""]
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+350
View File
@@ -0,0 +1,350 @@
OC.L10N.register(
"files",
{
"File could not be found" : "الملف غير موجود",
"Move or copy" : "أنقل أو انسخ",
"Download" : "تنزيل",
"Delete" : "حذف ",
"Tags" : "الوسوم",
"Show list view" : "اظهر معاينات الروابط",
"Show grid view" : "أعرض شبكياً",
"Home" : "الرئيسية",
"Close" : "إغلاق",
"Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
"This will stop your current uploads." : "سيتم ايقاف رفع الملفات الحالية.",
"Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
"Processing files …" : "معالجة الملفات…",
"…" : "...",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
"Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
"Not enough free space" : "لا يوجد مساحة تخزينية كافية",
"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" : "رفع هذا النوع الملفات غير مدعوم",
"Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
"Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
"Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
"Actions" : "الإجراءات",
"Rename" : "إعادة التسمية",
"Move" : "نقل",
"Copy" : "نسخ",
"Choose target folder" : "اختر مكان المجلد",
"Set reminder" : "ضبط التذكير",
"Edit locally" : "تعديل محليًا",
"Open" : "افتح",
"_Delete file_::_Delete files_" : ["حذف ملفات","حذف ملف","حذف ملفات","حذف ملفات","حذف ملفات","حذف ملفات"],
"_Delete folder_::_Delete folders_" : ["حذف 0 مجلد","حذف مجلد واحد","حذف مجلدين","حذف مجلدات","حذف مجلدات","حذف مجلدات"],
"_Disconnect storage_::_Disconnect storages_" : ["فصل 0 وحدة تخزين","فصل وحدة تخزين واحدة","فصل وحدتيْ تخزين","فصل وحدات تخزين","فصل وحدات تخزين","فصل وحدات تخزين"],
"_Leave this share_::_Leave these shares_" : ["مغادرة 0 مشاركة","مغادرة هذه المشاركة","مغادرة هاتين المشاركتين","مغادرة هذه المشاركات","مغادرة هذه المشاركات","مغادرة هذه المشاركات"],
"Could not load info for file \"{file}\"" : "لم يستطع تحميل معلومات الملف \"{file}\"",
"Files" : "الملفات",
"Details" : "التفاصيل",
"Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
"Apply tag(s) to selection" : "تطبيق العلامة (العلامات) على التحديد",
"Select directory \"{dirName}\"" : "حدد المجلد \"{اسم المجلد}\"",
"Select file \"{fileName}\"" : "حدد الملف \"{اسم الملف}\"",
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
"This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر، الرجاء مراجعة سجل الأخطاء أو الاتصال بمدير النظام",
"Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
"Could not move \"{file}\", target exists" : "لا يمكن نقل \"{file}\", الملف موجود بالفعل هناك",
"Could not move \"{file}\"" : "لا يمكن نقل \"{file}\"",
"copy" : "أنسخ",
"Could not copy \"{file}\", target exists" : "لم يستطع نسخ \"{file}\"، المستهدف موجود",
"Could not copy \"{file}\"" : "لم يستطع نسخ \"{file}\"",
"Copied {origin} inside {destination}" : "منسوخ {origin} داخل {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "منسوخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
"Failed to redirect to client" : "فشل في التحويل الى العميل",
"{newName} already exists" : "{newname} موجود مسبقاً",
"Could not rename \"{fileName}\", it does not exist any more" : "لا يمكن اعادة تسمية \"{fileName}\", لأنه لم يعد موجود",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{targetName}\" مستخدم من قبل في المجلد \"{dir}\". الرجاء اختيار اسم اخر.",
"Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
"Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
"Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
"Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
"Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
"Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "لا نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
"Name" : "الإسم",
"Size" : "الحجم",
"Modified" : "معدل",
"_%n folder_::_%n folders_" : ["لا توجد مجلدات","%n مجلد","مجلدان","%n مجلدات","%n مجلد","%n مجلد"],
"_%n file_::_%n files_" : ["لا يوجد ملفات %n","%n ملف","ملفان","%n ملفات","%n ملفات","%n ملفات"],
"{dirs} and {files}" : "{dirs} و {files}",
"_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
"You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا",
"_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"],
"New" : "جديد",
"New file/folder menu" : "قائمة ملف/مجلد جديد",
"Select file range" : "حدد نطاق الملف",
"{used}%" : "{مُستخدَم}%",
"{used} of {quota} used" : "{used} من {quota} مستخدم",
"{used} used" : "{used} مستخدم",
"\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
"File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
"\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
"\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\""],
"View in folder" : "اعرض في المجلد",
"Direct link was copied (only works for people who have access to this file/folder)" : "تم نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
"Path" : "المسار",
"_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%n بايت"],
"Favorited" : "المفضلة",
"Favorite" : "المفضلة",
"Copy direct link (only works for people who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
"New folder" : "مجلد جديد",
"Create new folder" : "إنشاء مجلدا جديد",
"Upload file" : "رفع ملف",
"Recent" : "الحديثة",
"Not favorited" : "ازالة من المفضلة",
"Remove from favorites" : "إزالته مِن المفضلة",
"Add to favorites" : "إضافة إلى المفضلة",
"An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"Added to favorites" : "تمت إضافته إلى المفضلة",
"Removed from favorites" : "تمت إزالته مِن المفضلة",
"You added {file} to your favorites" : "أنت اضفت {file} إلى مفضلتك",
"You removed {file} from your favorites" : "تم ازالت {file} من مفضلتك",
"Favorites" : "المفضلة ",
"File changes" : "تغيير في ملف",
"Created by {user}" : "انشاء جديد من قبل {user}",
"Changed by {user}" : "تغيير من قبل {user}",
"Deleted by {user}" : "حذف من قبل {user}",
"Restored by {user}" : "استعادة من قبل {user}",
"Renamed by {user}" : "اعادة تسمية من قبل {user}",
"Moved by {user}" : "نقل من قبل {user}",
"\"remote account\"" : "\"حساب قصِي remote account\"",
"You created {file}" : "أنشأتَ {file}",
"You created an encrypted file in {file}" : "أنت انشأت ملف مشفر في {file}",
"{user} created {file}" : "{user} انشاء ملف {file}",
"{user} created an encrypted file in {file}" : "{user} انشاء ملف مشفر {file}",
"{file} was created in a public folder" : "{file} انشاء ملف في المجلد العام",
"You changed {file}" : "أنت قمت بتغيير {file}",
"You changed an encrypted file in {file}" : "أنت قمت بتغيير ملف مشفر {file}",
"{user} changed {file}" : "{user} تغيير {file}",
"{user} changed an encrypted file in {file}" : "{user} تغيير ملف مشفر {file}",
"You deleted {file}" : "أنت حذفت ملف {file}",
"You deleted an encrypted file in {file}" : "أنت حذفت ملف مشفر {file}",
"{user} deleted {file}" : "{user} حذف {file}",
"{user} deleted an encrypted file in {file}" : "{user} حذف ملف مشفر {file}",
"You restored {file}" : "أنت قمت باستعادة {file}",
"{user} restored {file}" : "{user} استعادة ملف {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
"You renamed {oldfile} (hidden) to {newfile}" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile}",
"You renamed {oldfile} to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} إلى {newfile} (مخفي)",
"You renamed {oldfile} to {newfile}" : "أنت أعدت تسمية {oldfile} إلى {newfile}",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "أعاد {user} تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "أعاد {user} تسمية {oldfile} (مخفي) إلى {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "أعاد {user} تسمية {oldfile} إلى {newfile} (مخفي)",
"{user} renamed {oldfile} to {newfile}" : "{user} اعادة تسمية {oldfile} إلى {newfile}",
"You moved {oldfile} to {newfile}" : "أنت نقلت {oldfile} إلى {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} نقل {oldfile} إلى {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "ملف اضيف إلى او تم ازالته من <strong> مفضلتك </strong>",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
"A favorite file or folder has been <strong>changed</strong>" : "ملف في المفضلة تم <strong>تم تغييره</strong>",
"Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
"Accept" : "قبول",
"Reject" : "رفض",
"Incoming ownership transfer from {user}" : "تم تحويل ملكية الملف إليك من قبل {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "هل تريد الموافقة {path}?\n\nملاحظة: عملية موافقة على النقل قد تستغرق إلى 1 ساعة.",
"Ownership transfer failed" : "فشل نقل ملكية",
"Your ownership transfer of {path} to {user} failed." : "فشلت عمليتك لنقل الـ {path} إلى {user}",
"The ownership transfer of {path} from {user} failed." : "فشل عملية النقل لـ {path} من قبل {user}",
"Ownership transfer done" : "تم نقل ملكية بنجاح",
"Your ownership transfer of {path} to {user} has completed." : "عمليتك لنقل الـ {path} إلى {user} تمت بنجاح.",
"The ownership transfer of {path} from {user} has completed." : "نقل الملكية لـ {path} من قبل {user} تمت بنجاح.",
"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" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ",
"Some files could not be uploaded" : "بعض الملفات لم يمكن رفعها",
"Files uploaded successfully" : "تمّ رفع الملفات بنجاحٍ",
"\"{displayName}\" action executed successfully" : "\"{displayName}\" الأمر نُفّذ بنجاح",
"\"{displayName}\" action failed" : "\"{dispalyName}\" الأمر أخفق عند التنفيذ",
"Toggle selection for file \"{displayName}\"" : "تبديل الاختيار للملف \"{displayName}\"",
"Toggle selection for folder \"{displayName}\"" : "تبديل الاختيار للمجلد \"{displayName}\"",
"Rename file" : "إعادة تسمية الملف",
"File name" : "اسم الملف",
"Folder name" : "اسم المجلد",
"This node is unavailable" : "هذه العُقْدَة node غير متوفرة ",
"Download file {name}" : " تنزيل الملف {name}",
"\"{name}\" is not an allowed filetype." : "\"{name}\" ليس نوع ملف مسموحًا به.",
"{newName} already exists." : "{newName} موجود بالفعل.",
"\"{char}\" is not allowed inside a file name." : "\"{char}\" حرفٌ غير مسموح به في اسم الملف.",
"Name cannot be empty" : "لا يمكن أن يكون الاسم فارغاً",
"Another entry with the same name already exists" : "إدخال آخر بنفس الاسم موجود بالفعل",
"Renamed \"{oldName}\" to \"{newName}\"" : "تمت إعادة تسمية \"{oldName}\" إلى \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "تعذر إعادة تسمية \"{oldName}\"، لم يعد موجودًا",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{newName}\" مُستعمَلٌ سلفاً في المجلّد\"{dir}\". إختَر اسماً آخر رجاءً.",
"Could not rename \"{oldName}\"" : "تعذرت إعادة تسمية \"{oldName}\"",
"Total rows summary" : "ملخص مجموع الأسطر",
"Toggle selection for all files and folders" : "تبديل الاختيار لكل الملفات و المجلدات",
"\"{displayName}\" failed on some elements " : "\"{displayName}\" فشل في بعض العناصر",
"\"{displayName}\" batch action executed successfully" : "\"{displayName}\" حزمة الأوامر نُفّذت بنجاح",
"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" : "تعذر العثور على الملف",
"Storage informations" : "معلومات التخزين",
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{relative}% used" : "{relative}% مستخدمة",
"Could not refresh storage stats" : "تعذر تحديث حالة التخزين",
"Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
"Create" : "إنشاء",
"A file or folder with that name already exists." : "ملف أو مجلد بنفس هذا الاسم موجود سلفاً",
"Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
"Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Change" : "تغير",
"New owner" : "مالك جديد",
"Choose a file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Transfer" : "نقل ملكية",
"Transfer {path} to {userid}" : "نقل ملكية {path} إلى {userid}",
"Invalid path selected" : "المسار او الملف غير صحيح",
"Unknown error" : "خطأ غير معروف",
"Ownership transfer request sent" : "طلب نقل الملكية أرسل بنجاح",
"Cannot transfer ownership of a file or folder you do not own" : "لايمكنك نقل ملكية ملف أو مجلد لا تملكه",
"Select file or folder to link to" : "اختر ملف أو مجلد للربط معه",
"Choose file" : "إختَر ملفاً",
"Choose {file}" : "إختَر {file}",
"Loading current folder" : "تحميل المجلد الحالي",
"No files in here" : "لا يوجد ملفات هنا ",
"Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
"Go to the previous folder" : "إنتقل للمجلد السابق",
"Go back" : "العودة",
"Share" : "مُشارَكة",
"Shared by link" : "شاركته باستخدام رابط مشاركة",
"Shared" : "مُشارَكة",
"Switch to list view" : "التبديل إلى عرض القائمة",
"Switch to grid view" : "بدِّل إلى المنظور الصندوقي",
"Error during upload: {message}" : "حدث خطأ أثناء الرفع: {message}",
"Error during upload, status code {status}" : "حدث خطأ أثناء الرفع. رمز الحالة {status}",
"Unknown error during upload" : "خطأ غير محدد حدث أثناء الرفع",
"Open the files app settings" : "إفتح إعدادات تطبيق الملفات",
"Files settings" : "إعدادات الملفات",
"File cannot be accessed" : "الملف لم يمكن الوصول إليه",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "إمّا أن الملف غير موجود أو أنك لا تمتلك الصلاحية لعرضه. أُطلُب من المُرسل أن يتشاركه معك.",
"Sort favorites first" : "فرز المفضلات أولا",
"Sort folders before files" : "فرز المجلدات قبل الملفات",
"Show hidden files" : "عرض الملفات المخفية",
"Crop image previews" : "اقتصاص صورة العروض",
"Enable the grid view" : "تمكين المنظور الصندوقي",
"Additional settings" : "الإعدادات المتقدمة",
"WebDAV" : "WebDAV",
"WebDAV URL" : "عنوان URL لـ WebDAV",
"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." : "إذا كنت قد فعّلت خاصية \"التحقق بأكثل من عامل\" 2FA، يجب عليك تجديد كلمة سر التطبيق بالضغط هنا.",
"Clipboard is not available" : "الحافظة غير متاحة",
"WebDAV URL copied to clipboard" : "تم نسخ WebDAV URL إلى الحافظة",
"Unable to change the favourite state of the file" : "لم نستطع تغير الحالة المفضلة للملف",
"Error while loading the file data" : "خطأ اثناء تحميل بيانات الملف",
"Pick a template for {name}" : "اختر قالبا لـ {name}",
"Create a new file with the selected template" : "إنشاء ملف جديد بإستخدام القالب المحدد",
"Creating file" : "إنشاء ملف",
"Blank" : "فارغ",
"Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Delete permanently" : "حذف بشكل دائم",
"Delete and unshare" : "إحذِف و الغٍ المشاركات ",
"You are about to delete {count} items." : "أنت على وشك حذف {count} عنصر.",
"Confirm deletion" : "أكِّد على الحذف",
"Cancel" : "الغاء",
"Deletion cancelled" : "تمّ إلغاء الحذف",
"Destination is not a folder" : "المَقصَد ليس مُجلّداً",
"This file/folder is already in that directory" : "هذا الملف/المجلد موجود سلفاً في ذلك المجلد",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
"(copy)" : "(نسخ)",
"(copy %n)" : "(نسخ %n)",
"Move cancelled" : "تمّ إلغاء النقل",
"A file or folder with that name already exists in this folder" : "ملف أو مجلد بنفس ذاك الاسم موجود سلفاً في هذا المجلد",
"The file does not exist anymore" : "الملف لم يعد موجوداً",
"Choose destination" : "إختَر المَقصِد",
"Copy to {target}" : "أُنسُخ إلى {target}",
"Move to {target}" : "أُنقُل إلى {target}",
"Cancelled move or copy operation" : ".عملية النسخ أو النقل تمّ إلغاؤها",
"Move or copy operation failed" : "عملية النسخ أو النقل أخفقت",
"Open folder {displayName}" : "إفتح المجلد {displayName}",
"Open in Files" : "إفتَح في \"الملفات\"",
"Open details" : "افتح التفاصيل",
"An error occurred while uploading. Please try again later." : "حدث خطأ أثناء الرفع. يُرجى المحاولة مرة أخرى في وقت لاحق.",
"Could not copy {file}. {message}" : "تعذّر نسخ {file}. {message}",
"Could not move {file}. {message}" : "تعذّر نقل {file}. {message}",
"Created new folder \"{name}\"" : "تمّ إنشاء مجلد جديد باسم \"{name}\"",
"Filename" : "اسم الملف",
"Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب",
"Create new templates folder" : "إنشيْ مجلد جديد للقوالب",
"Templates" : "القوالب",
"New template folder" : "مجلد القوالب الجديد",
"One of the dropped files could not be processed" : "أحد الملفات المُفلَتة لا يمكن معالجته",
"Uploading \"{filename}\" failed" : "فشل في تحديث \"{filename}\" ",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدان","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلدات"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملفان","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملفات"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلدان","ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلدات","ملف واحد 1 و {folderCount} مجلدات"],
"_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ملف و مجلد واحد 1","{fileCount} ملف و مجلد واحد 1","{fileCount} ملفان و مجلد واحد 1","{fileCount} ملف و مجلد واحد 1","{fileCount} ملفات و مجلد واحد 1","{fileCount} ملفات و مجلد واحد 1"],
"{fileCount} files and {folderCount} folders" : "{fileCount} ملف و {folderCount} مجلد",
"List of favorites files and folders." : "قائمة الملفات والمجلدات المفضلة.",
"No favorites yet" : "ليست عندك مفضلات بعد",
"Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
"All files" : "كل الملفات",
"List of your files and folders." : "قائمة بملفاتك و مجلداتك",
"Personal Files" : "ملفات شخصية",
"List of your files and folders that are not shared." : "قائمة بالملفات و المجلدات التي لم تتم مشاركتها.",
"No personal files found" : "لا توجد أي ملفات شخصية",
"Files that are not shared will show up here." : "الملفات التي لم تتم مشاركتها ستُعرض هنا",
"List of recently modified files and folders." : "قائمة بالملفات و المجلدات التي تمّ تعديلها مؤخراً.",
"No recently modified files" : "لا توجد أيّ ملفات تمّ تعديلها مؤخراً",
"Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
"Upload too large" : "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Text file" : "ملف نصي",
"New text file.txt" : "ملف نصي جديد fille.txt",
"Direct link was copied (only works for users who have access to this file/folder)" : "تم نسخ الرابط المباشر (تعمل فقط بالنسبة للمستخدمين الذين يملكون تخويلاً بالوصول إلى هذا الملف أو المجلد)",
"Copy direct link (only works for users who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للمستخدمين الذين يمكنهم الوصول الى هذا الملف/المجلد)",
"You can only favorite a single file or folder at a time" : "يمكنك فقط تفضيل ملف أو مجلد واحد في المرة الواحدة",
"\"remote user\"" : "\"مستخدم عن بعد\"",
"Search users" : "ابحث عن مستخدمين",
"You might not have have permissions to view it, ask the sender to share it" : "يمكن ألاّ تكون لديك صلاحية لعرضه، أطلب من المُرسل إن يشاركه معك",
"Set up templates folder" : "إعداد مجلد القوالب",
"Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
"Toggle grid view" : "تفعيل/تعطيل القائمة",
"Deleted files" : "الملفات المحذوفة",
"Shares" : "التي قمتَ بمشاركتها",
"Shared with others" : "شاركته مع الاخرين",
"Shared with you" : "تمت مشاركته معك",
"Deleted shares" : "تم حذف المشاركات",
"Pending shares" : "انتظار المشاركات",
"This file has the tag {tag}" : "هذا الملف له واصفة {tag}",
"This file has the tags {firstTags} and {lastTag}" : "هذا الملف له واصفات {firstTags} و {lastTag}",
"Select the row for {displayName}" : "إختر السطر في {displayName}",
"Open folder {name}" : "إفتح المجلد {name}",
"Unselect all" : "إلغاء الاختيار للكل",
"ascending" : "تصاعدياً",
"descending" : "تنازلياً",
"Sort list by {column} ({direction})" : "ترتيب القائمة بحسب {column} ({direction})",
"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" : "لم يتم حذف أي ملفات أو مجلدات بعدُ",
"Add" : "أضِف",
"The files is locked" : "الملفات مقفله"
},
"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;");
+348
View File
@@ -0,0 +1,348 @@
{ "translations": {
"File could not be found" : "الملف غير موجود",
"Move or copy" : "أنقل أو انسخ",
"Download" : "تنزيل",
"Delete" : "حذف ",
"Tags" : "الوسوم",
"Show list view" : "اظهر معاينات الروابط",
"Show grid view" : "أعرض شبكياً",
"Home" : "الرئيسية",
"Close" : "إغلاق",
"Could not create folder \"{dir}\"" : "لا يمكن إنشاء المجلد \"{dir}\"",
"This will stop your current uploads." : "سيتم ايقاف رفع الملفات الحالية.",
"Upload cancelled." : "تم إلغاء عملية رفع الملفات.",
"Processing files …" : "معالجة الملفات…",
"…" : "...",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، إنك بصدد رفع {size1} ولكن المساحة المتبقية المتوفرة تبلُغ {size2}",
"Target folder \"{dir}\" does not exist any more" : "المجلد المطلوب \"{dir}\" غير موجود بعد الان",
"Not enough free space" : "لا يوجد مساحة تخزينية كافية",
"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" : "رفع هذا النوع الملفات غير مدعوم",
"Target folder does not exist any more" : "المجلد المراد غير موجود بعد الان",
"Operation is blocked by access control" : "العمليات حظرت الوصول لهذه الخدمة",
"Error when assembling chunks, status code {status}" : "خطأ عند تجميع القطع، حالة الخطأ {status}",
"Actions" : "الإجراءات",
"Rename" : "إعادة التسمية",
"Move" : "نقل",
"Copy" : "نسخ",
"Choose target folder" : "اختر مكان المجلد",
"Set reminder" : "ضبط التذكير",
"Edit locally" : "تعديل محليًا",
"Open" : "افتح",
"_Delete file_::_Delete files_" : ["حذف ملفات","حذف ملف","حذف ملفات","حذف ملفات","حذف ملفات","حذف ملفات"],
"_Delete folder_::_Delete folders_" : ["حذف 0 مجلد","حذف مجلد واحد","حذف مجلدين","حذف مجلدات","حذف مجلدات","حذف مجلدات"],
"_Disconnect storage_::_Disconnect storages_" : ["فصل 0 وحدة تخزين","فصل وحدة تخزين واحدة","فصل وحدتيْ تخزين","فصل وحدات تخزين","فصل وحدات تخزين","فصل وحدات تخزين"],
"_Leave this share_::_Leave these shares_" : ["مغادرة 0 مشاركة","مغادرة هذه المشاركة","مغادرة هاتين المشاركتين","مغادرة هذه المشاركات","مغادرة هذه المشاركات","مغادرة هذه المشاركات"],
"Could not load info for file \"{file}\"" : "لم يستطع تحميل معلومات الملف \"{file}\"",
"Files" : "الملفات",
"Details" : "التفاصيل",
"Please select tag(s) to add to the selection" : "يرجى تحديد علامة (علامات) لإضافتها إلى التحديد",
"Apply tag(s) to selection" : "تطبيق العلامة (العلامات) على التحديد",
"Select directory \"{dirName}\"" : "حدد المجلد \"{اسم المجلد}\"",
"Select file \"{fileName}\"" : "حدد الملف \"{اسم الملف}\"",
"Pending" : "قيد الانتظار",
"Unable to determine date" : "تعذر تحديد التاريخ",
"This operation is forbidden" : "هذة العملية ممنوعة ",
"This directory is unavailable, please check the logs or contact the administrator" : "هذا المجلد غير متوفر، الرجاء مراجعة سجل الأخطاء أو الاتصال بمدير النظام",
"Storage is temporarily not available" : "وحدة التخزين غير متوفرة",
"Could not move \"{file}\", target exists" : "لا يمكن نقل \"{file}\", الملف موجود بالفعل هناك",
"Could not move \"{file}\"" : "لا يمكن نقل \"{file}\"",
"copy" : "أنسخ",
"Could not copy \"{file}\", target exists" : "لم يستطع نسخ \"{file}\"، المستهدف موجود",
"Could not copy \"{file}\"" : "لم يستطع نسخ \"{file}\"",
"Copied {origin} inside {destination}" : "منسوخ {origin} داخل {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "منسوخ {origin} و {nbfiles} ملفات اخرى داخل {destination}",
"Failed to redirect to client" : "فشل في التحويل الى العميل",
"{newName} already exists" : "{newname} موجود مسبقاً",
"Could not rename \"{fileName}\", it does not exist any more" : "لا يمكن اعادة تسمية \"{fileName}\", لأنه لم يعد موجود",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{targetName}\" مستخدم من قبل في المجلد \"{dir}\". الرجاء اختيار اسم اخر.",
"Could not rename \"{fileName}\"" : "إعادة تسمية الملف \"{fileName}\" لم تنجح",
"Could not create file \"{file}\"" : "لا يمكن إنشاء الملف\"{file}\"",
"Could not create file \"{file}\" because it already exists" : "لا يمكن إنشاء الملف \"{file}\" فهو موجود بالفعل",
"Could not create folder \"{dir}\" because it already exists" : "لا يمكن إنشاء المجلد \"{dir}\" فهو موجود بالفعل",
"Could not fetch file details \"{file}\"" : "لم يتم الوصول إلى معلومات \"{file}\"",
"Error deleting file \"{fileName}\"." : "خطأ أثناء حذف الملف \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "لا نتائج بحث في مجلدات اخرى ل {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "ادخل حرفين على الاقل للبحث في المجلدات",
"Name" : "الإسم",
"Size" : "الحجم",
"Modified" : "معدل",
"_%n folder_::_%n folders_" : ["لا توجد مجلدات","%n مجلد","مجلدان","%n مجلدات","%n مجلد","%n مجلد"],
"_%n file_::_%n files_" : ["لا يوجد ملفات %n","%n ملف","ملفان","%n ملفات","%n ملفات","%n ملفات"],
"{dirs} and {files}" : "{dirs} و {files}",
"_including %n hidden_::_including %n hidden_" : ["يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي","يشمل %n مخفي"],
"You do not have permission to upload or create files here" : "لا يوجد تخويل برفع أو إنشاء ملفات هنا",
"_Uploading %n file_::_Uploading %n files_" : ["لا يوجد ملفات %n لتحميلها","تحميل 1 ملف %n","تحميل 2 ملف %n","يتم تحميل عدد قليل من ملفات %n","يتم تحميل عدد كبير من ملفات %n","يتم تحميل ملفات %n"],
"New" : "جديد",
"New file/folder menu" : "قائمة ملف/مجلد جديد",
"Select file range" : "حدد نطاق الملف",
"{used}%" : "{مُستخدَم}%",
"{used} of {quota} used" : "{used} من {quota} مستخدم",
"{used} used" : "{used} مستخدم",
"\"{name}\" is an invalid file name." : "\"{name}\" اسم ملف غير صالح للاستخدام .",
"File name cannot be empty." : "اسم الملف لا يجوز أن يكون فارغا",
"\"/\" is not allowed inside a file name." : "\"/\" غير مسموح في تسمية الملف",
"\"{name}\" is not an allowed filetype" : "\"{name}\" أنه نوع ملف غير مسموح",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "سعة تخزين {owner} المالك ممتلئة ، ولا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "مجلد المجموعة \"{mountPoint}\" ممتلئ ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "وحدة التخزين الخارجية \"{mountPoint}\" ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Your storage is full, files cannot be updated or synced anymore!" : "سعتك التخزينية ممتلئة ، لا يمكن تحديث الملفات أو مزامنتها بعد الآن!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "تخزين {owner} شبه ممتلئ ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "مجلد مجموعة \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "التخزين الخارجي \"{mountPoint}\" شبه ممتلئ ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "مساحة التخزين الخاصة بك شبه ممتلئة ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["تطابق \"{filter}\"","تطابق \"{filter}\" ","تطابقان \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\"","تطابقات \"{filter}\""],
"View in folder" : "اعرض في المجلد",
"Direct link was copied (only works for people who have access to this file/folder)" : "تم نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
"Path" : "المسار",
"_%n byte_::_%n bytes_" : ["بايت","بايت","بايت","بايت","بايت","%n بايت"],
"Favorited" : "المفضلة",
"Favorite" : "المفضلة",
"Copy direct link (only works for people who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للأشخاص الذين لديهم حق الوصول إلى هذا الملف/المجلد)",
"New folder" : "مجلد جديد",
"Create new folder" : "إنشاء مجلدا جديد",
"Upload file" : "رفع ملف",
"Recent" : "الحديثة",
"Not favorited" : "ازالة من المفضلة",
"Remove from favorites" : "إزالته مِن المفضلة",
"Add to favorites" : "إضافة إلى المفضلة",
"An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags",
"Added to favorites" : "تمت إضافته إلى المفضلة",
"Removed from favorites" : "تمت إزالته مِن المفضلة",
"You added {file} to your favorites" : "أنت اضفت {file} إلى مفضلتك",
"You removed {file} from your favorites" : "تم ازالت {file} من مفضلتك",
"Favorites" : "المفضلة ",
"File changes" : "تغيير في ملف",
"Created by {user}" : "انشاء جديد من قبل {user}",
"Changed by {user}" : "تغيير من قبل {user}",
"Deleted by {user}" : "حذف من قبل {user}",
"Restored by {user}" : "استعادة من قبل {user}",
"Renamed by {user}" : "اعادة تسمية من قبل {user}",
"Moved by {user}" : "نقل من قبل {user}",
"\"remote account\"" : "\"حساب قصِي remote account\"",
"You created {file}" : "أنشأتَ {file}",
"You created an encrypted file in {file}" : "أنت انشأت ملف مشفر في {file}",
"{user} created {file}" : "{user} انشاء ملف {file}",
"{user} created an encrypted file in {file}" : "{user} انشاء ملف مشفر {file}",
"{file} was created in a public folder" : "{file} انشاء ملف في المجلد العام",
"You changed {file}" : "أنت قمت بتغيير {file}",
"You changed an encrypted file in {file}" : "أنت قمت بتغيير ملف مشفر {file}",
"{user} changed {file}" : "{user} تغيير {file}",
"{user} changed an encrypted file in {file}" : "{user} تغيير ملف مشفر {file}",
"You deleted {file}" : "أنت حذفت ملف {file}",
"You deleted an encrypted file in {file}" : "أنت حذفت ملف مشفر {file}",
"{user} deleted {file}" : "{user} حذف {file}",
"{user} deleted an encrypted file in {file}" : "{user} حذف ملف مشفر {file}",
"You restored {file}" : "أنت قمت باستعادة {file}",
"{user} restored {file}" : "{user} استعادة ملف {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
"You renamed {oldfile} (hidden) to {newfile}" : "لقد أعدت تسمية {oldfile} (مخفي) إلى {newfile}",
"You renamed {oldfile} to {newfile} (hidden)" : "لقد أعدت تسمية {oldfile} إلى {newfile} (مخفي)",
"You renamed {oldfile} to {newfile}" : "أنت أعدت تسمية {oldfile} إلى {newfile}",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "أعاد {user} تسمية {oldfile} (مخفي) إلى {newfile} (مخفي)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "أعاد {user} تسمية {oldfile} (مخفي) إلى {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "أعاد {user} تسمية {oldfile} إلى {newfile} (مخفي)",
"{user} renamed {oldfile} to {newfile}" : "{user} اعادة تسمية {oldfile} إلى {newfile}",
"You moved {oldfile} to {newfile}" : "أنت نقلت {oldfile} إلى {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} نقل {oldfile} إلى {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "ملف اضيف إلى او تم ازالته من <strong> مفضلتك </strong>",
"A file or folder has been <strong>changed</strong>" : "تم <strong> تغيير</strong> ملف أو مجلد",
"A favorite file or folder has been <strong>changed</strong>" : "ملف في المفضلة تم <strong>تم تغييره</strong>",
"Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ",
"Accept" : "قبول",
"Reject" : "رفض",
"Incoming ownership transfer from {user}" : "تم تحويل ملكية الملف إليك من قبل {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "هل تريد الموافقة {path}?\n\nملاحظة: عملية موافقة على النقل قد تستغرق إلى 1 ساعة.",
"Ownership transfer failed" : "فشل نقل ملكية",
"Your ownership transfer of {path} to {user} failed." : "فشلت عمليتك لنقل الـ {path} إلى {user}",
"The ownership transfer of {path} from {user} failed." : "فشل عملية النقل لـ {path} من قبل {user}",
"Ownership transfer done" : "تم نقل ملكية بنجاح",
"Your ownership transfer of {path} to {user} has completed." : "عمليتك لنقل الـ {path} إلى {user} تمت بنجاح.",
"The ownership transfer of {path} from {user} has completed." : "نقل الملكية لـ {path} من قبل {user} تمت بنجاح.",
"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" : "لا تملك الصلاحية لرفع او انشاء ملف هنا ",
"Some files could not be uploaded" : "بعض الملفات لم يمكن رفعها",
"Files uploaded successfully" : "تمّ رفع الملفات بنجاحٍ",
"\"{displayName}\" action executed successfully" : "\"{displayName}\" الأمر نُفّذ بنجاح",
"\"{displayName}\" action failed" : "\"{dispalyName}\" الأمر أخفق عند التنفيذ",
"Toggle selection for file \"{displayName}\"" : "تبديل الاختيار للملف \"{displayName}\"",
"Toggle selection for folder \"{displayName}\"" : "تبديل الاختيار للمجلد \"{displayName}\"",
"Rename file" : "إعادة تسمية الملف",
"File name" : "اسم الملف",
"Folder name" : "اسم المجلد",
"This node is unavailable" : "هذه العُقْدَة node غير متوفرة ",
"Download file {name}" : " تنزيل الملف {name}",
"\"{name}\" is not an allowed filetype." : "\"{name}\" ليس نوع ملف مسموحًا به.",
"{newName} already exists." : "{newName} موجود بالفعل.",
"\"{char}\" is not allowed inside a file name." : "\"{char}\" حرفٌ غير مسموح به في اسم الملف.",
"Name cannot be empty" : "لا يمكن أن يكون الاسم فارغاً",
"Another entry with the same name already exists" : "إدخال آخر بنفس الاسم موجود بالفعل",
"Renamed \"{oldName}\" to \"{newName}\"" : "تمت إعادة تسمية \"{oldName}\" إلى \"{newName}\"",
"Could not rename \"{oldName}\", it does not exist any more" : "تعذر إعادة تسمية \"{oldName}\"، لم يعد موجودًا",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "الاسم \"{newName}\" مُستعمَلٌ سلفاً في المجلّد\"{dir}\". إختَر اسماً آخر رجاءً.",
"Could not rename \"{oldName}\"" : "تعذرت إعادة تسمية \"{oldName}\"",
"Total rows summary" : "ملخص مجموع الأسطر",
"Toggle selection for all files and folders" : "تبديل الاختيار لكل الملفات و المجلدات",
"\"{displayName}\" failed on some elements " : "\"{displayName}\" فشل في بعض العناصر",
"\"{displayName}\" batch action executed successfully" : "\"{displayName}\" حزمة الأوامر نُفّذت بنجاح",
"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" : "تعذر العثور على الملف",
"Storage informations" : "معلومات التخزين",
"{usedQuotaByte} used" : "{usedQuotaByte} مستخدمة",
"{relative}% used" : "{relative}% مستخدمة",
"Could not refresh storage stats" : "تعذر تحديث حالة التخزين",
"Your storage is full, files can not be updated or synced anymore!" : "مساحتك التخزينية ممتلئة, لا يمكن تحديث ملفاتك أو مزامنتها بعد الآن !",
"Create" : "إنشاء",
"A file or folder with that name already exists." : "ملف أو مجلد بنفس هذا الاسم موجود سلفاً",
"Transfer ownership of a file or folder" : "تحويل ملكية ملف أو مجلد",
"Choose file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Change" : "تغير",
"New owner" : "مالك جديد",
"Choose a file or folder to transfer" : "اختر ملف او مجلد لنقل الملكية",
"Transfer" : "نقل ملكية",
"Transfer {path} to {userid}" : "نقل ملكية {path} إلى {userid}",
"Invalid path selected" : "المسار او الملف غير صحيح",
"Unknown error" : "خطأ غير معروف",
"Ownership transfer request sent" : "طلب نقل الملكية أرسل بنجاح",
"Cannot transfer ownership of a file or folder you do not own" : "لايمكنك نقل ملكية ملف أو مجلد لا تملكه",
"Select file or folder to link to" : "اختر ملف أو مجلد للربط معه",
"Choose file" : "إختَر ملفاً",
"Choose {file}" : "إختَر {file}",
"Loading current folder" : "تحميل المجلد الحالي",
"No files in here" : "لا يوجد ملفات هنا ",
"Upload some content or sync with your devices!" : "ارفع بعض المحتوي او زامن مع اجهزتك !",
"Go to the previous folder" : "إنتقل للمجلد السابق",
"Go back" : "العودة",
"Share" : "مُشارَكة",
"Shared by link" : "شاركته باستخدام رابط مشاركة",
"Shared" : "مُشارَكة",
"Switch to list view" : "التبديل إلى عرض القائمة",
"Switch to grid view" : "بدِّل إلى المنظور الصندوقي",
"Error during upload: {message}" : "حدث خطأ أثناء الرفع: {message}",
"Error during upload, status code {status}" : "حدث خطأ أثناء الرفع. رمز الحالة {status}",
"Unknown error during upload" : "خطأ غير محدد حدث أثناء الرفع",
"Open the files app settings" : "إفتح إعدادات تطبيق الملفات",
"Files settings" : "إعدادات الملفات",
"File cannot be accessed" : "الملف لم يمكن الوصول إليه",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "إمّا أن الملف غير موجود أو أنك لا تمتلك الصلاحية لعرضه. أُطلُب من المُرسل أن يتشاركه معك.",
"Sort favorites first" : "فرز المفضلات أولا",
"Sort folders before files" : "فرز المجلدات قبل الملفات",
"Show hidden files" : "عرض الملفات المخفية",
"Crop image previews" : "اقتصاص صورة العروض",
"Enable the grid view" : "تمكين المنظور الصندوقي",
"Additional settings" : "الإعدادات المتقدمة",
"WebDAV" : "WebDAV",
"WebDAV URL" : "عنوان URL لـ WebDAV",
"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." : "إذا كنت قد فعّلت خاصية \"التحقق بأكثل من عامل\" 2FA، يجب عليك تجديد كلمة سر التطبيق بالضغط هنا.",
"Clipboard is not available" : "الحافظة غير متاحة",
"WebDAV URL copied to clipboard" : "تم نسخ WebDAV URL إلى الحافظة",
"Unable to change the favourite state of the file" : "لم نستطع تغير الحالة المفضلة للملف",
"Error while loading the file data" : "خطأ اثناء تحميل بيانات الملف",
"Pick a template for {name}" : "اختر قالبا لـ {name}",
"Create a new file with the selected template" : "إنشاء ملف جديد بإستخدام القالب المحدد",
"Creating file" : "إنشاء ملف",
"Blank" : "فارغ",
"Unable to create new file from template" : "تعذر إنشاء الملف الجديد من القالب",
"Delete permanently" : "حذف بشكل دائم",
"Delete and unshare" : "إحذِف و الغٍ المشاركات ",
"You are about to delete {count} items." : "أنت على وشك حذف {count} عنصر.",
"Confirm deletion" : "أكِّد على الحذف",
"Cancel" : "الغاء",
"Deletion cancelled" : "تمّ إلغاء الحذف",
"Destination is not a folder" : "المَقصَد ليس مُجلّداً",
"This file/folder is already in that directory" : "هذا الملف/المجلد موجود سلفاً في ذلك المجلد",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
"(copy)" : "(نسخ)",
"(copy %n)" : "(نسخ %n)",
"Move cancelled" : "تمّ إلغاء النقل",
"A file or folder with that name already exists in this folder" : "ملف أو مجلد بنفس ذاك الاسم موجود سلفاً في هذا المجلد",
"The file does not exist anymore" : "الملف لم يعد موجوداً",
"Choose destination" : "إختَر المَقصِد",
"Copy to {target}" : "أُنسُخ إلى {target}",
"Move to {target}" : "أُنقُل إلى {target}",
"Cancelled move or copy operation" : ".عملية النسخ أو النقل تمّ إلغاؤها",
"Move or copy operation failed" : "عملية النسخ أو النقل أخفقت",
"Open folder {displayName}" : "إفتح المجلد {displayName}",
"Open in Files" : "إفتَح في \"الملفات\"",
"Open details" : "افتح التفاصيل",
"An error occurred while uploading. Please try again later." : "حدث خطأ أثناء الرفع. يُرجى المحاولة مرة أخرى في وقت لاحق.",
"Could not copy {file}. {message}" : "تعذّر نسخ {file}. {message}",
"Could not move {file}. {message}" : "تعذّر نقل {file}. {message}",
"Created new folder \"{name}\"" : "تمّ إنشاء مجلد جديد باسم \"{name}\"",
"Filename" : "اسم الملف",
"Unable to initialize the templates directory" : "تعذر تهيئة دليل القوالب",
"Create new templates folder" : "إنشيْ مجلد جديد للقوالب",
"Templates" : "القوالب",
"New template folder" : "مجلد القوالب الجديد",
"One of the dropped files could not be processed" : "أحد الملفات المُفلَتة لا يمكن معالجته",
"Uploading \"{filename}\" failed" : "فشل في تحديث \"{filename}\" ",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} مجلد","{folderCount} مجلد","{folderCount} مجلدان","{folderCount} مجلد","{folderCount} مجلدات","{folderCount} مجلدات"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ملف","{fileCount} ملف","{fileCount} ملفان","{fileCount} ملف","{fileCount} ملفات","{fileCount} ملفات"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلدان","ملف واحد 1 و {folderCount} مجلد","ملف واحد 1 و {folderCount} مجلدات","ملف واحد 1 و {folderCount} مجلدات"],
"_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ملف و مجلد واحد 1","{fileCount} ملف و مجلد واحد 1","{fileCount} ملفان و مجلد واحد 1","{fileCount} ملف و مجلد واحد 1","{fileCount} ملفات و مجلد واحد 1","{fileCount} ملفات و مجلد واحد 1"],
"{fileCount} files and {folderCount} folders" : "{fileCount} ملف و {folderCount} مجلد",
"List of favorites files and folders." : "قائمة الملفات والمجلدات المفضلة.",
"No favorites yet" : "ليست عندك مفضلات بعد",
"Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ",
"All files" : "كل الملفات",
"List of your files and folders." : "قائمة بملفاتك و مجلداتك",
"Personal Files" : "ملفات شخصية",
"List of your files and folders that are not shared." : "قائمة بالملفات و المجلدات التي لم تتم مشاركتها.",
"No personal files found" : "لا توجد أي ملفات شخصية",
"Files that are not shared will show up here." : "الملفات التي لم تتم مشاركتها ستُعرض هنا",
"List of recently modified files and folders." : "قائمة بالملفات و المجلدات التي تمّ تعديلها مؤخراً.",
"No recently modified files" : "لا توجد أيّ ملفات تمّ تعديلها مؤخراً",
"Files and folders you recently modified will show up here." : "الملفات و المجلدات التي تمّ تعديلها مؤخراً ستظهر هنا.",
"No entries found in this folder" : "لا يوجد مدخلات في هذا المجلد ",
"Select all" : "تحديد الكل ",
"Upload too large" : "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.",
"Text file" : "ملف نصي",
"New text file.txt" : "ملف نصي جديد fille.txt",
"Direct link was copied (only works for users who have access to this file/folder)" : "تم نسخ الرابط المباشر (تعمل فقط بالنسبة للمستخدمين الذين يملكون تخويلاً بالوصول إلى هذا الملف أو المجلد)",
"Copy direct link (only works for users who have access to this file/folder)" : "نسخ الرابط المباشر (يعمل فقط للمستخدمين الذين يمكنهم الوصول الى هذا الملف/المجلد)",
"You can only favorite a single file or folder at a time" : "يمكنك فقط تفضيل ملف أو مجلد واحد في المرة الواحدة",
"\"remote user\"" : "\"مستخدم عن بعد\"",
"Search users" : "ابحث عن مستخدمين",
"You might not have have permissions to view it, ask the sender to share it" : "يمكن ألاّ تكون لديك صلاحية لعرضه، أطلب من المُرسل إن يشاركه معك",
"Set up templates folder" : "إعداد مجلد القوالب",
"Toggle %1$s sublist" : "تبديل %1$s قائمة فرعية",
"Toggle grid view" : "تفعيل/تعطيل القائمة",
"Deleted files" : "الملفات المحذوفة",
"Shares" : "التي قمتَ بمشاركتها",
"Shared with others" : "شاركته مع الاخرين",
"Shared with you" : "تمت مشاركته معك",
"Deleted shares" : "تم حذف المشاركات",
"Pending shares" : "انتظار المشاركات",
"This file has the tag {tag}" : "هذا الملف له واصفة {tag}",
"This file has the tags {firstTags} and {lastTag}" : "هذا الملف له واصفات {firstTags} و {lastTag}",
"Select the row for {displayName}" : "إختر السطر في {displayName}",
"Open folder {name}" : "إفتح المجلد {name}",
"Unselect all" : "إلغاء الاختيار للكل",
"ascending" : "تصاعدياً",
"descending" : "تنازلياً",
"Sort list by {column} ({direction})" : "ترتيب القائمة بحسب {column} ({direction})",
"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" : "لم يتم حذف أي ملفات أو مجلدات بعدُ",
"Add" : "أضِف",
"The files is locked" : "الملفات مقفله"
},"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;"
}
+342
View File
@@ -0,0 +1,342 @@
OC.L10N.register(
"files",
{
"File could not be found" : "Nun se pudo atopar el ficheru",
"Move or copy" : "Mover o copiar",
"Download" : "Baxar",
"Delete" : "Desaniciar",
"Tags" : "Etiquetes",
"Show list view" : "Amosar la vista en llista",
"Show grid view" : "Amosar la vista en rexáu",
"Home" : "Aniciu",
"Close" : "Zarrar",
"Could not create folder \"{dir}\"" : "Nun se pudo crear la carpeta «{dir}»",
"This will stop your current uploads." : "Esta aición va parar les xubes actuales.",
"Upload cancelled." : "Encaboxóse la xuba.",
"Processing files …" : "Procesando los ficheros…",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun ye posible xubir «{filename}» darréu que ye un direutoriu o tien 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu porque namás queda {size2} y tas xubiendo {size1}",
"Target folder \"{dir}\" does not exist any more" : "La carpeta de destín «{dir}» xá nun esiste",
"Not enough free space" : "Nun hai abondu espaciu llibre",
"An unknown error has occurred" : "Prodúxose un error desconocíu",
"File could not be uploaded" : "Nun se pudo xubir el ficheru",
"Uploading …" : "Xubiendo…",
"{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
"Uploading … ({currentNumber}/{total})" : "Xubiendo… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "La xuba d'esi elementu nun ye compatible",
"Target folder does not exist any more" : "La carpeta de destín yá nun esiste",
"Operation is blocked by access control" : "El control d'accesu bloquió la operación",
"Error when assembling chunks, status code {status}" : "Hebo un error al atropar los cachos. Códigu d'estáu {status}",
"Actions" : "Aiciones",
"Rename" : "Renomar",
"Move" : "Mover",
"Copy" : "Copiar",
"Choose target folder" : "Escoyer la carpeta de destín",
"Set reminder" : "Configurar un recordatoriu",
"Edit locally" : "Editar llocalmente",
"Open" : "Abrir",
"_Delete file_::_Delete files_" : ["Desaniciar el ficheru","Desaniciar los ficheros"],
"_Delete folder_::_Delete folders_" : ["Desaniciar la carpeta","Desaniciar les carpetes"],
"_Disconnect storage_::_Disconnect storages_" : ["Desconectar l'almacenamientu","Desconectar los almacenamientos"],
"_Leave this share_::_Leave these shares_" : ["Dexar esta compartición","Dexar estes comparticiones"],
"Could not load info for file \"{file}\"" : "Nun se pudo cargar la información del ficheru «{file}»",
"Files" : "Ficheros",
"Details" : "Detalles",
"Please select tag(s) to add to the selection" : "Seleiciona les etiquetes que quies amestar a la seleición",
"Apply tag(s) to selection" : "Aplicar les etiquetes a la seleición",
"Select directory \"{dirName}\"" : "Seleicionar el direutoriu «{dirName}»",
"Select file \"{fileName}\"" : "Seleicionar el ficheru «{fileName}»",
"Pending" : "Pendiente",
"Unable to determine date" : "Nun ye posible determinar la data",
"This operation is forbidden" : "Esta operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, revisa'l rexistru o ponte en contautu cola alministración.",
"Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
"Could not move \"{file}\", target exists" : "Nun se pudo mover «{file}», el destín esiste",
"Could not move \"{file}\"" : "Nun se pudo mover «{file}»",
"copy" : "copia",
"Could not copy \"{file}\", target exists" : "Nun se pudo copiar «{file}», el destín esiste",
"Could not copy \"{file}\"" : "Nun se pudo copiar «{file}»",
"Copied {origin} inside {destination}" : "Copióse «{origin}» dientro de: {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copióse «{origin}» y {nbfiles} ficheros más dientro de: {destination}",
"Failed to redirect to client" : "Nun se pue redirixir al veceru",
"{newName} already exists" : "«{newName}» xá esiste",
"Could not rename \"{fileName}\", it does not exist any more" : "Nun se pudo nomar «{fileName}». Yá nun esiste",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{targetName}» yá ta n'usu pola carpeta «{dir}». Escueyi otru nome.",
"Could not rename \"{fileName}\"" : "Nun se pudo renomar «{fileName}»",
"Could not create file \"{file}\"" : "Nun se pudo crear el ficheru «{file}»",
"Could not create file \"{file}\" because it already exists" : "Nun se pudo crear el ficheru «{file}» porque yá esiste",
"Could not create folder \"{dir}\" because it already exists" : "Nun se pudo crear la carpeta «{file}» porque yá esiste",
"Could not fetch file details \"{file}\"" : "Nun se pudo dir en cata de los detalles del ficheru «{file}»",
"Error deleting file \"{fileName}\"." : "Hebo un error al desaniciar «{fileName}»",
"No search results in other folders for {tag}{filter}{endtag}" : "Nun hai nengún resultáu de busca nes demás carpetes pa: {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduz más de dos carátueres pa buscar nes demás carpetes",
"Name" : "Nome",
"Size" : "Tamañu",
"Modified" : "Modificóse",
"_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
"_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
"{dirs} and {files}" : "{dirs} ya {files}",
"You do not have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
"_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
"New" : "Nuevu",
"New file/folder menu" : "Menú de carpeta/ficheru nuevos",
"Select file range" : "Seleicionar el rangu de ficheros",
"{used}%" : "{used}%",
"{used} of {quota} used" : "{used} de {quota} n'usu",
"{used} used" : "{used} n'usu",
"\"{name}\" is an invalid file name." : "«{name}» ye un nome inválidu.",
"File name cannot be empty." : "El nome del ficheru nun pue tar baleru.",
"\"/\" is not allowed inside a file name." : "«/» ye un caráuter que nun ta permitíu nel nome del ficheru.",
"\"{name}\" is not an allowed filetype" : "«{name}» nun ye un tipu de ficheru permitíu",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'almacenamientu del usuariu «{owner}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta del grupu «{mountPoint}» ta enllena, ¡yá nun se puen xubir nin sincronizar ficheros!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'almacenamientu esternu «{mountPoint}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Your storage is full, files cannot be updated or synced anymore!" : "El to almacenamientu ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'almacenamientu del usuariu «{owner}» ta cuasi enllén ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta del grupu «{mountPoint}» ta cuasi enllena ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'almacenamientu esternu «{mountPoint}» ta cuasi enllén ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "El to almacenamientu ta cuasi enllén ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["concasa con «{filter}»","concasen con «{filter}»"],
"View in folder" : "Ver na carpeta",
"Direct link was copied (only works for people who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
"Path" : "Camín",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Metióse en Favoritos",
"Favorite" : "Meter en Favoritos",
"Copy direct link (only works for people who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
"New folder" : "Carpeta nueva",
"Create new folder" : "Crear una carpeta",
"Upload file" : "Xubir un ficheru",
"Recent" : "De recién",
"Not favorited" : "Nun ta en Favoritos",
"Remove from favorites" : "Quitar de Favoritos",
"Add to favorites" : "Meter en Favoritos",
"An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
"Added to favorites" : "Metióse en Favoritos",
"Removed from favorites" : "Quitóse de Favoritos",
"You added {file} to your favorites" : "Metiesti'l ficheru «{ficheru}» en Favoritos",
"You removed {file} from your favorites" : "Quitesti'l ficheru «{file}» de Favoritos",
"Favorites" : "Favoritos",
"File changes" : "Cambeos del ficheru",
"Created by {user}" : "Elementu creáu por {user}",
"Changed by {user}" : "Elementu camudáu por {user}",
"Deleted by {user}" : "Elementu desaniciáu por {user}",
"Restored by {user}" : "Elementu restauráu por {user}",
"Renamed by {user}" : "Elementu renomáu por {user}",
"Moved by {user}" : "Elementu movíu por {user}",
"\"remote account\"" : "«cuenta remota»",
"You created {file}" : "Creesti {file}",
"You created an encrypted file in {file}" : "Creesti un ficheru cifráu en: {file}",
"{user} created {file}" : "«{user}» creó «{file}»",
"{user} created an encrypted file in {file}" : "«{user}» creó un ficheru cifráu en: {file}",
"{file} was created in a public folder" : "{file} creóse nuna carpeta pública",
"You changed {file}" : "Camudesti {file}",
"You changed an encrypted file in {file}" : "Camudesti'l ficheru cifráu de: {file}",
"{user} changed {file}" : "{user} camudó {file}",
"{user} changed an encrypted file in {file}" : "«{user}» camudó un ficheru cifráu de: {file}",
"You deleted {file}" : "Desaniciesti «{file}»",
"You deleted an encrypted file in {file}" : "Desaniciesti un ficheru cifráu de {file}",
"{user} deleted {file}" : "{user} desanició «{file}»",
"{user} deleted an encrypted file in {file}" : "«{user}» desanició un ficheru cifráu de: {file}",
"You restored {file}" : "Restauresti {file}",
"{user} restored {file}" : "{user} restauró {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}» (elementu anubríu)",
"You renamed {oldfile} (hidden) to {newfile}" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}»",
"You renamed {oldfile} to {newfile} (hidden)" : "Renomesti «{oldfile}» a «{newfile}» (elementu anubríu)",
"You renamed {oldfile} to {newfile}" : "Renomesti «{oldfile}» a «{newfile}»",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomó «{oldfile}» (elementu anubríu) a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomó {oldfile} (elementu anubríu) a {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomó {oldfile} a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} to {newfile}" : "{user} renomó {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Moviesti {oldfile} a {newfile}",
"A file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta que <strong>camudó</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta de Favoritos que <strong>camudó</strong>",
"Accept" : "Aceptar",
"Reject" : "Refugar",
"Incoming ownership transfer from {user}" : "Recibióse una tresferencia de propiedá de: {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quies aceptar «{path}»?\n\nNota: el procesu de tresferencia pue tardar hasta 1 hora tres aceptalu",
"Ownership transfer failed" : "El procesu de tresferencia falló",
"Your ownership transfer of {path} to {user} failed." : "El procesu de tresferencia de «{path}» a «{user}» falló",
"The ownership transfer of {path} from {user} failed." : "El procesu de tresferencia de «{path}» dende «{user}» falló",
"Ownership transfer done" : "Completóse la tresferencia de propiedá",
"Your ownership transfer of {path} to {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» a «{user}».",
"The ownership transfer of {path} from {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» dende «{user}».",
"in %s" : "en «%s»",
"File Management" : "Xestión de ficheros",
"Current directory path" : "Camín actual del direutoriu",
"Reload current directory" : "Volver cargar el direutoriu actual",
"Go to the \"{dir}\" directory" : "Dir al direutoriu «{dir}»",
"Drag and drop files here to upload" : "Arrastra y suelta los ficheros equí pa xubilos",
"You dont have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
"Some files could not be uploaded" : "Nun se pudieron xubir dalgunos ficheros",
"Files uploaded successfully" : "Los ficheros xubiéronse correutamente",
"\"{displayName}\" action executed successfully" : "L'aición «{displayName}» executóse correutamente",
"\"{displayName}\" action failed" : "L'aición «{displayName}» falló",
"Toggle selection for file \"{displayName}\"" : "Alternar la seleición del ficheru «{displayName}»",
"Toggle selection for folder \"{displayName}\"" : "Alternar la seleición de la carpeta «{displayName}»",
"Rename file" : "Renomar el ficheru",
"File name" : "Nome del ficheru",
"Folder name" : "Nome de la carpeta",
"This node is unavailable" : "Esti noyu nun ta disponible",
"Download file {name}" : "Baxar el ficheru «{name}»",
"\"{name}\" is not an allowed filetype." : "«{name}» nun ye un tipu de ficheru permíu",
"{newName} already exists." : "«{newName}» yá esiste.",
"\"{char}\" is not allowed inside a file name." : "El caráuter «{char}» nun ta permitíu nel nome del ficheru.",
"Name cannot be empty" : "El nome nun pue tar baleru",
"Another entry with the same name already exists" : "Yá esiste otra entrada col mesmu nome",
"Renamed \"{oldName}\" to \"{newName}\"" : "Renomóse «{oldName}» a «{newName}»",
"Could not rename \"{oldName}\", it does not exist any more" : "Nun se pue renomar «{oldName}». Yá nun esiste",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{newName}» yá ta n'usu na carpeta «{dir}». Escueyi otru nome.",
"Could not rename \"{oldName}\"" : "Nun se pudo renomar «{oldName}»",
"Total rows summary" : "Resume total de fieleres",
"Toggle selection for all files and folders" : "Alternar la seleición de tolos ficheros y toles carpetes",
"\"{displayName}\" failed on some elements " : "«{displauName}» falló con dalgún elementu",
"\"{displayName}\" batch action executed successfully" : "L'aición per llotes «{displayName}» executóse correutamente",
"List of files and folders." : "Una llista de ficheros y carpetes.",
"Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
"File not found" : "Nun s'atopó'l ficheru",
"Storage informations" : "Información del almacenamientu",
"{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
"{relative}% used" : "{relative}% n'usu",
"Could not refresh storage stats" : "Nun se pudo anovar l'estáu del almacenamientu",
"Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
"Create" : "Crear",
"A file or folder with that name already exists." : "Yá esiste un ficheru o una carpeta con esi nome",
"Transfer ownership of a file or folder" : "Tresferir la propiedá d'un ficheru o una carpeta",
"Choose file or folder to transfer" : "Escoyer el ficheru o carpeta a tresferir",
"Change" : "Camudar",
"New owner" : "Propietariu nuevu",
"Choose a file or folder to transfer" : "Escueyi un ficheru o una carpeta a tresferir",
"Transfer" : "Tresferir",
"Transfer {path} to {userid}" : "Tresferir «{path}» a «{userid}»",
"Invalid path selected" : "Seleicionóse un camín inválidu",
"Unknown error" : "Error desconocíu",
"Ownership transfer request sent" : "Unvióse la solicitú de tresferencia de la propiedá",
"Cannot transfer ownership of a file or folder you do not own" : "Nun se pue tresferir la propiedá d'un ficheru o una carpeta que nun te pertenez",
"Select file or folder to link to" : "Seleicionar un ficheru o una carpeta a la qu'enllaciar",
"Choose file" : "Escoyer un ficheru",
"Choose {file}" : "Escoyer «{file}»",
"Loading current folder" : "Cargando la carpeta actual",
"No files in here" : "Nun hai ficheros",
"Upload some content or sync with your devices!" : "¡Xubi conteníu o sincroniza daqué colos tos preseos!",
"Go to the previous folder" : "Dir a la carpeta anterior",
"Go back" : "Dir p'atrás",
"Share" : "Compartir",
"Shared by link" : "Compartir pente un enllaz",
"Shared" : "Compartío",
"Switch to list view" : "Cambiar a la vista de llista",
"Switch to grid view" : "Cambiar a la vista de rexáu",
"Error during upload: {message}" : "Hebo un error demientres la xuba: {messages}",
"Error during upload, status code {status}" : "Hebo un error demientres la xuba. Cödigu d'estáu: {status}",
"Unknown error during upload" : "Hebo un error desconocíu demientres la xuba",
"Open the files app settings" : "Abrir la configuración de Ficheros",
"Files settings" : "Configuración de Ficheros",
"File cannot be accessed" : "Nun se pue acceder al ficheru",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nun se pudo atopar el ficheru o nun tienes permisu pa velu. Pidi al remitente que lu comparta.",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar les carpetes enantes que los ficheros",
"Show hidden files" : "Amosar los ficheros anubríos",
"Crop image previews" : "Recortar la previsualización d'imáxenes",
"Enable the grid view" : "Activar la vista de rexáu",
"Additional settings" : "Configuración adicional",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar nel cartafueyu",
"Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"Clipboard is not available" : "El cartafueyu nun ta disponible",
"WebDAV URL copied to clipboard" : "La URL de WebDAV copióse nel cartafueyu",
"Unable to change the favourite state of the file" : "Nun ye posible camudar l'estáu favoritu del ficheru",
"Error while loading the file data" : "Hebo un error mentanto de cargaben los datos de los ficheros",
"Pick a template for {name}" : "Escoyer una plantía pa: {name}",
"Create a new file with the selected template" : "Crea un ficheru cola plantía seleicionada",
"Creating file" : "Creando'l ficheru",
"Unable to create new file from template" : "Nun ye posible crear un ficheru dende una plantía",
"Delete permanently" : "Desaniciar permanentemente",
"Delete and unshare" : "Desaniciar y dexar de compartir",
"You are about to delete {count} items." : "Tas a piques de desaniciar {count} elementos.",
"Confirm deletion" : "Confirmar el desaniciu",
"Cancel" : "Encaboxar",
"Deletion cancelled" : "Anulóse'l desaniciu",
"Destination is not a folder" : "El destín nun ye una carpeta",
"This file/folder is already in that directory" : "Esti ficheru o esta carpeta yá ta nel direutoriu",
"(copy)" : "(copia)",
"(copy %n)" : "(copia %n)",
"Move cancelled" : "Anulóse la operación de mover",
"A file or folder with that name already exists in this folder" : "Nesta carpeta, yá estie un ficheru o una carpeta con esi nome",
"The file does not exist anymore" : "El ficheru yá nun esiste",
"Choose destination" : "Escoyer el destín",
"Copy to {target}" : "Copiar a {target}",
"Move to {target}" : "Mover a {target}",
"Cancelled move or copy operation" : "Anulóse la operación de mover o copiar",
"Move or copy operation failed" : "La operación de mover o copiar falló",
"Open folder {displayName}" : "Abrir la carpeta «{displayName}»",
"Open in Files" : "Abrir en Ficheros",
"Open details" : "Abrir los detalles",
"An error occurred while uploading. Please try again later." : "Prodúxose un error mentanto se xubía. Volvi tentalo dempués.",
"Could not copy {file}. {message}" : "Nun se pudo copiar «{file}». {message}",
"Could not move {file}. {message}" : "Nun se pudo mover «{file}». {message}",
"Created new folder \"{name}\"" : "Creóse la carpeta «{name}»",
"Filename" : "Nome de ficheru",
"Unable to initialize the templates directory" : "Nun ye posible aniciar el direutoriu de plantíes",
"Create new templates folder" : "Crear una carpeta de plantíes",
"Templates" : "Plantíes",
"New template folder" : "Carpeta de plantíes nueva",
"One of the dropped files could not be processed" : "Nun se pudo procesar unu de los ficheros soltaos",
"Uploading \"{filename}\" failed" : "La xuba de «{filename}» falló",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
"_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheru y 1 carpeta","{fileCount} ficheros y 1 carpeta"],
"{fileCount} files and {folderCount} folders" : "{fileCount} ficheros y {folderCount} carpetes",
"List of favorites files and folders." : "Una llista de ficheros y carpetes favoritos.",
"No favorites yet" : "Entá nun hai nengún elementu favoritu",
"Files and folders you mark as favorite will show up here" : "Equí apaecen los ficheros y carpetes que metas en Favoritos",
"All files" : "Tolos ficheros",
"List of your files and folders." : "Una llista de los ficheros y les carpetes de to.",
"Personal Files" : "Ficheros personales",
"List of your files and folders that are not shared." : "Una llista de ficheros y carpetes que nun se compartieron.",
"No personal files found" : "Nun s'atopó nengún ficheru personal",
"Files that are not shared will show up here." : "Equí apaecen los ficheros que nun se compartan.",
"List of recently modified files and folders." : "Una llista de ficheros y carpetes modificaos de recién.",
"No recently modified files" : "Nun hai nengún ficheru modificáu de recién",
"Files and folders you recently modified will show up here." : "Equí apaecen los ficheros y les carpetes modificaes de recién.",
"No entries found in this folder" : "Nun s'atopó nenguna entrada nesta carpeta",
"Select all" : "Seleicionar too",
"Upload too large" : "La xuba ye mui grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tentes de xubir superen el tamañu máximu qu'esti sirvidor permite.",
"Text file" : "Ficheru de testu",
"New text file.txt" : "ficheru_nuevu.txt",
"Direct link was copied (only works for users who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona colos usuarios que tienen accesu a esti ficheru o esta carpeta)",
"Copy direct link (only works for users who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona colos usuarios que tienen accesu a esti ficheru o esta carpeta)",
"\"remote user\"" : "«usuariu remotu»",
"Search users" : "Buscar usuarios",
"You might not have have permissions to view it, ask the sender to share it" : "Quiciabes nun tengas permisu pa ver l'elementu, pidi al remitente que lu comparta",
"Set up templates folder" : "Configurar la carpeta de plantíes",
"Toggle %1$s sublist" : "Alternar la sollista «%1$s»",
"Toggle grid view" : "Alternar la vista de rexáu",
"Deleted files" : "Ficheros desaniciaos",
"Shares" : "Comparticiones",
"Shared with others" : "Compartío con otros",
"Shared with you" : "Compartióse contigo",
"Deleted shares" : "Comparticiones desaniciaes",
"Pending shares" : "Comparticiones pendientes",
"This file has the tag {tag}" : "Esti ficheru tien la etiqueta «{tag}»",
"This file has the tags {firstTags} and {lastTag}" : "Esti ficheru tien les etiquetes «{firstTags}» y «{lastTag}»",
"Select the row for {displayName}" : "Seleicionar la filera de: {displayName}",
"Open folder {name}" : "Abrir la carpeta {name}",
"Unselect all" : "Deseleicionar too",
"ascending" : "ascendente",
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar la llista por {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues per ella.",
"Search for an account" : "Buscar una cuenta",
"Choose" : "Escoyer",
"No files or folders have been deleted yet" : "Entá nun se desanició nengún ficheru nin carpeta",
"Add" : "Amestar",
"The files is locked" : "El ficheru ta bloquiáu"
},
"nplurals=2; plural=(n != 1);");
+340
View File
@@ -0,0 +1,340 @@
{ "translations": {
"File could not be found" : "Nun se pudo atopar el ficheru",
"Move or copy" : "Mover o copiar",
"Download" : "Baxar",
"Delete" : "Desaniciar",
"Tags" : "Etiquetes",
"Show list view" : "Amosar la vista en llista",
"Show grid view" : "Amosar la vista en rexáu",
"Home" : "Aniciu",
"Close" : "Zarrar",
"Could not create folder \"{dir}\"" : "Nun se pudo crear la carpeta «{dir}»",
"This will stop your current uploads." : "Esta aición va parar les xubes actuales.",
"Upload cancelled." : "Encaboxóse la xuba.",
"Processing files …" : "Procesando los ficheros…",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun ye posible xubir «{filename}» darréu que ye un direutoriu o tien 0 bytes",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu porque namás queda {size2} y tas xubiendo {size1}",
"Target folder \"{dir}\" does not exist any more" : "La carpeta de destín «{dir}» xá nun esiste",
"Not enough free space" : "Nun hai abondu espaciu llibre",
"An unknown error has occurred" : "Prodúxose un error desconocíu",
"File could not be uploaded" : "Nun se pudo xubir el ficheru",
"Uploading …" : "Xubiendo…",
"{remainingTime} ({currentNumber}/{total})" : "{remainingTime} ({currentNumber}/{total})",
"Uploading … ({currentNumber}/{total})" : "Xubiendo… ({currentNumber}/{total})",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
"Uploading that item is not supported" : "La xuba d'esi elementu nun ye compatible",
"Target folder does not exist any more" : "La carpeta de destín yá nun esiste",
"Operation is blocked by access control" : "El control d'accesu bloquió la operación",
"Error when assembling chunks, status code {status}" : "Hebo un error al atropar los cachos. Códigu d'estáu {status}",
"Actions" : "Aiciones",
"Rename" : "Renomar",
"Move" : "Mover",
"Copy" : "Copiar",
"Choose target folder" : "Escoyer la carpeta de destín",
"Set reminder" : "Configurar un recordatoriu",
"Edit locally" : "Editar llocalmente",
"Open" : "Abrir",
"_Delete file_::_Delete files_" : ["Desaniciar el ficheru","Desaniciar los ficheros"],
"_Delete folder_::_Delete folders_" : ["Desaniciar la carpeta","Desaniciar les carpetes"],
"_Disconnect storage_::_Disconnect storages_" : ["Desconectar l'almacenamientu","Desconectar los almacenamientos"],
"_Leave this share_::_Leave these shares_" : ["Dexar esta compartición","Dexar estes comparticiones"],
"Could not load info for file \"{file}\"" : "Nun se pudo cargar la información del ficheru «{file}»",
"Files" : "Ficheros",
"Details" : "Detalles",
"Please select tag(s) to add to the selection" : "Seleiciona les etiquetes que quies amestar a la seleición",
"Apply tag(s) to selection" : "Aplicar les etiquetes a la seleición",
"Select directory \"{dirName}\"" : "Seleicionar el direutoriu «{dirName}»",
"Select file \"{fileName}\"" : "Seleicionar el ficheru «{fileName}»",
"Pending" : "Pendiente",
"Unable to determine date" : "Nun ye posible determinar la data",
"This operation is forbidden" : "Esta operación ta prohibida",
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, revisa'l rexistru o ponte en contautu cola alministración.",
"Storage is temporarily not available" : "L'almacenamientu nun ta disponible temporalmente",
"Could not move \"{file}\", target exists" : "Nun se pudo mover «{file}», el destín esiste",
"Could not move \"{file}\"" : "Nun se pudo mover «{file}»",
"copy" : "copia",
"Could not copy \"{file}\", target exists" : "Nun se pudo copiar «{file}», el destín esiste",
"Could not copy \"{file}\"" : "Nun se pudo copiar «{file}»",
"Copied {origin} inside {destination}" : "Copióse «{origin}» dientro de: {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Copióse «{origin}» y {nbfiles} ficheros más dientro de: {destination}",
"Failed to redirect to client" : "Nun se pue redirixir al veceru",
"{newName} already exists" : "«{newName}» xá esiste",
"Could not rename \"{fileName}\", it does not exist any more" : "Nun se pudo nomar «{fileName}». Yá nun esiste",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{targetName}» yá ta n'usu pola carpeta «{dir}». Escueyi otru nome.",
"Could not rename \"{fileName}\"" : "Nun se pudo renomar «{fileName}»",
"Could not create file \"{file}\"" : "Nun se pudo crear el ficheru «{file}»",
"Could not create file \"{file}\" because it already exists" : "Nun se pudo crear el ficheru «{file}» porque yá esiste",
"Could not create folder \"{dir}\" because it already exists" : "Nun se pudo crear la carpeta «{file}» porque yá esiste",
"Could not fetch file details \"{file}\"" : "Nun se pudo dir en cata de los detalles del ficheru «{file}»",
"Error deleting file \"{fileName}\"." : "Hebo un error al desaniciar «{fileName}»",
"No search results in other folders for {tag}{filter}{endtag}" : "Nun hai nengún resultáu de busca nes demás carpetes pa: {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Introduz más de dos carátueres pa buscar nes demás carpetes",
"Name" : "Nome",
"Size" : "Tamañu",
"Modified" : "Modificóse",
"_%n folder_::_%n folders_" : ["%n carpeta","%n carpetes"],
"_%n file_::_%n files_" : ["%n ficheru","%n ficheros"],
"{dirs} and {files}" : "{dirs} ya {files}",
"You do not have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
"_Uploading %n file_::_Uploading %n files_" : ["Xubiendo %n ficheru","Xubiendo %n ficheros"],
"New" : "Nuevu",
"New file/folder menu" : "Menú de carpeta/ficheru nuevos",
"Select file range" : "Seleicionar el rangu de ficheros",
"{used}%" : "{used}%",
"{used} of {quota} used" : "{used} de {quota} n'usu",
"{used} used" : "{used} n'usu",
"\"{name}\" is an invalid file name." : "«{name}» ye un nome inválidu.",
"File name cannot be empty." : "El nome del ficheru nun pue tar baleru.",
"\"/\" is not allowed inside a file name." : "«/» ye un caráuter que nun ta permitíu nel nome del ficheru.",
"\"{name}\" is not an allowed filetype" : "«{name}» nun ye un tipu de ficheru permitíu",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "L'almacenamientu del usuariu «{owner}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "La carpeta del grupu «{mountPoint}» ta enllena, ¡yá nun se puen xubir nin sincronizar ficheros!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "L'almacenamientu esternu «{mountPoint}» ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Your storage is full, files cannot be updated or synced anymore!" : "El to almacenamientu ta enllén. ¡Yá nun se puen xubir o sincronizar ficheros!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "L'almacenamientu del usuariu «{owner}» ta cuasi enllén ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "La carpeta del grupu «{mountPoint}» ta cuasi enllena ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "L'almacenamientu esternu «{mountPoint}» ta cuasi enllén ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "El to almacenamientu ta cuasi enllén ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["concasa con «{filter}»","concasen con «{filter}»"],
"View in folder" : "Ver na carpeta",
"Direct link was copied (only works for people who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
"Path" : "Camín",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Favorited" : "Metióse en Favoritos",
"Favorite" : "Meter en Favoritos",
"Copy direct link (only works for people who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona coles persones que tienen accesu a esti ficheru o esta carpeta)",
"New folder" : "Carpeta nueva",
"Create new folder" : "Crear una carpeta",
"Upload file" : "Xubir un ficheru",
"Recent" : "De recién",
"Not favorited" : "Nun ta en Favoritos",
"Remove from favorites" : "Quitar de Favoritos",
"Add to favorites" : "Meter en Favoritos",
"An error occurred while trying to update the tags" : "Prodúxose un error al tentar d'anovar les etiquetes",
"Added to favorites" : "Metióse en Favoritos",
"Removed from favorites" : "Quitóse de Favoritos",
"You added {file} to your favorites" : "Metiesti'l ficheru «{ficheru}» en Favoritos",
"You removed {file} from your favorites" : "Quitesti'l ficheru «{file}» de Favoritos",
"Favorites" : "Favoritos",
"File changes" : "Cambeos del ficheru",
"Created by {user}" : "Elementu creáu por {user}",
"Changed by {user}" : "Elementu camudáu por {user}",
"Deleted by {user}" : "Elementu desaniciáu por {user}",
"Restored by {user}" : "Elementu restauráu por {user}",
"Renamed by {user}" : "Elementu renomáu por {user}",
"Moved by {user}" : "Elementu movíu por {user}",
"\"remote account\"" : "«cuenta remota»",
"You created {file}" : "Creesti {file}",
"You created an encrypted file in {file}" : "Creesti un ficheru cifráu en: {file}",
"{user} created {file}" : "«{user}» creó «{file}»",
"{user} created an encrypted file in {file}" : "«{user}» creó un ficheru cifráu en: {file}",
"{file} was created in a public folder" : "{file} creóse nuna carpeta pública",
"You changed {file}" : "Camudesti {file}",
"You changed an encrypted file in {file}" : "Camudesti'l ficheru cifráu de: {file}",
"{user} changed {file}" : "{user} camudó {file}",
"{user} changed an encrypted file in {file}" : "«{user}» camudó un ficheru cifráu de: {file}",
"You deleted {file}" : "Desaniciesti «{file}»",
"You deleted an encrypted file in {file}" : "Desaniciesti un ficheru cifráu de {file}",
"{user} deleted {file}" : "{user} desanició «{file}»",
"{user} deleted an encrypted file in {file}" : "«{user}» desanició un ficheru cifráu de: {file}",
"You restored {file}" : "Restauresti {file}",
"{user} restored {file}" : "{user} restauró {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}» (elementu anubríu)",
"You renamed {oldfile} (hidden) to {newfile}" : "Renomesti «{oldfile}» (elementu anubríu) a «{newfile}»",
"You renamed {oldfile} to {newfile} (hidden)" : "Renomesti «{oldfile}» a «{newfile}» (elementu anubríu)",
"You renamed {oldfile} to {newfile}" : "Renomesti «{oldfile}» a «{newfile}»",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} renomó «{oldfile}» (elementu anubríu) a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "{user} renomó {oldfile} (elementu anubríu) a {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "{user} renomó {oldfile} a {newfile} (elementu anubríu)",
"{user} renamed {oldfile} to {newfile}" : "{user} renomó {oldfile} a {newfile}",
"You moved {oldfile} to {newfile}" : "Moviesti {oldfile} a {newfile}",
"A file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta que <strong>camudó</strong>",
"A favorite file or folder has been <strong>changed</strong>" : "Hai un ficheru o una carpeta de Favoritos que <strong>camudó</strong>",
"Accept" : "Aceptar",
"Reject" : "Refugar",
"Incoming ownership transfer from {user}" : "Recibióse una tresferencia de propiedá de: {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : "¿Quies aceptar «{path}»?\n\nNota: el procesu de tresferencia pue tardar hasta 1 hora tres aceptalu",
"Ownership transfer failed" : "El procesu de tresferencia falló",
"Your ownership transfer of {path} to {user} failed." : "El procesu de tresferencia de «{path}» a «{user}» falló",
"The ownership transfer of {path} from {user} failed." : "El procesu de tresferencia de «{path}» dende «{user}» falló",
"Ownership transfer done" : "Completóse la tresferencia de propiedá",
"Your ownership transfer of {path} to {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» a «{user}».",
"The ownership transfer of {path} from {user} has completed." : "Completóse la tresferencia de propiedá de «{path}» dende «{user}».",
"in %s" : "en «%s»",
"File Management" : "Xestión de ficheros",
"Current directory path" : "Camín actual del direutoriu",
"Reload current directory" : "Volver cargar el direutoriu actual",
"Go to the \"{dir}\" directory" : "Dir al direutoriu «{dir}»",
"Drag and drop files here to upload" : "Arrastra y suelta los ficheros equí pa xubilos",
"You dont have permission to upload or create files here" : "Nun tienes permisu pa xubir o crear ficheros equí",
"Some files could not be uploaded" : "Nun se pudieron xubir dalgunos ficheros",
"Files uploaded successfully" : "Los ficheros xubiéronse correutamente",
"\"{displayName}\" action executed successfully" : "L'aición «{displayName}» executóse correutamente",
"\"{displayName}\" action failed" : "L'aición «{displayName}» falló",
"Toggle selection for file \"{displayName}\"" : "Alternar la seleición del ficheru «{displayName}»",
"Toggle selection for folder \"{displayName}\"" : "Alternar la seleición de la carpeta «{displayName}»",
"Rename file" : "Renomar el ficheru",
"File name" : "Nome del ficheru",
"Folder name" : "Nome de la carpeta",
"This node is unavailable" : "Esti noyu nun ta disponible",
"Download file {name}" : "Baxar el ficheru «{name}»",
"\"{name}\" is not an allowed filetype." : "«{name}» nun ye un tipu de ficheru permíu",
"{newName} already exists." : "«{newName}» yá esiste.",
"\"{char}\" is not allowed inside a file name." : "El caráuter «{char}» nun ta permitíu nel nome del ficheru.",
"Name cannot be empty" : "El nome nun pue tar baleru",
"Another entry with the same name already exists" : "Yá esiste otra entrada col mesmu nome",
"Renamed \"{oldName}\" to \"{newName}\"" : "Renomóse «{oldName}» a «{newName}»",
"Could not rename \"{oldName}\", it does not exist any more" : "Nun se pue renomar «{oldName}». Yá nun esiste",
"The name \"{newName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome «{newName}» yá ta n'usu na carpeta «{dir}». Escueyi otru nome.",
"Could not rename \"{oldName}\"" : "Nun se pudo renomar «{oldName}»",
"Total rows summary" : "Resume total de fieleres",
"Toggle selection for all files and folders" : "Alternar la seleición de tolos ficheros y toles carpetes",
"\"{displayName}\" failed on some elements " : "«{displauName}» falló con dalgún elementu",
"\"{displayName}\" batch action executed successfully" : "L'aición per llotes «{displayName}» executóse correutamente",
"List of files and folders." : "Una llista de ficheros y carpetes.",
"Column headers with buttons are sortable." : "Les testeres de les columnes con botones puen ordenase.",
"This list is not fully rendered for performance reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues pela llista.",
"File not found" : "Nun s'atopó'l ficheru",
"Storage informations" : "Información del almacenamientu",
"{usedQuotaByte} used" : "{usedQuotaByte} n'usu",
"{relative}% used" : "{relative}% n'usu",
"Could not refresh storage stats" : "Nun se pudo anovar l'estáu del almacenamientu",
"Your storage is full, files can not be updated or synced anymore!" : "L'almacenamientu ta completu, ¡yá nun se pueden anovar o sincronizar ficheros!",
"Create" : "Crear",
"A file or folder with that name already exists." : "Yá esiste un ficheru o una carpeta con esi nome",
"Transfer ownership of a file or folder" : "Tresferir la propiedá d'un ficheru o una carpeta",
"Choose file or folder to transfer" : "Escoyer el ficheru o carpeta a tresferir",
"Change" : "Camudar",
"New owner" : "Propietariu nuevu",
"Choose a file or folder to transfer" : "Escueyi un ficheru o una carpeta a tresferir",
"Transfer" : "Tresferir",
"Transfer {path} to {userid}" : "Tresferir «{path}» a «{userid}»",
"Invalid path selected" : "Seleicionóse un camín inválidu",
"Unknown error" : "Error desconocíu",
"Ownership transfer request sent" : "Unvióse la solicitú de tresferencia de la propiedá",
"Cannot transfer ownership of a file or folder you do not own" : "Nun se pue tresferir la propiedá d'un ficheru o una carpeta que nun te pertenez",
"Select file or folder to link to" : "Seleicionar un ficheru o una carpeta a la qu'enllaciar",
"Choose file" : "Escoyer un ficheru",
"Choose {file}" : "Escoyer «{file}»",
"Loading current folder" : "Cargando la carpeta actual",
"No files in here" : "Nun hai ficheros",
"Upload some content or sync with your devices!" : "¡Xubi conteníu o sincroniza daqué colos tos preseos!",
"Go to the previous folder" : "Dir a la carpeta anterior",
"Go back" : "Dir p'atrás",
"Share" : "Compartir",
"Shared by link" : "Compartir pente un enllaz",
"Shared" : "Compartío",
"Switch to list view" : "Cambiar a la vista de llista",
"Switch to grid view" : "Cambiar a la vista de rexáu",
"Error during upload: {message}" : "Hebo un error demientres la xuba: {messages}",
"Error during upload, status code {status}" : "Hebo un error demientres la xuba. Cödigu d'estáu: {status}",
"Unknown error during upload" : "Hebo un error desconocíu demientres la xuba",
"Open the files app settings" : "Abrir la configuración de Ficheros",
"Files settings" : "Configuración de Ficheros",
"File cannot be accessed" : "Nun se pue acceder al ficheru",
"The file could not be found or you do not have permissions to view it. Ask the sender to share it." : "Nun se pudo atopar el ficheru o nun tienes permisu pa velu. Pidi al remitente que lu comparta.",
"Sort favorites first" : "Ordenar los favoritos primero",
"Sort folders before files" : "Ordenar les carpetes enantes que los ficheros",
"Show hidden files" : "Amosar los ficheros anubríos",
"Crop image previews" : "Recortar la previsualización d'imáxenes",
"Enable the grid view" : "Activar la vista de rexáu",
"Additional settings" : "Configuración adicional",
"WebDAV" : "WebDAV",
"WebDAV URL" : "URL de WebDAV",
"Copy to clipboard" : "Copiar nel cartafueyu",
"Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros per WebDAV",
"If you have enabled 2FA, you must create and use a new app password by clicking here." : "Si tienes activada l'autenticación en dos pasos, tienes de crear y usar una contraseña p'aplicaciones nueva calcando equí.",
"Clipboard is not available" : "El cartafueyu nun ta disponible",
"WebDAV URL copied to clipboard" : "La URL de WebDAV copióse nel cartafueyu",
"Unable to change the favourite state of the file" : "Nun ye posible camudar l'estáu favoritu del ficheru",
"Error while loading the file data" : "Hebo un error mentanto de cargaben los datos de los ficheros",
"Pick a template for {name}" : "Escoyer una plantía pa: {name}",
"Create a new file with the selected template" : "Crea un ficheru cola plantía seleicionada",
"Creating file" : "Creando'l ficheru",
"Unable to create new file from template" : "Nun ye posible crear un ficheru dende una plantía",
"Delete permanently" : "Desaniciar permanentemente",
"Delete and unshare" : "Desaniciar y dexar de compartir",
"You are about to delete {count} items." : "Tas a piques de desaniciar {count} elementos.",
"Confirm deletion" : "Confirmar el desaniciu",
"Cancel" : "Encaboxar",
"Deletion cancelled" : "Anulóse'l desaniciu",
"Destination is not a folder" : "El destín nun ye una carpeta",
"This file/folder is already in that directory" : "Esti ficheru o esta carpeta yá ta nel direutoriu",
"(copy)" : "(copia)",
"(copy %n)" : "(copia %n)",
"Move cancelled" : "Anulóse la operación de mover",
"A file or folder with that name already exists in this folder" : "Nesta carpeta, yá estie un ficheru o una carpeta con esi nome",
"The file does not exist anymore" : "El ficheru yá nun esiste",
"Choose destination" : "Escoyer el destín",
"Copy to {target}" : "Copiar a {target}",
"Move to {target}" : "Mover a {target}",
"Cancelled move or copy operation" : "Anulóse la operación de mover o copiar",
"Move or copy operation failed" : "La operación de mover o copiar falló",
"Open folder {displayName}" : "Abrir la carpeta «{displayName}»",
"Open in Files" : "Abrir en Ficheros",
"Open details" : "Abrir los detalles",
"An error occurred while uploading. Please try again later." : "Prodúxose un error mentanto se xubía. Volvi tentalo dempués.",
"Could not copy {file}. {message}" : "Nun se pudo copiar «{file}». {message}",
"Could not move {file}. {message}" : "Nun se pudo mover «{file}». {message}",
"Created new folder \"{name}\"" : "Creóse la carpeta «{name}»",
"Filename" : "Nome de ficheru",
"Unable to initialize the templates directory" : "Nun ye posible aniciar el direutoriu de plantíes",
"Create new templates folder" : "Crear una carpeta de plantíes",
"Templates" : "Plantíes",
"New template folder" : "Carpeta de plantíes nueva",
"One of the dropped files could not be processed" : "Nun se pudo procesar unu de los ficheros soltaos",
"Uploading \"{filename}\" failed" : "La xuba de «{filename}» falló",
"_{folderCount} folder_::_{folderCount} folders_" : ["{folderCount} carpeta","{folderCount} carpetes"],
"_{fileCount} file_::_{fileCount} files_" : ["{fileCount} ficheru","{fileCount} ficheros"],
"_1 file and {folderCount} folder_::_1 file and {folderCount} folders_" : ["1 ficheru y {folderCount} carpeta","1 ficheru y {folderCount} carpetes"],
"_{fileCount} file and 1 folder_::_{fileCount} files and 1 folder_" : ["{fileCount} ficheru y 1 carpeta","{fileCount} ficheros y 1 carpeta"],
"{fileCount} files and {folderCount} folders" : "{fileCount} ficheros y {folderCount} carpetes",
"List of favorites files and folders." : "Una llista de ficheros y carpetes favoritos.",
"No favorites yet" : "Entá nun hai nengún elementu favoritu",
"Files and folders you mark as favorite will show up here" : "Equí apaecen los ficheros y carpetes que metas en Favoritos",
"All files" : "Tolos ficheros",
"List of your files and folders." : "Una llista de los ficheros y les carpetes de to.",
"Personal Files" : "Ficheros personales",
"List of your files and folders that are not shared." : "Una llista de ficheros y carpetes que nun se compartieron.",
"No personal files found" : "Nun s'atopó nengún ficheru personal",
"Files that are not shared will show up here." : "Equí apaecen los ficheros que nun se compartan.",
"List of recently modified files and folders." : "Una llista de ficheros y carpetes modificaos de recién.",
"No recently modified files" : "Nun hai nengún ficheru modificáu de recién",
"Files and folders you recently modified will show up here." : "Equí apaecen los ficheros y les carpetes modificaes de recién.",
"No entries found in this folder" : "Nun s'atopó nenguna entrada nesta carpeta",
"Select all" : "Seleicionar too",
"Upload too large" : "La xuba ye mui grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tentes de xubir superen el tamañu máximu qu'esti sirvidor permite.",
"Text file" : "Ficheru de testu",
"New text file.txt" : "ficheru_nuevu.txt",
"Direct link was copied (only works for users who have access to this file/folder)" : "Copióse l'enllaz direutu (namás funciona colos usuarios que tienen accesu a esti ficheru o esta carpeta)",
"Copy direct link (only works for users who have access to this file/folder)" : "Copiar l'enllaz direutu (namás funciona colos usuarios que tienen accesu a esti ficheru o esta carpeta)",
"\"remote user\"" : "«usuariu remotu»",
"Search users" : "Buscar usuarios",
"You might not have have permissions to view it, ask the sender to share it" : "Quiciabes nun tengas permisu pa ver l'elementu, pidi al remitente que lu comparta",
"Set up templates folder" : "Configurar la carpeta de plantíes",
"Toggle %1$s sublist" : "Alternar la sollista «%1$s»",
"Toggle grid view" : "Alternar la vista de rexáu",
"Deleted files" : "Ficheros desaniciaos",
"Shares" : "Comparticiones",
"Shared with others" : "Compartío con otros",
"Shared with you" : "Compartióse contigo",
"Deleted shares" : "Comparticiones desaniciaes",
"Pending shares" : "Comparticiones pendientes",
"This file has the tag {tag}" : "Esti ficheru tien la etiqueta «{tag}»",
"This file has the tags {firstTags} and {lastTag}" : "Esti ficheru tien les etiquetes «{firstTags}» y «{lastTag}»",
"Select the row for {displayName}" : "Seleicionar la filera de: {displayName}",
"Open folder {name}" : "Abrir la carpeta {name}",
"Unselect all" : "Deseleicionar too",
"ascending" : "ascendente",
"descending" : "descendente",
"Sort list by {column} ({direction})" : "Ordenar la llista por {column} ({direction})",
"This list is not fully rendered for performances reasons. The files will be rendered as you navigate through the list." : "Esta llista nun ta completa por motivos de rindimientu. Los ficheros van apaecer a midida que navegues per ella.",
"Search for an account" : "Buscar una cuenta",
"Choose" : "Escoyer",
"No files or folders have been deleted yet" : "Entá nun se desanició nengún ficheru nin carpeta",
"Add" : "Amestar",
"The files is locked" : "El ficheru ta bloquiáu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+104
View File
@@ -0,0 +1,104 @@
OC.L10N.register(
"files",
{
"Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
"Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
"Unknown error" : "Bəlli olmayan səhv baş verdi",
"Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
"Invalid Token" : "Yalnış token",
"No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
"There is no error, the file uploaded with success" : "Səhv yoxdur, fayl uğurla yüklənildi.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Yüklənilən faylin həcmi php.ini config faylinin upload_max_filesize direktivində göstəriləndən çoxdur.",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
"The uploaded file was only partially uploaded" : "Yüklənilən faylın yalnız bir hissəsi yüklənildi",
"No file was uploaded" : "Heç bir fayl yüklənilmədi",
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
"Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
"The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
"Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
"Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
"Invalid directory." : "Yalnış qovluq.",
"Files" : "Fayllar",
"All files" : "Bütün fayllar",
"Home" : "Ev",
"Close" : "Bağla",
"Favorites" : "Sevimlilər",
"Upload cancelled." : "Yüklənmə dayandırıldı.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
"Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
"Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
"Uploading..." : "Serverə yüklənir...",
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
"Download" : "Yüklə",
"Rename" : "Adı dəyiş",
"Delete" : "Sil",
"Disconnect storage" : "Daşıyıcını ayır",
"Unshare" : "Paylaşımı durdur",
"Details" : "Detallar",
"Select" : "Seç",
"Pending" : "Gözləmə",
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
"This operation is forbidden" : "Bu əməliyyat qadağandır",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
"No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
"Name" : "Ad",
"Size" : "Həcm",
"Modified" : "Dəyişdirildi",
"_%n folder_::_%n folders_" : ["%n qovluq","%n qovluqlar"],
"_%n file_::_%n files_" : ["%n fayllar","%n fayllar"],
"{dirs} and {files}" : "{dirs} və {files}",
"You dont have permission to upload or create files here" : "Sizin burda yükləməyə və ya fayl yaratmağa yetkiniz yoxdur ",
"_Uploading %n file_::_Uploading %n files_" : ["%n fayllar yüklənilir","%n fayllar yüklənilir"],
"New" : "Yeni",
"\"{name}\" is an invalid file name." : "\"{name}\" yalnış fayl adıdır.",
"File name cannot be empty." : "Faylın adı boş ola bilməz.",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} məlumat anbarı doludur, fayllar artıq yenilənə və ya sinxronizasiya edilə bilməz!",
"Your storage is full, files can not be updated or synced anymore!" : "Sizin deponuz doludur, fayllar artıq yenilənə və sinxronizasiya edilə bilməz!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} məlumat anbari demək olar ki, doludur ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Sizin depo depo demək olar ki, doludur ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["uyğun '{filter}'","uyğun '{filter}'"],
"Path" : "Ünvan",
"_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
"Favorited" : "İstəkləndi",
"Favorite" : "İstəkli",
"Folder" : "Qovluq",
"New folder" : "Yeni qovluq",
"{newname} already exists" : "{newname} artıq mövcuddur",
"Upload" : "Serverə yüklə",
"An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
"A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
"A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
"Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>sevimli faylların</strong> yaradılması və silinməsi haqqında olan xəbərdarlıqları limitlə <em>(Yalnız axınlar)</em>",
"A file or folder has been <strong>deleted</strong>" : "Fayl və ya direktoriya <strong>silinib</strong>",
"A file or folder has been <strong>restored</strong>" : "Fayl yada qovluq geriyə <strong>qaytarıldı</strong>",
"You created %1$s" : "Siz yaratdınız %1$s",
"%2$s created %1$s" : "%2$s yaradılmış %1$s",
"%1$s was created in a public folder" : "%1$s ictimai qovluqda yaradıldı",
"You changed %1$s" : "Siz dəyişdiniz %1$s",
"%2$s changed %1$s" : "%2$s dəyişdirildi %1$s",
"You deleted %1$s" : "Siz silindiniz %1$s",
"%2$s deleted %1$s" : "%2$s silindi %1$s",
"You restored %1$s" : "Siz qayıtdınız %1$s",
"%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
"Upload (max. %s)" : "Yüklə (max. %s)",
"File handling" : "Fayl emalı",
"Maximum upload size" : "Maksimal yükləmə həcmi",
"max. possible: " : "maks. ola bilər: ",
"Save" : "Saxlamaq",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
"No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
"Upload too large" : "Yüklənmə şox böyükdür",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
"No favorites" : "Seçilmiş yoxdur",
"Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
"Text file" : "Tekst faylı",
"New text file.txt" : "Yeni mətn file.txt"
},
"nplurals=2; plural=(n != 1);");
+102
View File
@@ -0,0 +1,102 @@
{ "translations": {
"Storage not available" : "İnformasiya daşıyıcısı mövcud deyil",
"Storage invalid" : "İnformasiya daşıyıcısı yalnışdır",
"Unknown error" : "Bəlli olmayan səhv baş verdi",
"Unable to set upload directory." : "Əlavələr qovluğunu təyin etmək mümkün olmadı.",
"Invalid Token" : "Yalnış token",
"No file was uploaded. Unknown error" : "Heç bir fayl uüklənilmədi. Naməlum səhv",
"There is no error, the file uploaded with success" : "Səhv yoxdur, fayl uğurla yüklənildi.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Yüklənilən faylin həcmi php.ini config faylinin upload_max_filesize direktivində göstəriləndən çoxdur.",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Yüklənilən faylın həcmi HTML formasinda olan MAX_FILE_SIZE direktivində təyin dilmiş həcmi aşır.",
"The uploaded file was only partially uploaded" : "Yüklənilən faylın yalnız bir hissəsi yüklənildi",
"No file was uploaded" : "Heç bir fayl yüklənilmədi",
"Missing a temporary folder" : "Müvəqqəti qovluq çatışmır",
"Failed to write to disk" : "Sərt diskə yazmaq mümkün olmadı",
"Not enough storage available" : "Tələb edilən qədər yer yoxdur.",
"The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.",
"Upload failed. Could not find uploaded file" : "Yüklənmədə səhv oldu. Yüklənmiş faylı tapmaq olmur.",
"Upload failed. Could not get file info." : "Yüklənmədə səhv oldu. Faylın informasiyasını almaq mümkün olmadı.",
"Invalid directory." : "Yalnış qovluq.",
"Files" : "Fayllar",
"All files" : "Bütün fayllar",
"Home" : "Ev",
"Close" : "Bağla",
"Favorites" : "Sevimlilər",
"Upload cancelled." : "Yüklənmə dayandırıldı.",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Yükləmək olmur {filename} ona görə ki, ya qovluqdur yada ki, həcmi 0 baytdır ",
"Total file size {size1} exceeds upload limit {size2}" : "Ümumi fayl həcmi {size1} yüklənmə limiti {size2} -ni aşır",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Kifayət qədər boş yer yoxdur, siz yükləyirsiniz {size1} ancaq {size2} var. ",
"Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.",
"Uploading..." : "Serverə yüklənir...",
"File upload is in progress. Leaving the page now will cancel the upload." : "Faylın yüklənməsi gedir. Əgər səhifəni indi tərk etsəniz yüklənmə dayanacaq.",
"Actions" : "İşlər",
"Download" : "Yüklə",
"Rename" : "Adı dəyiş",
"Delete" : "Sil",
"Disconnect storage" : "Daşıyıcını ayır",
"Unshare" : "Paylaşımı durdur",
"Details" : "Detallar",
"Select" : "Seç",
"Pending" : "Gözləmə",
"Unable to determine date" : "Tarixi təyin etmək mümkün olmadı",
"This operation is forbidden" : "Bu əməliyyat qadağandır",
"This directory is unavailable, please check the logs or contact the administrator" : "Bu qovluq tapılmir. Xahiş olunur jurnalları yoxlayın ya da inzibatçı ilə əlaqə saxlayın",
"No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı",
"Name" : "Ad",
"Size" : "Həcm",
"Modified" : "Dəyişdirildi",
"_%n folder_::_%n folders_" : ["%n qovluq","%n qovluqlar"],
"_%n file_::_%n files_" : ["%n fayllar","%n fayllar"],
"{dirs} and {files}" : "{dirs} və {files}",
"You dont have permission to upload or create files here" : "Sizin burda yükləməyə və ya fayl yaratmağa yetkiniz yoxdur ",
"_Uploading %n file_::_Uploading %n files_" : ["%n fayllar yüklənilir","%n fayllar yüklənilir"],
"New" : "Yeni",
"\"{name}\" is an invalid file name." : "\"{name}\" yalnış fayl adıdır.",
"File name cannot be empty." : "Faylın adı boş ola bilməz.",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} məlumat anbarı doludur, fayllar artıq yenilənə və ya sinxronizasiya edilə bilməz!",
"Your storage is full, files can not be updated or synced anymore!" : "Sizin deponuz doludur, fayllar artıq yenilənə və sinxronizasiya edilə bilməz!",
"Storage of {owner} is almost full ({usedSpacePercent}%)" : "{owner} məlumat anbari demək olar ki, doludur ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Sizin depo depo demək olar ki, doludur ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["uyğun '{filter}'","uyğun '{filter}'"],
"Path" : "Ünvan",
"_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"],
"Favorited" : "İstəkləndi",
"Favorite" : "İstəkli",
"Folder" : "Qovluq",
"New folder" : "Yeni qovluq",
"{newname} already exists" : "{newname} artıq mövcuddur",
"Upload" : "Serverə yüklə",
"An error occurred while trying to update the tags" : "Qeydlərin yenilənməsi müddətində səhv baş verdi ",
"A new file or folder has been <strong>created</strong>" : "Yeni fayl və ya direktoriya <strong>yaradılmışdır</strong>",
"A file or folder has been <strong>changed</strong>" : "Fayl və ya direktoriya <strong>dəyişdirilib</strong>",
"Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "<strong>sevimli faylların</strong> yaradılması və silinməsi haqqında olan xəbərdarlıqları limitlə <em>(Yalnız axınlar)</em>",
"A file or folder has been <strong>deleted</strong>" : "Fayl və ya direktoriya <strong>silinib</strong>",
"A file or folder has been <strong>restored</strong>" : "Fayl yada qovluq geriyə <strong>qaytarıldı</strong>",
"You created %1$s" : "Siz yaratdınız %1$s",
"%2$s created %1$s" : "%2$s yaradılmış %1$s",
"%1$s was created in a public folder" : "%1$s ictimai qovluqda yaradıldı",
"You changed %1$s" : "Siz dəyişdiniz %1$s",
"%2$s changed %1$s" : "%2$s dəyişdirildi %1$s",
"You deleted %1$s" : "Siz silindiniz %1$s",
"%2$s deleted %1$s" : "%2$s silindi %1$s",
"You restored %1$s" : "Siz qayıtdınız %1$s",
"%2$s restored %1$s" : "%2$s bərpa edildi %1$s",
"Upload (max. %s)" : "Yüklə (max. %s)",
"File handling" : "Fayl emalı",
"Maximum upload size" : "Maksimal yükləmə həcmi",
"max. possible: " : "maks. ola bilər: ",
"Save" : "Saxlamaq",
"Settings" : "Quraşdırmalar",
"WebDAV" : "WebDAV",
"No files in here" : "Burda fayl yoxdur",
"Upload some content or sync with your devices!" : "Bezi kontenti yüklə yada, öz avadanlıqlarınızla sinxronizasiya edin!",
"No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı",
"Select all" : "Hamısıı seç",
"Upload too large" : "Yüklənmə şox böyükdür",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yükləmək istədiyiniz faylların həcmi, bu serverdə izin verilmiş maksimal yüklənmə həcmindən böyükdür.",
"No favorites" : "Seçilmiş yoxdur",
"Files and folders you mark as favorite will show up here" : "İstəkli qeyd etdiyiniz fayllar və qovluqlar burda göstəriləcək",
"Text file" : "Tekst faylı",
"New text file.txt" : "Yeni mətn file.txt"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}
+6
View File
@@ -0,0 +1,6 @@
OC.L10N.register(
"files",
{
"Settings" : "Налады"
},
"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);");
+4
View File
@@ -0,0 +1,4 @@
{ "translations": {
"Settings" : "Налады"
},"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);"
}
+265
View File
@@ -0,0 +1,265 @@
OC.L10N.register(
"files",
{
"File could not be found" : "Файлът не може да бъде намерен",
"Move or copy" : "Премести или копирай",
"Download" : "Изтегли",
"Delete" : "Изтрий",
"Tags" : "Етикети",
"Show list view" : "Показване с изглед на списък",
"Show grid view" : "Показване в решетъчен изглед",
"Home" : "Домашен",
"Close" : "Затвори",
"Could not create folder \"{dir}\"" : "Папката \"{dir}\" не може да бъде създадена",
"This will stop your current uploads." : "Това ще прекрати всички ваши текущи процеси по качване на файлове.",
"Upload cancelled." : "Качването е прекъснато.",
"Processing files …" : "Обработване на файлове ...",
"…" : "…",
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или с размер 0 байта.",
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място. Опитвате да качите {size1} при свободни само {size2}",
"Target folder \"{dir}\" does not exist any more" : "Дестинацията \"{dir}\" не съществува",
"Not enough free space" : "Няма достатъчно свободно място",
"An unknown error has occurred" : "Възникна неизвестна грешка",
"File could not be uploaded" : " Файлът не може да бъде качен",
"Uploading …" : "Качване …",
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} от {totalSize} ({bitrate})",
"Uploading that item is not supported" : "Качването на такъв файл не се поддържа",
"Target folder does not exist any more" : "Дестинацията не съществува",
"Operation is blocked by access control" : "Операцията се блокира от контрол на достъпа",
"Error when assembling chunks, status code {status}" : "Грешка при асемлиране на парчетата, код {status}",
"Actions" : "Действия",
"Rename" : "Преименувай",
"Move" : "Преместване",
"Copy" : "Копирай",
"Choose target folder" : "Избор на папка",
"Edit locally" : "Локално редактиране",
"Open" : "Отвори",
"_Delete file_::_Delete files_" : ["Изтриване на файлове","Изтриване на файлове"],
"Could not load info for file \"{file}\"" : "Информацията за файла \"{file}\" не може да бъде заредена",
"Files" : "Файлове",
"Details" : "Подробности",
"Please select tag(s) to add to the selection" : "Моля, изберете етикет(и), който да добавите към селекцията",
"Apply tag(s) to selection" : "Прилагане на етикет(и) към селекцията",
"Select directory \"{dirName}\"" : "Избор на директория „{dirName}“",
"Select file \"{fileName}\"" : "Избор на файл \"{fileName}\"",
"Pending" : "Чакащо",
"Unable to determine date" : "Неуспешно установяване на дата",
"This operation is forbidden" : "Операцията е забранена",
"This directory is unavailable, please check the logs or contact the administrator" : "Директорията не е налична. Проверете журнала или се свържете с администратора",
"Storage is temporarily not available" : "Временно хранилището не е налично",
"Could not move \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде преместен, дестинацията съществува",
"Could not move \"{file}\"" : "Файлът \"{file}\" не може да бъде преместен",
"copy" : "Копиране",
"Could not copy \"{file}\", target exists" : "Файлът \"{file}\" не може да бъде копиран, дестинацията съществува",
"Could not copy \"{file}\"" : "Файлът \"{file}\" не може да бъде копиран",
"Copied {origin} inside {destination}" : "Копирано {origin} в {destination}",
"Copied {origin} and {nbfiles} other files inside {destination}" : "Копирано {origin} и {nbfiles} други файлове в {destination}",
"Failed to redirect to client" : "Неуспешно пренасочване към клиент",
"{newName} already exists" : "{newName} вече съществува",
"Could not rename \"{fileName}\", it does not exist any more" : "Файлът \"{fileName}\" не може да бъде преименуван защото не съществува",
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Името \"{targetName}\" се ползва в директорията \"{dir}\". Моля, изберете друго име.",
"Could not rename \"{fileName}\"" : "\"{fileName}\" не може да бъде преименуван",
"Could not create file \"{file}\"" : "Файлът \"{file}\" не може да бъде създаден",
"Could not create file \"{file}\" because it already exists" : "Файлът \"{file}\" не може да бъде създаден защото вече съществува",
"Could not create folder \"{dir}\" because it already exists" : "Папката \"{dir}\" не може да бъде създадена защото вече съществува",
"Could not fetch file details \"{file}\"" : "Подробностите за файла „{file}“ не можаха да бъдат извлечени",
"Error deleting file \"{fileName}\"." : "Грешка при изтриването на файла \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Няма резултати от търсенето в други папки за {tag}{filter}{endtag}",
"Enter more than two characters to search in other folders" : "Въведете повече от два знака за търсене в други папки",
"Name" : "Име",
"Size" : "Размер",
"Modified" : "Промяна",
"_%n folder_::_%n folders_" : ["%n папка","%n папки"],
"_%n file_::_%n files_" : ["%n файл","%n файла"],
"{dirs} and {files}" : "{dirs} и {files}",
"_including %n hidden_::_including %n hidden_" : ["включително %n скрит","включително %n скрити"],
"You do not have permission to upload or create files here" : "Нямате право да качвате или създавате файлове тук",
"_Uploading %n file_::_Uploading %n files_" : ["Качване на %n файл","Качване на %n файла"],
"New" : "Нов",
"New file/folder menu" : "Ново меню за файл/папка",
"Select file range" : "Избери от файловете",
"{used}%" : "{used}%",
"{used} of {quota} used" : "{used} от {quota} използвани",
"{used} used" : "{used} използвани",
"\"{name}\" is an invalid file name." : "\"{name}\" е непозволено име за файл.",
"File name cannot be empty." : "Името на файла не може да бъде оставено празно.",
"\"/\" is not allowed inside a file name." : "\"/\" е непозволен знак в името на файла.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" не е разрешен тип файл",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Хранилището на {owner} е запълнено и файловете вече не могат да се актуализират или синхронизират!",
"Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Груповата папка \"{mountPoint}“ е пълна, файловете вече не могат да се актуализират или синхронизират!",
"External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Външното хранилище е \"{mountPoint}“ е пълно, файловете вече не могат да се актуализират или синхронизират!",
"Your storage is full, files cannot be updated or synced anymore!" : "Вашето хранилище запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "Хранилището на {owner} е почти запълнено ({usedSpacePercent}%)",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Груповата папка \"{mountPoint}“ е почти пълна ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Външното хранилище е \"{mountPoint}“ е почти пълно ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Вашето хранилище е почти запълнено ({usedSpacePercent}%).",
"_matches \"{filter}\"_::_match \"{filter}\"_" : ["съвпада с \"{filter}\"","съвпада с \"{filter}\""],
"View in folder" : "Преглед в папката",
"Path" : "Път",
"_%n byte_::_%n bytes_" : ["%n байт","%n байта"],
"Favorited" : "Отбелязано в любими",
"Favorite" : "Любими",
"New folder" : "Нова папка",
"Create new folder" : "Създай нова папка",
"Upload file" : "Качи файл",
"Recent" : "Последни",
"Not favorited" : "Премахни от любими",
"Remove from favorites" : "Премахни от любимите",
"Add to favorites" : "Добави към любимите",
"An error occurred while trying to update the tags" : "Възникна грешка при опита за промяна на етикети",
"Added to favorites" : "Добавено към любимите",
"Removed from favorites" : "Премахни от любимите",
"You added {file} to your favorites" : "Добавихте {file} към любимите",
"You removed {file} from your favorites" : "Премахнахте {file} от любимите",
"Favorites" : "Любими",
"File changes" : "Файлови промени",
"Created by {user}" : "Създаден от {user}",
"Changed by {user}" : "Променен от {user}",
"Deleted by {user}" : "Изтрит от {user}",
"Restored by {user}" : "Възстановен от {user}",
"Renamed by {user}" : "Преименуван от {user}",
"Moved by {user}" : "Преместен от {user}",
"You created {file}" : "Създадохте {file}",
"You created an encrypted file in {file}" : "Създадохте криптиран файл в {file}",
"{user} created {file}" : "{user} създаде {file}",
"{user} created an encrypted file in {file}" : "{user} създаде криптиран файл в {file}",
"{file} was created in a public folder" : "{file} беше създаден в публична папка",
"You changed {file}" : "Променихте {file}",
"You changed an encrypted file in {file}" : "Променихте криптиран файл в {file}",
"{user} changed {file}" : "{user} промени {file}",
"{user} changed an encrypted file in {file}" : "{user} промени криптиран файл в {file}",
"You deleted {file}" : "Изтрихте {file}",
"You deleted an encrypted file in {file}" : "Изтрихте криптиран файл в {file}",
"{user} deleted {file}" : "{user} изтри {file}",
"{user} deleted an encrypted file in {file}" : "{user} изтри криптиран файл в {file}",
"You restored {file}" : "Възстановихте {file}",
"{user} restored {file}" : "{user} възстанови {file}",
"You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Преименувахте {oldfile} (скрит) на {newfile} (скрит)",
"You renamed {oldfile} (hidden) to {newfile}" : "Преименувахте {oldfile} (скрит) на {newfile}",
"You renamed {oldfile} to {newfile} (hidden)" : "Преименувахте {oldfile} на {newfile} (скрит)",
"You renamed {oldfile} to {newfile}" : "Преименувахте {oldfile} на {newfile}",
"{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} преименува {oldfile} (скрит) на {newfile} (скрит)",
"{user} renamed {oldfile} (hidden) to {newfile}" : "{user} преименува {oldfile} (скрит) на {newfile}",
"{user} renamed {oldfile} to {newfile} (hidden)" : "{user} преименува {oldfile} на {newfile} (скрит)",
"{user} renamed {oldfile} to {newfile}" : "{user} преименува {oldfile} на {newfile}",
"You moved {oldfile} to {newfile}" : "Преместихте {oldfile} в {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} премести {oldfile} в {newfile}",
"A file has been added to or removed from your <strong>favorites</strong>" : "Добавяне или премахване на файл от <strong>любимите</strong> ви",
"A file or folder has been <strong>changed</strong>" : "<strong>Промяна</strong> на файл / папка",
"A favorite file or folder has been <strong>changed</strong>" : "Предпочетен файл или папка е <strong>променен</strong>",
"Upload (max. %s)" : "Качи (макс. %s)",
"Accept" : "Приемане",
"Reject" : "Откажи",
"Incoming ownership transfer from {user}" : "Входящо прехвърляне на собственост от {user}",
"Do you want to accept {path}?\n\nNote: The transfer process after accepting may take up to 1 hour." : " Ще приеметели {path}?\n\nЗабележка: Процесът на прехвърляне след приемане може да отнеме до 1 час.",
"Ownership transfer failed" : "Промяната на собственик е неуспешна",
"Your ownership transfer of {path} to {user} failed." : "Вашето прехвърляне на собственост на {path} към {user} беше неуспешно.",
"The ownership transfer of {path} from {user} failed." : "Прехвърлянето на собственост на {path} към {user} беше неуспешно.",
"Ownership transfer done" : "Промяната на собственик е успешна",
"Your ownership transfer of {path} to {user} has completed." : "Вашето прехвърляне на собственост на {path} към {user} е завършено.",
"The ownership transfer of {path} from {user} has completed." : "Прехвърлянето на собственост на {path} към {user} е завършено.",
"in %s" : "в %s",
"File Management" : "Управление на файлове",
"Reload current directory" : "Презареждане на текущата директория",
"Go to the \"{dir}\" directory" : "Отидете в директорията \"{dir}\"",
"You dont have permission to upload or create files here" : "Нямаш разрешение да създаваш или качваш файлове тук.",
"\"{displayName}\" action executed successfully" : "Действието „{displayName}“ е изпълнено успешно",
"\"{displayName}\" action failed" : "Действието „{displayName}“ е неуспешно",
"File name" : "Име на файл",
"Folder name" : "Име на папка",
"Download file {name}" : "Изтегляне на файл {name}",
"Name cannot be empty" : "Името не може да бъде празно",
"Total rows summary" : "Обобщение на общия брой редове",
"\"{displayName}\" failed on some elements " : "„{displayName}“ не успя да се изпълни за някои елементи ",
"\"{displayName}\" batch action executed successfully" : " Пакетното действие „{displayName}“ е изпълнено успешно",
"File not found" : "Файлът не е намерен",
"Storage informations" : "Хранилище на информация",
"{usedQuotaByte} used" : "{usedQuotaByte} използвано",
"{relative}% used" : "{relative}% използвано",
"Could not refresh storage stats" : "Статистиката за хранилище не можа да се обнови",
"Your storage is full, files can not be updated or synced anymore!" : "Хранилището е запълнено. Поради това качването и синхронизирането на файлове е невъзможно!",
"Create" : "Създаване",
"Transfer ownership of a file or folder" : "Прехвърляне на собственост на файл или папка",
"Choose file or folder to transfer" : "Избор на файл или папка за прехвърляне",
"Change" : "Промени",
"New owner" : "Нов собственик",
"Choose a file or folder to transfer" : "Избор на файл или папка за прехвърляне",
"Transfer" : "Прехвърли",
"Transfer {path} to {userid}" : "Прехвърляне на {path} към {userid}",
"Invalid path selected" : "Предоставен е невалиден път до файл.",
"Unknown error" : "Неизвестна грешка",
"Ownership transfer request sent" : "Изпратена заявка за прехвърляне на собствеността",
"Cannot transfer ownership of a file or folder you do not own" : "Не можете да прехвърляте собственост върху файл или папка, които не притежавате",
"Select file or folder to link to" : "Избор на файл или папка, към които да поставите връзка",
"Loading current folder" : "Зареждане на текущата папка",
"No files in here" : "Няма файлове",
"Upload some content or sync with your devices!" : "Качете съдържание или синхронизирайте с вашите устройства!",
"Go to the previous folder" : "Връщане към предишната папка",
"Go back" : "Назад",
"Share" : "Споделяне",
"Shared by link" : "Споделени с връзка",
"Shared" : "Споделен",
"Switch to list view" : "Превключване към изглед на списък",
"Open the files app settings" : "Отваряне на настройките на приложението за файлове",
"Files settings" : "Настройки на файловете",
"File cannot be accessed" : "Файлът не е достъпен",
"Show hidden files" : "Показвай и скрити файлове",
"Crop image previews" : "Изрязване на визуализациите на изображение",
"Additional settings" : "Допълнителни настройки",
"WebDAV" : "WebDAV",
"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." : "Ако сте активирали 2FA, трябва да създадете и използвате нова парола за приложението, като кликнете тук.",
"Clipboard is not available" : "Клипбордът не е достъпен",
"WebDAV URL copied to clipboard" : "WebDAV URL адрес е копиран в клипборда",
"Unable to change the favourite state of the file" : "Не може да се промени състоянието за предпочитане на файла",
"Error while loading the file data" : "Грешка при зареждането на файловете.",
"Pick a template for {name}" : "Избор на шаблон за {name}",
"Create a new file with the selected template" : "Създаване на нов файл с избрания шаблон",
"Creating file" : "Създаване на файл ",
"Blank" : "Празен",
"Unable to create new file from template" : "Не може да се създаде нов файл от шаблон",
"Delete permanently" : "Изтрий завинаги",
"Cancel" : "Отказ",
"Open details" : "Отваряне на подробности",
"Filename" : "Име на файла",
"Unable to initialize the templates directory" : "Неуспешно инициализиране на директорията с шаблони",
"Create new templates folder" : "Създаване на нова папка за шаблони",
"Templates" : "Шаблони",
"No favorites yet" : "Няма любими",
"Files and folders you mark as favorite will show up here" : "Файловете и папките които маркирате като любими ще се показват тук",
"All files" : "Всички файлове",
"No entries found in this folder" : "Няма намерени записи в тази папка",
"Select all" : "Избери всички",
"Upload too large" : "Прекалено голям файл за качване",
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитвате да качите са по-големи от позволеното на сървъра.",
"Text file" : "Текстов файл",
"New text file.txt" : "Текстов файл.txt",
"Direct link was copied (only works for users who have access to this file/folder)" : "Беше копирана директна връзка (ще работи само за потребители с достъп до този файл/папка)",
"Copy direct link (only works for users who have access to this file/folder)" : "Копирай директната връзка (ще работи само за потребители с достъп до файла/папката)",
"You can only favorite a single file or folder at a time" : "Можете да предпочетете само един файл или папка наведнъж",
"\"remote user\"" : "\"отдалечен потребител\"",
"Search users" : "Търсене за потребители",
"You might not have have permissions to view it, ask the sender to share it" : "Може да нямате права да го видите, помолете подателя да го сподели",
"Set up templates folder" : "Настройка на папка за шаблони",
"Toggle %1$s sublist" : "Превключване на %1$s подсписък ",
"Toggle grid view" : "Превключи решетъчния изглед",
"Deleted files" : "Изтрити файлове",
"Shares" : "Споделени",
"Shared with others" : "Споделени с други",
"Shared with you" : "Споделени с вас",
"Deleted shares" : "Изтрити",
"Pending shares" : "Чакащи споделяния",
"Select the row for {displayName}" : "Избиране на реда за {displayName}",
"Open folder {name}" : "Отваряне на папка {name}",
"Unselect all" : "Отмяна на избора на всички",
"ascending" : "възходящо",
"descending" : "низходящо",
"Sort list by {column} ({direction})" : "Сортиране на списъка по {column} ({direction})",
"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" : "Все още няма изтрити файлове или папки",
"Add" : "Добавяне"
},
"nplurals=2; plural=(n != 1);");

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