diff --git a/.gitignore b/.gitignore index 531e372e60..3fb848dbb4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ !/apps/dav !/apps/files !/apps/files_encryption +!/apps/federation !/apps/encryption !/apps/encryption_dummy !/apps/files_external diff --git a/.htaccess b/.htaccess index 918fcbd18e..4f2a6f35af 100644 --- a/.htaccess +++ b/.htaccess @@ -38,11 +38,28 @@ RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteRule ^\.well-known/host-meta /public.php?service=host-meta [QSA,L] RewriteRule ^\.well-known/host-meta\.json /public.php?service=host-meta-json [QSA,L] - RewriteRule ^\.well-known/carddav /remote.php/carddav/ [R=301,L] - RewriteRule ^\.well-known/caldav /remote.php/caldav/ [R=301,L] + RewriteRule ^\.well-known/carddav /remote.php/dav/ [R=301,L] + RewriteRule ^\.well-known/caldav /remote.php/dav/ [R=301,L] RewriteRule ^remote/(.*) remote.php [QSA,L] RewriteRule ^(build|tests|config|lib|3rdparty|templates)/.* - [R=404,L] RewriteRule ^(\.|autotest|occ|issue|indie|db_|console).* - [R=404,L] + + # Rewrite rules for `front_controller_active` + Options -MultiViews + + DirectorySlash off + + RewriteRule ^core/js/oc.js$ index.php/core/js/oc.js [PT,E=PATH_INFO:$1] + RewriteRule ^core/preview.png$ index.php/core/preview.png [PT,E=PATH_INFO:$1] + RewriteCond %{REQUEST_FILENAME} !\.(css|js|svg|gif|png|html|ttf|woff)$ + RewriteCond %{REQUEST_FILENAME} !/remote.php + RewriteCond %{REQUEST_FILENAME} !/public.php + RewriteCond %{REQUEST_FILENAME} !/cron.php + RewriteCond %{REQUEST_FILENAME} !/core/ajax/update.php + RewriteCond %{REQUEST_FILENAME} !/status.php + RewriteCond %{REQUEST_FILENAME} !/ocs/v1.php + RewriteCond %{REQUEST_FILENAME} !/ocs/v2.php + RewriteRule .* index.php [PT,E=PATH_INFO:$1] AddType image/svg+xml svg svgz diff --git a/.travis.yml b/.travis.yml index 49a9e07e3f..c599a0c192 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,7 +37,9 @@ matrix: - php: 5.4 env: DB=pgsql;TC=litmus-v1 - php: 5.4 - env: DB=pgsql;TC=carddavtester + env: DB=sqlite;TC=carddavtester +# - php: 5.4 +# env: DB=pgsql;TC=carddavtester # - php: 5.4 # env: DB=mysql;TC=caldavtester diff --git a/3rdparty b/3rdparty index be700d4918..a7b34d6f83 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit be700d4918627e06eb3e8c5f3b025911061badff +Subproject commit a7b34d6f831c8fa363f389d27acd0150128fc0b9 diff --git a/README.md b/README.md index 4dfa36237b..7c69a90229 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,39 @@ -# ownCloud - -[ownCloud](http://ownCloud.org) gives you freedom and control over your own data. -A personal cloud which runs on your own server. - -### Build Status on [Jenkins CI](https://ci.owncloud.org/) -Git master: [![Build Status](https://ci.owncloud.org/job/server-master-linux/badge/icon)](https://ci.owncloud.org/job/server-master-linux/) - -Quality: - - Scrutinizer: [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/owncloud/core/badges/quality-score.png?s=ce2f5ded03d4ac628e9ee5c767243fa7412e644f)](https://scrutinizer-ci.com/g/owncloud/core/) - - CodeClimate: [![Code Climate](https://codeclimate.com/github/owncloud/core/badges/gpa.svg)](https://codeclimate.com/github/owncloud/core) - - Coverity: [![Coverity](https://scan.coverity.com/projects/6893/badge.svg)](https://scan.coverity.com/projects/owncloud-core) - -Dependencies: +# ownCloud Core +[![Build Status](https://ci.owncloud.org/job/server-master-linux/badge/icon)](https://ci.owncloud.org/job/server-master-linux/) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/owncloud/core/badges/quality-score.png?s=ce2f5ded03d4ac628e9ee5c767243fa7412e644f)](https://scrutinizer-ci.com/g/owncloud/core/) +[![CodeClimate](https://codeclimate.com/github/owncloud/core/badges/gpa.svg)](https://codeclimate.com/github/owncloud/core) +[![Coverity](https://scan.coverity.com/projects/6893/badge.svg)](https://scan.coverity.com/projects/owncloud-core) [![Dependency Status](https://www.versioneye.com/user/projects/54f4a2384f3108959a000a16/badge.svg?style=flat)](https://www.versioneye.com/user/projects/54f4a2384f3108959a000a16) - [![Dependency Status](https://www.versioneye.com/user/projects/54d1f76f3ca0840b190000c0/badge.svg?style=flat)](https://www.versioneye.com/user/projects/54d1f76f3ca0840b190000c0) -### Installation instructions +**[ownCloud](http://ownCloud.org) gives you freedom and control over your own data. +A personal cloud which runs on your own server.** + +![](https://github.com/owncloud/screenshots/blob/master/files/sidebar_1.png) + +## Why is this so awesome? +* :file_folder: **Acess your Data** You can store your files, contacts, calendars and more on a server of your choosing. +* :package: **Sync your Data** You keep your files, contacts, calendars and more synchronized amongst your devices. +* :arrows_counterclockwise: **Share your Data** You share your data with others, and give them access to your latest photo galleries, your calendar or anything else you want them to see. +* :rocket: **Expandable with dozens of Apps** ...like Calendar, Contacts, Mail or News. +* :cloud: **All Benefits of the Cloud** ...on your own Server. +* :lock: **Encryption** You can encrypt data in transit with secure https connections. You can enable the encryption app to encrypt data on storage for improved security and privacy. +* ... + +## Installation instructions https://doc.owncloud.org/server/9.0/developer_manual/app/index.html -### Contribution Guidelines +## Contribution Guidelines https://owncloud.org/contribute/ -### Get in touch -* [Forum](https://forum.owncloud.org) -* [Mailing list](https://mailman.owncloud.org/mailman/listinfo) -* [IRC channel](https://webchat.freenode.net/?channels=owncloud) -* [Twitter](https://twitter.com/ownClouders) +## Get in touch +* :clipboard: [Forum](https://forum.owncloud.org) +* :envelope: [Mailing list](https://mailman.owncloud.org/mailman/listinfo) +* :busts_in_silhouette: [IRC channel](https://webchat.freenode.net/?channels=owncloud) +* :hatching_chick: [Twitter](https://twitter.com/ownClouders) -### Important notice on translations +## Important notice on translations Please submit translations via Transifex: https://www.transifex.com/projects/p/owncloud/ diff --git a/apps/dav/appinfo/database.xml b/apps/dav/appinfo/database.xml index f3fd507994..48641c2be6 100644 --- a/apps/dav/appinfo/database.xml +++ b/apps/dav/appinfo/database.xml @@ -183,4 +183,442 @@ CREATE TABLE addressbookchanges ( + + + + *dbprefix*calendarobjects + + + id + integer + 0 + true + 1 + true + 11 + + + calendardata + blob + + + uri + text + + + calendarid + integer + true + true + + + lastmodified + integer + true + + + etag + text + 32 + + + size + integer + true + true + 11 + + + componenttype + text + + + firstoccurence + integer + true + + + lastoccurence + integer + true + + + uid + text + + + calobjects_index + true + + calendarid + + + uri + + + +
+ + + *dbprefix*calendars + + + id + integer + 0 + true + 1 + true + 11 + + + principaluri + text + + + displayname + text + + + uri + text + + + synctoken + integer + 1 + true + true + + + description + text + + + calendarorder + integer + 0 + true + true + + + calendarcolor + text + + + timezone + text + + + components + text + + + transparent + integer + 1 + true + 0 + + + calendars_index + true + + principaluri + + + uri + + + +
+ + + *dbprefix*calendarchanges + + + id + integer + 0 + true + 1 + true + 11 + + + uri + text + + + synctoken + integer + 1 + true + true + + + calendarid + integer + true + + + operation + integer + true + 1 + + + + calendarid_synctoken + + calendarid + + + synctoken + + + + +
+ + + + *dbprefix*calendarsubscriptions + + + id + integer + 0 + true + 1 + true + 11 + + + uri + text + + + principaluri + text + + + source + text + + + displayname + text + 100 + + + refreshrate + text + 10 + + + calendarorder + integer + 0 + true + true + + + calendarcolor + text + + + striptodos + integer + 1 + + + stripalarms + integer + 1 + + + stripattachments + integer + 1 + + + lastmodified + integer + true + + + calsub_index + true + + principaluri + + + uri + + + +
+ + + + *dbprefix*schedulingobjects + + + id + integer + 0 + true + 1 + true + 11 + + + principaluri + text + + + calendardata + blob + + + uri + text + + + lastmodified + integer + true + + + etag + text + 32 + + + size + integer + true + true + 11 + + + +
+ + + *dbprefix*dav_shares + + + id + integer + 0 + true + 1 + true + 11 + + + uri + text + + + principaluri + text + + + type + text + + + access + integer + 1 + + + resourceid + integer + true + true + + + dav_shares_index + true + + principaluri + + + uri + + + type + + + +
diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 1102511569..5f681e784f 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -5,7 +5,7 @@ ownCloud WebDAV endpoint AGPL owncloud.org - 0.1.2 + 0.1.3 9.0 true diff --git a/apps/dav/appinfo/register_command.php b/apps/dav/appinfo/register_command.php index c996dd4406..af41036cdd 100644 --- a/apps/dav/appinfo/register_command.php +++ b/apps/dav/appinfo/register_command.php @@ -1,8 +1,15 @@ getConfig(); $dbConnection = \OC::$server->getDatabaseConnection(); $userManager = OC::$server->getUserManager(); +$config = \OC::$server->getConfig(); + /** @var Symfony\Component\Console\Application $application */ -$application->add(new CreateAddressBook($userManager, $dbConnection)); +$application->add(new CreateAddressBook($userManager, $dbConnection, $config)); +$application->add(new CreateCalendar($userManager, $dbConnection)); +$application->add(new SyncSystemAddressBook($userManager, $dbConnection, $config)); diff --git a/apps/dav/appinfo/v1/publicwebdav.php b/apps/dav/appinfo/v1/publicwebdav.php index 5bdfd94e65..cf0488038d 100644 --- a/apps/dav/appinfo/v1/publicwebdav.php +++ b/apps/dav/appinfo/v1/publicwebdav.php @@ -39,7 +39,8 @@ $serverFactory = new OCA\DAV\Connector\Sabre\ServerFactory( \OC::$server->getUserSession(), \OC::$server->getMountManager(), \OC::$server->getTagManager(), - \OC::$server->getEventDispatcher() + \OC::$server->getEventDispatcher(), + \OC::$server->getRequest() ); $requestUri = \OC::$server->getRequest()->getRequestUri(); diff --git a/apps/dav/appinfo/v1/webdav.php b/apps/dav/appinfo/v1/webdav.php index f28736f1f0..8324f962b8 100644 --- a/apps/dav/appinfo/v1/webdav.php +++ b/apps/dav/appinfo/v1/webdav.php @@ -40,7 +40,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory( \OC::$server->getUserSession(), \OC::$server->getMountManager(), \OC::$server->getTagManager(), - \OC::$server->getEventDispatcher() + \OC::$server->getEventDispatcher(), + \OC::$server->getRequest() ); // Backends diff --git a/apps/dav/command/createaddressbook.php b/apps/dav/command/createaddressbook.php index 286871b39e..ea89e7aa0a 100644 --- a/apps/dav/command/createaddressbook.php +++ b/apps/dav/command/createaddressbook.php @@ -3,6 +3,8 @@ namespace OCA\DAV\Command; use OCA\DAV\CardDAV\CardDavBackend; +use OCA\DAV\Connector\Sabre\Principal; +use OCP\IConfig; use OCP\IDBConnection; use OCP\IUserManager; use Symfony\Component\Console\Command\Command; @@ -18,26 +20,30 @@ class CreateAddressBook extends Command { /** @var \OCP\IDBConnection */ protected $dbConnection; + /** @var IConfig */ + private $config; + /** * @param IUserManager $userManager * @param IDBConnection $dbConnection */ - function __construct(IUserManager $userManager, IDBConnection $dbConnection) { + function __construct(IUserManager $userManager, IDBConnection $dbConnection, IConfig $config) { parent::__construct(); $this->userManager = $userManager; $this->dbConnection = $dbConnection; + $this->config = $config; } protected function configure() { $this - ->setName('dav:create-addressbook') - ->setDescription('Create a dav addressbook') - ->addArgument('user', - InputArgument::REQUIRED, - 'User for whom the addressbook will be created') - ->addArgument('name', - InputArgument::REQUIRED, - 'Name of the addressbook'); + ->setName('dav:create-addressbook') + ->setDescription('Create a dav addressbook') + ->addArgument('user', + InputArgument::REQUIRED, + 'User for whom the addressbook will be created') + ->addArgument('name', + InputArgument::REQUIRED, + 'Name of the addressbook'); } protected function execute(InputInterface $input, OutputInterface $output) { @@ -45,8 +51,13 @@ class CreateAddressBook extends Command { if (!$this->userManager->userExists($user)) { throw new \InvalidArgumentException("User <$user> in unknown."); } + $principalBackend = new Principal( + $this->config, + $this->userManager + ); + $name = $input->getArgument('name'); - $carddav = new CardDavBackend($this->dbConnection); - $carddav->createAddressBook("principals/$user", $name, []); + $carddav = new CardDavBackend($this->dbConnection, $principalBackend); + $carddav->createAddressBook("principals/users/$user", $name, []); } } diff --git a/apps/dav/command/createcalendar.php b/apps/dav/command/createcalendar.php new file mode 100644 index 0000000000..5e7b17dae6 --- /dev/null +++ b/apps/dav/command/createcalendar.php @@ -0,0 +1,52 @@ +userManager = $userManager; + $this->dbConnection = $dbConnection; + } + + protected function configure() { + $this + ->setName('dav:create-calendar') + ->setDescription('Create a dav calendar') + ->addArgument('user', + InputArgument::REQUIRED, + 'User for whom the calendar will be created') + ->addArgument('name', + InputArgument::REQUIRED, + 'Name of the calendar'); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $user = $input->getArgument('user'); + if (!$this->userManager->userExists($user)) { + throw new \InvalidArgumentException("User <$user> in unknown."); + } + $name = $input->getArgument('name'); + $caldav = new CalDavBackend($this->dbConnection); + $caldav->createCalendar("principals/users/$user", $name, []); + } +} diff --git a/apps/dav/command/syncsystemaddressbook.php b/apps/dav/command/syncsystemaddressbook.php new file mode 100644 index 0000000000..bb2896abc6 --- /dev/null +++ b/apps/dav/command/syncsystemaddressbook.php @@ -0,0 +1,107 @@ +userManager = $userManager; + $this->dbConnection = $dbConnection; + $this->config = $config; + } + + protected function configure() { + $this + ->setName('dav:sync-system-addressbook') + ->setDescription('Synchronizes users to the system addressbook'); + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + */ + protected function execute(InputInterface $input, OutputInterface $output) { + $principalBackend = new Principal( + $this->config, + $this->userManager + ); + + $this->backend = new CardDavBackend($this->dbConnection, $principalBackend); + + // ensure system addressbook exists + $systemAddressBook = $this->ensureSystemAddressBookExists(); + $converter = new Converter(); + + $output->writeln('Syncing users ...'); + $progress = new ProgressBar($output); + $progress->start(); + $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) { + /** @var IUser $user */ + $name = $user->getBackendClassName(); + $userId = $user->getUID(); + + $cardId = "$name:$userId.vcf"; + $card = $this->backend->getCard($systemAddressBook['id'], $cardId); + if ($card === false) { + $vCard = $converter->createCardFromUser($user); + $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize()); + } else { + $vCard = Reader::read($card['carddata']); + if ($converter->updateCard($vCard, $user)) { + $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize()); + } + } + $progress->advance(); + }); + $progress->finish(); + $output->writeln(''); + } + + protected function ensureSystemAddressBookExists() { + $book = $this->backend->getAddressBooksByUri('system'); + if (!is_null($book)) { + return $book; + } + $systemPrincipal = "principals/system/system"; + $this->backend->createAddressBook($systemPrincipal, 'system', [ + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => 'System addressbook which holds all users of this instance' + ]); + + return $this->backend->getAddressBooksByUri('system'); + } +} diff --git a/apps/dav/lib/caldav/caldavbackend.php b/apps/dav/lib/caldav/caldavbackend.php new file mode 100644 index 0000000000..d912f209d4 --- /dev/null +++ b/apps/dav/lib/caldav/caldavbackend.php @@ -0,0 +1,1174 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\CalDAV; + +use Sabre\CalDAV\Backend\AbstractBackend; +use Sabre\CalDAV\Backend\SchedulingSupport; +use Sabre\CalDAV\Backend\SubscriptionSupport; +use Sabre\CalDAV\Backend\SyncSupport; +use Sabre\CalDAV\Plugin; +use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp; +use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; +use Sabre\DAV; +use Sabre\DAV\Exception\Forbidden; +use Sabre\VObject\DateTimeParser; +use Sabre\VObject\Reader; +use Sabre\VObject\RecurrenceIterator; + +/** + * Class CalDavBackend + * + * Code is heavily inspired by https://github.com/fruux/sabre-dav/blob/master/lib/CalDAV/Backend/PDO.php + * + * @package OCA\DAV\CalDAV + */ +class CalDavBackend extends AbstractBackend implements SyncSupport, SubscriptionSupport, SchedulingSupport { + + /** + * We need to specify a max date, because we need to stop *somewhere* + * + * On 32 bit system the maximum for a signed integer is 2147483647, so + * MAX_DATE cannot be higher than date('Y-m-d', 2147483647) which results + * in 2038-01-19 to avoid problems when the date is converted + * to a unix timestamp. + */ + const MAX_DATE = '2038-01-01'; + + /** + * List of CalDAV properties, and how they map to database fieldnames + * Add your own properties by simply adding on to this array. + * + * Note that only string-based properties are supported here. + * + * @var array + */ + public $propertyMap = [ + '{DAV:}displayname' => 'displayname', + '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description', + '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone', + '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', + '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', + ]; + + /** + * List of subscription properties, and how they map to database fieldnames. + * + * @var array + */ + public $subscriptionPropertyMap = [ + '{DAV:}displayname' => 'displayname', + '{http://apple.com/ns/ical/}refreshrate' => 'refreshrate', + '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder', + '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor', + '{http://calendarserver.org/ns/}subscribed-strip-todos' => 'striptodos', + '{http://calendarserver.org/ns/}subscribed-strip-alarms' => 'stripalarms', + '{http://calendarserver.org/ns/}subscribed-strip-attachments' => 'stripattachments', + ]; + + public function __construct(\OCP\IDBConnection $db) { + $this->db = $db; + } + + /** + * Returns a list of calendars for a principal. + * + * Every project is an array with the following keys: + * * id, a unique id that will be used by other functions to modify the + * calendar. This can be the same as the uri or a database key. + * * uri, which the basename of the uri with which the calendar is + * accessed. + * * principaluri. The owner of the calendar. Almost always the same as + * principalUri passed to this method. + * + * Furthermore it can contain webdav properties in clark notation. A very + * common one is '{DAV:}displayname'. + * + * Many clients also require: + * {urn:ietf:params:xml:ns:caldav}supported-calendar-component-set + * For this property, you can just return an instance of + * Sabre\CalDAV\Property\SupportedCalendarComponentSet. + * + * If you return {http://sabredav.org/ns}read-only and set the value to 1, + * ACL will automatically be put in read-only mode. + * + * @param string $principalUri + * @return array + */ + function getCalendarsForUser($principalUri) { + $fields = array_values($this->propertyMap); + $fields[] = 'id'; + $fields[] = 'uri'; + $fields[] = 'synctoken'; + $fields[] = 'components'; + $fields[] = 'principaluri'; + $fields[] = 'transparent'; + + // Making fields a comma-delimited list + $query = $this->db->getQueryBuilder(); + $query->select($fields)->from('calendars') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri))) + ->orderBy('calendarorder', 'ASC'); + $stmt = $query->execute(); + + $calendars = []; + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + $components = []; + if ($row['components']) { + $components = explode(',',$row['components']); + } + + $calendar = [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{' . Plugin::NS_CALENDARSERVER . '}getctag' => 'http://sabre.io/ns/sync/' . ($row['synctoken']?$row['synctoken']:'0'), + '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet($components), + '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' => new ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'), + ]; + + foreach($this->propertyMap as $xmlName=>$dbName) { + $calendar[$xmlName] = $row[$dbName]; + } + + $calendars[] = $calendar; + } + + return $calendars; + } + + /** + * Creates a new calendar for a principal. + * + * If the creation was a success, an id must be returned that can be used to reference + * this calendar in other methods, such as updateCalendar. + * + * @param string $principalUri + * @param string $calendarUri + * @param array $properties + * @return void + */ + function createCalendar($principalUri, $calendarUri, array $properties) { + $values = [ + 'principaluri' => $principalUri, + 'uri' => $calendarUri, + 'synctoken' => 1, + 'transparent' => 0, + 'components' => 'VEVENT,VTODO', + 'displayname' => $calendarUri + ]; + + // Default value + $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'; + if (isset($properties[$sccs])) { + if (!($properties[$sccs] instanceof SupportedCalendarComponentSet)) { + throw new DAV\Exception('The ' . $sccs . ' property must be of type: \Sabre\CalDAV\Property\SupportedCalendarComponentSet'); + } + $values['components'] = implode(',',$properties[$sccs]->getValue()); + } + $transp = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp'; + if (isset($properties[$transp])) { + $values['transparent'] = $properties[$transp]->getValue()==='transparent'; + } + + foreach($this->propertyMap as $xmlName=>$dbName) { + if (isset($properties[$xmlName])) { + $values[$dbName] = $properties[$xmlName]; + } + } + + $query = $this->db->getQueryBuilder(); + $query->insert('calendars'); + foreach($values as $column => $value) { + $query->setValue($column, $query->createNamedParameter($value)); + } + $query->execute(); + } + + /** + * Updates properties for a calendar. + * + * The list of mutations is stored in a Sabre\DAV\PropPatch object. + * To do the actual updates, you must tell this object which properties + * you're going to process with the handle() method. + * + * Calling the handle method is like telling the PropPatch object "I + * promise I can handle updating this property". + * + * Read the PropPatch documentation for more info and examples. + * + * @param \Sabre\DAV\PropPatch $propPatch + * @return void + */ + function updateCalendar($calendarId, \Sabre\DAV\PropPatch $propPatch) { + $supportedProperties = array_keys($this->propertyMap); + $supportedProperties[] = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp'; + + $propPatch->handle($supportedProperties, function($mutations) use ($calendarId) { + $newValues = []; + foreach ($mutations as $propertyName => $propertyValue) { + + switch ($propertyName) { + case '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' : + $fieldName = 'transparent'; + $newValues[$fieldName] = $propertyValue->getValue() === 'transparent'; + break; + default : + $fieldName = $this->propertyMap[$propertyName]; + $newValues[$fieldName] = $propertyValue; + break; + } + + } + $query = $this->db->getQueryBuilder(); + $query->update('calendars'); + foreach ($newValues as $fieldName => $value) { + $query->set($fieldName, $query->createNamedParameter($value)); + } + $query->where($query->expr()->eq('id', $query->createNamedParameter($calendarId))); + $query->execute(); + + $this->addChange($calendarId, "", 2); + + return true; + }); + } + + /** + * Delete a calendar and all it's objects + * + * @param mixed $calendarId + * @return void + */ + function deleteCalendar($calendarId) { + $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?'); + $stmt->execute([$calendarId]); + + $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendars` WHERE `id` = ?'); + $stmt->execute([$calendarId]); + + $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarchanges` WHERE `calendarid` = ?'); + $stmt->execute([$calendarId]); + } + + /** + * Returns all calendar objects within a calendar. + * + * Every item contains an array with the following keys: + * * calendardata - The iCalendar-compatible calendar data + * * uri - a unique key which will be used to construct the uri. This can + * be any arbitrary string, but making sure it ends with '.ics' is a + * good idea. This is only the basename, or filename, not the full + * path. + * * lastmodified - a timestamp of the last modification time + * * etag - An arbitrary string, surrounded by double-quotes. (e.g.: + * '"abcdef"') + * * size - The size of the calendar objects, in bytes. + * * component - optional, a string containing the type of object, such + * as 'vevent' or 'vtodo'. If specified, this will be used to populate + * the Content-Type header. + * + * Note that the etag is optional, but it's highly encouraged to return for + * speed reasons. + * + * The calendardata is also optional. If it's not returned + * 'getCalendarObject' will be called later, which *is* expected to return + * calendardata. + * + * If neither etag or size are specified, the calendardata will be + * used/fetched to determine these numbers. If both are specified the + * amount of times this is needed is reduced by a great degree. + * + * @param mixed $calendarId + * @return array + */ + function getCalendarObjects($calendarId) { + $query = $this->db->getQueryBuilder(); + $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'componenttype']) + ->from('calendarobjects') + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))); + $stmt = $query->execute(); + + $result = []; + foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { + $result[] = [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + 'component' => strtolower($row['componenttype']), + ]; + } + + return $result; + } + + /** + * Returns information from a single calendar object, based on it's object + * uri. + * + * The object uri is only the basename, or filename and not a full path. + * + * The returned array must have the same keys as getCalendarObjects. The + * 'calendardata' object is required here though, while it's not required + * for getCalendarObjects. + * + * This method must return null if the object did not exist. + * + * @param mixed $calendarId + * @param string $objectUri + * @return array|null + */ + function getCalendarObject($calendarId, $objectUri) { + + $query = $this->db->getQueryBuilder(); + $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype']) + ->from('calendarobjects') + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) + ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))); + $stmt = $query->execute(); + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + + if(!$row) return null; + + return [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + 'calendardata' => $this->readBlob($row['calendardata']), + 'component' => strtolower($row['componenttype']), + ]; + } + + /** + * Returns a list of calendar objects. + * + * This method should work identical to getCalendarObject, but instead + * return all the calendar objects in the list as an array. + * + * If the backend supports this, it may allow for some speed-ups. + * + * @param mixed $calendarId + * @param string[] $uris + * @return array + */ + function getMultipleCalendarObjects($calendarId, array $uris) { + $query = $this->db->getQueryBuilder(); + $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype']) + ->from('calendarobjects') + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) + ->andWhere($query->expr()->in('uri', $query->createParameter('uri'))) + ->setParameter('uri', $uris, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY); + + $stmt = $query->execute(); + + $result = []; + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + $result[] = [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'calendarid' => $row['calendarid'], + 'size' => (int)$row['size'], + 'calendardata' => $this->readBlob($row['calendardata']), + 'component' => strtolower($row['componenttype']), + ]; + + } + return $result; + } + + /** + * Creates a new calendar object. + * + * The object uri is only the basename, or filename and not a full path. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string + */ + function createCalendarObject($calendarId, $objectUri, $calendarData) { + $extraData = $this->getDenormalizedData($calendarData); + + $query = $this->db->getQueryBuilder(); + $query->insert('calendarobjects') + ->values([ + 'calendarid' => $query->createNamedParameter($calendarId), + 'uri' => $query->createNamedParameter($objectUri), + 'calendardata' => $query->createNamedParameter($calendarData, \PDO::PARAM_LOB), + 'lastmodified' => $query->createNamedParameter(time()), + 'etag' => $query->createNamedParameter($extraData['etag']), + 'size' => $query->createNamedParameter($extraData['size']), + 'componenttype' => $query->createNamedParameter($extraData['componentType']), + 'firstoccurence' => $query->createNamedParameter($extraData['firstOccurence']), + 'lastoccurence' => $query->createNamedParameter($extraData['lastOccurence']), + 'uid' => $query->createNamedParameter($extraData['uid']), + ]) + ->execute(); + + $this->addChange($calendarId, $objectUri, 1); + + return '"' . $extraData['etag'] . '"'; + } + + /** + * Updates an existing calendarobject, based on it's uri. + * + * The object uri is only the basename, or filename and not a full path. + * + * It is possible return an etag from this function, which will be used in + * the response to this PUT request. Note that the ETag must be surrounded + * by double-quotes. + * + * However, you should only really return this ETag if you don't mangle the + * calendar-data. If the result of a subsequent GET to this object is not + * the exact same as this request body, you should omit the ETag. + * + * @param mixed $calendarId + * @param string $objectUri + * @param string $calendarData + * @return string + */ + function updateCalendarObject($calendarId, $objectUri, $calendarData) { + $extraData = $this->getDenormalizedData($calendarData); + + $query = $this->db->getQueryBuilder(); + $query->update('calendarobjects') + ->set('calendardata', $query->createNamedParameter($calendarData, \PDO::PARAM_LOB)) + ->set('lastmodified', $query->createNamedParameter(time())) + ->set('etag', $query->createNamedParameter($extraData['etag'])) + ->set('size', $query->createNamedParameter($extraData['size'])) + ->set('componenttype', $query->createNamedParameter($extraData['componentType'])) + ->set('firstoccurence', $query->createNamedParameter($extraData['firstOccurence'])) + ->set('lastoccurence', $query->createNamedParameter($extraData['lastOccurence'])) + ->set('uid', $query->createNamedParameter($extraData['uid'])) + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) + ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) + ->execute(); + + $this->addChange($calendarId, $objectUri, 2); + + return '"' . $extraData['etag'] . '"'; + } + + /** + * Deletes an existing calendar object. + * + * The object uri is only the basename, or filename and not a full path. + * + * @param mixed $calendarId + * @param string $objectUri + * @return void + */ + function deleteCalendarObject($calendarId, $objectUri) { + $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?'); + $stmt->execute([$calendarId, $objectUri]); + + $this->addChange($calendarId, $objectUri, 3); + } + + /** + * Performs a calendar-query on the contents of this calendar. + * + * The calendar-query is defined in RFC4791 : CalDAV. Using the + * calendar-query it is possible for a client to request a specific set of + * object, based on contents of iCalendar properties, date-ranges and + * iCalendar component types (VTODO, VEVENT). + * + * This method should just return a list of (relative) urls that match this + * query. + * + * The list of filters are specified as an array. The exact array is + * documented by Sabre\CalDAV\CalendarQueryParser. + * + * Note that it is extremely likely that getCalendarObject for every path + * returned from this method will be called almost immediately after. You + * may want to anticipate this to speed up these requests. + * + * This method provides a default implementation, which parses *all* the + * iCalendar objects in the specified calendar. + * + * This default may well be good enough for personal use, and calendars + * that aren't very large. But if you anticipate high usage, big calendars + * or high loads, you are strongly adviced to optimize certain paths. + * + * The best way to do so is override this method and to optimize + * specifically for 'common filters'. + * + * Requests that are extremely common are: + * * requests for just VEVENTS + * * requests for just VTODO + * * requests with a time-range-filter on either VEVENT or VTODO. + * + * ..and combinations of these requests. It may not be worth it to try to + * handle every possible situation and just rely on the (relatively + * easy to use) CalendarQueryValidator to handle the rest. + * + * Note that especially time-range-filters may be difficult to parse. A + * time-range filter specified on a VEVENT must for instance also handle + * recurrence rules correctly. + * A good example of how to interprete all these filters can also simply + * be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct + * as possible, so it gives you a good idea on what type of stuff you need + * to think of. + * + * @param mixed $calendarId + * @param array $filters + * @return array + */ + function calendarQuery($calendarId, array $filters) { + $componentType = null; + $requirePostFilter = true; + $timeRange = null; + + // if no filters were specified, we don't need to filter after a query + if (!$filters['prop-filters'] && !$filters['comp-filters']) { + $requirePostFilter = false; + } + + // Figuring out if there's a component filter + if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) { + $componentType = $filters['comp-filters'][0]['name']; + + // Checking if we need post-filters + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) { + $requirePostFilter = false; + } + // There was a time-range filter + if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) { + $timeRange = $filters['comp-filters'][0]['time-range']; + + // If start time OR the end time is not specified, we can do a + // 100% accurate mysql query. + if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) { + $requirePostFilter = false; + } + } + + } + $columns = ['uri']; + if ($requirePostFilter) { + $columns = ['uri', 'calendardata']; + } + $query = $this->db->getQueryBuilder(); + $query->select($columns) + ->from('calendarobjects') + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))); + + if ($componentType) { + $query->andWhere($query->expr()->eq('componenttype', $query->createNamedParameter($componentType))); + } + + if ($timeRange && $timeRange['start']) { + $query->andWhere($query->expr()->gt('lastoccurence', $query->createNamedParameter($timeRange['start']->getTimeStamp()))); + } + if ($timeRange && $timeRange['end']) { + $query->andWhere($query->expr()->lt('firstoccurence', $query->createNamedParameter($timeRange['end']->getTimeStamp()))); + } + + $stmt = $query->execute(); + + $result = []; + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + if ($requirePostFilter) { + if (!$this->validateFilterForObject($row, $filters)) { + continue; + } + } + $result[] = $row['uri']; + } + + return $result; + } + + /** + * Searches through all of a users calendars and calendar objects to find + * an object with a specific UID. + * + * This method should return the path to this object, relative to the + * calendar home, so this path usually only contains two parts: + * + * calendarpath/objectpath.ics + * + * If the uid is not found, return null. + * + * This method should only consider * objects that the principal owns, so + * any calendars owned by other principals that also appear in this + * collection should be ignored. + * + * @param string $principalUri + * @param string $uid + * @return string|null + */ + function getCalendarObjectByUID($principalUri, $uid) { + + $query = $this->db->getQueryBuilder(); + $query->select([$query->createFunction('c.`uri` AS `calendaruri`'), $query->createFunction('co.`uri` AS `objecturi`')]) + ->from('calendarobjects', 'co') + ->leftJoin('co', 'calendars', 'c', 'co.`calendarid` = c.`id`') + ->where($query->expr()->eq('c.principaluri', $query->createNamedParameter($principalUri))) + ->andWhere($query->expr()->eq('co.uid', $query->createNamedParameter($uid))); + + $stmt = $query->execute(); + + if ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + return $row['calendaruri'] . '/' . $row['objecturi']; + } + + return null; + } + + /** + * The getChanges method returns all the changes that have happened, since + * the specified syncToken in the specified calendar. + * + * This function should return an array, such as the following: + * + * [ + * 'syncToken' => 'The current synctoken', + * 'added' => [ + * 'new.txt', + * ], + * 'modified' => [ + * 'modified.txt', + * ], + * 'deleted' => [ + * 'foo.php.bak', + * 'old.txt' + * ] + * ); + * + * The returned syncToken property should reflect the *current* syncToken + * of the calendar, as reported in the {http://sabredav.org/ns}sync-token + * property This is * needed here too, to ensure the operation is atomic. + * + * If the $syncToken argument is specified as null, this is an initial + * sync, and all members should be reported. + * + * The modified property is an array of nodenames that have changed since + * the last token. + * + * The deleted property is an array with nodenames, that have been deleted + * from collection. + * + * The $syncLevel argument is basically the 'depth' of the report. If it's + * 1, you only have to report changes that happened only directly in + * immediate descendants. If it's 2, it should also include changes from + * the nodes below the child collections. (grandchildren) + * + * The $limit argument allows a client to specify how many results should + * be returned at most. If the limit is not specified, it should be treated + * as infinite. + * + * If the limit (infinite or not) is higher than you're willing to return, + * you should throw a Sabre\DAV\Exception\TooMuchMatches() exception. + * + * If the syncToken is expired (due to data cleanup) or unknown, you must + * return null. + * + * The limit is 'suggestive'. You are free to ignore it. + * + * @param string $calendarId + * @param string $syncToken + * @param int $syncLevel + * @param int $limit + * @return array + */ + function getChangesForCalendar($calendarId, $syncToken, $syncLevel, $limit = null) { + // Current synctoken + $stmt = $this->db->prepare('SELECT `synctoken` FROM `*PREFIX*calendars` WHERE `id` = ?'); + $stmt->execute([ $calendarId ]); + $currentToken = $stmt->fetchColumn(0); + + if (is_null($currentToken)) { + return null; + } + + $result = [ + 'syncToken' => $currentToken, + 'added' => [], + 'modified' => [], + 'deleted' => [], + ]; + + if ($syncToken) { + + $query = "SELECT `uri`, `operation` FROM `*PREFIX*calendarchanges` WHERE `synctoken` >= ? AND `synctoken` < ? AND `calendarid` = ? ORDER BY `synctoken`"; + if ($limit>0) { + $query.= " `LIMIT` " . (int)$limit; + } + + // Fetching all changes + $stmt = $this->db->prepare($query); + $stmt->execute([$syncToken, $currentToken, $calendarId]); + + $changes = []; + + // This loop ensures that any duplicates are overwritten, only the + // last change on a node is relevant. + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + $changes[$row['uri']] = $row['operation']; + + } + + foreach($changes as $uri => $operation) { + + switch($operation) { + case 1 : + $result['added'][] = $uri; + break; + case 2 : + $result['modified'][] = $uri; + break; + case 3 : + $result['deleted'][] = $uri; + break; + } + + } + } else { + // No synctoken supplied, this is the initial sync. + $query = "SELECT `uri` FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ?"; + $stmt = $this->db->prepare($query); + $stmt->execute([$calendarId]); + + $result['added'] = $stmt->fetchAll(\PDO::FETCH_COLUMN); + } + return $result; + + } + + /** + * Returns a list of subscriptions for a principal. + * + * Every subscription is an array with the following keys: + * * id, a unique id that will be used by other functions to modify the + * subscription. This can be the same as the uri or a database key. + * * uri. This is just the 'base uri' or 'filename' of the subscription. + * * principaluri. The owner of the subscription. Almost always the same as + * principalUri passed to this method. + * + * Furthermore, all the subscription info must be returned too: + * + * 1. {DAV:}displayname + * 2. {http://apple.com/ns/ical/}refreshrate + * 3. {http://calendarserver.org/ns/}subscribed-strip-todos (omit if todos + * should not be stripped). + * 4. {http://calendarserver.org/ns/}subscribed-strip-alarms (omit if alarms + * should not be stripped). + * 5. {http://calendarserver.org/ns/}subscribed-strip-attachments (omit if + * attachments should not be stripped). + * 6. {http://calendarserver.org/ns/}source (Must be a + * Sabre\DAV\Property\Href). + * 7. {http://apple.com/ns/ical/}calendar-color + * 8. {http://apple.com/ns/ical/}calendar-order + * 9. {urn:ietf:params:xml:ns:caldav}supported-calendar-component-set + * (should just be an instance of + * Sabre\CalDAV\Property\SupportedCalendarComponentSet, with a bunch of + * default components). + * + * @param string $principalUri + * @return array + */ + function getSubscriptionsForUser($principalUri) { + $fields = array_values($this->subscriptionPropertyMap); + $fields[] = 'id'; + $fields[] = 'uri'; + $fields[] = 'source'; + $fields[] = 'principaluri'; + $fields[] = 'lastmodified'; + + $query = $this->db->getQueryBuilder(); + $query->select($fields) + ->from('calendarsubscriptions') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri))) + ->orderBy('calendarorder', 'asc'); + $stmt =$query->execute(); + + $subscriptions = []; + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + + $subscription = [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + 'source' => $row['source'], + 'lastmodified' => $row['lastmodified'], + + '{' . Plugin::NS_CALDAV . '}supported-calendar-component-set' => new SupportedCalendarComponentSet(['VTODO', 'VEVENT']), + ]; + + foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) { + if (!is_null($row[$dbName])) { + $subscription[$xmlName] = $row[$dbName]; + } + } + + $subscriptions[] = $subscription; + + } + + return $subscriptions; + } + + /** + * Creates a new subscription for a principal. + * + * If the creation was a success, an id must be returned that can be used to reference + * this subscription in other methods, such as updateSubscription. + * + * @param string $principalUri + * @param string $uri + * @param array $properties + * @return mixed + */ + function createSubscription($principalUri, $uri, array $properties) { + + if (!isset($properties['{http://calendarserver.org/ns/}source'])) { + throw new Forbidden('The {http://calendarserver.org/ns/}source property is required when creating subscriptions'); + } + + $values = [ + 'principaluri' => $principalUri, + 'uri' => $uri, + 'source' => $properties['{http://calendarserver.org/ns/}source']->getHref(), + 'lastmodified' => time(), + ]; + + foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) { + if (isset($properties[$xmlName])) { + + $values[$dbName] = $properties[$xmlName]; + $fieldNames[] = $dbName; + } + } + + $query = $this->db->getQueryBuilder(); + $query->insert('calendarsubscriptions') + ->values([ + 'principaluri' => $query->createNamedParameter($values['principaluri']), + 'uri' => $query->createNamedParameter($values['uri']), + 'source' => $query->createNamedParameter($values['source']), + 'lastmodified' => $query->createNamedParameter($values['lastmodified']), + ]) + ->execute(); + + return $this->db->lastInsertId('*PREFIX*calendarsubscriptions'); + } + + /** + * Updates a subscription + * + * The list of mutations is stored in a Sabre\DAV\PropPatch object. + * To do the actual updates, you must tell this object which properties + * you're going to process with the handle() method. + * + * Calling the handle method is like telling the PropPatch object "I + * promise I can handle updating this property". + * + * Read the PropPatch documentation for more info and examples. + * + * @param mixed $subscriptionId + * @param \Sabre\DAV\PropPatch $propPatch + * @return void + */ + function updateSubscription($subscriptionId, DAV\PropPatch $propPatch) { + $supportedProperties = array_keys($this->subscriptionPropertyMap); + $supportedProperties[] = '{http://calendarserver.org/ns/}source'; + + $propPatch->handle($supportedProperties, function($mutations) use ($subscriptionId) { + + $newValues = []; + + foreach($mutations as $propertyName=>$propertyValue) { + if ($propertyName === '{http://calendarserver.org/ns/}source') { + $newValues['source'] = $propertyValue->getHref(); + } else { + $fieldName = $this->subscriptionPropertyMap[$propertyName]; + $newValues[$fieldName] = $propertyValue; + } + } + + $query = $this->db->getQueryBuilder(); + $query->update('calendarsubscriptions') + ->set('lastmodified', $query->createNamedParameter(time())); + foreach($newValues as $fieldName=>$value) { + $query->set($fieldName, $query->createNamedParameter($value)); + } + $query->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId))) + ->execute(); + + return true; + + }); + } + + /** + * Deletes a subscription. + * + * @param mixed $subscriptionId + * @return void + */ + function deleteSubscription($subscriptionId) { + $query = $this->db->getQueryBuilder(); + $query->delete('calendarsubscriptions') + ->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId))) + ->execute(); + } + + /** + * Returns a single scheduling object for the inbox collection. + * + * The returned array should contain the following elements: + * * uri - A unique basename for the object. This will be used to + * construct a full uri. + * * calendardata - The iCalendar object + * * lastmodified - The last modification date. Can be an int for a unix + * timestamp, or a PHP DateTime object. + * * etag - A unique token that must change if the object changed. + * * size - The size of the object, in bytes. + * + * @param string $principalUri + * @param string $objectUri + * @return array + */ + function getSchedulingObject($principalUri, $objectUri) { + $query = $this->db->getQueryBuilder(); + $stmt = $query->select(['uri', 'calendardata', 'lastmodified', 'etag', 'size']) + ->from('schedulingobjects') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri))) + ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) + ->execute(); + + $row = $stmt->fetch(\PDO::FETCH_ASSOC); + + if(!$row) { + return null; + } + + return [ + 'uri' => $row['uri'], + 'calendardata' => $row['calendardata'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'size' => (int)$row['size'], + ]; + } + + /** + * Returns all scheduling objects for the inbox collection. + * + * These objects should be returned as an array. Every item in the array + * should follow the same structure as returned from getSchedulingObject. + * + * The main difference is that 'calendardata' is optional. + * + * @param string $principalUri + * @return array + */ + function getSchedulingObjects($principalUri) { + $query = $this->db->getQueryBuilder(); + $stmt = $query->select(['uri', 'calendardata', 'lastmodified', 'etag', 'size']) + ->from('schedulingobjects') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri))) + ->execute(); + + $result = []; + foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) { + $result[] = [ + 'calendardata' => $row['calendardata'], + 'uri' => $row['uri'], + 'lastmodified' => $row['lastmodified'], + 'etag' => '"' . $row['etag'] . '"', + 'size' => (int)$row['size'], + ]; + } + + return $result; + } + + /** + * Deletes a scheduling object from the inbox collection. + * + * @param string $principalUri + * @param string $objectUri + * @return void + */ + function deleteSchedulingObject($principalUri, $objectUri) { + $query = $this->db->getQueryBuilder(); + $query->delete('schedulingobjects') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri))) + ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) + ->execute(); + } + + /** + * Creates a new scheduling object. This should land in a users' inbox. + * + * @param string $principalUri + * @param string $objectUri + * @param string $objectData + * @return void + */ + function createSchedulingObject($principalUri, $objectUri, $objectData) { + $query = $this->db->getQueryBuilder(); + $query->insert('schedulingobjects') + ->values([ + 'principaluri' => $query->createNamedParameter($principalUri), + 'calendardata' => $query->createNamedParameter($objectData), + 'uri' => $query->createNamedParameter($objectUri), + 'lastmodified' => $query->createNamedParameter(time()), + 'etag' => $query->createNamedParameter(md5($objectData)), + 'size' => $query->createNamedParameter(strlen($objectData)) + ]) + ->execute(); + } + + /** + * Adds a change record to the calendarchanges table. + * + * @param mixed $calendarId + * @param string $objectUri + * @param int $operation 1 = add, 2 = modify, 3 = delete. + * @return void + */ + protected function addChange($calendarId, $objectUri, $operation) { + + $stmt = $this->db->prepare('INSERT INTO `*PREFIX*calendarchanges` (`uri`, `synctoken`, `calendarid`, `operation`) SELECT ?, `synctoken`, ?, ? FROM `*PREFIX*calendars` WHERE `id` = ?'); + $stmt->execute([ + $objectUri, + $calendarId, + $operation, + $calendarId + ]); + $stmt = $this->db->prepare('UPDATE `*PREFIX*calendars` SET `synctoken` = `synctoken` + 1 WHERE `id` = ?'); + $stmt->execute([ + $calendarId + ]); + + } + + /** + * Parses some information from calendar objects, used for optimized + * calendar-queries. + * + * Returns an array with the following keys: + * * etag - An md5 checksum of the object without the quotes. + * * size - Size of the object in bytes + * * componentType - VEVENT, VTODO or VJOURNAL + * * firstOccurence + * * lastOccurence + * * uid - value of the UID property + * + * @param string $calendarData + * @return array + */ + protected function getDenormalizedData($calendarData) { + + $vObject = Reader::read($calendarData); + $componentType = null; + $component = null; + $firstOccurence = null; + $lastOccurence = null; + $uid = null; + foreach($vObject->getComponents() as $component) { + if ($component->name!=='VTIMEZONE') { + $componentType = $component->name; + $uid = (string)$component->UID; + break; + } + } + if (!$componentType) { + throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component'); + } + if ($componentType === 'VEVENT') { + $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp(); + // Finding the last occurence is a bit harder + if (!isset($component->RRULE)) { + if (isset($component->DTEND)) { + $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp(); + } elseif (isset($component->DURATION)) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->add(DateTimeParser::parse($component->DURATION->getValue())); + $lastOccurence = $endDate->getTimeStamp(); + } elseif (!$component->DTSTART->hasTime()) { + $endDate = clone $component->DTSTART->getDateTime(); + $endDate->modify('+1 day'); + $lastOccurence = $endDate->getTimeStamp(); + } else { + $lastOccurence = $firstOccurence; + } + } else { + $it = new RecurrenceIterator($vObject, (string)$component->UID); + $maxDate = new \DateTime(self::MAX_DATE); + if ($it->isInfinite()) { + $lastOccurence = $maxDate->getTimeStamp(); + } else { + $end = $it->getDtEnd(); + while($it->valid() && $end < $maxDate) { + $end = $it->getDtEnd(); + $it->next(); + + } + $lastOccurence = $end->getTimeStamp(); + } + + } + } + + return [ + 'etag' => md5($calendarData), + 'size' => strlen($calendarData), + 'componentType' => $componentType, + 'firstOccurence' => $firstOccurence, + 'lastOccurence' => $lastOccurence, + 'uid' => $uid, + ]; + + } + + private function readBlob($cardData) { + if (is_resource($cardData)) { + return stream_get_contents($cardData); + } + + return $cardData; + } +} diff --git a/apps/dav/lib/carddav/addressbook.php b/apps/dav/lib/carddav/addressbook.php new file mode 100644 index 0000000000..507657e968 --- /dev/null +++ b/apps/dav/lib/carddav/addressbook.php @@ -0,0 +1,90 @@ +carddavBackend; + $carddavBackend->updateShares($this->getName(), $add, $remove); + } + + /** + * Returns the list of people whom this addressbook is shared with. + * + * Every element in this array should have the following properties: + * * href - Often a mailto: address + * * commonName - Optional, for example a first + last name + * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. + * * readOnly - boolean + * * summary - Optional, a description for the share + * + * @return array + */ + function getShares() { + /** @var CardDavBackend $carddavBackend */ + $carddavBackend = $this->carddavBackend; + $carddavBackend->getShares($this->getName()); + } + + function getACL() { + $acl = parent::getACL(); + if ($this->getOwner() === 'principals/system/system') { + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ]; + } + + return $acl; + } + + function getChildACL() { + $acl = parent::getChildACL(); + if ($this->getOwner() === 'principals/system/system') { + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ]; + } + + return $acl; + } + + function getChild($name) { + $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'], $name); + if (!$obj) { + throw new NotFound('Card not found'); + } + return new Card($this->carddavBackend, $this->addressBookInfo, $obj); + } + +} diff --git a/apps/dav/lib/carddav/addressbookroot.php b/apps/dav/lib/carddav/addressbookroot.php new file mode 100644 index 0000000000..8c78d02455 --- /dev/null +++ b/apps/dav/lib/carddav/addressbookroot.php @@ -0,0 +1,33 @@ +carddavBackend, $principal['uri']); + + } + + function getName() { + + // Grabbing all the components of the principal path. + $parts = explode('/', $this->principalPrefix); + + // We are only interested in the second part. + return $parts[1]; + + } + +} diff --git a/apps/dav/lib/carddav/card.php b/apps/dav/lib/carddav/card.php new file mode 100644 index 0000000000..cea0b1e41c --- /dev/null +++ b/apps/dav/lib/carddav/card.php @@ -0,0 +1,39 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\CardDAV; + +class Card extends \Sabre\CardDAV\Card { + + function getACL() { + $acl = parent::getACL(); + if ($this->getOwner() === 'principals/system/system') { + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ]; + } + + return $acl; + } + +} diff --git a/apps/dav/lib/carddav/carddavbackend.php b/apps/dav/lib/carddav/carddavbackend.php index b2597baedc..29b056672b 100644 --- a/apps/dav/lib/carddav/carddavbackend.php +++ b/apps/dav/lib/carddav/carddavbackend.php @@ -22,6 +22,7 @@ namespace OCA\DAV\CardDAV; +use OCA\DAV\Connector\Sabre\Principal; use Sabre\CardDAV\Backend\BackendInterface; use Sabre\CardDAV\Backend\SyncSupport; use Sabre\CardDAV\Plugin; @@ -29,8 +30,12 @@ use Sabre\DAV\Exception\BadRequest; class CardDavBackend implements BackendInterface, SyncSupport { - public function __construct(\OCP\IDBConnection $db) { + /** @var Principal */ + private $principalBackend; + + public function __construct(\OCP\IDBConnection $db, Principal $principalBackend) { $this->db = $db; + $this->principalBackend = $principalBackend; } /** @@ -73,9 +78,61 @@ class CardDavBackend implements BackendInterface, SyncSupport { } $result->closeCursor(); + // query for shared calendars + $query = $this->db->getQueryBuilder(); + $query2 = $this->db->getQueryBuilder(); + $query2->select(['resourceid']) + ->from('dav_shares') + ->where($query2->expr()->eq('principaluri', $query2->createParameter('principaluri'))) + ->andWhere($query2->expr()->eq('type', $query2->createParameter('type'))); + $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) + ->from('addressbooks') + ->where($query->expr()->in('id', $query->createFunction($query2->getSQL()))) + ->setParameter('type', 'addressbook') + ->setParameter('principaluri', $principalUri) + ->execute(); + + while($row = $result->fetch()) { + $addressBooks[] = [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{DAV:}displayname' => $row['displayname'], + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], + '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], + '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + ]; + } + $result->closeCursor(); + return $addressBooks; } + public function getAddressBooksByUri($addressBookUri) { + $query = $this->db->getQueryBuilder(); + $result = $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) + ->from('addressbooks') + ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri))) + ->setMaxResults(1) + ->execute(); + + $row = $result->fetch(); + $result->closeCursor(); + if ($row === false) { + return null; + } + + return [ + 'id' => $row['id'], + 'uri' => $row['uri'], + 'principaluri' => $row['principaluri'], + '{DAV:}displayname' => $row['displayname'], + '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], + '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], + '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + ]; + } + /** * Updates properties for an address book. * @@ -86,7 +143,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { * Calling the handle method is like telling the PropPatch object "I * promise I can handle updating this property". * - * Read the PropPatch documenation for more info and examples. + * Read the PropPatch documentation for more info and examples. * * @param string $addressBookId * @param \Sabre\DAV\PropPatch $propPatch @@ -201,6 +258,11 @@ class CardDavBackend implements BackendInterface, SyncSupport { ->where($query->expr()->eq('id', $query->createParameter('id'))) ->setParameter('id', $addressBookId) ->execute(); + + $query->delete('dav_shares') + ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBookId))) + ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook'))) + ->execute(); } /** @@ -281,7 +343,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { * If the backend supports this, it may allow for some speed-ups. * * @param mixed $addressBookId - * @param array $uris + * @param string[] $uris * @return array */ function getMultipleCards($addressBookId, array $uris) { @@ -328,7 +390,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { * @param mixed $addressBookId * @param string $cardUri * @param string $cardData - * @return string|null + * @return string */ function createCard($addressBookId, $cardUri, $cardData) { $etag = md5($cardData); @@ -373,7 +435,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { * @param mixed $addressBookId * @param string $cardUri * @param string $cardData - * @return string|null + * @return string */ function updateCard($addressBookId, $cardUri, $cardData) { @@ -561,4 +623,115 @@ class CardDavBackend implements BackendInterface, SyncSupport { return $cardData; } + /** + * @param string $path + * @param string[] $add + * @param string[] $remove + */ + public function updateShares($path, $add, $remove) { + foreach($add as $element) { + $this->shareWith($path, $element); + } + foreach($remove as $element) { + $this->unshare($path, $element); + } + } + + /** + * @param string $addressBookUri + * @param string $element + */ + private function shareWith($addressBookUri, $element) { + $user = $element['href']; + $parts = explode(':', $user, 2); + if ($parts[0] !== 'principal') { + return; + } + $p = $this->principalBackend->getPrincipalByPath($parts[1]); + if (is_null($p)) { + return; + } + + $addressBook = $this->getAddressBooksByUri($addressBookUri); + if (is_null($addressBook)) { + return; + } + + // remove the share if it already exists + $this->unshare($addressBookUri, $element); + + $query = $this->db->getQueryBuilder(); + $query->insert('dav_shares') + ->values([ + 'principaluri' => $query->createNamedParameter($parts[1]), + 'uri' => $query->createNamedParameter($addressBookUri), + 'type' => $query->createNamedParameter('addressbook'), + 'access' => $query->createNamedParameter(0), + 'resourceid' => $query->createNamedParameter($addressBook['id']) + ]); + $query->execute(); + } + + /** + * @param string $addressBookUri + * @param string $element + */ + private function unshare($addressBookUri, $element) { + $user = $element['href']; + $parts = explode(':', $user, 2); + if ($parts[0] !== 'principal') { + return; + } + $p = $this->principalBackend->getPrincipalByPath($parts[1]); + if (is_null($p)) { + return; + } + + $addressBook = $this->getAddressBooksByUri($addressBookUri); + if (is_null($addressBook)) { + return; + } + + $query = $this->db->getQueryBuilder(); + $query->delete('dav_shares') + ->where($query->expr()->eq('resourceid', $query->createNamedParameter($addressBook['id']))) + ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook'))) + ->andWhere($query->expr()->eq('principaluri', $query->createNamedParameter($parts[1]))) + ; + $query->execute(); + } + + /** + * Returns the list of people whom this address book is shared with. + * + * Every element in this array should have the following properties: + * * href - Often a mailto: address + * * commonName - Optional, for example a first + last name + * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants. + * * readOnly - boolean + * * summary - Optional, a description for the share + * + * @return array + */ + public function getShares($addressBookUri) { + $query = $this->db->getQueryBuilder(); + $result = $query->select(['principaluri', 'access']) + ->from('dav_shares') + ->where($query->expr()->eq('uri', $query->createNamedParameter($addressBookUri))) + ->andWhere($query->expr()->eq('type', $query->createNamedParameter('addressbook'))) + ->execute(); + + $shares = []; + while($row = $result->fetch()) { + $p = $this->principalBackend->getPrincipalByPath($row['principaluri']); + $shares[]= [ + 'href' => "principal:${p['uri']}", + 'commonName' => isset($p['{DAV:}displayname']) ? $p['{DAV:}displayname'] : '', + 'status' => 1, + 'readOnly' => ($row['access'] === 1) + ]; + } + + return $shares; + } } diff --git a/apps/dav/lib/carddav/converter.php b/apps/dav/lib/carddav/converter.php new file mode 100644 index 0000000000..56b73eba4c --- /dev/null +++ b/apps/dav/lib/carddav/converter.php @@ -0,0 +1,158 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\CardDAV; + +use OCP\IImage; +use OCP\IUser; +use Sabre\VObject\Component\VCard; +use Sabre\VObject\Property\Text; + +class Converter { + + /** + * @param IUser $user + * @return VCard + */ + public function createCardFromUser(IUser $user) { + + $uid = $user->getUID(); + $displayName = $user->getDisplayName(); + $displayName = empty($displayName ) ? $uid : $displayName; + $emailAddress = $user->getEMailAddress(); + $cloudId = $user->getCloudId(); + $image = $user->getAvatarImage(-1); + + $vCard = new VCard(); + $vCard->add(new Text($vCard, 'UID', $uid)); + if (!empty($displayName)) { + $vCard->add(new Text($vCard, 'FN', $displayName)); + $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName))); + } + if (!empty($emailAddress)) { + $vCard->add(new Text($vCard, 'EMAIL', $emailAddress, ['TYPE' => 'OTHER'])); + } + if (!empty($cloudId)) { + $vCard->add(new Text($vCard, 'CLOUD', $cloudId)); + } + if ($image) { + $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]); + } + $vCard->validate(); + + return $vCard; + } + + /** + * @param VCard $vCard + * @param IUser $user + * @return bool + */ + public function updateCard(VCard $vCard, IUser $user) { + $uid = $user->getUID(); + $displayName = $user->getDisplayName(); + $displayName = empty($displayName ) ? $uid : $displayName; + $emailAddress = $user->getEMailAddress(); + $cloudId = $user->getCloudId(); + $image = $user->getAvatarImage(-1); + + $updated = false; + if($this->propertyNeedsUpdate($vCard, 'FN', $displayName)) { + $vCard->FN = new Text($vCard, 'FN', $displayName); + unset($vCard->N); + $vCard->add(new Text($vCard, 'N', $this->splitFullName($displayName))); + $updated = true; + } + if($this->propertyNeedsUpdate($vCard, 'EMAIL', $emailAddress)) { + $vCard->EMAIL = new Text($vCard, 'EMAIL', $emailAddress); + $updated = true; + } + if($this->propertyNeedsUpdate($vCard, 'CLOUD', $cloudId)) { + $vCard->CLOUD = new Text($vCard, 'CLOUD', $cloudId); + $updated = true; + } + + if($this->propertyNeedsUpdate($vCard, 'PHOTO', $image)) { + $vCard->add('PHOTO', $image->data(), ['ENCODING' => 'b', 'TYPE' => $image->mimeType()]); + $updated = true; + } + + if (empty($emailAddress) && !is_null($vCard->EMAIL)) { + unset($vCard->EMAIL); + $updated = true; + } + if (empty($cloudId) && !is_null($vCard->CLOUD)) { + unset($vCard->CLOUD); + $updated = true; + } + if (empty($image) && !is_null($vCard->PHOTO)) { + unset($vCard->PHOTO); + $updated = true; + } + + return $updated; + } + + /** + * @param VCard $vCard + * @param string $name + * @param string|IImage $newValue + * @return bool + */ + private function propertyNeedsUpdate(VCard $vCard, $name, $newValue) { + if (is_null($newValue)) { + return false; + } + $value = $vCard->__get($name); + if (!is_null($value)) { + $value = $value->getValue(); + $newValue = $newValue instanceof IImage ? $newValue->data() : $newValue; + + return $value !== $newValue; + } + return true; + } + + /** + * @param string $fullName + * @return string[] + */ + public function splitFullName($fullName) { + // Very basic western style parsing. I'm not gonna implement + // https://github.com/android/platform_packages_providers_contactsprovider/blob/master/src/com/android/providers/contacts/NameSplitter.java ;) + + $elements = explode(' ', $fullName); + $result = ['', '', '', '', '']; + if (count($elements) > 2) { + $result[0] = implode(' ', array_slice($elements, count($elements)-1)); + $result[1] = $elements[0]; + $result[2] = implode(' ', array_slice($elements, 1, count($elements)-2)); + } elseif (count($elements) === 2) { + $result[0] = $elements[1]; + $result[1] = $elements[0]; + } else { + $result[0] = $elements[0]; + } + + return $result; + } + +} diff --git a/apps/dav/lib/carddav/plugin.php b/apps/dav/lib/carddav/plugin.php new file mode 100644 index 0000000000..f2b3dcbfda --- /dev/null +++ b/apps/dav/lib/carddav/plugin.php @@ -0,0 +1,47 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\CardDAV; + +use Sabre\HTTP\URLUtil; + +class Plugin extends \Sabre\CardDAV\Plugin { + + /** + * Returns the addressbook home for a given principal + * + * @param string $principal + * @return string + */ + protected function getAddressbookHomeForPrincipal($principal) { + + if (strrpos($principal, 'principals/users', -strlen($principal)) !== FALSE) { + list(, $principalId) = URLUtil::splitPath($principal); + return self::ADDRESSBOOK_ROOT . '/users/' . $principalId; + } + if (strrpos($principal, 'principals/system', -strlen($principal)) !== FALSE) { + list(, $principalId) = URLUtil::splitPath($principal); + return self::ADDRESSBOOK_ROOT . '/system/' . $principalId; + } + + throw new \LogicException('This is not supposed to happen'); + } +} diff --git a/apps/dav/lib/carddav/sharing/ishareableaddressbook.php b/apps/dav/lib/carddav/sharing/ishareableaddressbook.php new file mode 100644 index 0000000000..856a9ed18e --- /dev/null +++ b/apps/dav/lib/carddav/sharing/ishareableaddressbook.php @@ -0,0 +1,46 @@ +auth = $authBackEnd; + $this->request = $request; + } + + /** + * Reference to SabreDAV server object. + * + * @var \Sabre\DAV\Server + */ + protected $server; + + /** + * This method should return a list of server-features. + * + * This is for example 'versioning' and is added to the DAV: header + * in an OPTIONS response. + * + * @return string[] + */ + function getFeatures() { + + return ['oc-addressbook-sharing']; + + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using Sabre\DAV\Server::getPlugin + * + * @return string + */ + function getPluginName() { + + return 'carddav-sharing'; + + } + + /** + * This initializes the plugin. + * + * This function is called by Sabre\DAV\Server, after + * addPlugin is called. + * + * This method should set up the required event subscriptions. + * + * @param Server $server + * @return void + */ + function initialize(Server $server) { + $this->server = $server; + $server->resourceTypeMapping['OCA\\DAV\CardDAV\\ISharedAddressbook'] = '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}shared'; + + $this->server->on('method:POST', [$this, 'httpPost']); + } + + /** + * We intercept this to handle POST requests on calendars. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return null|false + */ + function httpPost(RequestInterface $request, ResponseInterface $response) { + + $path = $request->getPath(); + + // Only handling xml + $contentType = $request->getHeader('Content-Type'); + if (strpos($contentType, 'application/xml') === false && strpos($contentType, 'text/xml') === false) + return; + + // Making sure the node exists + try { + $node = $this->server->tree->getNodeForPath($path); + } catch (NotFound $e) { + return; + } + + // CSRF protection + $this->protectAgainstCSRF(); + + $requestBody = $request->getBodyAsString(); + + // If this request handler could not deal with this POST request, it + // will return 'null' and other plugins get a chance to handle the + // request. + // + // However, we already requested the full body. This is a problem, + // because a body can only be read once. This is why we preemptively + // re-populated the request body with the existing data. + $request->setBody($requestBody); + + $dom = XMLUtil::loadDOMDocument($requestBody); + + $documentType = XMLUtil::toClarkNotation($dom->firstChild); + + switch ($documentType) { + + // Dealing with the 'share' document, which modified invitees on a + // calendar. + case '{' . \Sabre\CardDAV\Plugin::NS_CARDDAV . '}share' : + + // We can only deal with IShareableCalendar objects + if (!$node instanceof IShareableAddressBook) { + return; + } + + $this->server->transactionType = 'post-calendar-share'; + + // Getting ACL info + $acl = $this->server->getPlugin('acl'); + + // If there's no ACL support, we allow everything + if ($acl) { + $acl->checkPrivileges($path, '{DAV:}write'); + } + + $mutations = $this->parseShareRequest($dom); + + $node->updateShares($mutations[0], $mutations[1]); + + $response->setStatus(200); + // Adding this because sending a response body may cause issues, + // and I wanted some type of indicator the response was handled. + $response->setHeader('X-Sabre-Status', 'everything-went-well'); + + // Breaking the event chain + return false; + } + } + + /** + * Parses the 'share' POST request. + * + * This method returns an array, containing two arrays. + * The first array is a list of new sharees. Every element is a struct + * containing a: + * * href element. (usually a mailto: address) + * * commonName element (often a first and lastname, but can also be + * false) + * * readOnly (true or false) + * * summary (A description of the share, can also be false) + * + * The second array is a list of sharees that are to be removed. This is + * just a simple array with 'hrefs'. + * + * @param \DOMDocument $dom + * @return array + */ + function parseShareRequest(\DOMDocument $dom) { + + $xpath = new \DOMXPath($dom); + $xpath->registerNamespace('cs', \Sabre\CardDAV\Plugin::NS_CARDDAV); + $xpath->registerNamespace('d', 'urn:DAV'); + + $set = []; + $elems = $xpath->query('cs:set'); + + for ($i = 0; $i < $elems->length; $i++) { + + $xset = $elems->item($i); + $set[] = [ + 'href' => $xpath->evaluate('string(d:href)', $xset), + 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset), + 'summary' => $xpath->evaluate('string(cs:summary)', $xset), + 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset) !== false + ]; + + } + + $remove = []; + $elems = $xpath->query('cs:remove'); + + for ($i = 0; $i < $elems->length; $i++) { + + $xremove = $elems->item($i); + $remove[] = $xpath->evaluate('string(d:href)', $xremove); + + } + + return [$set, $remove]; + + } + + private function protectAgainstCSRF() { + $user = $this->auth->getCurrentUser(); + if ($this->auth->isDavAuthenticated($user)) { + return true; + } + + if ($this->request->passesCSRFCheck()) { + return true; + } + + throw new BadRequest(); + } + + +} diff --git a/apps/dav/lib/carddav/useraddressbooks.php b/apps/dav/lib/carddav/useraddressbooks.php new file mode 100644 index 0000000000..093cee0e1b --- /dev/null +++ b/apps/dav/lib/carddav/useraddressbooks.php @@ -0,0 +1,49 @@ +carddavBackend->getAddressBooksForUser($this->principalUri); + $objects = []; + foreach($addressBooks as $addressBook) { + $objects[] = new AddressBook($this->carddavBackend, $addressBook); + } + return $objects; + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + function getACL() { + + $acl = parent::getACL(); + if ($this->principalUri === 'principals/system/system') { + $acl[] = [ + 'privilege' => '{DAV:}read', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ]; + } + + return $acl; + } + +} diff --git a/apps/dav/lib/connector/sabre/auth.php b/apps/dav/lib/connector/sabre/auth.php index 39a7df31b7..4f31977023 100644 --- a/apps/dav/lib/connector/sabre/auth.php +++ b/apps/dav/lib/connector/sabre/auth.php @@ -35,6 +35,8 @@ use OCP\IUserSession; use Sabre\DAV\Auth\Backend\AbstractBasic; use Sabre\DAV\Exception\NotAuthenticated; use Sabre\DAV\Exception\ServiceUnavailable; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; class Auth extends AbstractBasic { const DAV_AUTHENTICATED = 'AUTHENTICATED_TO_DAV_BACKEND'; @@ -52,6 +54,7 @@ class Auth extends AbstractBasic { IUserSession $userSession) { $this->session = $session; $this->userSession = $userSession; + $this->principalPrefix = 'principals/users/'; } /** @@ -65,7 +68,7 @@ class Auth extends AbstractBasic { * @param string $username * @return bool */ - protected function isDavAuthenticated($username) { + public function isDavAuthenticated($username) { return !is_null($this->session->get(self::DAV_AUTHENTICATED)) && $this->session->get(self::DAV_AUTHENTICATED) === $username; } @@ -122,22 +125,15 @@ class Auth extends AbstractBasic { } /** - * Override function here. We want to cache authentication cookies - * in the syncing client to avoid HTTP-401 roundtrips. - * If the sync client supplies the cookies, then OC_User::isLoggedIn() - * will return true and we can see this WebDAV request as already authenticated, - * even if there are no HTTP Basic Auth headers. - * In other case, just fallback to the parent implementation. - * - * @param \Sabre\DAV\Server $server - * @param string $realm - * @return bool - * @throws ServiceUnavailable + * @param RequestInterface $request + * @param ResponseInterface $response + * @return array * @throws NotAuthenticated + * @throws ServiceUnavailable */ - public function authenticate(\Sabre\DAV\Server $server, $realm) { + function check(RequestInterface $request, ResponseInterface $response) { try { - $result = $this->auth($server, $realm); + $result = $this->auth($request, $response); return $result; } catch (NotAuthenticated $e) { throw $e; @@ -149,11 +145,11 @@ class Auth extends AbstractBasic { } /** - * @param \Sabre\DAV\Server $server - * @param $realm - * @return bool + * @param RequestInterface $request + * @param ResponseInterface $response + * @return array */ - private function auth(\Sabre\DAV\Server $server, $realm) { + private function auth(RequestInterface $request, ResponseInterface $response) { if (\OC_User::handleApacheAuth() || ($this->userSession->isLoggedIn() && is_null($this->session->get(self::DAV_AUTHENTICATED))) ) { @@ -161,9 +157,16 @@ class Auth extends AbstractBasic { \OC_Util::setupFS($user); $this->currentUser = $user; $this->session->close(); - return true; + return [true, $this->principalPrefix . $user]; } - return parent::authenticate($server, $realm); + if (!$this->userSession->isLoggedIn() && $request->getHeader('X-Requested-With') === 'XMLHttpRequest') { + // do not re-authenticate over ajax, use dummy auth name to prevent browser popup + $response->addHeader('WWW-Authenticate','DummyBasic realm="' . $this->realm . '"'); + $response->setStatus(401); + throw new \Sabre\DAV\Exception\NotAuthenticated('Cannot authenticate over ajax calls'); + } + + return parent::check($request, $response); } } diff --git a/apps/dav/lib/connector/sabre/directory.php b/apps/dav/lib/connector/sabre/directory.php index 8c736ea010..b602dd2f7b 100644 --- a/apps/dav/lib/connector/sabre/directory.php +++ b/apps/dav/lib/connector/sabre/directory.php @@ -28,8 +28,10 @@ */ namespace OCA\DAV\Connector\Sabre; +use OCA\DAV\Connector\Sabre\Exception\Forbidden; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCP\Files\ForbiddenException; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use Sabre\DAV\Exception\Locked; @@ -117,6 +119,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } catch (\OCP\Files\InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } @@ -146,6 +150,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); } catch (\OCP\Files\InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } @@ -247,6 +253,8 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node // assume it wasn't possible to remove due to permission issue throw new \Sabre\DAV\Exception\Forbidden(); } + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } diff --git a/apps/dav/lib/connector/sabre/exception/forbidden.php b/apps/dav/lib/connector/sabre/exception/forbidden.php new file mode 100644 index 0000000000..673958349f --- /dev/null +++ b/apps/dav/lib/connector/sabre/exception/forbidden.php @@ -0,0 +1,64 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\Connector\Sabre\Exception; + +class Forbidden extends \Sabre\DAV\Exception\Forbidden { + + const NS_OWNCLOUD = 'http://owncloud.org/ns'; + + /** + * @var bool + */ + private $retry; + + /** + * @param string $message + * @param bool $retry + * @param \Exception $previous + */ + public function __construct($message, $retry = false, \Exception $previous = null) { + parent::__construct($message, 0, $previous); + $this->retry = $retry; + } + + /** + * This method allows the exception to include additional information + * into the WebDAV error response + * + * @param \Sabre\DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) { + + // set ownCloud namespace + $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD); + + // adding the retry node + $error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true)); + $errorNode->appendChild($error); + + // adding the message node + $error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage()); + $errorNode->appendChild($error); + } +} diff --git a/apps/dav/lib/connector/sabre/fakelockerplugin.php b/apps/dav/lib/connector/sabre/fakelockerplugin.php new file mode 100644 index 0000000000..b75e7f137d --- /dev/null +++ b/apps/dav/lib/connector/sabre/fakelockerplugin.php @@ -0,0 +1,155 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\Connector\Sabre; + +use Sabre\DAV\Locks\LockInfo; +use Sabre\DAV\ServerPlugin; +use Sabre\DAV\Xml\Property\LockDiscovery; +use Sabre\DAV\Xml\Property\SupportedLock; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; +use Sabre\DAV\PropFind; +use Sabre\DAV\INode; + +/** + * Class FakeLockerPlugin is a plugin only used when connections come in from + * OS X via Finder. The fake locking plugin does emulate Class 2 WebDAV support + * (locking of files) which allows Finder to access the storage in write mode as + * well. + * + * No real locking is performed, instead the plugin just returns always positive + * responses. + * + * @see https://github.com/owncloud/core/issues/17732 + * @package OCA\DAV\Connector\Sabre + */ +class FakeLockerPlugin extends ServerPlugin { + /** @var \Sabre\DAV\Server */ + private $server; + + /** {@inheritDoc} */ + public function initialize(\Sabre\DAV\Server $server) { + $this->server = $server; + $this->server->on('method:LOCK', [$this, 'fakeLockProvider'], 1); + $this->server->on('method:UNLOCK', [$this, 'fakeUnlockProvider'], 1); + $server->on('propFind', [$this, 'propFind']); + $server->on('validateTokens', [$this, 'validateTokens']); + } + + /** + * Indicate that we support LOCK and UNLOCK + * + * @param string $path + * @return string[] + */ + public function getHTTPMethods($path) { + return [ + 'LOCK', + 'UNLOCK', + ]; + } + + /** + * Indicate that we support locking + * + * @return integer[] + */ + function getFeatures() { + return [2]; + } + + /** + * Return some dummy response for PROPFIND requests with regard to locking + * + * @param PropFind $propFind + * @param INode $node + * @return void + */ + function propFind(PropFind $propFind, INode $node) { + $propFind->handle('{DAV:}supportedlock', function() { + return new SupportedLock(true); + }); + $propFind->handle('{DAV:}lockdiscovery', function() use ($propFind) { + return new LockDiscovery([]); + }); + } + + /** + * Mark a locking token always as valid + * + * @param RequestInterface $request + * @param array $conditions + */ + public function validateTokens(RequestInterface $request, &$conditions) { + foreach($conditions as &$fileCondition) { + if(isset($fileCondition['tokens'])) { + foreach($fileCondition['tokens'] as &$token) { + if(isset($token['token'])) { + if(substr($token['token'], 0, 16) === 'opaquelocktoken:') { + $token['validToken'] = true; + } + } + } + } + } + } + + /** + * Fakes a successful LOCK + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return bool + */ + public function fakeLockProvider(RequestInterface $request, + ResponseInterface $response) { + + $lockInfo = new LockInfo(); + $lockInfo->token = md5($request->getPath()); + $lockInfo->uri = $request->getPath(); + $lockInfo->depth = \Sabre\DAV\Server::DEPTH_INFINITY; + $lockInfo->timeout = 1800; + + $body = $this->server->xml->write('{DAV:}prop', [ + '{DAV:}lockdiscovery' => + new LockDiscovery([$lockInfo]) + ]); + + $response->setBody($body); + + return false; + } + + /** + * Fakes a successful LOCK + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return bool + */ + public function fakeUnlockProvider(RequestInterface $request, + ResponseInterface $response) { + $response->setStatus(204); + $response->setHeader('Content-Length', '0'); + return false; + } +} diff --git a/apps/dav/lib/connector/sabre/file.php b/apps/dav/lib/connector/sabre/file.php index 961532daf5..c66f627c0a 100644 --- a/apps/dav/lib/connector/sabre/file.php +++ b/apps/dav/lib/connector/sabre/file.php @@ -35,9 +35,11 @@ namespace OCA\DAV\Connector\Sabre; use OC\Files\Filesystem; use OCA\DAV\Connector\Sabre\Exception\EntityTooLarge; use OCA\DAV\Connector\Sabre\Exception\FileLocked; +use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException; use OCA\DAV\Connector\Sabre\Exception\UnsupportedMediaType; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\Files\EntityTooLargeException; +use OCP\Files\ForbiddenException; use OCP\Files\InvalidContentException; use OCP\Files\InvalidPathException; use OCP\Files\LockNotAcquiredException; @@ -175,6 +177,8 @@ class File extends Node implements IFile { \OCP\Util::writeLog('webdav', 'renaming part file to final file failed', \OCP\Util::ERROR); throw new Exception('Could not rename part file to final file'); } + } catch (ForbiddenException $ex) { + throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry()); } catch (\Exception $e) { $partStorage->unlink($internalPartPath); $this->convertToSabreException($e); @@ -188,7 +192,7 @@ class File extends Node implements IFile { } // since we skipped the view we need to scan and emit the hooks ourselves - $this->fileView->getUpdater()->update($this->path); + $storage->getUpdater()->update($internalPath); if ($view) { $this->emitPostHooks($exists); @@ -209,6 +213,9 @@ class File extends Node implements IFile { return '"' . $this->info->getEtag() . '"'; } + /** + * @param string $path + */ private function emitPreHooks($exists, $path = null) { if (is_null($path)) { $path = $this->path; @@ -234,6 +241,9 @@ class File extends Node implements IFile { return $run; } + /** + * @param string $path + */ private function emitPostHooks($exists, $path = null) { if (is_null($path)) { $path = $this->path; @@ -256,7 +266,7 @@ class File extends Node implements IFile { /** * Returns the data * - * @return string|resource + * @return resource * @throws Forbidden * @throws ServiceUnavailable */ @@ -273,6 +283,8 @@ class File extends Node implements IFile { throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage()); } catch (StorageNotAvailableException $e) { throw new ServiceUnavailable("Failed to open file: " . $e->getMessage()); + } catch (ForbiddenException $ex) { + throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } @@ -296,6 +308,8 @@ class File extends Node implements IFile { } } catch (StorageNotAvailableException $e) { throw new ServiceUnavailable("Failed to unlink: " . $e->getMessage()); + } catch (ForbiddenException $ex) { + throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } @@ -306,7 +320,7 @@ class File extends Node implements IFile { * * If null is returned, we'll assume application/octet-stream * - * @return mixed + * @return string */ public function getContentType() { $mimeType = $this->info->getMimetype(); @@ -424,7 +438,7 @@ class File extends Node implements IFile { $this->fileView->changeLock($targetPath, ILockingProvider::LOCK_SHARED); // since we skipped the view we need to scan and emit the hooks ourselves - $this->fileView->getUpdater()->update($targetPath); + $targetStorage->getUpdater()->update($targetInternalPath); $this->emitPostHooks($exists, $targetPath); @@ -474,6 +488,10 @@ class File extends Node implements IFile { // a more general case - due to whatever reason the content could not be written throw new Forbidden($e->getMessage(), 0, $e); } + if ($e instanceof ForbiddenException) { + // the path for the file was forbidden + throw new DAVForbiddenException($e->getMessage(), $e->getRetry(), $e); + } if ($e instanceof EntityTooLargeException) { // the file is too big to be stored throw new EntityTooLarge($e->getMessage(), 0, $e); diff --git a/apps/dav/lib/connector/sabre/filesplugin.php b/apps/dav/lib/connector/sabre/filesplugin.php index 61b5360cac..e85a67a875 100644 --- a/apps/dav/lib/connector/sabre/filesplugin.php +++ b/apps/dav/lib/connector/sabre/filesplugin.php @@ -37,11 +37,14 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { // namespace const NS_OWNCLOUD = 'http://owncloud.org/ns'; const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id'; + const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid'; const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions'; const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL'; const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size'; const GETETAG_PROPERTYNAME = '{DAV:}getetag'; const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified'; + const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id'; + const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name'; /** * Reference to main server object @@ -96,9 +99,12 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { $server->xmlNamespaces[self::NS_OWNCLOUD] = 'oc'; $server->protectedProperties[] = self::FILEID_PROPERTYNAME; + $server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME; $server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME; $server->protectedProperties[] = self::SIZE_PROPERTYNAME; $server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME; + $server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME; + $server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME; // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH $allowedProperties = ['{DAV:}getetag']; @@ -110,6 +116,7 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { $this->server->on('afterBind', array($this, 'sendFileIdHeader')); $this->server->on('afterWriteContent', array($this, 'sendFileIdHeader')); $this->server->on('afterMethod:GET', [$this,'httpGet']); + $this->server->on('afterMethod:GET', array($this, 'handleDownloadToken')); $this->server->on('afterResponse', function($request, ResponseInterface $response) { $body = $response->getBody(); if (is_resource($body)) { @@ -142,6 +149,32 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { } } + /** + * 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 + * + * @param RequestInterface $request + * @param ResponseInterface $response + */ + function handleDownloadToken(RequestInterface $request, ResponseInterface $response) { + $queryParams = $request->getQueryParameters(); + + /** + * 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($queryParams['downloadStartSecret'])) { + $token = $queryParams['downloadStartSecret']; + if (!isset($token[32]) + && preg_match('!^[a-zA-Z0-9]+$!', $token) === 1) { + // FIXME: use $response->setHeader() instead + setcookie('ocDownloadStarted', $token, time() + 20, '/'); + } + } + } + /** * Plugin that adds a 'Content-Disposition: attachment' header to all files * delivered by SabreDAV. @@ -171,6 +204,10 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { return $node->getFileId(); }); + $propFind->handle(self::INTERNAL_FILEID_PROPERTYNAME, function() use ($node) { + return $node->getInternalFileId(); + }); + $propFind->handle(self::PERMISSIONS_PROPERTYNAME, function() use ($node) { $perms = $node->getDavPermissions(); if ($this->isPublic) { @@ -201,6 +238,16 @@ class FilesPlugin extends \Sabre\DAV\ServerPlugin { return $node->getSize(); }); } + + $propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) { + $owner = $node->getOwner(); + return $owner->getUID(); + }); + $propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) { + $owner = $node->getOwner(); + $displayName = $owner->getDisplayName(); + return $displayName; + }); } /** diff --git a/apps/dav/lib/connector/sabre/lockplugin.php b/apps/dav/lib/connector/sabre/lockplugin.php index 5840e59854..d770b141eb 100644 --- a/apps/dav/lib/connector/sabre/lockplugin.php +++ b/apps/dav/lib/connector/sabre/lockplugin.php @@ -27,7 +27,6 @@ use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use Sabre\DAV\Exception\NotFound; use Sabre\DAV\ServerPlugin; -use Sabre\DAV\Tree; use Sabre\HTTP\RequestInterface; class LockPlugin extends ServerPlugin { @@ -38,18 +37,6 @@ class LockPlugin extends ServerPlugin { */ private $server; - /** - * @var \Sabre\DAV\Tree - */ - private $tree; - - /** - * @param \Sabre\DAV\Tree $tree tree - */ - public function __construct(Tree $tree) { - $this->tree = $tree; - } - /** * {@inheritdoc} */ @@ -66,7 +53,7 @@ class LockPlugin extends ServerPlugin { return; } try { - $node = $this->tree->getNodeForPath($request->getPath()); + $node = $this->server->tree->getNodeForPath($request->getPath()); } catch (NotFound $e) { return; } @@ -84,7 +71,7 @@ class LockPlugin extends ServerPlugin { return; } try { - $node = $this->tree->getNodeForPath($request->getPath()); + $node = $this->server->tree->getNodeForPath($request->getPath()); } catch (NotFound $e) { return; } diff --git a/apps/dav/lib/connector/sabre/node.php b/apps/dav/lib/connector/sabre/node.php index 814aaceb07..c4e0614077 100644 --- a/apps/dav/lib/connector/sabre/node.php +++ b/apps/dav/lib/connector/sabre/node.php @@ -178,7 +178,7 @@ abstract class Node implements \Sabre\DAV\INode { /** * Returns the size of the node, in bytes * - * @return int|float + * @return integer */ public function getSize() { return $this->info->getSize(); @@ -207,7 +207,14 @@ abstract class Node implements \Sabre\DAV\INode { } /** - * @return string|null + * @return integer + */ + public function getInternalFileId() { + return $this->info->getId(); + } + + /** + * @return string */ public function getDavPermissions() { $p = ''; @@ -238,6 +245,10 @@ abstract class Node implements \Sabre\DAV\INode { return $p; } + public function getOwner() { + return $this->info->getOwner(); + } + protected function verifyPath() { try { $fileName = basename($this->info->getPath()); diff --git a/apps/dav/lib/connector/sabre/objecttree.php b/apps/dav/lib/connector/sabre/objecttree.php index 80c0ef7461..2e9c1b9916 100644 --- a/apps/dav/lib/connector/sabre/objecttree.php +++ b/apps/dav/lib/connector/sabre/objecttree.php @@ -25,10 +25,12 @@ namespace OCA\DAV\Connector\Sabre; +use OCA\DAV\Connector\Sabre\Exception\Forbidden; use OCA\DAV\Connector\Sabre\Exception\InvalidPath; use OCA\DAV\Connector\Sabre\Exception\FileLocked; use OC\Files\FileInfo; use OC\Files\Mount\MoveableMount; +use OCP\Files\ForbiddenException; use OCP\Files\StorageInvalidException; use OCP\Files\StorageNotAvailableException; use OCP\Lock\LockedException; @@ -235,6 +237,8 @@ class ObjectTree extends \Sabre\DAV\Tree { } } catch (StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } @@ -274,6 +278,8 @@ class ObjectTree extends \Sabre\DAV\Tree { $this->fileView->copy($source, $destination); } catch (StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { throw new FileLocked($e->getMessage(), $e->getCode(), $e); } diff --git a/apps/dav/lib/connector/sabre/principal.php b/apps/dav/lib/connector/sabre/principal.php index 35215e1f63..cc9c1c40d5 100644 --- a/apps/dav/lib/connector/sabre/principal.php +++ b/apps/dav/lib/connector/sabre/principal.php @@ -30,9 +30,11 @@ namespace OCA\DAV\Connector\Sabre; +use OCP\IUser; use OCP\IUserManager; use OCP\IConfig; use \Sabre\DAV\PropPatch; +use Sabre\HTTP\URLUtil; class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { /** @var IConfig */ @@ -66,20 +68,9 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { public function getPrincipalsByPrefix($prefixPath) { $principals = []; - if ($prefixPath === 'principals') { + if ($prefixPath === 'principals/users') { foreach($this->userManager->search('') as $user) { - - $principal = [ - 'uri' => 'principals/' . $user->getUID(), - '{DAV:}displayname' => $user->getUID(), - ]; - - $email = $this->config->getUserValue($user->getUID(), 'settings', 'email'); - if(!empty($email)) { - $principal['{http://sabredav.org/ns}email-address'] = $email; - } - - $principals[] = $principal; + $principals[] = $this->userToPrincipal($user); } } @@ -95,21 +86,18 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { * @return array */ public function getPrincipalByPath($path) { - list($prefix, $name) = explode('/', $path); + $elements = explode('/', $path); + if ($elements[0] !== 'principals') { + return null; + } + if ($elements[1] !== 'users') { + return null; + } + $name = $elements[2]; $user = $this->userManager->get($name); - if ($prefix === 'principals' && !is_null($user)) { - $principal = [ - 'uri' => 'principals/' . $user->getUID(), - '{DAV:}displayname' => $user->getUID(), - ]; - - $email = $this->config->getUserValue($user->getUID(), 'settings', 'email'); - if($email) { - $principal['{http://sabredav.org/ns}email-address'] = $email; - } - - return $principal; + if (!is_null($user)) { + return $this->userToPrincipal($user); } return null; @@ -140,10 +128,10 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { * @throws \Sabre\DAV\Exception */ public function getGroupMembership($principal) { - list($prefix, $name) = \Sabre\HTTP\URLUtil::splitPath($principal); + list($prefix, $name) = URLUtil::splitPath($principal); $group_membership = array(); - if ($prefix === 'principals') { + if ($prefix === 'principals/users') { $principal = $this->getPrincipalByPath($principal); if (!$principal) { throw new \Sabre\DAV\Exception('Principal not found'); @@ -151,8 +139,8 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { // TODO: for now the user principal has only its own groups return array( - 'principals/'.$name.'/calendar-proxy-read', - 'principals/'.$name.'/calendar-proxy-write', + 'principals/users/'.$name.'/calendar-proxy-read', + 'principals/users/'.$name.'/calendar-proxy-write', // The addressbook groups are not supported in Sabre, // see http://groups.google.com/group/sabredav-discuss/browse_thread/thread/ef2fa9759d55f8c#msg_5720afc11602e753 //'principals/'.$name.'/addressbook-proxy-read', @@ -168,7 +156,7 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { * The principals should be passed as a list of uri's. * * @param string $principal - * @param array $members + * @param string[] $members * @throws \Sabre\DAV\Exception */ public function setGroupMemberSet($principal, array $members) { @@ -202,4 +190,24 @@ class Principal implements \Sabre\DAVACL\PrincipalBackend\BackendInterface { function findByUri($uri, $principalPrefix) { return ''; } + + /** + * @param IUser $user + * @return array + */ + protected function userToPrincipal($user) { + $userId = $user->getUID(); + $displayName = $user->getDisplayName(); + $principal = [ + 'uri' => "principals/users/$userId", + '{DAV:}displayname' => is_null($displayName) ? $userId : $displayName, + ]; + + $email = $user->getEMailAddress(); + if (!empty($email)) { + $principal['{http://sabredav.org/ns}email-address'] = $email; + return $principal; + } + return $principal; + } } diff --git a/apps/dav/lib/connector/sabre/serverfactory.php b/apps/dav/lib/connector/sabre/serverfactory.php index f67e949e80..0f0377e96b 100644 --- a/apps/dav/lib/connector/sabre/serverfactory.php +++ b/apps/dav/lib/connector/sabre/serverfactory.php @@ -26,12 +26,41 @@ use OCP\Files\Mount\IMountManager; use OCP\IConfig; use OCP\IDBConnection; use OCP\ILogger; +use OCP\IRequest; use OCP\ITagManager; use OCP\IUserSession; use Sabre\DAV\Auth\Backend\BackendInterface; +use Sabre\DAV\Locks\Plugin; use Symfony\Component\EventDispatcher\EventDispatcherInterface; class ServerFactory { + /** @var IConfig */ + private $config; + /** @var ILogger */ + private $logger; + /** @var IDBConnection */ + private $databaseConnection; + /** @var IUserSession */ + private $userSession; + /** @var IMountManager */ + private $mountManager; + /** @var ITagManager */ + private $tagManager; + /** @var EventDispatcherInterface */ + private $dispatcher; + /** @var IRequest */ + private $request; + + /** + * @param IConfig $config + * @param ILogger $logger + * @param IDBConnection $databaseConnection + * @param IUserSession $userSession + * @param IMountManager $mountManager + * @param ITagManager $tagManager + * @param EventDispatcherInterface $dispatcher + * @param IRequest $request + */ public function __construct( IConfig $config, ILogger $logger, @@ -39,7 +68,8 @@ class ServerFactory { IUserSession $userSession, IMountManager $mountManager, ITagManager $tagManager, - EventDispatcherInterface $dispatcher + EventDispatcherInterface $dispatcher, + IRequest $request ) { $this->config = $config; $this->logger = $logger; @@ -48,6 +78,7 @@ class ServerFactory { $this->mountManager = $mountManager; $this->tagManager = $tagManager; $this->dispatcher = $dispatcher; + $this->request = $request; } /** @@ -57,7 +88,10 @@ class ServerFactory { * @param callable $viewCallBack callback that should return the view for the dav endpoint * @return Server */ - public function createServer($baseUri, $requestUri, BackendInterface $authBackend, callable $viewCallBack) { + public function createServer($baseUri, + $requestUri, + BackendInterface $authBackend, + callable $viewCallBack) { // Fire up server $objectTree = new \OCA\DAV\Connector\Sabre\ObjectTree(); $server = new \OCA\DAV\Connector\Sabre\Server($objectTree); @@ -73,8 +107,13 @@ class ServerFactory { // FIXME: The following line is a workaround for legacy components relying on being able to send a GET to / $server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin()); $server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $this->logger)); - $server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin($objectTree)); + $server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin()); $server->addPlugin(new \OCA\DAV\Connector\Sabre\ListenerPlugin($this->dispatcher)); + // Finder on OS X requires Class 2 WebDAV support (locking), since we do + // not provide locking we emulate it using a fake locking plugin. + if($this->request->isUserAgent(['/WebDAVFS/'])) { + $server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin()); + } // wait with registering these until auth is handled and the filesystem is setup $server->on('beforeMethod', function () use ($server, $objectTree, $viewCallBack) { diff --git a/apps/dav/lib/connector/sabre/taglist.php b/apps/dav/lib/connector/sabre/taglist.php index 177cc23e80..1b32d4b104 100644 --- a/apps/dav/lib/connector/sabre/taglist.php +++ b/apps/dav/lib/connector/sabre/taglist.php @@ -22,82 +22,100 @@ namespace OCA\DAV\Connector\Sabre; -use Sabre\DAV; +use Sabre\Xml\Element; +use Sabre\Xml\Reader; +use Sabre\Xml\Writer; /** * TagList property * * This property contains multiple "tag" elements, each containing a tag name. */ -class TagList extends DAV\Property { +class TagList implements Element { const NS_OWNCLOUD = 'http://owncloud.org/ns'; - /** - * tags - * - * @var array - */ - private $tags; + /** + * tags + * + * @var array + */ + private $tags; - /** - * @param array $tags - */ - public function __construct(array $tags) { - $this->tags = $tags; - } + /** + * @param array $tags + */ + public function __construct(array $tags) { + $this->tags = $tags; + } - /** - * Returns the tags - * - * @return array - */ - public function getTags() { + /** + * Returns the tags + * + * @return array + */ + public function getTags() { - return $this->tags; + return $this->tags; - } + } - /** - * Serializes this property. - * - * @param DAV\Server $server - * @param \DOMElement $dom - * @return void - */ - public function serialize(DAV\Server $server,\DOMElement $dom) { + /** + * The deserialize method is called during xml parsing. + * + * This method is called statictly, this is because in theory this method + * may be used as a type of constructor, or factory method. + * + * Often you want to return an instance of the current class, but you are + * free to return other data as well. + * + * You are responsible for advancing the reader to the next element. Not + * doing anything will result in a never-ending loop. + * + * If you just want to skip parsing for this element altogether, you can + * just call $reader->next(); + * + * $reader->parseInnerTree() will parse the entire sub-tree, and advance to + * the next element. + * + * @param Reader $reader + * @return mixed + */ + static function xmlDeserialize(Reader $reader) { + $tags = []; - $prefix = $server->xmlNamespaces[self::NS_OWNCLOUD]; + foreach ($reader->parseInnerTree() as $elem) { + if ($elem['name'] === '{' . self::NS_OWNCLOUD . '}tag') { + $tags[] = $elem['value']; + } + } + return new self($tags); + } - foreach($this->tags as $tag) { - - $elem = $dom->ownerDocument->createElement($prefix . ':tag'); - $elem->appendChild($dom->ownerDocument->createTextNode($tag)); - - $dom->appendChild($elem); - } - - } - - /** - * Unserializes this property from a DOM Element - * - * This method returns an instance of this class. - * It will only decode tag values. - * - * @param \DOMElement $dom - * @param array $propertyMap - * @return \OCA\DAV\Connector\Sabre\TagList - */ - static function unserialize(\DOMElement $dom, array $propertyMap) { - - $tags = array(); - foreach($dom->childNodes as $child) { - if (DAV\XMLUtil::toClarkNotation($child)==='{' . self::NS_OWNCLOUD . '}tag') { - $tags[] = $child->textContent; - } - } - return new self($tags); - - } + /** + * The xmlSerialize metod is called during xml writing. + * + * Use the $writer argument to write its own xml serialization. + * + * An important note: do _not_ create a parent element. Any element + * implementing XmlSerializble should only ever write what's considered + * its 'inner xml'. + * + * The parent of the current element is responsible for writing a + * containing element. + * + * This allows serializers to be re-used for different element names. + * + * If you are opening new elements, you must also close them again. + * + * @param Writer $writer + * @return void + */ + function xmlSerialize(Writer $writer) { + foreach ($this->tags as $tag) { + $writer->startElement(self::NS_OWNCLOUD . ':tag'); + $writer->writeElement($tag); + $writer->endElement(); + } + } } diff --git a/apps/dav/lib/dav/systemprincipalbackend.php b/apps/dav/lib/dav/systemprincipalbackend.php new file mode 100644 index 0000000000..2c2049ace6 --- /dev/null +++ b/apps/dav/lib/dav/systemprincipalbackend.php @@ -0,0 +1,183 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\DAV; + +use Sabre\DAVACL\PrincipalBackend\AbstractBackend; +use Sabre\HTTP\URLUtil; + +class SystemPrincipalBackend extends AbstractBackend { + + /** + * Returns a list of principals based on a prefix. + * + * This prefix will often contain something like 'principals'. You are only + * expected to return principals that are in this base path. + * + * You are expected to return at least a 'uri' for every user, you can + * return any additional properties if you wish so. Common properties are: + * {DAV:}displayname + * {http://sabredav.org/ns}email-address - This is a custom SabreDAV + * field that's actually injected in a number of other properties. If + * you have an email address, use this property. + * + * @param string $prefixPath + * @return array + */ + function getPrincipalsByPrefix($prefixPath) { + $principals = []; + + if ($prefixPath === 'principals/system') { + $principals[] = [ + 'uri' => 'principals/system/system', + '{DAV:}displayname' => 'system', + ]; + } + + return $principals; + } + + /** + * Returns a specific principal, specified by it's path. + * The returned structure should be the exact same as from + * getPrincipalsByPrefix. + * + * @param string $path + * @return array + */ + function getPrincipalByPath($path) { + + $elements = explode('/', $path); + if ($elements[0] !== 'principals') { + return null; + } + if ($elements[1] === 'system') { + $principal = [ + 'uri' => 'principals/system/system', + '{DAV:}displayname' => 'system', + ]; + return $principal; + } + + return null; + } + + /** + * Updates one ore more webdav properties on a principal. + * + * The list of mutations is stored in a Sabre\DAV\PropPatch object. + * To do the actual updates, you must tell this object which properties + * you're going to process with the handle() method. + * + * Calling the handle method is like telling the PropPatch object "I + * promise I can handle updating this property". + * + * Read the PropPatch documentation for more info and examples. + * + * @param string $path + * @param \Sabre\DAV\PropPatch $propPatch + * @return void + */ + function updatePrincipal($path, \Sabre\DAV\PropPatch $propPatch) { + } + + /** + * This method is used to search for principals matching a set of + * properties. + * + * This search is specifically used by RFC3744's principal-property-search + * REPORT. + * + * The actual search should be a unicode-non-case-sensitive search. The + * keys in searchProperties are the WebDAV property names, while the values + * are the property values to search on. + * + * By default, if multiple properties are submitted to this method, the + * various properties should be combined with 'AND'. If $test is set to + * 'anyof', it should be combined using 'OR'. + * + * This method should simply return an array with full principal uri's. + * + * If somebody attempted to search on a property the backend does not + * support, you should simply return 0 results. + * + * You can also just return 0 results if you choose to not support + * searching at all, but keep in mind that this may stop certain features + * from working. + * + * @param string $prefixPath + * @param array $searchProperties + * @param string $test + * @return array + */ + function searchPrincipals($prefixPath, array $searchProperties, $test = 'allof') { + return []; + } + + /** + * Returns the list of members for a group-principal + * + * @param string $principal + * @return array + */ + function getGroupMemberSet($principal) { + // TODO: for now the group principal has only one member, the user itself + $principal = $this->getPrincipalByPath($principal); + if (!$principal) { + throw new \Sabre\DAV\Exception('Principal not found'); + } + + return [$principal['uri']]; + } + + /** + * Returns the list of groups a principal is a member of + * + * @param string $principal + * @return array + */ + function getGroupMembership($principal) { + list($prefix, $name) = URLUtil::splitPath($principal); + + if ($prefix === 'principals/system') { + $principal = $this->getPrincipalByPath($principal); + if (!$principal) { + throw new \Sabre\DAV\Exception('Principal not found'); + } + + return []; + } + return []; + } + + /** + * Updates the list of group members for a group principal. + * + * The principals should be passed as a list of uri's. + * + * @param string $principal + * @param array $members + * @return void + */ + function setGroupMemberSet($principal, array $members) { + throw new \Sabre\DAV\Exception('Setting members of the group is not supported yet'); + } +} diff --git a/apps/dav/lib/rootcollection.php b/apps/dav/lib/rootcollection.php index 850180d848..c1635c9cde 100644 --- a/apps/dav/lib/rootcollection.php +++ b/apps/dav/lib/rootcollection.php @@ -2,36 +2,55 @@ namespace OCA\DAV; +use OCA\DAV\CalDAV\CalDavBackend; +use OCA\DAV\CardDAV\AddressBookRoot; use OCA\DAV\CardDAV\CardDavBackend; use OCA\DAV\Connector\Sabre\Principal; +use OCA\DAV\DAV\SystemPrincipalBackend; +use Sabre\CalDAV\CalendarRoot; use Sabre\CalDAV\Principal\Collection; -use Sabre\CardDAV\AddressBookRoot; use Sabre\DAV\SimpleCollection; class RootCollection extends SimpleCollection { public function __construct() { $config = \OC::$server->getConfig(); + $db = \OC::$server->getDatabaseConnection(); $principalBackend = new Principal( - $config, - \OC::$server->getUserManager() + $config, + \OC::$server->getUserManager() ); // as soon as debug mode is enabled we allow listing of principals $disableListing = !$config->getSystemValue('debug', false); // setup the first level of the dav tree - $principalCollection = new Collection($principalBackend); - $principalCollection->disableListing = $disableListing; - $filesCollection = new Files\RootCollection($principalBackend); + $userPrincipals = new Collection($principalBackend, 'principals/users'); + $userPrincipals->disableListing = $disableListing; + $systemPrincipals = new Collection(new SystemPrincipalBackend(), 'principals/system'); + $systemPrincipals->disableListing = $disableListing; + $filesCollection = new Files\RootCollection($principalBackend, 'principals/users'); $filesCollection->disableListing = $disableListing; - $cardDavBackend = new CardDavBackend(\OC::$server->getDatabaseConnection()); - $addressBookRoot = new AddressBookRoot($principalBackend, $cardDavBackend); - $addressBookRoot->disableListing = $disableListing; + $caldavBackend = new CalDavBackend($db); + $calendarRoot = new CalendarRoot($principalBackend, $caldavBackend, 'principals/users'); + $calendarRoot->disableListing = $disableListing; + + $usersCardDavBackend = new CardDavBackend($db, $principalBackend); + $usersAddressBookRoot = new AddressBookRoot($principalBackend, $usersCardDavBackend, 'principals/users'); + $usersAddressBookRoot->disableListing = $disableListing; + + $systemCardDavBackend = new CardDavBackend($db, $principalBackend); + $systemAddressBookRoot = new AddressBookRoot(new SystemPrincipalBackend(), $systemCardDavBackend, 'principals/system'); + $systemAddressBookRoot->disableListing = $disableListing; $children = [ - $principalCollection, - $filesCollection, - $addressBookRoot, + new SimpleCollection('principals', [ + $userPrincipals, + $systemPrincipals]), + $filesCollection, + $calendarRoot, + new SimpleCollection('addressbooks', [ + $usersAddressBookRoot, + $systemAddressBookRoot]), ]; parent::__construct('root', $children); diff --git a/apps/dav/lib/server.php b/apps/dav/lib/server.php index a92c9980f5..a031f2c442 100644 --- a/apps/dav/lib/server.php +++ b/apps/dav/lib/server.php @@ -17,6 +17,9 @@ class Server { public function __construct(IRequest $request, $baseUri) { $this->request = $request; $this->baseUri = $baseUri; + $logger = \OC::$server->getLogger(); + $dispatcher = \OC::$server->getEventDispatcher(); + $root = new RootCollection(); $this->server = new \OCA\DAV\Connector\Sabre\Server($root); @@ -32,10 +35,36 @@ class Server { $this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig())); $this->server->addPlugin(new Plugin($authBackend, 'ownCloud')); + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\DummyGetResponsePlugin()); + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin('webdav', $logger)); + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\LockPlugin()); + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\ListenerPlugin($dispatcher)); + $this->server->addPlugin(new \Sabre\DAV\Sync\Plugin()); - $this->server->addPlugin(new \Sabre\DAVACL\Plugin()); + // acl + $acl = new \Sabre\DAVACL\Plugin(); + $acl->defaultUsernamePath = 'principals/users'; + $this->server->addPlugin($acl); - $this->server->addPlugin(new \Sabre\CardDAV\Plugin()); + // calendar plugins + $this->server->addPlugin(new \Sabre\CalDAV\Plugin()); + $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); + $senderEmail = \OCP\Util::getDefaultEmailAddress('no-reply'); + $this->server->addPlugin(new \Sabre\CalDAV\Schedule\Plugin()); + $this->server->addPlugin(new \Sabre\CalDAV\Schedule\IMipPlugin($senderEmail)); + $this->server->addPlugin(new \Sabre\CalDAV\SharingPlugin()); + $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); + $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin()); + $this->server->addPlugin(new CardDAV\Sharing\Plugin($authBackend, \OC::$server->getRequest())); + + // addressbook plugins + $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); + + // Finder on OS X requires Class 2 WebDAV support (locking), since we do + // not provide locking we emulate it using a fake locking plugin. + if($request->isUserAgent(['/WebDAVFS/'])) { + $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FakeLockerPlugin()); + } // wait with registering these until auth is handled and the filesystem is setup $this->server->on('beforeMethod', function () { diff --git a/apps/dav/tests/misc/sharing.xml b/apps/dav/tests/misc/sharing.xml new file mode 100644 index 0000000000..8771256ce7 --- /dev/null +++ b/apps/dav/tests/misc/sharing.xml @@ -0,0 +1,7 @@ + + + + principal:principals/admin + + + diff --git a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml b/apps/dav/tests/travis/caldavtest/config/serverinfo.xml index b85a8639e4..c80e47f948 100644 --- a/apps/dav/tests/travis/caldavtest/config/serverinfo.xml +++ b/apps/dav/tests/travis/caldavtest/config/serverinfo.xml @@ -180,7 +180,7 @@ $principalcollection: - $root:principals/ + $root:principals/users/ @@ -569,7 +569,7 @@ $addressbookhome%d: - $addressbooks_uids:$userguid%d: + $addressbooks:users/$userid%d: diff --git a/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml new file mode 100644 index 0000000000..ffa6662981 --- /dev/null +++ b/apps/dav/tests/travis/caldavtest/tests/CardDAV/sync-report.xml @@ -0,0 +1,1602 @@ + + + + + + + + + carddav + sync-report + + + + + PUT + $addressbookpath1:/1.vcf + + text/vcard; charset=utf-8 + Resource/CardDAV/vreports/put/1.vcf + + + + PUT + $addressbookpath1:/2.vcf + + text/vcard; charset=utf-8 + Resource/CardDAV/vreports/put/2.vcf + + + + + + + Not on addressbooks + + PROPFIND + $addressbooks:/ +
+ Depth + 0 +
+ + text/xml; charset=utf-8 + Resource/CardDAV/vreports/sync/1.xml + + + xmlElementMatch + + notexists + $verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection + + + + propfindItems + + okprops + {DAV:}supported-report-set + + + badprops + {DAV:}sync-token + + +
+
+ + + On addressbook + + PROPFIND + $addressbookpath1:/ +
+ Depth + 0 +
+ + text/xml; charset=utf-8 + Resource/CardDAV/vreports/sync/1.xml + + + xmlElementMatch + + exists + $verify-property-prefix:/{DAV:}supported-report-set/{DAV:}supported-report/{DAV:}report/{DAV:}sync-collection + + + + + + propfindItems + + okprops + {DAV:}supported-report-set + {DAV:}sync-token + + +
+
+
+ + + + initial query - addressbook depth:1 + + REPORT + $addressbookpath1:/ +
+ Depth + 1 +
+ + text/xml; charset=utf-8 + Resource/CardDAV/vreports/sync/2.xml + + + multistatusItems + + okhrefs + + + 1.vcf + 2.vcf + + +
+
+ + + add new resource + + PUT + $addressbookpath1:/3.vcf + + text/vcard; charset=utf-8 + Resource/CardDAV/vreports/put/3.vcf + + + statusCode + + + + + new resource - addressbook depth:1 + + REPORT + $addressbookpath1:/ +
+ Depth + 1 +
+ + text/xml; charset=utf-8 + Resource/CardDAV/vreports/sync/2.xml + + + multistatusItems + + okhrefs + + + 1.vcf + 2.vcf + 3.vcf + + +
+
+ + + remove new resource + + DELETE + $addressbookpath1:/3.vcf + + statusCode + + + + + remove new resource - addressbook depth:1 + + REPORT + $addressbookpath1:/ +
+ Depth + 1 +
+ + text/xml; charset=utf-8 + Resource/CardDAV/vreports/sync/2.xml + + + multistatusItems + + okhrefs + + + 1.vcf + 2.vcf + + +
+
+ +
+ + + + + + DELETEALL + $addressbookhome1:/ + $addressbookhome2:/ + $notificationpath1:/ + $notificationpath2:/ + + + +
diff --git a/apps/dav/tests/travis/carddavtester.sh b/apps/dav/tests/travis/carddavtester.sh index a128872f42..17f7e8eb4a 100644 --- a/apps/dav/tests/travis/carddavtester.sh +++ b/apps/dav/tests/travis/carddavtester.sh @@ -18,11 +18,18 @@ fi # create test user cd "$SCRIPTPATH/../../../../" OC_PASS=user01 php occ user:add --password-from-env user01 +php occ dav:create-addressbook user01 addressbook OC_PASS=user02 php occ user:add --password-from-env user02 +php occ dav:create-addressbook user02 addressbook cd "$SCRIPTPATH/../../../../" # run the tests cd "$SCRIPTPATH/CalDAVTester" PYTHONPATH="$SCRIPTPATH/pycalendar/src" python testcaldav.py --print-details-onfail -s "$SCRIPTPATH/caldavtest/config/serverinfo.xml" -o cdt.txt \ - "$SCRIPTPATH/caldavtest/tests/CardDAV/current-user-principal.xml" + "$SCRIPTPATH/caldavtest/tests/CardDAV/current-user-principal.xml" \ + "$SCRIPTPATH/caldavtest/tests/CardDAV/sync-report.xml" +RESULT=$? +tail "$SCRIPTPATH/../../../../data-autotest/owncloud.log" + +exit $RESULT diff --git a/apps/dav/tests/unit/bootstrap.php b/apps/dav/tests/unit/bootstrap.php index 28f6b971de..b6ea48ec90 100644 --- a/apps/dav/tests/unit/bootstrap.php +++ b/apps/dav/tests/unit/bootstrap.php @@ -1,6 +1,8 @@ + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ +namespace Tests\Connector\Sabre; + +use DateTime; +use DateTimeZone; +use OCA\DAV\CalDAV\CalDavBackend; +use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet; +use Sabre\DAV\PropPatch; +use Sabre\DAV\Xml\Property\Href; +use Test\TestCase; + +/** + * Class CalDavBackendTest + * + * @group DB + * + * @package Tests\Connector\Sabre + */ +class CalDavBackendTest extends TestCase { + + /** @var CalDavBackend */ + private $backend; + + const UNIT_TEST_USER = 'caldav-unit-test'; + + + public function setUp() { + parent::setUp(); + + $db = \OC::$server->getDatabaseConnection(); + $this->backend = new CalDavBackend($db); + + $this->tearDown(); + } + + public function tearDown() { + parent::tearDown(); + + if (is_null($this->backend)) { + return; + } + $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + foreach ($books as $book) { + $this->backend->deleteCalendar($book['id']); + } + $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER); + foreach ($subscriptions as $subscription) { + $this->backend->deleteSubscription($subscription['id']); + } + } + + public function testCalendarOperations() { + + $calendarId = $this->createTestCalendar(); + + // update it's display name + $patch = new PropPatch([ + '{DAV:}displayname' => 'Unit test', + '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar used for unit testing' + ]); + $this->backend->updateCalendar($calendarId, $patch); + $patch->commit(); + $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($books)); + $this->assertEquals('Unit test', $books[0]['{DAV:}displayname']); + $this->assertEquals('Calendar used for unit testing', $books[0]['{urn:ietf:params:xml:ns:caldav}calendar-description']); + + // delete the address book + $this->backend->deleteCalendar($books[0]['id']); + $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertEquals(0, count($books)); + } + + public function testCalendarObjectsOperations() { + + $calendarId = $this->createTestCalendar(); + + // create a card + $uri = $this->getUniqueID('calobj'); + $calData = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8 +LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z +DTSTAMP;VALUE=DATE-TIME:20130910T125139Z +SUMMARY:Test Event +DTSTART;VALUE=DATE-TIME:20130912T130000Z +DTEND;VALUE=DATE-TIME:20130912T140000Z +CLASS:PUBLIC +END:VEVENT +END:VCALENDAR +EOD; + + $this->backend->createCalendarObject($calendarId, $uri, $calData); + + // get all the cards + $calendarObjects = $this->backend->getCalendarObjects($calendarId); + $this->assertEquals(1, count($calendarObjects)); + $this->assertEquals($calendarId, $calendarObjects[0]['calendarid']); + + // get the cards + $calendarObject = $this->backend->getCalendarObject($calendarId, $uri); + $this->assertNotNull($calendarObject); + $this->assertArrayHasKey('id', $calendarObject); + $this->assertArrayHasKey('uri', $calendarObject); + $this->assertArrayHasKey('lastmodified', $calendarObject); + $this->assertArrayHasKey('etag', $calendarObject); + $this->assertArrayHasKey('size', $calendarObject); + $this->assertEquals($calData, $calendarObject['calendardata']); + + // update the card + $calData = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8 +LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z +DTSTAMP;VALUE=DATE-TIME:20130910T125139Z +SUMMARY:Test Event +DTSTART;VALUE=DATE-TIME:20130912T130000Z +DTEND;VALUE=DATE-TIME:20130912T140000Z +END:VEVENT +END:VCALENDAR +EOD; + $this->backend->updateCalendarObject($calendarId, $uri, $calData); + $calendarObject = $this->backend->getCalendarObject($calendarId, $uri); + $this->assertEquals($calData, $calendarObject['calendardata']); + + // delete the card + $this->backend->deleteCalendarObject($calendarId, $uri); + $calendarObjects = $this->backend->getCalendarObjects($calendarId); + $this->assertEquals(0, count($calendarObjects)); + } + + public function testMultiCalendarObjects() { + + $calendarId = $this->createTestCalendar(); + + // create an event + $calData = <<<'EOD' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:ownCloud Calendar +BEGIN:VEVENT +CREATED;VALUE=DATE-TIME:20130910T125139Z +UID:47d15e3ec8 +LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z +DTSTAMP;VALUE=DATE-TIME:20130910T125139Z +SUMMARY:Test Event +DTSTART;VALUE=DATE-TIME:20130912T130000Z +DTEND;VALUE=DATE-TIME:20130912T140000Z +CLASS:PUBLIC +END:VEVENT +END:VCALENDAR +EOD; + $uri0 = $this->getUniqueID('card'); + $this->backend->createCalendarObject($calendarId, $uri0, $calData); + $uri1 = $this->getUniqueID('card'); + $this->backend->createCalendarObject($calendarId, $uri1, $calData); + $uri2 = $this->getUniqueID('card'); + $this->backend->createCalendarObject($calendarId, $uri2, $calData); + + // get all the cards + $calendarObjects = $this->backend->getCalendarObjects($calendarId); + $this->assertEquals(3, count($calendarObjects)); + + // get the cards + $calendarObjects = $this->backend->getMultipleCalendarObjects($calendarId, [$uri1, $uri2]); + $this->assertEquals(2, count($calendarObjects)); + foreach($calendarObjects as $card) { + $this->assertArrayHasKey('id', $card); + $this->assertArrayHasKey('uri', $card); + $this->assertArrayHasKey('lastmodified', $card); + $this->assertArrayHasKey('etag', $card); + $this->assertArrayHasKey('size', $card); + $this->assertEquals($calData, $card['calendardata']); + } + + // delete the card + $this->backend->deleteCalendarObject($calendarId, $uri0); + $this->backend->deleteCalendarObject($calendarId, $uri1); + $this->backend->deleteCalendarObject($calendarId, $uri2); + $calendarObjects = $this->backend->getCalendarObjects($calendarId); + $this->assertEquals(0, count($calendarObjects)); + } + + /** + * @dataProvider providesCalendarQueryParameters + */ + public function testCalendarQuery($expectedEventsInResult, $propFilters, $compFilter) { + $calendarId = $this->createTestCalendar(); + $events = []; + $events[0] = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z'); + $events[1] = $this->createEvent($calendarId, '20130912T150000Z', '20130912T170000Z'); + $events[2] = $this->createEvent($calendarId, '20130912T173000Z', '20130912T220000Z'); + + $result = $this->backend->calendarQuery($calendarId, [ + 'name' => '', + 'prop-filters' => $propFilters, + 'comp-filters' => $compFilter + ]); + + $expectedEventsInResult = array_map(function($index) use($events) { + return $events[$index]; + }, $expectedEventsInResult); + $this->assertEquals($expectedEventsInResult, $result, '', 0.0, 10, true); + } + + public function testGetCalendarObjectByUID() { + $calendarId = $this->createTestCalendar(); + $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z'); + + $co = $this->backend->getCalendarObjectByUID(self::UNIT_TEST_USER, '47d15e3ec8'); + $this->assertNotNull($co); + } + + public function providesCalendarQueryParameters() { + return [ + 'all' => [[0, 1, 2], [], []], + 'only-todos' => [[], ['name' => 'VTODO'], []], + 'only-events' => [[0, 1, 2], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => null, 'end' => null], 'prop-filters' => []]],], + 'start' => [[1, 2], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => new DateTime('2013-09-12 14:00:00', new DateTimeZone('UTC')), 'end' => null], 'prop-filters' => []]],], + 'end' => [[0], [], [['name' => 'VEVENT', 'is-not-defined' => false, 'comp-filters' => [], 'time-range' => ['start' => null, 'end' => new DateTime('2013-09-12 14:00:00', new DateTimeZone('UTC'))], 'prop-filters' => []]],], + ]; + } + + private function createTestCalendar() { + $this->backend->createCalendar(self::UNIT_TEST_USER, 'Example', [ + '{http://apple.com/ns/ical/}calendar-color' => '#1C4587FF' + ]); + $calendars = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($calendars)); + $this->assertEquals(self::UNIT_TEST_USER, $calendars[0]['principaluri']); + /** @var SupportedCalendarComponentSet $components */ + $components = $calendars[0]['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']; + $this->assertEquals(['VEVENT','VTODO'], $components->getValue()); + $color = $calendars[0]['{http://apple.com/ns/ical/}calendar-color']; + $this->assertEquals('#1C4587FF', $color); + $this->assertEquals('Example', $calendars[0]['uri']); + $this->assertEquals('Example', $calendars[0]['{DAV:}displayname']); + $calendarId = $calendars[0]['id']; + + return $calendarId; + } + + private function createEvent($calendarId, $start = '20130912T130000Z', $end = '20130912T140000Z') { + + $calData = <<getUniqueID('event'); + $this->backend->createCalendarObject($calendarId, $uri0, $calData); + + return $uri0; + } + + public function testSyncSupport() { + $calendarId = $this->createTestCalendar(); + + // fist call without synctoken + $changes = $this->backend->getChangesForCalendar($calendarId, '', 1); + $syncToken = $changes['syncToken']; + + // add a change + $event = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z'); + + // look for changes + $changes = $this->backend->getChangesForCalendar($calendarId, $syncToken, 1); + $this->assertEquals($event, $changes['added'][0]); + } + + public function testSubscriptions() { + $id = $this->backend->createSubscription(self::UNIT_TEST_USER, 'Subscription', [ + '{http://calendarserver.org/ns/}source' => new Href('test-source') + ]); + + $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($subscriptions)); + $this->assertEquals($id, $subscriptions[0]['id']); + + $patch = new PropPatch([ + '{DAV:}displayname' => 'Unit test', + ]); + $this->backend->updateSubscription($id, $patch); + $patch->commit(); + + $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($subscriptions)); + $this->assertEquals($id, $subscriptions[0]['id']); + $this->assertEquals('Unit test', $subscriptions[0]['{DAV:}displayname']); + + $this->backend->deleteSubscription($id); + $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER); + $this->assertEquals(0, count($subscriptions)); + } + + public function testScheduling() { + $this->backend->createSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule', ''); + + $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER); + $this->assertEquals(1, count($sos)); + + $so = $this->backend->getSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule'); + $this->assertNotNull($so); + + $this->backend->deleteSchedulingObject(self::UNIT_TEST_USER, 'Sample Schedule'); + + $sos = $this->backend->getSchedulingObjects(self::UNIT_TEST_USER); + $this->assertEquals(0, count($sos)); + } +} diff --git a/apps/dav/tests/unit/carddav/carddavbackendtest.php b/apps/dav/tests/unit/carddav/carddavbackendtest.php index 79ef36d809..dd5e205242 100644 --- a/apps/dav/tests/unit/carddav/carddavbackendtest.php +++ b/apps/dav/tests/unit/carddav/carddavbackendtest.php @@ -24,6 +24,13 @@ use OCA\DAV\CardDAV\CardDavBackend; use Sabre\DAV\PropPatch; use Test\TestCase; +/** + * Class CardDavBackendTest + * + * @group DB + * + * @package OCA\DAV\Tests\Unit\CardDAV + */ class CardDavBackendTest extends TestCase { /** @var CardDavBackend */ @@ -31,12 +38,20 @@ class CardDavBackendTest extends TestCase { const UNIT_TEST_USER = 'carddav-unit-test'; - public function setUp() { parent::setUp(); + $principal = $this->getMockBuilder('OCA\DAV\Connector\Sabre\Principal') + ->disableOriginalConstructor() + ->setMethods(['getPrincipalByPath']) + ->getMock(); + $principal->method('getPrincipalByPath') + ->willReturn([ + 'uri' => 'principals/best-friend' + ]); + $db = \OC::$server->getDatabaseConnection(); - $this->backend = new CardDavBackend($db); + $this->backend = new CardDavBackend($db, $principal); $this->tearDown(); } @@ -178,4 +193,32 @@ class CardDavBackendTest extends TestCase { $changes = $this->backend->getChangesForAddressBook($bookId, $syncToken, 1); $this->assertEquals($uri0, $changes['added'][0]); } + + public function testSharing() { + $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); + $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); + $this->assertEquals(1, count($books)); + + $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []); + + $shares = $this->backend->getShares('Example'); + $this->assertEquals(1, count($shares)); + + // adding the same sharee again has no effect + $this->backend->updateShares('Example', [['href' => 'principal:principals/best-friend']], []); + + $shares = $this->backend->getShares('Example'); + $this->assertEquals(1, count($shares)); + + $books = $this->backend->getAddressBooksForUser('principals/best-friend'); + $this->assertEquals(1, count($books)); + + $this->backend->updateShares('Example', [], [['href' => 'principal:principals/best-friend']]); + + $shares = $this->backend->getShares('Example'); + $this->assertEquals(0, count($shares)); + + $books = $this->backend->getAddressBooksForUser('principals/best-friend'); + $this->assertEquals(0, count($books)); + } } diff --git a/apps/dav/tests/unit/carddav/convertertest.php b/apps/dav/tests/unit/carddav/convertertest.php new file mode 100644 index 0000000000..f4e2ea3f00 --- /dev/null +++ b/apps/dav/tests/unit/carddav/convertertest.php @@ -0,0 +1,136 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\DAV\Tests\Unit; + +use OCA\DAV\CardDAV\Converter; +use Test\TestCase; + +class ConverterTests extends TestCase { + + /** + * @dataProvider providesNewUsers + */ + public function testCreation($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { + $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); + + $converter = new Converter(); + $vCard = $converter->createCardFromUser($user); + $cardData = $vCard->serialize(); + + $this->assertEquals($expectedVCard, $cardData); + } + + public function providesNewUsers() { + return [ + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nEMAIL;TYPE=OTHER:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:Dr. Foo Bar\r\nN:Bar;Dr.;Foo;;\r\nCLOUD:foo@bar.net\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU2Nzg5\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], + ]; + } + + /** + * @dataProvider providesNewUsers + */ + public function testUpdateOfUnchangedUser($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { + $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); + + $converter = new Converter(); + $vCard = $converter->createCardFromUser($user); + $updated = $converter->updateCard($vCard, $user); + $this->assertFalse($updated); + $cardData = $vCard->serialize(); + + $this->assertEquals($expectedVCard, $cardData); + } + + /** + * @dataProvider providesUsersForUpdateOfRemovedElement + */ + public function testUpdateOfRemovedElement($expectedVCard, $displayName = null, $eMailAddress = null, $cloudId = null) { + $user = $this->getUserMock($displayName, $eMailAddress, $cloudId); + + $converter = new Converter(); + $vCard = $converter->createCardFromUser($user); + + $user1 = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); + $user1->method('getUID')->willReturn('12345'); + $user1->method('getDisplayName')->willReturn(null); + $user1->method('getEMailAddress')->willReturn(null); + $user1->method('getCloudId')->willReturn(null); + $user1->method('getAvatarImage')->willReturn(null); + + $updated = $converter->updateCard($vCard, $user1); + $this->assertTrue($updated); + $cardData = $vCard->serialize(); + + $this->assertEquals($expectedVCard, $cardData); + } + + public function providesUsersForUpdateOfRemovedElement() { + return [ + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", "foo@bar.net"], + ["BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.7//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n", "Dr. Foo Bar", null, "foo@bar.net"], + ]; + } + + /** + * @dataProvider providesNames + * @param $expected + * @param $fullName + */ + public function testNameSplitter($expected, $fullName) { + + $converter = new Converter(); + $r = $converter->splitFullName($fullName); + $r = implode(';', $r); + $this->assertEquals($expected, $r); + } + + public function providesNames() { + return [ + ['Sauron;;;;', 'Sauron'], + ['Baggins;Bilbo;;;', 'Bilbo Baggins'], + ['Tolkien;John;Ronald Reuel;;', 'John Ronald Reuel Tolkien'], + ]; + } + + /** + * @param $displayName + * @param $eMailAddress + * @param $cloudId + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getUserMock($displayName, $eMailAddress, $cloudId) { + $image0 = $this->getMockBuilder('OCP\IImage')->disableOriginalConstructor()->getMock(); + $image0->method('mimeType')->willReturn('JPEG'); + $image0->method('data')->willReturn('123456789'); + $user = $this->getMockBuilder('OCP\IUser')->disableOriginalConstructor()->getMock(); + $user->method('getUID')->willReturn('12345'); + $user->method('getDisplayName')->willReturn($displayName); + $user->method('getEMailAddress')->willReturn($eMailAddress); + $user->method('getCloudId')->willReturn($cloudId); + $user->method('getAvatarImage')->willReturn($image0); + return $user; + } +} diff --git a/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php b/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php new file mode 100644 index 0000000000..8539e9c06e --- /dev/null +++ b/apps/dav/tests/unit/connector/sabre/FakeLockerPluginTest.php @@ -0,0 +1,173 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ +namespace OCA\DAV\Tests\Unit\Connector\Sabre; + +use OCA\DAV\Connector\Sabre\FakeLockerPlugin; +use Sabre\HTTP\Response; +use Test\TestCase; + +/** + * Class FakeLockerPluginTest + * + * @package OCA\DAV\Tests\Unit\Connector\Sabre + */ +class FakeLockerPluginTest extends TestCase { + /** @var FakeLockerPlugin */ + private $fakeLockerPlugin; + + public function setUp() { + parent::setUp(); + $this->fakeLockerPlugin = new FakeLockerPlugin(); + } + + public function testInitialize() { + /** @var \Sabre\DAV\Server $server */ + $server = $this->getMock('\Sabre\DAV\Server'); + $server + ->expects($this->at(0)) + ->method('on') + ->with('method:LOCK', [$this->fakeLockerPlugin, 'fakeLockProvider'], 1); + $server + ->expects($this->at(1)) + ->method('on') + ->with('method:UNLOCK', [$this->fakeLockerPlugin, 'fakeUnlockProvider'], 1); + $server + ->expects($this->at(2)) + ->method('on') + ->with('propFind', [$this->fakeLockerPlugin, 'propFind']); + $server + ->expects($this->at(3)) + ->method('on') + ->with('validateTokens', [$this->fakeLockerPlugin, 'validateTokens']); + + $this->fakeLockerPlugin->initialize($server); + } + + public function testGetHTTPMethods() { + $expected = [ + 'LOCK', + 'UNLOCK', + ]; + $this->assertSame($expected, $this->fakeLockerPlugin->getHTTPMethods('Test')); + } + + public function testGetFeatures() { + $expected = [ + 2, + ]; + $this->assertSame($expected, $this->fakeLockerPlugin->getFeatures()); + } + + public function testPropFind() { + $propFind = $this->getMockBuilder('\Sabre\DAV\PropFind') + ->disableOriginalConstructor() + ->getMock(); + $node = $this->getMock('\Sabre\DAV\INode'); + + $propFind->expects($this->at(0)) + ->method('handle') + ->with('{DAV:}supportedlock'); + $propFind->expects($this->at(1)) + ->method('handle') + ->with('{DAV:}lockdiscovery'); + + $this->fakeLockerPlugin->propFind($propFind, $node); + } + + public function tokenDataProvider() { + return [ + [ + [ + [ + 'tokens' => [ + [ + 'token' => 'aToken', + 'validToken' => false, + ], + [], + [ + 'token' => 'opaquelocktoken:asdf', + 'validToken' => false, + ] + ], + ] + ], + [ + [ + 'tokens' => [ + [ + 'token' => 'aToken', + 'validToken' => false, + ], + [], + [ + 'token' => 'opaquelocktoken:asdf', + 'validToken' => true, + ] + ], + ] + ], + ] + ]; + } + + /** + * @dataProvider tokenDataProvider + * @param array $input + * @param array $expected + */ + public function testValidateTokens(array $input, array $expected) { + $request = $this->getMock('\Sabre\HTTP\RequestInterface'); + $this->fakeLockerPlugin->validateTokens($request, $input); + $this->assertSame($expected, $input); + } + + public function testFakeLockProvider() { + $request = $this->getMock('\Sabre\HTTP\RequestInterface'); + $response = new Response(); + $server = $this->getMock('\Sabre\DAV\Server'); + $this->fakeLockerPlugin->initialize($server); + + $request->expects($this->exactly(2)) + ->method('getPath') + ->will($this->returnValue('MyPath')); + + $this->assertSame(false, $this->fakeLockerPlugin->fakeLockProvider($request, $response)); + + $expectedXml = 'MyPathinfinitySecond-1800opaquelocktoken:fe4f7f2437b151fbcb4e9f5c8118c6b1'; + + $this->assertXmlStringEqualsXmlString($expectedXml, $response->getBody()); + } + + public function testFakeUnlockProvider() { + $request = $this->getMock('\Sabre\HTTP\RequestInterface'); + $response = $this->getMock('\Sabre\HTTP\ResponseInterface'); + + $response->expects($this->once()) + ->method('setStatus') + ->with('204'); + $response->expects($this->once()) + ->method('setHeader') + ->with('Content-Length', '0'); + + $this->assertSame(false, $this->fakeLockerPlugin->fakeUnlockProvider($request, $response)); + } +} diff --git a/apps/dav/tests/unit/connector/sabre/auth.php b/apps/dav/tests/unit/connector/sabre/auth.php index d18747d732..217ff5fc3f 100644 --- a/apps/dav/tests/unit/connector/sabre/auth.php +++ b/apps/dav/tests/unit/connector/sabre/auth.php @@ -249,9 +249,12 @@ class Auth extends TestCase { } public function testAuthenticateAlreadyLoggedIn() { - $server = $this->getMockBuilder('\Sabre\DAV\Server') - ->disableOriginalConstructor() - ->getMock(); + $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); $this->userSession ->expects($this->once()) ->method('isLoggedIn') @@ -275,13 +278,10 @@ class Auth extends TestCase { ->expects($this->once()) ->method('close'); - $this->assertTrue($this->auth->authenticate($server, 'TestRealm')); + $response = $this->auth->check($request, $response); + $this->assertEquals([true, 'principals/users/MyWrongDavUser'], $response); } - /** - * @expectedException \Sabre\DAV\Exception\NotAuthenticated - * @expectedExceptionMessage No basic authentication headers were found - */ public function testAuthenticateNoBasicAuthenticateHeadersProvided() { $server = $this->getMockBuilder('\Sabre\DAV\Server') ->disableOriginalConstructor() @@ -292,7 +292,59 @@ class Auth extends TestCase { $server->httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') ->disableOriginalConstructor() ->getMock(); - $this->auth->authenticate($server, 'TestRealm'); + $response = $this->auth->check($server->httpRequest, $server->httpResponse); + $this->assertEquals([false, 'No \'Authorization: Basic\' header found. Either the client didn\'t send one, or the server is mis-configured'], $response); + } + + /** + * @expectedException \Sabre\DAV\Exception\NotAuthenticated + * @expectedExceptionMessage Cannot authenticate over ajax calls + */ + public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjax() { + /** @var \Sabre\HTTP\RequestInterface $httpRequest */ + $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + /** @var \Sabre\HTTP\ResponseInterface $httpResponse */ + $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->userSession + ->expects($this->any()) + ->method('isLoggedIn') + ->will($this->returnValue(false)); + $httpRequest + ->expects($this->once()) + ->method('getHeader') + ->with('X-Requested-With') + ->will($this->returnValue('XMLHttpRequest')); + $this->auth->check($httpRequest, $httpResponse); + } + + public function testAuthenticateNoBasicAuthenticateHeadersProvidedWithAjaxButUserIsStillLoggedIn() { + /** @var \Sabre\HTTP\RequestInterface $httpRequest */ + $httpRequest = $this->getMockBuilder('\Sabre\HTTP\RequestInterface') + ->disableOriginalConstructor() + ->getMock(); + /** @var \Sabre\HTTP\ResponseInterface $httpResponse */ + $httpResponse = $this->getMockBuilder('\Sabre\HTTP\ResponseInterface') + ->disableOriginalConstructor() + ->getMock(); + $this->userSession + ->expects($this->any()) + ->method('isLoggedIn') + ->will($this->returnValue(true)); + $this->session + ->expects($this->once()) + ->method('get') + ->with('AUTHENTICATED_TO_DAV_BACKEND') + ->will($this->returnValue('MyTestUser')); + $httpRequest + ->expects($this->once()) + ->method('getHeader') + ->with('Authorization') + ->will($this->returnValue(null)); + $this->auth->check($httpRequest, $httpResponse); } public function testAuthenticateValidCredentials() { @@ -303,7 +355,12 @@ class Auth extends TestCase { ->disableOriginalConstructor() ->getMock(); $server->httpRequest - ->expects($this->once()) + ->expects($this->at(0)) + ->method('getHeader') + ->with('X-Requested-With') + ->will($this->returnValue(null)); + $server->httpRequest + ->expects($this->at(1)) ->method('getHeader') ->with('Authorization') ->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ=')); @@ -325,13 +382,10 @@ class Auth extends TestCase { ->expects($this->exactly(2)) ->method('getUser') ->will($this->returnValue($user)); - $this->assertTrue($this->auth->authenticate($server, 'TestRealm')); + $response = $this->auth->check($server->httpRequest, $server->httpResponse); + $this->assertEquals([true, 'principals/users/username'], $response); } - /** - * @expectedException \Sabre\DAV\Exception\NotAuthenticated - * @expectedExceptionMessage Username or password does not match - */ public function testAuthenticateInvalidCredentials() { $server = $this->getMockBuilder('\Sabre\DAV\Server') ->disableOriginalConstructor() @@ -340,7 +394,12 @@ class Auth extends TestCase { ->disableOriginalConstructor() ->getMock(); $server->httpRequest - ->expects($this->once()) + ->expects($this->at(0)) + ->method('getHeader') + ->with('X-Requested-With') + ->will($this->returnValue(null)); + $server->httpRequest + ->expects($this->at(1)) ->method('getHeader') ->with('Authorization') ->will($this->returnValue('basic dXNlcm5hbWU6cGFzc3dvcmQ=')); @@ -352,6 +411,7 @@ class Auth extends TestCase { ->method('login') ->with('username', 'password') ->will($this->returnValue(false)); - $this->auth->authenticate($server, 'TestRealm'); + $response = $this->auth->check($server->httpRequest, $server->httpResponse); + $this->assertEquals([false, 'Username or password was incorrect'], $response); } } diff --git a/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php index e1bcc99690..1a973a28ed 100644 --- a/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php +++ b/apps/dav/tests/unit/connector/sabre/custompropertiesbackend.php @@ -8,6 +8,14 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; * later. * See the COPYING-README file. */ + +/** + * Class CustomPropertiesBackend + * + * @group DB + * + * @package Tests\Connector\Sabre + */ class CustomPropertiesBackend extends \Test\TestCase { /** diff --git a/apps/dav/tests/unit/connector/sabre/directory.php b/apps/dav/tests/unit/connector/sabre/directory.php index 148a91d26d..75c4828641 100644 --- a/apps/dav/tests/unit/connector/sabre/directory.php +++ b/apps/dav/tests/unit/connector/sabre/directory.php @@ -9,6 +9,8 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; +use OCP\Files\ForbiddenException; + class Directory extends \Test\TestCase { /** @var \OC\Files\View | \PHPUnit_Framework_MockObject_MockObject */ @@ -48,6 +50,25 @@ class Directory extends \Test\TestCase { $dir->delete(); } + /** + * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden + */ + public function testDeleteForbidden() { + // deletion allowed + $this->info->expects($this->once()) + ->method('isDeletable') + ->will($this->returnValue(true)); + + // but fails + $this->view->expects($this->once()) + ->method('rmdir') + ->with('sub') + ->willThrowException(new ForbiddenException('', true)); + + $dir = $this->getDir('sub'); + $dir->delete(); + } + /** * */ diff --git a/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php b/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php new file mode 100644 index 0000000000..19799c71b9 --- /dev/null +++ b/apps/dav/tests/unit/connector/sabre/exception/forbiddentest.php @@ -0,0 +1,44 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\DAV\Tests\Unit\Connector\Sabre\Exception; + +use OCA\DAV\Connector\Sabre\Exception\Forbidden; + +class ForbiddenTest extends \Test\TestCase { + + public function testSerialization() { + + // create xml doc + $DOM = new \DOMDocument('1.0','utf-8'); + $DOM->formatOutput = true; + $error = $DOM->createElementNS('DAV:','d:error'); + $error->setAttribute('xmlns:s', \Sabre\DAV\Server::NS_SABREDAV); + $DOM->appendChild($error); + + // serialize the exception + $message = "1234567890"; + $retry = false; + $expectedXml = << + + false + 1234567890 + + +EOD; + + $ex = new Forbidden($message, $retry); + $server = $this->getMock('Sabre\DAV\Server'); + $ex->serialize($server, $error); + + // assert + $xml = $DOM->saveXML(); + $this->assertEquals($expectedXml, $xml); + } +} diff --git a/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php index 19e82320d5..4296a4d561 100644 --- a/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php +++ b/apps/dav/tests/unit/connector/sabre/exception/invalidpathtest.php @@ -1,15 +1,15 @@ * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. */ + +namespace OCA\DAV\Tests\Unit\Connector\Sabre\Exception; + +use OCA\DAV\Connector\Sabre\Exception\InvalidPath; + class InvalidPathTest extends \Test\TestCase { public function testSerialization() { diff --git a/apps/dav/tests/unit/connector/sabre/file.php b/apps/dav/tests/unit/connector/sabre/file.php index 94dadf88fe..2a6cf46ef1 100644 --- a/apps/dav/tests/unit/connector/sabre/file.php +++ b/apps/dav/tests/unit/connector/sabre/file.php @@ -9,10 +9,18 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; use OC\Files\Storage\Local; +use OCP\Files\ForbiddenException; use Test\HookHelper; use OC\Files\Filesystem; use OCP\Lock\ILockingProvider; +/** + * Class File + * + * @group DB + * + * @package Test\Connector\Sabre + */ class File extends \Test\TestCase { /** @@ -40,6 +48,9 @@ class File extends \Test\TestCase { parent::tearDown(); } + /** + * @param string $string + */ private function getStream($string) { $stream = fopen('php://temp', 'r+'); fwrite($stream, $string); @@ -72,6 +83,10 @@ class File extends \Test\TestCase { new \OCP\Files\InvalidPathException(), 'Sabre\DAV\Exception\Forbidden' ], + [ + new \OCP\Files\ForbiddenException('', true), + 'OCA\DAV\Connector\Sabre\Exception\Forbidden' + ], [ new \OCP\Files\LockNotAcquiredException('/test.txt', 1), 'OCA\DAV\Connector\Sabre\Exception\FileLocked' @@ -234,7 +249,7 @@ class File extends \Test\TestCase { * @param string $path path to put the file into * @param string $viewRoot root to use for the view * - * @return result of the PUT operaiton which is usually the etag + * @return null|string of the PUT operaiton which is usually the etag */ private function doPut($path, $viewRoot = null) { $view = \OC\Files\Filesystem::getView(); @@ -690,6 +705,29 @@ class File extends \Test\TestCase { $file->delete(); } + /** + * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden + */ + public function testDeleteThrowsWhenDeletionThrows() { + // setup + $view = $this->getMock('\OC\Files\View', + array()); + + // but fails + $view->expects($this->once()) + ->method('unlink') + ->willThrowException(new ForbiddenException('', true)); + + $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + 'permissions' => \OCP\Constants::PERMISSION_ALL + ), null); + + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); + + // action + $file->delete(); + } + /** * Asserts hook call * @@ -835,4 +873,22 @@ class File extends \Test\TestCase { $file->get(); } + + /** + * @expectedException \OCA\DAV\Connector\Sabre\Exception\Forbidden + */ + public function testGetFopenThrows() { + $view = $this->getMock('\OC\Files\View', ['fopen'], array()); + $view->expects($this->atLeastOnce()) + ->method('fopen') + ->willThrowException(new ForbiddenException('', true)); + + $info = new \OC\Files\FileInfo('/test.txt', null, null, array( + 'permissions' => \OCP\Constants::PERMISSION_ALL + ), null); + + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); + + $file->get(); + } } diff --git a/apps/dav/tests/unit/connector/sabre/filesplugin.php b/apps/dav/tests/unit/connector/sabre/filesplugin.php index f3c862941c..b33c8340f7 100644 --- a/apps/dav/tests/unit/connector/sabre/filesplugin.php +++ b/apps/dav/tests/unit/connector/sabre/filesplugin.php @@ -11,10 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; class FilesPlugin extends \Test\TestCase { const GETETAG_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::GETETAG_PROPERTYNAME; const FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::FILEID_PROPERTYNAME; + const INTERNAL_FILEID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::INTERNAL_FILEID_PROPERTYNAME; const SIZE_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::SIZE_PROPERTYNAME; const PERMISSIONS_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::PERMISSIONS_PROPERTYNAME; const LASTMODIFIED_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::LASTMODIFIED_PROPERTYNAME; const DOWNLOADURL_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::DOWNLOADURL_PROPERTYNAME; + const OWNER_ID_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_ID_PROPERTYNAME; + const OWNER_DISPLAY_NAME_PROPERTYNAME = \OCA\DAV\Connector\Sabre\FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; /** * @var \Sabre\DAV\Server @@ -52,6 +55,9 @@ class FilesPlugin extends \Test\TestCase { $this->plugin->initialize($this->server); } + /** + * @param string $class + */ private function createTestNode($class) { $node = $this->getMockBuilder($class) ->disableOriginalConstructor() @@ -67,7 +73,10 @@ class FilesPlugin extends \Test\TestCase { $node->expects($this->any()) ->method('getFileId') - ->will($this->returnValue(123)); + ->will($this->returnValue('00000123instanceid')); + $node->expects($this->any()) + ->method('getInternalFileId') + ->will($this->returnValue('123')); $node->expects($this->any()) ->method('getEtag') ->will($this->returnValue('"abc"')); @@ -88,16 +97,33 @@ class FilesPlugin extends \Test\TestCase { array( self::GETETAG_PROPERTYNAME, self::FILEID_PROPERTYNAME, + self::INTERNAL_FILEID_PROPERTYNAME, self::SIZE_PROPERTYNAME, self::PERMISSIONS_PROPERTYNAME, self::DOWNLOADURL_PROPERTYNAME, + self::OWNER_ID_PROPERTYNAME, + self::OWNER_DISPLAY_NAME_PROPERTYNAME ), 0 ); + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user + ->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('foo')); + $user + ->expects($this->once()) + ->method('getDisplayName') + ->will($this->returnValue('M. Foo')); + $node->expects($this->once()) ->method('getDirectDownload') ->will($this->returnValue(array('url' => 'http://example.com/'))); + $node->expects($this->exactly(2)) + ->method('getOwner') + ->will($this->returnValue($user)); $node->expects($this->never()) ->method('getSize'); @@ -107,10 +133,13 @@ class FilesPlugin extends \Test\TestCase { ); $this->assertEquals('"abc"', $propFind->get(self::GETETAG_PROPERTYNAME)); - $this->assertEquals(123, $propFind->get(self::FILEID_PROPERTYNAME)); + $this->assertEquals('00000123instanceid', $propFind->get(self::FILEID_PROPERTYNAME)); + $this->assertEquals('123', $propFind->get(self::INTERNAL_FILEID_PROPERTYNAME)); $this->assertEquals(null, $propFind->get(self::SIZE_PROPERTYNAME)); $this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME)); $this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); + $this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME)); + $this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME)); $this->assertEquals(array(self::SIZE_PROPERTYNAME), $propFind->get404Properties()); } @@ -166,7 +195,7 @@ class FilesPlugin extends \Test\TestCase { ); $this->assertEquals('"abc"', $propFind->get(self::GETETAG_PROPERTYNAME)); - $this->assertEquals(123, $propFind->get(self::FILEID_PROPERTYNAME)); + $this->assertEquals('00000123instanceid', $propFind->get(self::FILEID_PROPERTYNAME)); $this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME)); $this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME)); $this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME)); @@ -207,6 +236,36 @@ class FilesPlugin extends \Test\TestCase { $this->assertEquals(200, $result[self::GETETAG_PROPERTYNAME]); } + public function testUpdatePropsForbidden() { + $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); + + $propPatch = new \Sabre\DAV\PropPatch(array( + self::OWNER_ID_PROPERTYNAME => 'user2', + self::OWNER_DISPLAY_NAME_PROPERTYNAME => 'User Two', + self::FILEID_PROPERTYNAME => 12345, + self::PERMISSIONS_PROPERTYNAME => 'C', + self::SIZE_PROPERTYNAME => 123, + self::DOWNLOADURL_PROPERTYNAME => 'http://example.com/', + )); + + $this->plugin->handleUpdateProperties( + '/dummypath', + $propPatch + ); + + $propPatch->commit(); + + $this->assertEmpty($propPatch->getRemainingMutations()); + + $result = $propPatch->getResult(); + $this->assertEquals(403, $result[self::OWNER_ID_PROPERTYNAME]); + $this->assertEquals(403, $result[self::OWNER_DISPLAY_NAME_PROPERTYNAME]); + $this->assertEquals(403, $result[self::FILEID_PROPERTYNAME]); + $this->assertEquals(403, $result[self::PERMISSIONS_PROPERTYNAME]); + $this->assertEquals(403, $result[self::SIZE_PROPERTYNAME]); + $this->assertEquals(403, $result[self::DOWNLOADURL_PROPERTYNAME]); + } + /** * Testcase from https://github.com/owncloud/core/issues/5251 * diff --git a/apps/dav/tests/unit/connector/sabre/objecttree.php b/apps/dav/tests/unit/connector/sabre/objecttree.php index 3a56404e55..1cea4ff0b6 100644 --- a/apps/dav/tests/unit/connector/sabre/objecttree.php +++ b/apps/dav/tests/unit/connector/sabre/objecttree.php @@ -41,6 +41,13 @@ class TestDoubleFileView extends \OC\Files\View { } } +/** + * Class ObjectTree + * + * @group DB + * + * @package OCA\DAV\Tests\Unit\Connector\Sabre + */ class ObjectTree extends \Test\TestCase { /** diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php index 2fbab124fb..9a6ae545b5 100644 --- a/apps/dav/tests/unit/connector/sabre/principal.php +++ b/apps/dav/tests/unit/connector/sabre/principal.php @@ -41,43 +41,45 @@ class Principal extends \Test\TestCase { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $fooUser - ->expects($this->exactly(3)) - ->method('getUID') - ->will($this->returnValue('foo')); + ->expects($this->exactly(1)) + ->method('getUID') + ->will($this->returnValue('foo')); + $fooUser + ->expects($this->exactly(1)) + ->method('getDisplayName') + ->will($this->returnValue('Dr. Foo-Bar')); + $fooUser + ->expects($this->exactly(1)) + ->method('getEMailAddress') + ->will($this->returnValue('')); $barUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $barUser - ->expects($this->exactly(3)) + ->expects($this->exactly(1)) ->method('getUID') ->will($this->returnValue('bar')); + $barUser + ->expects($this->exactly(1)) + ->method('getEMailAddress') + ->will($this->returnValue('bar@owncloud.org')); $this->userManager ->expects($this->once()) ->method('search') ->with('') ->will($this->returnValue([$fooUser, $barUser])); - $this->config - ->expects($this->at(0)) - ->method('getUserValue') - ->with('foo', 'settings', 'email') - ->will($this->returnValue('')); - $this->config - ->expects($this->at(1)) - ->method('getUserValue') - ->with('bar', 'settings', 'email') - ->will($this->returnValue('bar@owncloud.org')); $expectedResponse = [ 0 => [ - 'uri' => 'principals/foo', - '{DAV:}displayname' => 'foo' + 'uri' => 'principals/users/foo', + '{DAV:}displayname' => 'Dr. Foo-Bar' ], 1 => [ - 'uri' => 'principals/bar', + 'uri' => 'principals/users/bar', '{DAV:}displayname' => 'bar', '{http://sabredav.org/ns}email-address' => 'bar@owncloud.org' ] ]; - $response = $this->connector->getPrincipalsByPrefix('principals'); + $response = $this->connector->getPrincipalsByPrefix('principals/users'); $this->assertSame($expectedResponse, $response); } @@ -88,7 +90,7 @@ class Principal extends \Test\TestCase { ->with('') ->will($this->returnValue([])); - $response = $this->connector->getPrincipalsByPrefix('principals'); + $response = $this->connector->getPrincipalsByPrefix('principals/users'); $this->assertSame([], $response); } @@ -96,7 +98,7 @@ class Principal extends \Test\TestCase { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $fooUser - ->expects($this->exactly(3)) + ->expects($this->exactly(1)) ->method('getUID') ->will($this->returnValue('foo')); $this->userManager @@ -104,17 +106,12 @@ class Principal extends \Test\TestCase { ->method('get') ->with('foo') ->will($this->returnValue($fooUser)); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('foo', 'settings', 'email') - ->will($this->returnValue('')); $expectedResponse = [ - 'uri' => 'principals/foo', + 'uri' => 'principals/users/foo', '{DAV:}displayname' => 'foo' ]; - $response = $this->connector->getPrincipalByPath('principals/foo'); + $response = $this->connector->getPrincipalByPath('principals/users/foo'); $this->assertSame($expectedResponse, $response); } @@ -122,26 +119,25 @@ class Principal extends \Test\TestCase { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $fooUser - ->expects($this->exactly(3)) - ->method('getUID') - ->will($this->returnValue('foo')); + ->expects($this->exactly(1)) + ->method('getEMailAddress') + ->will($this->returnValue('foo@owncloud.org')); + $fooUser + ->expects($this->exactly(1)) + ->method('getUID') + ->will($this->returnValue('foo')); $this->userManager ->expects($this->once()) ->method('get') ->with('foo') ->will($this->returnValue($fooUser)); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('foo', 'settings', 'email') - ->will($this->returnValue('foo@owncloud.org')); $expectedResponse = [ - 'uri' => 'principals/foo', + 'uri' => 'principals/users/foo', '{DAV:}displayname' => 'foo', '{http://sabredav.org/ns}email-address' => 'foo@owncloud.org' ]; - $response = $this->connector->getPrincipalByPath('principals/foo'); + $response = $this->connector->getPrincipalByPath('principals/users/foo'); $this->assertSame($expectedResponse, $response); } @@ -152,7 +148,7 @@ class Principal extends \Test\TestCase { ->with('foo') ->will($this->returnValue(null)); - $response = $this->connector->getPrincipalByPath('principals/foo'); + $response = $this->connector->getPrincipalByPath('principals/users/foo'); $this->assertSame(null, $response); } @@ -160,7 +156,7 @@ class Principal extends \Test\TestCase { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $fooUser - ->expects($this->exactly(3)) + ->expects($this->exactly(1)) ->method('getUID') ->will($this->returnValue('foo')); $this->userManager @@ -168,14 +164,9 @@ class Principal extends \Test\TestCase { ->method('get') ->with('foo') ->will($this->returnValue($fooUser)); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('foo', 'settings', 'email') - ->will($this->returnValue('foo@owncloud.org')); - $response = $this->connector->getGroupMemberSet('principals/foo'); - $this->assertSame(['principals/foo'], $response); + $response = $this->connector->getGroupMemberSet('principals/users/foo'); + $this->assertSame(['principals/users/foo'], $response); } /** @@ -189,14 +180,14 @@ class Principal extends \Test\TestCase { ->with('foo') ->will($this->returnValue(null)); - $this->connector->getGroupMemberSet('principals/foo'); + $this->connector->getGroupMemberSet('principals/users/foo'); } public function testGetGroupMembership() { $fooUser = $this->getMockBuilder('\OC\User\User') ->disableOriginalConstructor()->getMock(); $fooUser - ->expects($this->exactly(3)) + ->expects($this->exactly(1)) ->method('getUID') ->will($this->returnValue('foo')); $this->userManager @@ -204,17 +195,12 @@ class Principal extends \Test\TestCase { ->method('get') ->with('foo') ->will($this->returnValue($fooUser)); - $this->config - ->expects($this->once()) - ->method('getUserValue') - ->with('foo', 'settings', 'email') - ->will($this->returnValue('foo@owncloud.org')); $expectedResponse = [ - 'principals/foo/calendar-proxy-read', - 'principals/foo/calendar-proxy-write' + 'principals/users/foo/calendar-proxy-read', + 'principals/users/foo/calendar-proxy-write' ]; - $response = $this->connector->getGroupMembership('principals/foo'); + $response = $this->connector->getGroupMembership('principals/users/foo'); $this->assertSame($expectedResponse, $response); } @@ -229,7 +215,7 @@ class Principal extends \Test\TestCase { ->with('foo') ->will($this->returnValue(null)); - $this->connector->getGroupMembership('principals/foo'); + $this->connector->getGroupMembership('principals/users/foo'); } /** @@ -237,7 +223,7 @@ class Principal extends \Test\TestCase { * @expectedExceptionMessage Setting members of the group is not supported yet */ public function testSetGroupMembership() { - $this->connector->setGroupMemberSet('principals/foo', ['foo']); + $this->connector->setGroupMemberSet('principals/users/foo', ['foo']); } public function testUpdatePrincipal() { @@ -245,6 +231,6 @@ class Principal extends \Test\TestCase { } public function testSearchPrincipals() { - $this->assertSame([], $this->connector->searchPrincipals('principals', [])); + $this->assertSame([], $this->connector->searchPrincipals('principals/users', [])); } } diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/auth.php b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php index 41b554d11d..3caa019af8 100644 --- a/apps/dav/tests/unit/connector/sabre/requesttest/auth.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/auth.php @@ -9,6 +9,8 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use Sabre\DAV\Auth\Backend\BackendInterface; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; class Auth implements BackendInterface { /** @@ -32,18 +34,35 @@ class Auth implements BackendInterface { $this->password = $password; } - /** - * Authenticates the user based on the current request. + * When this method is called, the backend must check if authentication was + * successful. * - * If authentication is successful, true must be returned. - * If authentication fails, an exception must be thrown. + * The returned value must be one of the following * - * @param \Sabre\DAV\Server $server - * @param string $realm - * @return bool + * [true, "principals/username"] + * [false, "reason for failure"] + * + * If authentication was successful, it's expected that the authentication + * backend returns a so-called principal url. + * + * Examples of a principal url: + * + * principals/admin + * principals/user1 + * principals/users/joe + * principals/uid/123457 + * + * If you don't use WebDAV ACL (RFC3744) we recommend that you simply + * return a string such as: + * + * principals/users/[username] + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return array */ - function authenticate(\Sabre\DAV\Server $server, $realm) { + function check(RequestInterface $request, ResponseInterface $response) { $userSession = \OC::$server->getUserSession(); $result = $userSession->login($this->user, $this->password); if ($result) { @@ -52,18 +71,33 @@ class Auth implements BackendInterface { \OC_Util::setupFS($user); //trigger creation of user home and /files folder \OC::$server->getUserFolder($user); + return [true, "principals/$user"]; } - return $result; + return [false, "login failed"]; } /** - * Returns information about the currently logged in username. + * This method is called when a user could not be authenticated, and + * authentication was required for the current request. * - * If nobody is currently logged in, this method should return null. + * This gives you the opportunity to set authentication headers. The 401 + * status code will already be set. * - * @return string|null + * In this case of Basic Auth, this would for example mean that the + * following header needs to be set: + * + * $response->addHeader('WWW-Authenticate', 'Basic realm=SabreDAV'); + * + * Keep in mind that in the case of multiple authentication backends, other + * WWW-Authenticate headers may already have been set, and you'll want to + * append your own WWW-Authenticate header instead of overwriting the + * existing one. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return void */ - function getCurrentUser() { - return $this->user; + function challenge(RequestInterface $request, ResponseInterface $response) { + // TODO: Implement challenge() method. } } diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php index 245deff3b3..29454c3821 100644 --- a/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/downloadtest.php @@ -11,6 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use OCP\AppFramework\Http; use OCP\Lock\ILockingProvider; +/** + * Class DownloadTest + * + * @group DB + * + * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest + */ class DownloadTest extends RequestTest { public function testDownload() { $user = $this->getUniqueID(); diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php index ed1d6046d7..b79dfa0c26 100644 --- a/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/encryptionuploadtest.php @@ -11,6 +11,13 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest; use OC\Files\View; use Test\Traits\EncryptionTrait; +/** + * Class EncryptionUploadTest + * + * @group DB + * + * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest + */ class EncryptionUploadTest extends UploadTest { use EncryptionTrait; diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php index d90cf6e19b..a83f25c158 100644 --- a/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/requesttest.php @@ -46,7 +46,8 @@ abstract class RequestTest extends TestCase { \OC::$server->getUserSession(), \OC::$server->getMountManager(), \OC::$server->getTagManager(), - \OC::$server->getEventDispatcher() + \OC::$server->getEventDispatcher(), + $this->getMock('\OCP\IRequest') ); } @@ -67,6 +68,7 @@ abstract class RequestTest extends TestCase { * @param resource|string|null $body * @param array|null $headers * @return \Sabre\HTTP\Response + * @throws \Exception */ protected function request($view, $user, $password, $method, $url, $body = null, $headers = null) { if (is_string($body)) { diff --git a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php index a2a8326f4f..c1876a7f29 100644 --- a/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php +++ b/apps/dav/tests/unit/connector/sabre/requesttest/uploadtest.php @@ -12,6 +12,13 @@ use OC\Connector\Sabre\Exception\FileLocked; use OCP\AppFramework\Http; use OCP\Lock\ILockingProvider; +/** + * Class UploadTest + * + * @group DB + * + * @package OCA\DAV\Tests\Unit\Connector\Sabre\RequestTest + */ class UploadTest extends RequestTest { public function testBasicUpload() { $user = $this->getUniqueID(); diff --git a/apps/encryption/hooks/userhooks.php b/apps/encryption/hooks/userhooks.php index 5bd5e39f3c..4a5f1198fc 100644 --- a/apps/encryption/hooks/userhooks.php +++ b/apps/encryption/hooks/userhooks.php @@ -141,7 +141,7 @@ class UserHooks implements IHook { * * @note This method should never be called for users using client side encryption * @param array $params - * @return bool + * @return boolean|null */ public function login($params) { @@ -199,7 +199,7 @@ class UserHooks implements IHook { * If the password can't be changed within ownCloud, than update the key password in advance. * * @param array $params : uid, password - * @return bool + * @return boolean|null */ public function preSetPassphrase($params) { if (App::isEnabled('encryption')) { @@ -216,7 +216,7 @@ class UserHooks implements IHook { * Change a user's encryption passphrase * * @param array $params keys: uid, password - * @return bool + * @return boolean|null */ public function setPassphrase($params) { diff --git a/apps/encryption/l10n/es_AR.js b/apps/encryption/l10n/es_AR.js index bff5b7c593..3f2fbb5de3 100644 --- a/apps/encryption/l10n/es_AR.js +++ b/apps/encryption/l10n/es_AR.js @@ -1,6 +1,7 @@ OC.L10N.register( "encryption", { + "Missing recovery key password" : "Falta contraseña de recuperación", "Recovery key successfully enabled" : "Se habilitó la recuperación de archivos", "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor, comprobá tu contraseña.", "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", diff --git a/apps/encryption/l10n/es_AR.json b/apps/encryption/l10n/es_AR.json index 0cdcd9cd12..225ca5139f 100644 --- a/apps/encryption/l10n/es_AR.json +++ b/apps/encryption/l10n/es_AR.json @@ -1,4 +1,5 @@ { "translations": { + "Missing recovery key password" : "Falta contraseña de recuperación", "Recovery key successfully enabled" : "Se habilitó la recuperación de archivos", "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor, comprobá tu contraseña.", "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", diff --git a/apps/encryption/l10n/tr.js b/apps/encryption/l10n/tr.js index e1fcb526d0..5abbf87b81 100644 --- a/apps/encryption/l10n/tr.js +++ b/apps/encryption/l10n/tr.js @@ -32,6 +32,8 @@ OC.L10N.register( "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", "Cheers!" : "Hoşçakalın!", "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Selam,

Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız %s parolası kullanılarak şifrelendi.

Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.

", + "Encrypt the home storage" : "Yerel depolamayı şifrele", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Bu seçeneği etkinleştirmek ana depolamadaki bütün dosyaları şifreler, aksi takdirde sadece harici depolamadaki dosyalar şifrelenir", "Enable recovery key" : "Kurtarma anahtarını etkinleştir", "Disable recovery key" : "Kurtarma anahtarını devre dışı bırak", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.", diff --git a/apps/encryption/l10n/tr.json b/apps/encryption/l10n/tr.json index 743d3e7d15..31824461d8 100644 --- a/apps/encryption/l10n/tr.json +++ b/apps/encryption/l10n/tr.json @@ -30,6 +30,8 @@ "The share will expire on %s." : "Bu paylaşım %s tarihinde sona erecek.", "Cheers!" : "Hoşçakalın!", "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Selam,

Sistem yöneticisi sunucu tarafında şifrelemeyi etkinleştirdi. Dosyalarınız %s parolası kullanılarak şifrelendi.

Lütfen web arayüzünde oturum açın ve kişisel ayarlarınızdan 'ownCloud temel şifreleme modülü'ne giderek 'eski oturum parolası' alanına bu parolayı girdikten sonra şifreleme parolanızı ve mevcut oturum açma parolanızı güncelleyin.

", + "Encrypt the home storage" : "Yerel depolamayı şifrele", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Bu seçeneği etkinleştirmek ana depolamadaki bütün dosyaları şifreler, aksi takdirde sadece harici depolamadaki dosyalar şifrelenir", "Enable recovery key" : "Kurtarma anahtarını etkinleştir", "Disable recovery key" : "Kurtarma anahtarını devre dışı bırak", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "Kurtarma anahtarı, dosyaların şifrelenmesi için daha fazla \nşifreleme sunar. Bu kullanıcının dosyasının şifresini unuttuğunda kurtarmasına imkan verir.", diff --git a/apps/encryption/lib/crypto/crypt.php b/apps/encryption/lib/crypto/crypt.php index c0dcc936bd..dbc0364a15 100644 --- a/apps/encryption/lib/crypto/crypt.php +++ b/apps/encryption/lib/crypto/crypt.php @@ -34,7 +34,6 @@ use OCA\Encryption\Vendor\PBKDF2Fallback; use OCP\Encryption\Exceptions\GenericEncryptionException; use OCP\IConfig; use OCP\ILogger; -use OCP\IUser; use OCP\IUserSession; class Crypt { @@ -146,7 +145,7 @@ class Crypt { /** * @param string $plainContent * @param string $passPhrase - * @return bool|string + * @return false|string * @throws GenericEncryptionException */ public function symmetricEncryptFileContent($plainContent, $passPhrase) { @@ -273,7 +272,7 @@ class Crypt { } /** - * @param $data + * @param string $data * @return string */ private function addPadding($data) { @@ -326,7 +325,7 @@ class Crypt { * @param string $privateKey * @param string $password * @param string $uid for regular users, empty for system keys - * @return bool|string + * @return false|string */ public function encryptPrivateKey($privateKey, $password, $uid = '') { $cipher = $this->getCipher(); @@ -343,7 +342,7 @@ class Crypt { * @param string $privateKey * @param string $password * @param string $uid for regular users, empty for system keys - * @return bool|string + * @return false|string */ public function decryptPrivateKey($privateKey, $password = '', $uid = '') { @@ -386,7 +385,7 @@ class Crypt { /** * check if it is a valid private key * - * @param $plainKey + * @param string $plainKey * @return bool */ protected function isValidPrivateKey($plainKey) { @@ -402,7 +401,7 @@ class Crypt { } /** - * @param $keyFileContents + * @param string $keyFileContents * @param string $passPhrase * @param string $cipher * @return string @@ -424,7 +423,7 @@ class Crypt { * remove padding * * @param $padded - * @return bool|string + * @return string|false */ private function removePadding($padded) { if (substr($padded, -2) === 'xx') { @@ -436,8 +435,8 @@ class Crypt { /** * split iv from encrypted content * - * @param $catFile - * @return array + * @param string|false $catFile + * @return string */ private function splitIv($catFile) { // Fetch encryption metadata from end of file @@ -457,8 +456,8 @@ class Crypt { } /** - * @param $encryptedContent - * @param $iv + * @param string $encryptedContent + * @param string $iv * @param string $passPhrase * @param string $cipher * @return string @@ -479,7 +478,7 @@ class Crypt { } /** - * @param $data + * @param string $data * @return array */ protected function parseHeader($data) { @@ -551,7 +550,7 @@ class Crypt { * @param $encKeyFile * @param $shareKey * @param $privateKey - * @return mixed + * @return string * @throws MultiKeyDecryptException */ public function multiKeyDecrypt($encKeyFile, $shareKey, $privateKey) { diff --git a/apps/encryption/lib/crypto/encryptall.php b/apps/encryption/lib/crypto/encryptall.php index 8e97fe341b..ef67523d7e 100644 --- a/apps/encryption/lib/crypto/encryptall.php +++ b/apps/encryption/lib/crypto/encryptall.php @@ -31,6 +31,7 @@ use OCP\IL10N; use OCP\IUserManager; use OCP\Mail\IMailer; use OCP\Security\ISecureRandom; +use OCP\Util; use Symfony\Component\Console\Helper\ProgressBar; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Helper\Table; @@ -358,14 +359,15 @@ class EncryptAll { $progress = new ProgressBar($this->output, count($this->userPasswords)); $progress->start(); - foreach ($this->userPasswords as $recipient => $password) { + foreach ($this->userPasswords as $uid => $password) { $progress->advance(); if (!empty($password)) { - $recipientDisplayName = $this->userManager->get($recipient)->getDisplayName(); - $to = $this->config->getUserValue($recipient, 'settings', 'email', ''); + $recipient = $this->userManager->get($uid); + $recipientDisplayName = $recipient->getDisplayName(); + $to = $recipient->getEMailAddress(); if ($to === '') { - $noMail[] = $recipient; + $noMail[] = $uid; continue; } @@ -380,12 +382,12 @@ class EncryptAll { $message->setHtmlBody($htmlBody); $message->setPlainBody($textBody); $message->setFrom([ - \OCP\Util::getDefaultEmailAddress('admin-noreply') + Util::getDefaultEmailAddress('admin-noreply') ]); $this->mailer->send($message); } catch (\Exception $e) { - $noMail[] = $recipient; + $noMail[] = $uid; } } } diff --git a/apps/encryption/lib/crypto/encryption.php b/apps/encryption/lib/crypto/encryption.php index d1140ce7cd..ea6c05c338 100644 --- a/apps/encryption/lib/crypto/encryption.php +++ b/apps/encryption/lib/crypto/encryption.php @@ -247,7 +247,7 @@ class Encryption implements IEncryptionModule { * encrypt data * * @param string $data you want to encrypt - * @return mixed encrypted data + * @return string encrypted data */ public function encrypt($data) { @@ -312,7 +312,7 @@ class Encryption implements IEncryptionModule { * decrypt data * * @param string $data you want to decrypt - * @return mixed decrypted data + * @return string decrypted data * @throws DecryptionFailedException */ public function decrypt($data) { diff --git a/apps/encryption/lib/keymanager.php b/apps/encryption/lib/keymanager.php index c450722887..0c8418c67a 100644 --- a/apps/encryption/lib/keymanager.php +++ b/apps/encryption/lib/keymanager.php @@ -280,7 +280,7 @@ class KeyManager { /** * @param $userId - * @param $key + * @param string $key * @return bool */ public function setPrivateKey($userId, $key) { @@ -365,7 +365,7 @@ class KeyManager { /** * @param $userId - * @return mixed + * @return string * @throws PrivateKeyMissingException */ public function getPrivateKey($userId) { @@ -379,7 +379,7 @@ class KeyManager { } /** - * @param $path + * @param string $path * @param $uid * @return string */ @@ -412,7 +412,7 @@ class KeyManager { /** * get the encrypted file key * - * @param $path + * @param string $path * @return string */ public function getEncryptedFileKey($path) { @@ -508,7 +508,7 @@ class KeyManager { } /** - * @param $purpose + * @param string $purpose * @param bool $timestamp * @param bool $includeUserKeys */ @@ -534,13 +534,16 @@ class KeyManager { } /** - * @param $uid + * @param string $uid * @return bool */ private function deletePrivateKey($uid) { return $this->keyStorage->deleteUserKey($uid, $this->privateKeyId, Encryption::ID); } + /** + * @param string $path + */ public function deleteAllFileKeys($path) { return $this->keyStorage->deleteAllFileKeys($path); } diff --git a/apps/encryption/lib/migration.php b/apps/encryption/lib/migration.php index 1a7c2e9877..7bc399ddcb 100644 --- a/apps/encryption/lib/migration.php +++ b/apps/encryption/lib/migration.php @@ -50,7 +50,7 @@ class Migration { */ public function __construct(IConfig $config, View $view, IDBConnection $connection, ILogger $logger) { $this->view = $view; - $this->view->getUpdater()->disable(); + $this->view->disableCacheUpdate(); $this->connection = $connection; $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID; $this->config = $config; @@ -237,7 +237,7 @@ class Migration { /** * rename system wide public key * - * @param $privateKey private key for which we want to rename the corresponding public key + * @param string $privateKey private key for which we want to rename the corresponding public key */ private function renameSystemPublicKey($privateKey) { $publicKey = substr($privateKey,0 , strrpos($privateKey, '.privateKey')) . '.publicKey'; diff --git a/apps/encryption/lib/recovery.php b/apps/encryption/lib/recovery.php index e7b20e2c4a..cffa641f51 100644 --- a/apps/encryption/lib/recovery.php +++ b/apps/encryption/lib/recovery.php @@ -103,7 +103,7 @@ class Recovery { /** * @param $recoveryKeyId - * @param $password + * @param string $password * @return bool */ public function enableAdminRecovery($password) { @@ -144,7 +144,7 @@ class Recovery { } /** - * @param $recoveryPassword + * @param string $recoveryPassword * @return bool */ public function disableAdminRecovery($recoveryPassword) { @@ -212,6 +212,7 @@ class Recovery { /** * add recovery key to all encrypted files + * @param string $path */ private function addRecoveryKeys($path) { $dirContent = $this->view->getDirectoryContent($path); @@ -239,6 +240,7 @@ class Recovery { /** * remove recovery key to all encrypted files + * @param string $path */ private function removeRecoveryKeys($path) { $dirContent = $this->view->getDirectoryContent($path); diff --git a/apps/encryption/tests/lib/MigrationTest.php b/apps/encryption/tests/lib/MigrationTest.php index 65fefa262a..fc3d014345 100644 --- a/apps/encryption/tests/lib/MigrationTest.php +++ b/apps/encryption/tests/lib/MigrationTest.php @@ -62,6 +62,9 @@ class MigrationTest extends \Test\TestCase { $this->moduleId = \OCA\Encryption\Crypto\Encryption::ID; } + /** + * @param string $uid + */ protected function createDummyShareKeys($uid) { $this->loginAsUser($uid); @@ -89,6 +92,9 @@ class MigrationTest extends \Test\TestCase { } } + /** + * @param string $uid + */ protected function createDummyUserKeys($uid) { $this->loginAsUser($uid); @@ -98,6 +104,9 @@ class MigrationTest extends \Test\TestCase { $this->view->file_put_contents('/files_encryption/public_keys/' . $uid . '.publicKey', 'publicKey'); } + /** + * @param string $uid + */ protected function createDummyFileKeys($uid) { $this->loginAsUser($uid); @@ -111,6 +120,9 @@ class MigrationTest extends \Test\TestCase { $this->view->file_put_contents($uid . '/files_encryption/keys/folder2/file.2.1/fileKey' , 'data'); } + /** + * @param string $uid + */ protected function createDummyFiles($uid) { $this->loginAsUser($uid); @@ -124,6 +136,9 @@ class MigrationTest extends \Test\TestCase { $this->view->file_put_contents($uid . '/files/folder2/file.2.1/fileKey' , 'data'); } + /** + * @param string $uid + */ protected function createDummyFilesInTrash($uid) { $this->loginAsUser($uid); @@ -239,6 +254,9 @@ class MigrationTest extends \Test\TestCase { } + /** + * @param string $uid + */ protected function verifyFilesInTrash($uid) { $this->loginAsUser($uid); @@ -266,6 +284,9 @@ class MigrationTest extends \Test\TestCase { ); } + /** + * @param string $uid + */ protected function verifyNewKeyPath($uid) { // private key if ($uid !== '') { @@ -394,6 +415,11 @@ class MigrationTest extends \Test\TestCase { } + /** + * @param string $table + * @param string $appid + * @param integer $expected + */ public function verifyDB($table, $appid, $expected) { /** @var \OCP\IDBConnection $connection */ $connection = \OC::$server->getDatabaseConnection(); diff --git a/apps/federation/api/ocsauthapi.php b/apps/federation/api/ocsauthapi.php new file mode 100644 index 0000000000..42d7113820 --- /dev/null +++ b/apps/federation/api/ocsauthapi.php @@ -0,0 +1,145 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\API; + +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\IRequest; +use OCP\Security\ISecureRandom; +use OCP\Security\StringUtils; + +/** + * Class OCSAuthAPI + * + * OCS API end-points to exchange shared secret between two connected ownClouds + * + * @package OCA\Federation\API + */ +class OCSAuthAPI { + + /** @var IRequest */ + private $request; + + /** @var ISecureRandom */ + private $secureRandom; + + /** @var IJobList */ + private $jobList; + + /** @var TrustedServers */ + private $trustedServers; + + /** @var DbHandler */ + private $dbHandler; + + /** + * OCSAuthAPI constructor. + * + * @param IRequest $request + * @param ISecureRandom $secureRandom + * @param IJobList $jobList + * @param TrustedServers $trustedServers + * @param DbHandler $dbHandler + */ + public function __construct( + IRequest $request, + ISecureRandom $secureRandom, + IJobList $jobList, + TrustedServers $trustedServers, + DbHandler $dbHandler + ) { + $this->request = $request; + $this->secureRandom = $secureRandom; + $this->jobList = $jobList; + $this->trustedServers = $trustedServers; + $this->dbHandler = $dbHandler; + } + + /** + * request received to ask remote server for a shared secret + * + * @return \OC_OCS_Result + */ + public function requestSharedSecret() { + + $url = $this->request->getParam('url'); + $token = $this->request->getParam('token'); + + if ($this->trustedServers->isTrustedServer($url) === false) { + return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); + } + + // if both server initiated the exchange of the shared secret the greater + // token wins + $localToken = $this->dbHandler->getToken($url); + if (strcmp($localToken, $token) > 0) { + return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); + } + + $this->jobList->add( + 'OCA\Federation\BackgroundJob\GetSharedSecret', + [ + 'url' => $url, + 'token' => $token, + ] + ); + + return new \OC_OCS_Result(null, Http::STATUS_OK); + + } + + /** + * create shared secret and return it + * + * @return \OC_OCS_Result + */ + public function getSharedSecret() { + + $url = $this->request->getParam('url'); + $token = $this->request->getParam('token'); + + if ( + $this->trustedServers->isTrustedServer($url) === false + || $this->isValidToken($url, $token) === false + ) { + return new \OC_OCS_Result(null, HTTP::STATUS_FORBIDDEN); + } + + $sharedSecret = $this->secureRandom->getMediumStrengthGenerator()->generate(32); + + $this->trustedServers->addSharedSecret($url, $sharedSecret); + // reset token after the exchange of the shared secret was successful + $this->dbHandler->addToken($url, ''); + + return new \OC_OCS_Result(['sharedSecret' => $sharedSecret], Http::STATUS_OK); + + } + + protected function isValidToken($url, $token) { + $storedToken = $this->dbHandler->getToken($url); + return StringUtils::equals($storedToken, $token); + } + +} diff --git a/apps/federation/appinfo/app.php b/apps/federation/appinfo/app.php new file mode 100644 index 0000000000..8cc77885d6 --- /dev/null +++ b/apps/federation/appinfo/app.php @@ -0,0 +1,26 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\Federation\AppInfo; + +$app = new Application(); +$app->registerSettings(); +$app->registerHooks(); diff --git a/apps/federation/appinfo/application.php b/apps/federation/appinfo/application.php new file mode 100644 index 0000000000..172283536b --- /dev/null +++ b/apps/federation/appinfo/application.php @@ -0,0 +1,148 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\Federation\AppInfo; + +use OCA\Federation\API\OCSAuthAPI; +use OCA\Federation\Controller\SettingsController; +use OCA\Federation\DbHandler; +use OCA\Federation\Hooks; +use OCA\Federation\Middleware\AddServerMiddleware; +use OCA\Federation\TrustedServers; +use OCP\API; +use OCP\App; +use OCP\AppFramework\IAppContainer; +use OCP\Util; + +class Application extends \OCP\AppFramework\App { + + /** + * @param array $urlParams + */ + public function __construct($urlParams = array()) { + parent::__construct('federation', $urlParams); + $this->registerService(); + $this->registerMiddleware(); + } + + /** + * register setting scripts + */ + public function registerSettings() { + App::registerAdmin('federation', 'settings/settings-admin'); + } + + private function registerService() { + $container = $this->getContainer(); + + $container->registerService('addServerMiddleware', function(IAppContainer $c) { + return new AddServerMiddleware( + $c->getAppName(), + \OC::$server->getL10N($c->getAppName()), + \OC::$server->getLogger() + ); + }); + + $container->registerService('DbHandler', function(IAppContainer $c) { + return new DbHandler( + \OC::$server->getDatabaseConnection(), + \OC::$server->getL10N($c->getAppName()) + ); + }); + + $container->registerService('TrustedServers', function(IAppContainer $c) { + return new TrustedServers( + $c->query('DbHandler'), + \OC::$server->getHTTPClientService(), + \OC::$server->getLogger(), + \OC::$server->getJobList(), + \OC::$server->getSecureRandom(), + \OC::$server->getConfig() + ); + }); + + $container->registerService('SettingsController', function (IAppContainer $c) { + $server = $c->getServer(); + return new SettingsController( + $c->getAppName(), + $server->getRequest(), + $server->getL10N($c->getAppName()), + $c->query('TrustedServers') + ); + }); + } + + private function registerMiddleware() { + $container = $this->getContainer(); + $container->registerMiddleware('addServerMiddleware'); + } + + /** + * register OCS API Calls + */ + public function registerOCSApi() { + + $container = $this->getContainer(); + $server = $container->getServer(); + + $auth = new OCSAuthAPI( + $server->getRequest(), + $server->getSecureRandom(), + $server->getJobList(), + $container->query('TrustedServers'), + $container->query('DbHandler') + + ); + + API::register('get', + '/apps/federation/api/v1/shared-secret', + array($auth, 'getSharedSecret'), + 'federation', + API::GUEST_AUTH + ); + + API::register('post', + '/apps/federation/api/v1/request-shared-secret', + array($auth, 'requestSharedSecret'), + 'federation', + API::GUEST_AUTH + ); + + } + + /** + * listen to federated_share_added hooks to auto-add new servers to the + * list of trusted servers. + */ + public function registerHooks() { + + $container = $this->getContainer(); + $hooksManager = new Hooks($container->query('TrustedServers')); + + Util::connectHook( + 'OCP\Share', + 'federated_share_added', + $hooksManager, + 'addServerHook' + ); + } + +} diff --git a/apps/federation/appinfo/database.xml b/apps/federation/appinfo/database.xml new file mode 100644 index 0000000000..e0bb241918 --- /dev/null +++ b/apps/federation/appinfo/database.xml @@ -0,0 +1,63 @@ + + + *dbname* + true + false + utf8 + + *dbprefix*trusted_servers + + + id + integer + 0 + true + 1 + 4 + + + url + text + true + 512 + Url of trusted server + + + url_hash + text + + true + 32 + md5 hash of the url without the protocol + + + token + text + 128 + toke used to exchange the shared secret + + + shared_secret + text + 256 + shared secret used to authenticate + + + status + integer + 4 + true + 2 + current status of the connection + + + url_hash + true + + url_hash + ascending + + + +
+
diff --git a/apps/federation/appinfo/info.xml b/apps/federation/appinfo/info.xml new file mode 100644 index 0000000000..53b2926ba5 --- /dev/null +++ b/apps/federation/appinfo/info.xml @@ -0,0 +1,14 @@ + + + federation + Federation + ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. + AGPL + Bjoern Schiessle + 0.0.1 + Federation + other + + + + diff --git a/apps/federation/appinfo/routes.php b/apps/federation/appinfo/routes.php new file mode 100644 index 0000000000..8c1629a4fc --- /dev/null +++ b/apps/federation/appinfo/routes.php @@ -0,0 +1,47 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +$application = new \OCA\Federation\AppInfo\Application(); + +$application->registerRoutes( + $this, + [ + 'routes' => [ + [ + 'name' => 'Settings#addServer', + 'url' => '/trusted-servers', + 'verb' => 'POST' + ], + [ + 'name' => 'Settings#removeServer', + 'url' => '/trusted-servers/{id}', + 'verb' => 'DELETE' + ], + [ + 'name' => 'Settings#autoAddServers', + 'url' => '/auto-add-servers', + 'verb' => 'POST' + ], + ] + ] +); + +$application->registerOCSApi(); diff --git a/apps/federation/backgroundjob/getsharedsecret.php b/apps/federation/backgroundjob/getsharedsecret.php new file mode 100644 index 0000000000..eb55fa2d6a --- /dev/null +++ b/apps/federation/backgroundjob/getsharedsecret.php @@ -0,0 +1,185 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\BackgroundJob; + +use GuzzleHttp\Exception\ClientException; +use OC\BackgroundJob\JobList; +use OC\BackgroundJob\QueuedJob; +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClient; +use OCP\ILogger; +use OCP\IURLGenerator; + +/** + * Class GetSharedSecret + * + * request shared secret from remote ownCloud + * + * @package OCA\Federation\Backgroundjob + */ +class GetSharedSecret extends QueuedJob{ + + /** @var IClient */ + private $httpClient; + + /** @var IJobList */ + private $jobList; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** @var TrustedServers */ + private $trustedServers; + + /** @var DbHandler */ + private $dbHandler; + + /** @var ILogger */ + private $logger; + + private $endPoint = '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json'; + + /** + * RequestSharedSecret constructor. + * + * @param IClient $httpClient + * @param IURLGenerator $urlGenerator + * @param IJobList $jobList + * @param TrustedServers $trustedServers + * @param ILogger $logger + * @param DbHandler $dbHandler + */ + public function __construct( + IClient $httpClient = null, + IURLGenerator $urlGenerator = null, + IJobList $jobList = null, + TrustedServers $trustedServers = null, + ILogger $logger = null, + dbHandler $dbHandler = null + ) { + $this->logger = $logger ? $logger : \OC::$server->getLogger(); + $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient(); + $this->jobList = $jobList ? $jobList : \OC::$server->getJobList(); + $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator(); + $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation')); + if ($trustedServers) { + $this->trustedServers = $trustedServers; + } else { + $this->trustedServers = new TrustedServers( + $this->dbHandler, + \OC::$server->getHTTPClientService(), + \OC::$server->getLogger(), + $this->jobList, + \OC::$server->getSecureRandom(), + \OC::$server->getConfig() + ); + } + } + + /** + * run the job, then remove it from the joblist + * + * @param JobList $jobList + * @param ILogger $logger + */ + public function execute($jobList, ILogger $logger = null) { + $jobList->remove($this, $this->argument); + $target = $this->argument['url']; + // only execute if target is still in the list of trusted domains + if ($this->trustedServers->isTrustedServer($target)) { + $this->parentExecute($jobList, $logger); + } + } + + /** + * call execute() method of parent + * + * @param JobList $jobList + * @param ILogger $logger + */ + protected function parentExecute($jobList, $logger) { + parent::execute($jobList, $logger); + } + + protected function run($argument) { + $target = $argument['url']; + $source = $this->urlGenerator->getAbsoluteURL('/'); + $source = rtrim($source, '/'); + $token = $argument['token']; + + try { + $result = $this->httpClient->get( + $target . $this->endPoint, + [ + 'query' => + [ + 'url' => $source, + 'token' => $token + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + ); + + $status = $result->getStatusCode(); + + } catch (ClientException $e) { + $status = $e->getCode(); + } + + // if we received a unexpected response we try again later + if ( + $status !== Http::STATUS_OK + && $status !== Http::STATUS_FORBIDDEN + ) { + $this->jobList->add( + 'OCA\Federation\BackgroundJob\GetSharedSecret', + $argument + ); + } else { + // reset token if we received a valid response + $this->dbHandler->addToken($target, ''); + } + + if ($status === Http::STATUS_OK) { + $body = $result->getBody(); + $result = json_decode($body, true); + if (isset($result['ocs']['data']['sharedSecret'])) { + $this->trustedServers->addSharedSecret( + $target, + $result['ocs']['data']['sharedSecret'] + ); + } else { + $this->logger->error( + 'remote server "' . $target . '"" does not return a valid shared secret', + ['app' => 'federation'] + ); + $this->trustedServers->setServerStatus($target, TrustedServers::STATUS_FAILURE); + } + } + + } +} diff --git a/apps/federation/backgroundjob/requestsharedsecret.php b/apps/federation/backgroundjob/requestsharedsecret.php new file mode 100644 index 0000000000..24d8adada1 --- /dev/null +++ b/apps/federation/backgroundjob/requestsharedsecret.php @@ -0,0 +1,164 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\BackgroundJob; + + +use GuzzleHttp\Exception\ClientException; +use OC\BackgroundJob\JobList; +use OC\BackgroundJob\QueuedJob; +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClient; +use OCP\ILogger; +use OCP\IURLGenerator; + +/** + * Class RequestSharedSecret + * + * Ask remote ownCloud to request a sharedSecret from this server + * + * @package OCA\Federation\Backgroundjob + */ +class RequestSharedSecret extends QueuedJob { + + /** @var IClient */ + private $httpClient; + + /** @var IJobList */ + private $jobList; + + /** @var IURLGenerator */ + private $urlGenerator; + + /** @var DbHandler */ + private $dbHandler; + + /** @var TrustedServers */ + private $trustedServers; + + private $endPoint = '/ocs/v2.php/apps/federation/api/v1/request-shared-secret?format=json'; + + /** + * RequestSharedSecret constructor. + * + * @param IClient $httpClient + * @param IURLGenerator $urlGenerator + * @param IJobList $jobList + * @param TrustedServers $trustedServers + * @param DbHandler $dbHandler + */ + public function __construct( + IClient $httpClient = null, + IURLGenerator $urlGenerator = null, + IJobList $jobList = null, + TrustedServers $trustedServers = null, + dbHandler $dbHandler = null + ) { + $this->httpClient = $httpClient ? $httpClient : \OC::$server->getHTTPClientService()->newClient(); + $this->jobList = $jobList ? $jobList : \OC::$server->getJobList(); + $this->urlGenerator = $urlGenerator ? $urlGenerator : \OC::$server->getURLGenerator(); + $this->dbHandler = $dbHandler ? $dbHandler : new DbHandler(\OC::$server->getDatabaseConnection(), \OC::$server->getL10N('federation')); + if ($trustedServers) { + $this->trustedServers = $trustedServers; + } else { + $this->trustedServers = new TrustedServers( + $this->dbHandler, + \OC::$server->getHTTPClientService(), + \OC::$server->getLogger(), + $this->jobList, + \OC::$server->getSecureRandom(), + \OC::$server->getConfig() + ); + } + } + + + /** + * run the job, then remove it from the joblist + * + * @param JobList $jobList + * @param ILogger $logger + */ + public function execute($jobList, ILogger $logger = null) { + $jobList->remove($this, $this->argument); + $target = $this->argument['url']; + // only execute if target is still in the list of trusted domains + if ($this->trustedServers->isTrustedServer($target)) { + $this->parentExecute($jobList, $logger); + } + } + + /** + * @param JobList $jobList + * @param ILogger $logger + */ + protected function parentExecute($jobList, $logger) { + parent::execute($jobList, $logger); + } + + protected function run($argument) { + + $target = $argument['url']; + $source = $this->urlGenerator->getAbsoluteURL('/'); + $source = rtrim($source, '/'); + $token = $argument['token']; + + try { + $result = $this->httpClient->post( + $target . $this->endPoint, + [ + 'body' => [ + 'url' => $source, + 'token' => $token, + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + ); + + $status = $result->getStatusCode(); + + } catch (ClientException $e) { + $status = $e->getCode(); + } + + // if we received a unexpected response we try again later + if ( + $status !== Http::STATUS_OK + && $status !== Http::STATUS_FORBIDDEN + ) { + $this->jobList->add( + 'OCA\Federation\BackgroundJob\RequestSharedSecret', + $argument + ); + } + + if ($status === Http::STATUS_FORBIDDEN) { + // clear token if remote server refuses to ask for shared secret + $this->dbHandler->addToken($target, ''); + } + + } +} diff --git a/apps/federation/controller/settingscontroller.php b/apps/federation/controller/settingscontroller.php new file mode 100644 index 0000000000..2e28cd60cf --- /dev/null +++ b/apps/federation/controller/settingscontroller.php @@ -0,0 +1,123 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\Federation\Controller; + +use OC\HintException; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\DataResponse; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IRequest; + + +class SettingsController extends Controller { + + /** @var IL10N */ + private $l; + + /** @var TrustedServers */ + private $trustedServers; + + /** + * @param string $AppName + * @param IRequest $request + * @param IL10N $l10n + * @param TrustedServers $trustedServers + */ + public function __construct($AppName, + IRequest $request, + IL10N $l10n, + TrustedServers $trustedServers + ) { + parent::__construct($AppName, $request); + $this->l = $l10n; + $this->trustedServers = $trustedServers; + } + + + /** + * add server to the list of trusted ownClouds + * + * @param string $url + * @return DataResponse + * @throws HintException + */ + public function addServer($url) { + $this->checkServer($url); + $id = $this->trustedServers->addServer($url); + + return new DataResponse( + [ + 'url' => $url, + 'id' => $id, + 'message' => (string) $this->l->t('Server added to the list of trusted ownClouds') + ] + ); + } + + /** + * add server to the list of trusted ownClouds + * + * @param int $id + * @return DataResponse + */ + public function removeServer($id) { + $this->trustedServers->removeServer($id); + return new DataResponse(); + } + + /** + * enable/disable to automatically add servers to the list of trusted servers + * once a federated share was created and accepted successfully + * + * @param bool $autoAddServers + */ + public function autoAddServers($autoAddServers) { + $this->trustedServers->setAutoAddServers($autoAddServers); + } + + /** + * check if the server should be added to the list of trusted servers or not + * + * @param string $url + * @return bool + * @throws HintException + */ + protected function checkServer($url) { + if ($this->trustedServers->isTrustedServer($url) === true) { + $message = 'Server is already in the list of trusted servers.'; + $hint = $this->l->t('Server is already in the list of trusted servers.'); + throw new HintException($message, $hint); + } + + if ($this->trustedServers->isOwnCloudServer($url) === false) { + $message = 'No ownCloud server found'; + $hint = $this->l->t('No ownCloud server found'); + throw new HintException($message, $hint); + } + + return true; + } + +} diff --git a/apps/federation/css/settings-admin.css b/apps/federation/css/settings-admin.css new file mode 100644 index 0000000000..55b1dd64d1 --- /dev/null +++ b/apps/federation/css/settings-admin.css @@ -0,0 +1,26 @@ +#ocFederationSettings p { + padding-top: 10px; +} + +#listOfTrustedServers li { + padding-top: 10px; + padding-left: 20px; +} + +.removeTrustedServer { + display: none; + vertical-align:middle; + padding-left: 10px; +} + +#ocFederationAddServerButton { + cursor: pointer; +} + +#listOfTrustedServers li:hover { + cursor: pointer; +} + +#listOfTrustedServers .status { + margin-right: 10px; +} diff --git a/apps/federation/img/app.svg b/apps/federation/img/app.svg new file mode 100644 index 0000000000..b6ae35211a --- /dev/null +++ b/apps/federation/img/app.svg @@ -0,0 +1,4 @@ + + + + diff --git a/apps/federation/js/settings-admin.js b/apps/federation/js/settings-admin.js new file mode 100644 index 0000000000..7d531b39d8 --- /dev/null +++ b/apps/federation/js/settings-admin.js @@ -0,0 +1,82 @@ +/** + * @author Björn Schießle + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +$(document).ready(function () { + + // show input field to add a new trusted server + $("#ocFederationAddServer").on('click', function() { + $('#ocFederationAddServerButton').addClass('hidden'); + $("#serverUrl").removeClass('hidden'); + $("#serverUrl").focus(); + }); + + // add new trusted server + $("#serverUrl").keyup(function (e) { + if (e.keyCode === 13) { // add server on "enter" + var url = $('#serverUrl').val(); + OC.msg.startSaving('#ocFederationAddServer .msg'); + $.post( + OC.generateUrl('/apps/federation/trusted-servers'), + { + url: url + } + ).done(function (data) { + $('#serverUrl').attr('value', ''); + $('ul#listOfTrustedServers').prepend( + $('
  • ') + .attr('id', data.id) + .attr('class', 'icon-delete') + .html('' + data.url) + ); + OC.msg.finishedSuccess('#ocFederationAddServer .msg', data.message); + }) + .fail(function (jqXHR) { + OC.msg.finishedError('#ocFederationAddServer .msg', JSON.parse(jqXHR.responseText).message); + }); + } else if (e.keyCode === 27) { // hide input filed again in ESC + $('#ocFederationAddServerButton').toggleClass('hidden'); + $("#serverUrl").toggleClass('hidden'); + } + }); + + // remove trusted server from list + $( "#listOfTrustedServers" ).on('click', 'li', function() { + var id = $(this).attr('id'); + var $this = $(this); + $.ajax({ + url: OC.generateUrl('/apps/federation/trusted-servers/' + id), + type: 'DELETE', + success: function(response) { + $this.remove(); + } + }); + + }); + + $("#ocFederationSettings #autoAddServers").change(function() { + $.post( + OC.generateUrl('/apps/federation/auto-add-servers'), + { + autoAddServers: $(this).is(":checked") + } + ); + }); + +}); diff --git a/apps/federation/lib/dbhandler.php b/apps/federation/lib/dbhandler.php new file mode 100644 index 0000000000..7606593f78 --- /dev/null +++ b/apps/federation/lib/dbhandler.php @@ -0,0 +1,270 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation; + + +use OC\Files\Filesystem; +use OC\HintException; +use OCP\IDBConnection; +use OCP\IL10N; + +/** + * Class DbHandler + * + * handles all database calls for the federation app + * + * @group DB + * @package OCA\Federation + */ +class DbHandler { + + /** @var IDBConnection */ + private $connection; + + /** @var IL10N */ + private $l; + + /** @var string */ + private $dbTable = 'trusted_servers'; + + /** + * @param IDBConnection $connection + * @param IL10N $il10n + */ + public function __construct( + IDBConnection $connection, + IL10N $il10n + ) { + $this->connection = $connection; + $this->IL10N = $il10n; + } + + /** + * add server to the list of trusted ownCloud servers + * + * @param string $url + * @return int + * @throws HintException + */ + public function addServer($url) { + $hash = $this->hash($url); + $url = rtrim($url, '/'); + $query = $this->connection->getQueryBuilder(); + $query->insert($this->dbTable) + ->values( + [ + 'url' => $query->createParameter('url'), + 'url_hash' => $query->createParameter('url_hash'), + ] + ) + ->setParameter('url', $url) + ->setParameter('url_hash', $hash); + + $result = $query->execute(); + + if ($result) { + return (int)$this->connection->lastInsertId('*PREFIX*'.$this->dbTable); + } else { + $message = 'Internal failure, Could not add ownCloud as trusted server: ' . $url; + $message_t = $this->l->t('Could not add server'); + throw new HintException($message, $message_t); + } + } + + /** + * remove server from the list of trusted ownCloud servers + * + * @param int $id + */ + public function removeServer($id) { + $query = $this->connection->getQueryBuilder(); + $query->delete($this->dbTable) + ->where($query->expr()->eq('id', $query->createParameter('id'))) + ->setParameter('id', $id); + $query->execute(); + } + + /** + * get all trusted servers + * + * @return array + */ + public function getAllServer() { + $query = $this->connection->getQueryBuilder(); + $query->select(['url', 'id', 'status'])->from($this->dbTable); + $result = $query->execute()->fetchAll(); + return $result; + } + + /** + * check if server already exists in the database table + * + * @param string $url + * @return bool + */ + public function serverExists($url) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->select('url')->from($this->dbTable) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash); + $result = $query->execute()->fetchAll(); + + return !empty($result); + } + + /** + * write token to database. Token is used to exchange the secret + * + * @param string $url + * @param string $token + */ + public function addToken($url, $token) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->update($this->dbTable) + ->set('token', $query->createParameter('token')) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash) + ->setParameter('token', $token); + $query->execute(); + } + + /** + * get token stored in database + * + * @param string $url + * @return string + */ + public function getToken($url) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->select('token')->from($this->dbTable) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash); + + $result = $query->execute()->fetch(); + return $result['token']; + } + + /** + * add shared Secret to database + * + * @param string $url + * @param string $sharedSecret + */ + public function addSharedSecret($url, $sharedSecret) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->update($this->dbTable) + ->set('shared_secret', $query->createParameter('sharedSecret')) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash) + ->setParameter('sharedSecret', $sharedSecret); + $query->execute(); + } + + /** + * get shared secret from database + * + * @param string $url + * @return string + */ + public function getSharedSecret($url) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->select('shared_secret')->from($this->dbTable) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash); + + $result = $query->execute()->fetch(); + return $result['shared_secret']; + } + + /** + * set server status + * + * @param string $url + * @param int $status + */ + public function setServerStatus($url, $status) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->update($this->dbTable) + ->set('status', $query->createParameter('status')) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash) + ->setParameter('status', $status); + $query->execute(); + } + + /** + * get server status + * + * @param string $url + * @return int + */ + public function getServerStatus($url) { + $hash = $this->hash($url); + $query = $this->connection->getQueryBuilder(); + $query->select('status')->from($this->dbTable) + ->where($query->expr()->eq('url_hash', $query->createParameter('url_hash'))) + ->setParameter('url_hash', $hash); + + $result = $query->execute()->fetch(); + return (int)$result['status']; + } + + /** + * create hash from URL + * + * @param string $url + * @return string + */ + protected function hash($url) { + $normalized = $this->normalizeUrl($url); + return md5($normalized); + } + + /** + * normalize URL, used to create the md5 hash + * + * @param string $url + * @return string + */ + protected function normalizeUrl($url) { + $normalized = $url; + + if (strpos($url, 'https://') === 0) { + $normalized = substr($url, strlen('https://')); + } else if (strpos($url, 'http://') === 0) { + $normalized = substr($url, strlen('http://')); + } + + $normalized = Filesystem::normalizePath($normalized); + $normalized = trim($normalized, '/'); + + return $normalized; + } + +} diff --git a/apps/federation/lib/hooks.php b/apps/federation/lib/hooks.php new file mode 100644 index 0000000000..4bf5be4e5b --- /dev/null +++ b/apps/federation/lib/hooks.php @@ -0,0 +1,50 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation; + + + +class Hooks { + + /** @var TrustedServers */ + private $trustedServers; + + public function __construct(TrustedServers $trustedServers) { + $this->trustedServers = $trustedServers; + } + + /** + * add servers to the list of trusted servers once a federated share was established + * + * @param array $params + */ + public function addServerHook($params) { + if ( + $this->trustedServers->getAutoAddServers() === true && + $this->trustedServers->isTrustedServer($params['server']) === false + ) { + $this->trustedServers->addServer($params['server']); + } + } + +} diff --git a/apps/federation/lib/trustedservers.php b/apps/federation/lib/trustedservers.php new file mode 100644 index 0000000000..96a2917807 --- /dev/null +++ b/apps/federation/lib/trustedservers.php @@ -0,0 +1,254 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation; + +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClientService; +use OCP\IConfig; +use OCP\ILogger; +use OCP\Security\ISecureRandom; + +class TrustedServers { + + /** after a user list was exchanged at least once successfully */ + const STATUS_OK = 1; + /** waiting for shared secret or initial user list exchange */ + const STATUS_PENDING = 2; + /** something went wrong, misconfigured server, software bug,... user interaction needed */ + const STATUS_FAILURE = 3; + + /** @var dbHandler */ + private $dbHandler; + + /** @var IClientService */ + private $httpClientService; + + /** @var ILogger */ + private $logger; + + /** @var IJobList */ + private $jobList; + + /** @var ISecureRandom */ + private $secureRandom; + + /** @var IConfig */ + private $config; + + /** + * @param DbHandler $dbHandler + * @param IClientService $httpClientService + * @param ILogger $logger + * @param IJobList $jobList + * @param ISecureRandom $secureRandom + * @param IConfig $config + */ + public function __construct( + DbHandler $dbHandler, + IClientService $httpClientService, + ILogger $logger, + IJobList $jobList, + ISecureRandom $secureRandom, + IConfig $config + ) { + $this->dbHandler = $dbHandler; + $this->httpClientService = $httpClientService; + $this->logger = $logger; + $this->jobList = $jobList; + $this->secureRandom = $secureRandom; + $this->config = $config; + } + + /** + * add server to the list of trusted ownCloud servers + * + * @param $url + * @return int server id + */ + public function addServer($url) { + $url = $this->updateProtocol($url); + $result = $this->dbHandler->addServer($url); + if ($result) { + $token = $this->secureRandom->getMediumStrengthGenerator()->generate(16); + $this->dbHandler->addToken($url, $token); + $this->jobList->add( + 'OCA\Federation\BackgroundJob\RequestSharedSecret', + [ + 'url' => $url, + 'token' => $token + ] + ); + } + + return $result; + } + + /** + * enable/disable to automatically add servers to the list of trusted servers + * once a federated share was created and accepted successfully + * + * @param bool $status + */ + public function setAutoAddServers($status) { + $value = $status ? '1' : '0'; + $this->config->setAppValue('federation', 'autoAddServers', $value); + } + + /** + * return if we automatically add servers to the list of trusted servers + * once a federated share was created and accepted successfully + * + * @return bool + */ + public function getAutoAddServers() { + $value = $this->config->getAppValue('federation', 'autoAddServers', '1'); + return $value === '1'; + } + + /** + * get shared secret for the given server + * + * @param string $url + * @return string + */ + public function getSharedSecret($url) { + return $this->dbHandler->getSharedSecret($url); + } + + /** + * add shared secret for the given server + * + * @param string $url + * @param $sharedSecret + */ + public function addSharedSecret($url, $sharedSecret) { + $this->dbHandler->addSharedSecret($url, $sharedSecret); + } + + /** + * remove server from the list of trusted ownCloud servers + * + * @param int $id + */ + public function removeServer($id) { + $this->dbHandler->removeServer($id); + } + + /** + * get all trusted servers + * + * @return array + */ + public function getServers() { + return $this->dbHandler->getAllServer(); + } + + /** + * check if given server is a trusted ownCloud server + * + * @param string $url + * @return bool + */ + public function isTrustedServer($url) { + return $this->dbHandler->serverExists($url); + } + + /** + * set server status + * + * @param string $url + * @param int $status + */ + public function setServerStatus($url, $status) { + $this->dbHandler->setServerStatus($url, $status); + } + + /** + * @param string $url + * @return int + */ + public function getServerStatus($url) { + return $this->dbHandler->getServerStatus($url); + } + + /** + * check if URL point to a ownCloud server + * + * @param string $url + * @return bool + */ + public function isOwnCloudServer($url) { + $isValidOwnCloud = false; + $client = $this->httpClientService->newClient(); + try { + $result = $client->get( + $url . '/status.php', + [ + 'timeout' => 3, + 'connect_timeout' => 3, + ] + ); + if ($result->getStatusCode() === Http::STATUS_OK) { + $isValidOwnCloud = $this->checkOwnCloudVersion($result->getBody()); + } + } catch (\Exception $e) { + $this->logger->error($e->getMessage(), ['app' => 'federation']); + return false; + } + return $isValidOwnCloud; + } + + /** + * check if ownCloud version is >= 9.0 + * + * @param $statusphp + * @return bool + */ + protected function checkOwnCloudVersion($statusphp) { + $decoded = json_decode($statusphp, true); + if (!empty($decoded) && isset($decoded['version'])) { + return version_compare($decoded['version'], '9.0.0', '>='); + } + return false; + } + + /** + * check if the URL contain a protocol, if not add https + * + * @param string $url + * @return string + */ + protected function updateProtocol($url) { + if ( + strpos($url, 'https://') === 0 + || strpos($url, 'http://') === 0 + ) { + + return $url; + + } + + return 'https://' . $url; + } +} diff --git a/apps/federation/middleware/addservermiddleware.php b/apps/federation/middleware/addservermiddleware.php new file mode 100644 index 0000000000..56552021dc --- /dev/null +++ b/apps/federation/middleware/addservermiddleware.php @@ -0,0 +1,71 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\Federation\Middleware ; + +use OC\HintException; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Middleware; +use OCP\IL10N; +use OCP\ILogger; + +class AddServerMiddleware extends Middleware { + + /** @var string */ + protected $appName; + + /** @var IL10N */ + protected $l; + + /** @var ILogger */ + protected $logger; + + public function __construct($appName, IL10N $l, ILogger $logger) { + $this->appName = $appName; + $this->l = $l; + $this->logger = $logger; + } + + /** + * Log error message and return a response which can be displayed to the user + * + * @param \OCP\AppFramework\Controller $controller + * @param string $methodName + * @param \Exception $exception + * @return JSONResponse + */ + public function afterException($controller, $methodName, \Exception $exception) { + $this->logger->error($exception->getMessage(), ['app' => $this->appName]); + if ($exception instanceof HintException) { + $message = $exception->getHint(); + } else { + $message = $this->l->t('Unknown error'); + } + + return new JSONResponse( + ['message' => $message], + Http::STATUS_BAD_REQUEST + ); + + } + +} diff --git a/apps/federation/settings/settings-admin.php b/apps/federation/settings/settings-admin.php new file mode 100644 index 0000000000..76ae0c3b6e --- /dev/null +++ b/apps/federation/settings/settings-admin.php @@ -0,0 +1,43 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +\OC_Util::checkAdminUser(); + +$template = new OCP\Template('federation', 'settings-admin'); + +$dbHandler = new \OCA\Federation\DbHandler( + \OC::$server->getDatabaseConnection(), + \OC::$server->getL10N('federation') +); + +$trustedServers = new \OCA\Federation\TrustedServers( + $dbHandler, + \OC::$server->getHTTPClientService(), + \OC::$server->getLogger(), + \OC::$server->getJobList(), + \OC::$server->getSecureRandom(), + \OC::$server->getConfig() +); + +$template->assign('trustedServers', $trustedServers->getServers()); +$template->assign('autoAddServers', $trustedServers->getAutoAddServers()); + +return $template->fetchPage(); diff --git a/apps/federation/templates/settings-admin.php b/apps/federation/templates/settings-admin.php new file mode 100644 index 0000000000..854bb74417 --- /dev/null +++ b/apps/federation/templates/settings-admin.php @@ -0,0 +1,40 @@ + +
    +

    t('Federation')); ?>

    + t('ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing.')); ?> + +

    + /> + +

    + +

    Trusted ownCloud Servers

    +

    + + + +

    +
      + +
    • + + + + + + + + +
    • + +
    + +
    + diff --git a/apps/federation/tests/api/ocsauthapitest.php b/apps/federation/tests/api/ocsauthapitest.php new file mode 100644 index 0000000000..a334686c24 --- /dev/null +++ b/apps/federation/tests/api/ocsauthapitest.php @@ -0,0 +1,184 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\API; + + +use OC\BackgroundJob\JobList; +use OCA\Federation\API\OCSAuthAPI; +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Http; +use OCP\IRequest; +use OCP\Security\ISecureRandom; +use Test\TestCase; + +class OCSAuthAPITest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | IRequest */ + private $request; + + /** @var \PHPUnit_Framework_MockObject_MockObject | ISecureRandom */ + private $secureRandom; + + /** @var \PHPUnit_Framework_MockObject_MockObject | JobList */ + private $jobList; + + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */ + private $trustedServers; + + /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */ + private $dbHandler; + + /** @var OCSAuthApi */ + private $ocsAuthApi; + + public function setUp() { + parent::setUp(); + + $this->request = $this->getMock('OCP\IRequest'); + $this->secureRandom = $this->getMock('OCP\Security\ISecureRandom'); + $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->disableOriginalConstructor()->getMock(); + $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler') + ->disableOriginalConstructor()->getMock(); + $this->jobList = $this->getMockBuilder('OC\BackgroundJob\JobList') + ->disableOriginalConstructor()->getMock(); + + $this->ocsAuthApi = new OCSAuthAPI( + $this->request, + $this->secureRandom, + $this->jobList, + $this->trustedServers, + $this->dbHandler + ); + + } + + /** + * @dataProvider dataTestRequestSharedSecret + * + * @param string $token + * @param string $localToken + * @param bool $isTrustedServer + * @param int $expected + */ + public function testRequestSharedSecret($token, $localToken, $isTrustedServer, $expected) { + + $url = 'url'; + + $this->request->expects($this->at(0))->method('getParam')->with('url')->willReturn($url); + $this->request->expects($this->at(1))->method('getParam')->with('token')->willReturn($token); + $this->trustedServers + ->expects($this->once()) + ->method('isTrustedServer')->with($url)->willReturn($isTrustedServer); + $this->dbHandler->expects($this->any()) + ->method('getToken')->with($url)->willReturn($localToken); + + if ($expected === Http::STATUS_OK) { + $this->jobList->expects($this->once())->method('add') + ->with('OCA\Federation\BackgroundJob\GetSharedSecret', ['url' => $url, 'token' => $token]); + } else { + $this->jobList->expects($this->never())->method('add'); + } + + $result = $this->ocsAuthApi->requestSharedSecret(); + $this->assertSame($expected, $result->getStatusCode()); + } + + public function dataTestRequestSharedSecret() { + return [ + ['token2', 'token1', true, Http::STATUS_OK], + ['token1', 'token2', false, Http::STATUS_FORBIDDEN], + ['token1', 'token2', true, Http::STATUS_FORBIDDEN], + ]; + } + + /** + * @dataProvider dataTestGetSharedSecret + * + * @param bool $isTrustedServer + * @param bool $isValidToken + * @param int $expected + */ + public function testGetSharedSecret($isTrustedServer, $isValidToken, $expected) { + + $url = 'url'; + $token = 'token'; + + $this->request->expects($this->at(0))->method('getParam')->with('url')->willReturn($url); + $this->request->expects($this->at(1))->method('getParam')->with('token')->willReturn($token); + + /** @var OCSAuthAPI | \PHPUnit_Framework_MockObject_MockObject $ocsAuthApi */ + $ocsAuthApi = $this->getMockBuilder('OCA\Federation\API\OCSAuthAPI') + ->setConstructorArgs( + [ + $this->request, + $this->secureRandom, + $this->jobList, + $this->trustedServers, + $this->dbHandler + ] + )->setMethods(['isValidToken'])->getMock(); + + $this->trustedServers + ->expects($this->any()) + ->method('isTrustedServer')->with($url)->willReturn($isTrustedServer); + $ocsAuthApi->expects($this->any()) + ->method('isValidToken')->with($url, $token)->willReturn($isValidToken); + + if($expected === Http::STATUS_OK) { + $this->secureRandom->expects($this->once())->method('getMediumStrengthGenerator') + ->willReturn($this->secureRandom); + $this->secureRandom->expects($this->once())->method('generate')->with(32) + ->willReturn('secret'); + $this->trustedServers->expects($this->once()) + ->method('addSharedSecret')->willReturn($url, 'secret'); + $this->dbHandler->expects($this->once()) + ->method('addToken')->with($url, ''); + } else { + $this->secureRandom->expects($this->never())->method('getMediumStrengthGenerator'); + $this->secureRandom->expects($this->never())->method('generate'); + $this->trustedServers->expects($this->never())->method('addSharedSecret'); + $this->dbHandler->expects($this->never())->method('addToken'); + } + + $result = $ocsAuthApi->getSharedSecret(); + + $this->assertSame($expected, $result->getStatusCode()); + + if ($expected === Http::STATUS_OK) { + $data = $result->getData(); + $this->assertSame('secret', $data['sharedSecret']); + } + } + + public function dataTestGetSharedSecret() { + return [ + [true, true, Http::STATUS_OK], + [false, true, Http::STATUS_FORBIDDEN], + [true, false, Http::STATUS_FORBIDDEN], + [false, false, Http::STATUS_FORBIDDEN], + ]; + } + +} diff --git a/apps/federation/tests/backgroundjob/getsharedsecrettest.php b/apps/federation/tests/backgroundjob/getsharedsecrettest.php new file mode 100644 index 0000000000..cb3a294713 --- /dev/null +++ b/apps/federation/tests/backgroundjob/getsharedsecrettest.php @@ -0,0 +1,197 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\BackgroundJob; + + +use OCA\Federation\BackgroundJob\GetSharedSecret; +use OCA\Files_Sharing\Tests\TestCase; +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClient; +use OCP\Http\Client\IResponse; +use OCP\ILogger; +use OCP\IURLGenerator; + +/** + * Class GetSharedSecretTest + * + * @group DB + * + * @package OCA\Federation\Tests\BackgroundJob + */ +class GetSharedSecretTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */ + private $httpClient; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */ + private $jobList; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IURLGenerator */ + private $urlGenerator; + + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */ + private $trustedServers; + + /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */ + private $dbHandler; + + /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */ + private $logger; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */ + private $response; + + /** @var GetSharedSecret */ + private $getSharedSecret; + + public function setUp() { + parent::setUp(); + + $this->httpClient = $this->getMock('OCP\Http\Client\IClient'); + $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList'); + $this->urlGenerator = $this->getMock('OCP\IURLGenerator'); + $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->disableOriginalConstructor()->getMock(); + $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler') + ->disableOriginalConstructor()->getMock(); + $this->logger = $this->getMock('OCP\ILogger'); + $this->response = $this->getMock('OCP\Http\Client\IResponse'); + + $this->getSharedSecret = new GetSharedSecret( + $this->httpClient, + $this->urlGenerator, + $this->jobList, + $this->trustedServers, + $this->logger, + $this->dbHandler + ); + } + + /** + * @dataProvider dataTestExecute + * + * @param bool $isTrustedServer + */ + public function testExecute($isTrustedServer) { + /** @var GetSharedSecret |\PHPUnit_Framework_MockObject_MockObject $getSharedSecret */ + $getSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\GetSharedSecret') + ->setConstructorArgs( + [ + $this->httpClient, + $this->urlGenerator, + $this->jobList, + $this->trustedServers, + $this->logger, + $this->dbHandler + ] + )->setMethods(['parentExecute'])->getMock(); + $this->invokePrivate($getSharedSecret, 'argument', [['url' => 'url']]); + + $this->jobList->expects($this->once())->method('remove'); + $this->trustedServers->expects($this->once())->method('isTrustedServer') + ->with('url')->willReturn($isTrustedServer); + if ($isTrustedServer) { + $getSharedSecret->expects($this->once())->method('parentExecute'); + } else { + $getSharedSecret->expects($this->never())->method('parentExecute'); + } + + $getSharedSecret->execute($this->jobList); + + } + + public function dataTestExecute() { + return [ + [true], + [false] + ]; + } + + /** + * @dataProvider dataTestRun + * + * @param int $statusCode + */ + public function testRun($statusCode) { + + $target = 'targetURL'; + $source = 'sourceURL'; + $token = 'token'; + + $argument = ['url' => $target, 'token' => $token]; + + $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')->with('/') + ->willReturn($source); + $this->httpClient->expects($this->once())->method('get') + ->with( + $target . '/ocs/v2.php/apps/federation/api/v1/shared-secret?format=json', + [ + 'query' => + [ + 'url' => $source, + 'token' => $token + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + )->willReturn($this->response); + + $this->response->expects($this->once())->method('getStatusCode') + ->willReturn($statusCode); + + if ( + $statusCode !== Http::STATUS_OK + && $statusCode !== Http::STATUS_FORBIDDEN + ) { + $this->jobList->expects($this->once())->method('add') + ->with('OCA\Federation\BackgroundJob\GetSharedSecret', $argument); + $this->dbHandler->expects($this->never())->method('addToken'); + } else { + $this->dbHandler->expects($this->once())->method('addToken')->with($target, ''); + $this->jobList->expects($this->never())->method('add'); + } + + if ($statusCode === Http::STATUS_OK) { + $this->response->expects($this->once())->method('getBody') + ->willReturn('{"ocs":{"data":{"sharedSecret":"secret"}}}'); + $this->trustedServers->expects($this->once())->method('addSharedSecret') + ->with($target, 'secret'); + } else { + $this->trustedServers->expects($this->never())->method('addSharedSecret'); + } + + $this->invokePrivate($this->getSharedSecret, 'run', [$argument]); + } + + public function dataTestRun() { + return [ + [Http::STATUS_OK], + [Http::STATUS_FORBIDDEN], + [Http::STATUS_CONFLICT], + ]; + } + +} diff --git a/apps/federation/tests/backgroundjob/requestsharedsecrettest.php b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php new file mode 100644 index 0000000000..df81113c68 --- /dev/null +++ b/apps/federation/tests/backgroundjob/requestsharedsecrettest.php @@ -0,0 +1,169 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\BackgroundJob; + + +use OCA\Federation\BackgroundJob\RequestSharedSecret; +use OCP\AppFramework\Http; +use Test\TestCase; + +class RequestSharedSecretTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */ + private $httpClient; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */ + private $jobList; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IURLGenerator */ + private $urlGenerator; + + /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */ + private $dbHandler; + + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */ + private $trustedServers; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */ + private $response; + + /** @var RequestSharedSecret */ + private $requestSharedSecret; + + public function setUp() { + parent::setUp(); + + $this->httpClient = $this->getMock('OCP\Http\Client\IClient'); + $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList'); + $this->urlGenerator = $this->getMock('OCP\IURLGenerator'); + $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->disableOriginalConstructor()->getMock(); + $this->dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler') + ->disableOriginalConstructor()->getMock(); + $this->response = $this->getMock('OCP\Http\Client\IResponse'); + + $this->requestSharedSecret = new RequestSharedSecret( + $this->httpClient, + $this->urlGenerator, + $this->jobList, + $this->trustedServers, + $this->dbHandler + ); + } + + /** + * @dataProvider dataTestExecute + * + * @param bool $isTrustedServer + */ + public function testExecute($isTrustedServer) { + /** @var RequestSharedSecret |\PHPUnit_Framework_MockObject_MockObject $requestSharedSecret */ + $requestSharedSecret = $this->getMockBuilder('OCA\Federation\BackgroundJob\RequestSharedSecret') + ->setConstructorArgs( + [ + $this->httpClient, + $this->urlGenerator, + $this->jobList, + $this->trustedServers, + $this->dbHandler + ] + )->setMethods(['parentExecute'])->getMock(); + $this->invokePrivate($requestSharedSecret, 'argument', [['url' => 'url']]); + + $this->jobList->expects($this->once())->method('remove'); + $this->trustedServers->expects($this->once())->method('isTrustedServer') + ->with('url')->willReturn($isTrustedServer); + if ($isTrustedServer) { + $requestSharedSecret->expects($this->once())->method('parentExecute'); + } else { + $requestSharedSecret->expects($this->never())->method('parentExecute'); + } + + $requestSharedSecret->execute($this->jobList); + + } + + public function dataTestExecute() { + return [ + [true], + [false] + ]; + } + + /** + * @dataProvider dataTestRun + * + * @param int $statusCode + */ + public function testRun($statusCode) { + + $target = 'targetURL'; + $source = 'sourceURL'; + $token = 'token'; + + $argument = ['url' => $target, 'token' => $token]; + + $this->urlGenerator->expects($this->once())->method('getAbsoluteURL')->with('/') + ->willReturn($source); + $this->httpClient->expects($this->once())->method('post') + ->with( + $target . '/ocs/v2.php/apps/federation/api/v1/request-shared-secret?format=json', + [ + 'body' => + [ + 'url' => $source, + 'token' => $token + ], + 'timeout' => 3, + 'connect_timeout' => 3, + ] + )->willReturn($this->response); + + $this->response->expects($this->once())->method('getStatusCode') + ->willReturn($statusCode); + + if ( + $statusCode !== Http::STATUS_OK + && $statusCode !== Http::STATUS_FORBIDDEN + ) { + $this->jobList->expects($this->once())->method('add') + ->with('OCA\Federation\BackgroundJob\RequestSharedSecret', $argument); + $this->dbHandler->expects($this->never())->method('addToken'); + } + + if ($statusCode === Http::STATUS_FORBIDDEN) { + $this->jobList->expects($this->never())->method('add'); + $this->dbHandler->expects($this->once())->method('addToken')->with($target, ''); + } + + $this->invokePrivate($this->requestSharedSecret, 'run', [$argument]); + } + + public function dataTestRun() { + return [ + [Http::STATUS_OK], + [Http::STATUS_FORBIDDEN], + [Http::STATUS_CONFLICT], + ]; + } +} diff --git a/apps/federation/tests/controller/settingscontrollertest.php b/apps/federation/tests/controller/settingscontrollertest.php new file mode 100644 index 0000000000..efbc6911c5 --- /dev/null +++ b/apps/federation/tests/controller/settingscontrollertest.php @@ -0,0 +1,166 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\Controller; + + +use OCA\Federation\Controller\SettingsController; +use OCP\AppFramework\Http\DataResponse; +use Test\TestCase; + +class SettingsControllerTest extends TestCase { + + /** @var SettingsController */ + private $controller; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IRequest */ + private $request; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IL10N */ + private $l10n; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCA\Federation\TrustedServers */ + private $trustedServers; + + public function setUp() { + parent::setUp(); + + $this->request = $this->getMock('OCP\IRequest'); + $this->l10n = $this->getMock('OCP\IL10N'); + $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->disableOriginalConstructor()->getMock(); + + $this->controller = new SettingsController( + 'SettingsControllerTest', + $this->request, + $this->l10n, + $this->trustedServers + ); + } + + public function testAddServer() { + $this->trustedServers + ->expects($this->once()) + ->method('isTrustedServer') + ->with('url') + ->willReturn(false); + $this->trustedServers + ->expects($this->once()) + ->method('isOwnCloudServer') + ->with('url') + ->willReturn(true); + + $result = $this->controller->addServer('url'); + $this->assertTrue($result instanceof DataResponse); + + $data = $result->getData(); + $this->assertSame(200, $result->getStatus()); + $this->assertSame('url', $data['url']); + $this->assertArrayHasKey('id', $data); + } + + /** + * @dataProvider checkServerFails + * @expectedException \OC\HintException + * + * @param bool $isTrustedServer + * @param bool $isOwnCloud + */ + public function testAddServerFail($isTrustedServer, $isOwnCloud) { + $this->trustedServers + ->expects($this->any()) + ->method('isTrustedServer') + ->with('url') + ->willReturn($isTrustedServer); + $this->trustedServers + ->expects($this->any()) + ->method('isOwnCloudServer') + ->with('url') + ->willReturn($isOwnCloud); + + $this->controller->addServer('url'); + } + + public function testRemoveServer() { + $this->trustedServers->expects($this->once())->method('removeServer') + ->with('url'); + $result = $this->controller->removeServer('url'); + $this->assertTrue($result instanceof DataResponse); + $this->assertSame(200, $result->getStatus()); + } + + public function testCheckServer() { + $this->trustedServers + ->expects($this->once()) + ->method('isTrustedServer') + ->with('url') + ->willReturn(false); + $this->trustedServers + ->expects($this->once()) + ->method('isOwnCloudServer') + ->with('url') + ->willReturn(true); + + $this->assertTrue( + $this->invokePrivate($this->controller, 'checkServer', ['url']) + ); + + } + + /** + * @dataProvider checkServerFails + * @expectedException \OC\HintException + * + * @param bool $isTrustedServer + * @param bool $isOwnCloud + */ + public function testCheckServerFail($isTrustedServer, $isOwnCloud) { + $this->trustedServers + ->expects($this->any()) + ->method('isTrustedServer') + ->with('url') + ->willReturn($isTrustedServer); + $this->trustedServers + ->expects($this->any()) + ->method('isOwnCloudServer') + ->with('url') + ->willReturn($isOwnCloud); + + $this->assertTrue( + $this->invokePrivate($this->controller, 'checkServer', ['url']) + ); + + } + + /** + * data to simulate checkServer fails + * + * @return array + */ + public function checkServerFails() { + return [ + [true, true], + [false, false] + ]; + } + +} diff --git a/apps/federation/tests/lib/dbhandlertest.php b/apps/federation/tests/lib/dbhandlertest.php new file mode 100644 index 0000000000..123eaaee45 --- /dev/null +++ b/apps/federation/tests/lib/dbhandlertest.php @@ -0,0 +1,259 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\lib; + + +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\IDBConnection; +use Test\TestCase; + +/** + * @group DB + */ +class DbHandlerTest extends TestCase { + + /** @var DbHandler */ + private $dbHandler; + + /** @var \PHPUnit_Framework_MockObject_MockObject */ + private $il10n; + + /** @var IDBConnection */ + private $connection; + + /** @var string */ + private $dbTable = 'trusted_servers'; + + public function setUp() { + parent::setUp(); + + $this->connection = \OC::$server->getDatabaseConnection(); + $this->il10n = $this->getMock('OCP\IL10N'); + + $this->dbHandler = new DbHandler( + $this->connection, + $this->il10n + ); + + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertEmpty($result, 'we need to start with a empty trusted_servers table'); + } + + public function tearDown() { + parent::tearDown(); + $query = $this->connection->getQueryBuilder()->delete($this->dbTable); + $query->execute(); + } + + /** + * @dataProvider dataTestAddServer + * + * @param string $url passed to the method + * @param string $expectedUrl the url we expect to be written to the db + * @param string $expectedHash the hash value we expect to be written to the db + */ + public function testAddServer($url, $expectedUrl, $expectedHash) { + $id = $this->dbHandler->addServer($url); + + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame($expectedUrl, $result[0]['url']); + $this->assertSame($id, (int)$result[0]['id']); + $this->assertSame($expectedHash, $result[0]['url_hash']); + $this->assertSame(TrustedServers::STATUS_PENDING, (int)$result[0]['status']); + } + + public function dataTestAddServer() { + return [ + ['http://owncloud.org', 'http://owncloud.org', md5('owncloud.org')], + ['https://owncloud.org', 'https://owncloud.org', md5('owncloud.org')], + ['http://owncloud.org/', 'http://owncloud.org', md5('owncloud.org')], + ]; + } + + public function testRemove() { + $id1 = $this->dbHandler->addServer('server1'); + $id2 = $this->dbHandler->addServer('server2'); + + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(2, count($result)); + $this->assertSame('server1', $result[0]['url']); + $this->assertSame('server2', $result[1]['url']); + $this->assertSame($id1, (int)$result[0]['id']); + $this->assertSame($id2, (int)$result[1]['id']); + + $this->dbHandler->removeServer($id2); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame('server1', $result[0]['url']); + $this->assertSame($id1, (int)$result[0]['id']); + } + + public function testGetAll() { + $id1 = $this->dbHandler->addServer('server1'); + $id2 = $this->dbHandler->addServer('server2'); + + $result = $this->dbHandler->getAllServer(); + $this->assertSame(2, count($result)); + $this->assertSame('server1', $result[0]['url']); + $this->assertSame('server2', $result[1]['url']); + $this->assertSame($id1, (int)$result[0]['id']); + $this->assertSame($id2, (int)$result[1]['id']); + } + + /** + * @dataProvider dataTestServerExists + * + * @param string $serverInTable + * @param string $checkForServer + * @param bool $expected + */ + public function testServerExists($serverInTable, $checkForServer, $expected) { + $this->dbHandler->addServer($serverInTable); + $this->assertSame($expected, + $this->dbHandler->serverExists($checkForServer) + ); + } + + public function dataTestServerExists() { + return [ + ['server1', 'server1', true], + ['server1', 'http://server1', true], + ['server1', 'server2', false] + ]; + } + + public function testAddToken() { + $this->dbHandler->addServer('server1'); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame(null, $result[0]['token']); + $this->dbHandler->addToken('http://server1', 'token'); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame('token', $result[0]['token']); + } + + public function testGetToken() { + $this->dbHandler->addServer('server1'); + $this->dbHandler->addToken('http://server1', 'token'); + $this->assertSame('token', + $this->dbHandler->getToken('https://server1') + ); + } + + public function testAddSharedSecret() { + $this->dbHandler->addServer('server1'); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame(null, $result[0]['shared_secret']); + $this->dbHandler->addSharedSecret('http://server1', 'secret'); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame('secret', $result[0]['shared_secret']); + } + + public function testGetSharedSecret() { + $this->dbHandler->addServer('server1'); + $this->dbHandler->addSharedSecret('http://server1', 'secret'); + $this->assertSame('secret', + $this->dbHandler->getSharedSecret('https://server1') + ); + } + + public function testSetServerStatus() { + $this->dbHandler->addServer('server1'); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame(TrustedServers::STATUS_PENDING, (int)$result[0]['status']); + $this->dbHandler->setServerStatus('http://server1', TrustedServers::STATUS_OK); + $query = $this->connection->getQueryBuilder()->select('*')->from($this->dbTable); + $result = $query->execute()->fetchAll(); + $this->assertSame(1, count($result)); + $this->assertSame(TrustedServers::STATUS_OK, (int)$result[0]['status']); + } + + public function testGetServerStatus() { + $this->dbHandler->addServer('server1'); + $this->dbHandler->setServerStatus('http://server1', TrustedServers::STATUS_OK); + $this->assertSame(TrustedServers::STATUS_OK, + $this->dbHandler->getServerStatus('https://server1') + ); + } + + /** + * hash should always be computed with the normalized URL + * + * @dataProvider dataTestHash + * + * @param string $url + * @param string $expected + */ + public function testHash($url, $expected) { + $this->assertSame($expected, + $this->invokePrivate($this->dbHandler, 'hash', [$url]) + ); + } + + public function dataTestHash() { + return [ + ['server1', md5('server1')], + ['http://server1', md5('server1')], + ['https://server1', md5('server1')], + ['http://server1/', md5('server1')], + ]; + } + + /** + * @dataProvider dataTestNormalizeUrl + * + * @param string $url + * @param string $expected + */ + public function testNormalizeUrl($url, $expected) { + $this->assertSame($expected, + $this->invokePrivate($this->dbHandler, 'normalizeUrl', [$url]) + ); + } + + public function dataTestNormalizeUrl() { + return [ + ['owncloud.org', 'owncloud.org'], + ['http://owncloud.org', 'owncloud.org'], + ['https://owncloud.org', 'owncloud.org'], + ['https://owncloud.org//mycloud', 'owncloud.org/mycloud'], + ['https://owncloud.org/mycloud/', 'owncloud.org/mycloud'], + ]; + } + +} diff --git a/apps/federation/tests/lib/hookstest.php b/apps/federation/tests/lib/hookstest.php new file mode 100644 index 0000000000..5b19c16745 --- /dev/null +++ b/apps/federation/tests/lib/hookstest.php @@ -0,0 +1,79 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\lib; + + +use OCA\Federation\Hooks; +use OCA\Federation\TrustedServers; +use Test\TestCase; + +class HooksTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers */ + private $trustedServers; + + /** @var Hooks */ + private $hooks; + + public function setUp() { + parent::setUp(); + + $this->trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->disableOriginalConstructor()->getMock(); + + $this->hooks = new Hooks($this->trustedServers); + } + + /** + * @dataProvider dataTestAddServerHook + * + * @param bool $autoAddEnabled is auto-add enabled + * @param bool $isTrustedServer is the server already in the list of trusted servers + * @param bool $addServer should the server be added + */ + public function testAddServerHook($autoAddEnabled, $isTrustedServer, $addServer) { + $this->trustedServers->expects($this->any())->method('getAutoAddServers') + ->willReturn($autoAddEnabled); + $this->trustedServers->expects($this->any())->method('isTrustedServer') + ->with('url')->willReturn($isTrustedServer); + + if ($addServer) { + $this->trustedServers->expects($this->once())->method('addServer') + ->with('url'); + } else { + $this->trustedServers->expects($this->never())->method('addServer'); + } + + $this->hooks->addServerHook(['server' => 'url']); + + } + + public function dataTestAddServerHook() { + return [ + [true, true, false], + [false, true, false], + [true, false, true], + [false, false, false], + ]; + } +} diff --git a/apps/federation/tests/lib/trustedserverstest.php b/apps/federation/tests/lib/trustedserverstest.php new file mode 100644 index 0000000000..d067cd1c18 --- /dev/null +++ b/apps/federation/tests/lib/trustedserverstest.php @@ -0,0 +1,344 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\lib; + + +use OCA\Federation\DbHandler; +use OCA\Federation\TrustedServers; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClient; +use OCP\Http\Client\IClientService; +use OCP\Http\Client\IResponse; +use OCP\IConfig; +use OCP\ILogger; +use OCP\Security\ISecureRandom; +use Test\TestCase; + +class TrustedServersTest extends TestCase { + + /** @var TrustedServers */ + private $trustedServers; + + /** @var \PHPUnit_Framework_MockObject_MockObject | DbHandler */ + private $dbHandler; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IClientService */ + private $httpClientService; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IClient */ + private $httpClient; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IResponse */ + private $response; + + /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */ + private $logger; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IJobList */ + private $jobList; + + /** @var \PHPUnit_Framework_MockObject_MockObject | ISecureRandom */ + private $secureRandom; + + /** @var \PHPUnit_Framework_MockObject_MockObject | IConfig */ + private $config; + + public function setUp() { + parent::setUp(); + + $this->dbHandler = $this->getMockBuilder('\OCA\Federation\DbHandler') + ->disableOriginalConstructor()->getMock(); + $this->httpClientService = $this->getMock('OCP\Http\Client\IClientService'); + $this->httpClient = $this->getMock('OCP\Http\Client\IClient'); + $this->response = $this->getMock('OCP\Http\Client\IResponse'); + $this->logger = $this->getMock('OCP\ILogger'); + $this->jobList = $this->getMock('OCP\BackgroundJob\IJobList'); + $this->secureRandom = $this->getMock('OCP\Security\ISecureRandom'); + $this->config = $this->getMock('OCP\IConfig'); + + $this->trustedServers = new TrustedServers( + $this->dbHandler, + $this->httpClientService, + $this->logger, + $this->jobList, + $this->secureRandom, + $this->config + ); + + } + + /** + * @dataProvider dataTrueFalse + * + * @param bool $success + */ + public function testAddServer($success) { + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers $trustedServer */ + $trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->setConstructorArgs( + [ + $this->dbHandler, + $this->httpClientService, + $this->logger, + $this->jobList, + $this->secureRandom, + $this->config + ] + ) + ->setMethods(['normalizeUrl', 'updateProtocol']) + ->getMock(); + $trustedServers->expects($this->once())->method('updateProtocol') + ->with('url')->willReturn('https://url'); + $this->dbHandler->expects($this->once())->method('addServer')->with('https://url') + ->willReturn($success); + + if ($success) { + $this->secureRandom->expects($this->once())->method('getMediumStrengthGenerator') + ->willReturn($this->secureRandom); + $this->secureRandom->expects($this->once())->method('generate') + ->willReturn('token'); + $this->dbHandler->expects($this->once())->method('addToken')->with('https://url', 'token'); + $this->jobList->expects($this->once())->method('add') + ->with('OCA\Federation\BackgroundJob\RequestSharedSecret', + ['url' => 'https://url', 'token' => 'token']); + } else { + $this->jobList->expects($this->never())->method('add'); + } + + $this->assertSame($success, + $trustedServers->addServer('url') + ); + } + + public function dataTrueFalse() { + return [ + [true], + [false] + ]; + } + + /** + * @dataProvider dataTrueFalse + * + * @param bool $status + */ + public function testSetAutoAddServers($status) { + if ($status) { + $this->config->expects($this->once())->method('setAppValue') + ->with('federation', 'autoAddServers', '1'); + } else { + $this->config->expects($this->once())->method('setAppValue') + ->with('federation', 'autoAddServers', '0'); + } + + $this->trustedServers->setAutoAddServers($status); + } + + /** + * @dataProvider dataTestGetAutoAddServers + * + * @param string $status + * @param bool $expected + */ + public function testGetAutoAddServers($status, $expected) { + $this->config->expects($this->once())->method('getAppValue') + ->with('federation', 'autoAddServers', '1')->willReturn($status); + + $this->assertSame($expected, + $this->trustedServers->getAutoAddServers($status) + ); + } + + public function dataTestGetAutoAddServers() { + return [ + ['1', true], + ['0', false] + ]; + } + + public function testAddSharedSecret() { + $this->dbHandler->expects($this->once())->method('addSharedSecret') + ->with('url', 'secret'); + $this->trustedServers->addSharedSecret('url', 'secret'); + } + + public function testGetSharedSecret() { + $this->dbHandler->expects($this->once())->method('getSharedSecret') + ->with('url')->willReturn(true); + $this->assertTrue( + $this->trustedServers->getSharedSecret('url') + ); + } + + public function testRemoveServer() { + $id = 42; + $this->dbHandler->expects($this->once())->method('removeServer')->with($id); + $this->trustedServers->removeServer($id); + } + + public function testGetServers() { + $this->dbHandler->expects($this->once())->method('getAllServer')->willReturn(true); + + $this->assertTrue( + $this->trustedServers->getServers() + ); + } + + + public function testIsTrustedServer() { + $this->dbHandler->expects($this->once())->method('serverExists')->with('url') + ->willReturn(true); + + $this->assertTrue( + $this->trustedServers->isTrustedServer('url') + ); + } + + public function testSetServerStatus() { + $this->dbHandler->expects($this->once())->method('setServerStatus') + ->with('url', 'status'); + $this->trustedServers->setServerStatus('url', 'status'); + } + + public function testGetServerStatus() { + $this->dbHandler->expects($this->once())->method('getServerStatus') + ->with('url')->willReturn(true); + $this->assertTrue( + $this->trustedServers->getServerStatus('url') + ); + } + + /** + * @dataProvider dataTestIsOwnCloudServer + * + * @param int $statusCode + * @param bool $isValidOwnCloudVersion + * @param bool $expected + */ + public function testIsOwnCloudServer($statusCode, $isValidOwnCloudVersion, $expected) { + + $server = 'server1'; + + /** @var \PHPUnit_Framework_MockObject_MockObject | TrustedServers $trustedServer */ + $trustedServers = $this->getMockBuilder('OCA\Federation\TrustedServers') + ->setConstructorArgs( + [ + $this->dbHandler, + $this->httpClientService, + $this->logger, + $this->jobList, + $this->secureRandom, + $this->config + ] + ) + ->setMethods(['checkOwnCloudVersion']) + ->getMock(); + + $this->httpClientService->expects($this->once())->method('newClient') + ->willReturn($this->httpClient); + + $this->httpClient->expects($this->once())->method('get')->with($server . '/status.php') + ->willReturn($this->response); + + $this->response->expects($this->once())->method('getStatusCode') + ->willReturn($statusCode); + + if ($statusCode === 200) { + $trustedServers->expects($this->once())->method('checkOwnCloudVersion') + ->willReturn($isValidOwnCloudVersion); + } else { + $trustedServers->expects($this->never())->method('checkOwnCloudVersion'); + } + + $this->assertSame($expected, + $trustedServers->isOwnCloudServer($server) + ); + + } + + public function dataTestIsOwnCloudServer() { + return [ + [200, true, true], + [200, false, false], + [404, true, false], + ]; + } + + public function testIsOwnCloudServerFail() { + $server = 'server1'; + + $this->httpClientService->expects($this->once())->method('newClient') + ->willReturn($this->httpClient); + + $this->logger->expects($this->once())->method('error') + ->with('simulated exception', ['app' => 'federation']); + + $this->httpClient->expects($this->once())->method('get')->with($server . '/status.php') + ->willReturnCallback(function () { + throw new \Exception('simulated exception'); + }); + + $this->assertFalse($this->trustedServers->isOwnCloudServer($server)); + + } + + /** + * @dataProvider dataTestCheckOwnCloudVersion + * + * @param $statusphp + * @param $expected + */ + public function testCheckOwnCloudVersion($statusphp, $expected) { + $this->assertSame($expected, + $this->invokePrivate($this->trustedServers, 'checkOwnCloudVersion', [$statusphp]) + ); + } + + public function dataTestCheckOwnCloudVersion() { + return [ + ['{"version":"8.4.0"}', false], + ['{"version":"9.0.0"}', true], + ['{"version":"9.1.0"}', true] + ]; + } + + /** + * @dataProvider dataTestUpdateProtocol + * @param string $url + * @param string $expected + */ + public function testUpdateProtocol($url, $expected) { + $this->assertSame($expected, + $this->invokePrivate($this->trustedServers, 'updateProtocol', [$url]) + ); + } + + public function dataTestUpdateProtocol() { + return [ + ['http://owncloud.org', 'http://owncloud.org'], + ['https://owncloud.org', 'https://owncloud.org'], + ['owncloud.org', 'https://owncloud.org'], + ['httpserver', 'https://httpserver'], + ]; + } +} diff --git a/apps/federation/tests/middleware/addservermiddlewaretest.php b/apps/federation/tests/middleware/addservermiddlewaretest.php new file mode 100644 index 0000000000..1be5a34228 --- /dev/null +++ b/apps/federation/tests/middleware/addservermiddlewaretest.php @@ -0,0 +1,100 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + + +namespace OCA\Federation\Tests\Middleware; + + +use OC\HintException; +use OCA\Federation\Middleware\AddServerMiddleware; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use Test\TestCase; + +class AddServerMiddlewareTest extends TestCase { + + /** @var \PHPUnit_Framework_MockObject_MockObject | ILogger */ + private $logger; + + /** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IL10N */ + private $l10n; + + /** @var AddServerMiddleware */ + private $middleware; + + /** @var \PHPUnit_Framework_MockObject_MockObject | Controller */ + private $controller; + + public function setUp() { + parent::setUp(); + + $this->logger = $this->getMock('OCP\ILogger'); + $this->l10n = $this->getMock('OCP\IL10N'); + $this->controller = $this->getMockBuilder('OCP\AppFramework\Controller') + ->disableOriginalConstructor()->getMock(); + + $this->middleware = new AddServerMiddleware( + 'AddServerMiddlewareTest', + $this->l10n, + $this->logger + ); + } + + /** + * @dataProvider dataTestAfterException + * + * @param \Exception $exception + * @param string $message + * @param string $hint + */ + public function testAfterException($exception, $message, $hint) { + + $this->logger->expects($this->once())->method('error') + ->with($message, ['app' => 'AddServerMiddlewareTest']); + + $this->l10n->expects($this->any())->method('t') + ->willReturnCallback( + function($message) { + return $message; + } + ); + + $result = $this->middleware->afterException($this->controller, 'method', $exception); + + $this->assertSame(Http::STATUS_BAD_REQUEST, + $result->getStatus() + ); + + $data = $result->getData(); + + $this->assertSame($hint, + $data['message'] + ); + } + + public function dataTestAfterException() { + return [ + [new HintException('message', 'hint'), 'message', 'hint'], + [new \Exception('message'), 'message', 'Unknown error'], + ]; + } + +} diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php deleted file mode 100644 index 2d02869df1..0000000000 --- a/apps/files/ajax/delete.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @author Frank Karlitschek - * @author Jakob Sack - * @author Joas Schilling - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Robin Appelman - * @author Thomas Müller - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -\OC::$server->getSession()->close(); - - -// Get data -$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : ''; -$allFiles = isset($_POST["allfiles"]) ? (string)$_POST["allfiles"] : false; - -// delete all files in dir ? -if ($allFiles === 'true') { - $files = array(); - $fileList = \OC\Files\Filesystem::getDirectoryContent($dir); - foreach ($fileList as $fileInfo) { - $files[] = $fileInfo['name']; - } -} else { - $files = isset($_POST["file"]) ? (string)$_POST["file"] : (string)$_POST["files"]; - $files = json_decode($files); -} -$filesWithError = ''; - -$success = true; - -//Now delete -foreach ($files as $file) { - try { - if (\OC\Files\Filesystem::file_exists($dir . '/' . $file) && - !(\OC\Files\Filesystem::isDeletable($dir . '/' . $file) && - \OC\Files\Filesystem::unlink($dir . '/' . $file)) - ) { - $filesWithError .= $file . "\n"; - $success = false; - } - } catch (\Exception $e) { - $filesWithError .= $file . "\n"; - $success = false; - } -} - -// get array with updated storage stats (e.g. max file size) after upload -try { - $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir); -} catch(\OCP\Files\NotFoundException $e) { - OCP\JSON::error(['data' => ['message' => 'File not found']]); - return; -} - -if ($success) { - OCP\JSON::success(array("data" => array_merge(array("dir" => $dir, "files" => $files), $storageStats))); -} else { - OCP\JSON::error(array("data" => array_merge(array("message" => "Could not delete:\n" . $filesWithError), $storageStats))); -} diff --git a/apps/files/ajax/move.php b/apps/files/ajax/move.php deleted file mode 100644 index 0961636a11..0000000000 --- a/apps/files/ajax/move.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @author Frank Karlitschek - * @author Georg Ehrke - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Robin Appelman - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -\OC::$server->getSession()->close(); - -// Get data -$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : ''; -$file = isset($_POST['file']) ? (string)$_POST['file'] : ''; -$target = isset($_POST['target']) ? rawurldecode((string)$_POST['target']) : ''; - -$l = \OC::$server->getL10N('files'); - -if(\OC\Files\Filesystem::file_exists($target . '/' . $file)) { - OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s - File with this name already exists", array($file)) ))); - exit; -} - -if ($target != '' || strtolower($file) != 'shared') { - $targetFile = \OC\Files\Filesystem::normalizePath($target . '/' . $file); - $sourceFile = \OC\Files\Filesystem::normalizePath($dir . '/' . $file); - try { - if(\OC\Files\Filesystem::rename($sourceFile, $targetFile)) { - OCP\JSON::success(array("data" => array( "dir" => $dir, "files" => $file ))); - } else { - OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s", array($file)) ))); - } - } catch (\OCP\Files\NotPermittedException $e) { - OCP\JSON::error(array("data" => array( "message" => $l->t("Permission denied") ))); - } catch (\Exception $e) { - OCP\JSON::error(array("data" => array( "message" => $e->getMessage()))); - } -}else{ - OCP\JSON::error(array("data" => array( "message" => $l->t("Could not move %s", array($file)) ))); -} diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php deleted file mode 100644 index be09b288d4..0000000000 --- a/apps/files/ajax/newfile.php +++ /dev/null @@ -1,103 +0,0 @@ - - * @author Georg Ehrke - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Robin Appelman - * @author Thomas Müller - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ -// Init owncloud -global $eventSource; - -\OCP\JSON::checkLoggedIn(); -\OCP\JSON::callCheck(); - -\OC::$server->getSession()->close(); - -// Get the params -$dir = isset( $_REQUEST['dir'] ) ? '/'.trim((string)$_REQUEST['dir'], '/\\') : ''; -$fileName = isset( $_REQUEST['filename'] ) ? trim((string)$_REQUEST['filename'], '/\\') : ''; - -$l10n = \OC::$server->getL10N('files'); - -$result = array( - 'success' => false, - 'data' => NULL -); - -try { - \OC\Files\Filesystem::getView()->verifyPath($dir, $fileName); -} catch (\OCP\Files\InvalidPathException $ex) { - $result['data'] = [ - 'message' => $ex->getMessage()]; - OCP\JSON::error($result); - return; -} - -if (!\OC\Files\Filesystem::file_exists($dir . '/')) { - $result['data'] = array('message' => (string)$l10n->t( - 'The target folder has been moved or deleted.'), - 'code' => 'targetnotfound' - ); - OCP\JSON::error($result); - exit(); -} - -$target = $dir.'/'.$fileName; - -if (\OC\Files\Filesystem::file_exists($target)) { - $result['data'] = array('message' => (string)$l10n->t( - 'The name %s is already used in the folder %s. Please choose a different name.', - array($fileName, $dir)) - ); - OCP\JSON::error($result); - exit(); -} - -$success = false; -$templateManager = OC_Helper::getFileTemplateManager(); -$mimeType = OC_Helper::getMimetypeDetector()->detectPath($target); -$content = $templateManager->getTemplate($mimeType); - -try { - if($content) { - $success = \OC\Files\Filesystem::file_put_contents($target, $content); - } else { - $success = \OC\Files\Filesystem::touch($target); - } -} catch (\Exception $e) { - $result = [ - 'success' => false, - 'data' => [ - 'message' => $e->getMessage() - ] - ]; - OCP\JSON::error($result); - exit(); -} - -if($success) { - $meta = \OC\Files\Filesystem::getFileInfo($target); - OCP\JSON::success(array('data' => \OCA\Files\Helper::formatFileInfo($meta))); - return; -} - -OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the file') ))); diff --git a/apps/files/ajax/newfolder.php b/apps/files/ajax/newfolder.php deleted file mode 100644 index a2897dd437..0000000000 --- a/apps/files/ajax/newfolder.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @author Björn Schießle - * @author Frank Karlitschek - * @author Georg Ehrke - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Robin Appelman - * @author Thomas Müller - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ -// Init owncloud - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -\OC::$server->getSession()->close(); - -// Get the params -$dir = isset($_POST['dir']) ? (string)$_POST['dir'] : ''; -$folderName = isset($_POST['foldername']) ?(string) $_POST['foldername'] : ''; - -$l10n = \OC::$server->getL10N('files'); - -$result = array( - 'success' => false, - 'data' => NULL - ); - -try { - \OC\Files\Filesystem::getView()->verifyPath($dir, $folderName); -} catch (\OCP\Files\InvalidPathException $ex) { - $result['data'] = [ - 'message' => $ex->getMessage()]; - OCP\JSON::error($result); - return; -} - -if (!\OC\Files\Filesystem::file_exists($dir . '/')) { - $result['data'] = array('message' => (string)$l10n->t( - 'The target folder has been moved or deleted.'), - 'code' => 'targetnotfound' - ); - OCP\JSON::error($result); - exit(); -} - -$target = $dir . '/' . $folderName; - -if (\OC\Files\Filesystem::file_exists($target)) { - $result['data'] = array('message' => $l10n->t( - 'The name %s is already used in the folder %s. Please choose a different name.', - array($folderName, $dir)) - ); - OCP\JSON::error($result); - exit(); -} - -try { - if(\OC\Files\Filesystem::mkdir($target)) { - if ( $dir !== '/') { - $path = $dir.'/'.$folderName; - } else { - $path = '/'.$folderName; - } - $meta = \OC\Files\Filesystem::getFileInfo($path); - $meta['type'] = 'dir'; // missing ?! - OCP\JSON::success(array('data' => \OCA\Files\Helper::formatFileInfo($meta))); - exit(); - } -} catch (\Exception $e) { - $result = [ - 'success' => false, - 'data' => [ - 'message' => $e->getMessage() - ] - ]; - OCP\JSON::error($result); - exit(); -} - -OCP\JSON::error(array('data' => array( 'message' => $l10n->t('Error when creating the folder') ))); diff --git a/apps/files/ajax/rename.php b/apps/files/ajax/rename.php deleted file mode 100644 index a24a57b104..0000000000 --- a/apps/files/ajax/rename.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @author Frank Karlitschek - * @author Jakob Sack - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Morris Jobke - * @author Robin Appelman - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ - -OCP\JSON::checkLoggedIn(); -OCP\JSON::callCheck(); -\OC::$server->getSession()->close(); - -$l10n = \OC::$server->getL10N('files'); - -$files = new \OCA\Files\App( - \OC\Files\Filesystem::getView(), - \OC::$server->getL10N('files') -); -try { - $result = $files->rename( - isset($_GET['dir']) ? (string)$_GET['dir'] : '', - isset($_GET['file']) ? (string)$_GET['file'] : '', - isset($_GET['newname']) ? (string)$_GET['newname'] : '' - ); -} catch (\Exception $e) { - $result = [ - 'success' => false, - 'data' => [ - 'message' => $e->getMessage() - ] - ]; -} - -if($result['success'] === true){ - OCP\JSON::success(['data' => $result['data']]); -} else { - OCP\JSON::error(['data' => $result['data']]); -} diff --git a/apps/files/ajax/scan.php b/apps/files/ajax/scan.php index 491adaa9b8..7710a28a8c 100644 --- a/apps/files/ajax/scan.php +++ b/apps/files/ajax/scan.php @@ -47,9 +47,8 @@ $listener = new ScanListener($eventSource); foreach ($users as $user) { $eventSource->send('user', $user); - $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', array($listener, 'file')); - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', array($listener, 'folder')); try { if ($force) { $scanner->scan($dir); @@ -81,13 +80,6 @@ class ScanListener { $this->eventSource = $eventSource; } - /** - * @param string $path - */ - public function folder($path) { - $this->eventSource->send('folder', $path); - } - public function file() { $this->fileCount++; if ($this->fileCount > $this->lastCount + 20) { //send a count update every 20 files diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index a784642728..18e9cfe611 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -41,7 +41,6 @@ OCP\JSON::setContentTypeHeader('text/plain'); // If not, check the login. // If no token is sent along, rely on login only -$allowedPermissions = \OCP\Constants::PERMISSION_ALL; $errorCode = null; $l = \OC::$server->getL10N('files'); @@ -60,8 +59,6 @@ if (empty($_POST['dirToken'])) { \OC_User::setIncognitoMode(true); - // return only read permissions for public upload - $allowedPermissions = \OCP\Constants::PERMISSION_READ; $publicDirectory = !empty($_POST['subdir']) ? (string)$_POST['subdir'] : '/'; $linkItem = OCP\Share::getShareByToken((string)$_POST['dirToken']); @@ -207,7 +204,7 @@ if (\OC\Files\Filesystem::isValidPath($dir) === true) { $data['originalname'] = $files['name'][$i]; $data['uploadMaxFilesize'] = $maxUploadFileSize; $data['maxHumanFilesize'] = $maxHumanFileSize; - $data['permissions'] = $meta['permissions'] & $allowedPermissions; + $data['permissions'] = $meta['permissions']; $data['directory'] = $returnedDir; $result[] = $data; } @@ -234,7 +231,7 @@ if (\OC\Files\Filesystem::isValidPath($dir) === true) { $data['originalname'] = $files['name'][$i]; $data['uploadMaxFilesize'] = $maxUploadFileSize; $data['maxHumanFilesize'] = $maxHumanFileSize; - $data['permissions'] = $meta['permissions'] & $allowedPermissions; + $data['permissions'] = $meta['permissions']; $data['directory'] = $returnedDir; $result[] = $data; } diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php index 40b194ab88..61ff6d748f 100644 --- a/apps/files/appinfo/app.php +++ b/apps/files/appinfo/app.php @@ -25,12 +25,14 @@ */ \OCP\App::registerAdmin('files', 'admin'); + \OC::$server->getNavigationManager()->add(function () { + $urlGenerator = \OC::$server->getURLGenerator(); $l = \OC::$server->getL10N('files'); return [ 'id' => 'files_index', 'order' => 0, - 'href' => \OCP\Util::linkTo('files', 'index.php'), + 'href' => $urlGenerator->linkToRoute('files.view.index'), 'icon' => \OCP\Util::imagePath('core', 'places/files.svg'), 'name' => $l->t('Files'), ]; @@ -63,6 +65,7 @@ $templateManager->registerTemplate('application/vnd.oasis.opendocument.spreadshe new \OCA\Files\ActivityHelper( \OC::$server->getTagManager() ), + \OC::$server->getDatabaseConnection(), \OC::$server->getConfig() ); }); diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index ba8bb62494..4ab226f396 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -8,7 +8,7 @@ true - 1.3.0 + 1.4.0 diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index d52dfaab21..2bb913c30a 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -48,14 +48,17 @@ $application->registerRoutes( 'verb' => 'GET', 'requirements' => array('tagName' => '.+'), ), + [ + 'name' => 'view#index', + 'url' => '/', + 'verb' => 'GET', + ], ) ) ); /** @var $this \OC\Route\Router */ -$this->create('files_index', '/') - ->actionInclude('files/index.php'); $this->create('files_ajax_delete', 'ajax/delete.php') ->actionInclude('files/ajax/delete.php'); $this->create('files_ajax_download', 'ajax/download.php') diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php index 99ce64e09c..31ae555e04 100644 --- a/apps/files/command/scan.php +++ b/apps/files/command/scan.php @@ -26,6 +26,7 @@ namespace OCA\Files\Command; use OC\ForbiddenException; +use OCP\Files\StorageNotAvailableException; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; @@ -74,7 +75,7 @@ class Scan extends Command { } protected function scanFiles($user, $path, $quiet, OutputInterface $output) { - $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection()); + $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger()); if (!$quiet) { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { $output->writeln("Scanning file $path"); @@ -82,6 +83,9 @@ class Scan extends Command { $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { $output->writeln("Scanning folder $path"); }); + $scanner->listen('\OC\Files\Utils\Scanner', 'StorageNotAvailable', function (StorageNotAvailableException $e) use ($output) { + $output->writeln("Error while scanning, storage not available (" . $e->getMessage() . ")"); + }); } try { $scanner->scan($path); diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php index 1ecd5294c6..ee54db6319 100644 --- a/apps/files/controller/apicontroller.php +++ b/apps/files/controller/apicontroller.php @@ -127,7 +127,7 @@ class ApiController extends Controller { * * @NoAdminRequired * - * @param array|string $tagName tag name to filter by + * @param string $tagName tag name to filter by * @return DataResponse */ public function getFilesByTag($tagName) { diff --git a/apps/files/controller/viewcontroller.php b/apps/files/controller/viewcontroller.php new file mode 100644 index 0000000000..d9c5959286 --- /dev/null +++ b/apps/files/controller/viewcontroller.php @@ -0,0 +1,230 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 + * + */ + +namespace OCA\Files\Controller; + +use OC\AppFramework\Http\Request; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\RedirectResponse; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\IL10N; +use OCP\INavigationManager; +use OCP\IRequest; +use OCP\IURLGenerator; +use OCP\IConfig; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; + +/** + * Class ViewController + * + * @package OCA\Files\Controller + */ +class ViewController extends Controller { + /** @var string */ + protected $appName; + /** @var IRequest */ + protected $request; + /** @var IURLGenerator */ + protected $urlGenerator; + /** @var INavigationManager */ + protected $navigationManager; + /** @var IL10N */ + protected $l10n; + /** @var IConfig */ + protected $config; + /** @var EventDispatcherInterface */ + protected $eventDispatcher; + + /** + * @param string $appName + * @param IRequest $request + * @param IURLGenerator $urlGenerator + * @param INavigationManager $navigationManager + * @param IL10N $l10n + * @param IConfig $config + * @param EventDispatcherInterface $eventDispatcherInterface + */ + public function __construct($appName, + IRequest $request, + IURLGenerator $urlGenerator, + INavigationManager $navigationManager, + IL10N $l10n, + IConfig $config, + EventDispatcherInterface $eventDispatcherInterface) { + parent::__construct($appName, $request); + $this->appName = $appName; + $this->request = $request; + $this->urlGenerator = $urlGenerator; + $this->navigationManager = $navigationManager; + $this->l10n = $l10n; + $this->config = $config; + $this->eventDispatcher = $eventDispatcherInterface; + } + + /** + * @param string $appName + * @param string $scriptName + * @return string + */ + protected function renderScript($appName, $scriptName) { + $content = ''; + $appPath = \OC_App::getAppPath($appName); + $scriptPath = $appPath . '/' . $scriptName; + if (file_exists($scriptPath)) { + // TODO: sanitize path / script name ? + ob_start(); + include $scriptPath; + $content = ob_get_contents(); + @ob_end_clean(); + } + return $content; + } + + /** + * FIXME: Replace with non static code + * + * @return array + * @throws \OCP\Files\NotFoundException + */ + protected function getStorageInfo() { + $dirInfo = \OC\Files\Filesystem::getFileInfo('/', false); + return \OC_Helper::getStorageInfo('/', $dirInfo); + } + + /** + * @NoCSRFRequired + * @NoAdminRequired + * + * @param string $dir + * @param string $view + * @return TemplateResponse + * @throws \OCP\Files\NotFoundException + */ + public function index($dir = '', $view = '') { + $nav = new \OCP\Template('files', 'appnavigation', ''); + + // Load the files we need + \OCP\Util::addStyle('files', 'files'); + \OCP\Util::addStyle('files', 'upload'); + \OCP\Util::addStyle('files', 'mobile'); + \OCP\Util::addscript('files', 'app'); + \OCP\Util::addscript('files', 'file-upload'); + \OCP\Util::addscript('files', 'newfilemenu'); + \OCP\Util::addscript('files', 'jquery.iframe-transport'); + \OCP\Util::addscript('files', 'jquery.fileupload'); + \OCP\Util::addscript('files', 'jquery-visibility'); + \OCP\Util::addscript('files', 'fileinfomodel'); + \OCP\Util::addscript('files', 'filesummary'); + \OCP\Util::addscript('files', 'breadcrumb'); + \OCP\Util::addscript('files', 'filelist'); + \OCP\Util::addscript('files', 'search'); + + \OCP\Util::addScript('files', 'favoritesfilelist'); + \OCP\Util::addScript('files', 'tagsplugin'); + \OCP\Util::addScript('files', 'favoritesplugin'); + + \OCP\Util::addScript('files', 'detailfileinfoview'); + \OCP\Util::addScript('files', 'detailtabview'); + \OCP\Util::addScript('files', 'mainfileinfodetailview'); + \OCP\Util::addScript('files', 'detailsview'); + \OCP\Util::addStyle('files', 'detailsView'); + + \OC_Util::addVendorScript('core', 'handlebars/handlebars'); + + \OCP\Util::addscript('files', 'fileactions'); + \OCP\Util::addscript('files', 'fileactionsmenu'); + \OCP\Util::addscript('files', 'files'); + \OCP\Util::addscript('files', 'keyboardshortcuts'); + \OCP\Util::addscript('files', 'navigation'); + + // if IE8 and "?dir=path&view=someview" was specified, reformat the URL to use a hash like "#?dir=path&view=someview" + $isIE8 = $this->request->isUserAgent([Request::USER_AGENT_IE_8]); + if ($isIE8 && ($dir !== '' || $view !== '')) { + $dir = !empty($dir) ? $dir : '/'; + $view = !empty($view) ? $view : 'files'; + $hash = '#?dir=' . \OCP\Util::encodePath($dir); + if ($view !== 'files') { + $hash .= '&view=' . urlencode($view); + } + return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index') . $hash); + } + + // mostly for the home storage's free space + // FIXME: Make non static + $storageInfo = $this->getStorageInfo(); + + \OCA\Files\App::getNavigationManager()->add( + [ + 'id' => 'favorites', + 'appname' => 'files', + 'script' => 'simplelist.php', + 'order' => 5, + 'name' => $this->l10n->t('Favorites') + ] + ); + + $navItems = \OCA\Files\App::getNavigationManager()->getAll(); + usort($navItems, function($item1, $item2) { + return $item1['order'] - $item2['order']; + }); + $nav->assign('navigationItems', $navItems); + + $contentItems = []; + + // render the container content for every navigation item + foreach ($navItems as $item) { + $content = ''; + if (isset($item['script'])) { + $content = $this->renderScript($item['appname'], $item['script']); + } + $contentItem = []; + $contentItem['id'] = $item['id']; + $contentItem['content'] = $content; + $contentItems[] = $contentItem; + } + + $this->eventDispatcher->dispatch('OCA\Files::loadAdditionalScripts'); + + $params = []; + $params['usedSpacePercent'] = (int)$storageInfo['relative']; + $params['owner'] = $storageInfo['owner']; + $params['ownerDisplayName'] = $storageInfo['ownerDisplayName']; + $params['isPublic'] = false; + $params['mailNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no'); + $params['mailPublicNotificationEnabled'] = $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no'); + $params['allowShareWithLink'] = $this->config->getAppValue('core', 'shareapi_allow_links', 'yes'); + $params['appNavigation'] = $nav; + $params['appContents'] = $contentItems; + $this->navigationManager->setActiveEntry('files_index'); + + $response = new TemplateResponse( + $this->appName, + 'index', + $params + ); + $policy = new ContentSecurityPolicy(); + $policy->addAllowedFrameDomain('\'self\''); + $response->setContentSecurityPolicy($policy); + + return $response; + } +} diff --git a/apps/files/index.php b/apps/files/index.php deleted file mode 100644 index cc007ebdb0..0000000000 --- a/apps/files/index.php +++ /dev/null @@ -1,161 +0,0 @@ - - * @author Frank Karlitschek - * @author Jakob Sack - * @author Jan-Christoph Borchardt - * @author Joas Schilling - * @author Jörn Friedrich Dreyer - * @author Morris Jobke - * @author Robin Appelman - * @author Roman Geber - * @author Thomas Müller - * @author Vincent Petry - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @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 - * - */ - -// Check if we are a user -OCP\User::checkLoggedIn(); - -// Load the files we need -OCP\Util::addStyle('files', 'files'); -OCP\Util::addStyle('files', 'upload'); -OCP\Util::addStyle('files', 'mobile'); -OCP\Util::addscript('files', 'app'); -OCP\Util::addscript('files', 'file-upload'); -OCP\Util::addscript('files', 'newfilemenu'); -OCP\Util::addscript('files', 'jquery.iframe-transport'); -OCP\Util::addscript('files', 'jquery.fileupload'); -OCP\Util::addscript('files', 'jquery-visibility'); -OCP\Util::addscript('files', 'fileinfomodel'); -OCP\Util::addscript('files', 'filesummary'); -OCP\Util::addscript('files', 'breadcrumb'); -OCP\Util::addscript('files', 'filelist'); -OCP\Util::addscript('files', 'search'); - -\OCP\Util::addScript('files', 'favoritesfilelist'); -\OCP\Util::addScript('files', 'tagsplugin'); -\OCP\Util::addScript('files', 'favoritesplugin'); - -\OCP\Util::addScript('files', 'detailfileinfoview'); -\OCP\Util::addScript('files', 'detailtabview'); -\OCP\Util::addScript('files', 'mainfileinfodetailview'); -\OCP\Util::addScript('files', 'detailsview'); -\OCP\Util::addStyle('files', 'detailsView'); - -\OC_Util::addVendorScript('core', 'handlebars/handlebars'); - -OCP\App::setActiveNavigationEntry('files_index'); - -$l = \OC::$server->getL10N('files'); - -$isIE8 = false; -preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches); -if (count($matches) > 0 && $matches[1] <= 9) { - $isIE8 = true; -} - -// if IE8 and "?dir=path&view=someview" was specified, reformat the URL to use a hash like "#?dir=path&view=someview" -if ($isIE8 && (isset($_GET['dir']) || isset($_GET['view']))) { - $hash = '#?'; - $dir = isset($_GET['dir']) ? $_GET['dir'] : '/'; - $view = isset($_GET['view']) ? $_GET['view'] : 'files'; - $hash = '#?dir=' . \OCP\Util::encodePath($dir); - if ($view !== 'files') { - $hash .= '&view=' . urlencode($view); - } - header('Location: ' . OCP\Util::linkTo('files', 'index.php') . $hash); - exit(); -} - -$user = OC_User::getUser(); - -$config = \OC::$server->getConfig(); - -// mostly for the home storage's free space -$dirInfo = \OC\Files\Filesystem::getFileInfo('/', false); -$storageInfo=OC_Helper::getStorageInfo('/', $dirInfo); - -$nav = new OCP\Template('files', 'appnavigation', ''); - -function sortNavigationItems($item1, $item2) { - return $item1['order'] - $item2['order']; -} - -\OCA\Files\App::getNavigationManager()->add( - array( - 'id' => 'favorites', - 'appname' => 'files', - 'script' => 'simplelist.php', - 'order' => 5, - 'name' => $l->t('Favorites') - ) -); - -$navItems = \OCA\Files\App::getNavigationManager()->getAll(); -usort($navItems, 'sortNavigationItems'); -$nav->assign('navigationItems', $navItems); - -$contentItems = array(); - -function renderScript($appName, $scriptName) { - $content = ''; - $appPath = OC_App::getAppPath($appName); - $scriptPath = $appPath . '/' . $scriptName; - if (file_exists($scriptPath)) { - // TODO: sanitize path / script name ? - ob_start(); - include $scriptPath; - $content = ob_get_contents(); - @ob_end_clean(); - } - return $content; -} - -// render the container content for every navigation item -foreach ($navItems as $item) { - $content = ''; - if (isset($item['script'])) { - $content = renderScript($item['appname'], $item['script']); - } - $contentItem = array(); - $contentItem['id'] = $item['id']; - $contentItem['content'] = $content; - $contentItems[] = $contentItem; -} - -OCP\Util::addscript('files', 'fileactions'); -OCP\Util::addscript('files', 'fileactionsmenu'); -OCP\Util::addscript('files', 'files'); -OCP\Util::addscript('files', 'navigation'); -OCP\Util::addscript('files', 'keyboardshortcuts'); - -\OC::$server->getEventDispatcher()->dispatch('OCA\Files::loadAdditionalScripts'); - -$tmpl = new OCP\Template('files', 'index', 'user'); -$tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']); -$tmpl->assign('owner', $storageInfo['owner']); -$tmpl->assign('ownerDisplayName', $storageInfo['ownerDisplayName']); -$tmpl->assign('isPublic', false); -$tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'no')); -$tmpl->assign("mailPublicNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_public_notification', 'no')); -$tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes')); -$tmpl->assign('appNavigation', $nav); -$tmpl->assign('appContents', $contentItems); - -$tmpl->printPage(); diff --git a/apps/files/js/app.js b/apps/files/js/app.js index f31770466f..ff505d417f 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -71,7 +71,8 @@ folderDropOptions: folderDropOptions, fileActions: fileActions, allowLegacyActions: true, - scrollTo: urlParams.scrollto + scrollTo: urlParams.scrollto, + filesClient: OC.Files.getClient() } ); this.files.initialize(); diff --git a/apps/files/js/favoritesplugin.js b/apps/files/js/favoritesplugin.js index 417a32ef80..454a505c7b 100644 --- a/apps/files/js/favoritesplugin.js +++ b/apps/files/js/favoritesplugin.js @@ -92,7 +92,7 @@ // folder in the files app instead of opening it directly fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) { OCA.Files.App.setActiveView('files', {silent: true}); - OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true); + OCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true); }); fileActions.setDefault('dir', 'Open'); return fileActions; diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 6a767d48a2..871a2149c8 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -575,7 +575,8 @@ }, actionHandler: function (filename, context) { var dir = context.dir || context.fileList.getCurrentDirectory(); - var url = context.fileList.getDownloadUrl(filename, dir); + var isDir = context.$file.attr('data-type') === 'dir'; + var url = context.fileList.getDownloadUrl(filename, dir, isDir); var downloadFileaction = $(context.$file).find('.fileactions .action-download'); @@ -611,10 +612,7 @@ this.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) { var dir = context.$file.attr('data-path') || context.fileList.getCurrentDirectory(); - if (dir !== '/') { - dir = dir + '/'; - } - context.fileList.changeDirectory(dir + filename); + context.fileList.changeDirectory(OC.joinPaths(dir, filename)); }); this.registerAction({ diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index d1f68d98ea..672c39a8bb 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -22,11 +22,12 @@ * * @param $el container element with existing markup for the #controls * and a table - * @param [options] map of options, see other parameters - * @param [options.scrollContainer] scrollable container, defaults to $(window) - * @param [options.dragOptions] drag options, disabled by default - * @param [options.folderDropOptions] folder drop options, disabled by default - * @param [options.detailsViewEnabled=true] whether to enable details view + * @param {Object} [options] map of options, see other parameters + * @param {Object} [options.scrollContainer] scrollable container, defaults to $(window) + * @param {Object} [options.dragOptions] drag options, disabled by default + * @param {Object} [options.folderDropOptions] folder drop options, disabled by default + * @param {boolean} [options.detailsViewEnabled=true] whether to enable details view + * @param {OC.Files.Client} [options.filesClient] files client to use */ var FileList = function($el, options) { this.initialize($el, options); @@ -73,6 +74,13 @@ */ _detailsView: null, + /** + * Files client instance + * + * @type OC.Files.Client + */ + filesClient: null, + /** * Whether the file list was initialized already. * @type boolean @@ -92,10 +100,17 @@ * Array of files in the current folder. * The entries are of file data. * - * @type Array. + * @type Array. */ files: [], + /** + * Current directory entry + * + * @type OC.Files.FileInfo + */ + dirInfo: null, + /** * File actions handler, defaults to OCA.Files.FileActions * @type OCA.Files.FileActions @@ -149,7 +164,7 @@ * When false, clicking on a table header will call reload(). * When true, clicking on a table header will simply resort the list. */ - _clientSideSort: false, + _clientSideSort: true, /** * Current directory @@ -170,6 +185,7 @@ * @param options.dragOptions drag options, disabled by default * @param options.folderDropOptions folder drop options, disabled by default * @param options.scrollTo name of file to scroll to after the first load + * @param {OC.Files.Client} [options.filesClient] files API client * @private */ initialize: function($el, options) { @@ -185,6 +201,12 @@ if (options.folderDropOptions) { this._folderDropOptions = options.folderDropOptions; } + if (options.filesClient) { + this.filesClient = options.filesClient; + } else { + // default client if not specified + this.filesClient = OC.Files.getClient(); + } this.$el = $el; if (options.id) { @@ -209,6 +231,8 @@ this.files = []; this._selectedFiles = {}; this._selectionSummary = new OCA.Files.FileSummary(); + // dummy root dir info + this.dirInfo = new OC.Files.FileInfo({}); this.fileSummary = this._createSummary(); @@ -359,7 +383,7 @@ var highlightState = $tr.hasClass('highlighted'); $tr = self.updateRow( $tr, - _.extend({isPreviewAvailable: true}, model.toJSON()), + model.toJSON(), {updateSummary: true, silent: false, animate: true} ); $tr.toggleClass('highlighted', highlightState); @@ -618,7 +642,7 @@ }; OCA.Files.FileActions.updateFileActionSpinner(downloadFileaction, true); - OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir), disableLoadingState); + OCA.Files.Files.handleDownload(this.getDownloadUrl(files, dir, true), disableLoadingState); return false; }, @@ -894,16 +918,39 @@ self.$el.closest('#app-content').trigger(jQuery.Event('apprendered')); }); }, + + /** + * Returns the icon URL matching the given file info + * + * @param {OC.Files.FileInfo} fileInfo file info + * + * @return {string} icon URL + */ + _getIconUrl: function(fileInfo) { + var mimeType = fileInfo.mimetype || 'application/octet-stream'; + if (mimeType === 'httpd/unix-directory') { + // use default folder icon + if (fileInfo.mountType === 'shared' || fileInfo.mountType === 'shared-root') { + return OC.MimeType.getIconUrl('dir-shared'); + } else if (fileInfo.mountType === 'external-root') { + return OC.MimeType.getIconUrl('dir-external'); + } + return OC.MimeType.getIconUrl('dir'); + } + return OC.MimeType.getIconUrl(mimeType); + }, + /** * Creates a new table row element using the given file data. - * @param {OCA.Files.FileInfo} fileData file info attributes + * @param {OC.Files.FileInfo} fileData file info attributes * @param options map of attributes * @return new tr element (not appended to the table) */ _createRow: function(fileData, options) { var td, simpleSize, basename, extension, sizeColor, - icon = OC.MimeType.getIconUrl(fileData.mimetype), + icon = fileData.icon || this._getIconUrl(fileData), name = fileData.name, + // TODO: get rid of type, only use mime type type = fileData.type || 'file', mtime = parseInt(fileData.mtime, 10), mime = fileData.mimetype, @@ -943,6 +990,14 @@ } if (fileData.mountType) { + // FIXME: HACK: detect shared-root + if (fileData.mountType === 'shared' && this.dirInfo.mountType !== 'shared') { + // if parent folder isn't share, assume the displayed folder is a share root + fileData.mountType = 'shared-root'; + } else if (fileData.mountType === 'external' && this.dirInfo.mountType !== 'external') { + // if parent folder isn't external, assume the displayed folder is the external storage root + fileData.mountType = 'external-root'; + } tr.attr('data-mounttype', fileData.mountType); } @@ -953,24 +1008,16 @@ path = this.getCurrentDirectory(); } - if (type === 'dir') { - // use default folder icon - icon = icon || OC.imagePath('core', 'filetypes/folder'); - } - else { - icon = icon || OC.imagePath('core', 'filetypes/file'); - } - // filename td td = $(''); // linkUrl - if (type === 'dir') { + if (mime === 'httpd/unix-directory') { linkUrl = this.linkTo(path + '/' + name); } else { - linkUrl = this.getDownloadUrl(name, path); + linkUrl = this.getDownloadUrl(name, path, type === 'dir'); } if (this._allowSelection) { td.append( @@ -996,7 +1043,7 @@ basename = ''; extension = name; // split extension from filename for non dirs - } else if (type !== 'dir' && name.indexOf('.') !== -1) { + } else if (mime !== 'httpd/unix-directory' && name.indexOf('.') !== -1) { basename = name.substr(0, name.lastIndexOf('.')); extension = name.substr(name.lastIndexOf('.')); } else { @@ -1018,7 +1065,7 @@ nameSpan.tooltip({placement: 'right'}); } // dirs can show the number of uploaded files - if (type === 'dir') { + if (mime !== 'httpd/unix-directory') { linkElem.append($('').attr({ 'class': 'uploadtext', 'currentUploads': 0 @@ -1074,7 +1121,7 @@ * Adds an entry to the files array and also into the DOM * in a sorted manner. * - * @param {OCA.Files.FileInfo} fileData map of file attributes + * @param {OC.Files.FileInfo} fileData map of file attributes * @param {Object} [options] map of attributes * @param {boolean} [options.updateSummary] true to update the summary * after adding (default), false otherwise. Defaults to true. @@ -1147,7 +1194,7 @@ * Creates a new row element based on the given attributes * and returns it. * - * @param {OCA.Files.FileInfo} fileData map of file attributes + * @param {OC.Files.FileInfo} fileData map of file attributes * @param {Object} [options] map of attributes * @param {int} [options.index] index at which to insert the element * @param {boolean} [options.updateSummary] true to update the summary @@ -1182,7 +1229,7 @@ filenameTd.draggable(this._dragOptions); } // allow dropping on folders - if (this._folderDropOptions && fileData.type === 'dir') { + if (this._folderDropOptions && mime === 'httpd/unix-directory') { filenameTd.droppable(this._folderDropOptions); } @@ -1193,7 +1240,7 @@ // display actions this.fileActions.display(filenameTd, !options.silent, this); - if (fileData.isPreviewAvailable && mime !== 'httpd/unix-directory') { + if (mime !== 'httpd/unix-directory') { var iconDiv = filenameTd.find('.thumbnail'); // lazy load / newly inserted td ? // the typeof check ensures that the default value of animate is true @@ -1329,6 +1376,13 @@ } }, + /** + * Returns list of webdav properties to request + */ + _getWebdavProperties: function() { + return this.filesClient.getPropfindProperties(); + }, + /** * Reloads the file list using ajax call * @@ -1343,17 +1397,12 @@ this._currentFileModel = null; this.$el.find('.select-all').prop('checked', false); this.showMask(); - if (this._reloadCall) { - this._reloadCall.abort(); - } - this._reloadCall = $.ajax({ - url: this.getAjaxUrl('list'), - data: { - dir : this.getCurrentDirectory(), - sort: this._sort, - sortdirection: this._sortDirection + this._reloadCall = this.filesClient.getFolderContents( + this.getCurrentDirectory(), { + includeParent: true, + properties: this._getWebdavProperties() } - }); + ); if (this._detailsView) { // close sidebar this._updateDetailsView(null); @@ -1361,24 +1410,19 @@ var callBack = this.reloadCallback.bind(this); return this._reloadCall.then(callBack, callBack); }, - reloadCallback: function(result) { + reloadCallback: function(status, result) { delete this._reloadCall; this.hideMask(); - if (!result || result.status === 'error') { - // if the error is not related to folder we're trying to load, reload the page to handle logout etc - if (result.data.error === 'authentication_error' || - result.data.error === 'token_expired' || - result.data.error === 'application_not_enabled' - ) { - OC.redirect(OC.generateUrl('apps/files')); - } - OC.Notification.showTemporary(result.data.message); + if (status === 401) { + // TODO: append current URL to be able to get back after logging in again + OC.redirect(OC.generateUrl('apps/files')); + OC.Notification.show(result); return false; } // Firewall Blocked request? - if (result.status === 403) { + if (status === 403) { // Go home this.changeDirectory('/'); OC.Notification.showTemporary(t('files', 'This operation is forbidden')); @@ -1386,32 +1430,49 @@ } // Did share service die or something else fail? - if (result.status === 500) { + if (status === 500) { // Go home this.changeDirectory('/'); - OC.Notification.showTemporary(t('files', 'This directory is unavailable, please check the logs or contact the administrator')); + OC.Notification.showTemporary( + t('files', 'This directory is unavailable, please check the logs or contact the administrator') + ); return false; } - if (result.status === 404) { + if (status === 503) { + // Go home + if (this.getCurrentDirectory() !== '/') { + this.changeDirectory('/'); + // TODO: read error message from exception + OC.Notification.showTemporary( + t('files', 'Storage not available') + ); + } + return false; + } + + if (status === 404) { // go back home this.changeDirectory('/'); return false; } // aborted ? - if (result.status === 0){ + if (status === 0){ return true; } - // TODO: should rather return upload file size through - // the files list ajax call + // TODO: parse remaining quota from PROPFIND response this.updateStorageStatistics(true); - if (result.data.permissions) { - this.setDirectoryPermissions(result.data.permissions); + // first entry is the root + this.dirInfo = result.shift(); + + if (this.dirInfo.permissions) { + this.setDirectoryPermissions(this.dirInfo.permissions); } - this.setFiles(result.data.files); + result.sort(this._sortComparator); + this.setFiles(result); return true; }, @@ -1419,12 +1480,15 @@ OCA.Files.Files.updateStorageStatistics(this.getCurrentDirectory(), force); }, + /** + * @deprecated do not use nor override + */ getAjaxUrl: function(action, params) { return OCA.Files.Files.getAjaxUrl(action, params); }, - getDownloadUrl: function(files, dir) { - return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory()); + getDownloadUrl: function(files, dir, isDir) { + return OCA.Files.Files.getDownloadUrl(files, dir || this.getCurrentDirectory(), isDir); }, /** @@ -1489,8 +1553,6 @@ if (etag){ // use etag as cache buster urlSpec.c = etag; - } else { - console.warn('OCA.Files.FileList.lazyLoadPreview(): missing etag argument'); } previewURL = self.generatePreviewUrl(urlSpec); @@ -1514,6 +1576,9 @@ img.src = previewURL; }, + /** + * @deprecated + */ setDirectoryPermissions: function(permissions) { var isCreatable = (permissions & OC.PERMISSION_CREATE) !== 0; this.$el.find('#permissions').val(permissions); @@ -1610,7 +1675,7 @@ * fileData should be inserted, considering the current * sorting * - * @param {OCA.Files.FileInfo} fileData file info + * @param {OC.Files.FileInfo} fileData file info */ _findInsertionIndex: function(fileData) { var index = 0; @@ -1628,6 +1693,9 @@ move: function(fileNames, targetPath) { var self = this; var dir = this.getCurrentDirectory(); + if (dir.charAt(dir.length - 1) !== '/') { + dir += '/'; + } var target = OC.basename(targetPath); if (!_.isArray(fileNames)) { fileNames = [fileNames]; @@ -1635,46 +1703,42 @@ _.each(fileNames, function(fileName) { var $tr = self.findFileEl(fileName); self.showFileBusyState($tr, true); - // TODO: improve performance by sending all file names in a single call - $.post( - OC.filePath('files', 'ajax', 'move.php'), - { - dir: dir, - file: fileName, - target: targetPath - }, - function(result) { - if (result) { - if (result.status === 'success') { - // if still viewing the same directory - if (self.getCurrentDirectory() === dir) { - // recalculate folder size - var oldFile = self.findFileEl(target); - var newFile = self.findFileEl(fileName); - var oldSize = oldFile.data('size'); - var newSize = oldSize + newFile.data('size'); - oldFile.data('size', newSize); - oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize)); + if (targetPath.charAt(targetPath.length - 1) !== '/') { + // make sure we move the files into the target dir, + // not overwrite it + targetPath = targetPath + '/'; + } + self.filesClient.move(dir + fileName, targetPath + fileName) + .done(function() { + // if still viewing the same directory + if (OC.joinPaths(self.getCurrentDirectory(), '/') === dir) { + // recalculate folder size + var oldFile = self.findFileEl(target); + var newFile = self.findFileEl(fileName); + var oldSize = oldFile.data('size'); + var newSize = oldSize + newFile.data('size'); + oldFile.data('size', newSize); + oldFile.find('td.filesize').text(OC.Util.humanFileSize(newSize)); - // TODO: also update entry in FileList.files - - self.remove(fileName); - } - } else { - OC.Notification.hide(); - if (result.status === 'error' && result.data.message) { - OC.Notification.showTemporary(result.data.message); - } - else { - OC.Notification.showTemporary(t('files', 'Error moving file.')); - } - } - } else { - OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); + // TODO: also update entry in FileList.files + self.remove(fileName); } + }) + .fail(function(status) { + if (status === 412) { + // TODO: some day here we should invoke the conflict dialog + OC.Notification.showTemporary( + t('files', 'Could not move "{file}", target exists', {file: fileName}) + ); + } else { + OC.Notification.showTemporary( + t('files', 'Could not move "{file}"', {file: fileName}) + ); + } + }) + .always(function() { self.showFileBusyState($tr, false); - } - ); + }); }); }, @@ -1700,16 +1764,16 @@ * Triggers file rename input field for the given file name. * If the user enters a new name, the file will be renamed. * - * @param oldname file name of the file to rename + * @param oldName file name of the file to rename */ - rename: function(oldname) { + rename: function(oldName) { var self = this; var tr, td, input, form; - tr = this.findFileEl(oldname); + tr = this.findFileEl(oldName); var oldFileInfo = this.files[tr.index()]; tr.data('renaming',true); td = tr.children('td.filename'); - input = $('').val(oldname); + input = $('').val(oldName); form = $('
    '); form.append(input); td.children('a.name').hide(); @@ -1724,11 +1788,11 @@ input.selectRange(0, len); var checkInput = function () { var filename = input.val(); - if (filename !== oldname) { + if (filename !== oldName) { // Files.isFileNameValid(filename) throws an exception itself OCA.Files.Files.isFileNameValid(filename); if (self.inList(filename)) { - throw t('files', '{new_name} already exists', {new_name: filename}); + throw t('files', '{newName} already exists', {newName: filename}); } } return true; @@ -1741,6 +1805,12 @@ td.children('a.name').show(); } + function updateInList(fileInfo) { + self.updateRow(tr, fileInfo); + self._updateDetailsView(fileInfo.name, false); + } + + // TODO: too many nested blocks, move parts into functions form.submit(function(event) { event.stopPropagation(); event.preventDefault(); @@ -1753,7 +1823,7 @@ input.tooltip('hide'); form.remove(); - if (newName !== oldname) { + if (newName !== oldName) { checkInput(); // mark as loading (temp element) self.showFileBusyState(tr, true); @@ -1765,34 +1835,45 @@ td.find('a.name span.nametext').text(basename); td.children('a.name').show(); - $.ajax({ - url: OC.filePath('files','ajax','rename.php'), - data: { - dir : tr.attr('data-path') || self.getCurrentDirectory(), - newname: newName, - file: oldname - }, - success: function(result) { - var fileInfo; - if (!result || result.status === 'error') { - OC.dialogs.alert(result.data.message, t('files', 'Could not rename file')); - fileInfo = oldFileInfo; - if (result.data.code === 'sourcenotfound') { - self.remove(result.data.newname, {updateSummary: true}); - return; - } + var path = tr.attr('data-path') || self.getCurrentDirectory(); + self.filesClient.move(OC.joinPaths(path, oldName), OC.joinPaths(path, newName)) + .done(function() { + oldFileInfo.name = newName; + updateInList(oldFileInfo); + }) + .fail(function(status) { + // TODO: 409 means current folder does not exist, redirect ? + if (status === 404) { + // source not found, so remove it from the list + OC.Notification.showTemporary( + t( + 'files', + 'Could not rename "{fileName}", it does not exist any more', + {fileName: oldName} + ) + ); + self.remove(newName, {updateSummary: true}); + return; + } else if (status === 412) { + // target exists + OC.Notification.showTemporary( + t( + 'files', + 'The name "{targetName}" is already used in the folder "{dir}". Please choose a different name.', + { + targetName: newName, + dir: self.getCurrentDirectory() + } + ) + ); + } else { + // restore the item to its previous state + OC.Notification.showTemporary( + t('files', 'Could not rename "{fileName}"', {fileName: oldName}) + ); } - else { - fileInfo = result.data; - } - // reinsert row - self.files.splice(tr.index(), 1); - tr.remove(); - tr = self.add(fileInfo, {updateSummary: false, silent: true}); - self.$fileList.trigger($.Event('fileActionsReady', {fileList: self, $files: $(tr)})); - self._updateDetailsView(fileInfo.name, false); - } - }); + updateInList(oldFileInfo); + }); } else { // add back the old file info when cancelled self.files.splice(tr.index(), 1); @@ -1849,32 +1930,48 @@ var promise = deferred.promise(); OCA.Files.Files.isFileNameValid(name); - name = this.getUniqueName(name); if (this.lastAction) { this.lastAction(); } - $.post( - OC.generateUrl('/apps/files/ajax/newfile.php'), - { - dir: this.getCurrentDirectory(), - filename: name - }, - function(result) { - if (result.status === 'success') { - self.add(result.data, {animate: true, scrollTo: true}); - deferred.resolve(result.status, result.data); - } else { - if (result.data && result.data.message) { - OC.Notification.showTemporary(result.data.message); - } else { - OC.Notification.showTemporary(t('core', 'Could not create file')); - } - deferred.reject(result.status, result.data); + name = this.getUniqueName(name); + var targetPath = this.getCurrentDirectory() + '/' + name; + + self.filesClient.putFileContents( + targetPath, + '', + { + contentType: 'text/plain', + overwrite: true } - } - ); + ) + .done(function() { + // TODO: error handling / conflicts + self.filesClient.getFileInfo( + targetPath, { + properties: self._getWebdavProperties() + } + ) + .then(function(status, data) { + self.add(data, {animate: true, scrollTo: true}); + deferred.resolve(status, data); + }) + .fail(function(status) { + OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name})); + deferred.reject(status); + }); + }) + .fail(function(status) { + if (status === 412) { + OC.Notification.showTemporary( + t('files', 'Could not create file "{file}" because it already exists', {file: name}) + ); + } else { + OC.Notification.showTemporary(t('files', 'Could not create file "{file}"', {file: name})); + } + deferred.reject(status); + }); return promise; }, @@ -1895,32 +1992,58 @@ var promise = deferred.promise(); OCA.Files.Files.isFileNameValid(name); - name = this.getUniqueName(name); if (this.lastAction) { this.lastAction(); } - $.post( - OC.generateUrl('/apps/files/ajax/newfolder.php'), - { - dir: this.getCurrentDirectory(), - foldername: name - }, - function(result) { - if (result.status === 'success') { - self.add(result.data, {animate: true, scrollTo: true}); - deferred.resolve(result.status, result.data); + name = this.getUniqueName(name); + var targetPath = this.getCurrentDirectory() + '/' + name; + + this.filesClient.createDirectory(targetPath) + .done(function(createStatus) { + self.filesClient.getFileInfo( + targetPath, { + properties: self._getWebdavProperties() + } + ) + .done(function(status, data) { + self.add(data, {animate: true, scrollTo: true}); + deferred.resolve(status, data); + }) + .fail(function() { + OC.Notification.showTemporary(t('files', 'Could not create folder "{dir}"', {dir: name})); + deferred.reject(createStatus); + }); + }) + .fail(function(createStatus) { + // method not allowed, folder might exist already + if (createStatus === 405) { + self.filesClient.getFileInfo( + targetPath, { + properties: self._getWebdavProperties() + } + ) + .done(function(status, data) { + // add it to the list, for completeness + self.add(data, {animate: true, scrollTo: true}); + OC.Notification.showTemporary( + t('files', 'Could not create folder "{dir}" because it already exists', {dir: name}) + ); + // still consider a failure + deferred.reject(createStatus, data); + }) + .fail(function() { + OC.Notification.showTemporary( + t('files', 'Could not create folder "{dir}"', {dir: name}) + ); + deferred.reject(status); + }); } else { - if (result.data && result.data.message) { - OC.Notification.showTemporary(result.data.message); - } else { - OC.Notification.showTemporary(t('core', 'Could not create folder')); - } - deferred.reject(result.status); + OC.Notification.showTemporary(t('files', 'Could not create folder "{dir}"', {dir: name})); + deferred.reject(createStatus); } - } - ); + }); return promise; }, @@ -1981,76 +2104,59 @@ */ do_delete:function(files, dir) { var self = this; - var params; if (files && files.substr) { files=[files]; } + if (!files) { + // delete all files in directory + files = _.pluck(this.files, 'name'); + } if (files) { this.showFileBusyState(files, true); - for (var i=0; icreated" : "تم إنشاء ملف جديد أو مجلد ", "A file or folder has been changed" : "تم تغيير ملف أو مجلد", @@ -90,15 +74,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s حذف %1$s", "You restored %1$s" : "لقد قمت باستعادة %1$s", "%2$s restored %1$s" : "%2$s مستعاد %1$s", - "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ", - "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ", "Save" : "حفظ", - "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ", "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان لـ الدخول الى ملفاتك عن طريق WebDAV", @@ -112,6 +92,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", "Currently scanning" : "حالياً يقوم بالفحص", "No favorites" : "لا يوجد مفضلات ", - "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا " + "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ", + "Text file" : "ملف نصي", + "New text file.txt" : "ملف نصي جديد fille.txt" }, "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;"); diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index e1b2eb3af1..245fe9a0b9 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -2,13 +2,6 @@ "Storage not available" : "وحدة التخزين غير متوفرة ", "Storage invalid" : "وحدة تخزين غير صالحه ", "Unknown error" : "خطأ غير معروف. ", - "Could not move %s - File with this name already exists" : "فشل في نقل الملف %s - يوجد ملف بنفس هذا الاسم", - "Could not move %s" : "فشل في نقل %s", - "Permission denied" : "تم رفض الاذن ", - "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ", - "The name %s is already used in the folder %s. Please choose a different name." : "هذا الاسم %s مستخدم مسبقا في المجلد %s . فضلا اختر اسم مختلف .", - "Error when creating the file" : "خطأ اثناء انشاء الملف ", - "Error when creating the folder" : "خطأ اثناء انشاء المجلد ", "Unable to set upload directory." : "غير قادر على تحميل المجلد", "Invalid Token" : "علامة غير صالحة", "No file was uploaded. Unknown error" : "لم يتم رفع أي ملف , خطأ غير معروف", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "المجلد المؤقت غير موجود", "Failed to write to disk" : "خطأ في الكتابة على القرص الصلب", "Not enough storage available" : "لا يوجد مساحة تخزينية كافية", + "The target folder has been moved or deleted." : "المجلد المطلوب قد تم نقله او حذفه ", "Upload failed. Could not find uploaded file" : "*فشلت علمية الرفع. تعذر إيجاد الملف الذي تم رفعه.\n*فشلت علمية التحميل. تعذر إيجاد الملف الذي تم تحميله.", "Upload failed. Could not get file info." : "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.", "Invalid directory." : "مسار غير صحيح.", @@ -28,10 +22,10 @@ "Favorites" : "المفضلة ", "Home" : "البيت", "Close" : "إغلاق", + "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", "Total file size {size1} exceeds upload limit {size2}" : "حجم الملف الكلي {size1} تجاوز الحد المسموح للرفع {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "لا يوجد مساحة تخزين كافية، انت تقوم برفع {size1} ولكن المساحه المتوفره هي {size2}.", - "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Could not get result from server." : "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", "Actions" : "* تطبيقات.\n* أنشطة.", @@ -43,14 +37,6 @@ "Pending" : "قيد الانتظار", "Unable to determine date" : "تعذر تحديد التاريخ", "This operation is forbidden" : "هذة العملية ممنوعة ", - "Error moving file." : "خطأ اثناء نقل الملف ", - "Error moving file" : "حدث خطأ أثناء نقل الملف", - "Error" : "خطأ", - "{new_name} already exists" : "{new_name} موجود مسبقا", - "Could not rename file" : "لا يستطيع اعادة تسمية الملف", - "Could not create file" : "لا يستطيع انشاء ملف ", - "Could not create folder" : "لا يستطيع انشاء مجلد ", - "Error deleting file." : "خطأ اثناء حذف الملف ", "No entries in this folder match '{filter}'" : "لا يوجد مدخلات في هذا المجلد تتوافق مع '{filter}'", "Name" : "اسم", "Size" : "حجم", @@ -68,12 +54,10 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "المساحة التخزينية لـ {owner} ممتلئة تقريبا ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "مساحتك التخزينية امتلأت تقريبا ", "Favorite" : "المفضلة", - "{newname} already exists" : "{newname} موجود مسبقاً", - "Upload" : "رفع", - "Text file" : "ملف نصي", - "New text file.txt" : "ملف نصي جديد fille.txt", "Folder" : "مجلد", "New folder" : "مجلد جديد", + "{newname} already exists" : "{newname} موجود مسبقاً", + "Upload" : "رفع", "An error occurred while trying to update the tags" : "حدث خطأ اثناء محاولة تحديث tags", "A new file or folder has been created" : "تم إنشاء ملف جديد أو مجلد ", "A file or folder has been changed" : "تم تغيير ملف أو مجلد", @@ -88,15 +72,11 @@ "%2$s deleted %1$s" : "%2$s حذف %1$s", "You restored %1$s" : "لقد قمت باستعادة %1$s", "%2$s restored %1$s" : "%2$s مستعاد %1$s", - "%s could not be renamed as it has been deleted" : "%s لا يمكن اعادة تسميته فقد تم حذفه ", - "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", "Upload (max. %s)" : "الرفع ( حد اقصى. %s ) ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "بستخدام PHP-FPM هذه القيمة سوف تحتاج الي 5 دقائق حتي تُتِم عملها بعد الحفظ ", "Save" : "حفظ", - "Can not be edited from here due to insufficient permissions." : "لا يمكن التعديل من هنا نظرا لعدم توفر الصلاحيات الكافيه ", "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "استخدم هذا العنوان لـ الدخول الى ملفاتك عن طريق WebDAV", @@ -110,6 +90,8 @@ "Files are being scanned, please wait." : "يرجى الانتظار , جاري فحص الملفات .", "Currently scanning" : "حالياً يقوم بالفحص", "No favorites" : "لا يوجد مفضلات ", - "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا " + "Files and folders you mark as favorite will show up here" : "الملفات والمجلدات التي حددتها كامفضلة سوف تظهر هنا ", + "Text file" : "ملف نصي", + "New text file.txt" : "ملف نصي جديد fille.txt" },"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;" } \ No newline at end of file diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index 926587837d..8fc63c1ac3 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Almacenamientu non disponible", "Storage invalid" : "Almacenamientu inválidu", "Unknown error" : "Fallu desconocíu", - "Could not move %s - File with this name already exists" : "Nun pudo movese %s - Yá existe un ficheru con esi nome.", - "Could not move %s" : "Nun pudo movese %s", - "Permission denied" : "Permisu denegáu", - "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nome %s yá ta n'usu na carpeta %s. Por favor, escueyi un nome diferente.", - "Error when creating the file" : "Fallu cuando se creaba'l ficheru", - "Error when creating the folder" : "Fallu cuando se creaba la carpeta", "Unable to set upload directory." : "Nun pue afitase la carpeta de xubida.", "Invalid Token" : "Token inválidu", "No file was uploaded. Unknown error" : "Nun se xubió dengún ficheru. Fallu desconocíu", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Falta una carpeta temporal", "Failed to write to disk" : "Fallu al escribir al discu", "Not enough storage available" : "Nun hai abondu espaciu disponible", + "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.", "Upload failed. Could not find uploaded file" : "Xubida fallida. Nun pudo atopase'l ficheru xubíu.", "Upload failed. Could not get file info." : "Falló la xubida. Nun se pudo obtener la información del ficheru.", "Invalid directory." : "Direutoriu non válidu.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Imposible determinar la fecha", "This operation is forbidden" : "La operación ta prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador", - "Error moving file." : "Fallu moviendo'l ficheru.", - "Error moving file" : "Fallu moviendo'l ficheru", - "Error" : "Fallu", - "{new_name} already exists" : "{new_name} yá existe", - "Could not rename file" : "Nun pudo renomase'l ficheru", - "Could not create file" : "Nun pudo crease'l ficheru", - "Could not create folder" : "Nun pudo crease la carpeta", - "Error deleting file." : "Fallu desaniciando'l ficheru.", "No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'", "Name" : "Nome", "Size" : "Tamañu", @@ -75,8 +61,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoritos", "Favorite" : "Favoritu", - "Text file" : "Ficheru de testu", - "New text file.txt" : "Nuevu testu ficheru.txt", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "{newname} already exists" : "{newname} yá existe", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Modificáu por %2$s", "Deleted by %2$s" : "Desaniciáu por %2$s", "Restored by %2$s" : "Recuperáu por %2$s", - "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase", - "%s could not be renamed" : "Nun se puede renomar %s ", "Upload (max. %s)" : "Xuba (máx. %s)", "File handling" : "Alministración de ficheros", "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM esti valor pue retrasase 5 minutos pa tener efeutu dempués de salvar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "Nun pue editáse dende equí por mor d'insuficientes permisos.", "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros a traviés de WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", "Currently scanning" : "Anguaño escaneando", "No favorites" : "Nengún favoritu", - "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí" + "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí", + "Text file" : "Ficheru de testu", + "New text file.txt" : "Nuevu testu ficheru.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 750ed1f959..33c119771f 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -2,13 +2,6 @@ "Storage not available" : "Almacenamientu non disponible", "Storage invalid" : "Almacenamientu inválidu", "Unknown error" : "Fallu desconocíu", - "Could not move %s - File with this name already exists" : "Nun pudo movese %s - Yá existe un ficheru con esi nome.", - "Could not move %s" : "Nun pudo movese %s", - "Permission denied" : "Permisu denegáu", - "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nome %s yá ta n'usu na carpeta %s. Por favor, escueyi un nome diferente.", - "Error when creating the file" : "Fallu cuando se creaba'l ficheru", - "Error when creating the folder" : "Fallu cuando se creaba la carpeta", "Unable to set upload directory." : "Nun pue afitase la carpeta de xubida.", "Invalid Token" : "Token inválidu", "No file was uploaded. Unknown error" : "Nun se xubió dengún ficheru. Fallu desconocíu", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Falta una carpeta temporal", "Failed to write to disk" : "Fallu al escribir al discu", "Not enough storage available" : "Nun hai abondu espaciu disponible", + "The target folder has been moved or deleted." : "La carpeta oxetivu movióse o desanicióse.", "Upload failed. Could not find uploaded file" : "Xubida fallida. Nun pudo atopase'l ficheru xubíu.", "Upload failed. Could not get file info." : "Falló la xubida. Nun se pudo obtener la información del ficheru.", "Invalid directory." : "Direutoriu non válidu.", @@ -44,14 +38,6 @@ "Unable to determine date" : "Imposible determinar la fecha", "This operation is forbidden" : "La operación ta prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador", - "Error moving file." : "Fallu moviendo'l ficheru.", - "Error moving file" : "Fallu moviendo'l ficheru", - "Error" : "Fallu", - "{new_name} already exists" : "{new_name} yá existe", - "Could not rename file" : "Nun pudo renomase'l ficheru", - "Could not create file" : "Nun pudo crease'l ficheru", - "Could not create folder" : "Nun pudo crease la carpeta", - "Error deleting file." : "Fallu desaniciando'l ficheru.", "No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'", "Name" : "Nome", "Size" : "Tamañu", @@ -73,8 +59,6 @@ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoritos", "Favorite" : "Favoritu", - "Text file" : "Ficheru de testu", - "New text file.txt" : "Nuevu testu ficheru.txt", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "{newname} already exists" : "{newname} yá existe", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Modificáu por %2$s", "Deleted by %2$s" : "Desaniciáu por %2$s", "Restored by %2$s" : "Recuperáu por %2$s", - "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase", - "%s could not be renamed" : "Nun se puede renomar %s ", "Upload (max. %s)" : "Xuba (máx. %s)", "File handling" : "Alministración de ficheros", "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM esti valor pue retrasase 5 minutos pa tener efeutu dempués de salvar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "Nun pue editáse dende equí por mor d'insuficientes permisos.", "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los ficheros a traviés de WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Tan escaniándose los ficheros, espera por favor.", "Currently scanning" : "Anguaño escaneando", "No favorites" : "Nengún favoritu", - "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí" + "Files and folders you mark as favorite will show up here" : "Los ficheros y carpetes que marque como favoritos apaecerán equí", + "Text file" : "Ficheru de testu", + "New text file.txt" : "Nuevu testu ficheru.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js index b278fad62b..cf7d81063c 100644 --- a/apps/files/l10n/az.js +++ b/apps/files/l10n/az.js @@ -4,13 +4,6 @@ OC.L10N.register( "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", - "Could not move %s - File with this name already exists" : "Köçürmə mümkün deyil %s - Bu adla fayl artıq mövcuddur", - "Could not move %s" : "Yerdəyişmə mükün olmadı %s", - "Permission denied" : "Yetki qadağandır", - "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.", - "The name %s is already used in the folder %s. Please choose a different name." : "Bu ad %s artıq %s qovluğunda istifadə edilir. Xahiş olunur fərqli ad istifadə edəsiniz.", - "Error when creating the file" : "Fayl yaratdıqda səhv baş vermişdir", - "Error when creating the folder" : "Qovluğu yaratdıqda səhv baş vermişdir", "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", @@ -22,6 +15,7 @@ OC.L10N.register( "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.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Sevimlilər", "Home" : "Ev", "Close" : "Bağla", + "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. ", - "Upload cancelled." : "Yüklənmə dayandırıldı.", "Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.", "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", @@ -46,14 +40,6 @@ OC.L10N.register( "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", - "Error moving file." : "Faylın köçürülməsində səhv baş verdi.", - "Error moving file" : "Faylın köçürülməsində səhv baş verdi", - "Error" : "Səhv", - "{new_name} already exists" : "{new_name} artıq mövcuddur", - "Could not rename file" : "Faylın adını dəyişmək mümkün olmadı", - "Could not create file" : "Faylı yaratmaq olmur", - "Could not create folder" : "Qovluğu yaratmaq olmur", - "Error deleting file." : "Faylın silinməsində səhv baş verdi.", "No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı", "Name" : "Ad", "Size" : "Həcm", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"], "Favorited" : "İstəkləndi", "Favorite" : "İstəkli", - "{newname} already exists" : "{newname} artıq mövcuddur", - "Upload" : "Serverə yüklə", - "Text file" : "Tekst faylı", - "New text file.txt" : "Yeni mətn file.txt", "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 created" : "Yeni fayl və ya direktoriya yaradılmışdır", "A file or folder has been changed" : "Fayl və ya direktoriya dəyişdirilib", @@ -96,15 +80,11 @@ OC.L10N.register( "%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", - "%s could not be renamed as it has been deleted" : "%s adını dəyişə bilmərik ona görə ki, o silinib artıq", - "%s could not be renamed" : "%s adını dəyişə bilməz", "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: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ilə bu məna yadda saxladıldıqından 5 dəqiqə sonra işə düşə bilər. ", "Save" : "Saxlamaq", - "Can not be edited from here due to insufficient permissions." : "Yetki çatışmamazlığına görə, burdan başlayaraq dəyişiklik edə bilməzsiniz.", "Settings" : "Quraşdırmalar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Bu ünvanı WebDAV vasitəsilə fayllarınızı əldə etmək üçün istifadə edə bilərsiniz. ", @@ -118,6 +98,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", "Currently scanning" : "Hal-hazırda skan edilir", "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" + "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);"); diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json index 8603939790..f2c45fda2f 100644 --- a/apps/files/l10n/az.json +++ b/apps/files/l10n/az.json @@ -2,13 +2,6 @@ "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", - "Could not move %s - File with this name already exists" : "Köçürmə mümkün deyil %s - Bu adla fayl artıq mövcuddur", - "Could not move %s" : "Yerdəyişmə mükün olmadı %s", - "Permission denied" : "Yetki qadağandır", - "The target folder has been moved or deleted." : "Mənsəbdə olan qovluqun ünvanı dəyişib yada silinib.", - "The name %s is already used in the folder %s. Please choose a different name." : "Bu ad %s artıq %s qovluğunda istifadə edilir. Xahiş olunur fərqli ad istifadə edəsiniz.", - "Error when creating the file" : "Fayl yaratdıqda səhv baş vermişdir", - "Error when creating the folder" : "Qovluğu yaratdıqda səhv baş vermişdir", "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", @@ -20,6 +13,7 @@ "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.", @@ -28,10 +22,10 @@ "Favorites" : "Sevimlilər", "Home" : "Ev", "Close" : "Bağla", + "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. ", - "Upload cancelled." : "Yüklənmə dayandırıldı.", "Could not get result from server." : "Nəticəni serverdən almaq mümkün olmur.", "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", @@ -44,14 +38,6 @@ "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", - "Error moving file." : "Faylın köçürülməsində səhv baş verdi.", - "Error moving file" : "Faylın köçürülməsində səhv baş verdi", - "Error" : "Səhv", - "{new_name} already exists" : "{new_name} artıq mövcuddur", - "Could not rename file" : "Faylın adını dəyişmək mümkün olmadı", - "Could not create file" : "Faylı yaratmaq olmur", - "Could not create folder" : "Qovluğu yaratmaq olmur", - "Error deleting file." : "Faylın silinməsində səhv baş verdi.", "No entries in this folder match '{filter}'" : "Bu qovluqda '{filter}' uyğunluğunda heç bir verilən tapılmadı", "Name" : "Ad", "Size" : "Həcm", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n baytlar","%n bytes"], "Favorited" : "İstəkləndi", "Favorite" : "İstəkli", - "{newname} already exists" : "{newname} artıq mövcuddur", - "Upload" : "Serverə yüklə", - "Text file" : "Tekst faylı", - "New text file.txt" : "Yeni mətn file.txt", "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 created" : "Yeni fayl və ya direktoriya yaradılmışdır", "A file or folder has been changed" : "Fayl və ya direktoriya dəyişdirilib", @@ -94,15 +78,11 @@ "%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", - "%s could not be renamed as it has been deleted" : "%s adını dəyişə bilmərik ona görə ki, o silinib artıq", - "%s could not be renamed" : "%s adını dəyişə bilməz", "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: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ilə bu məna yadda saxladıldıqından 5 dəqiqə sonra işə düşə bilər. ", "Save" : "Saxlamaq", - "Can not be edited from here due to insufficient permissions." : "Yetki çatışmamazlığına görə, burdan başlayaraq dəyişiklik edə bilməzsiniz.", "Settings" : "Quraşdırmalar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Bu ünvanı WebDAV vasitəsilə fayllarınızı əldə etmək üçün istifadə edə bilərsiniz. ", @@ -116,6 +96,8 @@ "Files are being scanned, please wait." : "Faylların skanı başlanıb, xahiş olunur gözləyəsiniz.", "Currently scanning" : "Hal-hazırda skan edilir", "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" + "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);" } \ No newline at end of file diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js index 77e9a4d607..55e94ac247 100644 --- a/apps/files/l10n/be.js +++ b/apps/files/l10n/be.js @@ -1,7 +1,6 @@ OC.L10N.register( "files", { - "Error" : "Памылка", "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);"); diff --git a/apps/files/l10n/be.json b/apps/files/l10n/be.json index 27c2988b70..3f70a0783f 100644 --- a/apps/files/l10n/be.json +++ b/apps/files/l10n/be.json @@ -1,5 +1,4 @@ { "translations": { - "Error" : "Памылка", "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);" } \ No newline at end of file diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index 98e0e2bd4b..b30f670e31 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Липсва дисковото устройство.", "Storage invalid" : "Невалидно дисково устройство.", "Unknown error" : "Непозната грешка.", - "Could not move %s - File with this name already exists" : "Неуспешно преместване на %s - Файл със същото име вече съществува.", - "Could not move %s" : "Неуспешно преместване на %s.", - "Permission denied" : "Достъпът отказан", - "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", - "The name %s is already used in the folder %s. Please choose a different name." : "Името %s е вече в папка %s. Моля, избери друго име.", - "Error when creating the file" : "Грешка при създаването на файлът.", - "Error when creating the folder" : "Грешка при създаването на папката.", "Unable to set upload directory." : "Неуспешно задаване на директория за качване.", "Invalid Token" : "Невалиеден токен.", "No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Липсва временна папка.", "Failed to write to disk" : "Възникна проблем при запис на диска.", "Not enough storage available" : "Недостатъчно място.", + "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", "Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.", "Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.", "Invalid directory." : "Невалидна директория.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Любими", "Home" : "Домашен", "Close" : "Затвори", + "Upload cancelled." : "Качването е прекъснато.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", - "Upload cancelled." : "Качването е прекъснато.", "Could not get result from server." : "Не се получи резултат от сървърът.", "File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.", "Actions" : "Действия", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", - "Error moving file." : "Грешка при местенето на файла.", - "Error moving file" : "Грешка при преместването на файла.", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} вече съществува.", - "Could not rename file" : "Неуспешно преименуване на файла.", - "Could not create file" : "Несупешно създаване на файла.", - "Could not create folder" : "Неуспешно създаване на папка.", - "Error deleting file." : "Грешка при изтриването на файла.", "No entries in this folder match '{filter}'" : "Нищо в тази папка не отговаря на '{filter}'", "Name" : "Име", "Size" : "Размер", @@ -69,10 +55,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "], "Favorited" : "Отбелязано в любими", "Favorite" : "Любими", - "Upload" : "Качване", - "Text file" : "Текстов файл", "Folder" : "Папка", "New folder" : "Нова папка", + "Upload" : "Качване", "An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките", "A new file or folder has been created" : "Нов файл или папка беше създаден/а", "A file or folder has been changed" : "Файл или папка беше променен/а", @@ -87,14 +72,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s изтри %1$s.", "You restored %1$s" : "Вие възстановихте %1$s", "%2$s restored %1$s" : "%2$s възстанови %1$s", - "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит", - "%s could not be renamed" : "%s не може да бъде преименуван.", "Upload (max. %s)" : "Качи (макс. %s)", "File handling" : "Операция с файла", "Maximum upload size" : "Максимален размер", "max. possible: " : "максимално:", "Save" : "Запис", - "Can not be edited from here due to insufficient permissions." : "Не може да бъде редактиран от тук, поради липса на права", "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Използвай този адрес, за да получиш достъп до своите файлове чрез WebDAV.", @@ -108,6 +90,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", "Currently scanning" : "В момента се търси", "No favorites" : "Няма любими", - "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук" + "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", + "Text file" : "Текстов файл" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index 48d6729232..e676d27fcb 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -2,13 +2,6 @@ "Storage not available" : "Липсва дисковото устройство.", "Storage invalid" : "Невалидно дисково устройство.", "Unknown error" : "Непозната грешка.", - "Could not move %s - File with this name already exists" : "Неуспешно преместване на %s - Файл със същото име вече съществува.", - "Could not move %s" : "Неуспешно преместване на %s.", - "Permission denied" : "Достъпът отказан", - "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", - "The name %s is already used in the folder %s. Please choose a different name." : "Името %s е вече в папка %s. Моля, избери друго име.", - "Error when creating the file" : "Грешка при създаването на файлът.", - "Error when creating the folder" : "Грешка при създаването на папката.", "Unable to set upload directory." : "Неуспешно задаване на директория за качване.", "Invalid Token" : "Невалиеден токен.", "No file was uploaded. Unknown error" : "Неуспешно качвачване на файл. Непозната грешка.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Липсва временна папка.", "Failed to write to disk" : "Възникна проблем при запис на диска.", "Not enough storage available" : "Недостатъчно място.", + "The target folder has been moved or deleted." : "Крайната папка е изтрита или преместена.", "Upload failed. Could not find uploaded file" : "Неуспешно качване. Не бе открит качения файл.", "Upload failed. Could not get file info." : "Неуспешно качване. Не се получи информация за файла.", "Invalid directory." : "Невалидна директория.", @@ -28,10 +22,10 @@ "Favorites" : "Любими", "Home" : "Домашен", "Close" : "Затвори", + "Upload cancelled." : "Качването е прекъснато.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", - "Upload cancelled." : "Качването е прекъснато.", "Could not get result from server." : "Не се получи резултат от сървърът.", "File upload is in progress. Leaving the page now will cancel the upload." : "Извършва се качване на файлове. Затварянето на тази страница ще прекъсне качването.", "Actions" : "Действия", @@ -42,14 +36,6 @@ "Select" : "Избери", "Pending" : "Чакащо", "Unable to determine date" : "Неуспешно установяване на дата", - "Error moving file." : "Грешка при местенето на файла.", - "Error moving file" : "Грешка при преместването на файла.", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} вече съществува.", - "Could not rename file" : "Неуспешно преименуване на файла.", - "Could not create file" : "Несупешно създаване на файла.", - "Could not create folder" : "Неуспешно създаване на папка.", - "Error deleting file." : "Грешка при изтриването на файла.", "No entries in this folder match '{filter}'" : "Нищо в тази папка не отговаря на '{filter}'", "Name" : "Име", "Size" : "Размер", @@ -67,10 +53,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["пасва на '{filter}'","пасват на '{filter}'\n "], "Favorited" : "Отбелязано в любими", "Favorite" : "Любими", - "Upload" : "Качване", - "Text file" : "Текстов файл", "Folder" : "Папка", "New folder" : "Нова папка", + "Upload" : "Качване", "An error occurred while trying to update the tags" : "Настъпи грешка при опита за промяна на бележките", "A new file or folder has been created" : "Нов файл или папка беше създаден/а", "A file or folder has been changed" : "Файл или папка беше променен/а", @@ -85,14 +70,11 @@ "%2$s deleted %1$s" : "%2$s изтри %1$s.", "You restored %1$s" : "Вие възстановихте %1$s", "%2$s restored %1$s" : "%2$s възстанови %1$s", - "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит", - "%s could not be renamed" : "%s не може да бъде преименуван.", "Upload (max. %s)" : "Качи (макс. %s)", "File handling" : "Операция с файла", "Maximum upload size" : "Максимален размер", "max. possible: " : "максимално:", "Save" : "Запис", - "Can not be edited from here due to insufficient permissions." : "Не може да бъде редактиран от тук, поради липса на права", "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Използвай този адрес, за да получиш достъп до своите файлове чрез WebDAV.", @@ -106,6 +88,7 @@ "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", "Currently scanning" : "В момента се търси", "No favorites" : "Няма любими", - "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук" + "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", + "Text file" : "Текстов файл" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js index bc8d7ce8d5..b968a225da 100644 --- a/apps/files/l10n/bn_BD.js +++ b/apps/files/l10n/bn_BD.js @@ -4,11 +4,6 @@ OC.L10N.register( "Storage not available" : "সংরক্ষণের স্থান নেই", "Storage invalid" : "সংরক্ষণাগার বৈধ নয়", "Unknown error" : "অজানা জটিলতা", - "Could not move %s - File with this name already exists" : "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান", - "Could not move %s" : "%s কে স্থানান্তর করা সম্ভব হলো না", - "Permission denied" : "অনুমতি দেয়া হয়নি", - "Error when creating the file" : "ফাইলটি তৈরী করতে যেয়ে সমস্যা হলো", - "Error when creating the folder" : "ফোল্ডার তৈরী করতে যেয়ে সমস্যা হলো", "Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।", "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।", "There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।", @@ -33,11 +28,6 @@ OC.L10N.register( "Delete" : "মুছে", "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", - "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", - "Error moving file" : "ফাইল সরাতে সমস্যা হলো", - "Error" : "সমস্যা", - "{new_name} already exists" : "{new_name} টি বিদ্যমান", - "Could not rename file" : "ফাইলের পূণঃনামকরণ করা গেলনা", "Name" : "রাম", "Size" : "আকার", "Modified" : "পরিবর্তিত", @@ -47,10 +37,9 @@ OC.L10N.register( "File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।", "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ", "Favorite" : "প্রিয়জন", - "Upload" : "আপলোড", - "Text file" : "টেক্সট ফাইল", "Folder" : "ফোল্ডার", "New folder" : "নব ফােলডার", + "Upload" : "আপলোড", "A new file or folder has been created" : "একটি ফাইল বা ফোলডার তৈরি করা হয়েছে", "A file or folder has been changed" : "একটি ফাইল বা ফোলডার পরিবরতন করা হয়েছে", "A file or folder has been deleted" : "একটি ফাইল বা ফোলডার মোছা হয়েছে", @@ -70,6 +59,7 @@ OC.L10N.register( "Cancel upload" : "আপলোড বাতিল কর", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", - "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।" + "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।", + "Text file" : "টেক্সট ফাইল" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json index 43ebbc8ad9..bed559330a 100644 --- a/apps/files/l10n/bn_BD.json +++ b/apps/files/l10n/bn_BD.json @@ -2,11 +2,6 @@ "Storage not available" : "সংরক্ষণের স্থান নেই", "Storage invalid" : "সংরক্ষণাগার বৈধ নয়", "Unknown error" : "অজানা জটিলতা", - "Could not move %s - File with this name already exists" : "%s কে স্থানান্তর করা সম্ভব হলো না - এই নামের ফাইল বিদ্যমান", - "Could not move %s" : "%s কে স্থানান্তর করা সম্ভব হলো না", - "Permission denied" : "অনুমতি দেয়া হয়নি", - "Error when creating the file" : "ফাইলটি তৈরী করতে যেয়ে সমস্যা হলো", - "Error when creating the folder" : "ফোল্ডার তৈরী করতে যেয়ে সমস্যা হলো", "Unable to set upload directory." : "েআপলোড ডিরেক্টরি নির্ধারণ করা গেলনা।", "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি। সমস্যার কারণটি অজ্ঞাত।", "There is no error, the file uploaded with success" : "কোন সমস্যা হয় নি, ফাইল আপলোড সুসম্পন্ন হয়েছে।", @@ -31,11 +26,6 @@ "Delete" : "মুছে", "Details" : "বিস্তারিত", "Pending" : "মুলতুবি", - "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", - "Error moving file" : "ফাইল সরাতে সমস্যা হলো", - "Error" : "সমস্যা", - "{new_name} already exists" : "{new_name} টি বিদ্যমান", - "Could not rename file" : "ফাইলের পূণঃনামকরণ করা গেলনা", "Name" : "রাম", "Size" : "আকার", "Modified" : "পরিবর্তিত", @@ -45,10 +35,9 @@ "File name cannot be empty." : "ফাইলের নামটি ফাঁকা রাখা যাবে না।", "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ", "Favorite" : "প্রিয়জন", - "Upload" : "আপলোড", - "Text file" : "টেক্সট ফাইল", "Folder" : "ফোল্ডার", "New folder" : "নব ফােলডার", + "Upload" : "আপলোড", "A new file or folder has been created" : "একটি ফাইল বা ফোলডার তৈরি করা হয়েছে", "A file or folder has been changed" : "একটি ফাইল বা ফোলডার পরিবরতন করা হয়েছে", "A file or folder has been deleted" : "একটি ফাইল বা ফোলডার মোছা হয়েছে", @@ -68,6 +57,7 @@ "Cancel upload" : "আপলোড বাতিল কর", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", - "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।" + "Files are being scanned, please wait." : "ফাইলগুলো স্ক্যান করা হচ্ছে, দয়া করে অপেক্ষা করুন।", + "Text file" : "টেক্সট ফাইল" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/bn_IN.js b/apps/files/l10n/bn_IN.js index d7f6113313..e69597d35c 100644 --- a/apps/files/l10n/bn_IN.js +++ b/apps/files/l10n/bn_IN.js @@ -1,8 +1,6 @@ OC.L10N.register( "files", { - "Could not move %s - File with this name already exists" : "%s সরানো যায়নি-এই নামে আগে থেকেই ফাইল আছে", - "Could not move %s" : "%s সরানো যায়নি", "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি।অজানা ত্রুটি", "There is no error, the file uploaded with success" : "কোন ত্রুটি নেই,ফাইল সাফল্যের সঙ্গে আপলোড করা হয়েছে", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইল-php.ini মধ্যে upload_max_filesize নির্দেশ অতিক্রম করে:", @@ -19,7 +17,6 @@ OC.L10N.register( "Rename" : "পুনঃনামকরণ", "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", - "Error" : "ভুল", "Name" : "নাম", "Size" : "আকার", "Folder" : "ফোল্ডার", diff --git a/apps/files/l10n/bn_IN.json b/apps/files/l10n/bn_IN.json index f2d5d9fbf7..20c8c2e795 100644 --- a/apps/files/l10n/bn_IN.json +++ b/apps/files/l10n/bn_IN.json @@ -1,6 +1,4 @@ { "translations": { - "Could not move %s - File with this name already exists" : "%s সরানো যায়নি-এই নামে আগে থেকেই ফাইল আছে", - "Could not move %s" : "%s সরানো যায়নি", "No file was uploaded. Unknown error" : "কোন ফাইল আপলোড করা হয় নি।অজানা ত্রুটি", "There is no error, the file uploaded with success" : "কোন ত্রুটি নেই,ফাইল সাফল্যের সঙ্গে আপলোড করা হয়েছে", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "আপলোড করা ফাইল-php.ini মধ্যে upload_max_filesize নির্দেশ অতিক্রম করে:", @@ -17,7 +15,6 @@ "Rename" : "পুনঃনামকরণ", "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", - "Error" : "ভুল", "Name" : "নাম", "Size" : "আকার", "Folder" : "ফোল্ডার", diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js index 6ca6ebe90c..9da51ece87 100644 --- a/apps/files/l10n/bs.js +++ b/apps/files/l10n/bs.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Pohrana je nedostupna", "Storage invalid" : "Pohrana je neispravna", "Unknown error" : "Nepoznata greška", - "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", - "Could not move %s" : "Nemoguće premjestiti %s", - "Permission denied" : "Nemate ovlaštenje", - "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.", - "Error when creating the file" : "Greška pri kreiranju datoteke", - "Error when creating the folder" : "Greška pri kreiranju direktorija", "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.", "Invalid Token" : "Neispravan Znak", "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Nedostaje privremeni direktorij.", "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.", "Not enough storage available" : "Prostor za pohranu je nedovoljan", + "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka", "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.", "Invalid directory." : "Neispravan direktorij.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoriti", "Home" : "Kuća", "Close" : "Zatvori", + "Upload cancelled." : "Učitavanje je prekinuto.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", - "Upload cancelled." : "Učitavanje je prekinuto.", "Could not get result from server." : "Nemoguće dobiti rezultat od servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", @@ -43,14 +37,6 @@ OC.L10N.register( "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", - "Error moving file." : "Greška pri premještanju datoteke", - "Error moving file" : "Greška pri premještanju datoteke", - "Error" : "Greška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Nemoguće preimenovati datoteku", - "Could not create file" : "Datoteku nije moguće kreirati", - "Could not create folder" : "Direktorij nije moguće kreirati", - "Error deleting file." : "Greška pri brisanju datoteke", "Name" : "Ime", "Size" : "Veličina", "Modified" : "Izmijenjeno", @@ -66,12 +52,9 @@ OC.L10N.register( "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", "Favorited" : "Favorizovano", "Favorite" : "Favorit", - "Upload" : "Učitaj", - "Text file" : "Tekstualna datoteka", "Folder" : "Direktorij", "New folder" : "Novi direktorij", - "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", - "%s could not be renamed" : "%s nije moguće preimenovati", + "Upload" : "Učitaj", "Upload (max. %s)" : "Učitaj (max. %s)", "File handling" : "Obrada datoteke", "Maximum upload size" : "Maksimalna veličina učitavanja", @@ -88,6 +71,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", "Currently scanning" : "Provjera u toku", "No favorites" : "Nema favorita", - "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje" + "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje", + "Text file" : "Tekstualna datoteka" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json index 553662622f..095fe47048 100644 --- a/apps/files/l10n/bs.json +++ b/apps/files/l10n/bs.json @@ -2,13 +2,6 @@ "Storage not available" : "Pohrana je nedostupna", "Storage invalid" : "Pohrana je neispravna", "Unknown error" : "Nepoznata greška", - "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", - "Could not move %s" : "Nemoguće premjestiti %s", - "Permission denied" : "Nemate ovlaštenje", - "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.", - "Error when creating the file" : "Greška pri kreiranju datoteke", - "Error when creating the folder" : "Greška pri kreiranju direktorija", "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.", "Invalid Token" : "Neispravan Znak", "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Nedostaje privremeni direktorij.", "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.", "Not enough storage available" : "Prostor za pohranu je nedovoljan", + "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka", "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.", "Invalid directory." : "Neispravan direktorij.", @@ -28,10 +22,10 @@ "Favorites" : "Favoriti", "Home" : "Kuća", "Close" : "Zatvori", + "Upload cancelled." : "Učitavanje je prekinuto.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", - "Upload cancelled." : "Učitavanje je prekinuto.", "Could not get result from server." : "Nemoguće dobiti rezultat od servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", @@ -41,14 +35,6 @@ "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Nemoguće odrediti datum", - "Error moving file." : "Greška pri premještanju datoteke", - "Error moving file" : "Greška pri premještanju datoteke", - "Error" : "Greška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Nemoguće preimenovati datoteku", - "Could not create file" : "Datoteku nije moguće kreirati", - "Could not create folder" : "Direktorij nije moguće kreirati", - "Error deleting file." : "Greška pri brisanju datoteke", "Name" : "Ime", "Size" : "Veličina", "Modified" : "Izmijenjeno", @@ -64,12 +50,9 @@ "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", "Favorited" : "Favorizovano", "Favorite" : "Favorit", - "Upload" : "Učitaj", - "Text file" : "Tekstualna datoteka", "Folder" : "Direktorij", "New folder" : "Novi direktorij", - "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", - "%s could not be renamed" : "%s nije moguće preimenovati", + "Upload" : "Učitaj", "Upload (max. %s)" : "Učitaj (max. %s)", "File handling" : "Obrada datoteke", "Maximum upload size" : "Maksimalna veličina učitavanja", @@ -86,6 +69,7 @@ "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", "Currently scanning" : "Provjera u toku", "No favorites" : "Nema favorita", - "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje" + "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje", + "Text file" : "Tekstualna datoteka" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index b5cd0beedf..88ad722416 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Emmagatzemament no disponible", "Storage invalid" : "Emmagatzemament no vàlid", "Unknown error" : "Error desconegut", - "Could not move %s - File with this name already exists" : "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", - "Could not move %s" : " No s'ha pogut moure %s", - "Permission denied" : "Permís denegat", - "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nom %s ja s'usa en la carpeta %s. Indiqueu un nom diferent.", - "Error when creating the file" : "S'ha produït un error en crear el fitxer", - "Error when creating the folder" : "S'ha produït un error en crear la carpeta", "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", "Invalid Token" : "Testimoni no vàlid", "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Falta un fitxer temporal", "Failed to write to disk" : "Ha fallat en escriure al disc", "Not enough storage available" : "No hi ha prou espai disponible", + "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", "Invalid directory." : "Directori no vàlid.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Preferits", "Home" : "Casa", "Close" : "Tanca", + "Upload cancelled." : "La pujada s'ha cancel·lat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", - "Upload cancelled." : "La pujada s'ha cancel·lat.", "Could not get result from server." : "No hi ha resposta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", - "Error moving file." : "Error en moure el fitxer.", - "Error moving file" : "Error en moure el fitxer", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ja existeix", - "Could not rename file" : "No es pot canviar el nom de fitxer", - "Could not create file" : "No s'ha pogut crear el fitxer", - "Could not create folder" : "No s'ha pogut crear la carpeta", - "Error deleting file." : "Error en esborrar el fitxer.", "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", "Name" : "Nom", "Size" : "Mida", @@ -71,10 +57,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"], "Favorited" : "Agregat a favorits", "Favorite" : "Preferits", - "Upload" : "Puja", - "Text file" : "Fitxer de text", "Folder" : "Carpeta", "New folder" : "Carpeta nova", + "Upload" : "Puja", "An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes", "A new file or folder has been created" : "S'ha creat un nou fitxer o una nova carpeta", "A file or folder has been changed" : "S'ha canviat un fitxer o una carpeta", @@ -90,14 +75,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s ha esborrat %1$s", "You restored %1$s" : "Has restaurat %1$s", "%2$s restored %1$s" : "%2$s ha restaurat %1$s", - "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat", - "%s could not be renamed" : "%s no es pot canviar el nom", "Upload (max. %s)" : "Pujada (màx. %s)", "File handling" : "Gestió de fitxers", "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", - "Can not be edited from here due to insufficient permissions." : "No es pot editar des d'aquí per permisos insuficients.", "Settings" : "Arranjament", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Useu aquesta adreça per accedir als fitxers via WebDAV", @@ -111,6 +93,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", "Currently scanning" : "Actualment escanejant", "No favorites" : "No hi ha favorits", - "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits" + "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", + "Text file" : "Fitxer de text" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 7558821627..4eee482e83 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -2,13 +2,6 @@ "Storage not available" : "Emmagatzemament no disponible", "Storage invalid" : "Emmagatzemament no vàlid", "Unknown error" : "Error desconegut", - "Could not move %s - File with this name already exists" : "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", - "Could not move %s" : " No s'ha pogut moure %s", - "Permission denied" : "Permís denegat", - "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nom %s ja s'usa en la carpeta %s. Indiqueu un nom diferent.", - "Error when creating the file" : "S'ha produït un error en crear el fitxer", - "Error when creating the folder" : "S'ha produït un error en crear la carpeta", "Unable to set upload directory." : "No es pot establir la carpeta de pujada.", "Invalid Token" : "Testimoni no vàlid", "No file was uploaded. Unknown error" : "No s'ha carregat cap fitxer. Error desconegut", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Falta un fitxer temporal", "Failed to write to disk" : "Ha fallat en escriure al disc", "Not enough storage available" : "No hi ha prou espai disponible", + "The target folder has been moved or deleted." : "La carpeta de destí s'ha mogut o eliminat.", "Upload failed. Could not find uploaded file" : "La pujada ha fallat. El fitxer pujat no s'ha trobat.", "Upload failed. Could not get file info." : "La pujada ha fallat. No s'ha pogut obtenir informació del fitxer.", "Invalid directory." : "Directori no vàlid.", @@ -28,10 +22,10 @@ "Favorites" : "Preferits", "Home" : "Casa", "Close" : "Tanca", + "Upload cancelled." : "La pujada s'ha cancel·lat.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", - "Upload cancelled." : "La pujada s'ha cancel·lat.", "Could not get result from server." : "No hi ha resposta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Hi ha una pujada en curs. Si abandoneu la pàgina la pujada es cancel·larà.", "Actions" : "Accions", @@ -42,14 +36,6 @@ "Select" : "Selecciona", "Pending" : "Pendent", "Unable to determine date" : "No s'ha pogut determinar la data", - "Error moving file." : "Error en moure el fitxer.", - "Error moving file" : "Error en moure el fitxer", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ja existeix", - "Could not rename file" : "No es pot canviar el nom de fitxer", - "Could not create file" : "No s'ha pogut crear el fitxer", - "Could not create folder" : "No s'ha pogut crear la carpeta", - "Error deleting file." : "Error en esborrar el fitxer.", "No entries in this folder match '{filter}'" : "No hi ha resultats que coincideixin amb '{filter}'", "Name" : "Nom", "Size" : "Mida", @@ -69,10 +55,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["coincidències '{filter}'","coincidència '{filter}'"], "Favorited" : "Agregat a favorits", "Favorite" : "Preferits", - "Upload" : "Puja", - "Text file" : "Fitxer de text", "Folder" : "Carpeta", "New folder" : "Carpeta nova", + "Upload" : "Puja", "An error occurred while trying to update the tags" : "S'ha produït un error en tractar d'actualitzar les etiquetes", "A new file or folder has been created" : "S'ha creat un nou fitxer o una nova carpeta", "A file or folder has been changed" : "S'ha canviat un fitxer o una carpeta", @@ -88,14 +73,11 @@ "%2$s deleted %1$s" : "%2$s ha esborrat %1$s", "You restored %1$s" : "Has restaurat %1$s", "%2$s restored %1$s" : "%2$s ha restaurat %1$s", - "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat", - "%s could not be renamed" : "%s no es pot canviar el nom", "Upload (max. %s)" : "Pujada (màx. %s)", "File handling" : "Gestió de fitxers", "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", - "Can not be edited from here due to insufficient permissions." : "No es pot editar des d'aquí per permisos insuficients.", "Settings" : "Arranjament", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Useu aquesta adreça per accedir als fitxers via WebDAV", @@ -109,6 +91,7 @@ "Files are being scanned, please wait." : "S'estan escanejant els fitxers, espereu", "Currently scanning" : "Actualment escanejant", "No favorites" : "No hi ha favorits", - "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits" + "Files and folders you mark as favorite will show up here" : "Aquí apareixeran els arxius i carpetes que vostè marqui com favorits", + "Text file" : "Fitxer de text" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js index 10f9d49984..8c40cbcd77 100644 --- a/apps/files/l10n/cs_CZ.js +++ b/apps/files/l10n/cs_CZ.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Úložiště není dostupné", "Storage invalid" : "Neplatné úložiště", "Unknown error" : "Neznámá chyba", - "Could not move %s - File with this name already exists" : "Nelze přesunout %s - již existuje soubor se stejným názvem", - "Could not move %s" : "Nelze přesunout %s", - "Permission denied" : "Přístup odepřen", - "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.", - "The name %s is already used in the folder %s. Please choose a different name." : "Název %s ve složce %s již existuje. Vyberte prosím jiné jméno.", - "Error when creating the file" : "Chyba při vytváření souboru", - "Error when creating the folder" : "Chyba při vytváření složky", "Unable to set upload directory." : "Nelze nastavit adresář pro nahrané soubory.", "Invalid Token" : "Neplatný token", "No file was uploaded. Unknown error" : "Žádný soubor nebyl odeslán. Neznámá chyba", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Chybí adresář pro dočasné soubory", "Failed to write to disk" : "Zápis na disk selhal", "Not enough storage available" : "Nedostatek dostupného úložného prostoru", + "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.", "Upload failed. Could not find uploaded file" : "Nahrávání selhalo. Nepodařilo se nalézt nahraný soubor.", "Upload failed. Could not get file info." : "Nahrávání selhalo. Nepodařilo se získat informace o souboru.", "Invalid directory." : "Neplatný adresář", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Oblíbené", "Home" : "Domů", "Close" : "Zavřít", + "Upload cancelled." : "Odesílání zrušeno.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů", "Total file size {size1} exceeds upload limit {size2}" : "Celková velikost souboru {size1} překračuje povolenou velikost pro nahrávání {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Není dostatek místa pro uložení, velikost souboru je {size1}, zbývá pouze {size2}", - "Upload cancelled." : "Odesílání zrušeno.", "Could not get result from server." : "Nepodařilo se získat výsledek ze serveru.", "File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.", "Actions" : "Činnosti", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Nelze určit datum", "This operation is forbidden" : "Tato operace je zakázána", "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému", - "Error moving file." : "Chyba při přesunu souboru.", - "Error moving file" : "Chyba při přesunu souboru", - "Error" : "Chyba", - "{new_name} already exists" : "{new_name} již existuje", - "Could not rename file" : "Nepodařilo se přejmenovat soubor", - "Could not create file" : "Nepodařilo se vytvořit soubor", - "Could not create folder" : "Nepodařilo se vytvořit složku", - "Error deleting file." : "Chyba při mazání souboru.", + "Could not move \"{file}\", target exists" : "Nelze přesunout \"{file}\", cíl existuje", + "Could not move \"{file}\"" : "Nelze přesunout \"{file}\"", + "{newName} already exists" : "{newName} již existuje", + "Could not rename \"{fileName}\", it does not exist any more" : "Nelze přejmenovat \"{fileName}\", již neexistuje", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jméno \"{targetName}\" je již použito v adresáři \"{dir}\". Vyberte prosím jiné jméno.", + "Could not rename \"{fileName}\"" : "Nelze přejmenovat \"{fileName}\"", + "Could not create file \"{file}\"" : "Nelze vytvořit soubor \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nelze vytvořit soubor \"{file}\", protože již existuje", + "Could not create folder \"{dir}\"" : "Nelze vytvořit adresář \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nelze vytvořit adresář \"{dir}\", protože již existuje", + "Error deleting file \"{fileName}\"." : "Chyba mazání souboru \"{fileName}\".", "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", "Name" : "Název", "Size" : "Velikost", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"], "Favorited" : "Přidáno k oblíbeným", "Favorite" : "Oblíbené", - "{newname} already exists" : "{newname} již existuje", - "Upload" : "Odeslat", - "Text file" : "Textový soubor", - "New text file.txt" : "Nový textový soubor.txt", "Folder" : "Složka", "New folder" : "Nová složka", + "{newname} already exists" : "{newname} již existuje", + "Upload" : "Odeslat", "An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba", "A new file or folder has been created" : "Byl vytvořen nový soubor nebo složka", "A file or folder has been changed" : "Soubor nebo složka byla změněna", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Změněno uživatelem %2$s", "Deleted by %2$s" : "Smazáno uživatelem %2$s", "Restored by %2$s" : "Obnoveno uživatelem %2$s", - "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", - "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", "File handling" : "Zacházení se soubory", "Maximum upload size" : "Maximální velikost pro odesílání", "max. possible: " : "největší možná: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Při použití PHP-FPM může změna tohoto nastavení trvat až 5 minut po jeho uložení.", "Save" : "Uložit", - "Can not be edited from here due to insufficient permissions." : "Nelze odsud upravovat z důvodu nedostatečných oprávnění.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.", + "Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.", "Settings" : "Nastavení", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Použijte tuto adresu pro přístup k vašim souborům přes WebDAV", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", "Currently scanning" : "Prohledává se", "No favorites" : "Žádné oblíbené", - "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde" + "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde", + "Text file" : "Textový soubor", + "New text file.txt" : "Nový textový soubor.txt" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json index cc475fbfd5..70b61ec784 100644 --- a/apps/files/l10n/cs_CZ.json +++ b/apps/files/l10n/cs_CZ.json @@ -2,13 +2,6 @@ "Storage not available" : "Úložiště není dostupné", "Storage invalid" : "Neplatné úložiště", "Unknown error" : "Neznámá chyba", - "Could not move %s - File with this name already exists" : "Nelze přesunout %s - již existuje soubor se stejným názvem", - "Could not move %s" : "Nelze přesunout %s", - "Permission denied" : "Přístup odepřen", - "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.", - "The name %s is already used in the folder %s. Please choose a different name." : "Název %s ve složce %s již existuje. Vyberte prosím jiné jméno.", - "Error when creating the file" : "Chyba při vytváření souboru", - "Error when creating the folder" : "Chyba při vytváření složky", "Unable to set upload directory." : "Nelze nastavit adresář pro nahrané soubory.", "Invalid Token" : "Neplatný token", "No file was uploaded. Unknown error" : "Žádný soubor nebyl odeslán. Neznámá chyba", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Chybí adresář pro dočasné soubory", "Failed to write to disk" : "Zápis na disk selhal", "Not enough storage available" : "Nedostatek dostupného úložného prostoru", + "The target folder has been moved or deleted." : "Cílová složka byla přesunuta nebo smazána.", "Upload failed. Could not find uploaded file" : "Nahrávání selhalo. Nepodařilo se nalézt nahraný soubor.", "Upload failed. Could not get file info." : "Nahrávání selhalo. Nepodařilo se získat informace o souboru.", "Invalid directory." : "Neplatný adresář", @@ -28,10 +22,10 @@ "Favorites" : "Oblíbené", "Home" : "Domů", "Close" : "Zavřít", + "Upload cancelled." : "Odesílání zrušeno.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů", "Total file size {size1} exceeds upload limit {size2}" : "Celková velikost souboru {size1} překračuje povolenou velikost pro nahrávání {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Není dostatek místa pro uložení, velikost souboru je {size1}, zbývá pouze {size2}", - "Upload cancelled." : "Odesílání zrušeno.", "Could not get result from server." : "Nepodařilo se získat výsledek ze serveru.", "File upload is in progress. Leaving the page now will cancel the upload." : "Probíhá odesílání souboru. Opuštění stránky způsobí zrušení nahrávání.", "Actions" : "Činnosti", @@ -44,14 +38,17 @@ "Unable to determine date" : "Nelze určit datum", "This operation is forbidden" : "Tato operace je zakázána", "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte prosím logy nebo kontaktujte svého správce systému", - "Error moving file." : "Chyba při přesunu souboru.", - "Error moving file" : "Chyba při přesunu souboru", - "Error" : "Chyba", - "{new_name} already exists" : "{new_name} již existuje", - "Could not rename file" : "Nepodařilo se přejmenovat soubor", - "Could not create file" : "Nepodařilo se vytvořit soubor", - "Could not create folder" : "Nepodařilo se vytvořit složku", - "Error deleting file." : "Chyba při mazání souboru.", + "Could not move \"{file}\", target exists" : "Nelze přesunout \"{file}\", cíl existuje", + "Could not move \"{file}\"" : "Nelze přesunout \"{file}\"", + "{newName} already exists" : "{newName} již existuje", + "Could not rename \"{fileName}\", it does not exist any more" : "Nelze přejmenovat \"{fileName}\", již neexistuje", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Jméno \"{targetName}\" je již použito v adresáři \"{dir}\". Vyberte prosím jiné jméno.", + "Could not rename \"{fileName}\"" : "Nelze přejmenovat \"{fileName}\"", + "Could not create file \"{file}\"" : "Nelze vytvořit soubor \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nelze vytvořit soubor \"{file}\", protože již existuje", + "Could not create folder \"{dir}\"" : "Nelze vytvořit adresář \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nelze vytvořit adresář \"{dir}\", protože již existuje", + "Error deleting file \"{fileName}\"." : "Chyba mazání souboru \"{fileName}\".", "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", "Name" : "Název", "Size" : "Velikost", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů"], "Favorited" : "Přidáno k oblíbeným", "Favorite" : "Oblíbené", - "{newname} already exists" : "{newname} již existuje", - "Upload" : "Odeslat", - "Text file" : "Textový soubor", - "New text file.txt" : "Nový textový soubor.txt", "Folder" : "Složka", "New folder" : "Nová složka", + "{newname} already exists" : "{newname} již existuje", + "Upload" : "Odeslat", "An error occurred while trying to update the tags" : "Při pokusu o úpravu tagů nastala chyba", "A new file or folder has been created" : "Byl vytvořen nový soubor nebo složka", "A file or folder has been changed" : "Soubor nebo složka byla změněna", @@ -97,15 +92,13 @@ "Changed by %2$s" : "Změněno uživatelem %2$s", "Deleted by %2$s" : "Smazáno uživatelem %2$s", "Restored by %2$s" : "Obnoveno uživatelem %2$s", - "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", - "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", "File handling" : "Zacházení se soubory", "Maximum upload size" : "Maximální velikost pro odesílání", "max. possible: " : "největší možná: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Při použití PHP-FPM může změna tohoto nastavení trvat až 5 minut po jeho uložení.", "Save" : "Uložit", - "Can not be edited from here due to insufficient permissions." : "Nelze odsud upravovat z důvodu nedostatečných oprávnění.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Při použití PHP-FPM může změna nastavení trvat až 5 minut od uložení.", + "Missing permissions to edit from here." : "Pro úpravy v aktuálním náhledu chybí oprávnění.", "Settings" : "Nastavení", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Použijte tuto adresu pro přístup k vašim souborům přes WebDAV", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", "Currently scanning" : "Prohledává se", "No favorites" : "Žádné oblíbené", - "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde" + "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde", + "Text file" : "Textový soubor", + "New text file.txt" : "Nový textový soubor.txt" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" } \ No newline at end of file diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js index 2f64d032f0..983df98f35 100644 --- a/apps/files/l10n/cy_GB.js +++ b/apps/files/l10n/cy_GB.js @@ -1,8 +1,6 @@ OC.L10N.register( "files", { - "Could not move %s - File with this name already exists" : "Methwyd symud %s - Mae ffeil gyda'r enw hwn eisoes yn bodoli", - "Could not move %s" : "Methwyd symud %s", "No file was uploaded. Unknown error" : "Ni lwythwyd ffeil i fyny. Gwall anhysbys.", "There is no error, the file uploaded with success" : "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:", @@ -24,8 +22,6 @@ OC.L10N.register( "Delete" : "Dileu", "Details" : "Manylion", "Pending" : "I ddod", - "Error" : "Gwall", - "{new_name} already exists" : "{new_name} yn bodoli'n barod", "Name" : "Enw", "Size" : "Maint", "Modified" : "Addaswyd", @@ -33,9 +29,8 @@ OC.L10N.register( "File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.", "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!", "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)", - "Upload" : "Llwytho i fyny", - "Text file" : "Ffeil destun", "Folder" : "Plygell", + "Upload" : "Llwytho i fyny", "File handling" : "Trafod ffeiliau", "Maximum upload size" : "Maint mwyaf llwytho i fyny", "max. possible: " : "mwyaf. posib:", @@ -44,6 +39,7 @@ OC.L10N.register( "Cancel upload" : "Diddymu llwytho i fyny", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", - "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio." + "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.", + "Text file" : "Ffeil destun" }, "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;"); diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json index 602cc780ab..b8b87b31de 100644 --- a/apps/files/l10n/cy_GB.json +++ b/apps/files/l10n/cy_GB.json @@ -1,6 +1,4 @@ { "translations": { - "Could not move %s - File with this name already exists" : "Methwyd symud %s - Mae ffeil gyda'r enw hwn eisoes yn bodoli", - "Could not move %s" : "Methwyd symud %s", "No file was uploaded. Unknown error" : "Ni lwythwyd ffeil i fyny. Gwall anhysbys.", "There is no error, the file uploaded with success" : "Does dim gwall, llwythodd y ffeil i fyny'n llwyddiannus", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Mae'r ffeil lwythwyd i fyny'n fwy na chyfarwyddeb upload_max_filesize yn php.ini:", @@ -22,8 +20,6 @@ "Delete" : "Dileu", "Details" : "Manylion", "Pending" : "I ddod", - "Error" : "Gwall", - "{new_name} already exists" : "{new_name} yn bodoli'n barod", "Name" : "Enw", "Size" : "Maint", "Modified" : "Addaswyd", @@ -31,9 +27,8 @@ "File name cannot be empty." : "Does dim hawl cael enw ffeil gwag.", "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!", "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)", - "Upload" : "Llwytho i fyny", - "Text file" : "Ffeil destun", "Folder" : "Plygell", + "Upload" : "Llwytho i fyny", "File handling" : "Trafod ffeiliau", "Maximum upload size" : "Maint mwyaf llwytho i fyny", "max. possible: " : "mwyaf. posib:", @@ -42,6 +37,7 @@ "Cancel upload" : "Diddymu llwytho i fyny", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", - "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio." + "Files are being scanned, please wait." : "Arhoswch, mae ffeiliau'n cael eu sganio.", + "Text file" : "Ffeil destun" },"pluralForm" :"nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;" } \ No newline at end of file diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index 4f8cd7ab49..2c27835f91 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Lagerplads er ikke tilgængeligt", "Storage invalid" : "Lagerplads er ugyldig", "Unknown error" : "Ukendt fejl", - "Could not move %s - File with this name already exists" : "Kunne ikke flytte %s - der findes allerede en fil med dette navn", - "Could not move %s" : "Kunne ikke flytte %s", - "Permission denied" : "Adgang nægtet", - "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.", - "The name %s is already used in the folder %s. Please choose a different name." : "Navnet %s er allerede i brug i mappen %s. Vælg venligst et andet navn.", - "Error when creating the file" : "Fejl ved oprettelse af fil", - "Error when creating the folder" : "Fejl ved oprettelse af mappen", "Unable to set upload directory." : "Ude af stand til at vælge upload mappe.", "Invalid Token" : "Ugyldig Token ", "No file was uploaded. Unknown error" : "Ingen fil blev uploadet. Ukendt fejl.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Manglende midlertidig mappe.", "Failed to write to disk" : "Fejl ved skrivning til disk.", "Not enough storage available" : "Der er ikke nok plads til rådlighed", + "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.", "Upload failed. Could not find uploaded file" : "Upload fejlede. Kunne ikke finde den uploadede fil.", "Upload failed. Could not get file info." : "Upload fejlede. Kunne ikke hente filinformation.", "Invalid directory." : "Ugyldig mappe.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Kan ikke fastslå datoen", "This operation is forbidden" : "Denne operation er forbudt", "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren", - "Error moving file." : "Fejl ved flytning af fil", - "Error moving file" : "Fejl ved flytning af fil", - "Error" : "Fejl", - "{new_name} already exists" : "{new_name} eksisterer allerede", - "Could not rename file" : "Kunne ikke omdøbe filen", - "Could not create file" : "Kunne ikke oprette fil", - "Could not create folder" : "Kunne ikke oprette mappe", - "Error deleting file." : "Fejl ved sletnign af fil.", "No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -75,8 +61,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Gjort til foretrukken", "Favorite" : "Foretrukken", - "Text file" : "Tekstfil", - "New text file.txt" : "Ny tekst file.txt", "Folder" : "Mappe", "New folder" : "Ny Mappe", "{newname} already exists" : "{newname} eksistere allerede", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Ændret af %2$s", "Deleted by %2$s" : "Slettet af %2$s", "Restored by %2$s" : "Gendannet af %2$s", - "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet", - "%s could not be renamed" : "%s kunne ikke omdøbes", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Maksimal upload-størrelse", "max. possible: " : "max. mulige: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med denne PHP-FPM værdi, kan der gå op til 5 minutter før virkningen indtræffer, efter at der gemmes.", "Save" : "Gem", - "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres herfra på grund af utilstrækkelige rettigheder.", "Settings" : "Indstillinger", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Brug denne adresse for at tilgå dine filer via WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", "Currently scanning" : "Skanning er i gang", "No favorites" : "Ingen foretrukne", - "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her" + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her", + "Text file" : "Tekstfil", + "New text file.txt" : "Ny tekst file.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index d0fe2575d3..3366382972 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -2,13 +2,6 @@ "Storage not available" : "Lagerplads er ikke tilgængeligt", "Storage invalid" : "Lagerplads er ugyldig", "Unknown error" : "Ukendt fejl", - "Could not move %s - File with this name already exists" : "Kunne ikke flytte %s - der findes allerede en fil med dette navn", - "Could not move %s" : "Kunne ikke flytte %s", - "Permission denied" : "Adgang nægtet", - "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.", - "The name %s is already used in the folder %s. Please choose a different name." : "Navnet %s er allerede i brug i mappen %s. Vælg venligst et andet navn.", - "Error when creating the file" : "Fejl ved oprettelse af fil", - "Error when creating the folder" : "Fejl ved oprettelse af mappen", "Unable to set upload directory." : "Ude af stand til at vælge upload mappe.", "Invalid Token" : "Ugyldig Token ", "No file was uploaded. Unknown error" : "Ingen fil blev uploadet. Ukendt fejl.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Manglende midlertidig mappe.", "Failed to write to disk" : "Fejl ved skrivning til disk.", "Not enough storage available" : "Der er ikke nok plads til rådlighed", + "The target folder has been moved or deleted." : "Mappen er blevet slettet eller fjernet.", "Upload failed. Could not find uploaded file" : "Upload fejlede. Kunne ikke finde den uploadede fil.", "Upload failed. Could not get file info." : "Upload fejlede. Kunne ikke hente filinformation.", "Invalid directory." : "Ugyldig mappe.", @@ -44,14 +38,6 @@ "Unable to determine date" : "Kan ikke fastslå datoen", "This operation is forbidden" : "Denne operation er forbudt", "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig, tjek venligst loggene eller kontakt administratoren", - "Error moving file." : "Fejl ved flytning af fil", - "Error moving file" : "Fejl ved flytning af fil", - "Error" : "Fejl", - "{new_name} already exists" : "{new_name} eksisterer allerede", - "Could not rename file" : "Kunne ikke omdøbe filen", - "Could not create file" : "Kunne ikke oprette fil", - "Could not create folder" : "Kunne ikke oprette mappe", - "Error deleting file." : "Fejl ved sletnign af fil.", "No entries in this folder match '{filter}'" : "Der er ingen poster i denne mappe, der matcher '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -73,8 +59,6 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Gjort til foretrukken", "Favorite" : "Foretrukken", - "Text file" : "Tekstfil", - "New text file.txt" : "Ny tekst file.txt", "Folder" : "Mappe", "New folder" : "Ny Mappe", "{newname} already exists" : "{newname} eksistere allerede", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Ændret af %2$s", "Deleted by %2$s" : "Slettet af %2$s", "Restored by %2$s" : "Gendannet af %2$s", - "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet", - "%s could not be renamed" : "%s kunne ikke omdøbes", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Maksimal upload-størrelse", "max. possible: " : "max. mulige: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med denne PHP-FPM værdi, kan der gå op til 5 minutter før virkningen indtræffer, efter at der gemmes.", "Save" : "Gem", - "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres herfra på grund af utilstrækkelige rettigheder.", "Settings" : "Indstillinger", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Brug denne adresse for at tilgå dine filer via WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", "Currently scanning" : "Skanning er i gang", "No favorites" : "Ingen foretrukne", - "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her" + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som foretrukne, vil blive vist her", + "Text file" : "Tekstfil", + "New text file.txt" : "Ny tekst file.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index b6f3711617..cec0cfda0c 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Speicher nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits", - "Could not move %s" : "Konnte %s nicht verschieben", - "Permission denied" : "Zugriff verweigert", - "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", - "The name %s is already used in the folder %s. Please choose a different name." : "Der Name %s wird bereits im Ordner %s benutzt. Bitte wähle einen anderen Namen.", - "Error when creating the file" : "Fehler beim Erstellen der Datei", - "Error when creating the folder" : "Fehler beim Erstellen des Ordners", "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" : "Ungültiger Token", "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" : "Nicht genug Speicher vorhanden.", + "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", "Upload failed. Could not find uploaded file" : "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.", "Upload failed. Could not get file info." : "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.", "Invalid directory." : "Ungültiges Verzeichnis.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoriten", "Home" : "Home", "Close" : "Schließen", + "Upload cancelled." : "Upload abgebrochen.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", - "Upload cancelled." : "Upload abgebrochen.", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", "Actions" : "Aktionen", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator", - "Error moving file." : "Fehler beim Verschieben der Datei.", - "Error moving file" : "Fehler beim Verschieben der Datei", - "Error" : "Fehler", - "{new_name} already exists" : "{new_name} existiert bereits", - "Could not rename file" : "Die Datei konnte nicht umbenannt werden", - "Could not create file" : "Die Datei konnte nicht erstellt werden", - "Could not create folder" : "Der Ordner konnte nicht erstellt werden", - "Error deleting file." : "Fehler beim Löschen der Datei.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} existiert bereits", - "Upload" : "Hochladen", - "Text file" : "Textdatei", - "New text file.txt" : "Neue Textdatei.txt", "Folder" : "Ordner", "New folder" : "Neuer Ordner", + "{newname} already exists" : "{newname} existiert bereits", + "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner wurde geändert", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Geändert von %2$s", "Deleted by %2$s" : "Gelöscht von %2$s", "Restored by %2$s" : "Wiederhergestellt von %2$s", - "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.", "Save" : "Speichern", - "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Benutze diese Adresse, um über WebDAV auf Deine Dateien zuzugreifen", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", - "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen" + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen", + "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index d0cfab4929..4e7a6e1bf0 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -2,13 +2,6 @@ "Storage not available" : "Speicher nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "Konnte %s nicht verschieben. Eine Datei mit diesem Namen existiert bereits", - "Could not move %s" : "Konnte %s nicht verschieben", - "Permission denied" : "Zugriff verweigert", - "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", - "The name %s is already used in the folder %s. Please choose a different name." : "Der Name %s wird bereits im Ordner %s benutzt. Bitte wähle einen anderen Namen.", - "Error when creating the file" : "Fehler beim Erstellen der Datei", - "Error when creating the folder" : "Fehler beim Erstellen des Ordners", "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" : "Ungültiger Token", "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" : "Nicht genug Speicher vorhanden.", + "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", "Upload failed. Could not find uploaded file" : "Hochladen fehlgeschlagen. Hochgeladene Datei konnte nicht gefunden werden.", "Upload failed. Could not get file info." : "Hochladen fehlgeschlagen. Dateiinformationen konnten nicht abgerufen werden.", "Invalid directory." : "Ungültiges Verzeichnis.", @@ -28,10 +22,10 @@ "Favorites" : "Favoriten", "Home" : "Home", "Close" : "Schließen", + "Upload cancelled." : "Upload abgebrochen.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", - "Upload cancelled." : "Upload abgebrochen.", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Du die Seite jetzt verlässt, wird der Upload abgebrochen.", "Actions" : "Aktionen", @@ -44,14 +38,6 @@ "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfe die Logdateien oder kontaktiere den Administrator", - "Error moving file." : "Fehler beim Verschieben der Datei.", - "Error moving file" : "Fehler beim Verschieben der Datei", - "Error" : "Fehler", - "{new_name} already exists" : "{new_name} existiert bereits", - "Could not rename file" : "Die Datei konnte nicht umbenannt werden", - "Could not create file" : "Die Datei konnte nicht erstellt werden", - "Could not create folder" : "Der Ordner konnte nicht erstellt werden", - "Error deleting file." : "Fehler beim Löschen der Datei.", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} existiert bereits", - "Upload" : "Hochladen", - "Text file" : "Textdatei", - "New text file.txt" : "Neue Textdatei.txt", "Folder" : "Ordner", "New folder" : "Neuer Ordner", + "{newname} already exists" : "{newname} existiert bereits", + "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner wurde geändert", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Geändert von %2$s", "Deleted by %2$s" : "Gelöscht von %2$s", "Restored by %2$s" : "Wiederhergestellt von %2$s", - "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Mit PHP-FPM kann es bis zu 5 Minuten dauern, bis die Einstellungen übernommen werden.", "Save" : "Speichern", - "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Benutze diese Adresse, um über WebDAV auf Deine Dateien zuzugreifen", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", - "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen" + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen", + "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js index 4f5296dc11..d7a77f9ee4 100644 --- a/apps/files/l10n/de_AT.js +++ b/apps/files/l10n/de_AT.js @@ -6,9 +6,8 @@ OC.L10N.register( "Download" : "Herunterladen", "Delete" : "Löschen", "Details" : "Details", - "Error" : "Fehler", - "Upload" : "Hochladen", "New folder" : "Neuer Ordner", + "Upload" : "Hochladen", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner hat sich geändert", "A file or folder has been deleted" : "Eine Datei oder ein Ordner wurde gelöscht", diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json index 91ec7e5e4e..7381a96665 100644 --- a/apps/files/l10n/de_AT.json +++ b/apps/files/l10n/de_AT.json @@ -4,9 +4,8 @@ "Download" : "Herunterladen", "Delete" : "Löschen", "Details" : "Details", - "Error" : "Fehler", - "Upload" : "Hochladen", "New folder" : "Neuer Ordner", + "Upload" : "Hochladen", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner hat sich geändert", "A file or folder has been deleted" : "Eine Datei oder ein Ordner wurde gelöscht", diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 9a75b417ac..d65d062c75 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Speicher nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", - "Could not move %s" : "Konnte %s nicht verschieben", - "Permission denied" : "Zugriff verweigert", - "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", - "The name %s is already used in the folder %s. Please choose a different name." : "Der Name %s wird bereits im Ordner %s benutzt. Bitte wählen Sie einen anderen Namen.", - "Error when creating the file" : "Fehler beim Erstellen der Datei", - "Error when creating the folder" : "Fehler beim Erstellen des Ordners", "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" : "Ungültiger Token", "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" : "Nicht genug Speicher vorhanden.", + "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", "Upload failed. Could not find uploaded file" : "Hochladen fehlgeschlagen. Die hochgeladene Datei konnte nicht gefunden werden.", "Upload failed. Could not get file info." : "Hochladen fehlgeschlagen. Die Dateiinformationen konnten nicht abgerufen werden.", "Invalid directory." : "Ungültiges Verzeichnis.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoriten", "Home" : "Zuhause", "Close" : "Schließen", + "Upload cancelled." : "Upload abgebrochen.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", - "Upload cancelled." : "Upload abgebrochen.", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", "Actions" : "Aktionen", @@ -46,14 +40,16 @@ OC.L10N.register( "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator", - "Error moving file." : "Fehler beim Verschieben der Datei.", - "Error moving file" : "Fehler beim Verschieben der Datei", - "Error" : "Fehler", - "{new_name} already exists" : "{new_name} existiert bereits", - "Could not rename file" : "Die Datei konnte nicht umbenannt werden", - "Could not create file" : "Die Datei konnte nicht erstellt werden", - "Could not create folder" : "Der Ordner konnte nicht erstellt werden", - "Error deleting file." : "Fehler beim Löschen der Datei.", + "Could not move \"{file}\", target exists" : "Die Datei konnte nicht verschoben werden \"{file}\", da die Datei im Zielordner bereits existiert", + "Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"", + "{newName} already exists" : "{newName} existiert bereits", + "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert", + "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"", + "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert", + "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert", + "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\".", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", @@ -71,12 +67,14 @@ OC.L10N.register( "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], + "Path" : "Pfad", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Upload" : "Hochladen", - "Text file" : "Textdatei", "Folder" : "Ordner", "New folder" : "Neuer Ordner", + "{newname} already exists" : "{newname} existiert bereits", + "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner wurde geändert", @@ -92,14 +90,13 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Sie haben %1$s wiederhergestellt", "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", - "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", + "Deleted by %2$s" : "Gelöscht durch %2$s", + "Restored by %2$s" : "Wiederhergestellt durch %2$s", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", - "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um über WebDAV auf Ihre Dateien zuzugreifen", @@ -113,6 +110,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", - "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen" + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen", + "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei file.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index 910ad9ac6a..79467fc764 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -2,13 +2,6 @@ "Storage not available" : "Speicher nicht verfügbar", "Storage invalid" : "Speicher ungültig", "Unknown error" : "Unbekannter Fehler", - "Could not move %s - File with this name already exists" : "%s konnte nicht verschoben werden. Eine Datei mit diesem Namen existiert bereits.", - "Could not move %s" : "Konnte %s nicht verschieben", - "Permission denied" : "Zugriff verweigert", - "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", - "The name %s is already used in the folder %s. Please choose a different name." : "Der Name %s wird bereits im Ordner %s benutzt. Bitte wählen Sie einen anderen Namen.", - "Error when creating the file" : "Fehler beim Erstellen der Datei", - "Error when creating the folder" : "Fehler beim Erstellen des Ordners", "Unable to set upload directory." : "Das Upload-Verzeichnis konnte nicht gesetzt werden.", "Invalid Token" : "Ungültiger Token", "No file was uploaded. Unknown error" : "Keine Datei hochgeladen. Unbekannter Fehler", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Kein temporärer Ordner vorhanden", "Failed to write to disk" : "Fehler beim Schreiben auf die Festplatte", "Not enough storage available" : "Nicht genug Speicher vorhanden.", + "The target folder has been moved or deleted." : "Der Zielordner wurde verschoben oder gelöscht.", "Upload failed. Could not find uploaded file" : "Hochladen fehlgeschlagen. Die hochgeladene Datei konnte nicht gefunden werden.", "Upload failed. Could not get file info." : "Hochladen fehlgeschlagen. Die Dateiinformationen konnten nicht abgerufen werden.", "Invalid directory." : "Ungültiges Verzeichnis.", @@ -28,10 +22,10 @@ "Favorites" : "Favoriten", "Home" : "Zuhause", "Close" : "Schließen", + "Upload cancelled." : "Upload abgebrochen.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", - "Upload cancelled." : "Upload abgebrochen.", "Could not get result from server." : "Ergebnis konnte nicht vom Server abgerufen werden.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dateiupload läuft. Wenn Sie die Seite jetzt verlassen, wird der Upload abgebrochen.", "Actions" : "Aktionen", @@ -44,14 +38,16 @@ "Unable to determine date" : "Datum konnte nicht ermittelt werden", "This operation is forbidden" : "Diese Operation ist nicht erlaubt", "This directory is unavailable, please check the logs or contact the administrator" : "Dieses Verzeichnis ist nicht verfügbar, bitte überprüfen Sie die Logdateien oder kontaktieren Sie den Administrator", - "Error moving file." : "Fehler beim Verschieben der Datei.", - "Error moving file" : "Fehler beim Verschieben der Datei", - "Error" : "Fehler", - "{new_name} already exists" : "{new_name} existiert bereits", - "Could not rename file" : "Die Datei konnte nicht umbenannt werden", - "Could not create file" : "Die Datei konnte nicht erstellt werden", - "Could not create folder" : "Der Ordner konnte nicht erstellt werden", - "Error deleting file." : "Fehler beim Löschen der Datei.", + "Could not move \"{file}\", target exists" : "Die Datei konnte nicht verschoben werden \"{file}\", da die Datei im Zielordner bereits existiert", + "Could not move \"{file}\"" : "Die Datei konnte nicht verschoben werden \"{file}\"", + "{newName} already exists" : "{newName} existiert bereits", + "Could not rename \"{fileName}\", it does not exist any more" : "Die Datei konnte nicht umbennant werden \"{fileName}\", da die Datei nicht mehr existiert", + "Could not rename \"{fileName}\"" : "Die Datei konnte nicht umbenannt werden \"{fileName}\"", + "Could not create file \"{file}\"" : "Die Datei konnte nicht erstellt werden \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Die Datei konnte nicht erstellt werden \"{file}\", da diese bereits existiert", + "Could not create folder \"{dir}\"" : "Der Ordner konnte nicht erstellt werden \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Der Ordner konnte nicht erstellt werden \"{dir}\", da dieser bereits existiert", + "Error deleting file \"{fileName}\"." : "Fehler beim löschen der Datei \"{fileName}\".", "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", @@ -69,12 +65,14 @@ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Der Speicher von {owner} ist beinahe voll ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Ihr Speicher ist fast voll ({usedSpacePercent}%)", "_matches '{filter}'_::_match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], + "Path" : "Pfad", + "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorisiert", "Favorite" : "Favorit", - "Upload" : "Hochladen", - "Text file" : "Textdatei", "Folder" : "Ordner", "New folder" : "Neuer Ordner", + "{newname} already exists" : "{newname} existiert bereits", + "Upload" : "Hochladen", "An error occurred while trying to update the tags" : "Es ist ein Fehler beim Aktualisieren der Tags aufgetreten", "A new file or folder has been created" : "Eine neue Datei oder ein neuer Ordner wurde erstellt", "A file or folder has been changed" : "Eine Datei oder ein Ordner wurde geändert", @@ -90,14 +88,13 @@ "%2$s deleted %1$s" : "%2$s hat %1$s gelöscht", "You restored %1$s" : "Sie haben %1$s wiederhergestellt", "%2$s restored %1$s" : "%2$s wiederhergestellt %1$s", - "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", - "%s could not be renamed" : "%s konnte nicht umbenannt werden", + "Deleted by %2$s" : "Gelöscht durch %2$s", + "Restored by %2$s" : "Wiederhergestellt durch %2$s", "Upload (max. %s)" : "Hochladen (max. %s)", "File handling" : "Dateibehandlung", "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", - "Can not be edited from here due to insufficient permissions." : "Aufgrund unzureichender Berechtigungen kann dies nicht von hier bearbeitet werden.", "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Benutzen Sie diese Adresse, um über WebDAV auf Ihre Dateien zuzugreifen", @@ -111,6 +108,8 @@ "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", "Currently scanning" : "Durchsuchen läuft", "No favorites" : "Keine Favoriten", - "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen" + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen", + "Text file" : "Textdatei", + "New text file.txt" : "Neue Textdatei file.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index 113f10266a..f60e842199 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Μη διαθέσιμος αποθηκευτικός χώρος", "Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος", "Unknown error" : "Άγνωστο σφάλμα", - "Could not move %s - File with this name already exists" : "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα", - "Could not move %s" : "Αδυναμία μετακίνησης του %s", - "Permission denied" : "Η πρόσβαση απορρίφθηκε", - "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.", - "The name %s is already used in the folder %s. Please choose a different name." : "Το όνομα %s χρησιμοποιείτε ήδη στον φάκελο %s. Παρακαλώ επιλέξτε ένα άλλο όνομα.", - "Error when creating the file" : "Σφάλμα κατά τη δημιουργία του αρχείου", - "Error when creating the folder" : "Σφάλμα κατά τη δημιουργία του φακέλου", "Unable to set upload directory." : "Αδυναμία ορισμού καταλόγου αποστολής.", "Invalid Token" : "Μη έγκυρο Token", "No file was uploaded. Unknown error" : "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Λείπει ο προσωρινός φάκελος", "Failed to write to disk" : "Αποτυχία εγγραφής στο δίσκο", "Not enough storage available" : "Ο διαθέσιμος αποθηκευτικός χώρος δεν επαρκεί", + "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.", "Upload failed. Could not find uploaded file" : "Η φόρτωση απέτυχε. Αδυναμία εύρεσης αρχείου προς φόρτωση.", "Upload failed. Could not get file info." : "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.", "Invalid directory." : "Μη έγκυρος φάκελος.", @@ -46,14 +40,13 @@ OC.L10N.register( "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ", "This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται", "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή", - "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.", - "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου", - "Error" : "Σφάλμα", - "{new_name} already exists" : "το {new_name} υπάρχει ήδη", - "Could not rename file" : "Αδυναμία μετονομασίας αρχείου", - "Could not create file" : "Αδυναμία δημιουργίας αρχείου", - "Could not create folder" : "Αδυναμία δημιουργίας φακέλου", - "Error deleting file." : "Σφάλμα κατά τη διαγραφή του αρχείου.", + "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα", + "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"", + "{newName} already exists" : "Το {newname} υπάρχει ήδη", + "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"", + "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του \"{file}\"", + "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"", + "Error deleting file \"{fileName}\"." : "Αδυναμία διαγραφής του \"{fileName}\".", "No entries in this folder match '{filter}'" : "Δεν ταιριάζουν καταχωρήσεις σε αυτόν το φάκελο '{filter}'", "Name" : "Όνομα", "Size" : "Μέγεθος", @@ -75,8 +68,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Προτιμώμενα", "Favorite" : "Αγαπημένο", - "Text file" : "Αρχείο κειμένου", - "New text file.txt" : "Νέο αρχείο κειμένου.txt", "Folder" : "Φάκελος", "New folder" : "Νέος φάκελος", "{newname} already exists" : "το {newname} υπάρχει ήδη", @@ -99,15 +90,13 @@ OC.L10N.register( "Changed by %2$s" : "Άλλαξε από το χρήστη %2$s", "Deleted by %2$s" : "Διαγράφηκε από το χρήστη %2$s", "Restored by %2$s" : "Επαναφορά από το χρήστη %2$s", - "%s could not be renamed as it has been deleted" : "Το %s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", - "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", "File handling" : "Διαχείριση αρχείων", "Maximum upload size" : "Μέγιστο μέγεθος αποστολής", "max. possible: " : "μέγιστο δυνατό:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Με την PHP-FPM αυτή η τιμή μπορεί να χρειαστεί μέχρι και 5 λεπτά για να ενεργοποιηθεί μετά την αποθήκευση.", "Save" : "Αποθήκευση", - "Can not be edited from here due to insufficient permissions." : "Δεν είναι δυνατή η επεξεργασία λόγω μη επαρκών δικαιωμάτων", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Με PHP-FPM μπορεί να χρειαστούν μέχρι και 5 λεπτά για να ενεργοποιηθούν οι αλλαγές.", + "Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.", "Settings" : "Ρυθμίσεις", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε πρόσβαση στα αρχεία σας μέσω WebDAV", @@ -121,6 +110,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", "Currently scanning" : "Σάρωση σε εξέλιξη", "No favorites" : "Δεν υπάρχουν αγαπημένα", - "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ " + "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ", + "Text file" : "Αρχείο κειμένου", + "New text file.txt" : "Νέο αρχείο κειμένου.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index baaea21511..15cb56c87d 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -2,13 +2,6 @@ "Storage not available" : "Μη διαθέσιμος αποθηκευτικός χώρος", "Storage invalid" : "Μη έγκυρος αποθηκευτικός χώρος", "Unknown error" : "Άγνωστο σφάλμα", - "Could not move %s - File with this name already exists" : "Αδυναμία μετακίνησης του %s - υπάρχει ήδη αρχείο με αυτό το όνομα", - "Could not move %s" : "Αδυναμία μετακίνησης του %s", - "Permission denied" : "Η πρόσβαση απορρίφθηκε", - "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.", - "The name %s is already used in the folder %s. Please choose a different name." : "Το όνομα %s χρησιμοποιείτε ήδη στον φάκελο %s. Παρακαλώ επιλέξτε ένα άλλο όνομα.", - "Error when creating the file" : "Σφάλμα κατά τη δημιουργία του αρχείου", - "Error when creating the folder" : "Σφάλμα κατά τη δημιουργία του φακέλου", "Unable to set upload directory." : "Αδυναμία ορισμού καταλόγου αποστολής.", "Invalid Token" : "Μη έγκυρο Token", "No file was uploaded. Unknown error" : "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Λείπει ο προσωρινός φάκελος", "Failed to write to disk" : "Αποτυχία εγγραφής στο δίσκο", "Not enough storage available" : "Ο διαθέσιμος αποθηκευτικός χώρος δεν επαρκεί", + "The target folder has been moved or deleted." : "Ο φάκελος προορισμού έχει μετακινηθεί ή διαγραφεί.", "Upload failed. Could not find uploaded file" : "Η φόρτωση απέτυχε. Αδυναμία εύρεσης αρχείου προς φόρτωση.", "Upload failed. Could not get file info." : "Η φόρτωση απέτυχε. Αδυναμία λήψης πληροφοριών αρχείων.", "Invalid directory." : "Μη έγκυρος φάκελος.", @@ -44,14 +38,13 @@ "Unable to determine date" : "Αδυναμία προσδιορισμού ημερομηνίας ", "This operation is forbidden" : "Αυτή η ενέργεια δεν επιτρέπεται", "This directory is unavailable, please check the logs or contact the administrator" : "Ο κατάλογος δεν είναι διαθέσιμος, παρακαλώ ελέγξτε τα αρχεία καταγραφής ή επικοινωνήστε με το διαχειριστή", - "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.", - "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου", - "Error" : "Σφάλμα", - "{new_name} already exists" : "το {new_name} υπάρχει ήδη", - "Could not rename file" : "Αδυναμία μετονομασίας αρχείου", - "Could not create file" : "Αδυναμία δημιουργίας αρχείου", - "Could not create folder" : "Αδυναμία δημιουργίας φακέλου", - "Error deleting file." : "Σφάλμα κατά τη διαγραφή του αρχείου.", + "Could not move \"{file}\", target exists" : "Αδυναμία μετακίνησης του \"{file}\", υπάρχει ήδη αρχείο με αυτό το όνομα", + "Could not move \"{file}\"" : "Αδυναμία μετακίνησης του \"{file}\"", + "{newName} already exists" : "Το {newname} υπάρχει ήδη", + "Could not rename \"{fileName}\"" : "Αδυναμία μετονομασίας του \"{fileName}\"", + "Could not create file \"{file}\"" : "Αδυναμία δημιουργίας του \"{file}\"", + "Could not create folder \"{dir}\"" : "Αδυναμία δημιουργίας του φακέλου \"{dir}\"", + "Error deleting file \"{fileName}\"." : "Αδυναμία διαγραφής του \"{fileName}\".", "No entries in this folder match '{filter}'" : "Δεν ταιριάζουν καταχωρήσεις σε αυτόν το φάκελο '{filter}'", "Name" : "Όνομα", "Size" : "Μέγεθος", @@ -73,8 +66,6 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Προτιμώμενα", "Favorite" : "Αγαπημένο", - "Text file" : "Αρχείο κειμένου", - "New text file.txt" : "Νέο αρχείο κειμένου.txt", "Folder" : "Φάκελος", "New folder" : "Νέος φάκελος", "{newname} already exists" : "το {newname} υπάρχει ήδη", @@ -97,15 +88,13 @@ "Changed by %2$s" : "Άλλαξε από το χρήστη %2$s", "Deleted by %2$s" : "Διαγράφηκε από το χρήστη %2$s", "Restored by %2$s" : "Επαναφορά από το χρήστη %2$s", - "%s could not be renamed as it has been deleted" : "Το %s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", - "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", "File handling" : "Διαχείριση αρχείων", "Maximum upload size" : "Μέγιστο μέγεθος αποστολής", "max. possible: " : "μέγιστο δυνατό:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Με την PHP-FPM αυτή η τιμή μπορεί να χρειαστεί μέχρι και 5 λεπτά για να ενεργοποιηθεί μετά την αποθήκευση.", "Save" : "Αποθήκευση", - "Can not be edited from here due to insufficient permissions." : "Δεν είναι δυνατή η επεξεργασία λόγω μη επαρκών δικαιωμάτων", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Με PHP-FPM μπορεί να χρειαστούν μέχρι και 5 λεπτά για να ενεργοποιηθούν οι αλλαγές.", + "Missing permissions to edit from here." : "Δεν υπάρχουν τα απαραίτητα δικαιώματα για να γίνει τροποποιήση σε αυτό το σημείο.", "Settings" : "Ρυθμίσεις", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε πρόσβαση στα αρχεία σας μέσω WebDAV", @@ -119,6 +108,8 @@ "Files are being scanned, please wait." : "Τα αρχεία σαρώνονται, παρακαλώ περιμένετε.", "Currently scanning" : "Σάρωση σε εξέλιξη", "No favorites" : "Δεν υπάρχουν αγαπημένα", - "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ " + "Files and folders you mark as favorite will show up here" : "Τα αρχεία και οι φάκελοι που σημειώνονται ως αγαπημένα θα εμφανιστούν εδώ ", + "Text file" : "Αρχείο κειμένου", + "New text file.txt" : "Νέο αρχείο κειμένου.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index 5109eb0743..a190c45e84 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Storage not available", "Storage invalid" : "Storage invalid", "Unknown error" : "Unknown error", - "Could not move %s - File with this name already exists" : "Could not move %s - File with this name already exists", - "Could not move %s" : "Could not move %s", - "Permission denied" : "Permission denied", - "The target folder has been moved or deleted." : "The target folder has been moved or deleted.", - "The name %s is already used in the folder %s. Please choose a different name." : "The name %s is already used in the folder %s. Please choose a different name.", - "Error when creating the file" : "Error when creating the file", - "Error when creating the folder" : "Error when creating the folder", "Unable to set upload directory." : "Unable to set upload directory.", "Invalid Token" : "Invalid Token", "No file was uploaded. Unknown error" : "No file was uploaded. Unknown error", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Missing a temporary folder", "Failed to write to disk" : "Failed to write to disk", "Not enough storage available" : "Not enough storage available", + "The target folder has been moved or deleted." : "The target folder has been moved or deleted.", "Upload failed. Could not find uploaded file" : "Upload failed. Could not find uploaded file", "Upload failed. Could not get file info." : "Upload failed. Could not get file info.", "Invalid directory." : "Invalid directory.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favourites", "Home" : "Home", "Close" : "Close", + "Upload cancelled." : "Upload cancelled.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total file size {size1} exceeds upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left", - "Upload cancelled." : "Upload cancelled.", "Could not get result from server." : "Could not get result from server.", "File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.", "Actions" : "Actions", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Select", "Pending" : "Pending", "Unable to determine date" : "Unable to determine date", - "Error moving file." : "Error moving file.", - "Error moving file" : "Error moving file", - "Error" : "Error", - "{new_name} already exists" : "{new_name} already exists", - "Could not rename file" : "Could not rename file", - "Could not create file" : "Could not create file", - "Could not create folder" : "Could not create folder", - "Error deleting file." : "Error deleting file.", "No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'", "Name" : "Name", "Size" : "Size", @@ -69,10 +55,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"], "Favorited" : "Favourited", "Favorite" : "Favourite", - "Upload" : "Upload", - "Text file" : "Text file", "Folder" : "Folder", "New folder" : "New folder", + "Upload" : "Upload", "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags", "A new file or folder has been created" : "A new file or folder has been created", "A file or folder has been changed" : "A file or folder has been changed", @@ -88,14 +73,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s deleted %1$s", "You restored %1$s" : "You restored %1$s", "%2$s restored %1$s" : "%2$s restored %1$s", - "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted", - "%s could not be renamed" : "%s could not be renamed", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "File handling", "Maximum upload size" : "Maximum upload size", "max. possible: " : "max. possible: ", "Save" : "Save", - "Can not be edited from here due to insufficient permissions." : "Can not be edited from here due to insufficient permissions.", "Settings" : "Settings", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV", @@ -109,6 +91,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Files are being scanned, please wait.", "Currently scanning" : "Currently scanning", "No favorites" : "No favourites", - "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here" + "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here", + "Text file" : "Text file" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index 1f9acabeda..ca8a60ec73 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -2,13 +2,6 @@ "Storage not available" : "Storage not available", "Storage invalid" : "Storage invalid", "Unknown error" : "Unknown error", - "Could not move %s - File with this name already exists" : "Could not move %s - File with this name already exists", - "Could not move %s" : "Could not move %s", - "Permission denied" : "Permission denied", - "The target folder has been moved or deleted." : "The target folder has been moved or deleted.", - "The name %s is already used in the folder %s. Please choose a different name." : "The name %s is already used in the folder %s. Please choose a different name.", - "Error when creating the file" : "Error when creating the file", - "Error when creating the folder" : "Error when creating the folder", "Unable to set upload directory." : "Unable to set upload directory.", "Invalid Token" : "Invalid Token", "No file was uploaded. Unknown error" : "No file was uploaded. Unknown error", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Missing a temporary folder", "Failed to write to disk" : "Failed to write to disk", "Not enough storage available" : "Not enough storage available", + "The target folder has been moved or deleted." : "The target folder has been moved or deleted.", "Upload failed. Could not find uploaded file" : "Upload failed. Could not find uploaded file", "Upload failed. Could not get file info." : "Upload failed. Could not get file info.", "Invalid directory." : "Invalid directory.", @@ -28,10 +22,10 @@ "Favorites" : "Favourites", "Home" : "Home", "Close" : "Close", + "Upload cancelled." : "Upload cancelled.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total file size {size1} exceeds upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left", - "Upload cancelled." : "Upload cancelled.", "Could not get result from server." : "Could not get result from server.", "File upload is in progress. Leaving the page now will cancel the upload." : "File upload is in progress. Leaving the page now will cancel the upload.", "Actions" : "Actions", @@ -42,14 +36,6 @@ "Select" : "Select", "Pending" : "Pending", "Unable to determine date" : "Unable to determine date", - "Error moving file." : "Error moving file.", - "Error moving file" : "Error moving file", - "Error" : "Error", - "{new_name} already exists" : "{new_name} already exists", - "Could not rename file" : "Could not rename file", - "Could not create file" : "Could not create file", - "Could not create folder" : "Could not create folder", - "Error deleting file." : "Error deleting file.", "No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'", "Name" : "Name", "Size" : "Size", @@ -67,10 +53,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["matches '{filter}'","match '{filter}'"], "Favorited" : "Favourited", "Favorite" : "Favourite", - "Upload" : "Upload", - "Text file" : "Text file", "Folder" : "Folder", "New folder" : "New folder", + "Upload" : "Upload", "An error occurred while trying to update the tags" : "An error occurred whilst trying to update the tags", "A new file or folder has been created" : "A new file or folder has been created", "A file or folder has been changed" : "A file or folder has been changed", @@ -86,14 +71,11 @@ "%2$s deleted %1$s" : "%2$s deleted %1$s", "You restored %1$s" : "You restored %1$s", "%2$s restored %1$s" : "%2$s restored %1$s", - "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted", - "%s could not be renamed" : "%s could not be renamed", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "File handling", "Maximum upload size" : "Maximum upload size", "max. possible: " : "max. possible: ", "Save" : "Save", - "Can not be edited from here due to insufficient permissions." : "Can not be edited from here due to insufficient permissions.", "Settings" : "Settings", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use this address to access your Files via WebDAV", @@ -107,6 +89,7 @@ "Files are being scanned, please wait." : "Files are being scanned, please wait.", "Currently scanning" : "Currently scanning", "No favorites" : "No favourites", - "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here" + "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here", + "Text file" : "Text file" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index b881c3d9d0..dbdd042291 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -2,11 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "Nekonata eraro", - "Could not move %s - File with this name already exists" : "Ne eblis movi %s: dosiero kun ĉi tiu nomo jam ekzistas", - "Could not move %s" : "Ne eblis movi %s", - "The name %s is already used in the folder %s. Please choose a different name." : "La nomo %s jam uziĝas en la dosierujo %s. Bonvolu elekti malsaman nomon.", - "Error when creating the file" : "Eraris la kreo de la dosiero", - "Error when creating the folder" : "Eraris la kreo de la dosierujo", "Unable to set upload directory." : "Ne povis agordiĝi la alŝuta dosierujo.", "No file was uploaded. Unknown error" : "Neniu dosiero alŝutiĝis. Nekonata eraro.", "There is no error, the file uploaded with success" : "Ne estas eraro, la dosiero alŝutiĝis sukcese.", @@ -25,8 +20,8 @@ OC.L10N.register( "Favorites" : "Favoratoj", "Home" : "Hejmo", "Close" : "Fermi", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Upload cancelled." : "La alŝuto nuliĝis.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Could not get result from server." : "Ne povis ekhaviĝi rezulto el la servilo.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", "Actions" : "Agoj", @@ -36,12 +31,6 @@ OC.L10N.register( "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", - "Error moving file" : "Eraris movo de dosiero", - "Error" : "Eraro", - "{new_name} already exists" : "{new_name} jam ekzistas", - "Could not rename file" : "Ne povis alinomiĝi dosiero", - "Could not create file" : "Ne povis kreiĝi dosiero", - "Could not create folder" : "Ne povis kreiĝi dosierujo", "Name" : "Nomo", "Size" : "Grando", "Modified" : "Modifita", @@ -55,10 +44,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!", "Your storage is almost full ({usedSpacePercent}%)" : "Via memoro preskaŭ plenas ({usedSpacePercent}%)", "Favorite" : "Favorato", - "Upload" : "Alŝuti", - "Text file" : "Tekstodosiero", "Folder" : "Dosierujo", "New folder" : "Nova dosierujo", + "Upload" : "Alŝuti", "You created %1$s" : "Vi kreis %1$s", "%2$s created %1$s" : "%2$s kreis %1$s", "%1$s was created in a public folder" : "%1$s kreiĝis en publika dosierujo", @@ -66,8 +54,6 @@ OC.L10N.register( "%2$s changed %1$s" : "%2$s ŝanĝis %1$s", "You deleted %1$s" : "Vi forigis %1$s", "%2$s deleted %1$s" : "%2$s forigis %1$s", - "%s could not be renamed as it has been deleted" : "%s ne povis alinomiĝi ĉar ĝi forigitis", - "%s could not be renamed" : "%s ne povis alinomiĝi", "Upload (max. %s)" : "Alŝuti (maks. %s)", "File handling" : "Dosieradministro", "Maximum upload size" : "Maksimuma alŝutogrando", @@ -81,6 +67,7 @@ OC.L10N.register( "Select all" : "Elekti ĉion", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", - "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi." + "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.", + "Text file" : "Tekstodosiero" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index 93f3bdbede..b858ccece4 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -1,10 +1,5 @@ { "translations": { "Unknown error" : "Nekonata eraro", - "Could not move %s - File with this name already exists" : "Ne eblis movi %s: dosiero kun ĉi tiu nomo jam ekzistas", - "Could not move %s" : "Ne eblis movi %s", - "The name %s is already used in the folder %s. Please choose a different name." : "La nomo %s jam uziĝas en la dosierujo %s. Bonvolu elekti malsaman nomon.", - "Error when creating the file" : "Eraris la kreo de la dosiero", - "Error when creating the folder" : "Eraris la kreo de la dosierujo", "Unable to set upload directory." : "Ne povis agordiĝi la alŝuta dosierujo.", "No file was uploaded. Unknown error" : "Neniu dosiero alŝutiĝis. Nekonata eraro.", "There is no error, the file uploaded with success" : "Ne estas eraro, la dosiero alŝutiĝis sukcese.", @@ -23,8 +18,8 @@ "Favorites" : "Favoratoj", "Home" : "Hejmo", "Close" : "Fermi", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Upload cancelled." : "La alŝuto nuliĝis.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Could not get result from server." : "Ne povis ekhaviĝi rezulto el la servilo.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dosieralŝuto plenumiĝas. Lasi la paĝon nun nuligus la alŝuton.", "Actions" : "Agoj", @@ -34,12 +29,6 @@ "Details" : "Detaloj", "Select" : "Elekti", "Pending" : "Traktotaj", - "Error moving file" : "Eraris movo de dosiero", - "Error" : "Eraro", - "{new_name} already exists" : "{new_name} jam ekzistas", - "Could not rename file" : "Ne povis alinomiĝi dosiero", - "Could not create file" : "Ne povis kreiĝi dosiero", - "Could not create folder" : "Ne povis kreiĝi dosierujo", "Name" : "Nomo", "Size" : "Grando", "Modified" : "Modifita", @@ -53,10 +42,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!", "Your storage is almost full ({usedSpacePercent}%)" : "Via memoro preskaŭ plenas ({usedSpacePercent}%)", "Favorite" : "Favorato", - "Upload" : "Alŝuti", - "Text file" : "Tekstodosiero", "Folder" : "Dosierujo", "New folder" : "Nova dosierujo", + "Upload" : "Alŝuti", "You created %1$s" : "Vi kreis %1$s", "%2$s created %1$s" : "%2$s kreis %1$s", "%1$s was created in a public folder" : "%1$s kreiĝis en publika dosierujo", @@ -64,8 +52,6 @@ "%2$s changed %1$s" : "%2$s ŝanĝis %1$s", "You deleted %1$s" : "Vi forigis %1$s", "%2$s deleted %1$s" : "%2$s forigis %1$s", - "%s could not be renamed as it has been deleted" : "%s ne povis alinomiĝi ĉar ĝi forigitis", - "%s could not be renamed" : "%s ne povis alinomiĝi", "Upload (max. %s)" : "Alŝuti (maks. %s)", "File handling" : "Dosieradministro", "Maximum upload size" : "Maksimuma alŝutogrando", @@ -79,6 +65,7 @@ "Select all" : "Elekti ĉion", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", - "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi." + "Files are being scanned, please wait." : "Dosieroj estas skanataj, bonvolu atendi.", + "Text file" : "Tekstodosiero" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 15062395e4..dd8759c3f0 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Almacenamiento no disponible", "Storage invalid" : "Almacenamiento inválido", "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", - "Could not move %s" : "No se pudo mover %s", - "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear la carpeta.", "Unable to set upload directory." : "Incapaz de crear directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Falta la carpeta temporal", "Failed to write to disk" : "Falló al escribir al disco", "Not enough storage available" : "No hay suficiente espacio disponible", + "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", "Upload failed. Could not find uploaded file" : "Actualización fallida. No se pudo encontrar el archivo subido", "Upload failed. Could not get file info." : "Actualización fallida. No se pudo obtener información del archivo.", "Invalid directory." : "Directorio inválido.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", + "Upload cancelled." : "Subida cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", - "Upload cancelled." : "Subida cancelada.", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "No se pudo determinar la fecha", "This operation is forbidden" : "Esta operación está prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador", - "Error moving file." : "Error al mover el archivo.", - "Error moving file" : "Error moviendo archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear la carpeta", - "Error deleting file." : "Error al borrar el archivo", "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", "Name" : "Nombre", "Size" : "Tamaño", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Agregado a Favoritos", "Favorite" : "Favorito", - "{newname} already exists" : "{new_name} ya existe", - "Upload" : "Subir", - "Text file" : "Archivo de texto", - "New text file.txt" : "Nuevo archivo de texto.txt", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "{newname} already exists" : "{new_name} ya existe", + "Upload" : "Subir", "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas", "A new file or folder has been created" : "Se ha creado un nuevo archivo o carpeta", "A file or folder has been changed" : "Se ha modificado un archivo o carpeta", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Cambiado por %2$s", "Deleted by %2$s" : "Eliminado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", - "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM este valor se puede demorar hasta 5 minutos para tener efecto después de guardar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "No se puede editar desde aquí por permisos insuficientes.", "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use esta URL para acceder via WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", "Currently scanning" : "Escaneando en este momento", "No favorites" : "No hay favoritos", - "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos" + "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", + "Text file" : "Archivo de texto", + "New text file.txt" : "Nuevo archivo de texto.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 4ce106ea4b..de4005ae51 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -2,13 +2,6 @@ "Storage not available" : "Almacenamiento no disponible", "Storage invalid" : "Almacenamiento inválido", "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", - "Could not move %s" : "No se pudo mover %s", - "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear la carpeta.", "Unable to set upload directory." : "Incapaz de crear directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Falta la carpeta temporal", "Failed to write to disk" : "Falló al escribir al disco", "Not enough storage available" : "No hay suficiente espacio disponible", + "The target folder has been moved or deleted." : "La carpeta de destino fue movida o eliminada.", "Upload failed. Could not find uploaded file" : "Actualización fallida. No se pudo encontrar el archivo subido", "Upload failed. Could not get file info." : "Actualización fallida. No se pudo obtener información del archivo.", "Invalid directory." : "Directorio inválido.", @@ -28,10 +22,10 @@ "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", + "Upload cancelled." : "Subida cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", - "Upload cancelled." : "Subida cancelada.", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", @@ -44,14 +38,6 @@ "Unable to determine date" : "No se pudo determinar la fecha", "This operation is forbidden" : "Esta operación está prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta carpeta no está disponible, por favor verifique los registros o contáctese con el administrador", - "Error moving file." : "Error al mover el archivo.", - "Error moving file" : "Error moviendo archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear la carpeta", - "Error deleting file." : "Error al borrar el archivo", "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", "Name" : "Nombre", "Size" : "Tamaño", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Agregado a Favoritos", "Favorite" : "Favorito", - "{newname} already exists" : "{new_name} ya existe", - "Upload" : "Subir", - "Text file" : "Archivo de texto", - "New text file.txt" : "Nuevo archivo de texto.txt", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "{newname} already exists" : "{new_name} ya existe", + "Upload" : "Subir", "An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas", "A new file or folder has been created" : "Se ha creado un nuevo archivo o carpeta", "A file or folder has been changed" : "Se ha modificado un archivo o carpeta", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Cambiado por %2$s", "Deleted by %2$s" : "Eliminado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", - "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM este valor se puede demorar hasta 5 minutos para tener efecto después de guardar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "No se puede editar desde aquí por permisos insuficientes.", "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use esta URL para acceder via WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Los archivos se están escaneando, por favor espere.", "Currently scanning" : "Escaneando en este momento", "No favorites" : "No hay favoritos", - "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos" + "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos", + "Text file" : "Archivo de texto", + "New text file.txt" : "Nuevo archivo de texto.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js index f81f0e6bed..6c6b0d4985 100644 --- a/apps/files/l10n/es_AR.js +++ b/apps/files/l10n/es_AR.js @@ -1,12 +1,9 @@ OC.L10N.register( "files", { + "Storage not available" : "Almacenamiento no disponible", + "Storage invalid" : "Almacenamiento invalido", "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Un archivo con este nombre ya existe", - "Could not move %s" : "No se pudo mover %s ", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s está en uso en el directorio %s. Por favor elija un otro nombre.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear el directorio", "Unable to set upload directory." : "No fue posible crear el directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "El archivo no fue subido. Error desconocido", @@ -18,15 +15,19 @@ OC.L10N.register( "Missing a temporary folder" : "Falta un directorio temporal", "Failed to write to disk" : "Error al escribir en el disco", "Not enough storage available" : "No hay suficiente almacenamiento", + "The target folder has been moved or deleted." : "La carpeta destino fue movida o borrada.", "Upload failed. Could not find uploaded file" : "Falló la carga. No se pudo encontrar el archivo subido.", "Upload failed. Could not get file info." : "Falló la carga. No se pudo obtener la información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "All files" : "Todos los archivos", "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", "Upload cancelled." : "La subida fue cancelada", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", + "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", "Could not get result from server." : "No se pudo obtener resultados del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.", "Actions" : "Acciones", @@ -36,13 +37,7 @@ OC.L10N.register( "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", - "Error moving file" : "Error moviendo el archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear el directorio", - "Error deleting file." : "Error al borrar el archivo.", + "Unable to determine date" : "No fue posible determinar la fecha", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -56,10 +51,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "El almacenamiento está lleno, los archivos no se pueden seguir actualizando ni sincronizando", "Your storage is almost full ({usedSpacePercent}%)" : "El almacenamiento está casi lleno ({usedSpacePercent}%)", "Favorite" : "Favorito", - "Upload" : "Subir", - "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva Carpeta", + "Upload" : "Subir", "A new file or folder has been created" : "Un archivo o carpeta ha sido creado", "A file or folder has been changed" : "Un archivo o carpeta ha sido modificado", "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", @@ -69,7 +63,6 @@ OC.L10N.register( "%2$s changed %1$s" : "%2$s modificó %1$s", "You deleted %1$s" : "Eliminaste %1$s", "%2$s deleted %1$s" : "%2$s eliminó %1$s", - "%s could not be renamed" : "No se pudo renombrar %s", "File handling" : "Tratamiento de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", @@ -80,6 +73,7 @@ OC.L10N.register( "Cancel upload" : "Cancelar subida", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", - "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá." + "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.", + "Text file" : "Archivo de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json index a9d5c8ece3..ad492b4048 100644 --- a/apps/files/l10n/es_AR.json +++ b/apps/files/l10n/es_AR.json @@ -1,10 +1,7 @@ { "translations": { + "Storage not available" : "Almacenamiento no disponible", + "Storage invalid" : "Almacenamiento invalido", "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Un archivo con este nombre ya existe", - "Could not move %s" : "No se pudo mover %s ", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s está en uso en el directorio %s. Por favor elija un otro nombre.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear el directorio", "Unable to set upload directory." : "No fue posible crear el directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "El archivo no fue subido. Error desconocido", @@ -16,15 +13,19 @@ "Missing a temporary folder" : "Falta un directorio temporal", "Failed to write to disk" : "Error al escribir en el disco", "Not enough storage available" : "No hay suficiente almacenamiento", + "The target folder has been moved or deleted." : "La carpeta destino fue movida o borrada.", "Upload failed. Could not find uploaded file" : "Falló la carga. No se pudo encontrar el archivo subido.", "Upload failed. Could not get file info." : "Falló la carga. No se pudo obtener la información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "All files" : "Todos los archivos", "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", "Upload cancelled." : "La subida fue cancelada", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", + "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", "Could not get result from server." : "No se pudo obtener resultados del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si salís de la página ahora, la subida se cancelará.", "Actions" : "Acciones", @@ -34,13 +35,7 @@ "Details" : "Detalles", "Select" : "Seleccionar", "Pending" : "Pendientes", - "Error moving file" : "Error moviendo el archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear el directorio", - "Error deleting file." : "Error al borrar el archivo.", + "Unable to determine date" : "No fue posible determinar la fecha", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -54,10 +49,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "El almacenamiento está lleno, los archivos no se pueden seguir actualizando ni sincronizando", "Your storage is almost full ({usedSpacePercent}%)" : "El almacenamiento está casi lleno ({usedSpacePercent}%)", "Favorite" : "Favorito", - "Upload" : "Subir", - "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva Carpeta", + "Upload" : "Subir", "A new file or folder has been created" : "Un archivo o carpeta ha sido creado", "A file or folder has been changed" : "Un archivo o carpeta ha sido modificado", "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", @@ -67,7 +61,6 @@ "%2$s changed %1$s" : "%2$s modificó %1$s", "You deleted %1$s" : "Eliminaste %1$s", "%2$s deleted %1$s" : "%2$s eliminó %1$s", - "%s could not be renamed" : "No se pudo renombrar %s", "File handling" : "Tratamiento de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", @@ -78,6 +71,7 @@ "Cancel upload" : "Cancelar subida", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", - "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá." + "Files are being scanned, please wait." : "Se están escaneando los archivos, por favor esperá.", + "Text file" : "Archivo de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js index 9b0929f50a..7b67ca39ac 100644 --- a/apps/files/l10n/es_CL.js +++ b/apps/files/l10n/es_CL.js @@ -6,9 +6,8 @@ OC.L10N.register( "Download" : "Descargar", "Rename" : "Renombrar", "Details" : "detalles", - "Error" : "Error", - "Upload" : "Subir", "New folder" : "Nuevo directorio", + "Upload" : "Subir", "A new file or folder has been created" : "Un nuevo archivo o carpeta ha sido creado", "A file or folder has been changed" : "Un archivo o carpeta ha sido cambiado", "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json index 57c23a61ea..7c42b2a409 100644 --- a/apps/files/l10n/es_CL.json +++ b/apps/files/l10n/es_CL.json @@ -4,9 +4,8 @@ "Download" : "Descargar", "Rename" : "Renombrar", "Details" : "detalles", - "Error" : "Error", - "Upload" : "Subir", "New folder" : "Nuevo directorio", + "Upload" : "Subir", "A new file or folder has been created" : "Un nuevo archivo o carpeta ha sido creado", "A file or folder has been changed" : "Un archivo o carpeta ha sido cambiado", "A file or folder has been deleted" : "Un archivo o carpeta ha sido eliminado", diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 5502733d2e..0e4dbddeda 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -2,11 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", - "Could not move %s" : "No se pudo mover %s", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear la carpeta.", "Unable to set upload directory." : "Incapaz de crear directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido", @@ -25,8 +20,8 @@ OC.L10N.register( "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Upload cancelled." : "Subida cancelada.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", @@ -35,13 +30,6 @@ OC.L10N.register( "Delete" : "Eliminar", "Details" : "Detalles", "Pending" : "Pendiente", - "Error moving file" : "Error moviendo archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear la carpeta", - "Error deleting file." : "Error borrando el archivo.", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -55,14 +43,12 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!", "Your storage is almost full ({usedSpacePercent}%)" : "Su almacenamiento está casi lleno ({usedSpacePercent}%)", "Favorite" : "Favorito", - "Upload" : "Subir archivo", - "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "Upload" : "Subir archivo", "You created %1$s" : "Has creado %1$s", "You changed %1$s" : "Has cambiado %1$s", "You deleted %1$s" : "Has eliminado %1$s", - "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", @@ -73,6 +59,7 @@ OC.L10N.register( "Cancel upload" : "Cancelar subida", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere." + "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", + "Text file" : "Archivo de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 22918fae18..cb903ddd9d 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -1,10 +1,5 @@ { "translations": { "Unknown error" : "Error desconocido", - "Could not move %s - File with this name already exists" : "No se pudo mover %s - Ya existe un archivo con ese nombre.", - "Could not move %s" : "No se pudo mover %s", - "The name %s is already used in the folder %s. Please choose a different name." : "El nombre %s ya está en uso por la carpeta %s. Por favor elija uno diferente.", - "Error when creating the file" : "Error al crear el archivo", - "Error when creating the folder" : "Error al crear la carpeta.", "Unable to set upload directory." : "Incapaz de crear directorio de subida.", "Invalid Token" : "Token Inválido", "No file was uploaded. Unknown error" : "No se subió ningún archivo. Error desconocido", @@ -23,8 +18,8 @@ "Favorites" : "Favoritos", "Home" : "Particular", "Close" : "Cerrar", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Upload cancelled." : "Subida cancelada.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "La subida del archivo está en proceso. Si sale de la página ahora, la subida será cancelada.", "Actions" : "Acciones", @@ -33,13 +28,6 @@ "Delete" : "Eliminar", "Details" : "Detalles", "Pending" : "Pendiente", - "Error moving file" : "Error moviendo archivo", - "Error" : "Error", - "{new_name} already exists" : "{new_name} ya existe", - "Could not rename file" : "No se pudo renombrar el archivo", - "Could not create file" : "No se pudo crear el archivo", - "Could not create folder" : "No se pudo crear la carpeta", - "Error deleting file." : "Error borrando el archivo.", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -53,14 +41,12 @@ "Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!", "Your storage is almost full ({usedSpacePercent}%)" : "Su almacenamiento está casi lleno ({usedSpacePercent}%)", "Favorite" : "Favorito", - "Upload" : "Subir archivo", - "Text file" : "Archivo de texto", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", + "Upload" : "Subir archivo", "You created %1$s" : "Has creado %1$s", "You changed %1$s" : "Has cambiado %1$s", "You deleted %1$s" : "Has eliminado %1$s", - "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", @@ -71,6 +57,7 @@ "Cancel upload" : "Cancelar subida", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", - "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere." + "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", + "Text file" : "Archivo de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 86bda48300..f136bd300b 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Andmehoidla pole saadaval", "Storage invalid" : "Vigane andmehoidla", "Unknown error" : "Tundmatu viga", - "Could not move %s - File with this name already exists" : "Ei saa liigutada faili %s - samanimeline fail on juba olemas", - "Could not move %s" : "%s liigutamine ebaõnnestus", - "Permission denied" : "Ligipääs keelatud", - "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nimi %s on juba kasutusel kataloogis %s. Palun vali mõni teine nimi.", - "Error when creating the file" : "Viga faili loomisel", - "Error when creating the folder" : "Viga kataloogi loomisel", "Unable to set upload directory." : "Üleslaadimiste kausta määramine ebaõnnestus.", "Invalid Token" : "Vigane kontrollkood", "No file was uploaded. Unknown error" : "Ühtegi faili ei laetud üles. Tundmatu viga", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Ajutiste failide kaust puudub", "Failed to write to disk" : "Kettale kirjutamine ebaõnnestus", "Not enough storage available" : "Saadaval pole piisavalt ruumi", + "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.", "Upload failed. Could not find uploaded file" : "Üleslaadimine ebaõnnestus. Üleslaetud faili ei leitud", "Upload failed. Could not get file info." : "Üleslaadimine ebaõnnestus. Faili info hankimine ebaõnnestus.", "Invalid directory." : "Vigane kaust.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Lemmikud", "Home" : "Kodu", "Close" : "Sulge", + "Upload cancelled." : "Üleslaadimine tühistati.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti", "Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.", - "Upload cancelled." : "Üleslaadimine tühistati.", "Could not get result from server." : "Serverist ei saadud tulemusi", "File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", "Actions" : "Tegevused", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud", "This operation is forbidden" : "See toiming on keelatud", "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga", - "Error moving file." : "Viga faili liigutamisel.", - "Error moving file" : "Viga faili eemaldamisel", - "Error" : "Viga", - "{new_name} already exists" : "{new_name} on juba olemas", - "Could not rename file" : "Ei suuda faili ümber nimetada", - "Could not create file" : "Ei suuda luua faili", - "Could not create folder" : "Ei suuda luua kataloogi", - "Error deleting file." : "Viga faili kustutamisel.", "No entries in this folder match '{filter}'" : "Ükski sissekanne ei kattu filtriga '{filter}'", "Name" : "Nimi", "Size" : "Suurus", @@ -74,10 +60,9 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bait","%n baiti"], "Favorited" : "Lemmikud", "Favorite" : "Lemmik", - "Upload" : "Lae üles", - "Text file" : "Tekstifail", "Folder" : "Kaust", "New folder" : "Uus kaust", + "Upload" : "Lae üles", "An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge", "A new file or folder has been created" : "Uus fail või kataloog on loodud", "A file or folder has been changed" : "Fail või kataloog on muudetud", @@ -92,15 +77,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s kustutas %1$s", "You restored %1$s" : "Sa taastasid %1$s", "%2$s restored %1$s" : "%2$s taastas %1$s", - "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud", - "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus", "Upload (max. %s)" : "Üleslaadimine (max. %s)", "File handling" : "Failide käsitlemine", "Maximum upload size" : "Maksimaalne üleslaadimise suurus", "max. possible: " : "maks. võimalik: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-ga võib see väärtuse mõju rakendamine võtta aega kuni 5 minutit pärast salvestamist.", "Save" : "Salvesta", - "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.", "Settings" : "Seaded", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Kasuta seda aadressi oma failidele ligipääsuks WebDAV kaudu", @@ -114,6 +95,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", "Currently scanning" : "Praegu skännimisel", "No favorites" : "Lemmikuid pole", - "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks" + "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks", + "Text file" : "Tekstifail" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index a95de6cf03..6e1961770c 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -2,13 +2,6 @@ "Storage not available" : "Andmehoidla pole saadaval", "Storage invalid" : "Vigane andmehoidla", "Unknown error" : "Tundmatu viga", - "Could not move %s - File with this name already exists" : "Ei saa liigutada faili %s - samanimeline fail on juba olemas", - "Could not move %s" : "%s liigutamine ebaõnnestus", - "Permission denied" : "Ligipääs keelatud", - "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nimi %s on juba kasutusel kataloogis %s. Palun vali mõni teine nimi.", - "Error when creating the file" : "Viga faili loomisel", - "Error when creating the folder" : "Viga kataloogi loomisel", "Unable to set upload directory." : "Üleslaadimiste kausta määramine ebaõnnestus.", "Invalid Token" : "Vigane kontrollkood", "No file was uploaded. Unknown error" : "Ühtegi faili ei laetud üles. Tundmatu viga", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Ajutiste failide kaust puudub", "Failed to write to disk" : "Kettale kirjutamine ebaõnnestus", "Not enough storage available" : "Saadaval pole piisavalt ruumi", + "The target folder has been moved or deleted." : "Sihtkataloog on ümber tõstetud või kustutatud.", "Upload failed. Could not find uploaded file" : "Üleslaadimine ebaõnnestus. Üleslaetud faili ei leitud", "Upload failed. Could not get file info." : "Üleslaadimine ebaõnnestus. Faili info hankimine ebaõnnestus.", "Invalid directory." : "Vigane kaust.", @@ -28,10 +22,10 @@ "Favorites" : "Lemmikud", "Home" : "Kodu", "Close" : "Sulge", + "Upload cancelled." : "Üleslaadimine tühistati.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti", "Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.", - "Upload cancelled." : "Üleslaadimine tühistati.", "Could not get result from server." : "Serverist ei saadud tulemusi", "File upload is in progress. Leaving the page now will cancel the upload." : "Faili üleslaadimine on töös. Lehelt lahkumine katkestab selle üleslaadimise.", "Actions" : "Tegevused", @@ -44,14 +38,6 @@ "Unable to determine date" : "Kuupäeva tuvastamine ei õnnestunud", "This operation is forbidden" : "See toiming on keelatud", "This directory is unavailable, please check the logs or contact the administrator" : "See kaust pole saadaval. Palun kontrolli logifaile või võta ühendust administraatoriga", - "Error moving file." : "Viga faili liigutamisel.", - "Error moving file" : "Viga faili eemaldamisel", - "Error" : "Viga", - "{new_name} already exists" : "{new_name} on juba olemas", - "Could not rename file" : "Ei suuda faili ümber nimetada", - "Could not create file" : "Ei suuda luua faili", - "Could not create folder" : "Ei suuda luua kataloogi", - "Error deleting file." : "Viga faili kustutamisel.", "No entries in this folder match '{filter}'" : "Ükski sissekanne ei kattu filtriga '{filter}'", "Name" : "Nimi", "Size" : "Suurus", @@ -72,10 +58,9 @@ "_%n byte_::_%n bytes_" : ["%n bait","%n baiti"], "Favorited" : "Lemmikud", "Favorite" : "Lemmik", - "Upload" : "Lae üles", - "Text file" : "Tekstifail", "Folder" : "Kaust", "New folder" : "Uus kaust", + "Upload" : "Lae üles", "An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge", "A new file or folder has been created" : "Uus fail või kataloog on loodud", "A file or folder has been changed" : "Fail või kataloog on muudetud", @@ -90,15 +75,11 @@ "%2$s deleted %1$s" : "%2$s kustutas %1$s", "You restored %1$s" : "Sa taastasid %1$s", "%2$s restored %1$s" : "%2$s taastas %1$s", - "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud", - "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus", "Upload (max. %s)" : "Üleslaadimine (max. %s)", "File handling" : "Failide käsitlemine", "Maximum upload size" : "Maksimaalne üleslaadimise suurus", "max. possible: " : "maks. võimalik: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-ga võib see väärtuse mõju rakendamine võtta aega kuni 5 minutit pärast salvestamist.", "Save" : "Salvesta", - "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.", "Settings" : "Seaded", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Kasuta seda aadressi oma failidele ligipääsuks WebDAV kaudu", @@ -112,6 +93,7 @@ "Files are being scanned, please wait." : "Faile skannitakse, palun oota.", "Currently scanning" : "Praegu skännimisel", "No favorites" : "Lemmikuid pole", - "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks" + "Files and folders you mark as favorite will show up here" : "Siin kuvatakse faile ja kaustasid, mille oled märkinud lemmikuteks", + "Text file" : "Tekstifail" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index c01afc96c5..9add1516c4 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Biltegia ez dago eskuragarri", "Storage invalid" : "Biltegi bliogabea", "Unknown error" : "Errore ezezaguna", - "Could not move %s - File with this name already exists" : "Ezin da %s mugitu - Izen hau duen fitxategia dagoeneko existitzen da", - "Could not move %s" : "Ezin dira fitxategiak mugitu %s", - "Permission denied" : "Baimena Ukatua", - "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s izena dagoeneko erabilita dago %s karpetan. Mesdez hautatu izen ezberdina.", - "Error when creating the file" : "Errorea fitxategia sortzerakoan", - "Error when creating the folder" : "Errorea karpeta sortzerakoan", "Unable to set upload directory." : "Ezin da igoera direktorioa ezarri.", "Invalid Token" : "Lekuko baliogabea", "No file was uploaded. Unknown error" : "Ez da fitxategirik igo. Errore ezezaguna", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Aldi bateko karpeta falta da", "Failed to write to disk" : "Errore bat izan da diskoan idazterakoan", "Not enough storage available" : "Ez dago behar aina leku erabilgarri,", + "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.", "Upload failed. Could not find uploaded file" : "Igoerak huts egin du. Ezin izan da igotako fitxategia aurkitu", "Upload failed. Could not get file info." : "Igoerak huts egin du. Ezin izan da fitxategiaren informazioa eskuratu.", "Invalid directory." : "Baliogabeko karpeta.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Gogokoak", "Home" : "Etxekoa", "Close" : "Itxi", + "Upload cancelled." : "Igoera ezeztatuta", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako", "Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago", - "Upload cancelled." : "Igoera ezeztatuta", "Could not get result from server." : "Ezin da zerbitzaritik emaitzik lortu", "File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", "Actions" : "Ekintzak", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "hautatu", "Pending" : "Zain", "Unable to determine date" : "Ezin izan da data zehaztu", - "Error moving file." : "Errorea fitxategia mugitzean.", - "Error moving file" : "Errorea fitxategia mugitzean", - "Error" : "Errorea", - "{new_name} already exists" : "{new_name} dagoeneko existitzen da", - "Could not rename file" : "Ezin izan da fitxategia berrizendatu", - "Could not create file" : "Ezin izan da fitxategia sortu", - "Could not create folder" : "Ezin izan da karpeta sortu", - "Error deleting file." : "Errorea fitxategia ezabatzerakoan.", "No entries in this folder match '{filter}'" : "Karpeta honetan ez dago sarrerarik '{filter}' iragazkiarekin bat egiten dutenak", "Name" : "Izena", "Size" : "Tamaina", @@ -68,10 +54,9 @@ OC.L10N.register( "Your storage is almost full ({usedSpacePercent}%)" : "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})", "Favorited" : "Gogokoa", "Favorite" : "Gogokoa", - "Upload" : "Igo", - "Text file" : "Testu fitxategia", "Folder" : "Karpeta", "New folder" : "Karpeta berria", + "Upload" : "Igo", "A new file or folder has been created" : "Fitxategi edo karpeta berri bat sortu da", "A file or folder has been changed" : "Fitxategi edo karpeta bat aldatu da", "A file or folder has been deleted" : "Fitxategi edo karpeta bat ezabatu da", @@ -85,8 +70,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$sk ezabatuta %1$s", "You restored %1$s" : "Zuk %1$s berrezarri duzu", "%2$s restored %1$s" : "%2$sk %1$s berrezarri du", - "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta", - "%s could not be renamed" : "%s ezin da berrizendatu", "Upload (max. %s)" : "Igo (max. %s)", "File handling" : "Fitxategien kudeaketa", "Maximum upload size" : "Igo daitekeen gehienezko tamaina", @@ -104,6 +87,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", "Currently scanning" : "Eskaneatzen une honetan", "No favorites" : "Gogokorik ez", - "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira" + "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira", + "Text file" : "Testu fitxategia" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index 997e8bf73c..96943f33a9 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -2,13 +2,6 @@ "Storage not available" : "Biltegia ez dago eskuragarri", "Storage invalid" : "Biltegi bliogabea", "Unknown error" : "Errore ezezaguna", - "Could not move %s - File with this name already exists" : "Ezin da %s mugitu - Izen hau duen fitxategia dagoeneko existitzen da", - "Could not move %s" : "Ezin dira fitxategiak mugitu %s", - "Permission denied" : "Baimena Ukatua", - "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s izena dagoeneko erabilita dago %s karpetan. Mesdez hautatu izen ezberdina.", - "Error when creating the file" : "Errorea fitxategia sortzerakoan", - "Error when creating the folder" : "Errorea karpeta sortzerakoan", "Unable to set upload directory." : "Ezin da igoera direktorioa ezarri.", "Invalid Token" : "Lekuko baliogabea", "No file was uploaded. Unknown error" : "Ez da fitxategirik igo. Errore ezezaguna", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Aldi bateko karpeta falta da", "Failed to write to disk" : "Errore bat izan da diskoan idazterakoan", "Not enough storage available" : "Ez dago behar aina leku erabilgarri,", + "The target folder has been moved or deleted." : "Jatorrizko karpeta mugitu edo ezabatu da.", "Upload failed. Could not find uploaded file" : "Igoerak huts egin du. Ezin izan da igotako fitxategia aurkitu", "Upload failed. Could not get file info." : "Igoerak huts egin du. Ezin izan da fitxategiaren informazioa eskuratu.", "Invalid directory." : "Baliogabeko karpeta.", @@ -28,10 +22,10 @@ "Favorites" : "Gogokoak", "Home" : "Etxekoa", "Close" : "Itxi", + "Upload cancelled." : "Igoera ezeztatuta", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako", "Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago", - "Upload cancelled." : "Igoera ezeztatuta", "Could not get result from server." : "Ezin da zerbitzaritik emaitzik lortu", "File upload is in progress. Leaving the page now will cancel the upload." : "Fitxategien igoera martxan da. Orria orain uzteak igoera ezeztatutko du.", "Actions" : "Ekintzak", @@ -42,14 +36,6 @@ "Select" : "hautatu", "Pending" : "Zain", "Unable to determine date" : "Ezin izan da data zehaztu", - "Error moving file." : "Errorea fitxategia mugitzean.", - "Error moving file" : "Errorea fitxategia mugitzean", - "Error" : "Errorea", - "{new_name} already exists" : "{new_name} dagoeneko existitzen da", - "Could not rename file" : "Ezin izan da fitxategia berrizendatu", - "Could not create file" : "Ezin izan da fitxategia sortu", - "Could not create folder" : "Ezin izan da karpeta sortu", - "Error deleting file." : "Errorea fitxategia ezabatzerakoan.", "No entries in this folder match '{filter}'" : "Karpeta honetan ez dago sarrerarik '{filter}' iragazkiarekin bat egiten dutenak", "Name" : "Izena", "Size" : "Tamaina", @@ -66,10 +52,9 @@ "Your storage is almost full ({usedSpacePercent}%)" : "Zure biltegiratzea nahiko beterik dago (%{usedSpacePercent})", "Favorited" : "Gogokoa", "Favorite" : "Gogokoa", - "Upload" : "Igo", - "Text file" : "Testu fitxategia", "Folder" : "Karpeta", "New folder" : "Karpeta berria", + "Upload" : "Igo", "A new file or folder has been created" : "Fitxategi edo karpeta berri bat sortu da", "A file or folder has been changed" : "Fitxategi edo karpeta bat aldatu da", "A file or folder has been deleted" : "Fitxategi edo karpeta bat ezabatu da", @@ -83,8 +68,6 @@ "%2$s deleted %1$s" : "%2$sk ezabatuta %1$s", "You restored %1$s" : "Zuk %1$s berrezarri duzu", "%2$s restored %1$s" : "%2$sk %1$s berrezarri du", - "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta", - "%s could not be renamed" : "%s ezin da berrizendatu", "Upload (max. %s)" : "Igo (max. %s)", "File handling" : "Fitxategien kudeaketa", "Maximum upload size" : "Igo daitekeen gehienezko tamaina", @@ -102,6 +85,7 @@ "Files are being scanned, please wait." : "Fitxategiak eskaneatzen ari da, itxoin mezedez.", "Currently scanning" : "Eskaneatzen une honetan", "No favorites" : "Gogokorik ez", - "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira" + "Files and folders you mark as favorite will show up here" : "Gogokotzat markatutako fitxategi eta karpeta hemen agertuko dira", + "Text file" : "Testu fitxategia" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index b053d4af79..46cbbc376a 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "فضای ذخیره سازی موجود نیست", "Storage invalid" : "فضای ذخیره‌سازی نامعتبر", "Unknown error" : "خطای نامشخص", - "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ", - "Could not move %s" : "%s نمی تواند حرکت کند ", - "Permission denied" : "رد دسترسی", - "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", - "The name %s is already used in the folder %s. Please choose a different name." : "نام %s هم‌اکنون در پوشه %s مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.", - "Error when creating the file" : "خطا در حین ایجاد فایل", - "Error when creating the folder" : "خطا در حین ایجاد پوشه", "Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.", "Invalid Token" : "رمز نامعتبر", "No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "یک پوشه موقت گم شده", "Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود", "Not enough storage available" : "فضای کافی در دسترس نیست", + "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", "Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایل‌های آپلود شده وجود ندارد", "Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "موارد محبوب", "Home" : "خانه", "Close" : "بستن", + "Upload cancelled." : "بار گذاری لغو شد", "Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد", "Total file size {size1} exceeds upload limit {size2}" : "مجموع سایز {size1} بیشتر از محدودیت آپلود {size2} است", "Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است", - "Upload cancelled." : "بار گذاری لغو شد", "Could not get result from server." : "امکان دریافت نتایج از سرور وجود ندارد.", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "Actions" : "فعالیت ها", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "امکان تعیین تاریخ وجود ندارد", "This operation is forbidden" : "این عملیات غیرمجاز است", "This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید", - "Error moving file." : "خطا در انتقال فایل.", - "Error moving file" : "خطا در انتقال فایل", - "Error" : "خطا", - "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", - "Could not rename file" : "امکان تغییر نام وجود ندارد", - "Could not create file" : "امکان ایجاد فایل وجود ندارد", - "Could not create folder" : "امکان ایجاد پوشه وجود ندارد", - "Error deleting file." : "خطا در حذف فایل.", "No entries in this folder match '{filter}'" : "هیچ ورودی‌ای با '{filter}' تطبیق ندارد", "Name" : "نام", "Size" : "اندازه", @@ -75,11 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n بایت"], "Favorited" : "برگزیده شده", "Favorite" : "برگزیده", - "{newname} already exists" : "{newname} هم‌اکنون وجود دارد", - "Upload" : "بارگزاری", - "Text file" : "فایل متنی", "Folder" : "پوشه", "New folder" : "پوشه جدید", + "{newname} already exists" : "{newname} هم‌اکنون وجود دارد", + "Upload" : "بارگزاری", "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است", "A new file or folder has been created" : "فایل یا پوشه ای ایجاد شد", "A file or folder has been changed" : "فایل یا پوشه ای به تغییر یافت", @@ -97,14 +82,11 @@ OC.L10N.register( "Changed by %2$s" : "تغییریافته توسط %2$s", "Deleted by %2$s" : "حذف شده توسط %2$s", "Restored by %2$s" : "بازگردانی شده توسط %2$s", - "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", - "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", - "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.", "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "از این آدرس استفاده کنید تا بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید", @@ -118,6 +100,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", "Currently scanning" : "در حال اسکن", "No favorites" : "هیچ برگزیده", - "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود" + "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود", + "Text file" : "فایل متنی" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index 0f745e7f24..b9e32d69e3 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -2,13 +2,6 @@ "Storage not available" : "فضای ذخیره سازی موجود نیست", "Storage invalid" : "فضای ذخیره‌سازی نامعتبر", "Unknown error" : "خطای نامشخص", - "Could not move %s - File with this name already exists" : "%s نمی توان جابجا کرد - در حال حاضر پرونده با این نام وجود دارد. ", - "Could not move %s" : "%s نمی تواند حرکت کند ", - "Permission denied" : "رد دسترسی", - "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", - "The name %s is already used in the folder %s. Please choose a different name." : "نام %s هم‌اکنون در پوشه %s مورد استفاده قرار گرفته شده است. لطفا نام دیگری انتخاب کنید.", - "Error when creating the file" : "خطا در حین ایجاد فایل", - "Error when creating the folder" : "خطا در حین ایجاد پوشه", "Unable to set upload directory." : "قادر به تنظیم پوشه آپلود نمی باشد.", "Invalid Token" : "رمز نامعتبر", "No file was uploaded. Unknown error" : "هیچ فایلی آپلود نشد.خطای ناشناس", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "یک پوشه موقت گم شده", "Failed to write to disk" : "نوشتن بر روی دیسک سخت ناموفق بود", "Not enough storage available" : "فضای کافی در دسترس نیست", + "The target folder has been moved or deleted." : "پوشه مقصد انتقال یافته یا حذف شده است.", "Upload failed. Could not find uploaded file" : "خطا در آپلود. امکان یافتن فایل‌های آپلود شده وجود ندارد", "Upload failed. Could not get file info." : "خطای آپلود. امکان دریافت جزئیات فایل وجود ندارد.", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", @@ -28,10 +22,10 @@ "Favorites" : "موارد محبوب", "Home" : "خانه", "Close" : "بستن", + "Upload cancelled." : "بار گذاری لغو شد", "Unable to upload {filename} as it is a directory or has 0 bytes" : "امکان آپلود {filename} وجود ندارد، پوشه‌ای با این نام یا فایلی با حجم 0 بایت با این نام وجود دارد", "Total file size {size1} exceeds upload limit {size2}" : "مجموع سایز {size1} بیشتر از محدودیت آپلود {size2} است", "Not enough free space, you are uploading {size1} but only {size2} is left" : "ظرفیت لازم وجود ندارد، شما آپلودی با حجم {size1} را انجام میدهید اما تنها {size2} فضا باقی مانده است", - "Upload cancelled." : "بار گذاری لغو شد", "Could not get result from server." : "امکان دریافت نتایج از سرور وجود ندارد.", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "Actions" : "فعالیت ها", @@ -44,14 +38,6 @@ "Unable to determine date" : "امکان تعیین تاریخ وجود ندارد", "This operation is forbidden" : "این عملیات غیرمجاز است", "This directory is unavailable, please check the logs or contact the administrator" : "پوشه‌ در دسترس نیست، لطفا لاگ‌ها را بررسی کنید یا به مدیر سیستم اطلاع دهید", - "Error moving file." : "خطا در انتقال فایل.", - "Error moving file" : "خطا در انتقال فایل", - "Error" : "خطا", - "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", - "Could not rename file" : "امکان تغییر نام وجود ندارد", - "Could not create file" : "امکان ایجاد فایل وجود ندارد", - "Could not create folder" : "امکان ایجاد پوشه وجود ندارد", - "Error deleting file." : "خطا در حذف فایل.", "No entries in this folder match '{filter}'" : "هیچ ورودی‌ای با '{filter}' تطبیق ندارد", "Name" : "نام", "Size" : "اندازه", @@ -73,11 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n بایت"], "Favorited" : "برگزیده شده", "Favorite" : "برگزیده", - "{newname} already exists" : "{newname} هم‌اکنون وجود دارد", - "Upload" : "بارگزاری", - "Text file" : "فایل متنی", "Folder" : "پوشه", "New folder" : "پوشه جدید", + "{newname} already exists" : "{newname} هم‌اکنون وجود دارد", + "Upload" : "بارگزاری", "An error occurred while trying to update the tags" : "یک خطا در حین بروزرسانی برچسب‌ها رخ داده است", "A new file or folder has been created" : "فایل یا پوشه ای ایجاد شد", "A file or folder has been changed" : "فایل یا پوشه ای به تغییر یافت", @@ -95,14 +80,11 @@ "Changed by %2$s" : "تغییریافته توسط %2$s", "Deleted by %2$s" : "حذف شده توسط %2$s", "Restored by %2$s" : "بازگردانی شده توسط %2$s", - "%s could not be renamed as it has been deleted" : "امکان تغییر نام %s با توجه به حذف شدن آن وجود ندارد", - "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "Upload (max. %s)" : "آپلود (بیشترین سایز %s)", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", - "Can not be edited from here due to insufficient permissions." : "با توجه به دسترسی محدود، امکان ویرایش از اینجا وجود ندارد.", "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "از این آدرس استفاده کنید تا بتوانید به فایل‌های خود توسط WebDAV دسترسی پیدا کنید", @@ -116,6 +98,7 @@ "Files are being scanned, please wait." : "پرونده ها در حال بازرسی هستند لطفا صبر کنید", "Currently scanning" : "در حال اسکن", "No favorites" : "هیچ برگزیده", - "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود" + "Files and folders you mark as favorite will show up here" : "فایل‌ها و پوشه‌های انتخاب شده به عنوان برگزیده توسط شما، در اینجا نمایش داده می‌شود", + "Text file" : "فایل متنی" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index cf4bb0f579..8bebb81fd3 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Tallennustila ei ole käytettävissä", "Storage invalid" : "Virheellinen tallennustila", "Unknown error" : "Tuntematon virhe", - "Could not move %s - File with this name already exists" : "Kohteen %s siirto ei onnistunut - Tiedosto samalla nimellä on jo olemassa", - "Could not move %s" : "Kohteen %s siirto ei onnistunut", - "Permission denied" : "Ei käyttöoikeutta", - "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nimi %s on jo käytössä kansiossa %s. Valitse toinen nimi.", - "Error when creating the file" : "Virhe tiedostoa luotaessa", - "Error when creating the folder" : "Virhe kansiota luotaessa", "Unable to set upload directory." : "Lähetyskansion asettaminen epäonnistui.", "Invalid Token" : "Virheellinen token", "No file was uploaded. Unknown error" : "Tiedostoa ei lähetetty. Tuntematon virhe", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Tilapäiskansio puuttuu", "Failed to write to disk" : "Levylle kirjoitus epäonnistui", "Not enough storage available" : "Tallennustilaa ei ole riittävästi käytettävissä", + "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.", "Upload failed. Could not find uploaded file" : "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.", "Upload failed. Could not get file info." : "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.", "Invalid directory." : "Virheellinen kansio.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Suosikit", "Home" : "Koti", "Close" : "Sulje", + "Upload cancelled." : "Lähetys peruttu.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua", "Total file size {size1} exceeds upload limit {size2}" : "Yhteiskoko {size1} ylittää lähetysrajan {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä", - "Upload cancelled." : "Lähetys peruttu.", "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", "Actions" : "Toiminnot", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", "This operation is forbidden" : "Tämä toiminto on kielletty", "This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.", - "Error moving file." : "Virhe tiedostoa siirrettäessä.", - "Error moving file" : "Virhe tiedostoa siirrettäessä", - "Error" : "Virhe", - "{new_name} already exists" : "{new_name} on jo olemassa", - "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui", - "Could not create file" : "Tiedoston luominen epäonnistui", - "Could not create folder" : "Kansion luominen epäonnistui", - "Error deleting file." : "Virhe tiedostoa poistaessa.", + "Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa", + "Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut", + "{newName} already exists" : "{newName} on jo olemassa", + "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.", + "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut", + "Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda", + "Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa", + "Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda", + "Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa", + "Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".", "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", "Name" : "Nimi", "Size" : "Koko", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", "Favorite" : "Suosikki", - "{newname} already exists" : "{newname} on jo olemassa", - "Upload" : "Lähetä", - "Text file" : "Tekstitiedosto", - "New text file.txt" : "Uusi tekstitiedosto.txt", "Folder" : "Kansio", "New folder" : "Uusi kansio", + "{newname} already exists" : "{newname} on jo olemassa", + "Upload" : "Lähetä", "An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe", "A new file or folder has been created" : "Uusi tiedosto tai kansio on luotu", "A file or folder has been changed" : "Tiedostoa tai kansiota on muutettu", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Muuttanut %2$s", "Deleted by %2$s" : "Poistanut %2$s", "Restored by %2$s" : "Palauttanut %2$s", - "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", - "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", "File handling" : "Tiedostonhallinta", "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", "max. possible: " : "suurin mahdollinen:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM:n ollessa käytössä tämän arvon tuleminen voimaan saattaa kestää viisi minuuttia tallennushetkestä.", "Save" : "Tallenna", - "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.", + "Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.", "Settings" : "Asetukset", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta käyttääksesi tiedostojasi WebDAVin kautta", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", "Currently scanning" : "Tutkitaan parhaillaan", "No favorites" : "Ei suosikkeja", - "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä" + "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", + "Text file" : "Tekstitiedosto", + "New text file.txt" : "Uusi tekstitiedosto.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index 56417b3c74..64b0a886b7 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -2,13 +2,6 @@ "Storage not available" : "Tallennustila ei ole käytettävissä", "Storage invalid" : "Virheellinen tallennustila", "Unknown error" : "Tuntematon virhe", - "Could not move %s - File with this name already exists" : "Kohteen %s siirto ei onnistunut - Tiedosto samalla nimellä on jo olemassa", - "Could not move %s" : "Kohteen %s siirto ei onnistunut", - "Permission denied" : "Ei käyttöoikeutta", - "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nimi %s on jo käytössä kansiossa %s. Valitse toinen nimi.", - "Error when creating the file" : "Virhe tiedostoa luotaessa", - "Error when creating the folder" : "Virhe kansiota luotaessa", "Unable to set upload directory." : "Lähetyskansion asettaminen epäonnistui.", "Invalid Token" : "Virheellinen token", "No file was uploaded. Unknown error" : "Tiedostoa ei lähetetty. Tuntematon virhe", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Tilapäiskansio puuttuu", "Failed to write to disk" : "Levylle kirjoitus epäonnistui", "Not enough storage available" : "Tallennustilaa ei ole riittävästi käytettävissä", + "The target folder has been moved or deleted." : "Kohdekansio on siirretty tai poistettu.", "Upload failed. Could not find uploaded file" : "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.", "Upload failed. Could not get file info." : "Lähetys epäonnistui. Lähettävää tiedostoa ei löydetty.", "Invalid directory." : "Virheellinen kansio.", @@ -28,10 +22,10 @@ "Favorites" : "Suosikit", "Home" : "Koti", "Close" : "Sulje", + "Upload cancelled." : "Lähetys peruttu.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua", "Total file size {size1} exceeds upload limit {size2}" : "Yhteiskoko {size1} ylittää lähetysrajan {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä", - "Upload cancelled." : "Lähetys peruttu.", "Could not get result from server." : "Tuloksien saaminen palvelimelta ei onnistunut.", "File upload is in progress. Leaving the page now will cancel the upload." : "Tiedoston lähetys on meneillään. Sivulta poistuminen nyt peruu tiedoston lähetyksen.", "Actions" : "Toiminnot", @@ -44,14 +38,17 @@ "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", "This operation is forbidden" : "Tämä toiminto on kielletty", "This directory is unavailable, please check the logs or contact the administrator" : "Hakemisto ei ole käytettävissä. Tarkista lokit tai ole yhteydessä ylläpitoon.", - "Error moving file." : "Virhe tiedostoa siirrettäessä.", - "Error moving file" : "Virhe tiedostoa siirrettäessä", - "Error" : "Virhe", - "{new_name} already exists" : "{new_name} on jo olemassa", - "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui", - "Could not create file" : "Tiedoston luominen epäonnistui", - "Could not create folder" : "Kansion luominen epäonnistui", - "Error deleting file." : "Virhe tiedostoa poistaessa.", + "Could not move \"{file}\", target exists" : "Tiedoston \"{file}\" siirtäminen ei onnistunut, kohde on olemassa", + "Could not move \"{file}\"" : "Tiedoston \"{file}\" siirtäminen ei onnistunut", + "{newName} already exists" : "{newName} on jo olemassa", + "Could not rename \"{fileName}\", it does not exist any more" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut, koska sitä ei ole enää olemassa", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Nimi \"{targetName}\" on jo käytössä kansiossa \"{dir}\". Valitse toinen nimi.", + "Could not rename \"{fileName}\"" : "Tiedoston \"{fileName}\" nimeäminen uudelleen ei onnistunut", + "Could not create file \"{file}\"" : "Tiedostoa \"{file}\" ei voitu luoda", + "Could not create file \"{file}\" because it already exists" : "Tiedostoa \"{file}\" ei voitu luoda, koska se on jo olemassa", + "Could not create folder \"{dir}\"" : "Kansiota \"{dir}\" ei voitu luoda", + "Could not create folder \"{dir}\" because it already exists" : "Kansiota \"{dir}\" ei voitu luoda, koska se on jo olemassa", + "Error deleting file \"{fileName}\"." : "Virhe poistaessa tiedostoa \"{fileName}\".", "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", "Name" : "Nimi", "Size" : "Koko", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Favorited" : "Lisätty suosikkeihin", "Favorite" : "Suosikki", - "{newname} already exists" : "{newname} on jo olemassa", - "Upload" : "Lähetä", - "Text file" : "Tekstitiedosto", - "New text file.txt" : "Uusi tekstitiedosto.txt", "Folder" : "Kansio", "New folder" : "Uusi kansio", + "{newname} already exists" : "{newname} on jo olemassa", + "Upload" : "Lähetä", "An error occurred while trying to update the tags" : "Tunnisteiden päivitystä yrittäessä tapahtui virhe", "A new file or folder has been created" : "Uusi tiedosto tai kansio on luotu", "A file or folder has been changed" : "Tiedostoa tai kansiota on muutettu", @@ -97,15 +92,13 @@ "Changed by %2$s" : "Muuttanut %2$s", "Deleted by %2$s" : "Poistanut %2$s", "Restored by %2$s" : "Palauttanut %2$s", - "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", - "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", "File handling" : "Tiedostonhallinta", "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", "max. possible: " : "suurin mahdollinen:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM:n ollessa käytössä tämän arvon tuleminen voimaan saattaa kestää viisi minuuttia tallennushetkestä.", "Save" : "Tallenna", - "Can not be edited from here due to insufficient permissions." : "Ei muokattavissa täällä puutteellisten oikeuksien vuoksi.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM:tä käyttäen muutoksien voimaantulossa saattaa kestää 5 minuuttia.", + "Missing permissions to edit from here." : "Käyttöoikeudet eivät riitä tätä kautta muokkaamiseen.", "Settings" : "Asetukset", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Käytä tätä osoitetta käyttääksesi tiedostojasi WebDAVin kautta", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", "Currently scanning" : "Tutkitaan parhaillaan", "No favorites" : "Ei suosikkeja", - "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä" + "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä", + "Text file" : "Tekstitiedosto", + "New text file.txt" : "Uusi tekstitiedosto.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 0b290eb160..6af58e9309 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Support de stockage non disponible", "Storage invalid" : "Support de stockage non valable", "Unknown error" : "Erreur Inconnue ", - "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà", - "Could not move %s" : "Impossible de déplacer %s", - "Permission denied" : "Permission refusée", - "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", - "The name %s is already used in the folder %s. Please choose a different name." : "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.", - "Error when creating the file" : "Erreur pendant la création du fichier", - "Error when creating the folder" : "Erreur pendant la création du dossier", "Unable to set upload directory." : "Impossible de définir le dossier de destination.", "Invalid Token" : "Jeton non valide", "No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Absence de dossier temporaire", "Failed to write to disk" : "Erreur d'écriture sur le disque", "Not enough storage available" : "Trop peu d'espace de stockage disponible", + "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", "Upload failed. Could not find uploaded file" : "L'envoi a échoué. Impossible de trouver le fichier envoyé.", "Upload failed. Could not get file info." : "L'envoi a échoué. Impossible d'obtenir les informations du fichier.", "Invalid directory." : "Dossier non valide.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoris", "Home" : "Mes fichiers", "Close" : "Fermer", + "Upload cancelled." : "Envoi annulé.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle", "Total file size {size1} exceeds upload limit {size2}" : "La taille totale du fichier {size1} excède la taille maximale d'envoi {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", - "Upload cancelled." : "Envoi annulé.", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", "Actions" : "Actions", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Impossible de déterminer la date", "This operation is forbidden" : "Cette opération est interdite", "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur", - "Error moving file." : "Erreur lors du déplacement du fichier.", - "Error moving file" : "Erreur lors du déplacement du fichier", - "Error" : "Erreur", - "{new_name} already exists" : "{new_name} existe déjà", - "Could not rename file" : "Impossible de renommer le fichier", - "Could not create file" : "Impossible de créer le fichier", - "Could not create folder" : "Impossible de créer le dossier", - "Error deleting file." : "Erreur pendant la suppression du fichier.", + "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe", + "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"", + "{newName} already exists" : "{newName} existe déjà", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{file}\", il n'existe plus", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.", + "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà", + "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà", + "Error deleting file \"{fileName}\"." : "Erreur pendant la suppression du fichier \"{fileName}\".", "No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'", "Name" : "Nom", "Size" : "Taille", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marqué comme favori", "Favorite" : "Favoris", - "{newname} already exists" : "{newname} existe déjà", - "Upload" : "Chargement", - "Text file" : "Fichier texte", - "New text file.txt" : "Nouveau fichier texte.txt", "Folder" : "Dossier", "New folder" : "Nouveau dossier", + "{newname} already exists" : "{newname} existe déjà", + "Upload" : "Chargement", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", "A new file or folder has been created" : "Un nouveau fichier ou répertoire a été créé", "A file or folder has been changed" : "Un fichier ou un répertoire a été modifié", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Modifié par %2$s", "Deleted by %2$s" : "Supprimé par %2$s", "Restored by %2$s" : "Restauré par %2$s", - "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", - "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", "max. possible: " : "Max. possible :", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Avec PHP-FPM, il peut se passer jusqu'à 5 minutes avant que cette valeur ne soit appliquée.", "Save" : "Sauvegarder", - "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insuffisantes.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer 5 minutes pour que les changements soient appliqués.", + "Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.", "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers par WebDAV", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", "Currently scanning" : "Analyse en cours", "No favorites" : "Aucun favori", - "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici" + "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici", + "Text file" : "Fichier texte", + "New text file.txt" : "Nouveau fichier texte.txt" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 5f51bdee30..ba25b77e3d 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -2,13 +2,6 @@ "Storage not available" : "Support de stockage non disponible", "Storage invalid" : "Support de stockage non valable", "Unknown error" : "Erreur Inconnue ", - "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà", - "Could not move %s" : "Impossible de déplacer %s", - "Permission denied" : "Permission refusée", - "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", - "The name %s is already used in the folder %s. Please choose a different name." : "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.", - "Error when creating the file" : "Erreur pendant la création du fichier", - "Error when creating the folder" : "Erreur pendant la création du dossier", "Unable to set upload directory." : "Impossible de définir le dossier de destination.", "Invalid Token" : "Jeton non valide", "No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Absence de dossier temporaire", "Failed to write to disk" : "Erreur d'écriture sur le disque", "Not enough storage available" : "Trop peu d'espace de stockage disponible", + "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", "Upload failed. Could not find uploaded file" : "L'envoi a échoué. Impossible de trouver le fichier envoyé.", "Upload failed. Could not get file info." : "L'envoi a échoué. Impossible d'obtenir les informations du fichier.", "Invalid directory." : "Dossier non valide.", @@ -28,10 +22,10 @@ "Favorites" : "Favoris", "Home" : "Mes fichiers", "Close" : "Fermer", + "Upload cancelled." : "Envoi annulé.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle", "Total file size {size1} exceeds upload limit {size2}" : "La taille totale du fichier {size1} excède la taille maximale d'envoi {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", - "Upload cancelled." : "Envoi annulé.", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", "Actions" : "Actions", @@ -44,14 +38,17 @@ "Unable to determine date" : "Impossible de déterminer la date", "This operation is forbidden" : "Cette opération est interdite", "This directory is unavailable, please check the logs or contact the administrator" : "Ce répertoire n'est pas disponible. Consultez les logs ou contactez votre administrateur", - "Error moving file." : "Erreur lors du déplacement du fichier.", - "Error moving file" : "Erreur lors du déplacement du fichier", - "Error" : "Erreur", - "{new_name} already exists" : "{new_name} existe déjà", - "Could not rename file" : "Impossible de renommer le fichier", - "Could not create file" : "Impossible de créer le fichier", - "Could not create folder" : "Impossible de créer le dossier", - "Error deleting file." : "Erreur pendant la suppression du fichier.", + "Could not move \"{file}\", target exists" : "Impossible de déplacer \"{file}\", la cible existe", + "Could not move \"{file}\"" : "Impossible de déplacer \"{file}\"", + "{newName} already exists" : "{newName} existe déjà", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renommer \"{file}\", il n'existe plus", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Le nom \"{targetName}\" est déjà utilisé dans le dossier \"{dir}\". Merci de choisir un nom différent.", + "Could not rename \"{fileName}\"" : "Impossible de renommer \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossible de créer le fichier \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossible de créer le fichier \"{file}\" car il existe déjà", + "Could not create folder \"{dir}\"" : "Impossible de créer le dossier \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossible de créer le dossier \"{dir}\" car il existe déjà", + "Error deleting file \"{fileName}\"." : "Erreur pendant la suppression du fichier \"{fileName}\".", "No entries in this folder match '{filter}'" : "Aucune entrée de ce dossier ne correspond à '{filter}'", "Name" : "Nom", "Size" : "Taille", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marqué comme favori", "Favorite" : "Favoris", - "{newname} already exists" : "{newname} existe déjà", - "Upload" : "Chargement", - "Text file" : "Fichier texte", - "New text file.txt" : "Nouveau fichier texte.txt", "Folder" : "Dossier", "New folder" : "Nouveau dossier", + "{newname} already exists" : "{newname} existe déjà", + "Upload" : "Chargement", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", "A new file or folder has been created" : "Un nouveau fichier ou répertoire a été créé", "A file or folder has been changed" : "Un fichier ou un répertoire a été modifié", @@ -97,15 +92,13 @@ "Changed by %2$s" : "Modifié par %2$s", "Deleted by %2$s" : "Supprimé par %2$s", "Restored by %2$s" : "Restauré par %2$s", - "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", - "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", "max. possible: " : "Max. possible :", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Avec PHP-FPM, il peut se passer jusqu'à 5 minutes avant que cette valeur ne soit appliquée.", "Save" : "Sauvegarder", - "Can not be edited from here due to insufficient permissions." : "Ne peut être modifié ici à cause de permissions insuffisantes.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Avec PHP-FPM il peut se passer 5 minutes pour que les changements soient appliqués.", + "Missing permissions to edit from here." : "Manque de permissions pour éditer à partir d'ici.", "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilisez cette adresse pour accéder à vos fichiers par WebDAV", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", "Currently scanning" : "Analyse en cours", "No favorites" : "Aucun favori", - "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici" + "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici", + "Text file" : "Fichier texte", + "New text file.txt" : "Nouveau fichier texte.txt" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index 2910ab97ea..3b71b1669e 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Almacenamento non dispoñíbel", "Storage invalid" : "Almacenamento incorrecto", "Unknown error" : "Produciuse un erro descoñecido", - "Could not move %s - File with this name already exists" : "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.", - "Could not move %s" : "Non foi posíbel mover %s", - "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.", - "The name %s is already used in the folder %s. Please choose a different name." : "Xa existe o nome %s no cartafol %s. Escolla outro nome.", - "Error when creating the file" : "Produciuse un erro ao crear o ficheiro", - "Error when creating the folder" : "Produciuse un erro ao crear o cartafol", "Unable to set upload directory." : "Non é posíbel configurar o directorio de envíos.", "Invalid Token" : "Marca incorrecta", "No file was uploaded. Unknown error" : "Non se enviou ningún ficheiro. Produciuse un erro descoñecido.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Falta o cartafol temporal", "Failed to write to disk" : "Produciuse un erro ao escribir no disco", "Not enough storage available" : "Non hai espazo de almacenamento abondo", + "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.", "Upload failed. Could not find uploaded file" : "O envío fracasou. Non foi posíbel atopar o ficheiro enviado", "Upload failed. Could not get file info." : "O envío fracasou. Non foi posíbel obter información do ficheiro.", "Invalid directory." : "O directorio é incorrecto.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoritos", "Home" : "Inicio", "Close" : "Pechar", + "Upload cancelled." : "Envío cancelado.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamaño total do ficheiro {size1} excede do límite de envío {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}", - "Upload cancelled." : "Envío cancelado.", "Could not get result from server." : "Non foi posíbel obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.", "Actions" : "Accións", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Non é posíbel determinar a data", "This operation is forbidden" : "Esta operación está prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador", - "Error moving file." : "Produciuse un erro ao mover o ficheiro.", - "Error moving file" : "Produciuse un erro ao mover o ficheiro", - "Error" : "Erro", - "{new_name} already exists" : "Xa existe un {new_name}", - "Could not rename file" : "Non foi posíbel renomear o ficheiro", - "Could not create file" : "Non foi posíbel crear o ficheiro", - "Could not create folder" : "Non foi posíbel crear o cartafol", - "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.", "No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»", "Name" : "Nome", "Size" : "Tamaño", @@ -75,10 +61,9 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Marcado como favorito", "Favorite" : "Favorito", - "Upload" : "Enviar", - "Text file" : "Ficheiro de texto", "Folder" : "Cartafol", "New folder" : "Novo cartafol", + "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas", "A new file or folder has been created" : "Creouse un novo ficheiro ou cartafol", "A file or folder has been changed" : "Cambiouse un ficheiro ou cartafol", @@ -94,14 +79,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s eliminado %1$s", "You restored %1$s" : "Vostede restaurou %1$s", "%2$s restored %1$s" : "%2$s restaurou %1$s", - "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado", - "%s could not be renamed" : "%s non pode cambiar de nome", "Upload (max. %s)" : "Envío (máx. %s)", "File handling" : "Manexo de ficheiro", "Maximum upload size" : "Tamaño máximo do envío", "max. possible: " : "máx. posíbel: ", "Save" : "Gardar", - "Can not be edited from here due to insufficient permissions." : "Non pode ser editado desde aquí por mor de falta de permisos.", "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Empregue esta ligazón para acceder aos seus ficheiros mediante WebDAV", @@ -115,6 +97,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", "Currently scanning" : "Análise actual", "No favorites" : "Non hai favoritos", - "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí" + "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí", + "Text file" : "Ficheiro de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index 386df1569a..73e6e523e4 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -2,13 +2,6 @@ "Storage not available" : "Almacenamento non dispoñíbel", "Storage invalid" : "Almacenamento incorrecto", "Unknown error" : "Produciuse un erro descoñecido", - "Could not move %s - File with this name already exists" : "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.", - "Could not move %s" : "Non foi posíbel mover %s", - "Permission denied" : "Permiso denegado", - "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.", - "The name %s is already used in the folder %s. Please choose a different name." : "Xa existe o nome %s no cartafol %s. Escolla outro nome.", - "Error when creating the file" : "Produciuse un erro ao crear o ficheiro", - "Error when creating the folder" : "Produciuse un erro ao crear o cartafol", "Unable to set upload directory." : "Non é posíbel configurar o directorio de envíos.", "Invalid Token" : "Marca incorrecta", "No file was uploaded. Unknown error" : "Non se enviou ningún ficheiro. Produciuse un erro descoñecido.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Falta o cartafol temporal", "Failed to write to disk" : "Produciuse un erro ao escribir no disco", "Not enough storage available" : "Non hai espazo de almacenamento abondo", + "The target folder has been moved or deleted." : "O cartafol de destino foi movido ou eliminado.", "Upload failed. Could not find uploaded file" : "O envío fracasou. Non foi posíbel atopar o ficheiro enviado", "Upload failed. Could not get file info." : "O envío fracasou. Non foi posíbel obter información do ficheiro.", "Invalid directory." : "O directorio é incorrecto.", @@ -28,10 +22,10 @@ "Favorites" : "Favoritos", "Home" : "Inicio", "Close" : "Pechar", + "Upload cancelled." : "Envío cancelado.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamaño total do ficheiro {size1} excede do límite de envío {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}", - "Upload cancelled." : "Envío cancelado.", "Could not get result from server." : "Non foi posíbel obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "O envío do ficheiro está en proceso. Saír agora da páxina cancelará o envío.", "Actions" : "Accións", @@ -44,14 +38,6 @@ "Unable to determine date" : "Non é posíbel determinar a data", "This operation is forbidden" : "Esta operación está prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio non está dispoñíbel, comprobe os rexistros ou póñase en contacto co administrador", - "Error moving file." : "Produciuse un erro ao mover o ficheiro.", - "Error moving file" : "Produciuse un erro ao mover o ficheiro", - "Error" : "Erro", - "{new_name} already exists" : "Xa existe un {new_name}", - "Could not rename file" : "Non foi posíbel renomear o ficheiro", - "Could not create file" : "Non foi posíbel crear o ficheiro", - "Could not create folder" : "Non foi posíbel crear o cartafol", - "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.", "No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»", "Name" : "Nome", "Size" : "Tamaño", @@ -73,10 +59,9 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Marcado como favorito", "Favorite" : "Favorito", - "Upload" : "Enviar", - "Text file" : "Ficheiro de texto", "Folder" : "Cartafol", "New folder" : "Novo cartafol", + "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Produciuse un erro ao tentar actualizar as etiquetas", "A new file or folder has been created" : "Creouse un novo ficheiro ou cartafol", "A file or folder has been changed" : "Cambiouse un ficheiro ou cartafol", @@ -92,14 +77,11 @@ "%2$s deleted %1$s" : "%2$s eliminado %1$s", "You restored %1$s" : "Vostede restaurou %1$s", "%2$s restored %1$s" : "%2$s restaurou %1$s", - "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado", - "%s could not be renamed" : "%s non pode cambiar de nome", "Upload (max. %s)" : "Envío (máx. %s)", "File handling" : "Manexo de ficheiro", "Maximum upload size" : "Tamaño máximo do envío", "max. possible: " : "máx. posíbel: ", "Save" : "Gardar", - "Can not be edited from here due to insufficient permissions." : "Non pode ser editado desde aquí por mor de falta de permisos.", "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Empregue esta ligazón para acceder aos seus ficheiros mediante WebDAV", @@ -113,6 +95,7 @@ "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", "Currently scanning" : "Análise actual", "No favorites" : "Non hai favoritos", - "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí" + "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí", + "Text file" : "Ficheiro de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index 1eaf54aad7..389fe8e4d2 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -2,8 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "שגיאה בלתי ידועה", - "Could not move %s - File with this name already exists" : "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים", - "Could not move %s" : "לא ניתן להעביר את %s", "No file was uploaded. Unknown error" : "לא הועלה קובץ. טעות בלתי מזוהה.", "There is no error, the file uploaded with success" : "לא התרחשה שגיאה, הקובץ הועלה בהצלחה", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:", @@ -29,8 +27,6 @@ OC.L10N.register( "Details" : "פרטים", "Select" : "בחר", "Pending" : "ממתין", - "Error" : "שגיאה", - "{new_name} already exists" : "{new_name} כבר קיים", "Name" : "שם", "Size" : "גודל", "Modified" : "זמן שינוי", @@ -38,10 +34,9 @@ OC.L10N.register( "File name cannot be empty." : "שם קובץ אינו יכול להיות ריק", "Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)", "Favorite" : "מועדף", - "Upload" : "העלאה", - "Text file" : "קובץ טקסט", "Folder" : "תיקייה", "New folder" : "תיקייה חדשה", + "Upload" : "העלאה", "A new file or folder has been created" : "קובץ או תיקייה חדשים נוצרו", "A file or folder has been changed" : "קובץ או תיקייה שונו", "A file or folder has been deleted" : "קובץ או תיקייה נמחקו", @@ -62,6 +57,7 @@ OC.L10N.register( "Cancel upload" : "ביטול ההעלאה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", - "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין." + "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.", + "Text file" : "קובץ טקסט" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index fe56eef25c..c4866aea3c 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -1,7 +1,5 @@ { "translations": { "Unknown error" : "שגיאה בלתי ידועה", - "Could not move %s - File with this name already exists" : "לא ניתן להעביר את %s - קובץ בשם הזה כבר קיים", - "Could not move %s" : "לא ניתן להעביר את %s", "No file was uploaded. Unknown error" : "לא הועלה קובץ. טעות בלתי מזוהה.", "There is no error, the file uploaded with success" : "לא התרחשה שגיאה, הקובץ הועלה בהצלחה", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "הקבצים שנשלחו חורגים מהגודל שצוין בהגדרה upload_max_filesize שבקובץ php.ini:", @@ -27,8 +25,6 @@ "Details" : "פרטים", "Select" : "בחר", "Pending" : "ממתין", - "Error" : "שגיאה", - "{new_name} already exists" : "{new_name} כבר קיים", "Name" : "שם", "Size" : "גודל", "Modified" : "זמן שינוי", @@ -36,10 +32,9 @@ "File name cannot be empty." : "שם קובץ אינו יכול להיות ריק", "Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)", "Favorite" : "מועדף", - "Upload" : "העלאה", - "Text file" : "קובץ טקסט", "Folder" : "תיקייה", "New folder" : "תיקייה חדשה", + "Upload" : "העלאה", "A new file or folder has been created" : "קובץ או תיקייה חדשים נוצרו", "A file or folder has been changed" : "קובץ או תיקייה שונו", "A file or folder has been deleted" : "קובץ או תיקייה נמחקו", @@ -60,6 +55,7 @@ "Cancel upload" : "ביטול ההעלאה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", - "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין." + "Files are being scanned, please wait." : "הקבצים נסרקים, נא להמתין.", + "Text file" : "קובץ טקסט" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/hi.js b/apps/files/l10n/hi.js index 2a546af9b1..2de5b85e16 100644 --- a/apps/files/l10n/hi.js +++ b/apps/files/l10n/hi.js @@ -4,9 +4,8 @@ OC.L10N.register( "Files" : "फाइलें ", "Close" : "बंद करें ", "Details" : "विवरण ", - "Error" : "त्रुटि", - "Upload" : "अपलोड ", "New folder" : "नया फ़ोल्डर", + "Upload" : "अपलोड ", "Save" : "सहेजें", "Settings" : "सेटिंग्स" }, diff --git a/apps/files/l10n/hi.json b/apps/files/l10n/hi.json index 47830eca41..3bccaa2d9f 100644 --- a/apps/files/l10n/hi.json +++ b/apps/files/l10n/hi.json @@ -2,9 +2,8 @@ "Files" : "फाइलें ", "Close" : "बंद करें ", "Details" : "विवरण ", - "Error" : "त्रुटि", - "Upload" : "अपलोड ", "New folder" : "नया फ़ोल्डर", + "Upload" : "अपलोड ", "Save" : "सहेजें", "Settings" : "सेटिंग्स" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index d6e48d1da1..6f27879f12 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Pohrana nedostupna", "Storage invalid" : "Pohrana neispravna", "Unknown error" : "Nepoznata pogreška", - "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", - "Could not move %s" : "Nemoguće premjestiti %s", - "Permission denied" : "Nemate dozvolu", - "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u mapi %s. Molimo odaberite drukčiji naziv.", - "Error when creating the file" : "Pogreška pri kreiranju datoteke", - "Error when creating the folder" : "Pogreška pri kreiranju mape", "Unable to set upload directory." : "Postavka učitavanja direktorija nije moguća", "Invalid Token" : "Neispravan token", "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Pogreška nepoznata.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Nedostaje privremena mapa", "Failed to write to disk" : "Zapisivanje na disk nije uspjelo", "Not enough storage available" : "Prostor za pohranu nedostatan", + "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.", "Upload failed. Could not find uploaded file" : "Učitavanje neuspješno. Nije emoguće pronaći učitanu dataoteku", "Upload failed. Could not get file info." : "Učitavanje neuspješno. Nije moguće dohvatiti informacije o datoteci", "Invalid directory." : "Neispravan direktorij", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoriti", "Home" : "Kuća", "Close" : "Zatvorite", + "Upload cancelled." : "Učitavanje je prekinuto.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", - "Upload cancelled." : "Učitavanje je prekinuto.", "Could not get result from server." : "Nemoguće dobiti rezultat od poslužitelja.", "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Selektiraj", "Pending" : "Na čekanju", "Unable to determine date" : "Nemogucnost odredjivanja datuma", - "Error moving file." : "Pogrešno premještanje datoteke", - "Error moving file" : "Pogrešno premještanje datoteke", - "Error" : "Pogreška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Datoteku nije moguće preimenovati", - "Could not create file" : "Datoteku nije moguće kreirati", - "Could not create folder" : "Mapu nije moguće kreirati", - "Error deleting file." : "Pogrešno brisanje datoteke", "No entries in this folder match '{filter}'" : "Nema zapisa u ovom folderu match '{filter}'", "Name" : "Naziv", "Size" : "Veličina", @@ -68,10 +54,9 @@ OC.L10N.register( "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", "Favorited" : "Favoritovan", "Favorite" : "Favorit", - "Upload" : "Učitavanje", - "Text file" : "Tekstualna datoteka", "Folder" : "Mapa", "New folder" : "Nova mapa", + "Upload" : "Učitavanje", "A new file or folder has been created" : "Nova datoteka ili nova mapa su kreirani", "A file or folder has been changed" : "Datoteka ili mapa su promijenjeni", "A file or folder has been deleted" : "Datoteka ili mapa su izbrisani", @@ -85,8 +70,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s je izbrisao %1$s", "You restored %1$s" : "Vraćeno %1$s", "%2$s restored %1$s" : "%2$s vraćeno %1$s", - "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", - "%s could not be renamed" : "%s nije moguće preimenovati", "Upload (max. %s)" : "Prijenos (max. %s)", "File handling" : "Obrada datoteke", "Maximum upload size" : "Maksimalna veličina učitanog sadržaja", @@ -104,6 +87,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", "Currently scanning" : "Provjera u tijeku", "No favorites" : "Nema favorita", - "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje" + "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje", + "Text file" : "Tekstualna datoteka" }, "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"); diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index 99f7737b66..9377b55ef6 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -2,13 +2,6 @@ "Storage not available" : "Pohrana nedostupna", "Storage invalid" : "Pohrana neispravna", "Unknown error" : "Nepoznata pogreška", - "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", - "Could not move %s" : "Nemoguće premjestiti %s", - "Permission denied" : "Nemate dozvolu", - "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u mapi %s. Molimo odaberite drukčiji naziv.", - "Error when creating the file" : "Pogreška pri kreiranju datoteke", - "Error when creating the folder" : "Pogreška pri kreiranju mape", "Unable to set upload directory." : "Postavka učitavanja direktorija nije moguća", "Invalid Token" : "Neispravan token", "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Pogreška nepoznata.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Nedostaje privremena mapa", "Failed to write to disk" : "Zapisivanje na disk nije uspjelo", "Not enough storage available" : "Prostor za pohranu nedostatan", + "The target folder has been moved or deleted." : "Ciljna mapa je premještena ili izbrisana.", "Upload failed. Could not find uploaded file" : "Učitavanje neuspješno. Nije emoguće pronaći učitanu dataoteku", "Upload failed. Could not get file info." : "Učitavanje neuspješno. Nije moguće dohvatiti informacije o datoteci", "Invalid directory." : "Neispravan direktorij", @@ -28,10 +22,10 @@ "Favorites" : "Favoriti", "Home" : "Kuća", "Close" : "Zatvorite", + "Upload cancelled." : "Učitavanje je prekinuto.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", - "Upload cancelled." : "Učitavanje je prekinuto.", "Could not get result from server." : "Nemoguće dobiti rezultat od poslužitelja.", "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u tijeku. Napuštanje stranice prekinut će učitavanje.", "Actions" : "Radnje", @@ -42,14 +36,6 @@ "Select" : "Selektiraj", "Pending" : "Na čekanju", "Unable to determine date" : "Nemogucnost odredjivanja datuma", - "Error moving file." : "Pogrešno premještanje datoteke", - "Error moving file" : "Pogrešno premještanje datoteke", - "Error" : "Pogreška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Datoteku nije moguće preimenovati", - "Could not create file" : "Datoteku nije moguće kreirati", - "Could not create folder" : "Mapu nije moguće kreirati", - "Error deleting file." : "Pogrešno brisanje datoteke", "No entries in this folder match '{filter}'" : "Nema zapisa u ovom folderu match '{filter}'", "Name" : "Naziv", "Size" : "Veličina", @@ -66,10 +52,9 @@ "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", "Favorited" : "Favoritovan", "Favorite" : "Favorit", - "Upload" : "Učitavanje", - "Text file" : "Tekstualna datoteka", "Folder" : "Mapa", "New folder" : "Nova mapa", + "Upload" : "Učitavanje", "A new file or folder has been created" : "Nova datoteka ili nova mapa su kreirani", "A file or folder has been changed" : "Datoteka ili mapa su promijenjeni", "A file or folder has been deleted" : "Datoteka ili mapa su izbrisani", @@ -83,8 +68,6 @@ "%2$s deleted %1$s" : "%2$s je izbrisao %1$s", "You restored %1$s" : "Vraćeno %1$s", "%2$s restored %1$s" : "%2$s vraćeno %1$s", - "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", - "%s could not be renamed" : "%s nije moguće preimenovati", "Upload (max. %s)" : "Prijenos (max. %s)", "File handling" : "Obrada datoteke", "Maximum upload size" : "Maksimalna veličina učitanog sadržaja", @@ -102,6 +85,7 @@ "Files are being scanned, please wait." : "Datoteke se provjeravaju, molimo pričekajte.", "Currently scanning" : "Provjera u tijeku", "No favorites" : "Nema favorita", - "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje" + "Files and folders you mark as favorite will show up here" : "Fajlovi i folderi koje oznacite kao favorite ce se prikazati ovdje", + "Text file" : "Tekstualna datoteka" },"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" } \ No newline at end of file diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js index 5eff7a8f84..b6ed823de6 100644 --- a/apps/files/l10n/hu_HU.js +++ b/apps/files/l10n/hu_HU.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "A tároló elérhetetlen.", "Storage invalid" : "A tároló érvénytelen", "Unknown error" : "Ismeretlen hiba", - "Could not move %s - File with this name already exists" : "%s áthelyezése nem sikerült - már létezik másik fájl ezzel a névvel", - "Could not move %s" : "Nem sikerült %s áthelyezése", - "Permission denied" : "Engedély megtagadva ", - "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.", - "The name %s is already used in the folder %s. Please choose a different name." : "A %s név már létezik a %s mappában. Kérem válasszon másik nevet!", - "Error when creating the file" : "Hiba történt az állomány létrehozásakor", - "Error when creating the folder" : "Hiba történt a mappa létrehozásakor", "Unable to set upload directory." : "Nem található a mappa, ahova feltölteni szeretne.", "Invalid Token" : "Hibás token", "No file was uploaded. Unknown error" : "Nem történt feltöltés. Ismeretlen hiba", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Hiányzik egy ideiglenes mappa", "Failed to write to disk" : "Nem sikerült a lemezre történő írás", "Not enough storage available" : "Nincs elég szabad hely.", + "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.", "Upload failed. Could not find uploaded file" : "A feltöltés nem sikerült. Nem található a feltöltendő állomány.", "Upload failed. Could not get file info." : "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.", "Invalid directory." : "Érvénytelen mappa.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Kedvencek", "Home" : "Otthoni", "Close" : "Bezárás", + "Upload cancelled." : "A feltöltést megszakítottuk.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.", "Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.", - "Upload cancelled." : "A feltöltést megszakítottuk.", "Could not get result from server." : "A kiszolgálótól nem kapható meg a művelet eredménye.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.", "Actions" : "Műveletek", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Nem lehet meghatározni a dátumot", "This operation is forbidden" : "Tiltott művelet", "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort", - "Error moving file." : "Hiba történt a fájl áthelyezése közben.", - "Error moving file" : "Az állomány áthelyezése nem sikerült.", - "Error" : "Hiba", - "{new_name} already exists" : "{new_name} már létezik", - "Could not rename file" : "Az állomány nem nevezhető át", - "Could not create file" : "Az állomány nem hozható létre", - "Could not create folder" : "A mappa nem hozható létre", - "Error deleting file." : "Hiba a file törlése közben.", "No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a könyvtárban '{filter}'", "Name" : "Név", "Size" : "Méret", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Favorited" : "Kedvenc", "Favorite" : "Kedvenc", - "{newname} already exists" : "{newname} már létezik", - "Upload" : "Feltöltés", - "Text file" : "Szövegfájl", - "New text file.txt" : "Új szöveges fájl.txt", "Folder" : "Mappa", "New folder" : "Új mappa", + "{newname} already exists" : "{newname} már létezik", + "Upload" : "Feltöltés", "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket", "A new file or folder has been created" : "Új fájl vagy könyvtár létrehozása", "A file or folder has been changed" : "Fájl vagy könyvtár módosítása", @@ -99,15 +83,13 @@ OC.L10N.register( "Changed by %2$s" : "Megváltoztatta: %2$s", "Deleted by %2$s" : "Törölte: %2$s", "Restored by %2$s" : "Visszaállította: %2$s", - "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", - "%s could not be renamed" : "%s átnevezése nem sikerült", "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-mel ez az érték életbe lépése mentés után akár 5 percbe is telhet.", "Save" : "Mentés", - "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen jogosultság miatt ", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.", + "Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.", "Settings" : "Beállítások", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Ezt a címet használja, ha WebDAV-on keresztül szeretné elérni a fájljait", @@ -121,6 +103,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", "Currently scanning" : "Mappaellenőrzés: ", "No favorites" : "Nincsenek kedvencek", - "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg" + "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", + "Text file" : "Szövegfájl", + "New text file.txt" : "Új szöveges fájl.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json index da5eed0973..8b8fbbd9b5 100644 --- a/apps/files/l10n/hu_HU.json +++ b/apps/files/l10n/hu_HU.json @@ -2,13 +2,6 @@ "Storage not available" : "A tároló elérhetetlen.", "Storage invalid" : "A tároló érvénytelen", "Unknown error" : "Ismeretlen hiba", - "Could not move %s - File with this name already exists" : "%s áthelyezése nem sikerült - már létezik másik fájl ezzel a névvel", - "Could not move %s" : "Nem sikerült %s áthelyezése", - "Permission denied" : "Engedély megtagadva ", - "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.", - "The name %s is already used in the folder %s. Please choose a different name." : "A %s név már létezik a %s mappában. Kérem válasszon másik nevet!", - "Error when creating the file" : "Hiba történt az állomány létrehozásakor", - "Error when creating the folder" : "Hiba történt a mappa létrehozásakor", "Unable to set upload directory." : "Nem található a mappa, ahova feltölteni szeretne.", "Invalid Token" : "Hibás token", "No file was uploaded. Unknown error" : "Nem történt feltöltés. Ismeretlen hiba", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Hiányzik egy ideiglenes mappa", "Failed to write to disk" : "Nem sikerült a lemezre történő írás", "Not enough storage available" : "Nincs elég szabad hely.", + "The target folder has been moved or deleted." : "A célmappa törlődött, vagy áthelyezésre került.", "Upload failed. Could not find uploaded file" : "A feltöltés nem sikerült. Nem található a feltöltendő állomány.", "Upload failed. Could not get file info." : "A feltöltés nem sikerült. Az állományt leíró információk nem érhetők el.", "Invalid directory." : "Érvénytelen mappa.", @@ -28,10 +22,10 @@ "Favorites" : "Kedvencek", "Home" : "Otthoni", "Close" : "Bezárás", + "Upload cancelled." : "A feltöltést megszakítottuk.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.", "Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.", - "Upload cancelled." : "A feltöltést megszakítottuk.", "Could not get result from server." : "A kiszolgálótól nem kapható meg a művelet eredménye.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fájlfeltöltés van folyamatban. Az oldal elhagyása megszakítja a feltöltést.", "Actions" : "Műveletek", @@ -44,14 +38,6 @@ "Unable to determine date" : "Nem lehet meghatározni a dátumot", "This operation is forbidden" : "Tiltott művelet", "This directory is unavailable, please check the logs or contact the administrator" : "Ez a könyvtár nem elérhető, kérem nézze meg a naplófájlokat vagy keresse az adminisztrátort", - "Error moving file." : "Hiba történt a fájl áthelyezése közben.", - "Error moving file" : "Az állomány áthelyezése nem sikerült.", - "Error" : "Hiba", - "{new_name} already exists" : "{new_name} már létezik", - "Could not rename file" : "Az állomány nem nevezhető át", - "Could not create file" : "Az állomány nem hozható létre", - "Could not create folder" : "A mappa nem hozható létre", - "Error deleting file." : "Hiba a file törlése közben.", "No entries in this folder match '{filter}'" : "Nincsenek egyező bejegyzések ebben a könyvtárban '{filter}'", "Name" : "Név", "Size" : "Méret", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Favorited" : "Kedvenc", "Favorite" : "Kedvenc", - "{newname} already exists" : "{newname} már létezik", - "Upload" : "Feltöltés", - "Text file" : "Szövegfájl", - "New text file.txt" : "Új szöveges fájl.txt", "Folder" : "Mappa", "New folder" : "Új mappa", + "{newname} already exists" : "{newname} már létezik", + "Upload" : "Feltöltés", "An error occurred while trying to update the tags" : "Hiba történt, miközben megpróbálta frissíteni a címkéket", "A new file or folder has been created" : "Új fájl vagy könyvtár létrehozása", "A file or folder has been changed" : "Fájl vagy könyvtár módosítása", @@ -97,15 +81,13 @@ "Changed by %2$s" : "Megváltoztatta: %2$s", "Deleted by %2$s" : "Törölte: %2$s", "Restored by %2$s" : "Visszaállította: %2$s", - "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", - "%s could not be renamed" : "%s átnevezése nem sikerült", "Upload (max. %s)" : "Feltöltés (max.: %s)", "File handling" : "Fájlkezelés", "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM-mel ez az érték életbe lépése mentés után akár 5 percbe is telhet.", "Save" : "Mentés", - "Can not be edited from here due to insufficient permissions." : "Innen nem lehet szerkeszteni az elégtelen jogosultság miatt ", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM-mel akár 5 percbe is telhet, míg ez a beállítás érvénybe lép.", + "Missing permissions to edit from here." : "Innen nem lehet szerkeszteni hiányzó jogosultság miatt.", "Settings" : "Beállítások", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Ezt a címet használja, ha WebDAV-on keresztül szeretné elérni a fájljait", @@ -119,6 +101,8 @@ "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", "Currently scanning" : "Mappaellenőrzés: ", "No favorites" : "Nincsenek kedvencek", - "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg" + "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg", + "Text file" : "Szövegfájl", + "New text file.txt" : "Új szöveges fájl.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js index 62bc84d6c7..ecf99c1077 100644 --- a/apps/files/l10n/hy.js +++ b/apps/files/l10n/hy.js @@ -2,6 +2,7 @@ OC.L10N.register( "files", { "Files" : "Ֆայլեր", + "All files" : "Բոլոր ֆայլերը", "Close" : "Փակել", "Download" : "Բեռնել", "Rename" : "Վերանվանել", @@ -9,10 +10,17 @@ OC.L10N.register( "Select" : "Նշել", "Name" : "Անուն", "Size" : "Չափս", + "Modified" : "Փոփոխված", + "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"], + "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"], + "{dirs} and {files}" : "{dirs} և {files}", "New" : "Նոր", + "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"], "Folder" : "Պանակ", "New folder" : "Նոր պանակ", "Save" : "Պահպանել", - "Select all" : "Նշել բոլորը" + "Select all" : "Նշել բոլորը", + "Text file" : "Տեքստ ֆայլ", + "New text file.txt" : "Նոր տեքստ ֆայլ.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json index c5afd30627..8b23697b4a 100644 --- a/apps/files/l10n/hy.json +++ b/apps/files/l10n/hy.json @@ -1,5 +1,6 @@ { "translations": { "Files" : "Ֆայլեր", + "All files" : "Բոլոր ֆայլերը", "Close" : "Փակել", "Download" : "Բեռնել", "Rename" : "Վերանվանել", @@ -7,10 +8,17 @@ "Select" : "Նշել", "Name" : "Անուն", "Size" : "Չափս", + "Modified" : "Փոփոխված", + "_%n folder_::_%n folders_" : ["%n պանակ","%n պանակ"], + "_%n file_::_%n files_" : ["%n ֆայլ","%n ֆայլ"], + "{dirs} and {files}" : "{dirs} և {files}", "New" : "Նոր", + "_%n byte_::_%n bytes_" : ["%n բայտ","%n բայտ"], "Folder" : "Պանակ", "New folder" : "Նոր պանակ", "Save" : "Պահպանել", - "Select all" : "Նշել բոլորը" + "Select all" : "Նշել բոլորը", + "Text file" : "Տեքստ ֆայլ", + "New text file.txt" : "Նոր տեքստ ֆայլ.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js index 84f3b4d8c4..a1548e6b73 100644 --- a/apps/files/l10n/ia.js +++ b/apps/files/l10n/ia.js @@ -10,16 +10,14 @@ OC.L10N.register( "Close" : "Clauder", "Download" : "Discargar", "Delete" : "Deler", - "Error" : "Error", "Name" : "Nomine", "Size" : "Dimension", "Modified" : "Modificate", "New" : "Nove", "File name cannot be empty." : "Le nomine de file non pote esser vacue.", - "Upload" : "Incargar", - "Text file" : "File de texto", "Folder" : "Dossier", "New folder" : "Nove dossier", + "Upload" : "Incargar", "A new file or folder has been created" : "Un nove file o dossier ha essite create", "A file or folder has been changed" : "Un nove file o dossier ha essite modificate", "A file or folder has been deleted" : "Un nove file o dossier ha essite delite", @@ -37,6 +35,7 @@ OC.L10N.register( "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", "Settings" : "Configurationes", - "Upload too large" : "Incargamento troppo longe" + "Upload too large" : "Incargamento troppo longe", + "Text file" : "File de texto" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json index 2843f8789a..bbc3f4bc02 100644 --- a/apps/files/l10n/ia.json +++ b/apps/files/l10n/ia.json @@ -8,16 +8,14 @@ "Close" : "Clauder", "Download" : "Discargar", "Delete" : "Deler", - "Error" : "Error", "Name" : "Nomine", "Size" : "Dimension", "Modified" : "Modificate", "New" : "Nove", "File name cannot be empty." : "Le nomine de file non pote esser vacue.", - "Upload" : "Incargar", - "Text file" : "File de texto", "Folder" : "Dossier", "New folder" : "Nove dossier", + "Upload" : "Incargar", "A new file or folder has been created" : "Un nove file o dossier ha essite create", "A file or folder has been changed" : "Un nove file o dossier ha essite modificate", "A file or folder has been deleted" : "Un nove file o dossier ha essite delite", @@ -35,6 +33,7 @@ "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", "Settings" : "Configurationes", - "Upload too large" : "Incargamento troppo longe" + "Upload too large" : "Incargamento troppo longe", + "Text file" : "File de texto" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index f02a6d79c4..93ec698cfa 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Penyimpanan tidak tersedia", "Storage invalid" : "Penyimpanan tidak sah", "Unknown error" : "Kesalahan tidak diketahui", - "Could not move %s - File with this name already exists" : "Tidak dapat memindahkan %s - Berkas dengan nama ini sudah ada", - "Could not move %s" : "Tidak dapat memindahkan %s", - "Permission denied" : "Perizinan ditolak", - "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nama %s sudah digunakan dalam folder %s. Silakan pilih nama yang berbeda.", - "Error when creating the file" : "Kesalahan saat membuat berkas", - "Error when creating the folder" : "Kesalahan saat membuat folder", "Unable to set upload directory." : "Tidak dapat mengatur folder unggah", "Invalid Token" : "Token tidak sah", "No file was uploaded. Unknown error" : "Tidak ada berkas yang diunggah. Kesalahan tidak dikenal.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Folder sementara tidak ada", "Failed to write to disk" : "Gagal menulis ke disk", "Not enough storage available" : "Ruang penyimpanan tidak mencukupi", + "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.", "Upload failed. Could not find uploaded file" : "Unggah gagal. Tidak menemukan berkas yang akan diunggah", "Upload failed. Could not get file info." : "Unggah gagal. Tidak mendapatkan informasi berkas.", "Invalid directory." : "Direktori tidak valid.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favorit", "Home" : "Rumah", "Close" : "Tutup", + "Upload cancelled." : "Pengunggahan dibatalkan.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte", "Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa", - "Upload cancelled." : "Pengunggahan dibatalkan.", "Could not get result from server." : "Tidak mendapatkan hasil dari server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.", "Actions" : "Tindakan", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Tidak dapat menentukan tanggal", "This operation is forbidden" : "Operasi ini dilarang", "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak", - "Error moving file." : "Kesalahan saat memindahkan berkas.", - "Error moving file" : "Kesalahan saat memindahkan berkas", - "Error" : "Kesalahan ", - "{new_name} already exists" : "{new_name} sudah ada", - "Could not rename file" : "Tidak dapat mengubah nama berkas", - "Could not create file" : "Tidak dapat membuat berkas", - "Could not create folder" : "Tidak dapat membuat folder", - "Error deleting file." : "Kesalahan saat menghapus berkas.", "No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'", "Name" : "Nama", "Size" : "Ukuran", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte"], "Favorited" : "Difavoritkan", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} sudah ada", - "Upload" : "Unggah", - "Text file" : "Berkas teks", - "New text file.txt" : "Teks baru file.txt", "Folder" : "Folder", "New folder" : "Map baru", + "{newname} already exists" : "{newname} sudah ada", + "Upload" : "Unggah", "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label", "A new file or folder has been created" : "Sebuah berkas atau folder baru telah dibuat", "A file or folder has been changed" : "Sebuah berkas atau folder telah diubah", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Diubah oleh %2$s", "Deleted by %2$s" : "Dihapus oleh %2$s", "Restored by %2$s" : "Dipulihkan oleh %2$s", - "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", - "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", "File handling" : "Penanganan berkas", "Maximum upload size" : "Ukuran pengunggahan maksimum", "max. possible: " : "Kemungkinan maks.:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Dengan PHP-FPM, nilai ini bisa memerlukan waktu hingga 5 menit untuk berlaku setelah penyimpanan.", "Save" : "Simpan", - "Can not be edited from here due to insufficient permissions." : "Tidak dapat disunting dari sini karena tidak memiliki izin.", "Settings" : "Pengaturan", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Gunakan alamat ini untuk mengakses Berkas via WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", "Currently scanning" : "Pemindaian terbaru", "No favorites" : "Tidak ada favorit", - "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini." + "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.", + "Text file" : "Berkas teks", + "New text file.txt" : "Teks baru file.txt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index 773f6b8f5a..dca3e7bd16 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -2,13 +2,6 @@ "Storage not available" : "Penyimpanan tidak tersedia", "Storage invalid" : "Penyimpanan tidak sah", "Unknown error" : "Kesalahan tidak diketahui", - "Could not move %s - File with this name already exists" : "Tidak dapat memindahkan %s - Berkas dengan nama ini sudah ada", - "Could not move %s" : "Tidak dapat memindahkan %s", - "Permission denied" : "Perizinan ditolak", - "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.", - "The name %s is already used in the folder %s. Please choose a different name." : "Nama %s sudah digunakan dalam folder %s. Silakan pilih nama yang berbeda.", - "Error when creating the file" : "Kesalahan saat membuat berkas", - "Error when creating the folder" : "Kesalahan saat membuat folder", "Unable to set upload directory." : "Tidak dapat mengatur folder unggah", "Invalid Token" : "Token tidak sah", "No file was uploaded. Unknown error" : "Tidak ada berkas yang diunggah. Kesalahan tidak dikenal.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Folder sementara tidak ada", "Failed to write to disk" : "Gagal menulis ke disk", "Not enough storage available" : "Ruang penyimpanan tidak mencukupi", + "The target folder has been moved or deleted." : "Folder tujuan telah dipindahkan atau dihapus.", "Upload failed. Could not find uploaded file" : "Unggah gagal. Tidak menemukan berkas yang akan diunggah", "Upload failed. Could not get file info." : "Unggah gagal. Tidak mendapatkan informasi berkas.", "Invalid directory." : "Direktori tidak valid.", @@ -28,10 +22,10 @@ "Favorites" : "Favorit", "Home" : "Rumah", "Close" : "Tutup", + "Upload cancelled." : "Pengunggahan dibatalkan.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte", "Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa", - "Upload cancelled." : "Pengunggahan dibatalkan.", "Could not get result from server." : "Tidak mendapatkan hasil dari server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Berkas sedang diunggah. Meninggalkan halaman ini akan membatalkan proses.", "Actions" : "Tindakan", @@ -44,14 +38,6 @@ "Unable to determine date" : "Tidak dapat menentukan tanggal", "This operation is forbidden" : "Operasi ini dilarang", "This directory is unavailable, please check the logs or contact the administrator" : "Direktori ini tidak tersedia, silakan periksa log atau hubungi kontak", - "Error moving file." : "Kesalahan saat memindahkan berkas.", - "Error moving file" : "Kesalahan saat memindahkan berkas", - "Error" : "Kesalahan ", - "{new_name} already exists" : "{new_name} sudah ada", - "Could not rename file" : "Tidak dapat mengubah nama berkas", - "Could not create file" : "Tidak dapat membuat berkas", - "Could not create folder" : "Tidak dapat membuat folder", - "Error deleting file." : "Kesalahan saat menghapus berkas.", "No entries in this folder match '{filter}'" : "Tidak ada entri di folder ini yang cocok dengan '{filter}'", "Name" : "Nama", "Size" : "Ukuran", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n byte"], "Favorited" : "Difavoritkan", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} sudah ada", - "Upload" : "Unggah", - "Text file" : "Berkas teks", - "New text file.txt" : "Teks baru file.txt", "Folder" : "Folder", "New folder" : "Map baru", + "{newname} already exists" : "{newname} sudah ada", + "Upload" : "Unggah", "An error occurred while trying to update the tags" : "Terjadi kesalahan saat mencoba untuk memperbarui label", "A new file or folder has been created" : "Sebuah berkas atau folder baru telah dibuat", "A file or folder has been changed" : "Sebuah berkas atau folder telah diubah", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Diubah oleh %2$s", "Deleted by %2$s" : "Dihapus oleh %2$s", "Restored by %2$s" : "Dipulihkan oleh %2$s", - "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", - "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", "File handling" : "Penanganan berkas", "Maximum upload size" : "Ukuran pengunggahan maksimum", "max. possible: " : "Kemungkinan maks.:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Dengan PHP-FPM, nilai ini bisa memerlukan waktu hingga 5 menit untuk berlaku setelah penyimpanan.", "Save" : "Simpan", - "Can not be edited from here due to insufficient permissions." : "Tidak dapat disunting dari sini karena tidak memiliki izin.", "Settings" : "Pengaturan", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Gunakan alamat ini untuk mengakses Berkas via WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Berkas sedang dipindai, silakan tunggu.", "Currently scanning" : "Pemindaian terbaru", "No favorites" : "Tidak ada favorit", - "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini." + "Files and folders you mark as favorite will show up here" : "Berkas dan folder yang Anda tandai sebagai favorit akan ditampilkan disini.", + "Text file" : "Berkas teks", + "New text file.txt" : "Teks baru file.txt" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 780dbe4301..967e205145 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -1,8 +1,6 @@ OC.L10N.register( "files", { - "Could not move %s - File with this name already exists" : "Gat ekki fært %s - Skrá með þessu nafni er þegar til", - "Could not move %s" : "Gat ekki fært %s", "No file was uploaded. Unknown error" : "Engin skrá var send inn. Óþekkt villa.", "There is no error, the file uploaded with success" : "Engin villa, innsending heppnaðist", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Innsend skrá er stærri en upload_max stillingin í php.ini:", @@ -21,16 +19,13 @@ OC.L10N.register( "Delete" : "Eyða", "Select" : "Velja", "Pending" : "Bíður", - "Error" : "Villa", - "{new_name} already exists" : "{new_name} er þegar til", "Name" : "Nafn", "Size" : "Stærð", "Modified" : "Breytt", "New" : "Nýtt", "File name cannot be empty." : "Nafn skráar má ekki vera tómt", - "Upload" : "Senda inn", - "Text file" : "Texta skrá", "Folder" : "Mappa", + "Upload" : "Senda inn", "File handling" : "Meðhöndlun skrár", "Maximum upload size" : "Hámarks stærð innsendingar", "max. possible: " : "hámark mögulegt: ", @@ -42,6 +37,7 @@ OC.L10N.register( "Select all" : "Velja allt", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", - "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu." + "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.", + "Text file" : "Texta skrá" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index aed9568f7d..caff3b037d 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -1,6 +1,4 @@ { "translations": { - "Could not move %s - File with this name already exists" : "Gat ekki fært %s - Skrá með þessu nafni er þegar til", - "Could not move %s" : "Gat ekki fært %s", "No file was uploaded. Unknown error" : "Engin skrá var send inn. Óþekkt villa.", "There is no error, the file uploaded with success" : "Engin villa, innsending heppnaðist", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Innsend skrá er stærri en upload_max stillingin í php.ini:", @@ -19,16 +17,13 @@ "Delete" : "Eyða", "Select" : "Velja", "Pending" : "Bíður", - "Error" : "Villa", - "{new_name} already exists" : "{new_name} er þegar til", "Name" : "Nafn", "Size" : "Stærð", "Modified" : "Breytt", "New" : "Nýtt", "File name cannot be empty." : "Nafn skráar má ekki vera tómt", - "Upload" : "Senda inn", - "Text file" : "Texta skrá", "Folder" : "Mappa", + "Upload" : "Senda inn", "File handling" : "Meðhöndlun skrár", "Maximum upload size" : "Hámarks stærð innsendingar", "max. possible: " : "hámark mögulegt: ", @@ -40,6 +35,7 @@ "Select all" : "Velja allt", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", - "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu." + "Files are being scanned, please wait." : "Verið er að skima skrár, vinsamlegast hinkraðu.", + "Text file" : "Texta skrá" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" } \ No newline at end of file diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index c8286c66a5..93a013492a 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Archiviazione non disponibile", "Storage invalid" : "Archiviazione non valida", "Unknown error" : "Errore sconosciuto", - "Could not move %s - File with this name already exists" : "Impossibile spostare %s - un file con questo nome esiste già", - "Could not move %s" : "Impossibile spostare %s", - "Permission denied" : "Permesso negato", - "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.", - "The name %s is already used in the folder %s. Please choose a different name." : "Il nome %s è attualmente in uso nella cartella %s. Scegli un nome diverso.", - "Error when creating the file" : "Errore durante la creazione del file", - "Error when creating the folder" : "Errore durante la creazione della cartella", "Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.", "Invalid Token" : "Token non valido", "No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Manca una cartella temporanea", "Failed to write to disk" : "Scrittura su disco non riuscita", "Not enough storage available" : "Spazio di archiviazione insufficiente", + "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.", "Upload failed. Could not find uploaded file" : "Caricamento non riuscito. Impossibile trovare il file caricato.", "Upload failed. Could not get file info." : "Caricamento non riuscito. Impossibile ottenere informazioni sul file.", "Invalid directory." : "Cartella non valida.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Preferiti", "Home" : "Home", "Close" : "Chiudi", + "Upload cancelled." : "Caricamento annullato.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", "Total file size {size1} exceeds upload limit {size2}" : "La dimensione totale del file {size1} supera il limite di caricamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", - "Upload cancelled." : "Caricamento annullato.", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "Actions" : "Azioni", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Impossibile determinare la data", "This operation is forbidden" : "Questa operazione è vietata", "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore", - "Error moving file." : "Errore durante lo spostamento del file.", - "Error moving file" : "Errore durante lo spostamento del file", - "Error" : "Errore", - "{new_name} already exists" : "{new_name} esiste già", - "Could not rename file" : "Impossibile rinominare il file", - "Could not create file" : "Impossibile creare il file", - "Could not create folder" : "Impossibile creare la cartella", - "Error deleting file." : "Errore durante l'eliminazione del file.", + "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già", + "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"", + "{newName} already exists" : "{newName} esiste già", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.", + "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già", + "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già", + "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", "Name" : "Nome", "Size" : "Dimensione", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", - "{newname} already exists" : "{newname} esiste già", - "Upload" : "Carica", - "Text file" : "File di testo", - "New text file.txt" : "Nuovo file di testo.txt", "Folder" : "Cartella", "New folder" : "Nuova cartella", + "{newname} already exists" : "{newname} esiste già", + "Upload" : "Carica", "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette", "A new file or folder has been created" : "Un nuovo file o cartella è stato creato", "A file or folder has been changed" : "Un file o una cartella è stato modificato", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Modificata da %2$s", "Deleted by %2$s" : "Eliminata da %2$s", "Restored by %2$s" : "Ripristinata da %2$s", - "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", - "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", "Maximum upload size" : "Dimensione massima caricamento", "max. possible: " : "numero mass.: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM questo valore potrebbe richiedere fino a 5 minuti perché abbia effetto dopo il salvataggio.", "Save" : "Salva", - "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.", + "Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.", "Settings" : "Impostazioni", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilizza questo indirizzo per accedere ai tuoi file con WebDAV", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", "Currently scanning" : "Scansione in corso", "No favorites" : "Nessun preferito", - "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui" + "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", + "Text file" : "File di testo", + "New text file.txt" : "Nuovo file di testo.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 6f6092c5c1..25d3834b0a 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -2,13 +2,6 @@ "Storage not available" : "Archiviazione non disponibile", "Storage invalid" : "Archiviazione non valida", "Unknown error" : "Errore sconosciuto", - "Could not move %s - File with this name already exists" : "Impossibile spostare %s - un file con questo nome esiste già", - "Could not move %s" : "Impossibile spostare %s", - "Permission denied" : "Permesso negato", - "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.", - "The name %s is already used in the folder %s. Please choose a different name." : "Il nome %s è attualmente in uso nella cartella %s. Scegli un nome diverso.", - "Error when creating the file" : "Errore durante la creazione del file", - "Error when creating the folder" : "Errore durante la creazione della cartella", "Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.", "Invalid Token" : "Token non valido", "No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Manca una cartella temporanea", "Failed to write to disk" : "Scrittura su disco non riuscita", "Not enough storage available" : "Spazio di archiviazione insufficiente", + "The target folder has been moved or deleted." : "La cartella di destinazione è stata spostata o eliminata.", "Upload failed. Could not find uploaded file" : "Caricamento non riuscito. Impossibile trovare il file caricato.", "Upload failed. Could not get file info." : "Caricamento non riuscito. Impossibile ottenere informazioni sul file.", "Invalid directory." : "Cartella non valida.", @@ -28,10 +22,10 @@ "Favorites" : "Preferiti", "Home" : "Home", "Close" : "Chiudi", + "Upload cancelled." : "Caricamento annullato.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", "Total file size {size1} exceeds upload limit {size2}" : "La dimensione totale del file {size1} supera il limite di caricamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", - "Upload cancelled." : "Caricamento annullato.", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "Actions" : "Azioni", @@ -44,14 +38,17 @@ "Unable to determine date" : "Impossibile determinare la data", "This operation is forbidden" : "Questa operazione è vietata", "This directory is unavailable, please check the logs or contact the administrator" : "Questa cartella non è disponibile, controlla i log o contatta l'amministratore", - "Error moving file." : "Errore durante lo spostamento del file.", - "Error moving file" : "Errore durante lo spostamento del file", - "Error" : "Errore", - "{new_name} already exists" : "{new_name} esiste già", - "Could not rename file" : "Impossibile rinominare il file", - "Could not create file" : "Impossibile creare il file", - "Could not create folder" : "Impossibile creare la cartella", - "Error deleting file." : "Errore durante l'eliminazione del file.", + "Could not move \"{file}\", target exists" : "Impossibile spostare \"{file}\", la destinazione esiste già", + "Could not move \"{file}\"" : "Impossibile spostare \"{file}\"", + "{newName} already exists" : "{newName} esiste già", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossibile rinominare \"{fileName}\", non esiste più", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Il nome \"{targetName}\" è attualmente in uso nella cartella \"{dir}\". Scegli un nome diverso.", + "Could not rename \"{fileName}\"" : "Impossibile rinominare \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossibile creare il file \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossibile creare il file \"{file}\" poiché esiste già", + "Could not create folder \"{dir}\"" : "Impossibile creare la cartella \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossibile creare la cartella \"{dir}\" poiché esiste già", + "Error deleting file \"{fileName}\"." : "Errore durante l'eliminazione del file \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", "Name" : "Nome", "Size" : "Dimensione", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Favorited" : "Preferiti", "Favorite" : "Preferito", - "{newname} already exists" : "{newname} esiste già", - "Upload" : "Carica", - "Text file" : "File di testo", - "New text file.txt" : "Nuovo file di testo.txt", "Folder" : "Cartella", "New folder" : "Nuova cartella", + "{newname} already exists" : "{newname} esiste già", + "Upload" : "Carica", "An error occurred while trying to update the tags" : "Si è verificato un errore durante il tentativo di aggiornare le etichette", "A new file or folder has been created" : "Un nuovo file o cartella è stato creato", "A file or folder has been changed" : "Un file o una cartella è stato modificato", @@ -97,15 +92,13 @@ "Changed by %2$s" : "Modificata da %2$s", "Deleted by %2$s" : "Eliminata da %2$s", "Restored by %2$s" : "Ripristinata da %2$s", - "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", - "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", "Maximum upload size" : "Dimensione massima caricamento", "max. possible: " : "numero mass.: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Con PHP-FPM questo valore potrebbe richiedere fino a 5 minuti perché abbia effetto dopo il salvataggio.", "Save" : "Salva", - "Can not be edited from here due to insufficient permissions." : "Non può essere modificato da qui a causa della mancanza di permessi.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM potrebbe richiedere 5 minuti perché le modifiche siano applicate.", + "Missing permissions to edit from here." : "Permessi mancanti per modificare da qui.", "Settings" : "Impostazioni", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilizza questo indirizzo per accedere ai tuoi file con WebDAV", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", "Currently scanning" : "Scansione in corso", "No favorites" : "Nessun preferito", - "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui" + "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui", + "Text file" : "File di testo", + "New text file.txt" : "Nuovo file di testo.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 052562d13e..cd6f45f27b 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "ストレージが利用できません", "Storage invalid" : "ストレージが無効です", "Unknown error" : "不明なエラー", - "Could not move %s - File with this name already exists" : "%s を移動できませんでした ― この名前のファイルはすでに存在します", - "Could not move %s" : "%s を移動できませんでした", - "Permission denied" : "アクセス拒否", - "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。", - "The name %s is already used in the folder %s. Please choose a different name." : "%s はフォルダー %s ですでに使われています。別の名前を選択してください。", - "Error when creating the file" : "ファイルの生成エラー", - "Error when creating the folder" : "フォルダーの生成エラー", "Unable to set upload directory." : "アップロードディレクトリを設定できません。", "Invalid Token" : "無効なトークン", "No file was uploaded. Unknown error" : "ファイルは何もアップロードされていません。不明なエラー", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "一時保存フォルダーが見つかりません", "Failed to write to disk" : "ディスクへの書き込みに失敗しました", "Not enough storage available" : "ストレージに十分な空き容量がありません", + "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。", "Upload failed. Could not find uploaded file" : "アップロードに失敗しました。アップロード済みのファイルを見つけることができませんでした。", "Upload failed. Could not get file info." : "アップロードに失敗しました。ファイル情報を取得できませんでした。", "Invalid directory." : "無効なディレクトリです。", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "更新日不明", "This operation is forbidden" : "この操作は禁止されています", "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。", - "Error moving file." : "ファイル移動でエラー", - "Error moving file" : "ファイルの移動エラー", - "Error" : "エラー", - "{new_name} already exists" : "{new_name} はすでに存在します", - "Could not rename file" : "ファイルの名前変更ができませんでした", - "Could not create file" : "ファイルを作成できませんでした", - "Could not create folder" : "フォルダーを作成できませんでした", - "Error deleting file." : "ファイルの削除エラー。", + "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした", + "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした", + "{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}\"" : "フォルダー \"{dir}\" を作成できませんでした", + "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" は既に存在するため作成できませんでした", + "Error deleting file \"{fileName}\"." : "\"{fileName}\" でエラーを検出しました。", "No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません", "Name" : "名前", "Size" : "サイズ", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", - "{newname} already exists" : "{newname} はすでに存在します", - "Upload" : "アップロード", - "Text file" : "テキストファイル", - "New text file.txt" : "新規のテキストファイル作成", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", + "{newname} already exists" : "{newname} はすでに存在します", + "Upload" : "アップロード", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", "A new file or folder has been created" : "新しいファイルまたはフォルダーを作成したとき", "A file or folder has been changed" : "ファイルまたはフォルダーを変更したとき", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "%2$s により更新", "Deleted by %2$s" : "%2$s により削除", "Restored by %2$s" : "%2$s により復元", - "%s could not be renamed as it has been deleted" : "%s は削除されたため、ファイル名を変更できません", - "%s could not be renamed" : "%sの名前を変更できませんでした", "Upload (max. %s)" : "アップロード ( 最大 %s )", "File handling" : "ファイル操作", "Maximum upload size" : "最大アップロードサイズ", "max. possible: " : "最大容量: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。", "Save" : "保存", - "Can not be edited from here due to insufficient permissions." : "権限不足のため直接編集することはできません。", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。", + "Missing permissions to edit from here." : "ここから編集するための権限がありません。", "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "WebDAV経由でのファイルアクセスにはこのアドレスを利用してください", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", "Currently scanning" : "現在スキャン中", "No favorites" : "お気に入りなし", - "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。" + "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", + "Text file" : "テキストファイル", + "New text file.txt" : "新規のテキストファイル作成" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index 4534e787e0..01d93403c2 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -2,13 +2,6 @@ "Storage not available" : "ストレージが利用できません", "Storage invalid" : "ストレージが無効です", "Unknown error" : "不明なエラー", - "Could not move %s - File with this name already exists" : "%s を移動できませんでした ― この名前のファイルはすでに存在します", - "Could not move %s" : "%s を移動できませんでした", - "Permission denied" : "アクセス拒否", - "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。", - "The name %s is already used in the folder %s. Please choose a different name." : "%s はフォルダー %s ですでに使われています。別の名前を選択してください。", - "Error when creating the file" : "ファイルの生成エラー", - "Error when creating the folder" : "フォルダーの生成エラー", "Unable to set upload directory." : "アップロードディレクトリを設定できません。", "Invalid Token" : "無効なトークン", "No file was uploaded. Unknown error" : "ファイルは何もアップロードされていません。不明なエラー", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "一時保存フォルダーが見つかりません", "Failed to write to disk" : "ディスクへの書き込みに失敗しました", "Not enough storage available" : "ストレージに十分な空き容量がありません", + "The target folder has been moved or deleted." : "対象のフォルダーは移動されたか、削除されました。", "Upload failed. Could not find uploaded file" : "アップロードに失敗しました。アップロード済みのファイルを見つけることができませんでした。", "Upload failed. Could not get file info." : "アップロードに失敗しました。ファイル情報を取得できませんでした。", "Invalid directory." : "無効なディレクトリです。", @@ -44,14 +38,17 @@ "Unable to determine date" : "更新日不明", "This operation is forbidden" : "この操作は禁止されています", "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。", - "Error moving file." : "ファイル移動でエラー", - "Error moving file" : "ファイルの移動エラー", - "Error" : "エラー", - "{new_name} already exists" : "{new_name} はすでに存在します", - "Could not rename file" : "ファイルの名前変更ができませんでした", - "Could not create file" : "ファイルを作成できませんでした", - "Could not create folder" : "フォルダーを作成できませんでした", - "Error deleting file." : "ファイルの削除エラー。", + "Could not move \"{file}\", target exists" : "ターゲットが存在するため,ファイル \"{file}\"を移動できませんでした", + "Could not move \"{file}\"" : "\"{file}\" を移動できませんでした", + "{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}\"" : "フォルダー \"{dir}\" を作成できませんでした", + "Could not create folder \"{dir}\" because it already exists" : "フォルダー \"{dir}\" は既に存在するため作成できませんでした", + "Error deleting file \"{fileName}\"." : "\"{fileName}\" でエラーを検出しました。", "No entries in this folder match '{filter}'" : "このフォルダー内で '{filter}' にマッチするものはありません", "Name" : "名前", "Size" : "サイズ", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n バイト"], "Favorited" : "お気に入り済", "Favorite" : "お気に入り", - "{newname} already exists" : "{newname} はすでに存在します", - "Upload" : "アップロード", - "Text file" : "テキストファイル", - "New text file.txt" : "新規のテキストファイル作成", "Folder" : "フォルダー", "New folder" : "新しいフォルダー", + "{newname} already exists" : "{newname} はすでに存在します", + "Upload" : "アップロード", "An error occurred while trying to update the tags" : "タグを更新する際にエラーが発生しました", "A new file or folder has been created" : "新しいファイルまたはフォルダーを作成したとき", "A file or folder has been changed" : "ファイルまたはフォルダーを変更したとき", @@ -97,15 +92,13 @@ "Changed by %2$s" : "%2$s により更新", "Deleted by %2$s" : "%2$s により削除", "Restored by %2$s" : "%2$s により復元", - "%s could not be renamed as it has been deleted" : "%s は削除されたため、ファイル名を変更できません", - "%s could not be renamed" : "%sの名前を変更できませんでした", "Upload (max. %s)" : "アップロード ( 最大 %s )", "File handling" : "ファイル操作", "Maximum upload size" : "最大アップロードサイズ", "max. possible: " : "最大容量: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。", "Save" : "保存", - "Can not be edited from here due to insufficient permissions." : "権限不足のため直接編集することはできません。", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM の場合は値を変更後、反映されるのに5分程度かかります。", + "Missing permissions to edit from here." : "ここから編集するための権限がありません。", "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "WebDAV経由でのファイルアクセスにはこのアドレスを利用してください", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", "Currently scanning" : "現在スキャン中", "No favorites" : "お気に入りなし", - "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。" + "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダーは、ここに表示されます。", + "Text file" : "テキストファイル", + "New text file.txt" : "新規のテキストファイル作成" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js index c76e75864f..f5a57f4426 100644 --- a/apps/files/l10n/ka_GE.js +++ b/apps/files/l10n/ka_GE.js @@ -2,8 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "უცნობი შეცდომა", - "Could not move %s - File with this name already exists" : "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს", - "Could not move %s" : "%s –ის გადატანა ვერ მოხერხდა", "No file was uploaded. Unknown error" : "ფაილი არ აიტვირთა. უცნობი შეცდომა", "There is no error, the file uploaded with success" : "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში", @@ -26,8 +24,6 @@ OC.L10N.register( "Delete" : "წაშლა", "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", - "Error" : "შეცდომა", - "{new_name} already exists" : "{new_name} უკვე არსებობს", "Name" : "სახელი", "Size" : "ზომა", "Modified" : "შეცვლილია", @@ -36,10 +32,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!", "Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)", "Favorite" : "ფავორიტი", - "Upload" : "ატვირთვა", - "Text file" : "ტექსტური ფაილი", "Folder" : "საქაღალდე", "New folder" : "ახალი ფოლდერი", + "Upload" : "ატვირთვა", "File handling" : "ფაილის დამუშავება", "Maximum upload size" : "მაქსიმუმ ატვირთის ზომა", "max. possible: " : "მაქს. შესაძლებელი:", @@ -49,6 +44,7 @@ OC.L10N.register( "Cancel upload" : "ატვირთვის გაუქმება", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", - "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ." + "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.", + "Text file" : "ტექსტური ფაილი" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json index 058bee2618..cb8f6dce6f 100644 --- a/apps/files/l10n/ka_GE.json +++ b/apps/files/l10n/ka_GE.json @@ -1,7 +1,5 @@ { "translations": { "Unknown error" : "უცნობი შეცდომა", - "Could not move %s - File with this name already exists" : "%s –ის გადატანა ვერ მოხერხდა – ფაილი ამ სახელით უკვე არსებობს", - "Could not move %s" : "%s –ის გადატანა ვერ მოხერხდა", "No file was uploaded. Unknown error" : "ფაილი არ აიტვირთა. უცნობი შეცდომა", "There is no error, the file uploaded with success" : "ჭოცდომა არ დაფიქსირდა, ფაილი წარმატებით აიტვირთა", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "ატვირთული ფაილი აჭარბებს upload_max_filesize დირექტივას php.ini ფაილში", @@ -24,8 +22,6 @@ "Delete" : "წაშლა", "Details" : "დეტალური ინფორმაცია", "Pending" : "მოცდის რეჟიმში", - "Error" : "შეცდომა", - "{new_name} already exists" : "{new_name} უკვე არსებობს", "Name" : "სახელი", "Size" : "ზომა", "Modified" : "შეცვლილია", @@ -34,10 +30,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!", "Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)", "Favorite" : "ფავორიტი", - "Upload" : "ატვირთვა", - "Text file" : "ტექსტური ფაილი", "Folder" : "საქაღალდე", "New folder" : "ახალი ფოლდერი", + "Upload" : "ატვირთვა", "File handling" : "ფაილის დამუშავება", "Maximum upload size" : "მაქსიმუმ ატვირთის ზომა", "max. possible: " : "მაქს. შესაძლებელი:", @@ -47,6 +42,7 @@ "Cancel upload" : "ატვირთვის გაუქმება", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", - "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ." + "Files are being scanned, please wait." : "მიმდინარეობს ფაილების სკანირება, გთხოვთ დაელოდოთ.", + "Text file" : "ტექსტური ფაილი" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js index 030bdd35ed..f03aa9c469 100644 --- a/apps/files/l10n/km.js +++ b/apps/files/l10n/km.js @@ -2,8 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "មិន​ស្គាល់​កំហុស", - "Could not move %s - File with this name already exists" : "មិន​អាច​ផ្លាស់​ទី %s - មាន​ឈ្មោះ​ឯកសារ​ដូច​នេះ​ហើយ", - "Could not move %s" : "មិន​អាច​ផ្លាស់ទី %s", "No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស", "There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ", "Files" : "ឯកសារ", @@ -14,17 +12,14 @@ OC.L10N.register( "Delete" : "លុប", "Details" : "ព័ត៌មាន​លម្អិត", "Pending" : "កំពុង​រង់ចាំ", - "Error" : "កំហុស", - "{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ", "Name" : "ឈ្មោះ", "Size" : "ទំហំ", "Modified" : "បាន​កែ​ប្រែ", "New" : "ថ្មី", "File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។", - "Upload" : "ផ្ទុក​ឡើង", - "Text file" : "ឯកសារ​អក្សរ", "Folder" : "ថត", "New folder" : "ថត​ថ្មី", + "Upload" : "ផ្ទុក​ឡើង", "You created %1$s" : "អ្នក​បាន​បង្កើត %1$s", "%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s", "You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s", @@ -36,6 +31,7 @@ OC.L10N.register( "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង", - "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក" + "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក", + "Text file" : "ឯកសារ​អក្សរ" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json index 679787a5ce..f050b00b79 100644 --- a/apps/files/l10n/km.json +++ b/apps/files/l10n/km.json @@ -1,7 +1,5 @@ { "translations": { "Unknown error" : "មិន​ស្គាល់​កំហុស", - "Could not move %s - File with this name already exists" : "មិន​អាច​ផ្លាស់​ទី %s - មាន​ឈ្មោះ​ឯកសារ​ដូច​នេះ​ហើយ", - "Could not move %s" : "មិន​អាច​ផ្លាស់ទី %s", "No file was uploaded. Unknown error" : "មិន​មាន​ឯកសារ​ដែល​បាន​ផ្ទុក​ឡើង។ មិន​ស្គាល់​កំហុស", "There is no error, the file uploaded with success" : "មិន​មាន​កំហុស​អ្វី​ទេ ហើយ​ឯកសារ​ត្រូវ​បាន​ផ្ទុកឡើង​ដោយ​ជោគជ័យ", "Files" : "ឯកសារ", @@ -12,17 +10,14 @@ "Delete" : "លុប", "Details" : "ព័ត៌មាន​លម្អិត", "Pending" : "កំពុង​រង់ចាំ", - "Error" : "កំហុស", - "{new_name} already exists" : "មាន​ឈ្មោះ {new_name} រួច​ហើយ", "Name" : "ឈ្មោះ", "Size" : "ទំហំ", "Modified" : "បាន​កែ​ប្រែ", "New" : "ថ្មី", "File name cannot be empty." : "ឈ្មោះ​ឯកសារ​មិន​អាច​នៅ​ទទេ​បាន​ឡើយ។", - "Upload" : "ផ្ទុក​ឡើង", - "Text file" : "ឯកសារ​អក្សរ", "Folder" : "ថត", "New folder" : "ថត​ថ្មី", + "Upload" : "ផ្ទុក​ឡើង", "You created %1$s" : "អ្នក​បាន​បង្កើត %1$s", "%2$s created %1$s" : "%2$s បាន​បង្កើត %1$s", "You changed %1$s" : "អ្នក​បាន​ផ្លាស់​ប្ដូរ %1$s", @@ -34,6 +29,7 @@ "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "Cancel upload" : "បោះបង់​ការ​ផ្ទុកឡើង", - "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក" + "Upload too large" : "ផ្ទុក​ឡើង​ធំ​ពេក", + "Text file" : "ឯកសារ​អក្សរ" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js index 7538d9b033..840837bdad 100644 --- a/apps/files/l10n/kn.js +++ b/apps/files/l10n/kn.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ", "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ", "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", - "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", - "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", - "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", - "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s ಹೆಸರಿನ ಕೋಶವನ್ನು %s ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.", - "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", - "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.", "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ", "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ", @@ -20,6 +13,7 @@ OC.L10N.register( "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ", "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ", "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ", + "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.", "Files" : "ಕಡತಗಳು", "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು", @@ -34,14 +28,6 @@ OC.L10N.register( "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.", - "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ", - "Error" : "ತಪ್ಪಾಗಿದೆ", - "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", - "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", - "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ", - "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ", - "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ", "Name" : "ಹೆಸರು", "Size" : " ಪ್ರಮಾಣ", "Modified" : "ಬದಲಾಯಿಸಿದ", @@ -53,10 +39,9 @@ OC.L10N.register( "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು", "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", - "Upload" : "ವರ್ಗಾಯಿಸಿ", - "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ", "Folder" : "ಕಡತಕೋಶ", "New folder" : "ಹೊಸ ಕಡತಕೋಶ", + "Upload" : "ವರ್ಗಾಯಿಸಿ", "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)", "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ", "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ", @@ -71,6 +56,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", - "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ" + "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ", + "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json index b9f55d4151..d6345be732 100644 --- a/apps/files/l10n/kn.json +++ b/apps/files/l10n/kn.json @@ -2,13 +2,6 @@ "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ", "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ", "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", - "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", - "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", - "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", - "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s ಹೆಸರಿನ ಕೋಶವನ್ನು %s ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.", - "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", - "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.", "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ", "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ", @@ -18,6 +11,7 @@ "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ", "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ", "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ", + "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.", "Files" : "ಕಡತಗಳು", "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು", @@ -32,14 +26,6 @@ "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", "Pending" : "ಬಾಕಿ ಇದೆ", "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", - "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.", - "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ", - "Error" : "ತಪ್ಪಾಗಿದೆ", - "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", - "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", - "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ", - "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ", - "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ", "Name" : "ಹೆಸರು", "Size" : " ಪ್ರಮಾಣ", "Modified" : "ಬದಲಾಯಿಸಿದ", @@ -51,10 +37,9 @@ "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು", "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", - "Upload" : "ವರ್ಗಾಯಿಸಿ", - "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ", "Folder" : "ಕಡತಕೋಶ", "New folder" : "ಹೊಸ ಕಡತಕೋಶ", + "Upload" : "ವರ್ಗಾಯಿಸಿ", "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)", "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ", "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ", @@ -69,6 +54,7 @@ "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", - "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ" + "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ", + "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 67b5e869e5..13e917e3cf 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "저장소를 사용할 수 없음", "Storage invalid" : "저장소가 잘못됨", "Unknown error" : "알 수 없는 오류", - "Could not move %s - File with this name already exists" : "항목 %s을(를) 이동시킬 수 없음 - 같은 이름의 파일이 이미 존재함", - "Could not move %s" : "항목 %s을(를) 이동시킬 수 없음", - "Permission denied" : "권한 거부됨", - "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.", - "The name %s is already used in the folder %s. Please choose a different name." : "이름 %s이(가) 폴더 %s에서 이미 사용 중입니다. 다른 이름을 사용하십시오.", - "Error when creating the file" : "파일 생성 중 오류 발생", - "Error when creating the folder" : "폴더 생성 중 오류 발생", "Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.", "Invalid Token" : "잘못된 토큰", "No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "임시 폴더가 없음", "Failed to write to disk" : "디스크에 쓰지 못했습니다", "Not enough storage available" : "저장소가 용량이 충분하지 않습니다.", + "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.", "Upload failed. Could not find uploaded file" : "업로드에 실패했습니다. 업로드할 파일을 찾을 수 없습니다", "Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.", "Invalid directory." : "올바르지 않은 디렉터리입니다.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "날짜를 결정할 수 없음", "This operation is forbidden" : "이 작업이 금지됨", "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오", - "Error moving file." : "파일 이동 오류.", - "Error moving file" : "파일 이동 오류", - "Error" : "오류", - "{new_name} already exists" : "{new_name}이(가) 이미 존재함", - "Could not rename file" : "이름을 변경할 수 없음", - "Could not create file" : "파일을 만들 수 없음", - "Could not create folder" : "폴더를 만들 수 없음", - "Error deleting file." : "파일 삭제 오류.", "No entries in this folder match '{filter}'" : "이 폴더에 '{filter}'와(과) 일치하는 항목 없음", "Name" : "이름", "Size" : "크기", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n바이트"], "Favorited" : "책갈피에 추가됨", "Favorite" : "즐겨찾기", - "{newname} already exists" : "{newname} 항목이 이미 존재함", - "Upload" : "업로드", - "Text file" : "텍스트 파일", - "New text file.txt" : "새 텍스트 파일.txt", "Folder" : "폴더", "New folder" : "새 폴더", + "{newname} already exists" : "{newname} 항목이 이미 존재함", + "Upload" : "업로드", "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생", "A new file or folder has been created" : "새 파일이나 폴더가 생성됨", "A file or folder has been changed" : "파일이나 폴더가 변경됨", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "%2$s 님이 변경함", "Deleted by %2$s" : "%2$s 님이 삭제함", "Restored by %2$s" : "%2$s 님이 복원함", - "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다", - "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "Upload (max. %s)" : "업로드(최대 %s)", "File handling" : "파일 처리", "Maximum upload size" : "최대 업로드 크기", "max. possible: " : "최대 가능:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM을 사용하고 있으면 설정 변화가 적용될 때까지 5분 정도 걸릴 수 있습니다.", "Save" : "저장", - "Can not be edited from here due to insufficient permissions." : "권한이 부족하므로 여기에서 편집할 수 없습니다.", "Settings" : "설정", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "WebDAV로 파일에 접근하려면 이 주소를 사용하십시오", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", "Currently scanning" : "현재 검사 중", "No favorites" : "책갈피 없음", - "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다" + "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", + "Text file" : "텍스트 파일", + "New text file.txt" : "새 텍스트 파일.txt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index 3c88e502b1..1e77ab1b9b 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -2,13 +2,6 @@ "Storage not available" : "저장소를 사용할 수 없음", "Storage invalid" : "저장소가 잘못됨", "Unknown error" : "알 수 없는 오류", - "Could not move %s - File with this name already exists" : "항목 %s을(를) 이동시킬 수 없음 - 같은 이름의 파일이 이미 존재함", - "Could not move %s" : "항목 %s을(를) 이동시킬 수 없음", - "Permission denied" : "권한 거부됨", - "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.", - "The name %s is already used in the folder %s. Please choose a different name." : "이름 %s이(가) 폴더 %s에서 이미 사용 중입니다. 다른 이름을 사용하십시오.", - "Error when creating the file" : "파일 생성 중 오류 발생", - "Error when creating the folder" : "폴더 생성 중 오류 발생", "Unable to set upload directory." : "업로드 디렉터리를 설정할 수 없습니다.", "Invalid Token" : "잘못된 토큰", "No file was uploaded. Unknown error" : "파일이 업로드 되지 않았습니다. 알 수 없는 오류입니다", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "임시 폴더가 없음", "Failed to write to disk" : "디스크에 쓰지 못했습니다", "Not enough storage available" : "저장소가 용량이 충분하지 않습니다.", + "The target folder has been moved or deleted." : "대상 폴더가 이동되거나 삭제되었습니다.", "Upload failed. Could not find uploaded file" : "업로드에 실패했습니다. 업로드할 파일을 찾을 수 없습니다", "Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.", "Invalid directory." : "올바르지 않은 디렉터리입니다.", @@ -44,14 +38,6 @@ "Unable to determine date" : "날짜를 결정할 수 없음", "This operation is forbidden" : "이 작업이 금지됨", "This directory is unavailable, please check the logs or contact the administrator" : "디렉터리를 사용할 수 없습니다. 로그를 확인하거나 관리자에게 연락하십시오", - "Error moving file." : "파일 이동 오류.", - "Error moving file" : "파일 이동 오류", - "Error" : "오류", - "{new_name} already exists" : "{new_name}이(가) 이미 존재함", - "Could not rename file" : "이름을 변경할 수 없음", - "Could not create file" : "파일을 만들 수 없음", - "Could not create folder" : "폴더를 만들 수 없음", - "Error deleting file." : "파일 삭제 오류.", "No entries in this folder match '{filter}'" : "이 폴더에 '{filter}'와(과) 일치하는 항목 없음", "Name" : "이름", "Size" : "크기", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n바이트"], "Favorited" : "책갈피에 추가됨", "Favorite" : "즐겨찾기", - "{newname} already exists" : "{newname} 항목이 이미 존재함", - "Upload" : "업로드", - "Text file" : "텍스트 파일", - "New text file.txt" : "새 텍스트 파일.txt", "Folder" : "폴더", "New folder" : "새 폴더", + "{newname} already exists" : "{newname} 항목이 이미 존재함", + "Upload" : "업로드", "An error occurred while trying to update the tags" : "태그를 업데이트하는 중 오류 발생", "A new file or folder has been created" : "새 파일이나 폴더가 생성됨", "A file or folder has been changed" : "파일이나 폴더가 변경됨", @@ -97,15 +81,11 @@ "Changed by %2$s" : "%2$s 님이 변경함", "Deleted by %2$s" : "%2$s 님이 삭제함", "Restored by %2$s" : "%2$s 님이 복원함", - "%s could not be renamed as it has been deleted" : "%s이(가) 삭제되었기 때문에 이름을 변경할 수 없습니다", - "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "Upload (max. %s)" : "업로드(최대 %s)", "File handling" : "파일 처리", "Maximum upload size" : "최대 업로드 크기", "max. possible: " : "최대 가능:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM을 사용하고 있으면 설정 변화가 적용될 때까지 5분 정도 걸릴 수 있습니다.", "Save" : "저장", - "Can not be edited from here due to insufficient permissions." : "권한이 부족하므로 여기에서 편집할 수 없습니다.", "Settings" : "설정", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "WebDAV로 파일에 접근하려면 이 주소를 사용하십시오", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "파일을 검색하고 있습니다. 기다려 주십시오.", "Currently scanning" : "현재 검사 중", "No favorites" : "책갈피 없음", - "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다" + "Files and folders you mark as favorite will show up here" : "책갈피에 추가한 파일과 폴더가 여기에 나타납니다", + "Text file" : "텍스트 파일", + "New text file.txt" : "새 텍스트 파일.txt" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/ku_IQ.js b/apps/files/l10n/ku_IQ.js index 32af16b367..1ceca50b70 100644 --- a/apps/files/l10n/ku_IQ.js +++ b/apps/files/l10n/ku_IQ.js @@ -6,10 +6,9 @@ OC.L10N.register( "Close" : "دابخه", "Download" : "داگرتن", "Select" : "دیاریکردنی", - "Error" : "هه‌ڵه", "Name" : "ناو", - "Upload" : "بارکردن", "Folder" : "بوخچه", + "Upload" : "بارکردن", "Save" : "پاشکه‌وتکردن", "Settings" : "ڕێکخستنه‌کان" }, diff --git a/apps/files/l10n/ku_IQ.json b/apps/files/l10n/ku_IQ.json index 4f1068bbb0..e934b5eb29 100644 --- a/apps/files/l10n/ku_IQ.json +++ b/apps/files/l10n/ku_IQ.json @@ -4,10 +4,9 @@ "Close" : "دابخه", "Download" : "داگرتن", "Select" : "دیاریکردنی", - "Error" : "هه‌ڵه", "Name" : "ناو", - "Upload" : "بارکردن", "Folder" : "بوخچه", + "Upload" : "بارکردن", "Save" : "پاشکه‌وتکردن", "Settings" : "ڕێکخستنه‌کان" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 047aac2dbb..39e12b763c 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -19,15 +19,13 @@ OC.L10N.register( "Delete" : "Läschen", "Details" : "Detailer", "Select" : "Auswielen", - "Error" : "Fehler", "Name" : "Numm", "Size" : "Gréisst", "Modified" : "Geännert", "New" : "Nei", - "Upload" : "Eroplueden", - "Text file" : "Text Fichier", "Folder" : "Dossier", "New folder" : "Neien Dossier", + "Upload" : "Eroplueden", "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", @@ -38,6 +36,7 @@ OC.L10N.register( "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg." + "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.", + "Text file" : "Text Fichier" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index f298444a35..9514845256 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -17,15 +17,13 @@ "Delete" : "Läschen", "Details" : "Detailer", "Select" : "Auswielen", - "Error" : "Fehler", "Name" : "Numm", "Size" : "Gréisst", "Modified" : "Geännert", "New" : "Nei", - "Upload" : "Eroplueden", - "Text file" : "Text Fichier", "Folder" : "Dossier", "New folder" : "Neien Dossier", + "Upload" : "Eroplueden", "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", @@ -36,6 +34,7 @@ "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg." + "Files are being scanned, please wait." : "Fichieren gi gescannt, war weg.", + "Text file" : "Text Fichier" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/lo.js b/apps/files/l10n/lo.js index 2f3b6e43d6..2d01379b83 100644 --- a/apps/files/l10n/lo.js +++ b/apps/files/l10n/lo.js @@ -4,9 +4,6 @@ OC.L10N.register( "Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ", "Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ", "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ", - "Could not move %s - File with this name already exists" : "ບໍ່ສາມາດຍ້າຍໄຟລ໌ %s ນີ້ໄດ້ - ຊື່ໄຟລ໌ນີ້ຖືກນຳໃຊ້ແລ້ວ", - "Could not move %s" : "ບໍ່ສາມາດຍ້າຍ %s ໄດ້", - "Permission denied" : "ບໍ່ທີສິດໃນການເຂົ້າເຖິງ", "The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/lo.json b/apps/files/l10n/lo.json index c7bfdc31db..12eea86a93 100644 --- a/apps/files/l10n/lo.json +++ b/apps/files/l10n/lo.json @@ -2,9 +2,6 @@ "Storage not available" : "ບໍ່ມີພື້ນທີ່ເກັບຂໍ້ມູນ", "Storage invalid" : "ພື້ນທີ່ເກັບຂໍ້ມູນບໍ່ຖືກຕ້ອງ", "Unknown error" : "ຂໍ້ຜິດພາດທີ່ບໍ່ຮູ້ສາເຫດ", - "Could not move %s - File with this name already exists" : "ບໍ່ສາມາດຍ້າຍໄຟລ໌ %s ນີ້ໄດ້ - ຊື່ໄຟລ໌ນີ້ຖືກນຳໃຊ້ແລ້ວ", - "Could not move %s" : "ບໍ່ສາມາດຍ້າຍ %s ໄດ້", - "Permission denied" : "ບໍ່ທີສິດໃນການເຂົ້າເຖິງ", "The target folder has been moved or deleted." : "ໂຟນເດີທີ່ທ່ານເລືອກໄດ້ຖືກຍ້າຍ ຫຼື ລຶບອອກແລ້ວ" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index f2ea62593c..b4001e0c8e 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Saugykla nepasiekiama", "Storage invalid" : "Saugykla neteisinga", "Unknown error" : "Neatpažinta klaida", - "Could not move %s - File with this name already exists" : "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", - "Could not move %s" : "Nepavyko perkelti %s", - "Permission denied" : "Neturite teisių", - "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", - "The name %s is already used in the folder %s. Please choose a different name." : "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.", - "Error when creating the file" : "Klaida kuriant failą", - "Error when creating the folder" : "Klaida kuriant aplanką", "Unable to set upload directory." : "Nepavyksta nustatyti įkėlimų katalogo.", "Invalid Token" : "Netinkamas ženklas", "No file was uploaded. Unknown error" : "Failai nebuvo įkelti dėl nežinomos priežasties", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Nėra laikinojo katalogo", "Failed to write to disk" : "Nepavyko įrašyti į diską", "Not enough storage available" : "Nepakanka vietos serveryje", + "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", "Upload failed. Could not find uploaded file" : "Įkėlimas nepavyko. Nepavyko rasti įkelto failo", "Upload failed. Could not get file info." : "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.", "Invalid directory." : "Neteisingas aplankas", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", - "Error moving file." : "Klaida perkeliant failą.", - "Error moving file" : "Klaida perkeliant failą", - "Error" : "Klaida", - "{new_name} already exists" : "{new_name} jau egzistuoja", - "Could not rename file" : "Neįmanoma pervadinti failo", - "Could not create file" : "Neįmanoma sukurti failo", - "Could not create folder" : "Neįmanoma sukurti aplanko", - "Error deleting file." : "Klaida trinant failą.", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", @@ -75,8 +61,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų"], "Favorited" : "Pažymėta mėgstamu", "Favorite" : "Mėgiamas", - "Text file" : "Teksto failas", - "New text file.txt" : "Naujas tekstas file.txt", "Folder" : "Katalogas", "New folder" : "Naujas aplankas", "{newname} already exists" : "{newname} jau egzistuoja", @@ -99,15 +83,13 @@ OC.L10N.register( "Changed by %2$s" : "Pakeitė %2$s", "Deleted by %2$s" : "Ištrynė %2$s", "Restored by %2$s" : "Atkūrė %2$s", - "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas", - "%s could not be renamed" : "%s negali būti pervadintas", "Upload (max. %s)" : "Įkelti (maks. %s)", "File handling" : "Failų tvarkymas", "Maximum upload size" : "Maksimalus įkeliamo failo dydis", "max. possible: " : "maks. galima:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Su PHP-FPM reikšmės atnaujinimas gali užtrukti iki 5 minučių po pakeitimo.", "Save" : "Išsaugoti", - "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Su PHP-FPM atnaujinimai gali užtrukti apie 5min.", + "Missing permissions to edit from here." : "Draudžiama iš čia redaguoti", "Settings" : "Nustatymai", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Naudokite šį adresą, kad pasiektumėte savo failus per WebDAV", @@ -121,6 +103,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", "Currently scanning" : "Šiuo metu skenuojama", "No favorites" : "Nėra mėgstamiausių", - "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia" + "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia", + "Text file" : "Teksto failas", + "New text file.txt" : "Naujas tekstas file.txt" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index 5645589628..ba8610da86 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -2,13 +2,6 @@ "Storage not available" : "Saugykla nepasiekiama", "Storage invalid" : "Saugykla neteisinga", "Unknown error" : "Neatpažinta klaida", - "Could not move %s - File with this name already exists" : "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", - "Could not move %s" : "Nepavyko perkelti %s", - "Permission denied" : "Neturite teisių", - "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", - "The name %s is already used in the folder %s. Please choose a different name." : "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.", - "Error when creating the file" : "Klaida kuriant failą", - "Error when creating the folder" : "Klaida kuriant aplanką", "Unable to set upload directory." : "Nepavyksta nustatyti įkėlimų katalogo.", "Invalid Token" : "Netinkamas ženklas", "No file was uploaded. Unknown error" : "Failai nebuvo įkelti dėl nežinomos priežasties", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Nėra laikinojo katalogo", "Failed to write to disk" : "Nepavyko įrašyti į diską", "Not enough storage available" : "Nepakanka vietos serveryje", + "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", "Upload failed. Could not find uploaded file" : "Įkėlimas nepavyko. Nepavyko rasti įkelto failo", "Upload failed. Could not get file info." : "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.", "Invalid directory." : "Neteisingas aplankas", @@ -44,14 +38,6 @@ "Unable to determine date" : "Nepavyksta nustatyti datos", "This operation is forbidden" : "Ši operacija yra uždrausta", "This directory is unavailable, please check the logs or contact the administrator" : "Katalogas nepasiekiamas, prašome peržiūrėti žurnalo įrašus arba susisiekti su administratoriumi", - "Error moving file." : "Klaida perkeliant failą.", - "Error moving file" : "Klaida perkeliant failą", - "Error" : "Klaida", - "{new_name} already exists" : "{new_name} jau egzistuoja", - "Could not rename file" : "Neįmanoma pervadinti failo", - "Could not create file" : "Neįmanoma sukurti failo", - "Could not create folder" : "Neįmanoma sukurti aplanko", - "Error deleting file." : "Klaida trinant failą.", "No entries in this folder match '{filter}'" : "Nėra įrašų šiame aplanko atitikmeniui „{filter}“", "Name" : "Pavadinimas", "Size" : "Dydis", @@ -73,8 +59,6 @@ "_%n byte_::_%n bytes_" : ["%n baitas","%n baitai","%n baitų"], "Favorited" : "Pažymėta mėgstamu", "Favorite" : "Mėgiamas", - "Text file" : "Teksto failas", - "New text file.txt" : "Naujas tekstas file.txt", "Folder" : "Katalogas", "New folder" : "Naujas aplankas", "{newname} already exists" : "{newname} jau egzistuoja", @@ -97,15 +81,13 @@ "Changed by %2$s" : "Pakeitė %2$s", "Deleted by %2$s" : "Ištrynė %2$s", "Restored by %2$s" : "Atkūrė %2$s", - "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas", - "%s could not be renamed" : "%s negali būti pervadintas", "Upload (max. %s)" : "Įkelti (maks. %s)", "File handling" : "Failų tvarkymas", "Maximum upload size" : "Maksimalus įkeliamo failo dydis", "max. possible: " : "maks. galima:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Su PHP-FPM reikšmės atnaujinimas gali užtrukti iki 5 minučių po pakeitimo.", "Save" : "Išsaugoti", - "Can not be edited from here due to insufficient permissions." : "Negali būti redaguojamas iš čia dėl leidimų trūkumo.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Su PHP-FPM atnaujinimai gali užtrukti apie 5min.", + "Missing permissions to edit from here." : "Draudžiama iš čia redaguoti", "Settings" : "Nustatymai", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Naudokite šį adresą, kad pasiektumėte savo failus per WebDAV", @@ -119,6 +101,8 @@ "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", "Currently scanning" : "Šiuo metu skenuojama", "No favorites" : "Nėra mėgstamiausių", - "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia" + "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia", + "Text file" : "Teksto failas", + "New text file.txt" : "Naujas tekstas file.txt" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index f0d5b4212b..d615c8e5d2 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Glabātuve nav pieejama", "Storage invalid" : "Nepareiza krātuve", "Unknown error" : "Nezināma kļūda", - "Could not move %s - File with this name already exists" : "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu", - "Could not move %s" : "Nevarēja pārvietot %s", - "Permission denied" : "Pieeja liegta", - "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", - "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.", - "Error when creating the file" : "Kļūda veidojot datni", - "Error when creating the folder" : "Kļūda, veidojot mapi", "Unable to set upload directory." : "Nevar uzstādīt augšupielādes mapi.", "Invalid Token" : "Nepareiza pilnvara", "No file was uploaded. Unknown error" : "Netika augšupielādēta neviena datne. Nezināma kļūda", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Trūkst pagaidu mapes", "Failed to write to disk" : "Neizdevās saglabāt diskā", "Not enough storage available" : "Nav pietiekami daudz vietas", + "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", "Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.", "Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.", "Invalid directory." : "Nederīga direktorija.", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", "Unable to determine date" : "Neizdevās noteikt datumu", - "Error moving file." : "Kļūda, pārvietojot datni.", - "Error moving file" : "Kļūda, pārvietojot datni", - "Error" : "Kļūda", - "{new_name} already exists" : "{new_name} jau eksistē", - "Could not rename file" : "Neizdevās pārsaukt datni", - "Could not create file" : "Neizdevās izveidot datni", - "Could not create folder" : "Neizdevās izveidot mapi", - "Error deleting file." : "Kļūda, dzēšot datni.", "No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'", "Name" : "Nosaukums", "Size" : "Izmērs", @@ -69,10 +55,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"], "Favorited" : "Favorīti", "Favorite" : "Iecienītais", - "Upload" : "Augšupielādēt", - "Text file" : "Teksta datne", "Folder" : "Mape", "New folder" : "Jauna mape", + "Upload" : "Augšupielādēt", "An error occurred while trying to update the tags" : "Atjaunojot atzīmes notika kļūda", "A new file or folder has been created" : "Izveidots jauns fails vai mape", "A file or folder has been changed" : "Izmainīts fails vai mape", @@ -87,8 +72,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s izdzēsa %1$s", "You restored %1$s" : "Tu atjaunoji %1$s", "%2$s restored %1$s" : "%2$s atjaunoja %1$s", - "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts", - "%s could not be renamed" : "%s nevar tikt pārsaukts", "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", @@ -106,6 +89,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", "Currently scanning" : "Pašlaik skenē", "No favorites" : "Nav favorītu", - "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit" + "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit", + "Text file" : "Teksta datne" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index 14d0b4093d..0888d81ad6 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -2,13 +2,6 @@ "Storage not available" : "Glabātuve nav pieejama", "Storage invalid" : "Nepareiza krātuve", "Unknown error" : "Nezināma kļūda", - "Could not move %s - File with this name already exists" : "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu", - "Could not move %s" : "Nevarēja pārvietot %s", - "Permission denied" : "Pieeja liegta", - "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", - "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.", - "Error when creating the file" : "Kļūda veidojot datni", - "Error when creating the folder" : "Kļūda, veidojot mapi", "Unable to set upload directory." : "Nevar uzstādīt augšupielādes mapi.", "Invalid Token" : "Nepareiza pilnvara", "No file was uploaded. Unknown error" : "Netika augšupielādēta neviena datne. Nezināma kļūda", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Trūkst pagaidu mapes", "Failed to write to disk" : "Neizdevās saglabāt diskā", "Not enough storage available" : "Nav pietiekami daudz vietas", + "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", "Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.", "Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.", "Invalid directory." : "Nederīga direktorija.", @@ -42,14 +36,6 @@ "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", "Unable to determine date" : "Neizdevās noteikt datumu", - "Error moving file." : "Kļūda, pārvietojot datni.", - "Error moving file" : "Kļūda, pārvietojot datni", - "Error" : "Kļūda", - "{new_name} already exists" : "{new_name} jau eksistē", - "Could not rename file" : "Neizdevās pārsaukt datni", - "Could not create file" : "Neizdevās izveidot datni", - "Could not create folder" : "Neizdevās izveidot mapi", - "Error deleting file." : "Kļūda, dzēšot datni.", "No entries in this folder match '{filter}'" : "Šajā mapē nekas nav atrasts, meklējot pēc '{filter}'", "Name" : "Nosaukums", "Size" : "Izmērs", @@ -67,10 +53,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["atrasts pēc '{filter}'","atrasts pēc '{filter}'","atrasti pēc '{filter}'"], "Favorited" : "Favorīti", "Favorite" : "Iecienītais", - "Upload" : "Augšupielādēt", - "Text file" : "Teksta datne", "Folder" : "Mape", "New folder" : "Jauna mape", + "Upload" : "Augšupielādēt", "An error occurred while trying to update the tags" : "Atjaunojot atzīmes notika kļūda", "A new file or folder has been created" : "Izveidots jauns fails vai mape", "A file or folder has been changed" : "Izmainīts fails vai mape", @@ -85,8 +70,6 @@ "%2$s deleted %1$s" : "%2$s izdzēsa %1$s", "You restored %1$s" : "Tu atjaunoji %1$s", "%2$s restored %1$s" : "%2$s atjaunoja %1$s", - "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts", - "%s could not be renamed" : "%s nevar tikt pārsaukts", "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", @@ -104,6 +87,7 @@ "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", "Currently scanning" : "Pašlaik skenē", "No favorites" : "Nav favorītu", - "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit" + "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit", + "Text file" : "Teksta datne" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index e6265c851e..92616a372a 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -2,10 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "Непозната грешка", - "Could not move %s - File with this name already exists" : "Не можам да го преместам %s - Датотека со такво име веќе постои", - "Could not move %s" : "Не можам да ги префрлам %s", - "Error when creating the file" : "Грешка при креирање на датотека", - "Error when creating the folder" : "Грешка при креирање на папка", "Unable to set upload directory." : "Не може да се постави папката за префрлање на податоци.", "Invalid Token" : "Грешен токен", "No file was uploaded. Unknown error" : "Ниту еден фајл не се вчита. Непозната грешка", @@ -33,12 +29,6 @@ OC.L10N.register( "Details" : "Детали:", "Select" : "Избери", "Pending" : "Чека", - "Error moving file" : "Грешка при префрлање на датотека", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} веќе постои", - "Could not rename file" : "Не можам да ја преименувам датотеката", - "Could not create file" : "Не множам да креирам датотека", - "Could not create folder" : "Не можам да креирам папка", "Name" : "Име", "Size" : "Големина", "Modified" : "Променето", @@ -47,17 +37,15 @@ OC.L10N.register( "File name cannot be empty." : "Името на датотеката не може да биде празно.", "Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!", "Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)", - "Upload" : "Подигни", - "Text file" : "Текстуална датотека", "Folder" : "Папка", "New folder" : "Нова папка", + "Upload" : "Подигни", "You created %1$s" : "Вие креиравте %1$s", "%2$s created %1$s" : "%2$s креирано %1$s", "You changed %1$s" : "Вие изменивте %1$s", "%2$s changed %1$s" : "%2$s променето %1$s", "You deleted %1$s" : "Вие избришавте %1$s", "%2$s deleted %1$s" : "%2$s избришани %1$s", - "%s could not be renamed" : "%s не може да биде преименуван", "Upload (max. %s)" : "Префрлање (макс. %s)", "File handling" : "Ракување со датотеки", "Maximum upload size" : "Максимална големина за подигање", @@ -68,6 +56,7 @@ OC.L10N.register( "Cancel upload" : "Откажи прикачување", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", - "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте." + "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", + "Text file" : "Текстуална датотека" }, "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index 0806f7d096..147707256c 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -1,9 +1,5 @@ { "translations": { "Unknown error" : "Непозната грешка", - "Could not move %s - File with this name already exists" : "Не можам да го преместам %s - Датотека со такво име веќе постои", - "Could not move %s" : "Не можам да ги префрлам %s", - "Error when creating the file" : "Грешка при креирање на датотека", - "Error when creating the folder" : "Грешка при креирање на папка", "Unable to set upload directory." : "Не може да се постави папката за префрлање на податоци.", "Invalid Token" : "Грешен токен", "No file was uploaded. Unknown error" : "Ниту еден фајл не се вчита. Непозната грешка", @@ -31,12 +27,6 @@ "Details" : "Детали:", "Select" : "Избери", "Pending" : "Чека", - "Error moving file" : "Грешка при префрлање на датотека", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} веќе постои", - "Could not rename file" : "Не можам да ја преименувам датотеката", - "Could not create file" : "Не множам да креирам датотека", - "Could not create folder" : "Не можам да креирам папка", "Name" : "Име", "Size" : "Големина", "Modified" : "Променето", @@ -45,17 +35,15 @@ "File name cannot be empty." : "Името на датотеката не може да биде празно.", "Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!", "Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)", - "Upload" : "Подигни", - "Text file" : "Текстуална датотека", "Folder" : "Папка", "New folder" : "Нова папка", + "Upload" : "Подигни", "You created %1$s" : "Вие креиравте %1$s", "%2$s created %1$s" : "%2$s креирано %1$s", "You changed %1$s" : "Вие изменивте %1$s", "%2$s changed %1$s" : "%2$s променето %1$s", "You deleted %1$s" : "Вие избришавте %1$s", "%2$s deleted %1$s" : "%2$s избришани %1$s", - "%s could not be renamed" : "%s не може да биде преименуван", "Upload (max. %s)" : "Префрлање (макс. %s)", "File handling" : "Ракување со датотеки", "Maximum upload size" : "Максимална големина за подигање", @@ -66,6 +54,7 @@ "Cancel upload" : "Откажи прикачување", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", - "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте." + "Files are being scanned, please wait." : "Се скенираат датотеки, ве молам почекајте.", + "Text file" : "Текстуална датотека" },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" } \ No newline at end of file diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js index 7ef2afeb84..b60faff6bd 100644 --- a/apps/files/l10n/ms_MY.js +++ b/apps/files/l10n/ms_MY.js @@ -16,14 +16,12 @@ OC.L10N.register( "Rename" : "Namakan", "Delete" : "Padam", "Pending" : "Dalam proses", - "Error" : "Ralat", "Name" : "Nama", "Size" : "Saiz", "Modified" : "Dimodifikasi", "New" : "Baru", - "Upload" : "Muat naik", - "Text file" : "Fail teks", "Folder" : "Folder", + "Upload" : "Muat naik", "You created %1$s" : "Anda telah membina %1$s", "%2$s created %1$s" : "%2$s membina %1$s", "You changed %1$s" : "Anda menukar %1$s", @@ -35,6 +33,7 @@ OC.L10N.register( "Cancel upload" : "Batal muat naik", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", - "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar." + "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.", + "Text file" : "Fail teks" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json index aec2dd5094..fa78e9446b 100644 --- a/apps/files/l10n/ms_MY.json +++ b/apps/files/l10n/ms_MY.json @@ -14,14 +14,12 @@ "Rename" : "Namakan", "Delete" : "Padam", "Pending" : "Dalam proses", - "Error" : "Ralat", "Name" : "Nama", "Size" : "Saiz", "Modified" : "Dimodifikasi", "New" : "Baru", - "Upload" : "Muat naik", - "Text file" : "Fail teks", "Folder" : "Folder", + "Upload" : "Muat naik", "You created %1$s" : "Anda telah membina %1$s", "%2$s created %1$s" : "%2$s membina %1$s", "You changed %1$s" : "Anda menukar %1$s", @@ -33,6 +31,7 @@ "Cancel upload" : "Batal muat naik", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", - "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar." + "Files are being scanned, please wait." : "Fail sedang diimbas, harap bersabar.", + "Text file" : "Fail teks" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index 7fe475a6a2..9d01ad626b 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Lagringsplass ikke tilgjengelig", "Storage invalid" : "Lagringsplass ugyldig", "Unknown error" : "Ukjent feil", - "Could not move %s - File with this name already exists" : "Kan ikke flytte %s - En fil med samme navn finnes allerede", - "Could not move %s" : "Kunne ikke flytte %s", - "Permission denied" : "Tilgang nektet", - "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.", - "The name %s is already used in the folder %s. Please choose a different name." : "Navnet %s brukes allerede i mappen %s. Velg et annet navn.", - "Error when creating the file" : "Feil ved oppretting av filen", - "Error when creating the folder" : "Feil ved oppretting av mappen", "Unable to set upload directory." : "Kunne ikke sette opplastingskatalog.", "Invalid Token" : "Ugyldig nøkkel", "No file was uploaded. Unknown error" : "Ingen filer ble lastet opp. Ukjent feil.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Mangler midlertidig mappe", "Failed to write to disk" : "Klarte ikke å skrive til disk", "Not enough storage available" : "Ikke nok lagringsplass", + "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.", "Upload failed. Could not find uploaded file" : "Opplasting feilet. Fant ikke opplastet fil.", "Upload failed. Could not get file info." : "Opplasting feilet. Klarte ikke å finne informasjon om fil.", "Invalid directory." : "Ugyldig katalog.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Kan ikke fastslå datoen", "This operation is forbidden" : "Operasjonen er forbudt", "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator", - "Error moving file." : "Feil ved flytting av fil.", - "Error moving file" : "Feil ved flytting av fil", - "Error" : "Feil", - "{new_name} already exists" : "{new_name} finnes allerede", - "Could not rename file" : "Klarte ikke å gi nytt navn til fil", - "Could not create file" : "Klarte ikke å opprette fil", - "Could not create folder" : "Klarte ikke å opprette mappe", - "Error deleting file." : "Feil ved sletting av fil.", "No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Er favoritt", "Favorite" : "Gjør til favoritt", - "{newname} already exists" : "{newname} finnes allerede", - "Upload" : "Last opp", - "Text file" : "Tekstfil", - "New text file.txt" : "Ny tekstfil.txt", "Folder" : "Mappe", "New folder" : "Ny mappe", + "{newname} already exists" : "{newname} finnes allerede", + "Upload" : "Last opp", "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av taggene", "A new file or folder has been created" : "En ny fil eller mappe ble opprettet", "A file or folder has been changed" : "En fil eller mappe ble endret", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Endret av %2$s", "Deleted by %2$s" : "Slettet av %2$s", "Restored by %2$s" : "Gjenopprettet av %2$s", - "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet", - "%s could not be renamed" : "Kunne ikke gi nytt navn til %s", "Upload (max. %s)" : "Opplasting (maks. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Største opplastingsstørrelse", "max. possible: " : "max. mulige:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM kan det ta inntil 5 minutter fra denne verdien lagres til den trer i kraft.", "Save" : "Lagre", - "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. manglende rettigheter.", "Settings" : "Innstillinger", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Bruk denne adressen for å få tilgang til filene dine via WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", "Currently scanning" : "Skanner nå", "No favorites" : "Ingen favoritter", - "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her" + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her", + "Text file" : "Tekstfil", + "New text file.txt" : "Ny tekstfil.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index 69e8ca742a..32eb320296 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -2,13 +2,6 @@ "Storage not available" : "Lagringsplass ikke tilgjengelig", "Storage invalid" : "Lagringsplass ugyldig", "Unknown error" : "Ukjent feil", - "Could not move %s - File with this name already exists" : "Kan ikke flytte %s - En fil med samme navn finnes allerede", - "Could not move %s" : "Kunne ikke flytte %s", - "Permission denied" : "Tilgang nektet", - "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.", - "The name %s is already used in the folder %s. Please choose a different name." : "Navnet %s brukes allerede i mappen %s. Velg et annet navn.", - "Error when creating the file" : "Feil ved oppretting av filen", - "Error when creating the folder" : "Feil ved oppretting av mappen", "Unable to set upload directory." : "Kunne ikke sette opplastingskatalog.", "Invalid Token" : "Ugyldig nøkkel", "No file was uploaded. Unknown error" : "Ingen filer ble lastet opp. Ukjent feil.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Mangler midlertidig mappe", "Failed to write to disk" : "Klarte ikke å skrive til disk", "Not enough storage available" : "Ikke nok lagringsplass", + "The target folder has been moved or deleted." : "Målmappen er blitt flyttet eller slettet.", "Upload failed. Could not find uploaded file" : "Opplasting feilet. Fant ikke opplastet fil.", "Upload failed. Could not get file info." : "Opplasting feilet. Klarte ikke å finne informasjon om fil.", "Invalid directory." : "Ugyldig katalog.", @@ -44,14 +38,6 @@ "Unable to determine date" : "Kan ikke fastslå datoen", "This operation is forbidden" : "Operasjonen er forbudt", "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator", - "Error moving file." : "Feil ved flytting av fil.", - "Error moving file" : "Feil ved flytting av fil", - "Error" : "Feil", - "{new_name} already exists" : "{new_name} finnes allerede", - "Could not rename file" : "Klarte ikke å gi nytt navn til fil", - "Could not create file" : "Klarte ikke å opprette fil", - "Could not create folder" : "Klarte ikke å opprette mappe", - "Error deleting file." : "Feil ved sletting av fil.", "No entries in this folder match '{filter}'" : "Ingen oppføringer i denne mappen stemmer med '{filter}'", "Name" : "Navn", "Size" : "Størrelse", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Er favoritt", "Favorite" : "Gjør til favoritt", - "{newname} already exists" : "{newname} finnes allerede", - "Upload" : "Last opp", - "Text file" : "Tekstfil", - "New text file.txt" : "Ny tekstfil.txt", "Folder" : "Mappe", "New folder" : "Ny mappe", + "{newname} already exists" : "{newname} finnes allerede", + "Upload" : "Last opp", "An error occurred while trying to update the tags" : "En feil oppstod under oppdatering av taggene", "A new file or folder has been created" : "En ny fil eller mappe ble opprettet", "A file or folder has been changed" : "En fil eller mappe ble endret", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Endret av %2$s", "Deleted by %2$s" : "Slettet av %2$s", "Restored by %2$s" : "Gjenopprettet av %2$s", - "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet", - "%s could not be renamed" : "Kunne ikke gi nytt navn til %s", "Upload (max. %s)" : "Opplasting (maks. %s)", "File handling" : "Filhåndtering", "Maximum upload size" : "Største opplastingsstørrelse", "max. possible: " : "max. mulige:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM kan det ta inntil 5 minutter fra denne verdien lagres til den trer i kraft.", "Save" : "Lagre", - "Can not be edited from here due to insufficient permissions." : "Kan ikke redigeres her pga. manglende rettigheter.", "Settings" : "Innstillinger", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Bruk denne adressen for å få tilgang til filene dine via WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", "Currently scanning" : "Skanner nå", "No favorites" : "Ingen favoritter", - "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her" + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her", + "Text file" : "Tekstfil", + "New text file.txt" : "Ny tekstfil.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/nds.js b/apps/files/l10n/nds.js index 9b28220ae4..bb3dc42971 100644 --- a/apps/files/l10n/nds.js +++ b/apps/files/l10n/nds.js @@ -3,7 +3,10 @@ OC.L10N.register( { "Files" : "Dateien", "Delete" : "Löschen", + "Details" : "Details", "Name" : "Name", + "New folder" : "Neuer Ordner", + "Upload" : "Hochladen", "Settings" : "Einstellungen", "WebDAV" : "WebDAV" }, diff --git a/apps/files/l10n/nds.json b/apps/files/l10n/nds.json index 4ab8de68b3..c8e93f2fa2 100644 --- a/apps/files/l10n/nds.json +++ b/apps/files/l10n/nds.json @@ -1,7 +1,10 @@ { "translations": { "Files" : "Dateien", "Delete" : "Löschen", + "Details" : "Details", "Name" : "Name", + "New folder" : "Neuer Ordner", + "Upload" : "Hochladen", "Settings" : "Einstellungen", "WebDAV" : "WebDAV" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 53ec6c1d80..f99d331423 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Opslag niet beschikbaar", "Storage invalid" : "Opslag ongeldig", "Unknown error" : "Onbekende fout", - "Could not move %s - File with this name already exists" : "Kon %s niet verplaatsen - Er bestaat al een bestand met deze naam", - "Could not move %s" : "Kon %s niet verplaatsen", - "Permission denied" : "Toegang geweigerd", - "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.", - "The name %s is already used in the folder %s. Please choose a different name." : "De naam %s bestaat al in map %s. Kies een andere naam.", - "Error when creating the file" : "Fout bij creëren bestand", - "Error when creating the folder" : "Fout bij aanmaken map", "Unable to set upload directory." : "Kan uploadmap niet instellen.", "Invalid Token" : "Ongeldig Token", "No file was uploaded. Unknown error" : "Er was geen bestand geladen. Onbekende fout", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Er ontbreekt een tijdelijke map", "Failed to write to disk" : "Schrijven naar schijf mislukt", "Not enough storage available" : "Niet genoeg opslagruimte beschikbaar", + "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.", "Upload failed. Could not find uploaded file" : "Upload mislukt. Kon geüploade bestand niet vinden", "Upload failed. Could not get file info." : "Upload mislukt. Kon geen bestandsinfo krijgen.", "Invalid directory." : "Ongeldige directory.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favorieten", "Home" : "Thuis", "Close" : "Sluiten", + "Upload cancelled." : "Uploaden geannuleerd.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is", "Total file size {size1} exceeds upload limit {size2}" : "Totale bestandsgrootte {size1} groter dan uploadlimiet {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. U upload {size1}, maar is is slechts {size2} beschikbaar", - "Upload cancelled." : "Uploaden geannuleerd.", "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Kon datum niet vaststellen", "This operation is forbidden" : "Deze taak is verboden", "This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder", - "Error moving file." : "Fout bij verplaatsen bestand.", - "Error moving file" : "Fout bij verplaatsen bestand", - "Error" : "Fout", - "{new_name} already exists" : "{new_name} bestaat al", - "Could not rename file" : "Kon de naam van het bestand niet wijzigen", - "Could not create file" : "Kon bestand niet creëren", - "Could not create folder" : "Kon niet creëren map", - "Error deleting file." : "Fout bij verwijderen bestand.", + "Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al", + "Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen", + "{newName} already exists" : "{newName} bestaat al", + "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.", + "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen", + "Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken", + "Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken omdat het al bestaat", + "Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken", + "Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken omdat die al bestaat", + "Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".", "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", "Name" : "Naam", "Size" : "Grootte", @@ -74,12 +71,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favoriet", "Favorite" : "Favoriet", - "{newname} already exists" : "{newname} bestaat al", - "Upload" : "Uploaden", - "Text file" : "Tekstbestand", - "New text file.txt" : "Nieuw tekstbestand.txt", "Folder" : "Map", "New folder" : "Nieuwe map", + "{newname} already exists" : "{newname} bestaat al", + "Upload" : "Uploaden", "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de tags bij te werken", "A new file or folder has been created" : "Een nieuw bestand of map is aangemaakt", "A file or folder has been changed" : "Een bestand of map is gewijzigd", @@ -98,15 +93,13 @@ OC.L10N.register( "Changed by %2$s" : "Gewijzigd door %2$s", "Deleted by %2$s" : "Verwijderd door %2$s", "Restored by %2$s" : "Hersteld door %2$s", - "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", - "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Bestand", "Maximum upload size" : "Maximale bestandsgrootte voor uploads", "max. possible: " : "max. mogelijk: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Met PHP-FPM kan het tot 5 minuten duren voordat de aanpassing van deze waarde effect heeft.", "Save" : "Bewaren", - "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.", + "Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.", "Settings" : "Instellingen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Gebruik deze link om uw bestanden via WebDAV te benaderen", @@ -120,6 +113,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", "Currently scanning" : "Nu aan het scannen", "No favorites" : "Geen favorieten", - "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont" + "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont", + "Text file" : "Tekstbestand", + "New text file.txt" : "Nieuw tekstbestand.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 6a077b1cc1..aaf4edcfdd 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -2,13 +2,6 @@ "Storage not available" : "Opslag niet beschikbaar", "Storage invalid" : "Opslag ongeldig", "Unknown error" : "Onbekende fout", - "Could not move %s - File with this name already exists" : "Kon %s niet verplaatsen - Er bestaat al een bestand met deze naam", - "Could not move %s" : "Kon %s niet verplaatsen", - "Permission denied" : "Toegang geweigerd", - "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.", - "The name %s is already used in the folder %s. Please choose a different name." : "De naam %s bestaat al in map %s. Kies een andere naam.", - "Error when creating the file" : "Fout bij creëren bestand", - "Error when creating the folder" : "Fout bij aanmaken map", "Unable to set upload directory." : "Kan uploadmap niet instellen.", "Invalid Token" : "Ongeldig Token", "No file was uploaded. Unknown error" : "Er was geen bestand geladen. Onbekende fout", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Er ontbreekt een tijdelijke map", "Failed to write to disk" : "Schrijven naar schijf mislukt", "Not enough storage available" : "Niet genoeg opslagruimte beschikbaar", + "The target folder has been moved or deleted." : "De doelmap is verplaatst of verwijderd.", "Upload failed. Could not find uploaded file" : "Upload mislukt. Kon geüploade bestand niet vinden", "Upload failed. Could not get file info." : "Upload mislukt. Kon geen bestandsinfo krijgen.", "Invalid directory." : "Ongeldige directory.", @@ -28,10 +22,10 @@ "Favorites" : "Favorieten", "Home" : "Thuis", "Close" : "Sluiten", + "Upload cancelled." : "Uploaden geannuleerd.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is", "Total file size {size1} exceeds upload limit {size2}" : "Totale bestandsgrootte {size1} groter dan uploadlimiet {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. U upload {size1}, maar is is slechts {size2} beschikbaar", - "Upload cancelled." : "Uploaden geannuleerd.", "Could not get result from server." : "Kon het resultaat van de server niet terugkrijgen.", "File upload is in progress. Leaving the page now will cancel the upload." : "Bestandsupload is bezig. Wanneer de pagina nu verlaten wordt, stopt de upload.", "Actions" : "Acties", @@ -44,14 +38,17 @@ "Unable to determine date" : "Kon datum niet vaststellen", "This operation is forbidden" : "Deze taak is verboden", "This directory is unavailable, please check the logs or contact the administrator" : "Deze map is niet beschikbaar. Verifieer de logs of neem contact op met de beheerder", - "Error moving file." : "Fout bij verplaatsen bestand.", - "Error moving file" : "Fout bij verplaatsen bestand", - "Error" : "Fout", - "{new_name} already exists" : "{new_name} bestaat al", - "Could not rename file" : "Kon de naam van het bestand niet wijzigen", - "Could not create file" : "Kon bestand niet creëren", - "Could not create folder" : "Kon niet creëren map", - "Error deleting file." : "Fout bij verwijderen bestand.", + "Could not move \"{file}\", target exists" : "Kon \"{file}\" niet verplaatsen, doel bestaat al", + "Could not move \"{file}\"" : "Kon \"{file}\" niet verplaatsen", + "{newName} already exists" : "{newName} bestaat al", + "Could not rename \"{fileName}\", it does not exist any more" : "Kon \"{fileName}\" niet hernoemen, het bestaat niet meer", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "De naam \"{targetName}\" bestaat al in map \"{dir}\". Kies een andere naam.", + "Could not rename \"{fileName}\"" : "Kon \"{fileName}\" niet hernoemen", + "Could not create file \"{file}\"" : "Kon \"{file}\" niet aanmaken", + "Could not create file \"{file}\" because it already exists" : "Kon \"{file}\" niet aanmaken omdat het al bestaat", + "Could not create folder \"{dir}\"" : "Kon map \"{dir}\" niet aanmaken", + "Could not create folder \"{dir}\" because it already exists" : "Kon map \"{dir}\" niet aanmaken omdat die al bestaat", + "Error deleting file \"{fileName}\"." : "Fout bij verwijderen bestand \"{fileName}\".", "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", "Name" : "Naam", "Size" : "Grootte", @@ -72,12 +69,10 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favoriet", "Favorite" : "Favoriet", - "{newname} already exists" : "{newname} bestaat al", - "Upload" : "Uploaden", - "Text file" : "Tekstbestand", - "New text file.txt" : "Nieuw tekstbestand.txt", "Folder" : "Map", "New folder" : "Nieuwe map", + "{newname} already exists" : "{newname} bestaat al", + "Upload" : "Uploaden", "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de tags bij te werken", "A new file or folder has been created" : "Een nieuw bestand of map is aangemaakt", "A file or folder has been changed" : "Een bestand of map is gewijzigd", @@ -96,15 +91,13 @@ "Changed by %2$s" : "Gewijzigd door %2$s", "Deleted by %2$s" : "Verwijderd door %2$s", "Restored by %2$s" : "Hersteld door %2$s", - "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", - "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", "File handling" : "Bestand", "Maximum upload size" : "Maximale bestandsgrootte voor uploads", "max. possible: " : "max. mogelijk: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Met PHP-FPM kan het tot 5 minuten duren voordat de aanpassing van deze waarde effect heeft.", "Save" : "Bewaren", - "Can not be edited from here due to insufficient permissions." : "Kan hier niet worden bewerkt wegens onvoldoende permissies.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Met PHP-FPM kan het 5 minuten duren voordat wijzigingen zijn doorgevoerd.", + "Missing permissions to edit from here." : "Ontbrekende rechten om vanaf hier te bewerken.", "Settings" : "Instellingen", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Gebruik deze link om uw bestanden via WebDAV te benaderen", @@ -118,6 +111,8 @@ "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", "Currently scanning" : "Nu aan het scannen", "No favorites" : "Geen favorieten", - "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont" + "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont", + "Text file" : "Tekstbestand", + "New text file.txt" : "Nieuw tekstbestand.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js index 924670d596..efe3707c21 100644 --- a/apps/files/l10n/nn_NO.js +++ b/apps/files/l10n/nn_NO.js @@ -2,8 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "Ukjend feil", - "Could not move %s - File with this name already exists" : "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet", - "Could not move %s" : "Klarte ikkje flytta %s", "Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.", "Invalid Token" : "Ugyldig token", "No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil", @@ -22,8 +20,8 @@ OC.L10N.register( "Favorites" : "Favorittar", "Home" : "Heime", "Close" : "Lukk", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Upload cancelled." : "Opplasting avbroten.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "Actions" : "Handlingar", @@ -32,9 +30,6 @@ OC.L10N.register( "Delete" : "Slett", "Details" : "Detaljar", "Pending" : "Under vegs", - "Error moving file" : "Feil ved flytting av fil", - "Error" : "Feil", - "{new_name} already exists" : "{new_name} finst allereie", "Name" : "Namn", "Size" : "Storleik", "Modified" : "Endra", @@ -47,10 +42,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!", "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)", "Favorite" : "Favoritt", - "Upload" : "Last opp", - "Text file" : "Tekst fil", "Folder" : "Mappe", "New folder" : "Ny mappe", + "Upload" : "Last opp", "A new file or folder has been created" : "Ei ny fil eller mappe er oppretta", "A file or folder has been changed" : "Ei fil eller mappe er endra", "A file or folder has been deleted" : "Ei fil eller mappe er sletta", @@ -61,7 +55,6 @@ OC.L10N.register( "%2$s changed %1$s" : "%2$s endra %1$s", "You deleted %1$s" : "Du sletta %1$s", "%2$s deleted %1$s" : "%2$s sletta %1$s", - "%s could not be renamed" : "Klarte ikkje å omdøypa på %s", "File handling" : "Filhandtering", "Maximum upload size" : "Maksimal opplastingsstorleik", "max. possible: " : "maks. moglege:", @@ -71,6 +64,7 @@ OC.L10N.register( "Cancel upload" : "Avbryt opplasting", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", - "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent." + "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.", + "Text file" : "Tekst fil" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json index 05e6f0a9d2..929f8c0d7f 100644 --- a/apps/files/l10n/nn_NO.json +++ b/apps/files/l10n/nn_NO.json @@ -1,7 +1,5 @@ { "translations": { "Unknown error" : "Ukjend feil", - "Could not move %s - File with this name already exists" : "Klarte ikkje flytta %s – det finst allereie ei fil med dette namnet", - "Could not move %s" : "Klarte ikkje flytta %s", "Unable to set upload directory." : "Klarte ikkje å endra opplastingsmappa.", "Invalid Token" : "Ugyldig token", "No file was uploaded. Unknown error" : "Ingen filer lasta opp. Ukjend feil", @@ -20,8 +18,8 @@ "Favorites" : "Favorittar", "Home" : "Heime", "Close" : "Lukk", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Upload cancelled." : "Opplasting avbroten.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "Actions" : "Handlingar", @@ -30,9 +28,6 @@ "Delete" : "Slett", "Details" : "Detaljar", "Pending" : "Under vegs", - "Error moving file" : "Feil ved flytting av fil", - "Error" : "Feil", - "{new_name} already exists" : "{new_name} finst allereie", "Name" : "Namn", "Size" : "Storleik", "Modified" : "Endra", @@ -45,10 +40,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!", "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)", "Favorite" : "Favoritt", - "Upload" : "Last opp", - "Text file" : "Tekst fil", "Folder" : "Mappe", "New folder" : "Ny mappe", + "Upload" : "Last opp", "A new file or folder has been created" : "Ei ny fil eller mappe er oppretta", "A file or folder has been changed" : "Ei fil eller mappe er endra", "A file or folder has been deleted" : "Ei fil eller mappe er sletta", @@ -59,7 +53,6 @@ "%2$s changed %1$s" : "%2$s endra %1$s", "You deleted %1$s" : "Du sletta %1$s", "%2$s deleted %1$s" : "%2$s sletta %1$s", - "%s could not be renamed" : "Klarte ikkje å omdøypa på %s", "File handling" : "Filhandtering", "Maximum upload size" : "Maksimal opplastingsstorleik", "max. possible: " : "maks. moglege:", @@ -69,6 +62,7 @@ "Cancel upload" : "Avbryt opplasting", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", - "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent." + "Files are being scanned, please wait." : "Skannar filer, ver venleg og vent.", + "Text file" : "Tekst fil" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js index 6a0a05c782..a3088b663f 100644 --- a/apps/files/l10n/oc.js +++ b/apps/files/l10n/oc.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Supòrt d'emmagazinatge pas disponible", "Storage invalid" : "Supòrt d'emmagazinatge pas valable", "Unknown error" : "Error Desconeguda ", - "Could not move %s - File with this name already exists" : "Impossible de desplaçar %s - Un fichièr que pòrta aqueste nom existís ja", - "Could not move %s" : "Impossible de desplaçar %s", - "Permission denied" : "Permission refusada", - "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.", - "The name %s is already used in the folder %s. Please choose a different name." : "Lo nom %s es ja utilizat dins lo dorsièr %s. Mercé de causir un nom diferent.", - "Error when creating the file" : "Error pendent la creacion del fichièr", - "Error when creating the folder" : "Error pendent la creacion del dorsièr", "Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.", "Invalid Token" : "Geton invalid", "No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Abséncia de dorsièr temporari", "Failed to write to disk" : "Error d'escritura sul disc", "Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible", + "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.", "Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.", "Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.", "Invalid directory." : "Dorsièr invalid.", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "Impossible de determinar la data", "This operation is forbidden" : "L'operacion es interdicha", "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator", - "Error moving file." : "Error al moment del desplaçament del fichièr.", - "Error moving file" : "Error al moment del desplaçament del fichièr", - "Error" : "Error", - "{new_name} already exists" : "{new_name} existís ja", - "Could not rename file" : "Impossible de renomenar lo fichièr", - "Could not create file" : "Impossible de crear lo fichièr", - "Could not create folder" : "Impossible de crear lo dorsièr", - "Error deleting file." : "Error pendent la supression del fichièr.", + "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís", + "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"", + "{newName} already exists" : "{newName} existís ja", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.", + "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja", + "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja", + "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".", "No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'", "Name" : "Nom", "Size" : "Talha", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marcat coma favorit", "Favorite" : "Favorit", - "{newname} already exists" : "{new_name} existís ja", - "Upload" : "Cargament", - "Text file" : "Fichièr tèxte", - "New text file.txt" : "Novèl fichièr tèxte .txt", "Folder" : "Dorsièr", "New folder" : "Novèl dorsièr", + "{newname} already exists" : "{new_name} existís ja", + "Upload" : "Cargament", "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas", "A new file or folder has been created" : "Un novèl fichièr o repertòri es estat creat", "A file or folder has been changed" : "Un fichièr o un repertòri es estat modificat", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Modificat per %2$s", "Deleted by %2$s" : "Suprimit per %2$s", "Restored by %2$s" : "Restablit per %2$s", - "%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ", - "%s could not be renamed" : "%s pòt pas èsser renomenat", "Upload (max. %s)" : "Mandadís (max. %s)", "File handling" : "Gestion de fichièrs", "Maximum upload size" : "Talha max. de mandadís", "max. possible: " : "Max. possible :", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.", "Save" : "Salvar", - "Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.", + "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.", "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilizatz aquesta adreça per accedir a vòstres fichièrs per WebDAV", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", "Currently scanning" : "Analisi en cors", "No favorites" : "Pas cap de favorit", - "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí" + "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí", + "Text file" : "Fichièr tèxte", + "New text file.txt" : "Novèl fichièr tèxte .txt" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json index 0577b75076..c604860569 100644 --- a/apps/files/l10n/oc.json +++ b/apps/files/l10n/oc.json @@ -2,13 +2,6 @@ "Storage not available" : "Supòrt d'emmagazinatge pas disponible", "Storage invalid" : "Supòrt d'emmagazinatge pas valable", "Unknown error" : "Error Desconeguda ", - "Could not move %s - File with this name already exists" : "Impossible de desplaçar %s - Un fichièr que pòrta aqueste nom existís ja", - "Could not move %s" : "Impossible de desplaçar %s", - "Permission denied" : "Permission refusada", - "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.", - "The name %s is already used in the folder %s. Please choose a different name." : "Lo nom %s es ja utilizat dins lo dorsièr %s. Mercé de causir un nom diferent.", - "Error when creating the file" : "Error pendent la creacion del fichièr", - "Error when creating the folder" : "Error pendent la creacion del dorsièr", "Unable to set upload directory." : "Impossible de definir lo dorsièr de destinacion.", "Invalid Token" : "Geton invalid", "No file was uploaded. Unknown error" : "Cap de fichièr es pas estat mandat. Error desconeguda", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Abséncia de dorsièr temporari", "Failed to write to disk" : "Error d'escritura sul disc", "Not enough storage available" : "Pas pro d'espaci d'emmagazinatge de disponible", + "The target folder has been moved or deleted." : "Lo dorsièr cibla es estat desplaçat o suprimit.", "Upload failed. Could not find uploaded file" : "Lo mandadís a fracassat. Impossible de trobar lo fichièr mandat.", "Upload failed. Could not get file info." : "Lo mandadís a fracassat. Impossible d'obténer las informacions del fichièr.", "Invalid directory." : "Dorsièr invalid.", @@ -44,14 +38,17 @@ "Unable to determine date" : "Impossible de determinar la data", "This operation is forbidden" : "L'operacion es interdicha", "This directory is unavailable, please check the logs or contact the administrator" : "Aqueste repertòri es pas disponible. Consultatz los logs o contactatz vòstre administrator", - "Error moving file." : "Error al moment del desplaçament del fichièr.", - "Error moving file" : "Error al moment del desplaçament del fichièr", - "Error" : "Error", - "{new_name} already exists" : "{new_name} existís ja", - "Could not rename file" : "Impossible de renomenar lo fichièr", - "Could not create file" : "Impossible de crear lo fichièr", - "Could not create folder" : "Impossible de crear lo dorsièr", - "Error deleting file." : "Error pendent la supression del fichièr.", + "Could not move \"{file}\", target exists" : "Impossible de desplaçar \"{file}\", la cibla existís", + "Could not move \"{file}\"" : "Impossible de desplaçar \"{file}\"", + "{newName} already exists" : "{newName} existís ja", + "Could not rename \"{fileName}\", it does not exist any more" : "Impossible de renomenar \"{file}\", existís pas mai", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Lo nom \"{targetName}\" es ja utilizat dins lo dorsièr \"{dir}\". Mercé de causir un nom diferent.", + "Could not rename \"{fileName}\"" : "Impossible de renomenar \"{fileName}\"", + "Could not create file \"{file}\"" : "Impossible de crear lo fichièr \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Impossible de crear lo fichièr \"{file}\" perque existís ja", + "Could not create folder \"{dir}\"" : "Impossible de crear lo dorsièr \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Impossible de crear lo dorsièr \"{dir}\" perque existís ja", + "Error deleting file \"{fileName}\"." : "Error pendent la supression del fichièr \"{fileName}\".", "No entries in this folder match '{filter}'" : "Cap d'entrada d'aqueste dorsièr correspond pas a '{filter}'", "Name" : "Nom", "Size" : "Talha", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"], "Favorited" : "Marcat coma favorit", "Favorite" : "Favorit", - "{newname} already exists" : "{new_name} existís ja", - "Upload" : "Cargament", - "Text file" : "Fichièr tèxte", - "New text file.txt" : "Novèl fichièr tèxte .txt", "Folder" : "Dorsièr", "New folder" : "Novèl dorsièr", + "{newname} already exists" : "{new_name} existís ja", + "Upload" : "Cargament", "An error occurred while trying to update the tags" : "Una error s'es produsida al moment de la mesa a jorn de las etiquetas", "A new file or folder has been created" : "Un novèl fichièr o repertòri es estat creat", "A file or folder has been changed" : "Un fichièr o un repertòri es estat modificat", @@ -97,15 +92,13 @@ "Changed by %2$s" : "Modificat per %2$s", "Deleted by %2$s" : "Suprimit per %2$s", "Restored by %2$s" : "Restablit per %2$s", - "%s could not be renamed as it has been deleted" : "%s pòt pas èsser renomenat perque es estat suprimit ", - "%s could not be renamed" : "%s pòt pas èsser renomenat", "Upload (max. %s)" : "Mandadís (max. %s)", "File handling" : "Gestion de fichièrs", "Maximum upload size" : "Talha max. de mandadís", "max. possible: " : "Max. possible :", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Amb PHP-FPM, se pòdon passar fins a 5 minutas abans qu'aquesta valor siá aplicada.", "Save" : "Salvar", - "Can not be edited from here due to insufficient permissions." : "Pòt pas èsser modificat aicí a causa de permissions insufisentas.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Amb PHP-FPM se pòdon passar 5 minutas per que los cambiaments s'apliquen.", + "Missing permissions to edit from here." : "Manca de permissions per editar a partir d'aicí.", "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilizatz aquesta adreça per accedir a vòstres fichièrs per WebDAV", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "Los fichièrs son en cors d'analisi, pacientatz.", "Currently scanning" : "Analisi en cors", "No favorites" : "Pas cap de favorit", - "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí" + "Files and folders you mark as favorite will show up here" : "Los fichièrs e dorsièrs aponduts a vòstres favorits apareisseràn aicí", + "Text file" : "Fichièr tèxte", + "New text file.txt" : "Novèl fichièr tèxte .txt" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/apps/files/l10n/pa.js b/apps/files/l10n/pa.js index dfb7c39283..847adbc5ac 100644 --- a/apps/files/l10n/pa.js +++ b/apps/files/l10n/pa.js @@ -7,7 +7,6 @@ OC.L10N.register( "Rename" : "ਨਾਂ ਬਦਲੋ", "Delete" : "ਹਟਾਓ", "Details" : "ਵੇਰਵ", - "Error" : "ਗਲਤੀ", "Upload" : "ਅੱਪਲੋਡ", "Settings" : "ਸੈਟਿੰਗ", "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ" diff --git a/apps/files/l10n/pa.json b/apps/files/l10n/pa.json index c1f4dae97f..6d7025feec 100644 --- a/apps/files/l10n/pa.json +++ b/apps/files/l10n/pa.json @@ -5,7 +5,6 @@ "Rename" : "ਨਾਂ ਬਦਲੋ", "Delete" : "ਹਟਾਓ", "Details" : "ਵੇਰਵ", - "Error" : "ਗਲਤੀ", "Upload" : "ਅੱਪਲੋਡ", "Settings" : "ਸੈਟਿੰਗ", "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ" diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index 5cba43675d..6478fbe5eb 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Pamięć nie dostępna", "Storage invalid" : "Pamięć nieprawidłowa", "Unknown error" : "Nieznany błąd", - "Could not move %s - File with this name already exists" : "Nie można było przenieść %s - Plik o takiej nazwie już istnieje", - "Could not move %s" : "Nie można było przenieść %s", - "Permission denied" : "Dostęp zabroniony", - "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty", - "The name %s is already used in the folder %s. Please choose a different name." : "Nazwa %s jest już używana w folderze %s. Proszę wybrać inną nazwę.", - "Error when creating the file" : "Błąd przy tworzeniu pliku", - "Error when creating the folder" : "Błąd przy tworzeniu folderu", "Unable to set upload directory." : "Nie można ustawić katalog wczytywania.", "Invalid Token" : "Nieprawidłowy Token", "No file was uploaded. Unknown error" : "Żaden plik nie został załadowany. Nieznany błąd", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Brak folderu tymczasowego", "Failed to write to disk" : "Błąd zapisu na dysk", "Not enough storage available" : "Za mało dostępnego miejsca", + "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty", "Upload failed. Could not find uploaded file" : "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku", "Upload failed. Could not get file info." : "Nieudane przesłanie. Nie można pobrać informacji o pliku.", "Invalid directory." : "Zła ścieżka.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Ulubione", "Home" : "Dom", "Close" : "Zamknij", + "Upload cancelled." : "Wczytywanie anulowane.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów", "Total file size {size1} exceeds upload limit {size2}" : "Całkowity rozmiar {size1} przekracza limit uploadu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, przesyłasz {size1} a pozostało tylko {size2}", - "Upload cancelled." : "Wczytywanie anulowane.", "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Wybierz", "Pending" : "Oczekujące", "Unable to determine date" : "Nie można ustalić daty", - "Error moving file." : "Błąd podczas przenoszenia pliku.", - "Error moving file" : "Błąd prz przenoszeniu pliku", - "Error" : "Błąd", - "{new_name} already exists" : "{new_name} już istnieje", - "Could not rename file" : "Nie można zmienić nazwy pliku", - "Could not create file" : "Nie można utworzyć pliku", - "Could not create folder" : "Nie można utworzyć folderu", - "Error deleting file." : "Błąd podczas usuwania pliku", "No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'", "Name" : "Nazwa", "Size" : "Rozmiar", @@ -70,10 +56,9 @@ OC.L10N.register( "Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)", "Favorited" : "Ulubione", "Favorite" : "Ulubione", - "Upload" : "Wyślij", - "Text file" : "Plik tekstowy", "Folder" : "Folder", "New folder" : "Nowy folder", + "Upload" : "Wyślij", "A new file or folder has been created" : "Nowy plik lub folder został utworzony", "A file or folder has been changed" : "Plik lub folder został zmieniony", "A file or folder has been deleted" : "Plik lub folder został usunięty", @@ -87,8 +72,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s usunął %1$s", "You restored %1$s" : "Przywróciłeś %1$s", "%2$s restored %1$s" : "%2$s przywrócił %1$s", - "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty", - "%s could not be renamed" : "%s nie można zmienić nazwy", "Upload (max. %s)" : "Wysyłka (max. %s)", "File handling" : "Zarządzanie plikami", "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", @@ -103,6 +86,7 @@ OC.L10N.register( "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", - "Currently scanning" : "Aktualnie skanowane" + "Currently scanning" : "Aktualnie skanowane", + "Text file" : "Plik tekstowy" }, "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 5b09f32613..98a0592cc7 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -2,13 +2,6 @@ "Storage not available" : "Pamięć nie dostępna", "Storage invalid" : "Pamięć nieprawidłowa", "Unknown error" : "Nieznany błąd", - "Could not move %s - File with this name already exists" : "Nie można było przenieść %s - Plik o takiej nazwie już istnieje", - "Could not move %s" : "Nie można było przenieść %s", - "Permission denied" : "Dostęp zabroniony", - "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty", - "The name %s is already used in the folder %s. Please choose a different name." : "Nazwa %s jest już używana w folderze %s. Proszę wybrać inną nazwę.", - "Error when creating the file" : "Błąd przy tworzeniu pliku", - "Error when creating the folder" : "Błąd przy tworzeniu folderu", "Unable to set upload directory." : "Nie można ustawić katalog wczytywania.", "Invalid Token" : "Nieprawidłowy Token", "No file was uploaded. Unknown error" : "Żaden plik nie został załadowany. Nieznany błąd", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Brak folderu tymczasowego", "Failed to write to disk" : "Błąd zapisu na dysk", "Not enough storage available" : "Za mało dostępnego miejsca", + "The target folder has been moved or deleted." : "Folder docelowy został przeniesiony lub usunięty", "Upload failed. Could not find uploaded file" : "Nieudane przesłanie. Nie można znaleźć przesyłanego pliku", "Upload failed. Could not get file info." : "Nieudane przesłanie. Nie można pobrać informacji o pliku.", "Invalid directory." : "Zła ścieżka.", @@ -28,10 +22,10 @@ "Favorites" : "Ulubione", "Home" : "Dom", "Close" : "Zamknij", + "Upload cancelled." : "Wczytywanie anulowane.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów", "Total file size {size1} exceeds upload limit {size2}" : "Całkowity rozmiar {size1} przekracza limit uploadu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, przesyłasz {size1} a pozostało tylko {size2}", - "Upload cancelled." : "Wczytywanie anulowane.", "Could not get result from server." : "Nie można uzyskać wyniku z serwera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Wysyłanie pliku jest w toku. Jeśli opuścisz tę stronę, wysyłanie zostanie przerwane.", "Actions" : "Akcje", @@ -42,14 +36,6 @@ "Select" : "Wybierz", "Pending" : "Oczekujące", "Unable to determine date" : "Nie można ustalić daty", - "Error moving file." : "Błąd podczas przenoszenia pliku.", - "Error moving file" : "Błąd prz przenoszeniu pliku", - "Error" : "Błąd", - "{new_name} already exists" : "{new_name} już istnieje", - "Could not rename file" : "Nie można zmienić nazwy pliku", - "Could not create file" : "Nie można utworzyć pliku", - "Could not create folder" : "Nie można utworzyć folderu", - "Error deleting file." : "Błąd podczas usuwania pliku", "No entries in this folder match '{filter}'" : "Brak wyników pasujących do '{filter}'", "Name" : "Nazwa", "Size" : "Rozmiar", @@ -68,10 +54,9 @@ "Your storage is almost full ({usedSpacePercent}%)" : "Twój magazyn jest prawie pełny ({usedSpacePercent}%)", "Favorited" : "Ulubione", "Favorite" : "Ulubione", - "Upload" : "Wyślij", - "Text file" : "Plik tekstowy", "Folder" : "Folder", "New folder" : "Nowy folder", + "Upload" : "Wyślij", "A new file or folder has been created" : "Nowy plik lub folder został utworzony", "A file or folder has been changed" : "Plik lub folder został zmieniony", "A file or folder has been deleted" : "Plik lub folder został usunięty", @@ -85,8 +70,6 @@ "%2$s deleted %1$s" : "%2$s usunął %1$s", "You restored %1$s" : "Przywróciłeś %1$s", "%2$s restored %1$s" : "%2$s przywrócił %1$s", - "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty", - "%s could not be renamed" : "%s nie można zmienić nazwy", "Upload (max. %s)" : "Wysyłka (max. %s)", "File handling" : "Zarządzanie plikami", "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", @@ -101,6 +84,7 @@ "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", "Files are being scanned, please wait." : "Skanowanie plików, proszę czekać.", - "Currently scanning" : "Aktualnie skanowane" + "Currently scanning" : "Aktualnie skanowane", + "Text file" : "Plik tekstowy" },"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 70d38e747b..6619da366e 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Armazanamento não disponível", "Storage invalid" : "Armazenamento invávilido", "Unknown error" : "Erro desconhecido", - "Could not move %s - File with this name already exists" : "Impossível mover %s - Já existe um arquivo com esse nome", - "Could not move %s" : "Impossível mover %s", - "Permission denied" : "Permissão Negada", - "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.", - "The name %s is already used in the folder %s. Please choose a different name." : "O nome %s já é usado na pasta %s. Por favor, escolha um nome diferente.", - "Error when creating the file" : "Erro ao criar o arquivo", - "Error when creating the folder" : "Erro ao criar a pasta", "Unable to set upload directory." : "Impossível configurar o diretório de envio", "Invalid Token" : "Token inválido", "No file was uploaded. Unknown error" : "Nenhum arquivo foi enviado. Erro desconhecido", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Pasta temporária não encontrada", "Failed to write to disk" : "Falha ao escrever no disco", "Not enough storage available" : "Espaço de armazenamento insuficiente", + "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.", "Upload failed. Could not find uploaded file" : "Falha no envio. Não foi possível encontrar o arquivo enviado", "Upload failed. Could not get file info." : "Falha no envio. Não foi possível obter informações do arquivo.", "Invalid directory." : "Diretório inválido.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favoritos", "Home" : "Home", "Close" : "Fechar", + "Upload cancelled." : "Envio cancelado.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o limite de envio {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", - "Upload cancelled." : "Envio cancelado.", "Could not get result from server." : "Não foi possível obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.", "Actions" : "Ações", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", - "Error moving file." : "Erro movendo o arquivo.", - "Error moving file" : "Erro movendo o arquivo", - "Error" : "Erro", - "{new_name} already exists" : "{new_name} já existe", - "Could not rename file" : "Não foi possível renomear o arquivo", - "Could not create file" : "Não foi possível criar o arquivo", - "Could not create folder" : "Não foi possível criar a pasta", - "Error deleting file." : "Erro eliminando o arquivo.", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorito", "Favorite" : "Favorito", - "{newname} already exists" : "{newname} já existe", - "Upload" : "Enviar", - "Text file" : "Arquivo texto", - "New text file.txt" : "Novo texto file.txt", "Folder" : "Pasta", "New folder" : "Nova pasta", + "{newname} already exists" : "{newname} já existe", + "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas", "A new file or folder has been created" : "Um novo arquivo ou pasta foi criado", "A file or folder has been changed" : "Um arquivo ou pasta foi modificado", @@ -99,15 +83,13 @@ OC.L10N.register( "Changed by %2$s" : "Modificado por %2$s", "Deleted by %2$s" : "Deletado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", - "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", "File handling" : "Tratamento de Arquivo", "Maximum upload size" : "Tamanho máximo para envio", "max. possible: " : "max. possível:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor pode demorar até 5 minutos para fazer efeito depois de ser salvo.", "Save" : "Salvar", - "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.", + "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.", "Settings" : "Configurações", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use este endereço para ter acesso aos seus Arquivos via WebDAV", @@ -121,6 +103,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", "Currently scanning" : "Atualmente escaneando", "No favorites" : "Sem favoritos", - "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui" + "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui", + "Text file" : "Arquivo texto", + "New text file.txt" : "Novo texto file.txt" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index d0023e7d5b..e656d9e007 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -2,13 +2,6 @@ "Storage not available" : "Armazanamento não disponível", "Storage invalid" : "Armazenamento invávilido", "Unknown error" : "Erro desconhecido", - "Could not move %s - File with this name already exists" : "Impossível mover %s - Já existe um arquivo com esse nome", - "Could not move %s" : "Impossível mover %s", - "Permission denied" : "Permissão Negada", - "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.", - "The name %s is already used in the folder %s. Please choose a different name." : "O nome %s já é usado na pasta %s. Por favor, escolha um nome diferente.", - "Error when creating the file" : "Erro ao criar o arquivo", - "Error when creating the folder" : "Erro ao criar a pasta", "Unable to set upload directory." : "Impossível configurar o diretório de envio", "Invalid Token" : "Token inválido", "No file was uploaded. Unknown error" : "Nenhum arquivo foi enviado. Erro desconhecido", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Pasta temporária não encontrada", "Failed to write to disk" : "Falha ao escrever no disco", "Not enough storage available" : "Espaço de armazenamento insuficiente", + "The target folder has been moved or deleted." : "A pasta de destino foi movida ou excluída.", "Upload failed. Could not find uploaded file" : "Falha no envio. Não foi possível encontrar o arquivo enviado", "Upload failed. Could not get file info." : "Falha no envio. Não foi possível obter informações do arquivo.", "Invalid directory." : "Diretório inválido.", @@ -28,10 +22,10 @@ "Favorites" : "Favoritos", "Home" : "Home", "Close" : "Fechar", + "Upload cancelled." : "Envio cancelado.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o limite de envio {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", - "Upload cancelled." : "Envio cancelado.", "Could not get result from server." : "Não foi possível obter o resultado do servidor.", "File upload is in progress. Leaving the page now will cancel the upload." : "Envio de arquivo em andamento. Sair da página agora resultará no cancelamento do envio.", "Actions" : "Ações", @@ -44,14 +38,6 @@ "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", - "Error moving file." : "Erro movendo o arquivo.", - "Error moving file" : "Erro movendo o arquivo", - "Error" : "Erro", - "{new_name} already exists" : "{new_name} já existe", - "Could not rename file" : "Não foi possível renomear o arquivo", - "Could not create file" : "Não foi possível criar o arquivo", - "Could not create folder" : "Não foi possível criar a pasta", - "Error deleting file." : "Erro eliminando o arquivo.", "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Favorito", "Favorite" : "Favorito", - "{newname} already exists" : "{newname} já existe", - "Upload" : "Enviar", - "Text file" : "Arquivo texto", - "New text file.txt" : "Novo texto file.txt", "Folder" : "Pasta", "New folder" : "Nova pasta", + "{newname} already exists" : "{newname} já existe", + "Upload" : "Enviar", "An error occurred while trying to update the tags" : "Ocorreu um erro enquanto tentava atualizar as etiquetas", "A new file or folder has been created" : "Um novo arquivo ou pasta foi criado", "A file or folder has been changed" : "Um arquivo ou pasta foi modificado", @@ -97,15 +81,13 @@ "Changed by %2$s" : "Modificado por %2$s", "Deleted by %2$s" : "Deletado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", - "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", "File handling" : "Tratamento de Arquivo", "Maximum upload size" : "Tamanho máximo para envio", "max. possible: " : "max. possível:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor pode demorar até 5 minutos para fazer efeito depois de ser salvo.", "Save" : "Salvar", - "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.", + "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.", "Settings" : "Configurações", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Use este endereço para ter acesso aos seus Arquivos via WebDAV", @@ -119,6 +101,8 @@ "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", "Currently scanning" : "Atualmente escaneando", "No favorites" : "Sem favoritos", - "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui" + "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui", + "Text file" : "Arquivo texto", + "New text file.txt" : "Novo texto file.txt" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js index 5474826994..ecb66e0eb1 100644 --- a/apps/files/l10n/pt_PT.js +++ b/apps/files/l10n/pt_PT.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Armazenamento indisposinvel", "Storage invalid" : "Armazenamento inválido", "Unknown error" : "Erro Desconhecido", - "Could not move %s - File with this name already exists" : "Não foi possível mover %s - Já existe um ficheiro com este nome", - "Could not move %s" : "Não foi possível mover %s", - "Permission denied" : "Permissão negada", - "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.", - "The name %s is already used in the folder %s. Please choose a different name." : "O nome %s já está em uso na pasta %s. Por favor escolha um nome diferente.", - "Error when creating the file" : "Erro ao criar o ficheiro", - "Error when creating the folder" : "Erro ao criar a pasta", "Unable to set upload directory." : "Não foi possível criar o diretório de upload", "Invalid Token" : "Token inválido", "No file was uploaded. Unknown error" : "Não foi enviado nenhum ficheiro. Erro desconhecido", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "A pasta temporária está em falta", "Failed to write to disk" : "Não foi possível gravar no disco", "Not enough storage available" : "Não há espaço suficiente em disco", + "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.", "Upload failed. Could not find uploaded file" : "Falhou o envio. Não conseguiu encontrar o ficheiro enviado", "Upload failed. Could not get file info." : "O carregamento falhou. Não foi possível obter a informação do ficheiro.", "Invalid directory." : "Diretoria inválida.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador", - "Error moving file." : "Erro a mover o ficheiro.", - "Error moving file" : "Erro ao mover o ficheiro", - "Error" : "Erro", - "{new_name} already exists" : "O nome {new_name} já existe", - "Could not rename file" : "Não pôde renomear o ficheiro", - "Could not create file" : "Não pôde criar ficheiro", - "Could not create folder" : "Não pôde criar pasta", - "Error deleting file." : "Erro ao apagar o ficheiro.", "No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -75,8 +61,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Assinalado como Favorito", "Favorite" : "Favorito", - "Text file" : "Ficheiro de Texto", - "New text file.txt" : "Novo texto ficheiro.txt", "Folder" : "Pasta", "New folder" : "Nova Pasta", "{newname} already exists" : "{newname} já existe", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Alterado por %2$s", "Deleted by %2$s" : "Eliminado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado", - "%s could not be renamed" : "%s não pode ser renomeada", "Upload (max. %s)" : "Enviar (max. %s)", "File handling" : "Manuseamento do ficheiro", "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor poderá demorar até 5 minutos para ser aplicado depois de guardar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.", "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilize esta ligação para aceder aos seus ficheiros via WebDAV", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", "Currently scanning" : "A analisar", "No favorites" : "Sem favoritos", - "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui" + "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui", + "Text file" : "Ficheiro de Texto", + "New text file.txt" : "Novo texto ficheiro.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json index 44bf606a97..bdbdb7225b 100644 --- a/apps/files/l10n/pt_PT.json +++ b/apps/files/l10n/pt_PT.json @@ -2,13 +2,6 @@ "Storage not available" : "Armazenamento indisposinvel", "Storage invalid" : "Armazenamento inválido", "Unknown error" : "Erro Desconhecido", - "Could not move %s - File with this name already exists" : "Não foi possível mover %s - Já existe um ficheiro com este nome", - "Could not move %s" : "Não foi possível mover %s", - "Permission denied" : "Permissão negada", - "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.", - "The name %s is already used in the folder %s. Please choose a different name." : "O nome %s já está em uso na pasta %s. Por favor escolha um nome diferente.", - "Error when creating the file" : "Erro ao criar o ficheiro", - "Error when creating the folder" : "Erro ao criar a pasta", "Unable to set upload directory." : "Não foi possível criar o diretório de upload", "Invalid Token" : "Token inválido", "No file was uploaded. Unknown error" : "Não foi enviado nenhum ficheiro. Erro desconhecido", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "A pasta temporária está em falta", "Failed to write to disk" : "Não foi possível gravar no disco", "Not enough storage available" : "Não há espaço suficiente em disco", + "The target folder has been moved or deleted." : "A pasta de destino foi movida ou eliminada.", "Upload failed. Could not find uploaded file" : "Falhou o envio. Não conseguiu encontrar o ficheiro enviado", "Upload failed. Could not get file info." : "O carregamento falhou. Não foi possível obter a informação do ficheiro.", "Invalid directory." : "Diretoria inválida.", @@ -44,14 +38,6 @@ "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esta diretoria está indisponível, por favor, verifique os registos ou contacte o administrador", - "Error moving file." : "Erro a mover o ficheiro.", - "Error moving file" : "Erro ao mover o ficheiro", - "Error" : "Erro", - "{new_name} already exists" : "O nome {new_name} já existe", - "Could not rename file" : "Não pôde renomear o ficheiro", - "Could not create file" : "Não pôde criar ficheiro", - "Could not create folder" : "Não pôde criar pasta", - "Error deleting file." : "Erro ao apagar o ficheiro.", "No entries in this folder match '{filter}'" : "Nenhumas entradas nesta pasta correspondem a '{filter}'", "Name" : "Nome", "Size" : "Tamanho", @@ -73,8 +59,6 @@ "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Favorited" : "Assinalado como Favorito", "Favorite" : "Favorito", - "Text file" : "Ficheiro de Texto", - "New text file.txt" : "Novo texto ficheiro.txt", "Folder" : "Pasta", "New folder" : "Nova Pasta", "{newname} already exists" : "{newname} já existe", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Alterado por %2$s", "Deleted by %2$s" : "Eliminado por %2$s", "Restored by %2$s" : "Restaurado por %2$s", - "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado", - "%s could not be renamed" : "%s não pode ser renomeada", "Upload (max. %s)" : "Enviar (max. %s)", "File handling" : "Manuseamento do ficheiro", "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Com PHP-FPM este valor poderá demorar até 5 minutos para ser aplicado depois de guardar.", "Save" : "Guardar", - "Can not be edited from here due to insufficient permissions." : "Não pode ser editado a partir daqui devido a permissões insuficientes.", "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Utilize esta ligação para aceder aos seus ficheiros via WebDAV", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", "Currently scanning" : "A analisar", "No favorites" : "Sem favoritos", - "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui" + "Files and folders you mark as favorite will show up here" : "Os ficheiros e pastas que marcou como favoritos serão mostrados aqui", + "Text file" : "Ficheiro de Texto", + "New text file.txt" : "Novo texto ficheiro.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 83593b4ba8..54e7c505c9 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Spațiu de stocare indisponibil", "Storage invalid" : "Spațiu de stocare invalid", "Unknown error" : "Eroare necunoscută", - "Could not move %s - File with this name already exists" : "%s nu se poate muta - Fișierul cu acest nume există deja ", - "Could not move %s" : "Nu se poate muta %s", - "Permission denied" : "Accesul interzis", - "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.", - "The name %s is already used in the folder %s. Please choose a different name." : "Numele %s este deja este folosit în dosarul %s. Te rog alege alt nume.", - "Error when creating the file" : "Eroare la crearea fișierului", - "Error when creating the folder" : "Eroare la crearea dosarului", "Unable to set upload directory." : "Imposibil de a seta directorul pentru încărcare.", "Invalid Token" : "Jeton Invalid", "No file was uploaded. Unknown error" : "Niciun fișier nu a fost încărcat. Eroare necunoscută", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Lipsește un dosar temporar", "Failed to write to disk" : "Eroare la scrierea pe disc", "Not enough storage available" : "Nu este disponibil suficient spațiu", + "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.", "Upload failed. Could not find uploaded file" : "Încărcare eșuată. Nu se poate găsi fișierul încărcat", "Upload failed. Could not get file info." : "Încărcare eșuată. Nu se pot obține informații despre fișier.", "Invalid directory." : "Dosar nevalid.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Favorite", "Home" : "Acasă", "Close" : "Închide", + "Upload cancelled." : "Încărcare anulată.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți", "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas", - "Upload cancelled." : "Încărcare anulată.", "Could not get result from server." : "Nu se poate obține rezultatul de la server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.", "Actions" : "Acțiuni", @@ -43,14 +37,6 @@ OC.L10N.register( "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", - "Error moving file." : "Eroare la mutarea fișierului.", - "Error moving file" : "Eroare la mutarea fișierului", - "Error" : "Eroare", - "{new_name} already exists" : "{new_name} există deja", - "Could not rename file" : "Nu s-a putut redenumi fișierul", - "Could not create file" : "Nu s-a putut crea fisierul", - "Could not create folder" : "Nu s-a putut crea folderul", - "Error deleting file." : "Eroare la ștergerea fișierului.", "Name" : "Nume", "Size" : "Mărime", "Modified" : "Modificat", @@ -65,10 +51,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!", "Your storage is almost full ({usedSpacePercent}%)" : "Spațiul de stocare este aproape plin ({usedSpacePercent}%)", "Favorite" : "Favorit", - "Upload" : "Încărcă", - "Text file" : "Fișier text", "Folder" : "Dosar", "New folder" : "Un nou dosar", + "Upload" : "Încărcă", "A new file or folder has been created" : "Un nou fișier sau dosar a fost creat", "A file or folder has been changed" : "Un nou fișier sau dosar a fost modificat", "A file or folder has been deleted" : "Un nou fișier sau dosar a fost șters", @@ -82,8 +67,6 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s a șters %1$s", "You restored %1$s" : "Ai restaurat %1$s", "%2$s restored %1$s" : "%2$s a restaurat %1$s", - "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters", - "%s could not be renamed" : "%s nu a putut fi redenumit", "Upload (max. %s)" : "Încarcă (max. %s)", "File handling" : "Manipulare fișiere", "Maximum upload size" : "Dimensiune maximă admisă la încărcare", @@ -97,6 +80,7 @@ OC.L10N.register( "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", - "Currently scanning" : "Acum scanează" + "Currently scanning" : "Acum scanează", + "Text file" : "Fișier text" }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index a2544bba28..3fe8ba180b 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -2,13 +2,6 @@ "Storage not available" : "Spațiu de stocare indisponibil", "Storage invalid" : "Spațiu de stocare invalid", "Unknown error" : "Eroare necunoscută", - "Could not move %s - File with this name already exists" : "%s nu se poate muta - Fișierul cu acest nume există deja ", - "Could not move %s" : "Nu se poate muta %s", - "Permission denied" : "Accesul interzis", - "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.", - "The name %s is already used in the folder %s. Please choose a different name." : "Numele %s este deja este folosit în dosarul %s. Te rog alege alt nume.", - "Error when creating the file" : "Eroare la crearea fișierului", - "Error when creating the folder" : "Eroare la crearea dosarului", "Unable to set upload directory." : "Imposibil de a seta directorul pentru încărcare.", "Invalid Token" : "Jeton Invalid", "No file was uploaded. Unknown error" : "Niciun fișier nu a fost încărcat. Eroare necunoscută", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Lipsește un dosar temporar", "Failed to write to disk" : "Eroare la scrierea pe disc", "Not enough storage available" : "Nu este disponibil suficient spațiu", + "The target folder has been moved or deleted." : "Dosarul țintă a fost mutat sau șters.", "Upload failed. Could not find uploaded file" : "Încărcare eșuată. Nu se poate găsi fișierul încărcat", "Upload failed. Could not get file info." : "Încărcare eșuată. Nu se pot obține informații despre fișier.", "Invalid directory." : "Dosar nevalid.", @@ -28,10 +22,10 @@ "Favorites" : "Favorite", "Home" : "Acasă", "Close" : "Închide", + "Upload cancelled." : "Încărcare anulată.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți", "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de încărcare de {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas", - "Upload cancelled." : "Încărcare anulată.", "Could not get result from server." : "Nu se poate obține rezultatul de la server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fișierul este în curs de încărcare. Părăsirea paginii va întrerupe încărcarea.", "Actions" : "Acțiuni", @@ -41,14 +35,6 @@ "Details" : "Detalii", "Select" : "Alege", "Pending" : "În așteptare", - "Error moving file." : "Eroare la mutarea fișierului.", - "Error moving file" : "Eroare la mutarea fișierului", - "Error" : "Eroare", - "{new_name} already exists" : "{new_name} există deja", - "Could not rename file" : "Nu s-a putut redenumi fișierul", - "Could not create file" : "Nu s-a putut crea fisierul", - "Could not create folder" : "Nu s-a putut crea folderul", - "Error deleting file." : "Eroare la ștergerea fișierului.", "Name" : "Nume", "Size" : "Mărime", "Modified" : "Modificat", @@ -63,10 +49,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "Spațiul de stocare este plin, fișierele nu mai pot fi actualizate sau sincronizate!", "Your storage is almost full ({usedSpacePercent}%)" : "Spațiul de stocare este aproape plin ({usedSpacePercent}%)", "Favorite" : "Favorit", - "Upload" : "Încărcă", - "Text file" : "Fișier text", "Folder" : "Dosar", "New folder" : "Un nou dosar", + "Upload" : "Încărcă", "A new file or folder has been created" : "Un nou fișier sau dosar a fost creat", "A file or folder has been changed" : "Un nou fișier sau dosar a fost modificat", "A file or folder has been deleted" : "Un nou fișier sau dosar a fost șters", @@ -80,8 +65,6 @@ "%2$s deleted %1$s" : "%2$s a șters %1$s", "You restored %1$s" : "Ai restaurat %1$s", "%2$s restored %1$s" : "%2$s a restaurat %1$s", - "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters", - "%s could not be renamed" : "%s nu a putut fi redenumit", "Upload (max. %s)" : "Încarcă (max. %s)", "File handling" : "Manipulare fișiere", "Maximum upload size" : "Dimensiune maximă admisă la încărcare", @@ -95,6 +78,7 @@ "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", "Files are being scanned, please wait." : "Fișierele sunt scanate, te rog așteaptă.", - "Currently scanning" : "Acum scanează" + "Currently scanning" : "Acum scanează", + "Text file" : "Fișier text" },"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" } \ No newline at end of file diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index 270cc3c6a8..f4b71563e6 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Хранилище недоступно", "Storage invalid" : "Хранилище неисправно", "Unknown error" : "Неизвестная ошибка", - "Could not move %s - File with this name already exists" : "Невозможно переместить %s - файл с таким именем уже существует", - "Could not move %s" : "Невозможно переместить %s", - "Permission denied" : "В доступе отказано", - "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", - "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Укажите другое имя.", - "Error when creating the file" : "Ошибка при создании файла", - "Error when creating the folder" : "Ошибка создания каталога", "Unable to set upload directory." : "Невозможно установить каталог загрузки.", "Invalid Token" : "Недопустимый маркер", "No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Отсутствует временный каталог", "Failed to write to disk" : "Ошибка записи на диск", "Not enough storage available" : "Недостаточно доступного места в хранилище", + "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", "Upload failed. Could not find uploaded file" : "Загрузка не удалась. Невозможно найти загружаемый файл", "Upload failed. Could not get file info." : "Загрузка не удалась. Невозможно получить информацию о файле", "Invalid directory." : "Неверный каталог.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Избранное", "Home" : "Главная", "Close" : "Закрыть", + "Upload cancelled." : "Загрузка отменена.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {filename}, так как это либо каталог, либо файл нулевого размера", "Total file size {size1} exceeds upload limit {size2}" : "Полный размер файла {size1} превышает лимит по загрузке {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостаточно свободного места, Вы загружаете {size1}, но осталось только {size2}", - "Upload cancelled." : "Загрузка отменена.", "Could not get result from server." : "Не удалось получить ответ от сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.", "Actions" : "Действия", @@ -46,14 +40,15 @@ OC.L10N.register( "Unable to determine date" : "Невозможно определить дату", "This operation is forbidden" : "Операция запрещена", "This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором", - "Error moving file." : "Ошибка при перемещении файла.", - "Error moving file" : "Ошибка при перемещении файла", - "Error" : "Ошибка", - "{new_name} already exists" : "{new_name} уже существует", - "Could not rename file" : "Не удалось переименовать файл", - "Could not create file" : "Не удалось создать файл", - "Could not create folder" : "Не удалось создать каталог", - "Error deleting file." : "Ошибка при удалении файла.", + "Could not move \"{file}\", target exists" : "Невозможно переместить \"{file}\", цель отсутствует", + "Could not move \"{file}\"" : "Невозможно переместить \"{file}\"", + "{newName} already exists" : "{newName} уже имеется", + "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}\"" : "Невозможно создать папку \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Невозможно создать папку \"{dir}\" потому что уже имеется", + "Error deleting file \"{fileName}\"." : "Ошибка удаления файла \"{fileName}\".", "No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'", "Name" : "Имя", "Size" : "Размер", @@ -75,12 +70,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", - "{newname} already exists" : "{newname} уже существует", - "Upload" : "Загрузить", - "Text file" : "Текстовый файл", - "New text file.txt" : "Новый текстовый документ.txt", "Folder" : "Каталог", "New folder" : "Новый каталог", + "{newname} already exists" : "{newname} уже существует", + "Upload" : "Загрузить", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", "A new file or folder has been created" : "Создан новый файл или каталог", "A file or folder has been changed" : "Изменён файл или каталог", @@ -99,15 +92,12 @@ OC.L10N.register( "Changed by %2$s" : "Изменено %2$s", "Deleted by %2$s" : "Удалено %2$s", "Restored by %2$s" : "Восстановлено %2$s", - "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", - "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (максимум %s)", "File handling" : "Управление файлами", "Maximum upload size" : "Максимальный размер загружаемого файла", "max. possible: " : "макс. возможно: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "При использовании PHP-FPM может потребоваться до 5 минут, чтобы это значение встпуило в силу после сохранения.", "Save" : "Сохранить", - "Can not be edited from here due to insufficient permissions." : "Невозможно отредактировать здесь из-за нехватки полномочий.", + "Missing permissions to edit from here." : "Отсутствуют права на удаление.", "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Используйте этот адрес для доступа файлам через WebDAV", @@ -121,6 +111,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", "Currently scanning" : "В настоящее время сканируется", "No favorites" : "Нет избранного", - "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные" + "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные", + "Text file" : "Текстовый файл", + "New text file.txt" : "Новый текстовый документ.txt" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 36aae3834a..81dbf53184 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -2,13 +2,6 @@ "Storage not available" : "Хранилище недоступно", "Storage invalid" : "Хранилище неисправно", "Unknown error" : "Неизвестная ошибка", - "Could not move %s - File with this name already exists" : "Невозможно переместить %s - файл с таким именем уже существует", - "Could not move %s" : "Невозможно переместить %s", - "Permission denied" : "В доступе отказано", - "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", - "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Укажите другое имя.", - "Error when creating the file" : "Ошибка при создании файла", - "Error when creating the folder" : "Ошибка создания каталога", "Unable to set upload directory." : "Невозможно установить каталог загрузки.", "Invalid Token" : "Недопустимый маркер", "No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Отсутствует временный каталог", "Failed to write to disk" : "Ошибка записи на диск", "Not enough storage available" : "Недостаточно доступного места в хранилище", + "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", "Upload failed. Could not find uploaded file" : "Загрузка не удалась. Невозможно найти загружаемый файл", "Upload failed. Could not get file info." : "Загрузка не удалась. Невозможно получить информацию о файле", "Invalid directory." : "Неверный каталог.", @@ -28,10 +22,10 @@ "Favorites" : "Избранное", "Home" : "Главная", "Close" : "Закрыть", + "Upload cancelled." : "Загрузка отменена.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {filename}, так как это либо каталог, либо файл нулевого размера", "Total file size {size1} exceeds upload limit {size2}" : "Полный размер файла {size1} превышает лимит по загрузке {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостаточно свободного места, Вы загружаете {size1}, но осталось только {size2}", - "Upload cancelled." : "Загрузка отменена.", "Could not get result from server." : "Не удалось получить ответ от сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Идёт загрузка файла. Покинув страницу, вы прервёте загрузку.", "Actions" : "Действия", @@ -44,14 +38,15 @@ "Unable to determine date" : "Невозможно определить дату", "This operation is forbidden" : "Операция запрещена", "This directory is unavailable, please check the logs or contact the administrator" : "Директория недоступна, пожалуйста проверьте журнал сообщений или свяжитесь с администратором", - "Error moving file." : "Ошибка при перемещении файла.", - "Error moving file" : "Ошибка при перемещении файла", - "Error" : "Ошибка", - "{new_name} already exists" : "{new_name} уже существует", - "Could not rename file" : "Не удалось переименовать файл", - "Could not create file" : "Не удалось создать файл", - "Could not create folder" : "Не удалось создать каталог", - "Error deleting file." : "Ошибка при удалении файла.", + "Could not move \"{file}\", target exists" : "Невозможно переместить \"{file}\", цель отсутствует", + "Could not move \"{file}\"" : "Невозможно переместить \"{file}\"", + "{newName} already exists" : "{newName} уже имеется", + "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}\"" : "Невозможно создать папку \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Невозможно создать папку \"{dir}\" потому что уже имеется", + "Error deleting file \"{fileName}\"." : "Ошибка удаления файла \"{fileName}\".", "No entries in this folder match '{filter}'" : "В данном каталоге нет элементов соответствующих '{filter}'", "Name" : "Имя", "Size" : "Размер", @@ -73,12 +68,10 @@ "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байтов","%n байта(ов)"], "Favorited" : "Избранное", "Favorite" : "Избранное", - "{newname} already exists" : "{newname} уже существует", - "Upload" : "Загрузить", - "Text file" : "Текстовый файл", - "New text file.txt" : "Новый текстовый документ.txt", "Folder" : "Каталог", "New folder" : "Новый каталог", + "{newname} already exists" : "{newname} уже существует", + "Upload" : "Загрузить", "An error occurred while trying to update the tags" : "Во время обновления тегов возникла ошибка", "A new file or folder has been created" : "Создан новый файл или каталог", "A file or folder has been changed" : "Изменён файл или каталог", @@ -97,15 +90,12 @@ "Changed by %2$s" : "Изменено %2$s", "Deleted by %2$s" : "Удалено %2$s", "Restored by %2$s" : "Восстановлено %2$s", - "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", - "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (максимум %s)", "File handling" : "Управление файлами", "Maximum upload size" : "Максимальный размер загружаемого файла", "max. possible: " : "макс. возможно: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "При использовании PHP-FPM может потребоваться до 5 минут, чтобы это значение встпуило в силу после сохранения.", "Save" : "Сохранить", - "Can not be edited from here due to insufficient permissions." : "Невозможно отредактировать здесь из-за нехватки полномочий.", + "Missing permissions to edit from here." : "Отсутствуют права на удаление.", "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Используйте этот адрес для доступа файлам через WebDAV", @@ -119,6 +109,8 @@ "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", "Currently scanning" : "В настоящее время сканируется", "No favorites" : "Нет избранного", - "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные" + "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные", + "Text file" : "Текстовый файл", + "New text file.txt" : "Новый текстовый документ.txt" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" } \ No newline at end of file diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js index 60cd10813d..44e96c49fc 100644 --- a/apps/files/l10n/si_LK.js +++ b/apps/files/l10n/si_LK.js @@ -17,14 +17,12 @@ OC.L10N.register( "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", "Select" : "තෝරන්න", - "Error" : "දෝෂයක්", "Name" : "නම", "Size" : "ප්‍රමාණය", "Modified" : "වෙනස් කළ", "New" : "නව", - "Upload" : "උඩුගත කරන්න", - "Text file" : "පෙළ ගොනුව", "Folder" : "ෆෝල්ඩරය", + "Upload" : "උඩුගත කරන්න", "A new file or folder has been created" : "නව ගොනුවක් හෝ බහාලුමක් නිර්මාණය කර ඇත ", "A file or folder has been changed" : "ගොනුවක් හෝ ෆෝල්ඩරයක් වෙනස් වී ඇත", "A file or folder has been deleted" : "ගොනුවක් හෝ ෆෝල්ඩරයක් මකා දමා ඇත", @@ -37,6 +35,7 @@ OC.L10N.register( "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", - "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න" + "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න", + "Text file" : "පෙළ ගොනුව" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json index 2f910f1d90..92bcea7158 100644 --- a/apps/files/l10n/si_LK.json +++ b/apps/files/l10n/si_LK.json @@ -15,14 +15,12 @@ "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", "Select" : "තෝරන්න", - "Error" : "දෝෂයක්", "Name" : "නම", "Size" : "ප්‍රමාණය", "Modified" : "වෙනස් කළ", "New" : "නව", - "Upload" : "උඩුගත කරන්න", - "Text file" : "පෙළ ගොනුව", "Folder" : "ෆෝල්ඩරය", + "Upload" : "උඩුගත කරන්න", "A new file or folder has been created" : "නව ගොනුවක් හෝ බහාලුමක් නිර්මාණය කර ඇත ", "A file or folder has been changed" : "ගොනුවක් හෝ ෆෝල්ඩරයක් වෙනස් වී ඇත", "A file or folder has been deleted" : "ගොනුවක් හෝ ෆෝල්ඩරයක් මකා දමා ඇත", @@ -35,6 +33,7 @@ "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", - "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න" + "Files are being scanned, please wait." : "ගොනු පරික්ෂා කෙරේ. මඳක් රැඳී සිටින්න", + "Text file" : "පෙළ ගොනුව" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js index e2fbf695f8..ca7e107d1c 100644 --- a/apps/files/l10n/sk_SK.js +++ b/apps/files/l10n/sk_SK.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Úložisko nie je dostupné", "Storage invalid" : "Úložisko nie je platné", "Unknown error" : "Neznáma chyba", - "Could not move %s - File with this name already exists" : "Nie je možné presunúť %s - súbor s týmto menom už existuje", - "Could not move %s" : "Nie je možné presunúť %s", - "Permission denied" : "Prístup bol odmietnutý", - "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.", - "The name %s is already used in the folder %s. Please choose a different name." : "Názov %s už používa priečinok s%. Prosím zvoľte iný názov.", - "Error when creating the file" : "Chyba pri vytváraní súboru", - "Error when creating the folder" : "Chyba pri vytváraní priečinka", "Unable to set upload directory." : "Nemožno nastaviť priečinok pre nahrané súbory.", "Invalid Token" : "Neplatný token", "No file was uploaded. Unknown error" : "Žiaden súbor nebol nahraný. Neznáma chyba", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Chýba dočasný priečinok", "Failed to write to disk" : "Zápis na disk sa nepodaril", "Not enough storage available" : "Nedostatok dostupného úložného priestoru", + "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.", "Upload failed. Could not find uploaded file" : "Nahrávanie zlyhalo. Nepodarilo sa nájsť nahrávaný súbor", "Upload failed. Could not get file info." : "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.", "Invalid directory." : "Neplatný priečinok.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Obľúbené", "Home" : "Domov", "Close" : "Zavrieť", + "Upload cancelled." : "Odosielanie je zrušené.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov", "Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}", - "Upload cancelled." : "Odosielanie je zrušené.", "Could not get result from server." : "Nepodarilo sa dostať výsledky zo servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", "Actions" : "Akcie", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Nemožno určiť dátum", "This operation is forbidden" : "Táto operácia je zakázaná", "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu", - "Error moving file." : "Chyba pri presune súboru.", - "Error moving file" : "Chyba pri presúvaní súboru", - "Error" : "Chyba", - "{new_name} already exists" : "{new_name} už existuje", - "Could not rename file" : "Nemožno premenovať súbor", - "Could not create file" : "Nemožno vytvoriť súbor", - "Could not create folder" : "Nemožno vytvoriť priečinok", - "Error deleting file." : "Chyba pri mazaní súboru.", "No entries in this folder match '{filter}'" : "V tomto priečinku nič nezodpovedá '{filter}'", "Name" : "Názov", "Size" : "Veľkosť", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"], "Favorited" : "Pridané k obľúbeným", "Favorite" : "Obľúbené", - "{newname} already exists" : "{newname} už existuje", - "Upload" : "Nahrať", - "Text file" : "Textový súbor", - "New text file.txt" : "Nový text file.txt", "Folder" : "Priečinok", "New folder" : "Nový priečinok", + "{newname} already exists" : "{newname} už existuje", + "Upload" : "Nahrať", "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe", "A new file or folder has been created" : "Nový súbor alebo priečinok bol vytvorený", "A file or folder has been changed" : "Súbor alebo priečinok bol zmenený", @@ -96,15 +80,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s zmazal %1$s", "You restored %1$s" : "Bol obnovený %1$s", "%2$s restored %1$s" : "%2$s obnovil %1$s", - "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný", - "%s could not be renamed" : "%s nemohol byť premenovaný", "Upload (max. %s)" : "Nahrať (max. %s)", "File handling" : "Nastavenie správania sa k súborom", "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.", "Save" : "Uložiť", - "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.", "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Použite túto linku pre prístup k vašim súborom cez WebDAV", @@ -118,6 +98,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", "Currently scanning" : "Prehľadáva sa", "No favorites" : "Žiadne obľúbené", - "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu" + "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu", + "Text file" : "Textový súbor", + "New text file.txt" : "Nový text file.txt" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json index e5748baa4c..4d03e18556 100644 --- a/apps/files/l10n/sk_SK.json +++ b/apps/files/l10n/sk_SK.json @@ -2,13 +2,6 @@ "Storage not available" : "Úložisko nie je dostupné", "Storage invalid" : "Úložisko nie je platné", "Unknown error" : "Neznáma chyba", - "Could not move %s - File with this name already exists" : "Nie je možné presunúť %s - súbor s týmto menom už existuje", - "Could not move %s" : "Nie je možné presunúť %s", - "Permission denied" : "Prístup bol odmietnutý", - "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.", - "The name %s is already used in the folder %s. Please choose a different name." : "Názov %s už používa priečinok s%. Prosím zvoľte iný názov.", - "Error when creating the file" : "Chyba pri vytváraní súboru", - "Error when creating the folder" : "Chyba pri vytváraní priečinka", "Unable to set upload directory." : "Nemožno nastaviť priečinok pre nahrané súbory.", "Invalid Token" : "Neplatný token", "No file was uploaded. Unknown error" : "Žiaden súbor nebol nahraný. Neznáma chyba", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Chýba dočasný priečinok", "Failed to write to disk" : "Zápis na disk sa nepodaril", "Not enough storage available" : "Nedostatok dostupného úložného priestoru", + "The target folder has been moved or deleted." : "Cieľový priečinok bol premiestnený alebo odstránený.", "Upload failed. Could not find uploaded file" : "Nahrávanie zlyhalo. Nepodarilo sa nájsť nahrávaný súbor", "Upload failed. Could not get file info." : "Nahrávanie zlyhalo. Nepodarilo sa získať informácie o súbore.", "Invalid directory." : "Neplatný priečinok.", @@ -28,10 +22,10 @@ "Favorites" : "Obľúbené", "Home" : "Domov", "Close" : "Zavrieť", + "Upload cancelled." : "Odosielanie je zrušené.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov", "Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}", - "Upload cancelled." : "Odosielanie je zrušené.", "Could not get result from server." : "Nepodarilo sa dostať výsledky zo servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Opustenie stránky zruší práve prebiehajúce odosielanie súboru.", "Actions" : "Akcie", @@ -44,14 +38,6 @@ "Unable to determine date" : "Nemožno určiť dátum", "This operation is forbidden" : "Táto operácia je zakázaná", "This directory is unavailable, please check the logs or contact the administrator" : "Priečinok je nedostupný, skontrolujte prosím logy, alebo kontaktujte správcu", - "Error moving file." : "Chyba pri presune súboru.", - "Error moving file" : "Chyba pri presúvaní súboru", - "Error" : "Chyba", - "{new_name} already exists" : "{new_name} už existuje", - "Could not rename file" : "Nemožno premenovať súbor", - "Could not create file" : "Nemožno vytvoriť súbor", - "Could not create folder" : "Nemožno vytvoriť priečinok", - "Error deleting file." : "Chyba pri mazaní súboru.", "No entries in this folder match '{filter}'" : "V tomto priečinku nič nezodpovedá '{filter}'", "Name" : "Názov", "Size" : "Veľkosť", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtov"], "Favorited" : "Pridané k obľúbeným", "Favorite" : "Obľúbené", - "{newname} already exists" : "{newname} už existuje", - "Upload" : "Nahrať", - "Text file" : "Textový súbor", - "New text file.txt" : "Nový text file.txt", "Folder" : "Priečinok", "New folder" : "Nový priečinok", + "{newname} already exists" : "{newname} už existuje", + "Upload" : "Nahrať", "An error occurred while trying to update the tags" : "Pri pokuse o aktualizáciu štítkov došlo k chybe", "A new file or folder has been created" : "Nový súbor alebo priečinok bol vytvorený", "A file or folder has been changed" : "Súbor alebo priečinok bol zmenený", @@ -94,15 +78,11 @@ "%2$s deleted %1$s" : "%2$s zmazal %1$s", "You restored %1$s" : "Bol obnovený %1$s", "%2$s restored %1$s" : "%2$s obnovil %1$s", - "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný", - "%s could not be renamed" : "%s nemohol byť premenovaný", "Upload (max. %s)" : "Nahrať (max. %s)", "File handling" : "Nastavenie správania sa k súborom", "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "S PHP-FPM môže trvať do 5 minút, kým sa nastavenie po uložení prejaví.", "Save" : "Uložiť", - "Can not be edited from here due to insufficient permissions." : "Úpravy nie sú možné z dôvodu nedostatočných oprávnení.", "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Použite túto linku pre prístup k vašim súborom cez WebDAV", @@ -116,6 +96,8 @@ "Files are being scanned, please wait." : "Čakajte, súbory sú prehľadávané.", "Currently scanning" : "Prehľadáva sa", "No favorites" : "Žiadne obľúbené", - "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu" + "Files and folders you mark as favorite will show up here" : "Súbory a priečinky označené ako obľúbené budú zobrazené tu", + "Text file" : "Textový súbor", + "New text file.txt" : "Nový text file.txt" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" } \ No newline at end of file diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 7ce39724a9..240bce73af 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Na voljo ni dovolj prostora", "Storage invalid" : "Določen prostor ni veljaven", "Unknown error" : "Neznana napaka", - "Could not move %s - File with this name already exists" : "Datoteke %s ni mogoče premakniti - datoteka s tem imenom že obstaja.", - "Could not move %s" : "Datoteke %s ni mogoče premakniti", - "Permission denied" : "Za to opravilo ni ustreznih dovoljenj.", - "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Ime %s je že v mapi %s že v uporabi. Izbrati je treba drugo ime.", - "Error when creating the file" : "Napaka med ustvarjanjem datoteke", - "Error when creating the folder" : "Napaka med ustvarjanjem mape", "Unable to set upload directory." : "Mapo, v katero boste prenašali dokumente, ni mogoče določiti", "Invalid Token" : "Neveljaven žeton", "No file was uploaded. Unknown error" : "Ni poslane datoteke. Neznana napaka.", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Manjka začasna mapa", "Failed to write to disk" : "Pisanje na disk je spodletelo", "Not enough storage available" : "Na voljo ni dovolj prostora", + "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.", "Upload failed. Could not find uploaded file" : "Pošiljanje je spodletelo. Ni mogoče najti poslane datoteke.", "Upload failed. Could not get file info." : "Pošiljanje je spodletelo. Ni mogoče pridobiti podrobnosti datoteke.", "Invalid directory." : "Neveljavna mapa.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Priljubljene", "Home" : "Domači naslov", "Close" : "Zapri", + "Upload cancelled." : "Pošiljanje je preklicano.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.", "Total file size {size1} exceeds upload limit {size2}" : "Skupna velikost {size1} presega omejitev velikosti {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Na voljo ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je je {size2}.", - "Upload cancelled." : "Pošiljanje je preklicano.", "Could not get result from server." : "Ni mogoče pridobiti podatkov s strežnika.", "File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", "Actions" : "Dejanja", @@ -44,14 +38,6 @@ OC.L10N.register( "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", - "Error moving file." : "Napaka premikanja datoteke.", - "Error moving file" : "Napaka premikanja datoteke", - "Error" : "Napaka", - "{new_name} already exists" : "{new_name} že obstaja", - "Could not rename file" : "Ni mogoče preimenovati datoteke", - "Could not create file" : "Ni mogoče ustvariti datoteke", - "Could not create folder" : "Ni mogoče ustvariti mape", - "Error deleting file." : "Napaka brisanja datoteke.", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", "Name" : "Ime", "Size" : "Velikost", @@ -71,10 +57,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", - "Upload" : "Pošlji", - "Text file" : "Besedilna datoteka", "Folder" : "Mapa", "New folder" : "Nova mapa", + "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", "A new file or folder has been created" : "Nova datoteka ali mapa je ustvarjena", "A file or folder has been changed" : "Datoteka ali mapa je spremenjena.", @@ -90,14 +75,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s je izbrisal %1$s", "You restored %1$s" : "Obnovljen je predmet %1$s", "%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.", - "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.", - "%s could not be renamed" : "%s ni mogoče preimenovati", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", "File handling" : "Upravljanje z datotekami", "Maximum upload size" : "Največja velikost za pošiljanja", "max. possible: " : "največ mogoče:", "Save" : "Shrani", - "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.", "Settings" : "Nastavitve", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Uporabite naslov za dostop do datotek peko sistema WebDAV.", @@ -111,6 +93,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", "Currently scanning" : "Poteka preverjanje", "No favorites" : "Ni priljubljenih", - "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj." + "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.", + "Text file" : "Besedilna datoteka" }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index b4b28f95bf..64ad90f56b 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -2,13 +2,6 @@ "Storage not available" : "Na voljo ni dovolj prostora", "Storage invalid" : "Določen prostor ni veljaven", "Unknown error" : "Neznana napaka", - "Could not move %s - File with this name already exists" : "Datoteke %s ni mogoče premakniti - datoteka s tem imenom že obstaja.", - "Could not move %s" : "Datoteke %s ni mogoče premakniti", - "Permission denied" : "Za to opravilo ni ustreznih dovoljenj.", - "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Ime %s je že v mapi %s že v uporabi. Izbrati je treba drugo ime.", - "Error when creating the file" : "Napaka med ustvarjanjem datoteke", - "Error when creating the folder" : "Napaka med ustvarjanjem mape", "Unable to set upload directory." : "Mapo, v katero boste prenašali dokumente, ni mogoče določiti", "Invalid Token" : "Neveljaven žeton", "No file was uploaded. Unknown error" : "Ni poslane datoteke. Neznana napaka.", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Manjka začasna mapa", "Failed to write to disk" : "Pisanje na disk je spodletelo", "Not enough storage available" : "Na voljo ni dovolj prostora", + "The target folder has been moved or deleted." : "Ciljna mapa je premaknjena ali izbrisana.", "Upload failed. Could not find uploaded file" : "Pošiljanje je spodletelo. Ni mogoče najti poslane datoteke.", "Upload failed. Could not get file info." : "Pošiljanje je spodletelo. Ni mogoče pridobiti podrobnosti datoteke.", "Invalid directory." : "Neveljavna mapa.", @@ -28,10 +22,10 @@ "Favorites" : "Priljubljene", "Home" : "Domači naslov", "Close" : "Zapri", + "Upload cancelled." : "Pošiljanje je preklicano.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.", "Total file size {size1} exceeds upload limit {size2}" : "Skupna velikost {size1} presega omejitev velikosti {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Na voljo ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je je {size2}.", - "Upload cancelled." : "Pošiljanje je preklicano.", "Could not get result from server." : "Ni mogoče pridobiti podatkov s strežnika.", "File upload is in progress. Leaving the page now will cancel the upload." : "V teku je pošiljanje datoteke. Če zapustite to stran zdaj, bo pošiljanje preklicano.", "Actions" : "Dejanja", @@ -42,14 +36,6 @@ "Select" : "Izberi", "Pending" : "V čakanju ...", "Unable to determine date" : "Ni mogoče določiti datuma", - "Error moving file." : "Napaka premikanja datoteke.", - "Error moving file" : "Napaka premikanja datoteke", - "Error" : "Napaka", - "{new_name} already exists" : "{new_name} že obstaja", - "Could not rename file" : "Ni mogoče preimenovati datoteke", - "Could not create file" : "Ni mogoče ustvariti datoteke", - "Could not create folder" : "Ni mogoče ustvariti mape", - "Error deleting file." : "Napaka brisanja datoteke.", "No entries in this folder match '{filter}'" : "Ni zadetkov, ki bi bili skladni z nizom '{filter}'", "Name" : "Ime", "Size" : "Velikost", @@ -69,10 +55,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["se sklada s filtrom '{filter}'","se skladata s filtrom '{filter}'","se skladajo s filtrom '{filter}'","se skladajo s filtrom '{filter}'"], "Favorited" : "Označeno kot priljubljeno", "Favorite" : "Priljubljene", - "Upload" : "Pošlji", - "Text file" : "Besedilna datoteka", "Folder" : "Mapa", "New folder" : "Nova mapa", + "Upload" : "Pošlji", "An error occurred while trying to update the tags" : "Prišlo je do napake med posodabljanjem oznak", "A new file or folder has been created" : "Nova datoteka ali mapa je ustvarjena", "A file or folder has been changed" : "Datoteka ali mapa je spremenjena.", @@ -88,14 +73,11 @@ "%2$s deleted %1$s" : "%2$s je izbrisal %1$s", "You restored %1$s" : "Obnovljen je predmet %1$s", "%2$s restored %1$s" : "Uporabnik %2$s je obnovil predmet %1$s.", - "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.", - "%s could not be renamed" : "%s ni mogoče preimenovati", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", "File handling" : "Upravljanje z datotekami", "Maximum upload size" : "Največja velikost za pošiljanja", "max. possible: " : "največ mogoče:", "Save" : "Shrani", - "Can not be edited from here due to insufficient permissions." : "Predmeta ni mogoče urejati zaradi neustreznih dovoljenj.", "Settings" : "Nastavitve", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Uporabite naslov za dostop do datotek peko sistema WebDAV.", @@ -109,6 +91,7 @@ "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", "Currently scanning" : "Poteka preverjanje", "No favorites" : "Ni priljubljenih", - "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj." + "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj.", + "Text file" : "Besedilna datoteka" },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" } \ No newline at end of file diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js index 8f19800cd2..6811dc5791 100644 --- a/apps/files/l10n/sq.js +++ b/apps/files/l10n/sq.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Pa depozitë gati", "Storage invalid" : "Depozitë e pavlefshme", "Unknown error" : "Gabim i panjohur", - "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë", - "Could not move %s" : "S’u zhvendos dot %s", - "Permission denied" : "Leje e mohuar", - "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", - "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.", - "Error when creating the file" : "Gabim gjatë krijimit të kartelës", - "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", "Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh", "Invalid Token" : "Token i pavlefshëm", "No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Mungon një dosje e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", "Not enough storage available" : "S’ka depozitë të mjaftueshme", + "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar", "Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.", "Invalid directory." : "Drejtori e pavlefshme.", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "S’arrihet të përcaktohet data", "This operation is forbidden" : "Ky veprim është i ndaluar", "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin", - "Error moving file." : "Gabim në lëvizjen e kartelës.", - "Error moving file" : "Gabim në lëvizjen e kartelës", - "Error" : "Gabim", - "{new_name} already exists" : "{new_name} ekziston tashmtë", - "Could not rename file" : "Kartela s’u riemërtua dot", - "Could not create file" : "Kartela s’u krijua dot", - "Could not create folder" : "Dosja s’u krijua dot", - "Error deleting file." : "Gabim gjatë fshirjes së kartelës.", + "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston", + "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"", + "{newName} already exists" : "{newName} ekziston tashmë", + "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.", + "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"", + "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë", + "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë", + "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".", "No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'", "Name" : "Emër", "Size" : "Madhësi", @@ -70,16 +67,15 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)", + "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"], "Path" : "Shteg", "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"], "Favorited" : "U kalua e parapëlqyer", "Favorite" : "E parapëlqyer", - "{newname} already exists" : "Ka tashmë një {newname}", - "Upload" : "Ngarkoje", - "Text file" : "Kartelë tekst", - "New text file.txt" : "Kartelë e re file.txt", "Folder" : "Dosje", "New folder" : "Dosje e re", + "{newname} already exists" : "Ka tashmë një {newname}", + "Upload" : "Ngarkoje", "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat", "A new file or folder has been created" : "U krijua një kartelë ose dosje e re", "A file or folder has been changed" : "U ndryshua një kartelë ose dosje", @@ -98,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "Ndryshuar nga %2$s", "Deleted by %2$s" : "Fshirë nga %2$s", "Restored by %2$s" : "Rikthyer nga %2$s", - "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë", - "%s could not be renamed" : "%s s’riemërtohet dot", "Upload (max. %s)" : "Ngarkim (max. %s)", "File handling" : "Trajtim kartele", "Maximum upload size" : "Madhësi maksimale ngarkimi", "max. possible: " : "maks. i mundshëm: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.", "Save" : "Ruaje", - "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.", + "Missing permissions to edit from here." : "Mungojnë lejet për të përpunuar që këtu.", "Settings" : "Rregullime", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Përdorni këtë adresë për të hyrë te Kartelat tuaja përmes WebDAV-it", @@ -120,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", "Currently scanning" : "Po kontrollohet", "No favorites" : "Pa të parapëlqyera", - "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera" + "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera", + "Text file" : "Kartelë tekst", + "New text file.txt" : "Kartelë e re file.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json index 462f4d0639..45b9d6acb6 100644 --- a/apps/files/l10n/sq.json +++ b/apps/files/l10n/sq.json @@ -2,13 +2,6 @@ "Storage not available" : "Pa depozitë gati", "Storage invalid" : "Depozitë e pavlefshme", "Unknown error" : "Gabim i panjohur", - "Could not move %s - File with this name already exists" : "S’u zhvendos dot %s - Ka tashmë kartelë me këtë", - "Could not move %s" : "S’u zhvendos dot %s", - "Permission denied" : "Leje e mohuar", - "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", - "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s tashmë është i përdorur në dosjen %s. Ju lutemi, zgjidhni një emër tjetër.", - "Error when creating the file" : "Gabim gjatë krijimit të kartelës", - "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", "Unable to set upload directory." : "S’arrihet të caktohet drejtori ngarkimesh", "Invalid Token" : "Token i pavlefshëm", "No file was uploaded. Unknown error" : "S’u ngarkua ndonjë kartelë. Gabim i panjohur", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Mungon një dosje e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", "Not enough storage available" : "S’ka depozitë të mjaftueshme", + "The target folder has been moved or deleted." : "Dosja vendmbërritje është zhvendosur ose fshirë.", "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. S’u gjet dot kartela e ngarkuar", "Upload failed. Could not get file info." : "Ngarkoi dështoi. S’u morën dot të dhëna kartele.", "Invalid directory." : "Drejtori e pavlefshme.", @@ -44,14 +38,17 @@ "Unable to determine date" : "S’arrihet të përcaktohet data", "This operation is forbidden" : "Ky veprim është i ndaluar", "This directory is unavailable, please check the logs or contact the administrator" : "Kjo drejtori nuk kapet, ju lutemi, kontrolloni regjistrat ose lidhuni me përgjegjësin", - "Error moving file." : "Gabim në lëvizjen e kartelës.", - "Error moving file" : "Gabim në lëvizjen e kartelës", - "Error" : "Gabim", - "{new_name} already exists" : "{new_name} ekziston tashmtë", - "Could not rename file" : "Kartela s’u riemërtua dot", - "Could not create file" : "Kartela s’u krijua dot", - "Could not create folder" : "Dosja s’u krijua dot", - "Error deleting file." : "Gabim gjatë fshirjes së kartelës.", + "Could not move \"{file}\", target exists" : "S’u lëviz dot \"{file}\", objektivi ekziston", + "Could not move \"{file}\"" : "S’u lëviz dot \"{file}\"", + "{newName} already exists" : "{newName} ekziston tashmë", + "Could not rename \"{fileName}\", it does not exist any more" : "S’u riemërtua dot \"{fileName}\", s’ekziston më", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "Emri \"{targetName}\" është tashmë i përdorur te dosja \"{dir}\". Ju lutemi, zgjidhni një emër tjetër.", + "Could not rename \"{fileName}\"" : "S’u riemërtua dot \"{fileName}\"", + "Could not create file \"{file}\"" : "S’u krijua dot kartela \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "S’u krijua dot kartela \"{file}\" ngaqë ka një të tillë", + "Could not create folder \"{dir}\"" : "S’u krijua dot dosja \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "S’u krijua dot dosja \"{dir}\" ngaqë ka një të tillë", + "Error deleting file \"{fileName}\"." : "Gabim në fshirjen e kartelës \"{fileName}\".", "No entries in this folder match '{filter}'" : "Në këtë dosje s’ka zëra me përputhje me '{filter}'", "Name" : "Emër", "Size" : "Madhësi", @@ -68,16 +65,15 @@ "Your storage is full, files can not be updated or synced anymore!" : "Depozita juaj është plot, kartelat s’mund të përditësohen ose njëkohësohen më!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Depozita e {owner} është thuasje plot ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" : "Depozita juaj është thuajse plot ({usedSpacePercent}%)", + "_matches '{filter}'_::_match '{filter}'_" : ["ka përputhje me '{filter}'","ka përputhje me '{filter}'"], "Path" : "Shteg", "_%n byte_::_%n bytes_" : ["%n bajt","%n bajte"], "Favorited" : "U kalua e parapëlqyer", "Favorite" : "E parapëlqyer", - "{newname} already exists" : "Ka tashmë një {newname}", - "Upload" : "Ngarkoje", - "Text file" : "Kartelë tekst", - "New text file.txt" : "Kartelë e re file.txt", "Folder" : "Dosje", "New folder" : "Dosje e re", + "{newname} already exists" : "Ka tashmë një {newname}", + "Upload" : "Ngarkoje", "An error occurred while trying to update the tags" : "Ndodhi një gabim teksa provohej të përditësoheshin etiketat", "A new file or folder has been created" : "U krijua një kartelë ose dosje e re", "A file or folder has been changed" : "U ndryshua një kartelë ose dosje", @@ -96,15 +92,13 @@ "Changed by %2$s" : "Ndryshuar nga %2$s", "Deleted by %2$s" : "Fshirë nga %2$s", "Restored by %2$s" : "Rikthyer nga %2$s", - "%s could not be renamed as it has been deleted" : "%s s’riemërtohet dot, sepse është fshirë", - "%s could not be renamed" : "%s s’riemërtohet dot", "Upload (max. %s)" : "Ngarkim (max. %s)", "File handling" : "Trajtim kartele", "Maximum upload size" : "Madhësi maksimale ngarkimi", "max. possible: " : "maks. i mundshëm: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Me PHP-FPM kjo vlerë mund të dojë deri në 5 minuta të hyjë në fuqi, pasi të ruhet.", "Save" : "Ruaje", - "Can not be edited from here due to insufficient permissions." : "S’mund të përpunohet që këtu, për shkak lejesh të pamjaftueshme.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Me PHP-FPM mund të duhen 5 minuta që ndryshimet të hyjnë në fuqi.", + "Missing permissions to edit from here." : "Mungojnë lejet për të përpunuar që këtu.", "Settings" : "Rregullime", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Përdorni këtë adresë për të hyrë te Kartelat tuaja përmes WebDAV-it", @@ -118,6 +112,8 @@ "Files are being scanned, please wait." : "Kartelat po kontrollohen, ju lutemi, pritni.", "Currently scanning" : "Po kontrollohet", "No favorites" : "Pa të parapëlqyera", - "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera" + "Files and folders you mark as favorite will show up here" : "Këtu do të duken kartelat dhe dosjet që i shënoni si të parapëlqyera", + "Text file" : "Kartelë tekst", + "New text file.txt" : "Kartelë e re file.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index 93f8979c2c..80f81b1e02 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Складиште није доступно", "Storage invalid" : "Неисправно складиште", "Unknown error" : "Непозната грешка", - "Could not move %s - File with this name already exists" : "Не могу да преместим %s – фајл са овим називом већ постоји", - "Could not move %s" : "Не могу да преместим %s", - "Permission denied" : "Приступ одбијен", - "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.", - "The name %s is already used in the folder %s. Please choose a different name." : "Назив %s се већ користи у фасцикли %s. Одредите други назив.", - "Error when creating the file" : "Грешка при стварању фајла", - "Error when creating the folder" : "Грешка при стварању фајла", "Unable to set upload directory." : "Не могу да поставим директоријум за отпремање.", "Invalid Token" : "Неисправан токен", "No file was uploaded. Unknown error" : "Ниједан фајл није отпремљен. Непозната грешка", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Недостаје привремена фасцикла", "Failed to write to disk" : "Не могу да пишем на диск", "Not enough storage available" : "Нема довољно простора", + "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.", "Upload failed. Could not find uploaded file" : "Неуспешно отпремање. Не могу да нађем отпремљени фајл", "Upload failed. Could not get file info." : "Неуспешно отпремање. Не могу да добијем податке о фајлу.", "Invalid directory." : "Неисправна фасцикла.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Омиљени", "Home" : "Почетна", "Close" : "Затвори", + "Upload cancelled." : "Отпремање је отказано.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то директоријум или има 0 бајтова", "Total file size {size1} exceeds upload limit {size2}" : "Величина {size1} превазилази ограничење за отпремање од {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало", - "Upload cancelled." : "Отпремање је отказано.", "Could not get result from server." : "Не могу да добијем резултат са сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.", "Actions" : "Радње", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Не могу да одредим датум", "This operation is forbidden" : "Ова радња је забрањена", "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", - "Error moving file." : "Грешка при премештању фајла.", - "Error moving file" : "Грешка при премештању фајла", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} већ постоји", - "Could not rename file" : "Не могу да преименујем фајл", - "Could not create file" : "Не могу да створим фајл", - "Could not create folder" : "Не могу да створим фасциклу", - "Error deleting file." : "Грешка при брисању фајла.", "No entries in this folder match '{filter}'" : "У овој фасцикли ништа се не поклапа са '{filter}'", "Name" : "Назив", "Size" : "Величина", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"], "Favorited" : "Омиљено", "Favorite" : "Омиљени", - "{newname} already exists" : "{newname} већ постоји", - "Upload" : "Отпреми", - "Text file" : "текстуални фајл", - "New text file.txt" : "Нов текстуални фајл.txt", "Folder" : "фасцикла", "New folder" : "Нова фасцикла", + "{newname} already exists" : "{newname} већ постоји", + "Upload" : "Отпреми", "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака", "A new file or folder has been created" : "Нови фајл или фасцикла су направљени", "A file or folder has been changed" : "Фајл или фасцикла су измењени", @@ -99,15 +83,11 @@ OC.L10N.register( "Changed by %2$s" : "Изменио %2$s", "Deleted by %2$s" : "Обрисао %2$s", "Restored by %2$s" : "Повратио %2$s", - "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан", - "%s could not be renamed" : "%s се не може преименовати", "Upload (max. %s)" : "Отпремање (макс. %s)", "File handling" : "Руковање фајловима", "Maximum upload size" : "Највећа величина отпремања", "max. possible: " : "највише могуће:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.", "Save" : "Сачувај", - "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.", "Settings" : "Поставке", "WebDAV" : "ВебДАВ", "Use this address to access your Files via WebDAV" : "Користите ову адресу да приступите фајловима преко ВебДАВ-а", @@ -121,6 +101,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", "Currently scanning" : "Тренутно скенирам", "No favorites" : "Нема омиљених", - "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде" + "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", + "Text file" : "текстуални фајл", + "New text file.txt" : "Нов текстуални фајл.txt" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index 08ba9712de..f878b9c14d 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -2,13 +2,6 @@ "Storage not available" : "Складиште није доступно", "Storage invalid" : "Неисправно складиште", "Unknown error" : "Непозната грешка", - "Could not move %s - File with this name already exists" : "Не могу да преместим %s – фајл са овим називом већ постоји", - "Could not move %s" : "Не могу да преместим %s", - "Permission denied" : "Приступ одбијен", - "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.", - "The name %s is already used in the folder %s. Please choose a different name." : "Назив %s се већ користи у фасцикли %s. Одредите други назив.", - "Error when creating the file" : "Грешка при стварању фајла", - "Error when creating the folder" : "Грешка при стварању фајла", "Unable to set upload directory." : "Не могу да поставим директоријум за отпремање.", "Invalid Token" : "Неисправан токен", "No file was uploaded. Unknown error" : "Ниједан фајл није отпремљен. Непозната грешка", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Недостаје привремена фасцикла", "Failed to write to disk" : "Не могу да пишем на диск", "Not enough storage available" : "Нема довољно простора", + "The target folder has been moved or deleted." : "Одредишна фасцикла је премештена или обрисана.", "Upload failed. Could not find uploaded file" : "Неуспешно отпремање. Не могу да нађем отпремљени фајл", "Upload failed. Could not get file info." : "Неуспешно отпремање. Не могу да добијем податке о фајлу.", "Invalid directory." : "Неисправна фасцикла.", @@ -28,10 +22,10 @@ "Favorites" : "Омиљени", "Home" : "Почетна", "Close" : "Затвори", + "Upload cancelled." : "Отпремање је отказано.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Не могу да отпремим {filename} јер је то директоријум или има 0 бајтова", "Total file size {size1} exceeds upload limit {size2}" : "Величина {size1} превазилази ограничење за отпремање од {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Нема простора. Отпремате {size1} али само {size2} је преостало", - "Upload cancelled." : "Отпремање је отказано.", "Could not get result from server." : "Не могу да добијем резултат са сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање фајла је у току. Ако сада напустите страницу, отказаћете отпремање.", "Actions" : "Радње", @@ -44,14 +38,6 @@ "Unable to determine date" : "Не могу да одредим датум", "This operation is forbidden" : "Ова радња је забрањена", "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", - "Error moving file." : "Грешка при премештању фајла.", - "Error moving file" : "Грешка при премештању фајла", - "Error" : "Грешка", - "{new_name} already exists" : "{new_name} већ постоји", - "Could not rename file" : "Не могу да преименујем фајл", - "Could not create file" : "Не могу да створим фајл", - "Could not create folder" : "Не могу да створим фасциклу", - "Error deleting file." : "Грешка при брисању фајла.", "No entries in this folder match '{filter}'" : "У овој фасцикли ништа се не поклапа са '{filter}'", "Name" : "Назив", "Size" : "Величина", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајта"], "Favorited" : "Омиљено", "Favorite" : "Омиљени", - "{newname} already exists" : "{newname} већ постоји", - "Upload" : "Отпреми", - "Text file" : "текстуални фајл", - "New text file.txt" : "Нов текстуални фајл.txt", "Folder" : "фасцикла", "New folder" : "Нова фасцикла", + "{newname} already exists" : "{newname} већ постоји", + "Upload" : "Отпреми", "An error occurred while trying to update the tags" : "Дошло је до грешке при покушају ажурирања ознака", "A new file or folder has been created" : "Нови фајл или фасцикла су направљени", "A file or folder has been changed" : "Фајл или фасцикла су измењени", @@ -97,15 +81,11 @@ "Changed by %2$s" : "Изменио %2$s", "Deleted by %2$s" : "Обрисао %2$s", "Restored by %2$s" : "Повратио %2$s", - "%s could not be renamed as it has been deleted" : "%s се не може преименовати јер је обрисан", - "%s could not be renamed" : "%s се не може преименовати", "Upload (max. %s)" : "Отпремање (макс. %s)", "File handling" : "Руковање фајловима", "Maximum upload size" : "Највећа величина отпремања", "max. possible: " : "највише могуће:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "У PHP-FPM-у ова вредност има ефекта тек након 5 минута након примене.", "Save" : "Сачувај", - "Can not be edited from here due to insufficient permissions." : "Не може да се мења одавде због недостатка дозвола.", "Settings" : "Поставке", "WebDAV" : "ВебДАВ", "Use this address to access your Files via WebDAV" : "Користите ову адресу да приступите фајловима преко ВебДАВ-а", @@ -119,6 +99,8 @@ "Files are being scanned, please wait." : "Скенирам фајлове, сачекајте.", "Currently scanning" : "Тренутно скенирам", "No favorites" : "Нема омиљених", - "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде" + "Files and folders you mark as favorite will show up here" : "Фајлови и фасцикле које обележите као омиљене појавиће се овде", + "Text file" : "текстуални фајл", + "New text file.txt" : "Нов текстуални фајл.txt" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js index 9c7732e4e7..d7017005a1 100644 --- a/apps/files/l10n/sr@latin.js +++ b/apps/files/l10n/sr@latin.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Skladište nije dostupno", "Storage invalid" : "Neispravno skladište", "Unknown error" : "Nepoznata greška", - "Could not move %s - File with this name already exists" : "Ne mogu da premestim %s – fajl sa ovim nazivom već postoji", - "Could not move %s" : "Ne mogu da premestim %s", - "Permission denied" : "Pristup odbijen", - "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s se već koristi u fascikli %s. Odredite drugi naziv.", - "Error when creating the file" : "Greška pri stvaranju fajla", - "Error when creating the folder" : "Greška pri stvaranju fajla", "Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.", "Invalid Token" : "Neispravan token", "No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Nedostaje privremena fascikla", "Failed to write to disk" : "Ne mogu da pišem na disk", "Not enough storage available" : "Nema dovoljno prostora", + "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.", "Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl", "Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.", "Invalid directory." : "Neispravna fascikla.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Omiljeni", "Home" : "Početna", "Close" : "Zatvori", + "Upload cancelled." : "Otpremanje je otkazano.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova", "Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo", - "Upload cancelled." : "Otpremanje je otkazano.", "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.", "Download" : "Preuzmi", @@ -43,14 +37,6 @@ OC.L10N.register( "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Ne mogu da odredim datum", - "Error moving file." : "Greška pri premeštanju fajla.", - "Error moving file" : "Greška pri premeštanju fajla", - "Error" : "Greška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Ne mogu da preimenujem fajl", - "Could not create file" : "Ne mogu da stvorim fajl", - "Could not create folder" : "Ne mogu da stvorim fasciklu", - "Error deleting file." : "Greška pri brisanju fajla.", "No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'", "Name" : "Naziv", "Size" : "Veličina", @@ -68,10 +54,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"], "Favorited" : "Omiljeno", "Favorite" : "Omiljeni", - "Upload" : "Otpremi", - "Text file" : "tekstualni fajl", "Folder" : "fascikla", "New folder" : "Nova fascikla", + "Upload" : "Otpremi", "An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka", "A new file or folder has been created" : "Novi fajl ili fascikla su napravljeni", "A file or folder has been changed" : "Fajl ili fascikla su izmenjeni", @@ -87,14 +72,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s obrisa %1$s", "You restored %1$s" : "Vratili ste %1$s", "%2$s restored %1$s" : "%2$s povrati %1$s", - "%s could not be renamed as it has been deleted" : "%s se ne može preimenovati jer je obrisan", - "%s could not be renamed" : "%s se ne može preimenovati", "Upload (max. %s)" : "Otpremanje (maks. %s)", "File handling" : "Rukovanje fajlovima", "Maximum upload size" : "Najveća veličina otpremanja", "max. possible: " : "najviše moguće:", "Save" : "Sačuvaj", - "Can not be edited from here due to insufficient permissions." : "Ne može da se menja odavde zbog nedostatka dozvola.", "Settings" : "Postavke", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Koristite ovu adresu da pristupite fajlovima preko WebDAV-a", @@ -108,6 +90,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", "Currently scanning" : "Trenutno skeniram", "No favorites" : "Nema omiljenih", - "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde" + "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde", + "Text file" : "tekstualni fajl" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json index 0eb117e602..98356e441d 100644 --- a/apps/files/l10n/sr@latin.json +++ b/apps/files/l10n/sr@latin.json @@ -2,13 +2,6 @@ "Storage not available" : "Skladište nije dostupno", "Storage invalid" : "Neispravno skladište", "Unknown error" : "Nepoznata greška", - "Could not move %s - File with this name already exists" : "Ne mogu da premestim %s – fajl sa ovim nazivom već postoji", - "Could not move %s" : "Ne mogu da premestim %s", - "Permission denied" : "Pristup odbijen", - "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.", - "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s se već koristi u fascikli %s. Odredite drugi naziv.", - "Error when creating the file" : "Greška pri stvaranju fajla", - "Error when creating the folder" : "Greška pri stvaranju fajla", "Unable to set upload directory." : "Ne mogu da postavim direktorijum za otpremanje.", "Invalid Token" : "Neispravan token", "No file was uploaded. Unknown error" : "Nijedan fajl nije otpremljen. Nepoznata greška", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Nedostaje privremena fascikla", "Failed to write to disk" : "Ne mogu da pišem na disk", "Not enough storage available" : "Nema dovoljno prostora", + "The target folder has been moved or deleted." : "Odredišna fascikla je premeštena ili obrisana.", "Upload failed. Could not find uploaded file" : "Neuspešno otpremanje. Ne mogu da nađem otpremljeni fajl", "Upload failed. Could not get file info." : "Neuspešno otpremanje. Ne mogu da dobijem podatke o fajlu.", "Invalid directory." : "Neispravna fascikla.", @@ -28,10 +22,10 @@ "Favorites" : "Omiljeni", "Home" : "Početna", "Close" : "Zatvori", + "Upload cancelled." : "Otpremanje je otkazano.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne mogu da otpremim {filename} jer je to direktorijum ili ima 0 bajtova", "Total file size {size1} exceeds upload limit {size2}" : "Veličina {size1} prevazilazi ograničenje za otpremanje od {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nema prostora. Otpremate {size1} ali samo {size2} je preostalo", - "Upload cancelled." : "Otpremanje je otkazano.", "Could not get result from server." : "Ne mogu da dobijem rezultat sa servera.", "File upload is in progress. Leaving the page now will cancel the upload." : "Otpremanje fajla je u toku. Ako sada napustite stranicu, otkazaćete otpremanje.", "Download" : "Preuzmi", @@ -41,14 +35,6 @@ "Select" : "Izaberi", "Pending" : "Na čekanju", "Unable to determine date" : "Ne mogu da odredim datum", - "Error moving file." : "Greška pri premeštanju fajla.", - "Error moving file" : "Greška pri premeštanju fajla", - "Error" : "Greška", - "{new_name} already exists" : "{new_name} već postoji", - "Could not rename file" : "Ne mogu da preimenujem fajl", - "Could not create file" : "Ne mogu da stvorim fajl", - "Could not create folder" : "Ne mogu da stvorim fasciklu", - "Error deleting file." : "Greška pri brisanju fajla.", "No entries in this folder match '{filter}'" : "U ovoj fascikli ništa se ne poklapa sa '{filter}'", "Name" : "Naziv", "Size" : "Veličina", @@ -66,10 +52,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["se poklapa sa '{filter}'","se poklapaju sa '{filter}'","se poklapa sa '{filter}'"], "Favorited" : "Omiljeno", "Favorite" : "Omiljeni", - "Upload" : "Otpremi", - "Text file" : "tekstualni fajl", "Folder" : "fascikla", "New folder" : "Nova fascikla", + "Upload" : "Otpremi", "An error occurred while trying to update the tags" : "Došlo je do greške pri pokušaju ažuriranja oznaka", "A new file or folder has been created" : "Novi fajl ili fascikla su napravljeni", "A file or folder has been changed" : "Fajl ili fascikla su izmenjeni", @@ -85,14 +70,11 @@ "%2$s deleted %1$s" : "%2$s obrisa %1$s", "You restored %1$s" : "Vratili ste %1$s", "%2$s restored %1$s" : "%2$s povrati %1$s", - "%s could not be renamed as it has been deleted" : "%s se ne može preimenovati jer je obrisan", - "%s could not be renamed" : "%s se ne može preimenovati", "Upload (max. %s)" : "Otpremanje (maks. %s)", "File handling" : "Rukovanje fajlovima", "Maximum upload size" : "Najveća veličina otpremanja", "max. possible: " : "najviše moguće:", "Save" : "Sačuvaj", - "Can not be edited from here due to insufficient permissions." : "Ne može da se menja odavde zbog nedostatka dozvola.", "Settings" : "Postavke", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Koristite ovu adresu da pristupite fajlovima preko WebDAV-a", @@ -106,6 +88,7 @@ "Files are being scanned, please wait." : "Skeniram fajlove, sačekajte.", "Currently scanning" : "Trenutno skeniram", "No favorites" : "Nema omiljenih", - "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde" + "Files and folders you mark as favorite will show up here" : "Fajlovi i fascikle koje obeležite kao omiljene pojaviće se ovde", + "Text file" : "tekstualni fajl" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 19f42fb144..f5e81760b0 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Lagring inte tillgänglig", "Storage invalid" : "Lagring ogiltig", "Unknown error" : "Okänt fel", - "Could not move %s - File with this name already exists" : "Kunde inte flytta %s - Det finns redan en fil med detta namn", - "Could not move %s" : "Kan inte flytta %s", - "Permission denied" : "Behörighet nekad.", - "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.", - "The name %s is already used in the folder %s. Please choose a different name." : "Namnet %s används redan i katalogen %s. Välj ett annat namn.", - "Error when creating the file" : "Fel under skapande utav filen", - "Error when creating the folder" : "Fel under skapande utav en katalog", "Unable to set upload directory." : "Kan inte sätta mapp för uppladdning.", "Invalid Token" : "Ogiltig token", "No file was uploaded. Unknown error" : "Ingen fil uppladdad. Okänt fel", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "En temporär mapp saknas", "Failed to write to disk" : "Misslyckades spara till disk", "Not enough storage available" : "Inte tillräckligt med lagringsutrymme tillgängligt", + "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.", "Upload failed. Could not find uploaded file" : "Uppladdning misslyckades. Kunde inte hitta den uppladdade filen", "Upload failed. Could not get file info." : "Uppladdning misslyckades. Gick inte att hämta filinformation.", "Invalid directory." : "Felaktig mapp.", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Misslyckades avgöra datum", "This operation is forbidden" : "Denna operation är förbjuden", "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören", - "Error moving file." : "Fel vid flytt av fil.", - "Error moving file" : "Fel uppstod vid flyttning av fil", - "Error" : "Fel", - "{new_name} already exists" : "{new_name} finns redan", - "Could not rename file" : "Kan ej byta filnamn", - "Could not create file" : "Kunde ej skapa fil", - "Could not create folder" : "Kunde ej skapa katalog", - "Error deleting file." : "Kunde inte ta bort filen.", "No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"", "Name" : "Namn", "Size" : "Storlek", @@ -73,12 +59,10 @@ OC.L10N.register( "Path" : "sökväg", "Favorited" : "Favoritiserad", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} existerar redan", - "Upload" : "Ladda upp", - "Text file" : "Textfil", - "New text file.txt" : "nytextfil.txt", "Folder" : "Mapp", "New folder" : "Ny mapp", + "{newname} already exists" : "{newname} existerar redan", + "Upload" : "Ladda upp", "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna", "A new file or folder has been created" : "En ny fil eller mapp har blivit skapad", "A file or folder has been changed" : "En ny fil eller mapp har blivit ändrad", @@ -96,15 +80,11 @@ OC.L10N.register( "Changed by %2$s" : "Ändrad av %2$s", "Deleted by %2$s" : "Bortagen av %2$s", "Restored by %2$s" : "Återställd av %2$s", - "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats", - "%s could not be renamed" : "%s kunde inte namnändras", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", "max. possible: " : "max. möjligt:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM detta värde kan ta upp till 5 minuter för att träda i kraft efter att ha sparat.", "Save" : "Spara", - "Can not be edited from here due to insufficient permissions." : "Kan inte redigeras härifrån på grund av otillräcklig behörighet.", "Settings" : "Inställningar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Använd denna adress till nå dina Filer via WebDAV", @@ -118,6 +98,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Filer skannas, var god vänta", "Currently scanning" : "sökning pågår", "No favorites" : "Inga favoriter", - "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här" + "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här", + "Text file" : "Textfil", + "New text file.txt" : "nytextfil.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index ea512d4f54..c624c34029 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -2,13 +2,6 @@ "Storage not available" : "Lagring inte tillgänglig", "Storage invalid" : "Lagring ogiltig", "Unknown error" : "Okänt fel", - "Could not move %s - File with this name already exists" : "Kunde inte flytta %s - Det finns redan en fil med detta namn", - "Could not move %s" : "Kan inte flytta %s", - "Permission denied" : "Behörighet nekad.", - "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.", - "The name %s is already used in the folder %s. Please choose a different name." : "Namnet %s används redan i katalogen %s. Välj ett annat namn.", - "Error when creating the file" : "Fel under skapande utav filen", - "Error when creating the folder" : "Fel under skapande utav en katalog", "Unable to set upload directory." : "Kan inte sätta mapp för uppladdning.", "Invalid Token" : "Ogiltig token", "No file was uploaded. Unknown error" : "Ingen fil uppladdad. Okänt fel", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "En temporär mapp saknas", "Failed to write to disk" : "Misslyckades spara till disk", "Not enough storage available" : "Inte tillräckligt med lagringsutrymme tillgängligt", + "The target folder has been moved or deleted." : "Målmappen har flyttats eller tagits bort.", "Upload failed. Could not find uploaded file" : "Uppladdning misslyckades. Kunde inte hitta den uppladdade filen", "Upload failed. Could not get file info." : "Uppladdning misslyckades. Gick inte att hämta filinformation.", "Invalid directory." : "Felaktig mapp.", @@ -44,14 +38,6 @@ "Unable to determine date" : "Misslyckades avgöra datum", "This operation is forbidden" : "Denna operation är förbjuden", "This directory is unavailable, please check the logs or contact the administrator" : "Denna katalog är inte tillgänglig, kontrollera loggarna eller kontakta administratören", - "Error moving file." : "Fel vid flytt av fil.", - "Error moving file" : "Fel uppstod vid flyttning av fil", - "Error" : "Fel", - "{new_name} already exists" : "{new_name} finns redan", - "Could not rename file" : "Kan ej byta filnamn", - "Could not create file" : "Kunde ej skapa fil", - "Could not create folder" : "Kunde ej skapa katalog", - "Error deleting file." : "Kunde inte ta bort filen.", "No entries in this folder match '{filter}'" : "Inga poster i denna mapp match \"{filter}\"", "Name" : "Namn", "Size" : "Storlek", @@ -71,12 +57,10 @@ "Path" : "sökväg", "Favorited" : "Favoritiserad", "Favorite" : "Favorit", - "{newname} already exists" : "{newname} existerar redan", - "Upload" : "Ladda upp", - "Text file" : "Textfil", - "New text file.txt" : "nytextfil.txt", "Folder" : "Mapp", "New folder" : "Ny mapp", + "{newname} already exists" : "{newname} existerar redan", + "Upload" : "Ladda upp", "An error occurred while trying to update the tags" : "Ett fel uppstod när uppdatera taggarna", "A new file or folder has been created" : "En ny fil eller mapp har blivit skapad", "A file or folder has been changed" : "En ny fil eller mapp har blivit ändrad", @@ -94,15 +78,11 @@ "Changed by %2$s" : "Ändrad av %2$s", "Deleted by %2$s" : "Bortagen av %2$s", "Restored by %2$s" : "Återställd av %2$s", - "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats", - "%s could not be renamed" : "%s kunde inte namnändras", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", "max. possible: " : "max. möjligt:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "Med PHP-FPM detta värde kan ta upp till 5 minuter för att träda i kraft efter att ha sparat.", "Save" : "Spara", - "Can not be edited from here due to insufficient permissions." : "Kan inte redigeras härifrån på grund av otillräcklig behörighet.", "Settings" : "Inställningar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Använd denna adress till nå dina Filer via WebDAV", @@ -116,6 +96,8 @@ "Files are being scanned, please wait." : "Filer skannas, var god vänta", "Currently scanning" : "sökning pågår", "No favorites" : "Inga favoriter", - "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här" + "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här", + "Text file" : "Textfil", + "New text file.txt" : "nytextfil.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ta_IN.js b/apps/files/l10n/ta_IN.js index 85ed1ea314..b2371916f1 100644 --- a/apps/files/l10n/ta_IN.js +++ b/apps/files/l10n/ta_IN.js @@ -3,8 +3,8 @@ OC.L10N.register( { "Files" : "கோப்புகள்", "Details" : "விவரங்கள்", - "Upload" : "பதிவேற்று", "New folder" : "புதிய கோப்புறை", + "Upload" : "பதிவேற்று", "A new file or folder has been created" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் உருவாக்கப்பட்டுள்ளது.", "A file or folder has been changed" : "ஒரு கோப்புறை அல்லது ஆவணம் மாற்றம் செய்யப்பட்டுள்ளது.", "A file or folder has been deleted" : "ஒரு கோப்புறை அல்லது ஆவணம் நீக்கப்பட்டுள்ளது. ", diff --git a/apps/files/l10n/ta_IN.json b/apps/files/l10n/ta_IN.json index bb7117bc62..e5fe6f3fc8 100644 --- a/apps/files/l10n/ta_IN.json +++ b/apps/files/l10n/ta_IN.json @@ -1,8 +1,8 @@ { "translations": { "Files" : "கோப்புகள்", "Details" : "விவரங்கள்", - "Upload" : "பதிவேற்று", "New folder" : "புதிய கோப்புறை", + "Upload" : "பதிவேற்று", "A new file or folder has been created" : "ஒரு புதிய கோப்புறை அல்லது ஆவணம் உருவாக்கப்பட்டுள்ளது.", "A file or folder has been changed" : "ஒரு கோப்புறை அல்லது ஆவணம் மாற்றம் செய்யப்பட்டுள்ளது.", "A file or folder has been deleted" : "ஒரு கோப்புறை அல்லது ஆவணம் நீக்கப்பட்டுள்ளது. ", diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js index de912eaea2..39a3eda73f 100644 --- a/apps/files/l10n/ta_LK.js +++ b/apps/files/l10n/ta_LK.js @@ -21,16 +21,13 @@ OC.L10N.register( "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", - "Error" : "வழு", - "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது", "Name" : "பெயர்", "Size" : "அளவு", "Modified" : "மாற்றப்பட்டது", "New" : "புதிய", "Favorite" : "விருப்பமான", - "Upload" : "பதிவேற்றுக", - "Text file" : "கோப்பு உரை", "Folder" : "கோப்புறை", + "Upload" : "பதிவேற்றுக", "File handling" : "கோப்பு கையாளுதல்", "Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ", "max. possible: " : "ஆகக் கூடியது:", @@ -39,6 +36,7 @@ OC.L10N.register( "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", - "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்." + "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.", + "Text file" : "கோப்பு உரை" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json index b14853b503..009ef6c7a8 100644 --- a/apps/files/l10n/ta_LK.json +++ b/apps/files/l10n/ta_LK.json @@ -19,16 +19,13 @@ "Details" : "விவரங்கள்", "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", - "Error" : "வழு", - "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது", "Name" : "பெயர்", "Size" : "அளவு", "Modified" : "மாற்றப்பட்டது", "New" : "புதிய", "Favorite" : "விருப்பமான", - "Upload" : "பதிவேற்றுக", - "Text file" : "கோப்பு உரை", "Folder" : "கோப்புறை", + "Upload" : "பதிவேற்றுக", "File handling" : "கோப்பு கையாளுதல்", "Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ", "max. possible: " : "ஆகக் கூடியது:", @@ -37,6 +34,7 @@ "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", - "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்." + "Files are being scanned, please wait." : "கோப்புகள் வருடப்படுகின்றன, தயவுசெய்து காத்திருங்கள்.", + "Text file" : "கோப்பு உரை" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/te.js b/apps/files/l10n/te.js index 9badfac353..a41177c95f 100644 --- a/apps/files/l10n/te.js +++ b/apps/files/l10n/te.js @@ -3,7 +3,6 @@ OC.L10N.register( { "Close" : "మూసివేయి", "Delete" : "తొలగించు", - "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "Folder" : "సంచయం", diff --git a/apps/files/l10n/te.json b/apps/files/l10n/te.json index 21d09484cd..6fa2afe050 100644 --- a/apps/files/l10n/te.json +++ b/apps/files/l10n/te.json @@ -1,7 +1,6 @@ { "translations": { "Close" : "మూసివేయి", "Delete" : "తొలగించు", - "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "Folder" : "సంచయం", diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js index 1cee4efd36..d371d5a39c 100644 --- a/apps/files/l10n/th_TH.js +++ b/apps/files/l10n/th_TH.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้", "Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง", "Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "Could not move %s - File with this name already exists" : "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว", - "Could not move %s" : "ไม่สามารถย้าย %s ได้", - "Permission denied" : "ไม่อนุญาต", - "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ", - "The name %s is already used in the folder %s. Please choose a different name." : "ชื่อ %s ถูกใช้ไปแล้วในโฟลเดอร์ %s โปรดเลือกชื่ออื่นที่แตกต่างกัน", - "Error when creating the file" : "เกิดข้อผิดพลาดเมื่อมีการสร้างไฟล์", - "Error when creating the folder" : "เกิดข้อผิดพลาดเมื่อมีการสร้างโฟลเดอร์", "Unable to set upload directory." : "ไม่สามารถตั้งค่าอัพโหลดไดเรกทอรี", "Invalid Token" : "โทเค็นไม่ถูกต้อง", "No file was uploaded. Unknown error" : "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "โฟลเดอร์ชั่วคราวเกิดการสูญหาย", "Failed to write to disk" : "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว", "Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน", + "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ", "Upload failed. Could not find uploaded file" : "อัพโหลดล้มเหลว ไม่สามารถหาไฟล์ที่จะอัพโหลด", "Upload failed. Could not get file info." : "อัพโหลดล้มเหลว ไม่สามารถรับข้อมูลไฟล์", "Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "รายการโปรด", "Home" : "บ้าน", "Close" : "ปิด", + "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์", "Total file size {size1} exceeds upload limit {size2}" : "ขนาดไฟล์ {size1} ทั้งหมดเกินขีดจำกัด ของการอัพโหลด {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอคุณจะอัพโหลด {size1} แต่มีพืนที่แค่ {size2}", - "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "Could not get result from server." : "ไม่สามารถรับผลลัพธ์จากเซิร์ฟเวอร์", "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "Actions" : "การกระทำ", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "ไม่สามารถกำหนดวัน", "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม", "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ", - "Error moving file." : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์", - "Error moving file" : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์", - "Error" : "ข้อผิดพลาด", - "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ", - "Could not rename file" : "ไม่สามารถเปลี่ยนชื่อไฟล์", - "Could not create file" : "ไม่สามารถสร้างไฟล์", - "Could not create folder" : "ไม่สามารถสร้างโฟลเดอร์", - "Error deleting file." : "เกิดข้อผิดพลาดในการลบไฟล์", + "Could not move \"{file}\", target exists" : "ไม่สามารถย้ายไฟล์ \"{file}\" ไม่มีไฟล์นั้นอยู่", + "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"", + "{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}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว", + "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"", "No entries in this folder match '{filter}'" : "ไม่มีรายการในโฟลเดอร์นี้ที่ตรงกับ '{filter}'", "Name" : "ชื่อ", "Size" : "ขนาด", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n ไบต์"], "Favorited" : "รายการโปรด", "Favorite" : "รายการโปรด", - "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว", - "Upload" : "อัพโหลด", - "Text file" : "ไฟล์ข้อความ", - "New text file.txt" : "ไฟล์ข้อความใหม่ .txt", "Folder" : "แฟ้มเอกสาร", "New folder" : "โฟลเดอร์ใหม่", + "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว", + "Upload" : "อัพโหลด", "An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะที่พยายามจะปรับปรุงแท็ก", "A new file or folder has been created" : "มีไฟล์ใหม่หรือโฟลเดอร์ได้ถูก สร้างขึ้น!", "A file or folder has been changed" : "มีไฟล์หรือโฟลเดอร์ได้ถูก เปลี่ยน!", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s", "Deleted by %2$s" : "ลบโดย %2$s", "Restored by %2$s" : "กู้คืนโดย %2$s", - "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว", - "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ", "Upload (max. %s)" : "อัพโหลด (สูงสุด %s)", "File handling" : "การจัดการไฟล์", "Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้", "max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "ด้วยค่า PHP-FPM นี้อาจใช้เวลาถึง 5 นาที จะมีผลหลังจากการบันทึก", "Save" : "บันทึก", - "Can not be edited from here due to insufficient permissions." : "ไม่สามารถแก้ไขได้จากที่นี่เนื่องจากสิทธิ์ไม่เพียงพอ", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "กับ PHP-FPM อาจใช้เวลา 5 นาทีสำหรับการเปลี่ยนแปลงที่ถูกนำมาใช้", + "Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป", "Settings" : "ตั้งค่า", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อ เข้าถึงไฟล์ของคุณผ่าน WebDAV", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", "Currently scanning" : "ปัจจุบันกำลังสแกน", "No favorites" : "ไม่มีรายการโปรด", - "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่" + "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่", + "Text file" : "ไฟล์ข้อความ", + "New text file.txt" : "ไฟล์ข้อความใหม่ .txt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json index e15e4e5803..5e8086ad9d 100644 --- a/apps/files/l10n/th_TH.json +++ b/apps/files/l10n/th_TH.json @@ -2,13 +2,6 @@ "Storage not available" : "ไม่สามารถใช้พื้นที่จัดเก็บข้อมูลได้", "Storage invalid" : "การจัดเก็บข้อมูลไม่ถูกต้อง", "Unknown error" : "ข้อผิดพลาดที่ไม่ทราบสาเหตุ", - "Could not move %s - File with this name already exists" : "ไม่สามารถย้าย %s ได้ - ไฟล์ที่ใช้ชื่อนี้มีอยู่แล้ว", - "Could not move %s" : "ไม่สามารถย้าย %s ได้", - "Permission denied" : "ไม่อนุญาต", - "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ", - "The name %s is already used in the folder %s. Please choose a different name." : "ชื่อ %s ถูกใช้ไปแล้วในโฟลเดอร์ %s โปรดเลือกชื่ออื่นที่แตกต่างกัน", - "Error when creating the file" : "เกิดข้อผิดพลาดเมื่อมีการสร้างไฟล์", - "Error when creating the folder" : "เกิดข้อผิดพลาดเมื่อมีการสร้างโฟลเดอร์", "Unable to set upload directory." : "ไม่สามารถตั้งค่าอัพโหลดไดเรกทอรี", "Invalid Token" : "โทเค็นไม่ถูกต้อง", "No file was uploaded. Unknown error" : "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "โฟลเดอร์ชั่วคราวเกิดการสูญหาย", "Failed to write to disk" : "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว", "Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน", + "The target folder has been moved or deleted." : "โฟลเดอร์ปลายทางถูกย้ายหรือลบ", "Upload failed. Could not find uploaded file" : "อัพโหลดล้มเหลว ไม่สามารถหาไฟล์ที่จะอัพโหลด", "Upload failed. Could not get file info." : "อัพโหลดล้มเหลว ไม่สามารถรับข้อมูลไฟล์", "Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง", @@ -28,10 +22,10 @@ "Favorites" : "รายการโปรด", "Home" : "บ้าน", "Close" : "ปิด", + "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ไม่สามารถอัพโหลด {filename} มันเป็นไดเรกทอรีหรือมี 0 ไบต์", "Total file size {size1} exceeds upload limit {size2}" : "ขนาดไฟล์ {size1} ทั้งหมดเกินขีดจำกัด ของการอัพโหลด {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "พื้นที่ว่างไม่เพียงพอคุณจะอัพโหลด {size1} แต่มีพืนที่แค่ {size2}", - "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "Could not get result from server." : "ไม่สามารถรับผลลัพธ์จากเซิร์ฟเวอร์", "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "Actions" : "การกระทำ", @@ -44,14 +38,17 @@ "Unable to determine date" : "ไม่สามารถกำหนดวัน", "This operation is forbidden" : "การดำเนินการนี้ถูกห้าม", "This directory is unavailable, please check the logs or contact the administrator" : "ไม่สามารถใช้งานไดเรกทอรีนี้โปรดตรวจสอบบันทึกหรือติดต่อผู้ดูแลระบบ", - "Error moving file." : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์", - "Error moving file" : "ข้อผิดพลาดในการเคลื่อนย้ายไฟล์", - "Error" : "ข้อผิดพลาด", - "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ", - "Could not rename file" : "ไม่สามารถเปลี่ยนชื่อไฟล์", - "Could not create file" : "ไม่สามารถสร้างไฟล์", - "Could not create folder" : "ไม่สามารถสร้างโฟลเดอร์", - "Error deleting file." : "เกิดข้อผิดพลาดในการลบไฟล์", + "Could not move \"{file}\", target exists" : "ไม่สามารถย้ายไฟล์ \"{file}\" ไม่มีไฟล์นั้นอยู่", + "Could not move \"{file}\"" : "ไม่สามารถย้ายไฟล์ \"{file}\"", + "{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}\"" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "ไม่สามารถสร้างโฟลเดอร์ \"{dir}\" เพราะมันมีอยู่แล้ว", + "Error deleting file \"{fileName}\"." : "เกิดข้อผิดพลาดขณะลบไฟล์ \"{fileName}\"", "No entries in this folder match '{filter}'" : "ไม่มีรายการในโฟลเดอร์นี้ที่ตรงกับ '{filter}'", "Name" : "ชื่อ", "Size" : "ขนาด", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n ไบต์"], "Favorited" : "รายการโปรด", "Favorite" : "รายการโปรด", - "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว", - "Upload" : "อัพโหลด", - "Text file" : "ไฟล์ข้อความ", - "New text file.txt" : "ไฟล์ข้อความใหม่ .txt", "Folder" : "แฟ้มเอกสาร", "New folder" : "โฟลเดอร์ใหม่", + "{newname} already exists" : "{newname} ถูกใช้ไปแล้ว", + "Upload" : "อัพโหลด", "An error occurred while trying to update the tags" : "เกิดข้อผิดพลาดขณะที่พยายามจะปรับปรุงแท็ก", "A new file or folder has been created" : "มีไฟล์ใหม่หรือโฟลเดอร์ได้ถูก สร้างขึ้น!", "A file or folder has been changed" : "มีไฟล์หรือโฟลเดอร์ได้ถูก เปลี่ยน!", @@ -97,15 +92,13 @@ "Changed by %2$s" : "เปลี่ยนแปลงโดย %2$s", "Deleted by %2$s" : "ลบโดย %2$s", "Restored by %2$s" : "กู้คืนโดย %2$s", - "%s could not be renamed as it has been deleted" : "%s ไม่สามารถเปลี่ยนชื่อเนื่องจากถูกลบไปแล้ว", - "%s could not be renamed" : "%s ไม่สามารถเปลี่ยนชื่อ", "Upload (max. %s)" : "อัพโหลด (สูงสุด %s)", "File handling" : "การจัดการไฟล์", "Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้", "max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "ด้วยค่า PHP-FPM นี้อาจใช้เวลาถึง 5 นาที จะมีผลหลังจากการบันทึก", "Save" : "บันทึก", - "Can not be edited from here due to insufficient permissions." : "ไม่สามารถแก้ไขได้จากที่นี่เนื่องจากสิทธิ์ไม่เพียงพอ", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "กับ PHP-FPM อาจใช้เวลา 5 นาทีสำหรับการเปลี่ยนแปลงที่ถูกนำมาใช้", + "Missing permissions to edit from here." : "สิทธิ์ในการแก้ไขส่วนนี้หายไป", "Settings" : "ตั้งค่า", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "ใช้ที่อยู่นี้เพื่อ เข้าถึงไฟล์ของคุณผ่าน WebDAV", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.", "Currently scanning" : "ปัจจุบันกำลังสแกน", "No favorites" : "ไม่มีรายการโปรด", - "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่" + "Files and folders you mark as favorite will show up here" : "ไฟล์และโฟลเดอร์ที่คุณทำเครื่องหมายเป็นรายการโปรดจะปรากฏขึ้นที่นี่", + "Text file" : "ไฟล์ข้อความ", + "New text file.txt" : "ไฟล์ข้อความใหม่ .txt" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index cd48408b9e..d0c6886151 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Depolama mevcut değil", "Storage invalid" : "Depolama geçersiz", "Unknown error" : "Bilinmeyen hata", - "Could not move %s - File with this name already exists" : "%s taşınamadı. Bu isimde dosya zaten mevcut", - "Could not move %s" : "%s taşınamadı", - "Permission denied" : "Erişim reddedildi", - "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s ismi zaten %s klasöründe kullanılıyor. Lütfen farklı bir isim seçin.", - "Error when creating the file" : "Dosya oluşturulurken hata", - "Error when creating the folder" : "Klasör oluşturulurken hata", "Unable to set upload directory." : "Yükleme dizini ayarlanamadı.", "Invalid Token" : "Geçersiz Belirteç", "No file was uploaded. Unknown error" : "Dosya yüklenmedi. Bilinmeyen hata", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Geçici bir dizin eksik", "Failed to write to disk" : "Diske yazılamadı", "Not enough storage available" : "Yeterli disk alanı yok", + "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.", "Upload failed. Could not find uploaded file" : "Yükleme başarısız. Yüklenen dosya bulunamadı", "Upload failed. Could not get file info." : "Yükleme başarısız. Dosya bilgisi alınamadı.", "Invalid directory." : "Geçersiz dizin.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Sık kullanılanlar", "Home" : "Ev", "Close" : "Kapat", + "Upload cancelled." : "Yükleme iptal edildi.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi", "Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut", - "Upload cancelled." : "Yükleme iptal edildi.", "Could not get result from server." : "Sunucudan sonuç alınamadı.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.", "Actions" : "Eylemler", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "Tarih tespit edilemedi", "This operation is forbidden" : "Bu işlem yasak", "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin", - "Error moving file." : "Dosya taşıma hatası.", - "Error moving file" : "Dosya taşıma hatası", - "Error" : "Hata", - "{new_name} already exists" : "{new_name} zaten mevcut", - "Could not rename file" : "Dosya adlandırılamadı", - "Could not create file" : "Dosya oluşturulamadı", - "Could not create folder" : "Klasör oluşturulamadı", - "Error deleting file." : "Dosya silinirken hata.", "No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor", "Name" : "İsim", "Size" : "Boyut", @@ -75,12 +61,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"], "Favorited" : "Sık kullanılanlara eklendi", "Favorite" : "Sık kullanılan", - "{newname} already exists" : "{newname} zaten mevcut", - "Upload" : "Yükle", - "Text file" : "Metin dosyası", - "New text file.txt" : "Yeni metin dosyası.txt", "Folder" : "Klasör", "New folder" : "Yeni klasör", + "{newname} already exists" : "{newname} zaten mevcut", + "Upload" : "Yükle", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", "A new file or folder has been created" : "Yeni bir dosya veya klasör oluşturuldu", "A file or folder has been changed" : "Bir dosya veya klasör değiştirildi", @@ -99,15 +83,13 @@ OC.L10N.register( "Changed by %2$s" : "%2$s tarafından değiştirildi", "Deleted by %2$s" : "%2$s tarafından silindi", "Restored by %2$s" : "%2$s tarafından geri yüklendi", - "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", - "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", "File handling" : "Dosya işlemleri", "Maximum upload size" : "Azami yükleme boyutu", "max. possible: " : "mümkün olan en fazla: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ile bu değerin kaydedildikten sonra etkili olabilmesi için 5 dakika gerekebilir.", "Save" : "Kaydet", - "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM ile değişikliklerin uygulanması 5 dakika sürebilir.", + "Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.", "Settings" : "Ayarlar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV aracılığıyla erişmek için bu adresi kullanın", @@ -121,6 +103,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", "Currently scanning" : "Şu anda taranan", "No favorites" : "Sık kullanılan öge yok.", - "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek" + "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek", + "Text file" : "Metin dosyası", + "New text file.txt" : "Yeni metin dosyası.txt" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index 92af334f70..7bc756530d 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -2,13 +2,6 @@ "Storage not available" : "Depolama mevcut değil", "Storage invalid" : "Depolama geçersiz", "Unknown error" : "Bilinmeyen hata", - "Could not move %s - File with this name already exists" : "%s taşınamadı. Bu isimde dosya zaten mevcut", - "Could not move %s" : "%s taşınamadı", - "Permission denied" : "Erişim reddedildi", - "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.", - "The name %s is already used in the folder %s. Please choose a different name." : "%s ismi zaten %s klasöründe kullanılıyor. Lütfen farklı bir isim seçin.", - "Error when creating the file" : "Dosya oluşturulurken hata", - "Error when creating the folder" : "Klasör oluşturulurken hata", "Unable to set upload directory." : "Yükleme dizini ayarlanamadı.", "Invalid Token" : "Geçersiz Belirteç", "No file was uploaded. Unknown error" : "Dosya yüklenmedi. Bilinmeyen hata", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Geçici bir dizin eksik", "Failed to write to disk" : "Diske yazılamadı", "Not enough storage available" : "Yeterli disk alanı yok", + "The target folder has been moved or deleted." : "Hedef klasör taşındı veya silindi.", "Upload failed. Could not find uploaded file" : "Yükleme başarısız. Yüklenen dosya bulunamadı", "Upload failed. Could not get file info." : "Yükleme başarısız. Dosya bilgisi alınamadı.", "Invalid directory." : "Geçersiz dizin.", @@ -28,10 +22,10 @@ "Favorites" : "Sık kullanılanlar", "Home" : "Ev", "Close" : "Kapat", + "Upload cancelled." : "Yükleme iptal edildi.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi", "Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut", - "Upload cancelled." : "Yükleme iptal edildi.", "Could not get result from server." : "Sunucudan sonuç alınamadı.", "File upload is in progress. Leaving the page now will cancel the upload." : "Dosya yükleme işlemi sürüyor. Şu anda sayfadan ayrılmak yükleme işlemini iptal edecek.", "Actions" : "Eylemler", @@ -44,14 +38,6 @@ "Unable to determine date" : "Tarih tespit edilemedi", "This operation is forbidden" : "Bu işlem yasak", "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü kontrol edin veya yönetici ile iletişime geçin", - "Error moving file." : "Dosya taşıma hatası.", - "Error moving file" : "Dosya taşıma hatası", - "Error" : "Hata", - "{new_name} already exists" : "{new_name} zaten mevcut", - "Could not rename file" : "Dosya adlandırılamadı", - "Could not create file" : "Dosya oluşturulamadı", - "Could not create folder" : "Klasör oluşturulamadı", - "Error deleting file." : "Dosya silinirken hata.", "No entries in this folder match '{filter}'" : "Bu klasörde hiçbir girdi '{filter}' ile eşleşmiyor", "Name" : "İsim", "Size" : "Boyut", @@ -73,12 +59,10 @@ "_%n byte_::_%n bytes_" : ["%n bayt","%n bayt"], "Favorited" : "Sık kullanılanlara eklendi", "Favorite" : "Sık kullanılan", - "{newname} already exists" : "{newname} zaten mevcut", - "Upload" : "Yükle", - "Text file" : "Metin dosyası", - "New text file.txt" : "Yeni metin dosyası.txt", "Folder" : "Klasör", "New folder" : "Yeni klasör", + "{newname} already exists" : "{newname} zaten mevcut", + "Upload" : "Yükle", "An error occurred while trying to update the tags" : "Etiketler güncellenmeye çalışılırken bir hata oluştu", "A new file or folder has been created" : "Yeni bir dosya veya klasör oluşturuldu", "A file or folder has been changed" : "Bir dosya veya klasör değiştirildi", @@ -97,15 +81,13 @@ "Changed by %2$s" : "%2$s tarafından değiştirildi", "Deleted by %2$s" : "%2$s tarafından silindi", "Restored by %2$s" : "%2$s tarafından geri yüklendi", - "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", - "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", "File handling" : "Dosya işlemleri", "Maximum upload size" : "Azami yükleme boyutu", "max. possible: " : "mümkün olan en fazla: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "PHP-FPM ile bu değerin kaydedildikten sonra etkili olabilmesi için 5 dakika gerekebilir.", "Save" : "Kaydet", - "Can not be edited from here due to insufficient permissions." : "Yetersiz izinler buradan düzenlenemez.", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "PHP-FPM ile değişikliklerin uygulanması 5 dakika sürebilir.", + "Missing permissions to edit from here." : "Buradan düzenleme için eksik yetki.", "Settings" : "Ayarlar", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Dosyalarınıza WebDAV aracılığıyla erişmek için bu adresi kullanın", @@ -119,6 +101,8 @@ "Files are being scanned, please wait." : "Dosyalar taranıyor, lütfen bekleyin.", "Currently scanning" : "Şu anda taranan", "No favorites" : "Sık kullanılan öge yok.", - "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek" + "Files and folders you mark as favorite will show up here" : "Sık kullanılan olarak işaretlediğiniz dosya ve klasörler burada gösterilecek", + "Text file" : "Metin dosyası", + "New text file.txt" : "Yeni metin dosyası.txt" },"pluralForm" :"nplurals=2; plural=(n > 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js index 4371e15067..55985f6a65 100644 --- a/apps/files/l10n/ug.js +++ b/apps/files/l10n/ug.js @@ -2,7 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "يوچۇن خاتالىق", - "Could not move %s" : "%s يۆتكىيەلمەيدۇ", "No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق", "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى", "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.", @@ -19,21 +18,19 @@ OC.L10N.register( "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", "Pending" : "كۈتۈۋاتىدۇ", - "Error" : "خاتالىق", - "{new_name} already exists" : "{new_name} مەۋجۇت", "Name" : "ئاتى", "Size" : "چوڭلۇقى", "Modified" : "ئۆزگەرتكەن", "New" : "يېڭى", "Favorite" : "يىغقۇچ", - "Upload" : "يۈكلە", - "Text file" : "تېكىست ھۆججەت", "Folder" : "قىسقۇچ", "New folder" : "يېڭى قىسقۇچ", + "Upload" : "يۈكلە", "Save" : "ساقلا", "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", - "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" + "Upload too large" : "يۈكلەندىغىنى بەك چوڭ", + "Text file" : "تېكىست ھۆججەت" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json index f6a71d8bda..716bf62afb 100644 --- a/apps/files/l10n/ug.json +++ b/apps/files/l10n/ug.json @@ -1,6 +1,5 @@ { "translations": { "Unknown error" : "يوچۇن خاتالىق", - "Could not move %s" : "%s يۆتكىيەلمەيدۇ", "No file was uploaded. Unknown error" : "ھېچقانداق ھۆججەت يۈكلەنمىدى. يوچۇن خاتالىق", "No file was uploaded" : "ھېچقانداق ھۆججەت يۈكلەنمىدى", "Missing a temporary folder" : "ۋاقىتلىق قىسقۇچ كەم.", @@ -17,21 +16,19 @@ "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", "Pending" : "كۈتۈۋاتىدۇ", - "Error" : "خاتالىق", - "{new_name} already exists" : "{new_name} مەۋجۇت", "Name" : "ئاتى", "Size" : "چوڭلۇقى", "Modified" : "ئۆزگەرتكەن", "New" : "يېڭى", "Favorite" : "يىغقۇچ", - "Upload" : "يۈكلە", - "Text file" : "تېكىست ھۆججەت", "Folder" : "قىسقۇچ", "New folder" : "يېڭى قىسقۇچ", + "Upload" : "يۈكلە", "Save" : "ساقلا", "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", - "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" + "Upload too large" : "يۈكلەندىغىنى بەك چوڭ", + "Text file" : "تېكىست ھۆججەت" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index bf5b0f1d45..8d43949d8f 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "Сховище не доступне", "Storage invalid" : "Неправильне сховище", "Unknown error" : "Невідома помилка", - "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує", - "Could not move %s" : "Не вдалося перемістити %s", - "Permission denied" : "Доступ заборонено", - "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.", - "The name %s is already used in the folder %s. Please choose a different name." : "Файл з ім'ям %s вже є у теці %s. Оберіть інше ім'я.", - "Error when creating the file" : "Помилка створення файлу", - "Error when creating the folder" : "Помилка створення теки", "Unable to set upload directory." : "Не вдалося встановити каталог вивантаження.", "Invalid Token" : "Неприпустимий маркер", "No file was uploaded. Unknown error" : "Файл не був вивантажений. Невідома помилка", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "Відсутній тимчасовий каталог", "Failed to write to disk" : "Помилка запису на диск", "Not enough storage available" : "Місця більше немає", + "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.", "Upload failed. Could not find uploaded file" : "Вивантаження не вдалося. Неможливо знайти вивантажений файл.", "Upload failed. Could not get file info." : "Вивантаження не вдалося. Неможливо отримати інформацію про файл.", "Invalid directory." : "Невірний каталог.", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "Улюблені", "Home" : "Домашня адреса", "Close" : "Закрити", + "Upload cancelled." : "Вивантаження скасовано.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо вивантажити {filename}, оскільки це каталог або файл має розмір 0 байт.", "Total file size {size1} exceeds upload limit {size2}" : "Розмір файлу {size1} перевищує обмеження {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви вивантажуєте {size1}, а залишилося лише {size2}", - "Upload cancelled." : "Вивантаження скасовано.", "Could not get result from server." : "Не вдалося отримати результат від сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.", "Actions" : "Дії", @@ -45,14 +39,6 @@ OC.L10N.register( "Pending" : "Очікування", "Unable to determine date" : "Неможливо визначити дату", "This operation is forbidden" : "Ця операція заборонена", - "Error moving file." : "Помилка переміщення файлу.", - "Error moving file" : "Помилка переміщення файлу", - "Error" : "Помилка", - "{new_name} already exists" : "{new_name} вже існує", - "Could not rename file" : "Неможливо перейменувати файл", - "Could not create file" : "Не вдалося створити файл", - "Could not create folder" : "Не вдалося створити теку", - "Error deleting file." : "Помилка видалення файлу.", "No entries in this folder match '{filter}'" : "Нічого не знайдено в цій теці '{filter}'", "Name" : "Ім'я", "Size" : "Розмір", @@ -70,10 +56,9 @@ OC.L10N.register( "_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"], "Favorited" : "Улюблений", "Favorite" : "Улюблений", - "Upload" : "Вивантажити", - "Text file" : "Текстовий файл", "Folder" : "Тека", "New folder" : "Нова тека", + "Upload" : "Вивантажити", "An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки", "A new file or folder has been created" : "Новий файл або теку було створено", "A file or folder has been changed" : "Файл або теку було змінено ", @@ -89,14 +74,11 @@ OC.L10N.register( "%2$s deleted %1$s" : "%2$s видалено %1$s", "You restored %1$s" : "Вами відновлено %1$s", "%2$s restored %1$s" : "%2$s відновлено %1$s", - "%s could not be renamed as it has been deleted" : "%s не можна перейменувати, оскільки його видалено", - "%s could not be renamed" : "%s не можна перейменувати", "Upload (max. %s)" : "Вивантаження (макс. %s)", "File handling" : "Робота з файлами", "Maximum upload size" : "Максимальний розмір вивантажень", "max. possible: " : "макс. можливе:", "Save" : "Зберегти", - "Can not be edited from here due to insufficient permissions." : "Неможливо відредагувати тут через брак повноважень.", "Settings" : "Налаштування", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Для доступу до файлів через WebDAV використовуйте це посилання", @@ -110,6 +92,7 @@ OC.L10N.register( "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", "Currently scanning" : "Триває перевірка", "No favorites" : "Немає улюблених", - "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут" + "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут", + "Text file" : "Текстовий файл" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index 28d307b55b..d7381e0cfa 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -2,13 +2,6 @@ "Storage not available" : "Сховище не доступне", "Storage invalid" : "Неправильне сховище", "Unknown error" : "Невідома помилка", - "Could not move %s - File with this name already exists" : "Не вдалося перемістити %s - файл з таким ім'ям вже існує", - "Could not move %s" : "Не вдалося перемістити %s", - "Permission denied" : "Доступ заборонено", - "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.", - "The name %s is already used in the folder %s. Please choose a different name." : "Файл з ім'ям %s вже є у теці %s. Оберіть інше ім'я.", - "Error when creating the file" : "Помилка створення файлу", - "Error when creating the folder" : "Помилка створення теки", "Unable to set upload directory." : "Не вдалося встановити каталог вивантаження.", "Invalid Token" : "Неприпустимий маркер", "No file was uploaded. Unknown error" : "Файл не був вивантажений. Невідома помилка", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "Відсутній тимчасовий каталог", "Failed to write to disk" : "Помилка запису на диск", "Not enough storage available" : "Місця більше немає", + "The target folder has been moved or deleted." : "Теку призначення було переміщено або видалено.", "Upload failed. Could not find uploaded file" : "Вивантаження не вдалося. Неможливо знайти вивантажений файл.", "Upload failed. Could not get file info." : "Вивантаження не вдалося. Неможливо отримати інформацію про файл.", "Invalid directory." : "Невірний каталог.", @@ -28,10 +22,10 @@ "Favorites" : "Улюблені", "Home" : "Домашня адреса", "Close" : "Закрити", + "Upload cancelled." : "Вивантаження скасовано.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо вивантажити {filename}, оскільки це каталог або файл має розмір 0 байт.", "Total file size {size1} exceeds upload limit {size2}" : "Розмір файлу {size1} перевищує обмеження {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви вивантажуєте {size1}, а залишилося лише {size2}", - "Upload cancelled." : "Вивантаження скасовано.", "Could not get result from server." : "Не вдалося отримати результат від сервера.", "File upload is in progress. Leaving the page now will cancel the upload." : "Виконується вивантаження файлу. Закриття цієї сторінки приведе до скасування вивантаження.", "Actions" : "Дії", @@ -43,14 +37,6 @@ "Pending" : "Очікування", "Unable to determine date" : "Неможливо визначити дату", "This operation is forbidden" : "Ця операція заборонена", - "Error moving file." : "Помилка переміщення файлу.", - "Error moving file" : "Помилка переміщення файлу", - "Error" : "Помилка", - "{new_name} already exists" : "{new_name} вже існує", - "Could not rename file" : "Неможливо перейменувати файл", - "Could not create file" : "Не вдалося створити файл", - "Could not create folder" : "Не вдалося створити теку", - "Error deleting file." : "Помилка видалення файлу.", "No entries in this folder match '{filter}'" : "Нічого не знайдено в цій теці '{filter}'", "Name" : "Ім'я", "Size" : "Розмір", @@ -68,10 +54,9 @@ "_matches '{filter}'_::_match '{filter}'_" : ["знайдено '{filter}'","знайдено '{filter}'","знайдено '{filter}'"], "Favorited" : "Улюблений", "Favorite" : "Улюблений", - "Upload" : "Вивантажити", - "Text file" : "Текстовий файл", "Folder" : "Тека", "New folder" : "Нова тека", + "Upload" : "Вивантажити", "An error occurred while trying to update the tags" : "Виникла помилка при спробі оновити мітки", "A new file or folder has been created" : "Новий файл або теку було створено", "A file or folder has been changed" : "Файл або теку було змінено ", @@ -87,14 +72,11 @@ "%2$s deleted %1$s" : "%2$s видалено %1$s", "You restored %1$s" : "Вами відновлено %1$s", "%2$s restored %1$s" : "%2$s відновлено %1$s", - "%s could not be renamed as it has been deleted" : "%s не можна перейменувати, оскільки його видалено", - "%s could not be renamed" : "%s не можна перейменувати", "Upload (max. %s)" : "Вивантаження (макс. %s)", "File handling" : "Робота з файлами", "Maximum upload size" : "Максимальний розмір вивантажень", "max. possible: " : "макс. можливе:", "Save" : "Зберегти", - "Can not be edited from here due to insufficient permissions." : "Неможливо відредагувати тут через брак повноважень.", "Settings" : "Налаштування", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "Для доступу до файлів через WebDAV використовуйте це посилання", @@ -108,6 +90,7 @@ "Files are being scanned, please wait." : "Файли перевіряються, зачекайте, будь-ласка.", "Currently scanning" : "Триває перевірка", "No favorites" : "Немає улюблених", - "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут" + "Files and folders you mark as favorite will show up here" : "Файли і теки, які ви позначили як улюблені, з’являться тут", + "Text file" : "Текстовий файл" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" } \ No newline at end of file diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js index 2265e52d77..bac2c3b614 100644 --- a/apps/files/l10n/ur_PK.js +++ b/apps/files/l10n/ur_PK.js @@ -5,7 +5,6 @@ OC.L10N.register( "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", "Delete" : "حذف کریں", - "Error" : "ایرر", "Name" : "اسم", "Save" : "حفظ", "Settings" : "ترتیبات" diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json index e8eb736811..be36293b91 100644 --- a/apps/files/l10n/ur_PK.json +++ b/apps/files/l10n/ur_PK.json @@ -3,7 +3,6 @@ "Close" : "بند ", "Download" : "ڈاؤن لوڈ،", "Delete" : "حذف کریں", - "Error" : "ایرر", "Name" : "اسم", "Save" : "حفظ", "Settings" : "ترتیبات" diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 2c643e3cfb..4af893ab66 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -4,11 +4,6 @@ OC.L10N.register( "Storage not available" : "Lưu trữ không có sẵn", "Storage invalid" : "Lưu trữ không hợp lệ", "Unknown error" : "Lỗi chưa biết", - "Could not move %s - File with this name already exists" : "Không thể di chuyển %s - Đã có tên tập tin này trên hệ thống", - "Could not move %s" : "Không thể di chuyển %s", - "The name %s is already used in the folder %s. Please choose a different name." : "Tên %s đã được sử dụng trong thư mục %s. Hãy chọn tên khác.", - "Error when creating the file" : "Lỗi khi tạo file", - "Error when creating the folder" : "Lỗi khi tạo thư mục", "Unable to set upload directory." : "Không thể thiết lập thư mục tải lên.", "Invalid Token" : "Xác thực không hợp lệ", "No file was uploaded. Unknown error" : "Không có tập tin nào được tải lên. Lỗi không xác định", @@ -27,8 +22,8 @@ OC.L10N.register( "Favorites" : "Ưa thích", "Home" : "Nhà", "Close" : "Đóng", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Upload cancelled." : "Hủy tải lên", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Could not get result from server." : "Không thể nhận được kết quả từ máy chủ.", "File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", "Actions" : "Actions", @@ -38,13 +33,6 @@ OC.L10N.register( "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", - "Error moving file" : "Lỗi di chuyển tập tin", - "Error" : "Lỗi", - "{new_name} already exists" : "{new_name} đã tồn tại", - "Could not rename file" : "Không thể đổi tên file", - "Could not create file" : "Không thể tạo file", - "Could not create folder" : "Không thể tạo thư mục", - "Error deleting file." : "Lỗi xóa file,", "Name" : "Tên", "Size" : "Kích cỡ", "Modified" : "Thay đổi", @@ -58,11 +46,9 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!", "Your storage is almost full ({usedSpacePercent}%)" : "Your storage is almost full ({usedSpacePercent}%)", "Favorite" : "Ưu thích", - "Upload" : "Tải lên", - "Text file" : "Tập tin văn bản", "Folder" : "Thư mục", "New folder" : "Tạo thư mục", - "%s could not be renamed" : "%s không thể đổi tên", + "Upload" : "Tải lên", "File handling" : "Xử lý tập tin", "Maximum upload size" : "Kích thước tối đa ", "max. possible: " : "tối đa cho phép:", @@ -74,6 +60,7 @@ OC.L10N.register( "Select all" : "Chọn tất cả", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", - "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ." + "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.", + "Text file" : "Tập tin văn bản" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index ac7a1f3828..ebffb82752 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -2,11 +2,6 @@ "Storage not available" : "Lưu trữ không có sẵn", "Storage invalid" : "Lưu trữ không hợp lệ", "Unknown error" : "Lỗi chưa biết", - "Could not move %s - File with this name already exists" : "Không thể di chuyển %s - Đã có tên tập tin này trên hệ thống", - "Could not move %s" : "Không thể di chuyển %s", - "The name %s is already used in the folder %s. Please choose a different name." : "Tên %s đã được sử dụng trong thư mục %s. Hãy chọn tên khác.", - "Error when creating the file" : "Lỗi khi tạo file", - "Error when creating the folder" : "Lỗi khi tạo thư mục", "Unable to set upload directory." : "Không thể thiết lập thư mục tải lên.", "Invalid Token" : "Xác thực không hợp lệ", "No file was uploaded. Unknown error" : "Không có tập tin nào được tải lên. Lỗi không xác định", @@ -25,8 +20,8 @@ "Favorites" : "Ưa thích", "Home" : "Nhà", "Close" : "Đóng", - "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Upload cancelled." : "Hủy tải lên", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Could not get result from server." : "Không thể nhận được kết quả từ máy chủ.", "File upload is in progress. Leaving the page now will cancel the upload." : "Tập tin tải lên đang được xử lý. Nếu bạn rời khỏi trang bây giờ sẽ hủy quá trình này.", "Actions" : "Actions", @@ -36,13 +31,6 @@ "Details" : "Chi tiết", "Select" : "Chọn", "Pending" : "Đang chờ", - "Error moving file" : "Lỗi di chuyển tập tin", - "Error" : "Lỗi", - "{new_name} already exists" : "{new_name} đã tồn tại", - "Could not rename file" : "Không thể đổi tên file", - "Could not create file" : "Không thể tạo file", - "Could not create folder" : "Không thể tạo thư mục", - "Error deleting file." : "Lỗi xóa file,", "Name" : "Tên", "Size" : "Kích cỡ", "Modified" : "Thay đổi", @@ -56,11 +44,9 @@ "Your storage is full, files can not be updated or synced anymore!" : "Your storage is full, files can not be updated or synced anymore!", "Your storage is almost full ({usedSpacePercent}%)" : "Your storage is almost full ({usedSpacePercent}%)", "Favorite" : "Ưu thích", - "Upload" : "Tải lên", - "Text file" : "Tập tin văn bản", "Folder" : "Thư mục", "New folder" : "Tạo thư mục", - "%s could not be renamed" : "%s không thể đổi tên", + "Upload" : "Tải lên", "File handling" : "Xử lý tập tin", "Maximum upload size" : "Kích thước tối đa ", "max. possible: " : "tối đa cho phép:", @@ -72,6 +58,7 @@ "Select all" : "Chọn tất cả", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", - "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ." + "Files are being scanned, please wait." : "Tập tin đang được quét ,vui lòng chờ.", + "Text file" : "Tập tin văn bản" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index d2b0989e35..cadbeee3fc 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "存储空间不可用", "Storage invalid" : "存储空间无效", "Unknown error" : "未知错误", - "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在", - "Could not move %s" : "无法移动 %s", - "Permission denied" : "拒绝访问", - "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。", - "The name %s is already used in the folder %s. Please choose a different name." : "文件名 %s 是已经在 %s 中存在的名称。请使用其他名称。", - "Error when creating the file" : "创建文件时出错", - "Error when creating the folder" : "创建文件夹出错", "Unable to set upload directory." : "无法设置上传文件夹。", "Invalid Token" : "无效密匙", "No file was uploaded. Unknown error" : "没有文件被上传。未知错误", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "缺少临时目录", "Failed to write to disk" : "写入磁盘失败", "Not enough storage available" : "没有足够的存储空间", + "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。", "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件", "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。", "Invalid directory." : "无效文件夹。", @@ -30,10 +24,10 @@ OC.L10N.register( "Favorites" : "收藏", "Home" : "家庭", "Close" : "关闭", + "Upload cancelled." : "上传已取消", "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节", "Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。", - "Upload cancelled." : "上传已取消", "Could not get result from server." : "不能从服务器得到结果", "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", @@ -46,14 +40,17 @@ OC.L10N.register( "Unable to determine date" : "无法确定日期", "This operation is forbidden" : "操作被禁止", "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员", - "Error moving file." : "移动文件出错。", - "Error moving file" : "移动文件错误", - "Error" : "错误", - "{new_name} already exists" : "{new_name} 已存在", - "Could not rename file" : "不能重命名文件", - "Could not create file" : "不能创建文件", - "Could not create folder" : "不能创建文件夹", - "Error deleting file." : "删除文件出错。", + "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。", + "Could not move \"{file}\"" : "不能移动 \"{file}\"", + "{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." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。", + "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}\"" : "不能创建文件夹 \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在", + "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。", "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”", "Name" : "名称", "Size" : "大小", @@ -75,12 +72,10 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", - "{newname} already exists" : "{newname} 已经存在", - "Upload" : "上传", - "Text file" : "文本文件", - "New text file.txt" : "创建文本文件 .txt", "Folder" : "文件夹", "New folder" : "增加文件夹", + "{newname} already exists" : "{newname} 已经存在", + "Upload" : "上传", "An error occurred while trying to update the tags" : "更新标签时出错", "A new file or folder has been created" : "一个新的文件或文件夹已被创建", "A file or folder has been changed" : "一个文件或文件夹已被修改", @@ -99,15 +94,13 @@ OC.L10N.register( "Changed by %2$s" : "被 %2$s 更改", "Deleted by %2$s" : "被 %2$s 删除", "Restored by %2$s" : "被 %2$s 恢复", - "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", - "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", "File handling" : "文件处理", "Maximum upload size" : "最大上传大小", "max. possible: " : "最大允许: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "对于 PHP-FPM 这个值保存后可能需要长达5分钟才会生效。", "Save" : "保存", - "Can not be edited from here due to insufficient permissions." : "由于权限不足无法在此编辑。", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。", + "Missing permissions to edit from here." : "没有从这里进行编辑的权限", "Settings" : "设置", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "使用这个地址 通过 WebDAV 访问您的文件", @@ -121,6 +114,8 @@ OC.L10N.register( "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", "Currently scanning" : "正在扫描", "No favorites" : "无收藏", - "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示" + "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示", + "Text file" : "文本文件", + "New text file.txt" : "创建文本文件 .txt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index 6eee0d3a76..b2883e5ea1 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -2,13 +2,6 @@ "Storage not available" : "存储空间不可用", "Storage invalid" : "存储空间无效", "Unknown error" : "未知错误", - "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在", - "Could not move %s" : "无法移动 %s", - "Permission denied" : "拒绝访问", - "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。", - "The name %s is already used in the folder %s. Please choose a different name." : "文件名 %s 是已经在 %s 中存在的名称。请使用其他名称。", - "Error when creating the file" : "创建文件时出错", - "Error when creating the folder" : "创建文件夹出错", "Unable to set upload directory." : "无法设置上传文件夹。", "Invalid Token" : "无效密匙", "No file was uploaded. Unknown error" : "没有文件被上传。未知错误", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "缺少临时目录", "Failed to write to disk" : "写入磁盘失败", "Not enough storage available" : "没有足够的存储空间", + "The target folder has been moved or deleted." : "目标文件夹已经被移动或删除。", "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件", "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。", "Invalid directory." : "无效文件夹。", @@ -28,10 +22,10 @@ "Favorites" : "收藏", "Home" : "家庭", "Close" : "关闭", + "Upload cancelled." : "上传已取消", "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节", "Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。", - "Upload cancelled." : "上传已取消", "Could not get result from server." : "不能从服务器得到结果", "File upload is in progress. Leaving the page now will cancel the upload." : "文件正在上传中。现在离开此页会导致上传动作被取消。", "Actions" : "动作", @@ -44,14 +38,17 @@ "Unable to determine date" : "无法确定日期", "This operation is forbidden" : "操作被禁止", "This directory is unavailable, please check the logs or contact the administrator" : "此目录不可用,请检查日志或联系管理员", - "Error moving file." : "移动文件出错。", - "Error moving file" : "移动文件错误", - "Error" : "错误", - "{new_name} already exists" : "{new_name} 已存在", - "Could not rename file" : "不能重命名文件", - "Could not create file" : "不能创建文件", - "Could not create folder" : "不能创建文件夹", - "Error deleting file." : "删除文件出错。", + "Could not move \"{file}\", target exists" : "不能移动 \"{file}\",目标已存在。", + "Could not move \"{file}\"" : "不能移动 \"{file}\"", + "{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." : "在文件夹 \"{dir}\" 中已经存在 \"{targetName}\" 。请换一个名字试下。", + "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}\"" : "不能创建文件夹 \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "不能创建文件夹 \"{dir}\" ,因为它已经存在", + "Error deleting file \"{fileName}\"." : "删除文件 \"{fileName}\" 时出错。", "No entries in this folder match '{filter}'" : "此文件夹中无项目匹配“{filter}”", "Name" : "名称", "Size" : "大小", @@ -73,12 +70,10 @@ "_%n byte_::_%n bytes_" : ["%n 字节"], "Favorited" : "已收藏", "Favorite" : "收藏", - "{newname} already exists" : "{newname} 已经存在", - "Upload" : "上传", - "Text file" : "文本文件", - "New text file.txt" : "创建文本文件 .txt", "Folder" : "文件夹", "New folder" : "增加文件夹", + "{newname} already exists" : "{newname} 已经存在", + "Upload" : "上传", "An error occurred while trying to update the tags" : "更新标签时出错", "A new file or folder has been created" : "一个新的文件或文件夹已被创建", "A file or folder has been changed" : "一个文件或文件夹已被修改", @@ -97,15 +92,13 @@ "Changed by %2$s" : "被 %2$s 更改", "Deleted by %2$s" : "被 %2$s 删除", "Restored by %2$s" : "被 %2$s 恢复", - "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", - "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", "File handling" : "文件处理", "Maximum upload size" : "最大上传大小", "max. possible: " : "最大允许: ", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "对于 PHP-FPM 这个值保存后可能需要长达5分钟才会生效。", "Save" : "保存", - "Can not be edited from here due to insufficient permissions." : "由于权限不足无法在此编辑。", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "对于 PHP-FPM 这个值改变后可能需要 5 分钟才会生效。", + "Missing permissions to edit from here." : "没有从这里进行编辑的权限", "Settings" : "设置", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "使用这个地址 通过 WebDAV 访问您的文件", @@ -119,6 +112,8 @@ "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", "Currently scanning" : "正在扫描", "No favorites" : "无收藏", - "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示" + "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示", + "Text file" : "文本文件", + "New text file.txt" : "创建文本文件 .txt" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index 421ae5dc92..30b7e75a73 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -9,14 +9,13 @@ OC.L10N.register( "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", - "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", "{dirs} and {files}" : "{dirs} 和 {files}", "New" : "新增", - "Upload" : "上戴", "Folder" : "資料夾", "New folder" : "新資料夾", + "Upload" : "上戴", "A new file or folder has been created" : "新檔案或資料夾已被 新增 ", "A file or folder has been changed" : "檔案或資料夾已被 變成 ", "A file or folder has been deleted" : "新檔案或資料夾已被 刪除 ", diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index 3d1af1593b..213997044a 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -7,14 +7,13 @@ "Download" : "下載", "Rename" : "重新命名", "Delete" : "刪除", - "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", "{dirs} and {files}" : "{dirs} 和 {files}", "New" : "新增", - "Upload" : "上戴", "Folder" : "資料夾", "New folder" : "新資料夾", + "Upload" : "上戴", "A new file or folder has been created" : "新檔案或資料夾已被 新增 ", "A file or folder has been changed" : "檔案或資料夾已被 變成 ", "A file or folder has been deleted" : "新檔案或資料夾已被 刪除 ", diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 432e167da8..09829db3bc 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -4,13 +4,6 @@ OC.L10N.register( "Storage not available" : "無法存取儲存空間", "Storage invalid" : "無效的儲存空間", "Unknown error" : "未知的錯誤", - "Could not move %s - File with this name already exists" : "無法移動 %s ,同名的檔案已經存在", - "Could not move %s" : "無法移動 %s", - "Permission denied" : "存取被拒", - "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除。", - "The name %s is already used in the folder %s. Please choose a different name." : "%s 已經被使用於資料夾 %s ,請換一個名字", - "Error when creating the file" : "建立檔案失敗", - "Error when creating the folder" : "建立資料夾失敗", "Unable to set upload directory." : "無法設定上傳目錄", "Invalid Token" : "無效的 token", "No file was uploaded. Unknown error" : "沒有檔案被上傳,原因未知", @@ -22,6 +15,7 @@ OC.L10N.register( "Missing a temporary folder" : "找不到暫存資料夾", "Failed to write to disk" : "寫入硬碟失敗", "Not enough storage available" : "儲存空間不足", + "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除", "Upload failed. Could not find uploaded file" : "上傳失敗,找不到上傳的檔案", "Upload failed. Could not get file info." : "上傳失敗,無法取得檔案資訊", "Invalid directory." : "無效的資料夾", @@ -46,14 +40,6 @@ OC.L10N.register( "Unable to determine date" : "無法確定日期", "This operation is forbidden" : "此動作被禁止", "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員", - "Error moving file." : "移動檔案發生錯誤", - "Error moving file" : "移動檔案失敗", - "Error" : "錯誤", - "{new_name} already exists" : "{new_name} 已經存在", - "Could not rename file" : "無法重新命名", - "Could not create file" : "無法建立檔案", - "Could not create folder" : "無法建立資料夾", - "Error deleting file." : "刪除檔案發生錯誤", "No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符", "Name" : "名稱", "Size" : "大小", @@ -62,7 +48,7 @@ OC.L10N.register( "_%n file_::_%n files_" : ["%n 個檔案"], "{dirs} and {files}" : "{dirs} 和 {files}", "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案", - "_Uploading %n file_::_Uploading %n files_" : ["%n 個檔案正在上傳"], + "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], "New" : "新增", "\"{name}\" is an invalid file name." : "{name} 是無效的檔名", "File name cannot be empty." : "檔名不能為空", @@ -75,8 +61,6 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n 位元組"], "Favorited" : "已加入最愛", "Favorite" : "我的最愛", - "Text file" : "文字檔", - "New text file.txt" : "新文字檔.txt", "Folder" : "資料夾", "New folder" : "新資料夾", "{newname} already exists" : "{newname} 已經存在", @@ -94,20 +78,16 @@ OC.L10N.register( "%2$s changed %1$s" : "%2$s 已變更了 %1$s", "You deleted %1$s" : "您刪除了 %1$s", "%2$s deleted %1$s" : "%2$s 已刪除 %1$s", - "You restored %1$s" : "您恢復了 %1$s", - "%2$s restored %1$s" : "%2$s 已恢復了 %1$s", + "You restored %1$s" : "您還原了 %1$s", + "%2$s restored %1$s" : "%2$s 還原了 %1$s", "Changed by %2$s" : "由 %2$s 改動", "Deleted by %2$s" : "由 %2$s 刪除", - "Restored by %2$s" : "由 %2$s 復原", - "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名", - "%s could not be renamed" : "無法重新命名 %s", + "Restored by %2$s" : "由 %2$s 還原", "Upload (max. %s)" : "上傳(至多 %s)", "File handling" : "檔案處理", "Maximum upload size" : "上傳限制", "max. possible: " : "最大允許:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "如果使用 PHP-FPM ,此設定值需要5分鐘左右才會生效", "Save" : "儲存", - "Can not be edited from here due to insufficient permissions." : "無法在這邊編輯,因為權限不足", "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "使用這個地址來透過 WebDAV 存取檔案", @@ -117,10 +97,12 @@ OC.L10N.register( "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." : "您試圖上傳的檔案大小超過伺服器的限制。", - "Files are being scanned, please wait." : "正在掃描檔案,請稍等。", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制", + "Files are being scanned, please wait." : "正在掃描檔案,請稍等", "Currently scanning" : "正在掃描", "No favorites" : "沒有最愛", - "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡" + "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡", + "Text file" : "文字檔", + "New text file.txt" : "新文字檔.txt" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index b82dbfb1ff..6f2c396ad1 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -2,13 +2,6 @@ "Storage not available" : "無法存取儲存空間", "Storage invalid" : "無效的儲存空間", "Unknown error" : "未知的錯誤", - "Could not move %s - File with this name already exists" : "無法移動 %s ,同名的檔案已經存在", - "Could not move %s" : "無法移動 %s", - "Permission denied" : "存取被拒", - "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除。", - "The name %s is already used in the folder %s. Please choose a different name." : "%s 已經被使用於資料夾 %s ,請換一個名字", - "Error when creating the file" : "建立檔案失敗", - "Error when creating the folder" : "建立資料夾失敗", "Unable to set upload directory." : "無法設定上傳目錄", "Invalid Token" : "無效的 token", "No file was uploaded. Unknown error" : "沒有檔案被上傳,原因未知", @@ -20,6 +13,7 @@ "Missing a temporary folder" : "找不到暫存資料夾", "Failed to write to disk" : "寫入硬碟失敗", "Not enough storage available" : "儲存空間不足", + "The target folder has been moved or deleted." : "目標資料夾已經被搬移或刪除", "Upload failed. Could not find uploaded file" : "上傳失敗,找不到上傳的檔案", "Upload failed. Could not get file info." : "上傳失敗,無法取得檔案資訊", "Invalid directory." : "無效的資料夾", @@ -44,14 +38,6 @@ "Unable to determine date" : "無法確定日期", "This operation is forbidden" : "此動作被禁止", "This directory is unavailable, please check the logs or contact the administrator" : "這個目錄無法存取,請檢查伺服器記錄檔或聯絡管理員", - "Error moving file." : "移動檔案發生錯誤", - "Error moving file" : "移動檔案失敗", - "Error" : "錯誤", - "{new_name} already exists" : "{new_name} 已經存在", - "Could not rename file" : "無法重新命名", - "Could not create file" : "無法建立檔案", - "Could not create folder" : "無法建立資料夾", - "Error deleting file." : "刪除檔案發生錯誤", "No entries in this folder match '{filter}'" : "在此資料夾中沒有項目與 '{filter}' 相符", "Name" : "名稱", "Size" : "大小", @@ -60,7 +46,7 @@ "_%n file_::_%n files_" : ["%n 個檔案"], "{dirs} and {files}" : "{dirs} 和 {files}", "You don’t have permission to upload or create files here" : "您沒有權限在這裡上傳或建立檔案", - "_Uploading %n file_::_Uploading %n files_" : ["%n 個檔案正在上傳"], + "_Uploading %n file_::_Uploading %n files_" : ["正在上傳 %n 個檔案"], "New" : "新增", "\"{name}\" is an invalid file name." : "{name} 是無效的檔名", "File name cannot be empty." : "檔名不能為空", @@ -73,8 +59,6 @@ "_%n byte_::_%n bytes_" : ["%n 位元組"], "Favorited" : "已加入最愛", "Favorite" : "我的最愛", - "Text file" : "文字檔", - "New text file.txt" : "新文字檔.txt", "Folder" : "資料夾", "New folder" : "新資料夾", "{newname} already exists" : "{newname} 已經存在", @@ -92,20 +76,16 @@ "%2$s changed %1$s" : "%2$s 已變更了 %1$s", "You deleted %1$s" : "您刪除了 %1$s", "%2$s deleted %1$s" : "%2$s 已刪除 %1$s", - "You restored %1$s" : "您恢復了 %1$s", - "%2$s restored %1$s" : "%2$s 已恢復了 %1$s", + "You restored %1$s" : "您還原了 %1$s", + "%2$s restored %1$s" : "%2$s 還原了 %1$s", "Changed by %2$s" : "由 %2$s 改動", "Deleted by %2$s" : "由 %2$s 刪除", - "Restored by %2$s" : "由 %2$s 復原", - "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名", - "%s could not be renamed" : "無法重新命名 %s", + "Restored by %2$s" : "由 %2$s 還原", "Upload (max. %s)" : "上傳(至多 %s)", "File handling" : "檔案處理", "Maximum upload size" : "上傳限制", "max. possible: " : "最大允許:", - "With PHP-FPM this value may take up to 5 minutes to take effect after saving." : "如果使用 PHP-FPM ,此設定值需要5分鐘左右才會生效", "Save" : "儲存", - "Can not be edited from here due to insufficient permissions." : "無法在這邊編輯,因為權限不足", "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to access your Files via WebDAV" : "使用這個地址來透過 WebDAV 存取檔案", @@ -115,10 +95,12 @@ "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." : "您試圖上傳的檔案大小超過伺服器的限制。", - "Files are being scanned, please wait." : "正在掃描檔案,請稍等。", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制", + "Files are being scanned, please wait." : "正在掃描檔案,請稍等", "Currently scanning" : "正在掃描", "No favorites" : "沒有最愛", - "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡" + "Files and folders you mark as favorite will show up here" : "您標記為最愛的檔案與資料夾將會顯示在這裡", + "Text file" : "文字檔", + "New text file.txt" : "新文字檔.txt" },"pluralForm" :"nplurals=1; plural=0;" } \ No newline at end of file diff --git a/apps/files/lib/activity.php b/apps/files/lib/activity.php index f3bbff4864..a941572ed1 100644 --- a/apps/files/lib/activity.php +++ b/apps/files/lib/activity.php @@ -22,7 +22,8 @@ namespace OCA\Files; -use OC\L10N\Factory; +use OCP\IDBConnection; +use OCP\L10N\IFactory; use OCP\Activity\IExtension; use OCP\Activity\IManager; use OCP\IConfig; @@ -43,7 +44,7 @@ class Activity implements IExtension { /** @var IL10N */ protected $l; - /** @var Factory */ + /** @var IFactory */ protected $languageFactory; /** @var IURLGenerator */ @@ -52,6 +53,9 @@ class Activity implements IExtension { /** @var \OCP\Activity\IManager */ protected $activityManager; + /** @var \OCP\IDBConnection */ + protected $connection; + /** @var \OCP\IConfig */ protected $config; @@ -59,18 +63,20 @@ class Activity implements IExtension { protected $helper; /** - * @param Factory $languageFactory + * @param IFactory $languageFactory * @param IURLGenerator $URLGenerator * @param IManager $activityManager * @param ActivityHelper $helper + * @param IDBConnection $connection * @param IConfig $config */ - public function __construct(Factory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager, ActivityHelper $helper, IConfig $config) { + public function __construct(IFactory $languageFactory, IURLGenerator $URLGenerator, IManager $activityManager, ActivityHelper $helper, IDBConnection $connection, IConfig $config) { $this->languageFactory = $languageFactory; $this->URLGenerator = $URLGenerator; $this->l = $this->getL10N(); $this->activityManager = $activityManager; $this->helper = $helper; + $this->connection = $connection; $this->config = $config; } @@ -160,7 +166,7 @@ class Activity implements IExtension { * @param string $text * @param IL10N $l * @param array $params - * @return bool|string + * @return string|false */ protected function translateLong($text, IL10N $l, array $params) { switch ($text) { @@ -192,7 +198,7 @@ class Activity implements IExtension { * @param string $text * @param IL10N $l * @param array $params - * @return bool|string + * @return string|false */ protected function translateShort($text, IL10N $l, array $params) { switch ($text) { @@ -379,6 +385,7 @@ class Activity implements IExtension { */ $parameters = $fileQueryList = []; $parameters[] = self::APP_FILES; + $parameters[] = self::APP_FILES; $fileQueryList[] = '(`type` <> ? AND `type` <> ?)'; $parameters[] = self::TYPE_SHARE_CREATED; @@ -390,13 +397,15 @@ class Activity implements IExtension { } foreach ($favorites['folders'] as $favorite) { $fileQueryList[] = '`file` LIKE ?'; - $parameters[] = $favorite . '/%'; + $parameters[] = $this->connection->escapeLikeParameter($favorite) . '/%'; } - $parameters[] = self::APP_FILES; - return [ - ' CASE WHEN `app` = ? THEN (' . implode(' OR ', $fileQueryList) . ') ELSE `app` <> ? END ', + ' CASE ' + . 'WHEN `app` <> ? THEN 1 ' + . 'WHEN `app` = ? AND (' . implode(' OR ', $fileQueryList) . ') THEN 1 ' + . 'ELSE 0 ' + . 'END = 1 ', $parameters, ]; } diff --git a/apps/files/lib/app.php b/apps/files/lib/app.php index 5bd8c12758..18813e224d 100644 --- a/apps/files/lib/app.php +++ b/apps/files/lib/app.php @@ -28,108 +28,22 @@ namespace OCA\Files; class App { - /** - * @var \OC_L10N - */ - private $l10n; - /** * @var \OCP\INavigationManager */ private static $navigationManager; - /** - * @var \OC\Files\View - */ - private $view; - - public function __construct($view, $l10n) { - $this->view = $view; - $this->l10n = $l10n; - } - /** * Returns the app's navigation manager * * @return \OCP\INavigationManager */ public static function getNavigationManager() { + // TODO: move this into a service in the Application class if (self::$navigationManager === null) { self::$navigationManager = new \OC\NavigationManager(); } return self::$navigationManager; } - /** - * rename a file - * - * @param string $dir - * @param string $oldname - * @param string $newname - * @return array - */ - public function rename($dir, $oldname, $newname) { - $result = array( - 'success' => false, - 'data' => NULL - ); - - try { - // check if the new name is conform to file name restrictions - $this->view->verifyPath($dir, $newname); - } catch (\OCP\Files\InvalidPathException $ex) { - $result['data'] = array( - 'message' => $this->l10n->t($ex->getMessage()), - 'code' => 'invalidname', - ); - return $result; - } - - $normalizedOldPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $oldname); - $normalizedNewPath = \OC\Files\Filesystem::normalizePath($dir . '/' . $newname); - - // rename to non-existing folder is denied - if (!$this->view->file_exists($normalizedOldPath)) { - $result['data'] = array( - 'message' => $this->l10n->t('%s could not be renamed as it has been deleted', array($oldname)), - 'code' => 'sourcenotfound', - 'oldname' => $oldname, - 'newname' => $newname, - ); - }else if (!$this->view->file_exists($dir)) { - $result['data'] = array('message' => (string)$this->l10n->t( - 'The target folder has been moved or deleted.', - array($dir)), - 'code' => 'targetnotfound' - ); - // rename to existing file is denied - } else if ($this->view->file_exists($normalizedNewPath)) { - - $result['data'] = array( - 'message' => $this->l10n->t( - "The name %s is already used in the folder %s. Please choose a different name.", - array($newname, $dir)) - ); - } else if ( - // rename to "." is denied - $newname !== '.' and - // THEN try to rename - $this->view->rename($normalizedOldPath, $normalizedNewPath) - ) { - // successful rename - $meta = $this->view->getFileInfo($normalizedNewPath); - $meta = \OCA\Files\Helper::populateTags(array($meta)); - $fileInfo = \OCA\Files\Helper::formatFileInfo(current($meta)); - $fileInfo['path'] = dirname($normalizedNewPath); - $result['success'] = true; - $result['data'] = $fileInfo; - } else { - // rename failed - $result['data'] = array( - 'message' => $this->l10n->t('%s could not be renamed', array($oldname)) - ); - } - return $result; - } - } diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index fb14cea731..9a4e8d5978 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -139,9 +139,6 @@ class Helper { $entry['parentId'] = $i['parent']; $entry['mtime'] = $i['mtime'] * 1000; // only pick out the needed attributes - if (\OC::$server->getPreviewManager()->isAvailable($i)) { - $entry['isPreviewAvailable'] = true; - } $entry['name'] = $i->getName(); $entry['permissions'] = $i['permissions']; $entry['mimetype'] = $i['mimetype']; diff --git a/apps/files/service/tagservice.php b/apps/files/service/tagservice.php index 1999d97e1a..cf3f2bb786 100644 --- a/apps/files/service/tagservice.php +++ b/apps/files/service/tagservice.php @@ -91,7 +91,7 @@ class TagService { /** * Get all files for the given tag * - * @param array $tagName tag name to filter by + * @param string $tagName tag name to filter by * @return FileInfo[] list of matching files * @throws \Exception if the tag does not exist */ diff --git a/apps/files/templates/admin.php b/apps/files/templates/admin.php index 822fc779bd..e5a6ecfc96 100644 --- a/apps/files/templates/admin.php +++ b/apps/files/templates/admin.php @@ -7,14 +7,12 @@ (t('max. possible: ')); p($_['maxPossibleUploadSize']) ?>) -
    - t('With PHP-FPM this value may take up to 5 minutes to take effect after saving.')); ?> -
    +

    t('With PHP-FPM it might take 5 minutes for changes to be applied.')); ?>

    - t('Can not be edited from here due to insufficient permissions.')); ?> +

    t('Missing permissions to edit from here.')); ?>

    diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php index 512300e3a5..d05a02ee7d 100644 --- a/apps/files/templates/appnavigation.php +++ b/apps/files/templates/appnavigation.php @@ -16,9 +16,7 @@
    -

    - -

    + t('Use this address to access your Files via WebDAV', array(link_to_docs('user-webdav'))));?>
    diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php index 7ebf80ee8b..04550f945b 100644 --- a/apps/files/templates/list.php +++ b/apps/files/templates/list.php @@ -1,16 +1,5 @@