diff options
321 files changed, 5411 insertions, 778 deletions
diff --git a/apps/dav/appinfo/database.xml b/apps/dav/appinfo/database.xml index 0efd2a46d61..b3a69de070c 100644 --- a/apps/dav/appinfo/database.xml +++ b/apps/dav/appinfo/database.xml @@ -671,6 +671,78 @@ CREATE TABLE calendarobjects ( </table> <table> + <name>*dbprefix*calendarobjects_props</name> + <declaration> + <field> + <name>id</name> + <type>integer</type> + <default>0</default> + <notnull>true</notnull> + <autoincrement>1</autoincrement> + <unsigned>true</unsigned> + <length>11</length> + </field> + <field> + <name>calendarid</name> + <type>integer</type> + <default></default> + <notnull>true</notnull> + <length>11</length> + </field> + <field> + <name>objectid</name> + <type>integer</type> + <default></default> + <notnull>true</notnull> + <unsigned>true</unsigned> + <length>11</length> + </field> + <field> + <name>name</name> + <type>text</type> + <default></default> + <notnull>false</notnull> + <length>64</length> + </field> + <field> + <name>parameter</name> + <type>text</type> + <default></default> + <notnull>false</notnull> + <length>64</length> + </field> + <field> + <name>value</name> + <type>text</type> + <default></default> + <notnull>false</notnull> + <length>255</length> + </field> + <index> + <name>calendarobject_index</name> + <field> + <name>objectid</name> + <sorting>ascending</sorting> + </field> + </index> + <index> + <name>calendarobject_name_index</name> + <field> + <name>name</name> + <sorting>ascending</sorting> + </field> + </index> + <index> + <name>calendarobject_value_index</name> + <field> + <name>value</name> + <sorting>ascending</sorting> + </field> + </index> + </declaration> + </table> + + <table> <name>*dbprefix*dav_shares</name> <declaration> <field> diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 0902c487247..2d9f73b3f43 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -5,7 +5,7 @@ <description>WebDAV endpoint</description> <licence>AGPL</licence> <author>owncloud.org</author> - <version>1.2.0</version> + <version>1.3.0</version> <default_enable/> <types> <filesystem/> @@ -24,6 +24,7 @@ <post-migration> <step>OCA\DAV\Migration\FixBirthdayCalendarComponent</step> <step>OCA\DAV\Migration\CalDAVRemoveEmptyValue</step> + <step>OCA\DAV\Migration\BuildCalendarSearchIndex</step> </post-migration> </repair-steps> <commands> diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index a4fed4f1982..fcf73cb0f31 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -1,11 +1,13 @@ <?php /** * @copyright Copyright (c) 2016, ownCloud, Inc. + * @copyright Copyright (c) 2017 Georg Ehrke * * @author Joas Schilling <coding@schilljs.com> * @author Stefan Weil <sw@weilnetz.de> * @author Thomas Citharel <tcit@tcit.fr> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Georg Ehrke <oc.list@georgehrke.com> * * @license AGPL-3.0 * @@ -44,6 +46,7 @@ use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\NotFound; use Sabre\DAV\PropPatch; use Sabre\HTTP\URLUtil; +use Sabre\VObject\Component\VCalendar; use Sabre\VObject\DateTimeParser; use Sabre\VObject\Reader; use Sabre\VObject\Recur\EventIterator; @@ -108,6 +111,17 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription '{http://calendarserver.org/ns/}subscribed-strip-attachments' => 'stripattachments', ]; + /** @var array properties to index */ + public static $indexProperties = ['CATEGORIES', 'COMMENT', 'DESCRIPTION', + 'LOCATION', 'RESOURCES', 'STATUS', 'SUMMARY', 'ATTENDEE', 'CONTACT', + 'ORGANIZER']; + + /** @var array parameters to index */ + public static $indexParameters = [ + 'ATTENDEE' => ['CN'], + 'ORGANIZER' => ['CN'], + ]; + /** * @var string[] Map of uid => display name */ @@ -134,6 +148,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription /** @var bool */ private $legacyEndpoint; + /** @var string */ + private $dbObjectPropertiesTable = 'calendarobjects_props'; + /** * CalDavBackend constructor. * @@ -746,6 +763,11 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription $stmt->execute([$calendarId]); $this->sharingBackend->deleteAllShares($calendarId); + + $query = $this->db->getQueryBuilder(); + $query->delete($this->dbObjectPropertiesTable) + ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) + ->execute(); } /** @@ -940,6 +962,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription ]) ->execute(); + $this->updateProperties($calendarId, $objectUri, $calendarData); + $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', new GenericEvent( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject', [ @@ -990,6 +1014,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) ->execute(); + $this->updateProperties($calendarId, $objectUri, $calendarData); + $data = $this->getCalendarObject($calendarId, $objectUri); if (is_array($data)) { $this->dispatcher->dispatch('\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject', new GenericEvent( @@ -1050,6 +1076,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription $stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?'); $stmt->execute([$calendarId, $objectUri]); + $this->purgeProperties($calendarId, $data['id']); + $this->addChange($calendarId, $objectUri, 3); } @@ -1168,6 +1196,125 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription } /** + * custom Nextcloud search extension for CalDAV + * + * @param string $principalUri + * @param array $filters + * @param integer|null $limit + * @param integer|null $offset + * @return array + */ + public function calendarSearch($principalUri, array $filters, $limit=null, $offset=null) { + $calendars = $this->getCalendarsForUser($principalUri); + $ownCalendars = []; + $sharedCalendars = []; + + $uriMapper = []; + + foreach($calendars as $calendar) { + if ($calendar['{http://owncloud.org/ns}owner-principal'] === $principalUri) { + $ownCalendars[] = $calendar['id']; + } else { + $sharedCalendars[] = $calendar['id']; + } + $uriMapper[$calendar['id']] = $calendar['uri']; + } + if (count($ownCalendars) === 0 && count($sharedCalendars) === 0) { + return []; + } + + $query = $this->db->getQueryBuilder(); + // Calendar id expressions + $calendarExpressions = []; + foreach($ownCalendars as $id) { + $calendarExpressions[] = $query->expr() + ->eq('c.calendarid', $query->createNamedParameter($id)); + } + foreach($sharedCalendars as $id) { + $calendarExpressions[] = $query->expr()->andX( + $query->expr()->eq('c.calendarid', + $query->createNamedParameter($id)), + $query->expr()->eq('c.classification', + $query->createNamedParameter(self::CLASSIFICATION_PUBLIC)) + ); + } + + if (count($calendarExpressions) === 1) { + $calExpr = $calendarExpressions[0]; + } else { + $calExpr = call_user_func_array([$query->expr(), 'orX'], $calendarExpressions); + } + + // Component expressions + $compExpressions = []; + foreach($filters['comps'] as $comp) { + $compExpressions[] = $query->expr() + ->eq('c.componenttype', $query->createNamedParameter($comp)); + } + + if (count($compExpressions) === 1) { + $compExpr = $compExpressions[0]; + } else { + $compExpr = call_user_func_array([$query->expr(), 'orX'], $compExpressions); + } + + if (!isset($filters['props'])) { + $filters['props'] = []; + } + if (!isset($filters['params'])) { + $filters['params'] = []; + } + + $propParamExpressions = []; + foreach($filters['props'] as $prop) { + $propParamExpressions[] = $query->expr()->andX( + $query->expr()->eq('i.name', $query->createNamedParameter($prop)), + $query->expr()->isNull('i.parameter') + ); + } + foreach($filters['params'] as $param) { + $propParamExpressions[] = $query->expr()->andX( + $query->expr()->eq('i.name', $query->createNamedParameter($param['property'])), + $query->expr()->eq('i.parameter', $query->createNamedParameter($param['parameter'])) + ); + } + + if (count($propParamExpressions) === 1) { + $propParamExpr = $propParamExpressions[0]; + } else { + $propParamExpr = call_user_func_array([$query->expr(), 'orX'], $propParamExpressions); + } + + $query->select(['c.calendarid', 'c.uri']) + ->from($this->dbObjectPropertiesTable, 'i') + ->join('i', 'calendarobjects', 'c', $query->expr()->eq('i.objectid', 'c.id')) + ->where($calExpr) + ->andWhere($compExpr) + ->andWhere($propParamExpr) + ->andWhere($query->expr()->iLike('i.value', + $query->createNamedParameter('%'.$this->db->escapeLikeParameter($filters['search-term']).'%'))); + + if ($offset) { + $query->setFirstResult($offset); + } + if ($limit) { + $query->setMaxResults($limit); + } + + $stmt = $query->execute(); + + $result = []; + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + $path = $uriMapper[$row['calendarid']] . '/' . $row['uri']; + if (!in_array($path, $result)) { + $result[] = $path; + } + } + + return $result; + } + + /** * Searches through all of a users calendars and calendar objects to find * an object with a specific UID. * @@ -1820,6 +1967,130 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription return $this->sharingBackend->applyShareAcl($resourceId, $acl); } + + + /** + * update properties table + * + * @param int $calendarId + * @param string $objectUri + * @param string $calendarData + */ + public function updateProperties($calendarId, $objectUri, $calendarData) { + $objectId = $this->getCalendarObjectId($calendarId, $objectUri); + + try { + $vCalendar = $this->readCalendarData($calendarData); + } catch (\Exception $ex) { + return; + } + + $this->purgeProperties($calendarId, $objectId); + + $query = $this->db->getQueryBuilder(); + $query->insert($this->dbObjectPropertiesTable) + ->values( + [ + 'calendarid' => $query->createNamedParameter($calendarId), + 'objectid' => $query->createNamedParameter($objectId), + 'name' => $query->createParameter('name'), + 'parameter' => $query->createParameter('parameter'), + 'value' => $query->createParameter('value'), + ] + ); + + $indexComponents = ['VEVENT', 'VJOURNAL', 'VTODO']; + foreach ($vCalendar->getComponents() as $component) { + if (!in_array($component->name, $indexComponents)) { + continue; + } + + foreach ($component->children() as $property) { + if (in_array($property->name, self::$indexProperties)) { + $value = $property->getValue(); + // is this a shitty db? + if ($this->db->supports4ByteText()) { + $value = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value); + } + $value = substr($value, 0, 254); + + $query->setParameter('name', $property->name); + $query->setParameter('parameter', null); + $query->setParameter('value', $value); + $query->execute(); + } + + if (in_array($property->name, array_keys(self::$indexParameters))) { + $parameters = $property->parameters(); + $indexedParametersForProperty = self::$indexParameters[$property->name]; + + foreach ($parameters as $key => $value) { + if (in_array($key, $indexedParametersForProperty)) { + // is this a shitty db? + if ($this->db->supports4ByteText()) { + $value = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value); + } + $value = substr($value, 0, 254); + + $query->setParameter('name', $property->name); + $query->setParameter('parameter', substr($key, 0, 254)); + $query->setParameter('value', substr($value, 0, 254)); + $query->execute(); + } + } + } + } + } + } + + /** + * read VCalendar data into a VCalendar object + * + * @param string $objectData + * @return VCalendar + */ + protected function readCalendarData($objectData) { + return Reader::read($objectData); + } + + /** + * delete all properties from a given calendar object + * + * @param int $calendarId + * @param int $objectId + */ + protected function purgeProperties($calendarId, $objectId) { + $query = $this->db->getQueryBuilder(); + $query->delete($this->dbObjectPropertiesTable) + ->where($query->expr()->eq('objectid', $query->createNamedParameter($objectId))) + ->andWhere($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))); + $query->execute(); + } + + /** + * get ID from a given calendar object + * + * @param int $calendarId + * @param string $uri + * @return int + */ + protected function getCalendarObjectId($calendarId, $uri) { + $query = $this->db->getQueryBuilder(); + $query->select('id')->from('calendarobjects') + ->where($query->expr()->eq('uri', $query->createNamedParameter($uri))) + ->andWhere($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))); + + $result = $query->execute(); + $objectIds = $result->fetch(); + $result->closeCursor(); + + if (!isset($objectIds['id'])) { + throw new \InvalidArgumentException('Calendarobject does not exists: ' . $uri); + } + + return (int)$objectIds['id']; + } + private function convertPrincipal($principalUri, $toV2) { if ($this->principalBackend->getPrincipalPrefix() === 'principals') { list(, $name) = URLUtil::splitPath($principalUri); diff --git a/apps/dav/lib/CalDAV/CalendarHome.php b/apps/dav/lib/CalDAV/CalendarHome.php index 7320754e6df..2aa2c9caa36 100644 --- a/apps/dav/lib/CalDAV/CalendarHome.php +++ b/apps/dav/lib/CalDAV/CalendarHome.php @@ -111,4 +111,14 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome { throw new NotFound('Node with name \'' . $name . '\' could not be found'); } + + /** + * @param array $filters + * @param integer|null $limit + * @param integer|null $offset + */ + function calendarSearch(array $filters, $limit=null, $offset=null) { + $principalUri = $this->principalInfo['uri']; + return $this->caldavBackend->calendarSearch($principalUri, $filters, $limit, $offset); + } } diff --git a/apps/dav/lib/CalDAV/Search/SearchPlugin.php b/apps/dav/lib/CalDAV/Search/SearchPlugin.php new file mode 100644 index 00000000000..d658a50437d --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/SearchPlugin.php @@ -0,0 +1,159 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search; + +use Sabre\DAV\Server; +use Sabre\DAV\ServerPlugin; +use OCA\DAV\CalDAV\CalendarHome; + +class SearchPlugin extends ServerPlugin { + const NS_Nextcloud = 'http://nextcloud.com/ns'; + + /** + * 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[] + */ + public function getFeatures() { + // May have to be changed to be detected + return ['nc-calendar-search']; + } + + /** + * Returns a plugin name. + * + * Using this name other plugins will be able to access other plugins + * using Sabre\DAV\Server::getPlugin + * + * @return string + */ + public function getPluginName() { + return 'nc-calendar-search'; + } + + /** + * 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 + */ + public function initialize(Server $server) { + $this->server = $server; + + $server->on('report', [$this, 'report']); + + $server->xml->elementMap['{' . self::NS_Nextcloud . '}calendar-search'] = + 'OCA\\DAV\\CalDAV\\Search\\Xml\\Request\\CalendarSearchReport'; + } + + /** + * This functions handles REPORT requests specific to CalDAV + * + * @param string $reportName + * @param mixed $report + * @param mixed $path + * @return bool + */ + public function report($reportName, $report, $path) { + switch ($reportName) { + case '{' . self::NS_Nextcloud . '}calendar-search': + $this->server->transactionType = 'report-nc-calendar-search'; + $this->calendarSearch($report); + return false; + } + } + + /** + * Returns a list of reports this plugin supports. + * + * This will be used in the {DAV:}supported-report-set property. + * Note that you still need to subscribe to the 'report' event to actually + * implement them + * + * @param string $uri + * @return array + */ + public function getSupportedReportSet($uri) { + $node = $this->server->tree->getNodeForPath($uri); + + $reports = []; + if ($node instanceof CalendarHome) { + $reports[] = '{' . self::NS_Nextcloud . '}calendar-search'; + } + + return $reports; + } + + /** + * This function handles the calendar-query REPORT + * + * This report is used by clients to request calendar objects based on + * complex conditions. + * + * @param Xml\Request\CalendarSearchReport $report + * @return void + */ + private function calendarSearch($report) { + $node = $this->server->tree->getNodeForPath($this->server->getRequestUri()); + $depth = $this->server->getHTTPDepth(2); + + // The default result is an empty array + $result = []; + + // If we're dealing with the calendar home, the calendar home itself is + // responsible for the calendar-query + if ($node instanceof CalendarHome && $depth == 2) { + + $nodePaths = $node->calendarSearch($report->filters, $report->limit, $report->offset); + + foreach ($nodePaths as $path) { + list($properties) = $this->server->getPropertiesForPath( + $this->server->getRequestUri() . '/' . $path, + $report->properties); + $result[] = $properties; + } + } + + $prefer = $this->server->getHTTPPrefer(); + + $this->server->httpResponse->setStatus(207); + $this->server->httpResponse->setHeader('Content-Type', + 'application/xml; charset=utf-8'); + $this->server->httpResponse->setHeader('Vary', 'Brief,Prefer'); + $this->server->httpResponse->setBody( + $this->server->generateMultiStatus($result, + $prefer['return'] === 'minimal')); + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/CompFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/CompFilter.php new file mode 100644 index 00000000000..a2a3c910f05 --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/CompFilter.php @@ -0,0 +1,47 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class CompFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return string + */ + static function xmlDeserialize(Reader $reader) { + $att = $reader->parseAttributes(); + $componentName = $att['name']; + + $reader->parseInnerTree(); + + if (!is_string($componentName)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}comp-filter requires a valid name attribute'); + } + + return $componentName; + } +} diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/LimitFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/LimitFilter.php new file mode 100644 index 00000000000..f5de78b539c --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/LimitFilter.php @@ -0,0 +1,43 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class LimitFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return int + */ + static function xmlDeserialize(Reader $reader) { + $value = $reader->parseInnerTree(); + if (!is_int($value) && !is_string($value)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}limit has illegal value'); + } + + return intval($value); + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/OffsetFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/OffsetFilter.php new file mode 100644 index 00000000000..7257e1e72f9 --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/OffsetFilter.php @@ -0,0 +1,43 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class OffsetFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return int + */ + static function xmlDeserialize(Reader $reader) { + $value = $reader->parseInnerTree(); + if (!is_int($value) && !is_string($value)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}offset has illegal value'); + } + + return intval($value); + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/ParamFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/ParamFilter.php new file mode 100644 index 00000000000..1c443763daf --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/ParamFilter.php @@ -0,0 +1,55 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class ParamFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return string + */ + static function xmlDeserialize(Reader $reader) { + $att = $reader->parseAttributes(); + $property = $att['property']; + $parameter = $att['name']; + + $reader->parseInnerTree(); + + if (!is_string($property)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}param-filter requires a valid property attribute'); + + } + if (!is_string($parameter)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}param-filter requires a valid parameter attribute'); + } + + return [ + 'property' => $property, + 'parameter' => $parameter, + ]; + } +} diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/PropFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/PropFilter.php new file mode 100644 index 00000000000..06b41d91c6e --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/PropFilter.php @@ -0,0 +1,47 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class PropFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return string + */ + static function xmlDeserialize(Reader $reader) { + $att = $reader->parseAttributes(); + $componentName = $att['name']; + + $reader->parseInnerTree(); + + if (!is_string($componentName)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}prop-filter requires a valid name attribute'); + } + + return $componentName; + } +} diff --git a/apps/dav/lib/CalDAV/Search/Xml/Filter/SearchTermFilter.php b/apps/dav/lib/CalDAV/Search/Xml/Filter/SearchTermFilter.php new file mode 100644 index 00000000000..8779e2b3940 --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Filter/SearchTermFilter.php @@ -0,0 +1,43 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Filter; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +class SearchTermFilter implements XmlDeserializable { + + /** + * @param Reader $reader + * @throws BadRequest + * @return string + */ + static function xmlDeserialize(Reader $reader) { + $value = $reader->parseInnerTree(); + if (!is_string($value)) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}search-term has illegal value'); + } + + return $value; + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php b/apps/dav/lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php new file mode 100644 index 00000000000..4d22f310c24 --- /dev/null +++ b/apps/dav/lib/CalDAV/Search/Xml/Request/CalendarSearchReport.php @@ -0,0 +1,167 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV\Search\Xml\Request; + +use Sabre\DAV\Exception\BadRequest; +use Sabre\Xml\Reader; +use Sabre\Xml\XmlDeserializable; +use OCA\DAV\CalDAV\Search\SearchPlugin; + +/** + * CalendarSearchReport request parser. + * + * This class parses the {urn:ietf:params:xml:ns:caldav}calendar-query + * REPORT, as defined in: + * + * https:// link to standard + */ +class CalendarSearchReport implements XmlDeserializable { + + /** + * An array with requested properties. + * + * @var array + */ + public $properties; + + /** + * List of property/component filters. + * + * @var array + */ + public $filters; + + /** + * @var int + */ + public $limit; + + /** + * @var int + */ + public $offset; + + /** + * The deserialize method is called during xml parsing. + * + * This method is called statically, 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) { + $elems = $reader->parseInnerTree([ + '{http://nextcloud.com/ns}comp-filter' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\CompFilter', + '{http://nextcloud.com/ns}prop-filter' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\PropFilter', + '{http://nextcloud.com/ns}param-filter' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\ParamFilter', + '{http://nextcloud.com/ns}search-term' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\SearchTermFilter', + '{http://nextcloud.com/ns}limit' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\LimitFilter', + '{http://nextcloud.com/ns}offset' => 'OCA\\DAV\\CalDAV\\Search\\Xml\\Filter\\OffsetFilter', + '{DAV:}prop' => 'Sabre\\Xml\\Element\\KeyValue', + ]); + + $newProps = [ + 'filters' => [], + 'properties' => [], + 'limit' => null, + 'offset' => null + ]; + + if (!is_array($elems)) { + $elems = []; + } + + foreach ($elems as $elem) { + switch ($elem['name']) { + case '{DAV:}prop': + $newProps['properties'] = array_keys($elem['value']); + break; + case '{' . SearchPlugin::NS_Nextcloud . '}filter': + foreach ($elem['value'] as $subElem) { + if ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}comp-filter') { + if (!isset($newProps['filters']['comps']) || !is_array($newProps['filters']['comps'])) { + $newProps['filters']['comps'] = []; + } + $newProps['filters']['comps'][] = $subElem['value']; + } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}prop-filter') { + if (!isset($newProps['filters']['props']) || !is_array($newProps['filters']['props'])) { + $newProps['filters']['props'] = []; + } + $newProps['filters']['props'][] = $subElem['value']; + } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}param-filter') { + if (!isset($newProps['filters']['params']) || !is_array($newProps['filters']['params'])) { + $newProps['filters']['params'] = []; + } + $newProps['filters']['params'][] = $subElem['value']; + } elseif ($subElem['name'] === '{' . SearchPlugin::NS_Nextcloud . '}search-term') { + $newProps['filters']['search-term'] = $subElem['value']; + } + } + break; + case '{' . SearchPlugin::NS_Nextcloud . '}limit': + $newProps['limit'] = $elem['value']; + break; + case '{' . SearchPlugin::NS_Nextcloud . '}offset': + $newProps['offset'] = $elem['value']; + break; + + } + } + + if (empty($newProps['filters'])) { + throw new BadRequest('The {' . SearchPlugin::NS_Nextcloud . '}filter element is required for this request'); + } + + $propsOrParamsDefined = (!empty($newProps['filters']['props']) || !empty($newProps['filters']['params'])); + $noCompsDefined = empty($newProps['filters']['comps']); + if ($propsOrParamsDefined && $noCompsDefined) { + throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter given without any {' . SearchPlugin::NS_Nextcloud . '}comp-filter'); + } + + if (!isset($newProps['filters']['search-term'])) { + throw new BadRequest('{' . SearchPlugin::NS_Nextcloud . '}search-term is required for this request'); + } + + if (empty($newProps['filters']['props']) && empty($newProps['filters']['params'])) { + throw new BadRequest('At least one{' . SearchPlugin::NS_Nextcloud . '}prop-filter or {' . SearchPlugin::NS_Nextcloud . '}param-filter is required for this request'); + } + + + $obj = new self(); + foreach ($newProps as $key => $value) { + $obj->$key = $value; + } + return $obj; + } +} diff --git a/apps/dav/lib/Connector/Sabre/Directory.php b/apps/dav/lib/Connector/Sabre/Directory.php index 25cca40a889..435f47ee561 100644 --- a/apps/dav/lib/Connector/Sabre/Directory.php +++ b/apps/dav/lib/Connector/Sabre/Directory.php @@ -34,12 +34,20 @@ 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\Files\InvalidPathException; +use OCP\Files\StorageNotAvailableException; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use Sabre\DAV\Exception\Locked; +use Sabre\DAV\Exception\ServiceUnavailable; +use Sabre\DAV\INode; +use Sabre\DAV\Exception\BadRequest; +use OC\Files\Mount\MoveableMount; +use Sabre\DAV\IFile; +use Sabre\DAV\Exception\NotFound; class Directory extends \OCA\DAV\Connector\Sabre\Node - implements \Sabre\DAV\ICollection, \Sabre\DAV\IQuota { + implements \Sabre\DAV\ICollection, \Sabre\DAV\IQuota, \Sabre\DAV\IMoveTarget { /** * Cached directory content @@ -113,9 +121,9 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node if (isset($_SERVER['HTTP_OC_CHUNKED'])) { // exit if we can't create a new file and we don't updatable existing file - $info = \OC_FileChunking::decodeName($name); + $chunkInfo = \OC_FileChunking::decodeName($name); if (!$this->fileView->isCreatable($this->path) && - !$this->fileView->isUpdatable($this->path . '/' . $info['name']) + !$this->fileView->isUpdatable($this->path . '/' . $chunkInfo['name']) ) { throw new \Sabre\DAV\Exception\Forbidden(); } @@ -130,14 +138,18 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node $this->fileView->verifyPath($this->path, $name); $path = $this->fileView->getAbsolutePath($this->path) . '/' . $name; - // using a dummy FileInfo is acceptable here since it will be refreshed after the put is complete - $info = new \OC\Files\FileInfo($path, null, null, array(), null); + // in case the file already exists/overwriting + $info = $this->fileView->getFileInfo($this->path . '/' . $name); + if (!$info) { + // use a dummy FileInfo which is acceptable here since it will be refreshed after the put is complete + $info = new \OC\Files\FileInfo($path, null, null, [], null); + } $node = new \OCA\DAV\Connector\Sabre\File($this->fileView, $info); $node->acquireLock(ILockingProvider::LOCK_SHARED); return $node->put($data); } catch (\OCP\Files\StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); - } catch (\OCP\Files\InvalidPathException $ex) { + } catch (InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); } catch (ForbiddenException $ex) { throw new Forbidden($ex->getMessage(), $ex->getRetry()); @@ -168,7 +180,7 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node } } catch (\OCP\Files\StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); - } catch (\OCP\Files\InvalidPathException $ex) { + } catch (InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); } catch (ForbiddenException $ex) { throw new Forbidden($ex->getMessage(), $ex->getRetry()); @@ -188,6 +200,11 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node * @throws \Sabre\DAV\Exception\ServiceUnavailable */ public function getChild($name, $info = null) { + if (!$this->info->isReadable()) { + // avoid detecting files through this way + throw new NotFound(); + } + $path = $this->path . '/' . $name; if (is_null($info)) { try { @@ -195,7 +212,7 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node $info = $this->fileView->getFileInfo($path); } catch (\OCP\Files\StorageNotAvailableException $e) { throw new \Sabre\DAV\Exception\ServiceUnavailable($e->getMessage()); - } catch (\OCP\Files\InvalidPathException $ex) { + } catch (InvalidPathException $ex) { throw new InvalidPath($ex->getMessage()); } catch (ForbiddenException $e) { throw new \Sabre\DAV\Exception\Forbidden(); @@ -221,12 +238,19 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node * Returns an array with all the child nodes * * @return \Sabre\DAV\INode[] + * @throws \Sabre\DAV\Exception\Locked + * @throws \OCA\DAV\Connector\Sabre\Exception\Forbidden */ public function getChildren() { if (!is_null($this->dirContent)) { return $this->dirContent; } try { + if (!$this->info->isReadable()) { + // return 403 instead of 404 because a 404 would make + // the caller believe that the collection itself does not exist + throw new Forbidden('No read permissions'); + } $folderContent = $this->fileView->getDirectoryContent($this->path); } catch (LockedException $e) { throw new Locked(); @@ -311,4 +335,109 @@ class Directory extends \OCA\DAV\Connector\Sabre\Node } } + /** + * Moves a node into this collection. + * + * It is up to the implementors to: + * 1. Create the new resource. + * 2. Remove the old resource. + * 3. Transfer any properties or other data. + * + * Generally you should make very sure that your collection can easily move + * the move. + * + * If you don't, just return false, which will trigger sabre/dav to handle + * the move itself. If you return true from this function, the assumption + * is that the move was successful. + * + * @param string $targetName New local file/collection name. + * @param string $fullSourcePath Full path to source node + * @param INode $sourceNode Source node itself + * @return bool + * @throws BadRequest + * @throws ServiceUnavailable + * @throws Forbidden + * @throws FileLocked + * @throws \Sabre\DAV\Exception\Forbidden + */ + public function moveInto($targetName, $fullSourcePath, INode $sourceNode) { + if (!$sourceNode instanceof Node) { + // it's a file of another kind, like FutureFile + if ($sourceNode instanceof IFile) { + // fallback to default copy+delete handling + return false; + } + throw new BadRequest('Incompatible node types'); + } + + if (!$this->fileView) { + throw new ServiceUnavailable('filesystem not setup'); + } + + $destinationPath = $this->getPath() . '/' . $targetName; + + + $targetNodeExists = $this->childExists($targetName); + + // at getNodeForPath we also check the path for isForbiddenFileOrDir + // with that we have covered both source and destination + if ($sourceNode instanceof Directory && $targetNodeExists) { + throw new \Sabre\DAV\Exception\Forbidden('Could not copy directory ' . $sourceNode->getName() . ', target exists'); + } + + list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($sourceNode->getPath()); + $destinationDir = $this->getPath(); + + $sourcePath = $sourceNode->getPath(); + + $isMovableMount = false; + $sourceMount = \OC::$server->getMountManager()->find($this->fileView->getAbsolutePath($sourcePath)); + $internalPath = $sourceMount->getInternalPath($this->fileView->getAbsolutePath($sourcePath)); + if ($sourceMount instanceof MoveableMount && $internalPath === '') { + $isMovableMount = true; + } + + try { + $sameFolder = ($sourceDir === $destinationDir); + // if we're overwriting or same folder + if ($targetNodeExists || $sameFolder) { + // note that renaming a share mount point is always allowed + if (!$this->fileView->isUpdatable($destinationDir) && !$isMovableMount) { + throw new \Sabre\DAV\Exception\Forbidden(); + } + } else { + if (!$this->fileView->isCreatable($destinationDir)) { + throw new \Sabre\DAV\Exception\Forbidden(); + } + } + + if (!$sameFolder) { + // moving to a different folder, source will be gone, like a deletion + // note that moving a share mount point is always allowed + if (!$this->fileView->isDeletable($sourcePath) && !$isMovableMount) { + throw new \Sabre\DAV\Exception\Forbidden(); + } + } + + $fileName = basename($destinationPath); + try { + $this->fileView->verifyPath($destinationDir, $fileName); + } catch (InvalidPathException $ex) { + throw new InvalidPath($ex->getMessage()); + } + + $renameOkay = $this->fileView->rename($sourcePath, $destinationPath); + if (!$renameOkay) { + throw new \Sabre\DAV\Exception\Forbidden(''); + } + } catch (StorageNotAvailableException $e) { + throw new ServiceUnavailable($e->getMessage()); + } catch (ForbiddenException $ex) { + throw new Forbidden($ex->getMessage(), $ex->getRetry()); + } catch (LockedException $e) { + throw new FileLocked($e->getMessage(), $e->getCode(), $e); + } + + return true; + } } diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index d0a01ef255b..25c455a1bb7 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -54,6 +54,7 @@ use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\NotImplemented; use Sabre\DAV\Exception\ServiceUnavailable; use Sabre\DAV\IFile; +use Sabre\DAV\Exception\NotFound; class File extends Node implements IFile { @@ -307,6 +308,10 @@ class File extends Node implements IFile { public function get() { //throw exception if encryption is disabled but files are still encrypted try { + if (!$this->info->isReadable()) { + // do a if the file did not exist + throw new NotFound(); + } $res = $this->fileView->fopen(ltrim($this->path, '/'), 'rb'); if ($res === false) { throw new ServiceUnavailable("Could not open file"); diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 1b1f43df9ea..4c426dd1052 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -45,6 +45,7 @@ use \Sabre\HTTP\ResponseInterface; use OCP\Files\StorageNotAvailableException; use OCP\IConfig; use OCP\IRequest; +use OCA\DAV\Upload\FutureFile; class FilesPlugin extends ServerPlugin { @@ -64,6 +65,7 @@ class FilesPlugin extends ServerPlugin { const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums'; const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint'; const HAS_PREVIEW_PROPERTYNAME = '{http://nextcloud.org/ns}has-preview'; + const MOUNT_TYPE_PROPERTYNAME = '{http://nextcloud.org/ns}mount-type'; /** * Reference to main server object @@ -158,6 +160,7 @@ class FilesPlugin extends ServerPlugin { $server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME; $server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME; $server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME; + $server->protectedProperties[] = self::MOUNT_TYPE_PROPERTYNAME; // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH $allowedProperties = ['{DAV:}getetag']; @@ -177,6 +180,7 @@ class FilesPlugin extends ServerPlugin { } }); $this->server->on('beforeMove', [$this, 'checkMove']); + $this->server->on('beforeMove', [$this, 'beforeMoveFutureFile']); } /** @@ -284,6 +288,10 @@ class FilesPlugin extends ServerPlugin { $httpRequest = $this->server->httpRequest; if ($node instanceof \OCA\DAV\Connector\Sabre\Node) { + if (!$node->getFileInfo()->isReadable()) { + // avoid detecting files through this means + throw new NotFound(); + } $propFind->handle(self::FILEID_PROPERTYNAME, function() use ($node) { return $node->getFileId(); @@ -375,6 +383,10 @@ class FilesPlugin extends ServerPlugin { return $node->getSize(); }); } + + $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) { + return $node->getFileInfo()->getMountPoint()->getMountType(); + }); } /** @@ -436,4 +448,43 @@ class FilesPlugin extends ServerPlugin { } } } + + /** + * Move handler for future file. + * + * This overrides the default move behavior to prevent Sabre + * to delete the target file before moving. Because deleting would + * lose the file id and metadata. + * + * @param string $path source path + * @param string $destination destination path + * @return bool|void false to stop handling, void to skip this handler + */ + public function beforeMoveFutureFile($path, $destination) { + $sourceNode = $this->tree->getNodeForPath($path); + if (!$sourceNode instanceof FutureFile) { + // skip handling as the source is not a chunked FutureFile + return; + } + + if (!$this->tree->nodeExists($destination)) { + // skip and let the default handler do its work + return; + } + + // do a move manually, skipping Sabre's default "delete" for existing nodes + $this->tree->move($path, $destination); + + // trigger all default events (copied from CorePlugin::move) + $this->server->emit('afterMove', [$path, $destination]); + $this->server->emit('afterUnbind', [$path]); + $this->server->emit('afterBind', [$destination]); + + $response = $this->server->httpResponse; + $response->setHeader('Content-Length', '0'); + $response->setStatus(204); + + return false; + } + } diff --git a/apps/dav/lib/Connector/Sabre/ObjectTree.php b/apps/dav/lib/Connector/Sabre/ObjectTree.php index 554a7ad86ca..acc6dcc3be3 100644 --- a/apps/dav/lib/Connector/Sabre/ObjectTree.php +++ b/apps/dav/lib/Connector/Sabre/ObjectTree.php @@ -185,104 +185,6 @@ class ObjectTree extends \Sabre\DAV\Tree { } /** - * Moves a file from one location to another - * - * @param string $sourcePath The path to the file which should be moved - * @param string $destinationPath The full destination path, so not just the destination parent node - * @throws FileLocked - * @throws Forbidden - * @throws InvalidPath - * @throws \Sabre\DAV\Exception\Forbidden - * @throws \Sabre\DAV\Exception\Locked - * @throws \Sabre\DAV\Exception\NotFound - * @throws \Sabre\DAV\Exception\ServiceUnavailable - * @return int - */ - public function move($sourcePath, $destinationPath) { - if (!$this->fileView) { - throw new \Sabre\DAV\Exception\ServiceUnavailable('filesystem not setup'); - } - - $infoDestination = $this->fileView->getFileInfo(dirname($destinationPath)); - if (dirname($destinationPath) === dirname($sourcePath)) { - $sourcePermission = $infoDestination && $infoDestination->isUpdateable(); - $destinationPermission = $sourcePermission; - } else { - $infoSource = $this->fileView->getFileInfo($sourcePath); - if ($this->fileView->file_exists($destinationPath)) { - $destinationPermission = $infoDestination && $infoDestination->isUpdateable(); - } else { - $destinationPermission = $infoDestination && $infoDestination->isCreatable(); - } - $sourcePermission = $infoSource && $infoSource->isDeletable(); - } - - if (!$destinationPermission || !$sourcePermission) { - throw new Forbidden('No permissions to move object.'); - } - - $targetNodeExists = $this->nodeExists($destinationPath); - $sourceNode = $this->getNodeForPath($sourcePath); - if ($sourceNode instanceof \Sabre\DAV\ICollection && $targetNodeExists) { - throw new \Sabre\DAV\Exception\Forbidden('Could not copy directory ' . $sourceNode->getName() . ', target exists'); - } - list($sourceDir,) = \Sabre\HTTP\URLUtil::splitPath($sourcePath); - list($destinationDir,) = \Sabre\HTTP\URLUtil::splitPath($destinationPath); - - $isMovableMount = false; - $sourceMount = $this->mountManager->find($this->fileView->getAbsolutePath($sourcePath)); - $internalPath = $sourceMount->getInternalPath($this->fileView->getAbsolutePath($sourcePath)); - if ($sourceMount instanceof MoveableMount && $internalPath === '') { - $isMovableMount = true; - } - - try { - $sameFolder = ($sourceDir === $destinationDir); - // if we're overwriting or same folder - if ($targetNodeExists || $sameFolder) { - // note that renaming a share mount point is always allowed - if (!$this->fileView->isUpdatable($destinationDir) && !$isMovableMount) { - throw new \Sabre\DAV\Exception\Forbidden(); - } - } else { - if (!$this->fileView->isCreatable($destinationDir)) { - throw new \Sabre\DAV\Exception\Forbidden(); - } - } - - if (!$sameFolder) { - // moving to a different folder, source will be gone, like a deletion - // note that moving a share mount point is always allowed - if (!$this->fileView->isDeletable($sourcePath) && !$isMovableMount) { - throw new \Sabre\DAV\Exception\Forbidden(); - } - } - - $fileName = basename($destinationPath); - try { - $this->fileView->verifyPath($destinationDir, $fileName); - } catch (\OCP\Files\InvalidPathException $ex) { - throw new InvalidPath($ex->getMessage()); - } - - $renameOkay = $this->fileView->rename($sourcePath, $destinationPath); - if (!$renameOkay) { - throw new \Sabre\DAV\Exception\Forbidden(''); - } - } 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); - } - - $this->markDirty($sourceDir); - $this->markDirty($destinationDir); - - } - - /** * Copies a file or directory. * * This method must work recursively and delete the destination diff --git a/apps/dav/lib/Migration/BuildCalendarSearchIndex.php b/apps/dav/lib/Migration/BuildCalendarSearchIndex.php new file mode 100644 index 00000000000..da4b4f4fe84 --- /dev/null +++ b/apps/dav/lib/Migration/BuildCalendarSearchIndex.php @@ -0,0 +1,86 @@ +<?php +/** + * @copyright 2017 Georg Ehrke <oc.list@georgehrke.com> + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\DAV\Migration; + +use OCP\BackgroundJob\IJobList; +use OCP\IConfig; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +class BuildCalendarSearchIndex implements IRepairStep { + + /** @var IDBConnection */ + private $db; + + /** @var IJobList */ + private $jobList; + + /** @var IConfig */ + private $config; + + /** + * @param IDBConnection $db + * @param IJobList $jobList + * @param IConfig $config + */ + public function __construct(IDBConnection $db, + IJobList $jobList, + IConfig $config) { + $this->db = $db; + $this->jobList = $jobList; + $this->config = $config; + } + + /** + * @return string + */ + public function getName() { + return 'Registering building of calendar search index as background job'; + } + + /** + * @param IOutput $output + */ + public function run(IOutput $output) { + // only run once + if ($this->config->getAppValue('dav', 'buildCalendarSearchIndex') === 'yes') { + $output->info('Repair step already executed'); + return; + } + + $query = $this->db->getQueryBuilder(); + $query->select($query->createFunction('MAX(id)')) + ->from('calendarobjects'); + $maxId = (int)$query->execute()->fetchColumn(); + + $output->info('Add background job'); + $this->jobList->add(BuildCalendarSearchIndexBackgroundJob::class, [ + 'offset' => 0, + 'stopAt' => $maxId + ]); + + // if all were done, no need to redo the repair during next upgrade + $this->config->setAppValue('dav', 'buildCalendarSearchIndex', 'yes'); + } +}
\ No newline at end of file diff --git a/apps/dav/lib/Migration/BuildCalendarSearchIndexBackgroundJob.php b/apps/dav/lib/Migration/BuildCalendarSearchIndexBackgroundJob.php new file mode 100644 index 00000000000..a4fa2c63e02 --- /dev/null +++ b/apps/dav/lib/Migration/BuildCalendarSearchIndexBackgroundJob.php @@ -0,0 +1,120 @@ +<?php +/** + * @copyright 2017 Georg Ehrke <oc.list@georgehrke.com> + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\DAV\Migration; + +use OC\BackgroundJob\QueuedJob; +use OCA\DAV\CalDAV\CalDavBackend; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; +use OCP\IDBConnection; +use OCP\ILogger; + +class BuildCalendarSearchIndexBackgroundJob extends QueuedJob { + + /** @var IDBConnection */ + private $db; + + /** @var CalDavBackend */ + private $calDavBackend; + + /** @var ILogger */ + private $logger; + + /** @var IJobList */ + private $jobList; + + /** @var ITimeFactory */ + private $timeFactory; + + /** + * @param IDBConnection $db + * @param CalDavBackend $calDavBackend + * @param ILogger $logger + * @param IJobList $jobList + * @param ITimeFactory $timeFactory + */ + public function __construct(IDBConnection $db, + CalDavBackend $calDavBackend, + ILogger $logger, + IJobList $jobList, + ITimeFactory $timeFactory) { + $this->db = $db; + $this->calDavBackend = $calDavBackend; + $this->logger = $logger; + $this->jobList = $jobList; + $this->timeFactory = $timeFactory; + } + + public function run($arguments) { + $offset = $arguments['offset']; + $stopAt = $arguments['stopAt']; + + $this->logger->info('Building calendar index (' . $offset .'/' . $stopAt . ')'); + + $offset = $this->buildIndex($offset, $stopAt); + + if ($offset >= $stopAt) { + $this->logger->info('Building calendar index done'); + } else { + $this->jobList->add(self::class, [ + 'offset' => $offset, + 'stopAt' => $stopAt + ]); + $this->logger->info('New building calendar index job scheduled with offset ' . $offset); + } + } + + /** + * @param int $offset + * @param int $stopAt + * @return int + */ + private function buildIndex($offset, $stopAt) { + $startTime = $this->timeFactory->getTime(); + + $query = $this->db->getQueryBuilder(); + $query->select(['id', 'calendarid', 'uri', 'calendardata']) + ->from('calendarobjects') + ->where($query->expr()->lte('id', $query->createNamedParameter($stopAt))) + ->andWhere($query->expr()->gt('id', $query->createNamedParameter($offset))) + ->orderBy('id', 'ASC'); + + $stmt = $query->execute(); + while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { + $offset = $row['id']; + + $calendarData = $row['calendardata']; + if (is_resource($calendarData)) { + $calendarData = stream_get_contents($calendarData); + } + + $this->calDavBackend->updateProperties($row['calendarid'], $row['uri'], $calendarData); + + if (($this->timeFactory->getTime() - $startTime) > 15) { + return $offset; + } + } + + return $stopAt; + } +} diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index e0517477488..5b0715b0dad 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -216,6 +216,7 @@ class Server { \OC::$server->getCommentsManager(), $userSession )); + $this->server->addPlugin(new \OCA\DAV\CalDAV\Search\SearchPlugin()); if ($view !== null) { $this->server->addPlugin(new FilesReportPlugin( $this->server->tree, diff --git a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php index 5adda30c19d..dc531b5a64a 100644 --- a/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php +++ b/apps/dav/tests/unit/CalDAV/CalDavBackendTest.php @@ -1,10 +1,12 @@ <?php /** * @copyright Copyright (c) 2016, ownCloud, Inc. + * @copyright Copyright (c) 2017 Georg Ehrke * * @author Joas Schilling <coding@schilljs.com> * @author Thomas Citharel <tcit@tcit.fr> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Georg Ehrke <oc.list@georgehrke.com> * * @license AGPL-3.0 * @@ -489,4 +491,134 @@ EOD; 'unknown class -> private' => [CalDavBackend::CLASSIFICATION_PRIVATE, 'classification', "BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//dmfs.org//mimedir.icalendar//EN\r\nBEGIN:VTIMEZONE\r\nTZID:Europe/Berlin\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nDTSTART;TZID=Europe/Berlin:20160419T130000\r\nSUMMARY:Test\r\nCLASS:VERTRAULICH\r\nTRANSP:OPAQUE\r\nSTATUS:CONFIRMED\r\nDTEND;TZID=Europe/Berlin:20160419T140000\r\nLAST-MODIFIED:20160419T074202Z\r\nDTSTAMP:20160419T074202Z\r\nCREATED:20160419T074202Z\r\nUID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310\r\nEND:VEVENT\r\nEND:VCALENDAR"], ]; } + + public function testCalendarSearch() { + $calendarId = $this->createTestCalendar(); + + $uri = static::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); + + $search1 = $this->backend->calendarSearch(self::UNIT_TEST_USER, [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION' + ], + 'search-term' => 'Test', + ]); + $this->assertEquals(count($search1), 1); + + + // 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:123 Event +DTSTART;VALUE=DATE-TIME:20130912T130000Z +DTEND;VALUE=DATE-TIME:20130912T140000Z +ATTENDEE;CN=test:mailto:foo@bar.com +END:VEVENT +END:VCALENDAR +EOD; + $this->backend->updateCalendarObject($calendarId, $uri, $calData); + + $search2 = $this->backend->calendarSearch(self::UNIT_TEST_USER, [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION' + ], + 'search-term' => 'Test', + ]); + $this->assertEquals(count($search2), 0); + + $search3 = $this->backend->calendarSearch(self::UNIT_TEST_USER, [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION' + ], + 'params' => [ + [ + 'property' => 'ATTENDEE', + 'parameter' => 'CN' + ] + ], + 'search-term' => 'Test', + ]); + $this->assertEquals(count($search3), 1); + + // t matches both summary and attendee's CN, but we want unique results + $search4 = $this->backend->calendarSearch(self::UNIT_TEST_USER, [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION' + ], + 'params' => [ + [ + 'property' => 'ATTENDEE', + 'parameter' => 'CN' + ] + ], + 'search-term' => 't', + ]); + $this->assertEquals(count($search4), 1); + + $this->backend->deleteCalendarObject($calendarId, $uri); + + $search5 = $this->backend->calendarSearch(self::UNIT_TEST_USER, [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION' + ], + 'params' => [ + [ + 'property' => 'ATTENDEE', + 'parameter' => 'CN' + ] + ], + 'search-term' => 't', + ]); + $this->assertEquals(count($search5), 0); + } } diff --git a/apps/dav/tests/unit/CalDAV/Search/Request/CalendarSearchReportTest.php b/apps/dav/tests/unit/CalDAV/Search/Request/CalendarSearchReportTest.php new file mode 100644 index 00000000000..20bac8aa9f5 --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/Search/Request/CalendarSearchReportTest.php @@ -0,0 +1,339 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Tests\unit\CalDAV\Search\Xml\Request; + +use OCA\DAV\CalDAV\Search\Xml\Request\CalendarSearchReport; +use Sabre\Xml\Reader; +use Test\TestCase; + +class CalendarSearchReportTest extends TestCase { + + private $elementMap = [ + '{http://nextcloud.com/ns}calendar-search' => + 'OCA\\DAV\\CalDAV\\Search\\Xml\\Request\\CalendarSearchReport', + ]; + + public function testFoo() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:comp-filter name="VTODO" /> + <nc:prop-filter name="SUMMARY" /> + <nc:prop-filter name="LOCATION" /> + <nc:prop-filter name="ATTENDEE" /> + <nc:param-filter property="ATTENDEE" name="CN" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> + <nc:limit>10</nc:limit> + <nc:offset>5</nc:offset> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + + $calendarSearchReport = new CalendarSearchReport(); + $calendarSearchReport->properties = [ + '{DAV:}getetag', + '{urn:ietf:params:xml:ns:caldav}calendar-data', + ]; + $calendarSearchReport->filters = [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'props' => [ + 'SUMMARY', + 'LOCATION', + 'ATTENDEE' + ], + 'params' => [ + [ + 'property' => 'ATTENDEE', + 'parameter' => 'CN' + ] + ], + 'search-term' => 'foo' + ]; + $calendarSearchReport->limit = 10; + $calendarSearchReport->offset = 5; + + $this->assertEquals( + $calendarSearchReport, + $result['value'] + ); + } + + public function testNoLimitOffset() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:prop-filter name="SUMMARY" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + + $calendarSearchReport = new CalendarSearchReport(); + $calendarSearchReport->properties = [ + '{DAV:}getetag', + '{urn:ietf:params:xml:ns:caldav}calendar-data', + ]; + $calendarSearchReport->filters = [ + 'comps' => [ + 'VEVENT', + ], + 'props' => [ + 'SUMMARY', + ], + 'search-term' => 'foo' + ]; + $calendarSearchReport->limit = null; + $calendarSearchReport->offset = null; + + $this->assertEquals( + $calendarSearchReport, + $result['value'] + ); + } + + /** + * @expectedException \Sabre\DAV\Exception\BadRequest + * @expectedExceptionMessage {http://nextcloud.com/ns}prop-filter or {http://nextcloud.com/ns}param-filter given without any {http://nextcloud.com/ns}comp-filter + */ + public function testRequiresCompFilter() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:prop-filter name="SUMMARY" /> + <nc:prop-filter name="LOCATION" /> + <nc:prop-filter name="ATTENDEE" /> + <nc:param-filter property="ATTENDEE" name="CN" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> + <nc:limit>10</nc:limit> + <nc:offset>5</nc:offset> +</nc:calendar-search> +XML; + + $this->parse($xml); + } + + /** + * @expectedException \Sabre\DAV\Exception\BadRequest + * @expectedExceptionMessage The {http://nextcloud.com/ns}filter element is required for this request + */ + public function testRequiresFilter() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> +</nc:calendar-search> +XML; + + $this->parse($xml); + } + + /** + * @expectedException \Sabre\DAV\Exception\BadRequest + * @expectedExceptionMessage {http://nextcloud.com/ns}search-term is required for this request + */ + public function testNoSearchTerm() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:comp-filter name="VTODO" /> + <nc:prop-filter name="SUMMARY" /> + <nc:prop-filter name="LOCATION" /> + <nc:prop-filter name="ATTENDEE" /> + <nc:param-filter property="ATTENDEE" name="CN" /> + </nc:filter> + <nc:limit>10</nc:limit> + <nc:offset>5</nc:offset> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + } + + /** + * @expectedException \Sabre\DAV\Exception\BadRequest + * @expectedExceptionMessage At least one{http://nextcloud.com/ns}prop-filter or {http://nextcloud.com/ns}param-filter is required for this request + */ + public function testCompOnly() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:comp-filter name="VTODO" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + + $calendarSearchReport = new CalendarSearchReport(); + $calendarSearchReport->properties = [ + '{DAV:}getetag', + '{urn:ietf:params:xml:ns:caldav}calendar-data', + ]; + $calendarSearchReport->filters = [ + 'comps' => [ + 'VEVENT', + 'VTODO' + ], + 'search-term' => 'foo' + ]; + $calendarSearchReport->limit = null; + $calendarSearchReport->offset = null; + + $this->assertEquals( + $calendarSearchReport, + $result['value'] + ); + } + + public function testPropOnly() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:prop-filter name="SUMMARY" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + + $calendarSearchReport = new CalendarSearchReport(); + $calendarSearchReport->properties = [ + '{DAV:}getetag', + '{urn:ietf:params:xml:ns:caldav}calendar-data', + ]; + $calendarSearchReport->filters = [ + 'comps' => [ + 'VEVENT', + ], + 'props' => [ + 'SUMMARY', + ], + 'search-term' => 'foo' + ]; + $calendarSearchReport->limit = null; + $calendarSearchReport->offset = null; + + $this->assertEquals( + $calendarSearchReport, + $result['value'] + ); + } + + public function testParamOnly() { + $xml = <<<XML +<?xml version="1.0" encoding="UTF-8"?> +<nc:calendar-search xmlns:nc="http://nextcloud.com/ns" xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:"> + <d:prop> + <d:getetag /> + <c:calendar-data /> + </d:prop> + <nc:filter> + <nc:comp-filter name="VEVENT" /> + <nc:param-filter property="ATTENDEE" name="CN" /> + <nc:search-term>foo</nc:search-term> + </nc:filter> +</nc:calendar-search> +XML; + + $result = $this->parse($xml); + + $calendarSearchReport = new CalendarSearchReport(); + $calendarSearchReport->properties = [ + '{DAV:}getetag', + '{urn:ietf:params:xml:ns:caldav}calendar-data', + ]; + $calendarSearchReport->filters = [ + 'comps' => [ + 'VEVENT', + ], + 'params' => [ + [ + 'property' => 'ATTENDEE', + 'parameter' => 'CN' + ] + ], + 'search-term' => 'foo' + ]; + $calendarSearchReport->limit = null; + $calendarSearchReport->offset = null; + + $this->assertEquals( + $calendarSearchReport, + $result['value'] + ); + } + + private function parse($xml, array $elementMap = []) { + $reader = new Reader(); + $reader->elementMap = array_merge($this->elementMap, $elementMap); + $reader->xml($xml); + return $reader->parse(); + } +} diff --git a/apps/dav/tests/unit/CalDAV/Search/SearchPluginTest.php b/apps/dav/tests/unit/CalDAV/Search/SearchPluginTest.php new file mode 100644 index 00000000000..fc647bb5daf --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/Search/SearchPluginTest.php @@ -0,0 +1,124 @@ +<?php +/** + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @copyright Copyright (c) 2017 Georg Ehrke <oc.list@georgehrke.com> + * @license GNU AGPL version 3 or any later version + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Tests\unit\CalDAV\Search; + +use OCA\DAV\CalDAV\CalendarHome; +use OCA\DAV\CalDAV\Search\SearchPlugin; +use OCA\DAV\CalDAV\Search\Xml\Request\CalendarSearchReport; +use Test\TestCase; + +class SearchPluginTest extends TestCase { + + protected $server; + + /** @var \OCA\DAV\CalDAV\Search\SearchPlugin $plugin */ + protected $plugin; + + public function setUp() { + parent::setUp(); + + $this->server = $this->createMock(\Sabre\DAV\Server::class); + $this->server->tree = $this->createMock(\Sabre\DAV\Tree::class); + $this->server->httpResponse = $this->createMock(\Sabre\HTTP\Response::class); + + $this->plugin = new SearchPlugin(); + $this->plugin->initialize($this->server); + } + + public function testGetFeatures() { + $this->assertEquals(['nc-calendar-search'], $this->plugin->getFeatures()); + } + + public function testGetName() { + $this->assertEquals('nc-calendar-search', $this->plugin->getPluginName()); + } + + public function testInitialize() { + $server = $this->createMock(\Sabre\DAV\Server::class); + + $plugin = new SearchPlugin(); + + $server->expects($this->at(0)) + ->method('on') + ->with('report', [$plugin, 'report']); + + $plugin->initialize($server); + + $this->assertEquals( + $server->xml->elementMap['{http://nextcloud.com/ns}calendar-search'], + 'OCA\\DAV\\CalDAV\\Search\\Xml\\Request\\CalendarSearchReport' + ); + } + + public function testReportUnknown() { + $result = $this->plugin->report('{urn:ietf:params:xml:ns:caldav}calendar-query', 'REPORT', null); + $this->assertEquals($result, null); + $this->assertNotEquals($this->server->transactionType, 'report-nc-calendar-search'); + } + + public function testReport() { + $report = $this->createMock(CalendarSearchReport::class); + $report->filters = []; + $calendarHome = $this->createMock(CalendarHome::class); + $this->server->expects($this->at(0)) + ->method('getRequestUri') + ->with() + ->will($this->returnValue('/re/quest/u/r/i')); + $this->server->tree->expects($this->at(0)) + ->method('getNodeForPath') + ->with('/re/quest/u/r/i') + ->will($this->returnValue($calendarHome)); + $this->server->expects($this->at(1)) + ->method('getHTTPDepth') + ->with(2) + ->will($this->returnValue(2)); + $calendarHome->expects($this->at(0)) + ->method('calendarSearch') + ->will($this->returnValue([])); + + $this->plugin->report('{http://nextcloud.com/ns}calendar-search', $report, ''); + } + + public function testSupportedReportSetNoCalendarHome() { + $this->server->tree->expects($this->once()) + ->method('getNodeForPath') + ->with('/foo/bar') + ->will($this->returnValue(null)); + + $reports = $this->plugin->getSupportedReportSet('/foo/bar'); + $this->assertEquals([], $reports); + } + + public function testSupportedReportSet() { + $calendarHome = $this->createMock(CalendarHome::class); + + $this->server->tree->expects($this->once()) + ->method('getNodeForPath') + ->with('/bar/foo') + ->will($this->returnValue($calendarHome)); + + $reports = $this->plugin->getSupportedReportSet('/bar/foo'); + $this->assertEquals([ + '{http://nextcloud.com/ns}calendar-search' + ], $reports); + } +} diff --git a/apps/dav/tests/unit/Connector/Sabre/DirectoryTest.php b/apps/dav/tests/unit/Connector/Sabre/DirectoryTest.php index 18f91bbd8c9..f27f67b0aae 100644 --- a/apps/dav/tests/unit/Connector/Sabre/DirectoryTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/DirectoryTest.php @@ -27,6 +27,42 @@ namespace OCA\DAV\Tests\Unit\Connector\Sabre; use OCP\Files\ForbiddenException; +use OC\Files\FileInfo; +use OCA\DAV\Connector\Sabre\Directory; + +class TestViewDirectory extends \OC\Files\View { + + private $updatables; + private $deletables; + private $canRename; + + public function __construct($updatables, $deletables, $canRename = true) { + $this->updatables = $updatables; + $this->deletables = $deletables; + $this->canRename = $canRename; + } + + public function isUpdatable($path) { + return $this->updatables[$path]; + } + + public function isCreatable($path) { + return $this->updatables[$path]; + } + + public function isDeletable($path) { + return $this->deletables[$path]; + } + + public function rename($path1, $path2) { + return $this->canRename; + } + + public function getRelativePath($path) { + return $path; + } +} + /** * @group DB @@ -41,12 +77,11 @@ class DirectoryTest extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->view = $this->getMockBuilder('OC\Files\View') - ->disableOriginalConstructor() - ->getMock(); - $this->info = $this->getMockBuilder('OC\Files\FileInfo') - ->disableOriginalConstructor() - ->getMock(); + $this->view = $this->createMock('OC\Files\View'); + $this->info = $this->createMock('OC\Files\FileInfo'); + $this->info->expects($this->any()) + ->method('isReadable') + ->willReturn(true); } private function getDir($path = '/') { @@ -58,7 +93,7 @@ class DirectoryTest extends \Test\TestCase { ->method('getPath') ->will($this->returnValue($path)); - return new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + return new Directory($this->view, $this->info); } /** @@ -172,7 +207,7 @@ class DirectoryTest extends \Test\TestCase { ->method('getRelativePath') ->will($this->returnValue('')); - $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + $dir = new Directory($this->view, $this->info); $nodes = $dir->getChildren(); $this->assertEquals(2, count($nodes)); @@ -183,6 +218,31 @@ class DirectoryTest extends \Test\TestCase { } /** + * @expectedException \Sabre\DAV\Exception\Forbidden + */ + public function testGetChildrenNoPermission() { + $info = $this->createMock(FileInfo::class); + $info->expects($this->any()) + ->method('isReadable') + ->will($this->returnValue(false)); + + $dir = new Directory($this->view, $info); + $dir->getChildren(); + } + + /** + * @expectedException \Sabre\DAV\Exception\NotFound + */ + public function testGetChildNoPermission() { + $this->info->expects($this->any()) + ->method('isReadable') + ->will($this->returnValue(false)); + + $dir = new Directory($this->view, $this->info); + $dir->getChild('test'); + } + + /** * @expectedException \Sabre\DAV\Exception\ServiceUnavailable */ public function testGetChildThrowStorageNotAvailableException() { @@ -190,7 +250,7 @@ class DirectoryTest extends \Test\TestCase { ->method('getFileInfo') ->willThrowException(new \OCP\Files\StorageNotAvailableException()); - $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + $dir = new Directory($this->view, $this->info); $dir->getChild('.'); } @@ -204,7 +264,7 @@ class DirectoryTest extends \Test\TestCase { $this->view->expects($this->never()) ->method('getFileInfo'); - $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + $dir = new Directory($this->view, $this->info); $dir->getChild('.'); } @@ -235,7 +295,7 @@ class DirectoryTest extends \Test\TestCase { ->method('getStorage') ->will($this->returnValue($storage)); - $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + $dir = new Directory($this->view, $this->info); $this->assertEquals([200, -3], $dir->getQuotaInfo()); //200 used, unlimited } @@ -267,7 +327,105 @@ class DirectoryTest extends \Test\TestCase { ->method('getStorage') ->will($this->returnValue($storage)); - $dir = new \OCA\DAV\Connector\Sabre\Directory($this->view, $this->info); + $dir = new Directory($this->view, $this->info); $this->assertEquals([200, 800], $dir->getQuotaInfo()); //200 used, 800 free } + + /** + * @dataProvider moveFailedProvider + * @expectedException \Sabre\DAV\Exception\Forbidden + */ + public function testMoveFailed($source, $destination, $updatables, $deletables) { + $this->moveTest($source, $destination, $updatables, $deletables); + } + + /** + * @dataProvider moveSuccessProvider + */ + public function testMoveSuccess($source, $destination, $updatables, $deletables) { + $this->moveTest($source, $destination, $updatables, $deletables); + $this->assertTrue(true); + } + + /** + * @dataProvider moveFailedInvalidCharsProvider + * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath + */ + public function testMoveFailedInvalidChars($source, $destination, $updatables, $deletables) { + $this->moveTest($source, $destination, $updatables, $deletables); + } + + public function moveFailedInvalidCharsProvider() { + return [ + ['a/b', 'a/*', ['a' => true, 'a/b' => true, 'a/c*' => false], []], + ]; + } + + public function moveFailedProvider() { + return [ + ['a/b', 'a/c', ['a' => false, 'a/b' => false, 'a/c' => false], []], + ['a/b', 'b/b', ['a' => false, 'a/b' => false, 'b' => false, 'b/b' => false], []], + ['a/b', 'b/b', ['a' => false, 'a/b' => true, 'b' => false, 'b/b' => false], []], + ['a/b', 'b/b', ['a' => true, 'a/b' => true, 'b' => false, 'b/b' => false], []], + ['a/b', 'b/b', ['a' => true, 'a/b' => true, 'b' => true, 'b/b' => false], ['a/b' => false]], + ['a/b', 'a/c', ['a' => false, 'a/b' => true, 'a/c' => false], []], + ]; + } + + public function moveSuccessProvider() { + return [ + ['a/b', 'b/b', ['a' => true, 'a/b' => true, 'b' => true, 'b/b' => false], ['a/b' => true]], + // older files with special chars can still be renamed to valid names + ['a/b*', 'b/b', ['a' => true, 'a/b*' => true, 'b' => true, 'b/b' => false], ['a/b*' => true]], + ]; + } + + /** + * @param $source + * @param $destination + * @param $updatables + */ + private function moveTest($source, $destination, $updatables, $deletables) { + $view = new TestViewDirectory($updatables, $deletables); + + $sourceInfo = new FileInfo($source, null, null, [], null); + $targetInfo = new FileInfo(dirname($destination), null, null, [], null); + + $sourceNode = new Directory($view, $sourceInfo); + $targetNode = $this->getMockBuilder(Directory::class) + ->setMethods(['childExists']) + ->setConstructorArgs([$view, $targetInfo]) + ->getMock(); + $targetNode->expects($this->any())->method('childExists') + ->with(basename($destination)) + ->willReturn(false); + $this->assertTrue($targetNode->moveInto(basename($destination), $source, $sourceNode)); + } + + /** + * @expectedException \Sabre\DAV\Exception\Forbidden + * @expectedExceptionMessage Could not copy directory b, target exists + */ + public function testFailingMove() { + $source = 'a/b'; + $destination = 'c/b'; + $updatables = ['a' => true, 'a/b' => true, 'b' => true, 'c/b' => false]; + $deletables = ['a/b' => true]; + + $view = new TestViewDirectory($updatables, $deletables); + + $sourceInfo = new FileInfo($source, null, null, [], null); + $targetInfo = new FileInfo(dirname($destination), null, null, [], null); + + $sourceNode = new Directory($view, $sourceInfo); + $targetNode = $this->getMockBuilder(Directory::class) + ->setMethods(['childExists']) + ->setConstructorArgs([$view, $targetInfo]) + ->getMock(); + $targetNode->expects($this->once())->method('childExists') + ->with(basename($destination)) + ->willReturn(true); + + $targetNode->moveInto(basename($destination), $source, $sourceNode); + } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FileTest.php b/apps/dav/tests/unit/Connector/Sabre/FileTest.php index 31344b36463..e2666d0de27 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FileTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FileTest.php @@ -1003,4 +1003,23 @@ class FileTest extends \Test\TestCase { $file->get(); } + + /** + * @expectedException \Sabre\DAV\Exception\NotFound + */ + public function testGetThrowsIfNoPermission() { + $view = $this->getMockBuilder('\OC\Files\View') + ->setMethods(['fopen']) + ->getMock(); + $view->expects($this->never()) + ->method('fopen'); + + $info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, [ + 'permissions' => \OCP\Constants::PERMISSION_CREATE // no read perm + ], null); + + $file = new \OCA\DAV\Connector\Sabre\File($view, $info); + + $file->get(); + } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php index 1c9ebdd09b6..739c8f62540 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesPluginTest.php @@ -32,6 +32,9 @@ use Sabre\DAV\PropPatch; use Sabre\HTTP\RequestInterface; use Sabre\HTTP\ResponseInterface; use Test\TestCase; +use OCA\DAV\Upload\FutureFile; +use OCA\DAV\Connector\Sabre\Directory; +use OCP\Files\FileInfo; /** * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> @@ -107,6 +110,12 @@ class FilesPluginTest extends TestCase { $this->request, $this->previewManager ); + + $response = $this->getMockBuilder(ResponseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $this->server->httpResponse = $response; + $this->plugin->initialize($this->server); } @@ -140,13 +149,15 @@ class FilesPluginTest extends TestCase { $node->expects($this->any()) ->method('getDavPermissions') ->will($this->returnValue('DWCKMSR')); + + $fileInfo = $this->createMock(FileInfo::class); + $fileInfo->expects($this->any()) + ->method('isReadable') + ->willReturn(true); + $node->expects($this->any()) ->method('getFileInfo') - ->will($this->returnValue( - $this->getMockBuilder('\OCP\Files\FileInfo') - ->disableOriginalConstructor() - ->getMock() - )); + ->willReturn($fileInfo); return $node; } @@ -305,6 +316,15 @@ class FilesPluginTest extends TestCase { ->getMock(); $node->expects($this->any())->method('getPath')->willReturn('/'); + $fileInfo = $this->createMock(FileInfo::class); + $fileInfo->expects($this->any()) + ->method('isReadable') + ->willReturn(true); + + $node->expects($this->any()) + ->method('getFileInfo') + ->willReturn($fileInfo); + $propFind = new PropFind( '/', [ @@ -321,6 +341,39 @@ class FilesPluginTest extends TestCase { $this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME)); } + /** + * @expectedException \Sabre\DAV\Exception\NotFound + */ + public function testGetPropertiesWhenNoPermission() { + /** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */ + $node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') + ->disableOriginalConstructor() + ->getMock(); + $node->expects($this->any())->method('getPath')->willReturn('/'); + + $fileInfo = $this->createMock(FileInfo::class); + $fileInfo->expects($this->any()) + ->method('isReadable') + ->willReturn(false); + + $node->expects($this->any()) + ->method('getFileInfo') + ->willReturn($fileInfo); + + $propFind = new PropFind( + '/test', + [ + self::DATA_FINGERPRINT_PROPERTYNAME, + ], + 0 + ); + + $this->plugin->handleGetProperties( + $propFind, + $node + ); + } + public function testUpdateProps() { $node = $this->createTestNode('\OCA\DAV\Connector\Sabre\File'); @@ -535,4 +588,59 @@ class FilesPluginTest extends TestCase { $this->assertEquals("false", $propFind->get(self::HAS_PREVIEW_PROPERTYNAME)); } + + public function testBeforeMoveFutureFileSkip() { + $node = $this->createMock(Directory::class); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('source') + ->will($this->returnValue($node)); + $this->server->httpResponse->expects($this->never()) + ->method('setStatus'); + + $this->assertNull($this->plugin->beforeMoveFutureFile('source', 'target')); + } + + public function testBeforeMoveFutureFileSkipNonExisting() { + $sourceNode = $this->createMock(FutureFile::class); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('source') + ->will($this->returnValue($sourceNode)); + $this->tree->expects($this->any()) + ->method('nodeExists') + ->with('target') + ->will($this->returnValue(false)); + $this->server->httpResponse->expects($this->never()) + ->method('setStatus'); + + $this->assertNull($this->plugin->beforeMoveFutureFile('source', 'target')); + } + + public function testBeforeMoveFutureFileMoveIt() { + $sourceNode = $this->createMock(FutureFile::class); + + $this->tree->expects($this->any()) + ->method('getNodeForPath') + ->with('source') + ->will($this->returnValue($sourceNode)); + $this->tree->expects($this->any()) + ->method('nodeExists') + ->with('target') + ->will($this->returnValue(true)); + $this->tree->expects($this->once()) + ->method('move') + ->with('source', 'target'); + + $this->server->httpResponse->expects($this->once()) + ->method('setHeader') + ->with('Content-Length', '0'); + $this->server->httpResponse->expects($this->once()) + ->method('setStatus') + ->with(204); + + $this->assertFalse($this->plugin->beforeMoveFutureFile('source', 'target')); + } } diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php index 4d8a87b093f..3ca131dbf6f 100644 --- a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php @@ -34,6 +34,7 @@ use OCP\Files\Folder; use OCP\IGroupManager; use OCP\SystemTag\ISystemTagManager; use OCP\ITags; +use OCP\Files\FileInfo; class FilesReportPluginTest extends \Test\TestCase { /** @var \Sabre\DAV\Server|\PHPUnit_Framework_MockObject_MockObject */ @@ -349,6 +350,9 @@ class FilesReportPluginTest extends \Test\TestCase { public function testPrepareResponses() { $requestedProps = ['{DAV:}getcontentlength', '{http://owncloud.org/ns}fileid', '{DAV:}resourcetype']; + $fileInfo = $this->createMock(FileInfo::class); + $fileInfo->method('isReadable')->willReturn(true); + $node1 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory') ->disableOriginalConstructor() ->getMock(); @@ -362,6 +366,7 @@ class FilesReportPluginTest extends \Test\TestCase { $node1->expects($this->any()) ->method('getPath') ->will($this->returnValue('/node1')); + $node1->method('getFileInfo')->willReturn($fileInfo); $node2->expects($this->once()) ->method('getInternalFileId') ->will($this->returnValue('222')); @@ -371,6 +376,7 @@ class FilesReportPluginTest extends \Test\TestCase { $node2->expects($this->any()) ->method('getPath') ->will($this->returnValue('/sub/node2')); + $node2->method('getFileInfo')->willReturn($fileInfo); $config = $this->getMockBuilder('\OCP\IConfig') ->disableOriginalConstructor() diff --git a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php index 17cb598bf6e..53f60bd0f1c 100644 --- a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php @@ -30,47 +30,11 @@ namespace OCA\DAV\Tests\unit\Connector\Sabre; use OC\Files\FileInfo; +use OC\Files\Filesystem; use OC\Files\Storage\Temporary; - -class TestDoubleFileView extends \OC\Files\View { - - public function __construct($creatables, $updatables, $deletables, $canRename = true) { - $this->creatables = $creatables; - $this->updatables = $updatables; - $this->deletables = $deletables; - $this->canRename = $canRename; - $this->lockingProvider = \OC::$server->getLockingProvider(); - } - - public function isUpdatable($path) { - return !empty($this->updatables[$path]); - } - - public function isCreatable($path) { - return !empty($this->creatables[$path]); - } - - public function isDeletable($path) { - return !empty($this->deletables[$path]); - } - - public function rename($path1, $path2) { - return $this->canRename; - } - - public function getRelativePath($path) { - return $path; - } - - public function getFileInfo($path, $includeMountPoints = true) { - $objectTreeTest = new ObjectTreeTest(); - return $objectTreeTest->getFileInfoMock( - $this->isCreatable($path), - $this->isUpdatable($path), - $this->isDeletable($path) - ); - } -} +use OC\Files\View; +use OCA\DAV\Connector\Sabre\Directory; +use OCA\DAV\Connector\Sabre\ObjectTree; /** * Class ObjectTreeTest @@ -81,103 +45,100 @@ class TestDoubleFileView extends \OC\Files\View { */ class ObjectTreeTest extends \Test\TestCase { - public function getFileInfoMock($create = true, $update = true, $delete = true) { - $mock = $this->getMockBuilder('\OCP\Files\FileInfo') - ->disableOriginalConstructor() - ->getMock(); - $mock - ->expects($this->any()) - ->method('isCreatable') - ->willReturn($create); - $mock - ->expects($this->any()) - ->method('isUpdateable') - ->willReturn($update); - $mock - ->expects($this->any()) - ->method('isDeletable') - ->willReturn($delete); - - return $mock; + public function copyDataProvider() { + return [ + // copy into same dir + ['a', 'b', ''], + // copy into same dir + ['a/a', 'a/b', 'a'], + // copy into another dir + ['a', 'sub/a', 'sub'], + ]; } /** - * @dataProvider moveFailedProvider - * @expectedException \Sabre\DAV\Exception\Forbidden + * @dataProvider copyDataProvider */ - public function testMoveFailed($source, $destination, $updatables, $deletables) { - $this->moveTest($source, $destination, $updatables, $updatables, $deletables, true); - } + public function testCopy($sourcePath, $targetPath, $targetParent) { + $view = $this->createMock(View::class); + $view->expects($this->once()) + ->method('verifyPath') + ->with($targetParent) + ->will($this->returnValue(true)); + $view->expects($this->once()) + ->method('file_exists') + ->with($targetPath) + ->willReturn(false); + $view->expects($this->once()) + ->method('copy') + ->with($sourcePath, $targetPath) + ->will($this->returnValue(true)); - /** - * @dataProvider moveSuccessProvider - */ - public function testMoveSuccess($source, $destination, $updatables, $deletables) { - $this->moveTest($source, $destination, $updatables, $updatables, $deletables); - $this->assertTrue(true); - } + $info = $this->createMock(FileInfo::class); + $info->expects($this->once()) + ->method('isCreatable') + ->willReturn(true); - /** - * @dataProvider moveFailedInvalidCharsProvider - * @expectedException \OCA\DAV\Connector\Sabre\Exception\InvalidPath - */ - public function testMoveFailedInvalidChars($source, $destination, $updatables, $deletables) { - $this->moveTest($source, $destination, $updatables, $updatables, $deletables); - } + $view->expects($this->once()) + ->method('getFileInfo') + ->with($targetParent === '' ? '.' : $targetParent) + ->willReturn($info); - function moveFailedInvalidCharsProvider() { - return array( - array('a/b', 'a/*', array('a' => true, 'a/b' => true, 'a/c*' => false), array()), - ); - } + $rootDir = new Directory($view, $info); + $objectTree = $this->getMockBuilder(ObjectTree::class) + ->setMethods(['nodeExists', 'getNodeForPath']) + ->setConstructorArgs([$rootDir, $view]) + ->getMock(); - function moveFailedProvider() { - return array( - array('a/b', 'a/c', array('a' => false, 'a/b' => false, 'a/c' => false), array()), - array('a/b', 'b/b', array('a' => false, 'a/b' => false, 'b' => false, 'b/b' => false), array()), - array('a/b', 'b/b', array('a' => false, 'a/b' => true, 'b' => false, 'b/b' => false), array()), - array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => false, 'b/b' => false), array()), - array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false), array('a/b' => false)), - array('a/b', 'a/c', array('a' => false, 'a/b' => true, 'a/c' => false), array()), - ); - } + $objectTree->expects($this->once()) + ->method('getNodeForPath') + ->with($this->identicalTo($sourcePath)) + ->will($this->returnValue(false)); - function moveSuccessProvider() { - return array( - array('a/b', 'b/b', array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false), array('a/b' => true)), - // older files with special chars can still be renamed to valid names - array('a/b*', 'b/b', array('a' => true, 'a/b*' => true, 'b' => true, 'b/b' => false), array('a/b*' => true)), - ); + /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */ + $mountManager = Filesystem::getMountManager(); + $objectTree->init($rootDir, $view, $mountManager); + $objectTree->copy($sourcePath, $targetPath); } /** - * @param $source - * @param $destination - * @param $creatables - * @param $updatables - * @param $deletables - * @param $throwsBeforeGetNode + * @dataProvider copyDataProvider + * @expectedException \Sabre\DAV\Exception\Forbidden */ - private function moveTest($source, $destination, $creatables, $updatables, $deletables, $throwsBeforeGetNode = false) { - $view = new TestDoubleFileView($creatables, $updatables, $deletables); + public function testCopyFailNotCreatable($sourcePath, $targetPath, $targetParent) { + $view = $this->createMock(View::class); + $view->expects($this->never()) + ->method('verifyPath'); + $view->expects($this->once()) + ->method('file_exists') + ->with($targetPath) + ->willReturn(false); + $view->expects($this->never()) + ->method('copy'); + + $info = $this->createMock(FileInfo::class); + $info->expects($this->once()) + ->method('isCreatable') + ->willReturn(false); - $info = new FileInfo('', null, null, array(), null); + $view->expects($this->once()) + ->method('getFileInfo') + ->with($targetParent === '' ? '.' : $targetParent) + ->willReturn($info); - $rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info); - $objectTree = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\ObjectTree') + $rootDir = new Directory($view, $info); + $objectTree = $this->getMockBuilder(ObjectTree::class) ->setMethods(['nodeExists', 'getNodeForPath']) ->setConstructorArgs([$rootDir, $view]) ->getMock(); - $objectTree->expects($throwsBeforeGetNode ? $this->never() : $this->once()) - ->method('getNodeForPath') - ->with($this->identicalTo($source)) - ->will($this->returnValue(false)); + $objectTree->expects($this->never()) + ->method('getNodeForPath'); /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */ - $mountManager = \OC\Files\Filesystem::getMountManager(); + $mountManager = Filesystem::getMountManager(); $objectTree->init($rootDir, $view, $mountManager); - $objectTree->move($source, $destination); + $objectTree->copy($sourcePath, $targetPath); } /** @@ -361,46 +322,4 @@ class ObjectTreeTest extends \Test\TestCase { $this->assertInstanceOf('\Sabre\DAV\INode', $tree->getNodeForPath($path)); } - - /** - * @expectedException \Sabre\DAV\Exception\Forbidden - * @expectedExceptionMessage Could not copy directory nameOfSourceNode, target exists - */ - public function testFailingMove() { - $source = 'a/b'; - $destination = 'b/b'; - $updatables = array('a' => true, 'a/b' => true, 'b' => true, 'b/b' => false); - $deletables = array('a/b' => true); - - $view = new TestDoubleFileView($updatables, $updatables, $deletables); - - $info = new FileInfo('', null, null, array(), null); - - $rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info); - $objectTree = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\ObjectTree') - ->setMethods(['nodeExists', 'getNodeForPath']) - ->setConstructorArgs([$rootDir, $view]) - ->getMock(); - - $sourceNode = $this->getMockBuilder('\Sabre\DAV\ICollection') - ->disableOriginalConstructor() - ->getMock(); - $sourceNode->expects($this->once()) - ->method('getName') - ->will($this->returnValue('nameOfSourceNode')); - - $objectTree->expects($this->once()) - ->method('nodeExists') - ->with($this->identicalTo($destination)) - ->will($this->returnValue(true)); - $objectTree->expects($this->once()) - ->method('getNodeForPath') - ->with($this->identicalTo($source)) - ->will($this->returnValue($sourceNode)); - - /** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */ - $mountManager = \OC\Files\Filesystem::getMountManager(); - $objectTree->init($rootDir, $view, $mountManager); - $objectTree->move($source, $destination); - } } diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php index 7468e981020..35fd83f1fe6 100644 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DeleteTest.php @@ -31,7 +31,7 @@ use OCP\AppFramework\Http; * * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest */ -class DeleteTest extends RequestTest { +class DeleteTest extends RequestTestCase { public function testBasicUpload() { $user = $this->getUniqueID(); $view = $this->setupUser($user, 'pass'); diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DownloadTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DownloadTest.php index 8aac99e8c54..2cb08420f8d 100644 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/DownloadTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/DownloadTest.php @@ -34,7 +34,7 @@ use OCP\Lock\ILockingProvider; * * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest */ -class DownloadTest extends RequestTest { +class DownloadTest extends RequestTestCase { public function testDownload() { $user = $this->getUniqueID(); $view = $this->setupUser($user, 'pass'); diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTestCase.php index 63bd3cf19cc..50e228b7e84 100644 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/RequestTestCase.php @@ -34,7 +34,7 @@ use Test\TestCase; use Test\Traits\MountProviderTrait; use Test\Traits\UserTrait; -abstract class RequestTest extends TestCase { +abstract class RequestTestCase extends TestCase { use UserTrait; use MountProviderTrait; diff --git a/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php b/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php index 1db85b1bcaf..5376241c61d 100644 --- a/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php +++ b/apps/dav/tests/unit/Connector/Sabre/RequestTest/UploadTest.php @@ -35,7 +35,7 @@ use OCP\Lock\ILockingProvider; * * @package OCA\DAV\Tests\unit\Connector\Sabre\RequestTest */ -class UploadTest extends RequestTest { +class UploadTest extends RequestTestCase { public function testBasicUpload() { $user = $this->getUniqueID(); $view = $this->setupUser($user, 'pass'); diff --git a/apps/encryption/l10n/pt_BR.js b/apps/encryption/l10n/pt_BR.js index eccc6a2ada3..e0954a6bc1f 100644 --- a/apps/encryption/l10n/pt_BR.js +++ b/apps/encryption/l10n/pt_BR.js @@ -32,7 +32,7 @@ OC.L10N.register( "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section '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.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"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.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", diff --git a/apps/encryption/l10n/pt_BR.json b/apps/encryption/l10n/pt_BR.json index 5e697001fc2..85982d7769d 100644 --- a/apps/encryption/l10n/pt_BR.json +++ b/apps/encryption/l10n/pt_BR.json @@ -30,7 +30,7 @@ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível ler este arquivo pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para recompartilhá-lo com você.", "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section '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.\n\n" : "Olá,\n\nO administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"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.<br><br>" : "Olá,<br><br>o administrador habilitou a criptografia do lado do servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login na interface da Web, vá para a seção 'módulo de criptografia básico' das suas definições pessoais e atualize sua senha de criptografia, inserindo esta senha no campo 'senha antiga de log-in' e sua senha de login atual.<br><br>", "Default encryption module" : "Módulo de criptografia padrão", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo de criptografia está habilitado, mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", diff --git a/apps/encryption/templates/settings-personal.php b/apps/encryption/templates/settings-personal.php index e2bcb6813b6..7d0a26eea93 100644 --- a/apps/encryption/templates/settings-personal.php +++ b/apps/encryption/templates/settings-personal.php @@ -5,7 +5,7 @@ script('encryption', 'settings-personal'); script('core', 'multiselect'); ?> <form id="ocDefaultEncryptionModule" class="section"> - <h2><?php p($l->t('Basic encryption module')); ?></h2> + <h2 data-anchor-name="basic-encryption-module"><?php p($l->t('Basic encryption module')); ?></h2> <?php if ($_["initialized"] === \OCA\Encryption\Session::NOT_INITIALIZED ): ?> diff --git a/apps/federatedfilesharing/js/settings-personal.js b/apps/federatedfilesharing/js/settings-personal.js index 04096cb0416..c954f74f323 100644 --- a/apps/federatedfilesharing/js/settings-personal.js +++ b/apps/federatedfilesharing/js/settings-personal.js @@ -20,6 +20,9 @@ $(document).ready(function() { } }); + /* Verification icon tooltip */ + $('#personal-settings-container .verify img').tooltip({placement: 'bottom', trigger: 'hover'}); + $('#fileSharingSettings .clipboardButton').tooltip({placement: 'bottom', title: t('core', 'Copy'), trigger: 'hover'}); // Clipboard! diff --git a/apps/federatedfilesharing/l10n/cs.js b/apps/federatedfilesharing/l10n/cs.js index 66ba39701ed..dd7f9b74b85 100644 --- a/apps/federatedfilesharing/l10n/cs.js +++ b/apps/federatedfilesharing/l10n/cs.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů", "Federated Cloud" : "Sdružený cloud", "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:", - "Share it:" : "Sdílet:", "Add to your website" : "Přidat na svou webovou stránku", "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud", "HTML Code:" : "HTML kód:", - "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři" + "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři", + "Share it:" : "Sdílet:" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/federatedfilesharing/l10n/cs.json b/apps/federatedfilesharing/l10n/cs.json index 1455b337314..9f024387101 100644 --- a/apps/federatedfilesharing/l10n/cs.json +++ b/apps/federatedfilesharing/l10n/cs.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Povolit uživatelům na tomto serveru přijímat sdílení z jiných serverů", "Federated Cloud" : "Sdružený cloud", "Your Federated Cloud ID:" : "Vaše sdružené cloud ID:", - "Share it:" : "Sdílet:", "Add to your website" : "Přidat na svou webovou stránku", "Share with me via Nextcloud" : "Sdíleno se mnou přes Nextcloud", "HTML Code:" : "HTML kód:", - "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři" + "Search global and public address book for users" : "Hledat uživatele v globálním a veřejném adresáři", + "Share it:" : "Sdílet:" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/de.js b/apps/federatedfilesharing/l10n/de.js index 2f2387c01be..37a9fcb3a47 100644 --- a/apps/federatedfilesharing/l10n/de.js +++ b/apps/federatedfilesharing/l10n/de.js @@ -39,16 +39,19 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID", "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "Open documentation" : "Dokumentation öffnen", + "Adjust how people can share between servers." : "Definiere wie die Benutzer Inhalte mit anderen Servern teilen können.", "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Gebe einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", - "Share it:" : "Zum Teilen:", + "Share it so your friends can share files with you:" : "Teile es, so dass Deine Freunde Dateien mit Dir teilen können:", "Add to your website" : "Zu deiner Webseite hinzufügen", "Share with me via Nextcloud" : "Teile mit mir über Nextcloud", "HTML Code:" : "HTML-Code:", - "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Benutzer" + "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Benutzer", + "Share it:" : "Zum Teilen:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/de.json b/apps/federatedfilesharing/l10n/de.json index fe1f884181c..62fb5fc88b6 100644 --- a/apps/federatedfilesharing/l10n/de.json +++ b/apps/federatedfilesharing/l10n/de.json @@ -37,16 +37,19 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID", "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "Open documentation" : "Dokumentation öffnen", + "Adjust how people can share between servers." : "Definiere wie die Benutzer Inhalte mit anderen Servern teilen können.", "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kannst mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Gebe einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Deine Federated-Cloud-ID:", - "Share it:" : "Zum Teilen:", + "Share it so your friends can share files with you:" : "Teile es, so dass Deine Freunde Dateien mit Dir teilen können:", "Add to your website" : "Zu deiner Webseite hinzufügen", "Share with me via Nextcloud" : "Teile mit mir über Nextcloud", "HTML Code:" : "HTML-Code:", - "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Benutzer" + "Search global and public address book for users" : "Globale Suche und ein öffentliches Adressbuch für Benutzer", + "Share it:" : "Zum Teilen:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/de_DE.js b/apps/federatedfilesharing/l10n/de_DE.js index 11983a5e2fd..42606db4ee7 100644 --- a/apps/federatedfilesharing/l10n/de_DE.js +++ b/apps/federatedfilesharing/l10n/de_DE.js @@ -39,16 +39,19 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID", "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "Open documentation" : "Dokumentation öffnen", + "Adjust how people can share between servers." : "Definiere wie die Benutzer Inhalte mit anderen Servern teilen können.", "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Geben Sie einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:", - "Share it:" : "Teilen:", + "Share it so your friends can share files with you:" : "Teilen SIe es, so dass Ihre Freunde Dateien mit Ihnen teilen können:", "Add to your website" : "Zu Ihrer Web-Seite hinzufügen", "Share with me via Nextcloud" : "Teilen Sie mit mir über Nextcloud", "HTML Code:" : "HTML-Code:", - "Search global and public address book for users" : "Durchsuche globales und öffentliches Adressbuch nach Nutzern" + "Search global and public address book for users" : "Durchsuche globales und öffentliches Adressbuch nach Nutzern", + "Share it:" : "Teilen:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/de_DE.json b/apps/federatedfilesharing/l10n/de_DE.json index ad6d84c8171..47763ecd172 100644 --- a/apps/federatedfilesharing/l10n/de_DE.json +++ b/apps/federatedfilesharing/l10n/de_DE.json @@ -37,16 +37,19 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID", "Federated Cloud Sharing" : "Federated-Cloud-Sharing", "Open documentation" : "Dokumentation öffnen", + "Adjust how people can share between servers." : "Definiere wie die Benutzer Inhalte mit anderen Servern teilen können.", "Allow users on this server to send shares to other servers" : "Benutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", "Allow users on this server to receive shares from other servers" : "Benutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben", "Search global and public address book for users and let local users publish their data" : "Globales und öffentliches Adressbuch nach Nutzern durchsuchen und lokale Nutzer ihre Daten veröffentlichen lassen", "Allow users to publish their data to a global and public address book" : "Erlaube Benutzern ihre Daten an ein globales und öffentliches Adressbuche zu veröffentlichen", "Federated Cloud" : "Federated Cloud", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Sie können mit allen Leuten teilen, welche Nextcloud, ownCloud oder Pydio nutzen! Geben Sie einfach deren Federated Cloud ID in den Teilen-Dialog ein. Diese sieht wie folgt aus person@cloud.example.com", "Your Federated Cloud ID:" : "Ihre Federated-Cloud-ID:", - "Share it:" : "Teilen:", + "Share it so your friends can share files with you:" : "Teilen SIe es, so dass Ihre Freunde Dateien mit Ihnen teilen können:", "Add to your website" : "Zu Ihrer Web-Seite hinzufügen", "Share with me via Nextcloud" : "Teilen Sie mit mir über Nextcloud", "HTML Code:" : "HTML-Code:", - "Search global and public address book for users" : "Durchsuche globales und öffentliches Adressbuch nach Nutzern" + "Search global and public address book for users" : "Durchsuche globales und öffentliches Adressbuch nach Nutzern", + "Share it:" : "Teilen:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/es.js b/apps/federatedfilesharing/l10n/es.js index 881e0e17ee4..1cd41e22914 100644 --- a/apps/federatedfilesharing/l10n/es.js +++ b/apps/federatedfilesharing/l10n/es.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar su información en la libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", "Your Federated Cloud ID:" : "Su ID Nube Federada:", - "Share it:" : "Compartir:", "Add to your website" : "Añadir a su sitio web", "Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Buscar libretas de contactos globales y públicas para usuarios" + "Search global and public address book for users" : "Buscar libretas de contactos globales y públicas para usuarios", + "Share it:" : "Compartir:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/es.json b/apps/federatedfilesharing/l10n/es.json index da75410734e..36a6206e890 100644 --- a/apps/federatedfilesharing/l10n/es.json +++ b/apps/federatedfilesharing/l10n/es.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar su información en la libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", "Your Federated Cloud ID:" : "Su ID Nube Federada:", - "Share it:" : "Compartir:", "Add to your website" : "Añadir a su sitio web", "Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Buscar libretas de contactos globales y públicas para usuarios" + "Search global and public address book for users" : "Buscar libretas de contactos globales y públicas para usuarios", + "Share it:" : "Compartir:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/es_MX.js b/apps/federatedfilesharing/l10n/es_MX.js index 94bc1a2683a..c58da061e40 100644 --- a/apps/federatedfilesharing/l10n/es_MX.js +++ b/apps/federatedfilesharing/l10n/es_MX.js @@ -39,16 +39,19 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud", "Federated Cloud Sharing" : "Compartir en la Nube Federada", "Open documentation" : "Abrir documentación", + "Adjust how people can share between servers." : "Ajustar cómo las personas pueden compartir entre servidores. ", "Allow users on this server to send shares to other servers" : "Permitirle a los usuarios de este servidor enviar elementos compartidos a otros servidores", "Allow users on this server to receive shares from other servers" : "Permitir que los usuarios de este servidor recibir elementos compartidos de otros servidores", "Search global and public address book for users and let local users publish their data" : "Buscar una libreta de direcciones global y pública para los usuarios y permitir a los usuarios locales publicar sus datos", "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar sus datos a una libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquiera que use NextCloud, ownCloud o Pydio! Solo ingrese su ID de Nube Federada en ventana de diálogo de compartir. Se ve algo así como person@cloud.example.com", "Your Federated Cloud ID:" : "Su ID de Nube Federada:", - "Share it:" : "Compartirlo:", + "Share it so your friends can share files with you:" : "Compártalo para que sus amigos puedan compartir archivos con usted. ", "Add to your website" : "Agregar a su sitio web", "Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Buscar usuarios en las libretas de contactos globales y públicas" + "Search global and public address book for users" : "Buscar usuarios en las libretas de contactos globales y públicas", + "Share it:" : "Compartirlo:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/es_MX.json b/apps/federatedfilesharing/l10n/es_MX.json index cab49642c5c..189e71896dc 100644 --- a/apps/federatedfilesharing/l10n/es_MX.json +++ b/apps/federatedfilesharing/l10n/es_MX.json @@ -37,16 +37,19 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud", "Federated Cloud Sharing" : "Compartir en la Nube Federada", "Open documentation" : "Abrir documentación", + "Adjust how people can share between servers." : "Ajustar cómo las personas pueden compartir entre servidores. ", "Allow users on this server to send shares to other servers" : "Permitirle a los usuarios de este servidor enviar elementos compartidos a otros servidores", "Allow users on this server to receive shares from other servers" : "Permitir que los usuarios de este servidor recibir elementos compartidos de otros servidores", "Search global and public address book for users and let local users publish their data" : "Buscar una libreta de direcciones global y pública para los usuarios y permitir a los usuarios locales publicar sus datos", "Allow users to publish their data to a global and public address book" : "Permitir a los usuarios publicar sus datos a una libreta de direcciones global y pública", "Federated Cloud" : "Nube Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquiera que use NextCloud, ownCloud o Pydio! Solo ingrese su ID de Nube Federada en ventana de diálogo de compartir. Se ve algo así como person@cloud.example.com", "Your Federated Cloud ID:" : "Su ID de Nube Federada:", - "Share it:" : "Compartirlo:", + "Share it so your friends can share files with you:" : "Compártalo para que sus amigos puedan compartir archivos con usted. ", "Add to your website" : "Agregar a su sitio web", "Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Buscar usuarios en las libretas de contactos globales y públicas" + "Search global and public address book for users" : "Buscar usuarios en las libretas de contactos globales y públicas", + "Share it:" : "Compartirlo:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/fi.js b/apps/federatedfilesharing/l10n/fi.js index 8274af6c25a..a9ca7cbed9e 100644 --- a/apps/federatedfilesharing/l10n/fi.js +++ b/apps/federatedfilesharing/l10n/fi.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Salli käyttäjien julkaista tietojaan maailmanlaajuisessa ja julkisessa osoitekirjassa", "Federated Cloud" : "Federoitu pilvi", "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:", - "Share it:" : "Jaa se:", "Add to your website" : "Lisää verkkosivuillesi", "Share with me via Nextcloud" : "Jaa kanssani Nextcloudin kautta", "HTML Code:" : "HTML-koodi:", - "Search global and public address book for users" : "Etsi käyttäjiä maailmanlaajuisesta ja julkisesta osoitekirjasta" + "Search global and public address book for users" : "Etsi käyttäjiä maailmanlaajuisesta ja julkisesta osoitekirjasta", + "Share it:" : "Jaa se:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/fi.json b/apps/federatedfilesharing/l10n/fi.json index 0a2dc0193ce..bbe09b8df1f 100644 --- a/apps/federatedfilesharing/l10n/fi.json +++ b/apps/federatedfilesharing/l10n/fi.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Salli käyttäjien julkaista tietojaan maailmanlaajuisessa ja julkisessa osoitekirjassa", "Federated Cloud" : "Federoitu pilvi", "Your Federated Cloud ID:" : "Federoidun pilvesi tunniste:", - "Share it:" : "Jaa se:", "Add to your website" : "Lisää verkkosivuillesi", "Share with me via Nextcloud" : "Jaa kanssani Nextcloudin kautta", "HTML Code:" : "HTML-koodi:", - "Search global and public address book for users" : "Etsi käyttäjiä maailmanlaajuisesta ja julkisesta osoitekirjasta" + "Search global and public address book for users" : "Etsi käyttäjiä maailmanlaajuisesta ja julkisesta osoitekirjasta", + "Share it:" : "Jaa se:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js index 2d2f087a04a..5a32ce609f2 100644 --- a/apps/federatedfilesharing/l10n/fr.js +++ b/apps/federatedfilesharing/l10n/fr.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Autoriser les utilisateurs à publier leurs données dans un carnet d'adresse global et public", "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :", - "Share it:" : "Partager :", "Add to your website" : "Ajouter à votre site web", "Share with me via Nextcloud" : "Partagez avec moi via Nextcloud", "HTML Code:" : "Code HTML :", - "Search global and public address book for users" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs" + "Search global and public address book for users" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs", + "Share it:" : "Partager :" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json index 65f6a55b862..62ba8d7d044 100644 --- a/apps/federatedfilesharing/l10n/fr.json +++ b/apps/federatedfilesharing/l10n/fr.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Autoriser les utilisateurs à publier leurs données dans un carnet d'adresse global et public", "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Votre identifiant Federated Cloud :", - "Share it:" : "Partager :", "Add to your website" : "Ajouter à votre site web", "Share with me via Nextcloud" : "Partagez avec moi via Nextcloud", "HTML Code:" : "Code HTML :", - "Search global and public address book for users" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs" + "Search global and public address book for users" : "Rechercher dans le carnet d'adresse global et public pour les utilisateurs", + "Share it:" : "Partager :" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/hu.js b/apps/federatedfilesharing/l10n/hu.js index 8b9f29f5673..ed692f70a7b 100644 --- a/apps/federatedfilesharing/l10n/hu.js +++ b/apps/federatedfilesharing/l10n/hu.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől", "Federated Cloud" : "Egyesített felhő", "Your Federated Cloud ID:" : "Egyesített felhő azonosító:", - "Share it:" : "Oszd meg:", "Add to your website" : "Adja hozzá saját weboldalához", "Share with me via Nextcloud" : "Ossza meg velem Nextcloud-on keresztül", "HTML Code:" : "HTML kód:", - "Search global and public address book for users" : "Felhasználók keresése a globális és a nyilvános névjegyekben" + "Search global and public address book for users" : "Felhasználók keresése a globális és a nyilvános névjegyekben", + "Share it:" : "Oszd meg:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/hu.json b/apps/federatedfilesharing/l10n/hu.json index b530e6b7a9d..52621eb6785 100644 --- a/apps/federatedfilesharing/l10n/hu.json +++ b/apps/federatedfilesharing/l10n/hu.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Engedélyezze ezen szerver felhasználóinak, hogy megosztásokat fogadjanak más szerverektől", "Federated Cloud" : "Egyesített felhő", "Your Federated Cloud ID:" : "Egyesített felhő azonosító:", - "Share it:" : "Oszd meg:", "Add to your website" : "Adja hozzá saját weboldalához", "Share with me via Nextcloud" : "Ossza meg velem Nextcloud-on keresztül", "HTML Code:" : "HTML kód:", - "Search global and public address book for users" : "Felhasználók keresése a globális és a nyilvános névjegyekben" + "Search global and public address book for users" : "Felhasználók keresése a globális és a nyilvános névjegyekben", + "Share it:" : "Oszd meg:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/ia.js b/apps/federatedfilesharing/l10n/ia.js index e0ad7702824..c4843d69e08 100644 --- a/apps/federatedfilesharing/l10n/ia.js +++ b/apps/federatedfilesharing/l10n/ia.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Permitter usatores in iste servitor a reciper elementos compartite ex altere servitores", "Federated Cloud" : "Nube Federate", "Your Federated Cloud ID:" : "Tu ID de Nube Federate:", - "Share it:" : "Comparti lo:", "Add to your website" : "Adde a tu sito web", "Share with me via Nextcloud" : "Comparti con me via Nextcloud", "HTML Code:" : "Codice HTML:", - "Search global and public address book for users" : "Cercar pro usatores in adressarios global e public" + "Search global and public address book for users" : "Cercar pro usatores in adressarios global e public", + "Share it:" : "Comparti lo:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/ia.json b/apps/federatedfilesharing/l10n/ia.json index 3180fd5604d..88f1cd470f9 100644 --- a/apps/federatedfilesharing/l10n/ia.json +++ b/apps/federatedfilesharing/l10n/ia.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Permitter usatores in iste servitor a reciper elementos compartite ex altere servitores", "Federated Cloud" : "Nube Federate", "Your Federated Cloud ID:" : "Tu ID de Nube Federate:", - "Share it:" : "Comparti lo:", "Add to your website" : "Adde a tu sito web", "Share with me via Nextcloud" : "Comparti con me via Nextcloud", "HTML Code:" : "Codice HTML:", - "Search global and public address book for users" : "Cercar pro usatores in adressarios global e public" + "Search global and public address book for users" : "Cercar pro usatores in adressarios global e public", + "Share it:" : "Comparti lo:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/id.js b/apps/federatedfilesharing/l10n/id.js index 7173d30b1f3..0f61b9fc8dc 100644 --- a/apps/federatedfilesharing/l10n/id.js +++ b/apps/federatedfilesharing/l10n/id.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.", "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Federated Cloud ID Anda:", - "Share it:" : "Bagikan:", "Add to your website" : "Tambahkan pada situs web Anda", "Share with me via Nextcloud" : "Dibagikan pada saya via Nextcloud", "HTML Code:" : "Kode HTML:", - "Search global and public address book for users" : "Cari alamat buku global dan alamat publik untuk pengguna" + "Search global and public address book for users" : "Cari alamat buku global dan alamat publik untuk pengguna", + "Share it:" : "Bagikan:" }, "nplurals=1; plural=0;"); diff --git a/apps/federatedfilesharing/l10n/id.json b/apps/federatedfilesharing/l10n/id.json index bb8070e2505..ae8a103981d 100644 --- a/apps/federatedfilesharing/l10n/id.json +++ b/apps/federatedfilesharing/l10n/id.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.", "Federated Cloud" : "Federated Cloud", "Your Federated Cloud ID:" : "Federated Cloud ID Anda:", - "Share it:" : "Bagikan:", "Add to your website" : "Tambahkan pada situs web Anda", "Share with me via Nextcloud" : "Dibagikan pada saya via Nextcloud", "HTML Code:" : "Kode HTML:", - "Search global and public address book for users" : "Cari alamat buku global dan alamat publik untuk pengguna" + "Search global and public address book for users" : "Cari alamat buku global dan alamat publik untuk pengguna", + "Share it:" : "Bagikan:" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/is.js b/apps/federatedfilesharing/l10n/is.js index 16bbef5aa01..6f064ae34c3 100644 --- a/apps/federatedfilesharing/l10n/is.js +++ b/apps/federatedfilesharing/l10n/is.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Leifa notendum að birta gögnin sín í víðværri og opinberri vistfangaskrá", "Federated Cloud" : "Skýjasamband (federated)", "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):", - "Share it:" : "Deila því:", "Add to your website" : "Bæta við vefsvæðið þitt", "Share with me via Nextcloud" : "Deila með mér í gegnum Nextcloud", "HTML Code:" : "HTML-kóði:", - "Search global and public address book for users" : "Leita að notendum í víðværri og opinberri vistfangaskrá" + "Search global and public address book for users" : "Leita að notendum í víðværri og opinberri vistfangaskrá", + "Share it:" : "Deila því:" }, "nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/federatedfilesharing/l10n/is.json b/apps/federatedfilesharing/l10n/is.json index fedef654b5c..6c8b449f007 100644 --- a/apps/federatedfilesharing/l10n/is.json +++ b/apps/federatedfilesharing/l10n/is.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Leifa notendum að birta gögnin sín í víðværri og opinberri vistfangaskrá", "Federated Cloud" : "Skýjasamband (federated)", "Your Federated Cloud ID:" : "Skýjasambandsauðkennið þitt (Federated Cloud ID):", - "Share it:" : "Deila því:", "Add to your website" : "Bæta við vefsvæðið þitt", "Share with me via Nextcloud" : "Deila með mér í gegnum Nextcloud", "HTML Code:" : "HTML-kóði:", - "Search global and public address book for users" : "Leita að notendum í víðværri og opinberri vistfangaskrá" + "Search global and public address book for users" : "Leita að notendum í víðværri og opinberri vistfangaskrá", + "Share it:" : "Deila því:" },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/it.js b/apps/federatedfilesharing/l10n/it.js index 4d6b132e14b..4690f6e38a6 100644 --- a/apps/federatedfilesharing/l10n/it.js +++ b/apps/federatedfilesharing/l10n/it.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server", "Federated Cloud" : "Cloud federata", "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:", - "Share it:" : "Condividilo:", "Add to your website" : "Aggiungi al tuo sito web", "Share with me via Nextcloud" : "Condividi con me tramite Nextcloud", "HTML Code:" : "Codice HTML:", - "Search global and public address book for users" : "Cerca gli utenti nella rubrica globale e pubblica" + "Search global and public address book for users" : "Cerca gli utenti nella rubrica globale e pubblica", + "Share it:" : "Condividilo:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/it.json b/apps/federatedfilesharing/l10n/it.json index 392f68e686b..edcb497a559 100644 --- a/apps/federatedfilesharing/l10n/it.json +++ b/apps/federatedfilesharing/l10n/it.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server", "Federated Cloud" : "Cloud federata", "Your Federated Cloud ID:" : "Il tuo ID di cloud federata:", - "Share it:" : "Condividilo:", "Add to your website" : "Aggiungi al tuo sito web", "Share with me via Nextcloud" : "Condividi con me tramite Nextcloud", "HTML Code:" : "Codice HTML:", - "Search global and public address book for users" : "Cerca gli utenti nella rubrica globale e pubblica" + "Search global and public address book for users" : "Cerca gli utenti nella rubrica globale e pubblica", + "Share it:" : "Condividilo:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/nb.js b/apps/federatedfilesharing/l10n/nb.js index e5515edc143..f9b8907b49b 100644 --- a/apps/federatedfilesharing/l10n/nb.js +++ b/apps/federatedfilesharing/l10n/nb.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", - "Share it:" : "Del den:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", - "Search global and public address book for users" : "Søk global og offentlige adressebøker etter brukere" + "Search global and public address book for users" : "Søk global og offentlige adressebøker etter brukere", + "Share it:" : "Del den:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/nb.json b/apps/federatedfilesharing/l10n/nb.json index 986739a0e14..4da7e25bfe7 100644 --- a/apps/federatedfilesharing/l10n/nb.json +++ b/apps/federatedfilesharing/l10n/nb.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Tillat brukere å offentliggjøre deres data til en verdensomspennende og offentlig adressebok", "Federated Cloud" : "Sammenknyttet sky", "Your Federated Cloud ID:" : "Din ID for sammenknyttet sky:", - "Share it:" : "Del den:", "Add to your website" : "Legg på nettsiden din", "Share with me via Nextcloud" : "Del med meg via Nextcloud", "HTML Code:" : "HTML-kode:", - "Search global and public address book for users" : "Søk global og offentlige adressebøker etter brukere" + "Search global and public address book for users" : "Søk global og offentlige adressebøker etter brukere", + "Share it:" : "Del den:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/nl.js b/apps/federatedfilesharing/l10n/nl.js index b6eb9737dba..d1e4284fc0d 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Publiek maken van data met een openbaar adresboek toestaan", "Federated Cloud" : "Gefedereerde Cloud", "Your Federated Cloud ID:" : "Je Federated Cloud ID:", - "Share it:" : "Deel het:", "Add to your website" : "Toevoegen aan je website", "Share with me via Nextcloud" : "Deel met mij via Nextcloud", "HTML Code:" : "HTML Code:", - "Search global and public address book for users" : "Doorzoeken van openbare adresboeken voor gebruikers" + "Search global and public address book for users" : "Doorzoeken van openbare adresboeken voor gebruikers", + "Share it:" : "Deel het:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index fa1348d634d..99adef7e355 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Publiek maken van data met een openbaar adresboek toestaan", "Federated Cloud" : "Gefedereerde Cloud", "Your Federated Cloud ID:" : "Je Federated Cloud ID:", - "Share it:" : "Deel het:", "Add to your website" : "Toevoegen aan je website", "Share with me via Nextcloud" : "Deel met mij via Nextcloud", "HTML Code:" : "HTML Code:", - "Search global and public address book for users" : "Doorzoeken van openbare adresboeken voor gebruikers" + "Search global and public address book for users" : "Doorzoeken van openbare adresboeken voor gebruikers", + "Share it:" : "Deel het:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/pl.js b/apps/federatedfilesharing/l10n/pl.js index 8c98322256e..019ffba9121 100644 --- a/apps/federatedfilesharing/l10n/pl.js +++ b/apps/federatedfilesharing/l10n/pl.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Pozwól użytkownikom na publikację ich danych do globalnej i publicznej książki adresowej", "Federated Cloud" : "Stowarzyszona Chmura", "Your Federated Cloud ID:" : "Twoje ID Stowarzyszonej Chmury:", - "Share it:" : "Udostępnij to:", "Add to your website" : "Dodaj do swojej strony", "Share with me via Nextcloud" : "Podziel się ze mną poprzez Nextcloud", "HTML Code:" : "Kod HTML:", - "Search global and public address book for users" : "Szukaj użytkowników w globalnej i publicznej książce adresowej" + "Search global and public address book for users" : "Szukaj użytkowników w globalnej i publicznej książce adresowej", + "Share it:" : "Udostępnij to:" }, "nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/federatedfilesharing/l10n/pl.json b/apps/federatedfilesharing/l10n/pl.json index 02a73c5e571..af30ede91c5 100644 --- a/apps/federatedfilesharing/l10n/pl.json +++ b/apps/federatedfilesharing/l10n/pl.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Pozwól użytkownikom na publikację ich danych do globalnej i publicznej książki adresowej", "Federated Cloud" : "Stowarzyszona Chmura", "Your Federated Cloud ID:" : "Twoje ID Stowarzyszonej Chmury:", - "Share it:" : "Udostępnij to:", "Add to your website" : "Dodaj do swojej strony", "Share with me via Nextcloud" : "Podziel się ze mną poprzez Nextcloud", "HTML Code:" : "Kod HTML:", - "Search global and public address book for users" : "Szukaj użytkowników w globalnej i publicznej książce adresowej" + "Search global and public address book for users" : "Szukaj użytkowników w globalnej i publicznej książce adresowej", + "Share it:" : "Udostępnij to:" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>=14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/pt_BR.js b/apps/federatedfilesharing/l10n/pt_BR.js index 807acf49f35..13d1b1641e3 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.js +++ b/apps/federatedfilesharing/l10n/pt_BR.js @@ -39,16 +39,19 @@ OC.L10N.register( "Share with me through my #Nextcloud Federated Cloud ID" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud", "Federated Cloud Sharing" : "Compartilhamento de Nuvem Federada", "Open documentation" : "Abrir documentação", + "Adjust how people can share between servers." : "Ajustar como as pessoas podem compartilhar entre servidores.", "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores", "Allow users on this server to receive shares from other servers" : "Permitir que os usuários deste servidor recebam compartilhamentos de outros servidores", "Search global and public address book for users and let local users publish their data" : "Pesquise o catálogo de endereços global e público para usuários e deixe os usuários locais publicarem seus dados", "Allow users to publish their data to a global and public address book" : "Permitir que os usuários publiquem seus dados em um catálogo de endereços global e público", "Federated Cloud" : "Nuvem Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Você pode compartilhar com qualquer um que use Nextcloud, ownCloud ou Pydio! Apenas coloque a ID de Nuvem Federada no diálogo de compartilhamento. Isto é algo como person@cloud.example.com", "Your Federated Cloud ID:" : "Sua ID de Nuvem Federada:", - "Share it:" : "Compartilhe-a:", + "Share it so your friends can share files with you:" : "Compartilhe e seus amigos poderão compartilhar arquivos com você:", "Add to your website" : "Adicione ao seu website", "Share with me via Nextcloud" : "Compartilhe comigo via Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público" + "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público", + "Share it:" : "Compartilhe-a:" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/federatedfilesharing/l10n/pt_BR.json b/apps/federatedfilesharing/l10n/pt_BR.json index 9444aa2b27d..108c8f4fb25 100644 --- a/apps/federatedfilesharing/l10n/pt_BR.json +++ b/apps/federatedfilesharing/l10n/pt_BR.json @@ -37,16 +37,19 @@ "Share with me through my #Nextcloud Federated Cloud ID" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nexcloud", "Federated Cloud Sharing" : "Compartilhamento de Nuvem Federada", "Open documentation" : "Abrir documentação", + "Adjust how people can share between servers." : "Ajustar como as pessoas podem compartilhar entre servidores.", "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores", "Allow users on this server to receive shares from other servers" : "Permitir que os usuários deste servidor recebam compartilhamentos de outros servidores", "Search global and public address book for users and let local users publish their data" : "Pesquise o catálogo de endereços global e público para usuários e deixe os usuários locais publicarem seus dados", "Allow users to publish their data to a global and public address book" : "Permitir que os usuários publiquem seus dados em um catálogo de endereços global e público", "Federated Cloud" : "Nuvem Federada", + "You can share with anyone who uses Nextcloud, ownCloud or Pydio! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Você pode compartilhar com qualquer um que use Nextcloud, ownCloud ou Pydio! Apenas coloque a ID de Nuvem Federada no diálogo de compartilhamento. Isto é algo como person@cloud.example.com", "Your Federated Cloud ID:" : "Sua ID de Nuvem Federada:", - "Share it:" : "Compartilhe-a:", + "Share it so your friends can share files with you:" : "Compartilhe e seus amigos poderão compartilhar arquivos com você:", "Add to your website" : "Adicione ao seu website", "Share with me via Nextcloud" : "Compartilhe comigo via Nextcloud", "HTML Code:" : "Código HTML:", - "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público" + "Search global and public address book for users" : "Procurar por usuários em catálogo de endereços global e público", + "Share it:" : "Compartilhe-a:" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/ru.js b/apps/federatedfilesharing/l10n/ru.js index 216a904018b..4931870f4b1 100644 --- a/apps/federatedfilesharing/l10n/ru.js +++ b/apps/federatedfilesharing/l10n/ru.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", - "Share it:" : "Поделиться:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", - "Search global and public address book for users" : "Искать пользователей в глобальной и открытой адресной книге" + "Search global and public address book for users" : "Искать пользователей в глобальной и открытой адресной книге", + "Share it:" : "Поделиться:" }, "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/federatedfilesharing/l10n/ru.json b/apps/federatedfilesharing/l10n/ru.json index c6b337ff03b..bfdf89b87f9 100644 --- a/apps/federatedfilesharing/l10n/ru.json +++ b/apps/federatedfilesharing/l10n/ru.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Резрешить пользователям публиковать свои данные в глобальной и общедосупной адресной книге", "Federated Cloud" : "Федерация облачных хранилищ", "Your Federated Cloud ID:" : "Ваш ID в федерации облачных хранилищ:", - "Share it:" : "Поделиться:", "Add to your website" : "Добавить к себе на сайт", "Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud", "HTML Code:" : "HTML код:", - "Search global and public address book for users" : "Искать пользователей в глобальной и открытой адресной книге" + "Search global and public address book for users" : "Искать пользователей в глобальной и открытой адресной книге", + "Share it:" : "Поделиться:" },"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/federatedfilesharing/l10n/sq.js b/apps/federatedfilesharing/l10n/sq.js index a0c70b3cced..ca6f9791ea0 100644 --- a/apps/federatedfilesharing/l10n/sq.js +++ b/apps/federatedfilesharing/l10n/sq.js @@ -37,9 +37,9 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë", "Federated Cloud" : "Re e Federuar", "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:", - "Share it:" : "Ndajeni:", "Add to your website" : "Shtojeni te sajti juaj", "Share with me via Nextcloud" : "Ndani me mua përmes Nextcloud-it", - "HTML Code:" : "Kod HTML:" + "HTML Code:" : "Kod HTML:", + "Share it:" : "Ndajeni:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/sq.json b/apps/federatedfilesharing/l10n/sq.json index 355b83e85a4..6c83b6e5b64 100644 --- a/apps/federatedfilesharing/l10n/sq.json +++ b/apps/federatedfilesharing/l10n/sq.json @@ -35,9 +35,9 @@ "Allow users on this server to receive shares from other servers" : "Lejoju përdoruesve në këtë shërbyes të marrin ndarje nga shërbyes të tjerë", "Federated Cloud" : "Re e Federuar", "Your Federated Cloud ID:" : "ID-ja juaj për Re të Federuar:", - "Share it:" : "Ndajeni:", "Add to your website" : "Shtojeni te sajti juaj", "Share with me via Nextcloud" : "Ndani me mua përmes Nextcloud-it", - "HTML Code:" : "Kod HTML:" + "HTML Code:" : "Kod HTML:", + "Share it:" : "Ndajeni:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js index a3851e6b82b..6921ab5d30d 100644 --- a/apps/federatedfilesharing/l10n/sv.js +++ b/apps/federatedfilesharing/l10n/sv.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar", "Federated Cloud" : "Federerat Moln", "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID:", - "Share it:" : "Dela detta:", "Add to your website" : "Lägg till på din hemsida", "Share with me via Nextcloud" : "Dela med mig via Nextcloud", "HTML Code:" : "HTML Kod:", - "Search global and public address book for users" : "Sök global och offentlig adressbok för användare" + "Search global and public address book for users" : "Sök global och offentlig adressbok för användare", + "Share it:" : "Dela detta:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json index 02fc7d82b07..f4ebd245e16 100644 --- a/apps/federatedfilesharing/l10n/sv.json +++ b/apps/federatedfilesharing/l10n/sv.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar", "Federated Cloud" : "Federerat Moln", "Your Federated Cloud ID:" : "Ditt Federerade Moln-ID:", - "Share it:" : "Dela detta:", "Add to your website" : "Lägg till på din hemsida", "Share with me via Nextcloud" : "Dela med mig via Nextcloud", "HTML Code:" : "HTML Kod:", - "Search global and public address book for users" : "Sök global och offentlig adressbok för användare" + "Search global and public address book for users" : "Sök global och offentlig adressbok för användare", + "Share it:" : "Dela detta:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/tr.js b/apps/federatedfilesharing/l10n/tr.js index c1d9a655557..e6f2a47d2cb 100644 --- a/apps/federatedfilesharing/l10n/tr.js +++ b/apps/federatedfilesharing/l10n/tr.js @@ -45,10 +45,10 @@ OC.L10N.register( "Allow users to publish their data to a global and public address book" : "Kullanıcıların bilgilerini genel ve herkese açık bir adres defterinde paylaşabilsin", "Federated Cloud" : "Birleşmiş Bulut", "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:", - "Share it:" : "Paylaşın:", "Add to your website" : "Web sitenize ekleyin", "Share with me via Nextcloud" : "Benimle Nextcloud üzerinden paylaşın", "HTML Code:" : "HTML Kodu:", - "Search global and public address book for users" : "Genel ve herkese açık adres defterinde kullanıcı ara" + "Search global and public address book for users" : "Genel ve herkese açık adres defterinde kullanıcı ara", + "Share it:" : "Paylaşın:" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/federatedfilesharing/l10n/tr.json b/apps/federatedfilesharing/l10n/tr.json index c9969087598..ab676fc5cde 100644 --- a/apps/federatedfilesharing/l10n/tr.json +++ b/apps/federatedfilesharing/l10n/tr.json @@ -43,10 +43,10 @@ "Allow users to publish their data to a global and public address book" : "Kullanıcıların bilgilerini genel ve herkese açık bir adres defterinde paylaşabilsin", "Federated Cloud" : "Birleşmiş Bulut", "Your Federated Cloud ID:" : "Birleşmiş Bulut Kimliğiniz:", - "Share it:" : "Paylaşın:", "Add to your website" : "Web sitenize ekleyin", "Share with me via Nextcloud" : "Benimle Nextcloud üzerinden paylaşın", "HTML Code:" : "HTML Kodu:", - "Search global and public address book for users" : "Genel ve herkese açık adres defterinde kullanıcı ara" + "Search global and public address book for users" : "Genel ve herkese açık adres defterinde kullanıcı ara", + "Share it:" : "Paylaşın:" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/federatedfilesharing/l10n/zh_CN.js b/apps/federatedfilesharing/l10n/zh_CN.js index 82976dcb250..aafe0322188 100644 --- a/apps/federatedfilesharing/l10n/zh_CN.js +++ b/apps/federatedfilesharing/l10n/zh_CN.js @@ -43,10 +43,10 @@ OC.L10N.register( "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享", "Federated Cloud" : "联合云", "Your Federated Cloud ID:" : "你的联合云ID:", - "Share it:" : "分享它:", "Add to your website" : "添加到您的网站", "Share with me via Nextcloud" : "通过联合云与我共享", "HTML Code:" : "HTML 代码:", - "Search global and public address book for users" : "在全局和公开地址簿中寻找用户" + "Search global and public address book for users" : "在全局和公开地址簿中寻找用户", + "Share it:" : "分享它:" }, "nplurals=1; plural=0;"); diff --git a/apps/federatedfilesharing/l10n/zh_CN.json b/apps/federatedfilesharing/l10n/zh_CN.json index b173ada4d53..2c51760c964 100644 --- a/apps/federatedfilesharing/l10n/zh_CN.json +++ b/apps/federatedfilesharing/l10n/zh_CN.json @@ -41,10 +41,10 @@ "Allow users on this server to receive shares from other servers" : "允许用户从其他服务器接收分享", "Federated Cloud" : "联合云", "Your Federated Cloud ID:" : "你的联合云ID:", - "Share it:" : "分享它:", "Add to your website" : "添加到您的网站", "Share with me via Nextcloud" : "通过联合云与我共享", "HTML Code:" : "HTML 代码:", - "Search global and public address book for users" : "在全局和公开地址簿中寻找用户" + "Search global and public address book for users" : "在全局和公开地址簿中寻找用户", + "Share it:" : "分享它:" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index 6b5b5a2daef..db85caf65fa 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -1069,6 +1069,8 @@ return OC.MimeType.getIconUrl('dir-shared'); } else if (fileInfo.mountType === 'external-root') { return OC.MimeType.getIconUrl('dir-external'); + } else if (fileInfo.mountType !== undefined && fileInfo.mountType !== '') { + return OC.MimeType.getIconUrl('dir-' + fileInfo.mountType); } return OC.MimeType.getIconUrl('dir'); } diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index 2f89e7956e1..62860215eca 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -121,6 +121,7 @@ OC.L10N.register( "Select all" : "Wybierz wszystko", "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ść.", + "No favorites yet" : "Brak jeszcze ulubionych", "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Shared with you" : "Udostępnione dla Ciebie", "Shared with others" : "Udostępnione przez Ciebie", diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index 65022458e40..ab3d703873e 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -119,6 +119,7 @@ "Select all" : "Wybierz wszystko", "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ść.", + "No favorites yet" : "Brak jeszcze ulubionych", "Files and folders you mark as favorite will show up here" : "Pliki i katalogi, które oznaczysz jako ulubione wyświetlą się tutaj", "Shared with you" : "Udostępnione dla Ciebie", "Shared with others" : "Udostępnione przez Ciebie", diff --git a/apps/files/lib/Helper.php b/apps/files/lib/Helper.php index c3d80957913..d2cebce5ddc 100644 --- a/apps/files/lib/Helper.php +++ b/apps/files/lib/Helper.php @@ -157,12 +157,9 @@ class Helper { $entry['isShareMountPoint'] = $i['is_share_mount_point']; } $mountType = null; - if ($i->isShared()) { - $mountType = 'shared'; - } else if ($i->isMounted()) { - $mountType = 'external'; - } - if ($mountType !== null) { + $mount = $i->getMountPoint(); + $mountType = $mount->getMountType(); + if ($mountType !== '') { if ($i->getInternalPath() === '') { $mountType .= '-root'; } diff --git a/apps/files_external/css/settings.css b/apps/files_external/css/settings.css index 610bc2f0e6b..bac89e26b09 100644 --- a/apps/files_external/css/settings.css +++ b/apps/files_external/css/settings.css @@ -114,3 +114,7 @@ td.mountPoint, td.backend { width:160px; } #externalStorage .mountOptionsDropdown { margin-right: 40px; } + +.nav-icon-external-storage { + background-image: url('../img/app-dark.svg?v=1'); +} diff --git a/apps/files_external/l10n/cs.js b/apps/files_external/l10n/cs.js index 5808d649dd3..822e764d7ab 100644 --- a/apps/files_external/l10n/cs.js +++ b/apps/files_external/l10n/cs.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Zadejte prosím platný klíč a tajné heslo aplikace.", "Step 1 failed. Exception: %s" : "Selhal krok 1. Výjimka: %s", "Step 2 failed. Exception: %s" : "Selhal krok 2. Výjimka: %s", + "External storages" : "Externí úložiště", "External storage" : "Externí úložiště", "Dropbox App Configuration" : "Nastavení aplikace Dropbox", "Google Drive App Configuration" : "Nastavení aplikace Disk Google", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Jméno služby", "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)", - "External storages" : "Externí úložiště", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL podpora v PHP není povolena nebo nainstalována. Není možné připojit %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP podpora v PHP není povolena nebo nainstalována. Není možné připojit %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" není instalováno. Není možné připojit %s. Prosím požádejte svého správce systému o instalaci.", diff --git a/apps/files_external/l10n/cs.json b/apps/files_external/l10n/cs.json index 4fdbaaf822f..4ffcf3cc676 100644 --- a/apps/files_external/l10n/cs.json +++ b/apps/files_external/l10n/cs.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Zadejte prosím platný klíč a tajné heslo aplikace.", "Step 1 failed. Exception: %s" : "Selhal krok 1. Výjimka: %s", "Step 2 failed. Exception: %s" : "Selhal krok 2. Výjimka: %s", + "External storages" : "Externí úložiště", "External storage" : "Externí úložiště", "Dropbox App Configuration" : "Nastavení aplikace Dropbox", "Google Drive App Configuration" : "Nastavení aplikace Disk Google", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Jméno služby", "Request timeout (seconds)" : "Čas vypršení požadavku (sekundy)", - "External storages" : "Externí úložiště", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL podpora v PHP není povolena nebo nainstalována. Není možné připojit %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP podpora v PHP není povolena nebo nainstalována. Není možné připojit %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" není instalováno. Není možné připojit %s. Prosím požádejte svého správce systému o instalaci.", diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js index 2b157e979f8..17054839f9a 100644 --- a/apps/files_external/l10n/de.js +++ b/apps/files_external/l10n/de.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Bitte einen gültigen Anwendungsschlüssel mit Sicherheitsschlüssel eingeben.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", + "External storages" : "Externer Speicher", "External storage" : "Externer Speicher", "Dropbox App Configuration" : "Dropbox-App Konfiguration", "Google Drive App Configuration" : "Google Drive - App Konfiguration", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Openstack-Objektspeicher", "Service name" : "Service Name", "Request timeout (seconds)" : "Anfrage -Timeout ( Sekunden)", - "External storages" : "Externer Speicher", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die cURL-Unterstützung von PHP ist deaktiviert oder nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die FTP-Unterstützung von PHP ist deaktiviert oder nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json index fb21d169690..8e8a0bf87e2 100644 --- a/apps/files_external/l10n/de.json +++ b/apps/files_external/l10n/de.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Bitte einen gültigen Anwendungsschlüssel mit Sicherheitsschlüssel eingeben.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", + "External storages" : "Externer Speicher", "External storage" : "Externer Speicher", "Dropbox App Configuration" : "Dropbox-App Konfiguration", "Google Drive App Configuration" : "Google Drive - App Konfiguration", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "Openstack-Objektspeicher", "Service name" : "Service Name", "Request timeout (seconds)" : "Anfrage -Timeout ( Sekunden)", - "External storages" : "Externer Speicher", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die cURL-Unterstützung von PHP ist deaktiviert oder nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die FTP-Unterstützung von PHP ist deaktiviert oder nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie Sich zur Installation an den Systemadministrator.", diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js index d60ea5c3750..31abc0d21a6 100644 --- a/apps/files_external/l10n/de_DE.js +++ b/apps/files_external/l10n/de_DE.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Bitte tragen Sie einen gültigen App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", + "External storages" : "Externer Speicher", "External storage" : "Externer Speicher", "Dropbox App Configuration" : "Dropbox-App Konfiguration", "Google Drive App Configuration" : "Google Drive - App Konfiguration", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Openstack-Objektspeicher", "Service name" : "Name des Dienstes", "Request timeout (seconds)" : "Anfrage-Zeitüberschreitung (Sekunden)", - "External storages" : "Externer Speicher", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. %s konnte nicht hinzugefügt werden Bitte wenden Sie sich bezüglich Aktivierung oder Installation an Ihren Administrator.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. %s konnte nicht hinzugefügt werden Bitte wenden Sie sich bezüglich Aktivierung oder Installation an Ihren Administrator.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ist nicht installiert. %s konnte nicht hinzugefügt werden. Bitte wenden Sie sich zur Installation an Ihren Administrator.", diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json index 09e5558bba7..a2ea06f1f19 100644 --- a/apps/files_external/l10n/de_DE.json +++ b/apps/files_external/l10n/de_DE.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Bitte tragen Sie einen gültigen App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", + "External storages" : "Externer Speicher", "External storage" : "Externer Speicher", "Dropbox App Configuration" : "Dropbox-App Konfiguration", "Google Drive App Configuration" : "Google Drive - App Konfiguration", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "Openstack-Objektspeicher", "Service name" : "Name des Dienstes", "Request timeout (seconds)" : "Anfrage-Zeitüberschreitung (Sekunden)", - "External storages" : "Externer Speicher", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. %s konnte nicht hinzugefügt werden Bitte wenden Sie sich bezüglich Aktivierung oder Installation an Ihren Administrator.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. %s konnte nicht hinzugefügt werden Bitte wenden Sie sich bezüglich Aktivierung oder Installation an Ihren Administrator.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ist nicht installiert. %s konnte nicht hinzugefügt werden. Bitte wenden Sie sich zur Installation an Ihren Administrator.", diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js index fbd000cf388..be945df3026 100644 --- a/apps/files_external/l10n/el.js +++ b/apps/files_external/l10n/el.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Παρακαλούμε δώστε έγκυρο κλειδί εφαρμογής και μυστικό.", "Step 1 failed. Exception: %s" : "Το βήμα 1 απέτυχε. Εξαίρεση: %s", "Step 2 failed. Exception: %s" : "Το βήμα 2 απέτυχε. Εξαίρεση: %s", + "External storages" : "Εξωτερική αποθήκευση", "External storage" : "Εξωτερική αποθήκευση", "Dropbox App Configuration" : "Ρυθμίσεις εφαρμογής Dropbox", "Google Drive App Configuration" : "Ρυθμίσεις εφαρμογής Google Drive", @@ -101,7 +102,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack", "Service name" : "Όνομα υπηρεσίας", "Request timeout (seconds)" : "Χρονικό όριο αιτήματος (δευτερόλεπτα)", - "External storages" : "Εξωτερική αποθήκευση", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Η cURL υποστήριξη στην PHP δεν είναι ενεργοποιημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε από τον διαχειριστή του συστήματός σας να το εγκαταστήσει. ", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Η FTP υποστήριξη στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε τον διαχειριστή του συστήματός σας να το εγκατασταστήσει. ", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" δεν είναι εγκατεστημένο. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε τον διαχειριστή του συστήματός σας να το εγκαταστήσει. ", diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json index d7df7428a41..0ddbc13e172 100644 --- a/apps/files_external/l10n/el.json +++ b/apps/files_external/l10n/el.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Παρακαλούμε δώστε έγκυρο κλειδί εφαρμογής και μυστικό.", "Step 1 failed. Exception: %s" : "Το βήμα 1 απέτυχε. Εξαίρεση: %s", "Step 2 failed. Exception: %s" : "Το βήμα 2 απέτυχε. Εξαίρεση: %s", + "External storages" : "Εξωτερική αποθήκευση", "External storage" : "Εξωτερική αποθήκευση", "Dropbox App Configuration" : "Ρυθμίσεις εφαρμογής Dropbox", "Google Drive App Configuration" : "Ρυθμίσεις εφαρμογής Google Drive", @@ -99,7 +100,6 @@ "OpenStack Object Storage" : "Αποθήκη αντικειμένων OpenStack", "Service name" : "Όνομα υπηρεσίας", "Request timeout (seconds)" : "Χρονικό όριο αιτήματος (δευτερόλεπτα)", - "External storages" : "Εξωτερική αποθήκευση", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Η cURL υποστήριξη στην PHP δεν είναι ενεργοποιημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε από τον διαχειριστή του συστήματός σας να το εγκαταστήσει. ", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Η FTP υποστήριξη στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε τον διαχειριστή του συστήματός σας να το εγκατασταστήσει. ", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" δεν είναι εγκατεστημένο. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλούμε ζητήστε τον διαχειριστή του συστήματός σας να το εγκαταστήσει. ", diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 06df3f93827..91a0abcf988 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Por favor facilite una clave de app y una clave secreta válidas.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", + "External storages" : "Almacenamientos externos", "External storage" : "Almacenamiento externo", "Dropbox App Configuration" : "Configuración de la app de Dropbox", "Google Drive App Configuration" : "Configuración de la app de Google Drive", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Almacenamiento de objeto OpenStack", "Service name" : "Nombre del servicio", "Request timeout (seconds)" : "Tiempo agotado para petición (segundos)", - "External storages" : "Almacenamientos externos", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para FTP desde PHP no esta habilitado o instalado. Montar el %s no ha sido posible. Por favor consulta al administrador de tu sistema para que lo instale.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" no está instalado. El montaje de %s no es posible. Por favor, pregunte a su administrador del sistema para instalarlo.", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index d7044228dee..ce2532a02cc 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Por favor facilite una clave de app y una clave secreta válidas.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", + "External storages" : "Almacenamientos externos", "External storage" : "Almacenamiento externo", "Dropbox App Configuration" : "Configuración de la app de Dropbox", "Google Drive App Configuration" : "Configuración de la app de Google Drive", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "Almacenamiento de objeto OpenStack", "Service name" : "Nombre del servicio", "Request timeout (seconds)" : "Tiempo agotado para petición (segundos)", - "External storages" : "Almacenamientos externos", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador del sistema que lo instale.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para FTP desde PHP no esta habilitado o instalado. Montar el %s no ha sido posible. Por favor consulta al administrador de tu sistema para que lo instale.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" no está instalado. El montaje de %s no es posible. Por favor, pregunte a su administrador del sistema para instalarlo.", diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js index 9ce0ae70113..c25448eda80 100644 --- a/apps/files_external/l10n/es_MX.js +++ b/apps/files_external/l10n/es_MX.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Favor de proporcionar una llave de aplicación y secreto válidos.", "Step 1 failed. Exception: %s" : "Falla en el paso 1: Excepción %s", "Step 2 failed. Exception: %s" : "Paso 2 falló. Excepción: %s", + "External storages" : "Almacenamiento externo", "External storage" : "Almacenamiento externo", "Dropbox App Configuration" : "Configuración de la aplicación Dropbox", "Google Drive App Configuration" : "Configuración de Aplicación Google Drive", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nombre del servicio", "Request timeout (seconds)" : "Tiemo de vida de la solicitud (segudos)", - "External storages" : "Almacenamiento externo", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para cURL en PHP no se encuentra habilitado o instalado. El montaje de %s no es posible. Favor de solicitar a su administador su instalación. ", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para FTP en PHP no se encuentra habilitado o instalado. El montaje de %s no es posible. Favor de solicitar a su administador su instalación. ", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" no se encuentra instalado. El montaje de %s no es posible. Favor de solicitar a su administrador su instalación. ", diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json index 8e2d1966d9d..9f3a451349e 100644 --- a/apps/files_external/l10n/es_MX.json +++ b/apps/files_external/l10n/es_MX.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Favor de proporcionar una llave de aplicación y secreto válidos.", "Step 1 failed. Exception: %s" : "Falla en el paso 1: Excepción %s", "Step 2 failed. Exception: %s" : "Paso 2 falló. Excepción: %s", + "External storages" : "Almacenamiento externo", "External storage" : "Almacenamiento externo", "Dropbox App Configuration" : "Configuración de la aplicación Dropbox", "Google Drive App Configuration" : "Configuración de Aplicación Google Drive", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nombre del servicio", "Request timeout (seconds)" : "Tiemo de vida de la solicitud (segudos)", - "External storages" : "Almacenamiento externo", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para cURL en PHP no se encuentra habilitado o instalado. El montaje de %s no es posible. Favor de solicitar a su administador su instalación. ", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "El soporte para FTP en PHP no se encuentra habilitado o instalado. El montaje de %s no es posible. Favor de solicitar a su administador su instalación. ", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" no se encuentra instalado. El montaje de %s no es posible. Favor de solicitar a su administrador su instalación. ", diff --git a/apps/files_external/l10n/fi.js b/apps/files_external/l10n/fi.js index 56c0a6def74..5b1a6449af6 100644 --- a/apps/files_external/l10n/fi.js +++ b/apps/files_external/l10n/fi.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Sovellusavain ja salaus ovat virheelliset", "Step 1 failed. Exception: %s" : "Vaihe 1 epäonnistui. Poikkeus: %s", "Step 2 failed. Exception: %s" : "Vaihe 2 epäonnistui. Poikkeus: %s", + "External storages" : "Ulkoiset tallennustilat", "External storage" : "Ulkoinen tallennustila", "Dropbox App Configuration" : "Dropbox-sovelluksen määritys", "Google Drive App Configuration" : "Google Drive -sovelluksen määritys", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", "Request timeout (seconds)" : "Pyynnön aikakatkaisu (sekunneissa)", - "External storages" : "Ulkoiset tallennustilat", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cULR tuki PHPsta ei ole aktivoitu tai asennettu. Kohteen %s liittäminen ei ole mahdollista. Ota yhteyttä järjestelmänvalvojaan asentaaksesi puuttuvan osan.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tuki PHPsta ei ole aktivoitu tai asennettu. Kohteen %s liittäminen ei ole mahdollista. Ota yhteyttä järjestelmänvalvojaan asentaaksesi puuttuvan osan.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan puuttuva kohde.", diff --git a/apps/files_external/l10n/fi.json b/apps/files_external/l10n/fi.json index 41d488409d2..1a5c2872c5b 100644 --- a/apps/files_external/l10n/fi.json +++ b/apps/files_external/l10n/fi.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Sovellusavain ja salaus ovat virheelliset", "Step 1 failed. Exception: %s" : "Vaihe 1 epäonnistui. Poikkeus: %s", "Step 2 failed. Exception: %s" : "Vaihe 2 epäonnistui. Poikkeus: %s", + "External storages" : "Ulkoiset tallennustilat", "External storage" : "Ulkoinen tallennustila", "Dropbox App Configuration" : "Dropbox-sovelluksen määritys", "Google Drive App Configuration" : "Google Drive -sovelluksen määritys", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Palvelun nimi", "Request timeout (seconds)" : "Pyynnön aikakatkaisu (sekunneissa)", - "External storages" : "Ulkoiset tallennustilat", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cULR tuki PHPsta ei ole aktivoitu tai asennettu. Kohteen %s liittäminen ei ole mahdollista. Ota yhteyttä järjestelmänvalvojaan asentaaksesi puuttuvan osan.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP tuki PHPsta ei ole aktivoitu tai asennettu. Kohteen %s liittäminen ei ole mahdollista. Ota yhteyttä järjestelmänvalvojaan asentaaksesi puuttuvan osan.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan puuttuva kohde.", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index 80c3ff58a04..7ecc68b0096 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Veuillez fournir une clé d'application et un mot de passe valides.", "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", + "External storages" : "Stockages externe", "External storage" : "Stockage externe", "Dropbox App Configuration" : "Configuration de l'application Dropbox", "Google Drive App Configuration" : "Configuration de l'application Google Drive", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nom du service", "Request timeout (seconds)" : "Délai d'expiration des requêtes (en secondes)", - "External storages" : "Stockages externe", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Le support de cURL dans PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Veuillez demander à votre administrateur système de l'installer.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Le support du FTP dans PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Merci de demander à votre administrateur de l'installer.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" n'est pas installé. Le montage de %s n'est pas possible. Merci de demander à l'administrateur système de l'installer.", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index 7f19073c228..057f5e0420a 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Veuillez fournir une clé d'application et un mot de passe valides.", "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", + "External storages" : "Stockages externe", "External storage" : "Stockage externe", "Dropbox App Configuration" : "Configuration de l'application Dropbox", "Google Drive App Configuration" : "Configuration de l'application Google Drive", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nom du service", "Request timeout (seconds)" : "Délai d'expiration des requêtes (en secondes)", - "External storages" : "Stockages externe", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Le support de cURL dans PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Veuillez demander à votre administrateur système de l'installer.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Le support du FTP dans PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Merci de demander à votre administrateur de l'installer.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" n'est pas installé. Le montage de %s n'est pas possible. Merci de demander à l'administrateur système de l'installer.", diff --git a/apps/files_external/l10n/hu.js b/apps/files_external/l10n/hu.js index 0329d216743..d25aacc4867 100644 --- a/apps/files_external/l10n/hu.js +++ b/apps/files_external/l10n/hu.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Kérlek adj meg egy érvényes alkalmazás kulcsot és jelszót.", "Step 1 failed. Exception: %s" : "1. lépés sikertelen. Kivétel: %s", "Step 2 failed. Exception: %s" : "2. lépés sikertelen. Kivétel: %s", + "External storages" : "Külső tárolók", "External storage" : "Külső tárolók", "Dropbox App Configuration" : "Dropbox alkalmazás beállítás", "Google Drive App Configuration" : "Google Drive alkalmazás beállítás", @@ -93,7 +94,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Szolgáltatás neve", "Request timeout (seconds)" : "Időtúllépés (másodperc)", - "External storages" : "Külső tárolók", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", diff --git a/apps/files_external/l10n/hu.json b/apps/files_external/l10n/hu.json index 4b6a6a25a48..483f59a4156 100644 --- a/apps/files_external/l10n/hu.json +++ b/apps/files_external/l10n/hu.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Kérlek adj meg egy érvényes alkalmazás kulcsot és jelszót.", "Step 1 failed. Exception: %s" : "1. lépés sikertelen. Kivétel: %s", "Step 2 failed. Exception: %s" : "2. lépés sikertelen. Kivétel: %s", + "External storages" : "Külső tárolók", "External storage" : "Külső tárolók", "Dropbox App Configuration" : "Dropbox alkalmazás beállítás", "Google Drive App Configuration" : "Google Drive alkalmazás beállítás", @@ -91,7 +92,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Szolgáltatás neve", "Request timeout (seconds)" : "Időtúllépés (másodperc)", - "External storages" : "Külső tárolók", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "A cURL támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Az FTP támogatás, a PHP-ban nincs engedélyezve vagy telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s nincs telepítve. %s csatolása lehetetlen. Kérd meg a rendszergazdádat, hogy telepítse.", diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js index 3247a96e000..071d4862025 100644 --- a/apps/files_external/l10n/id.js +++ b/apps/files_external/l10n/id.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Silakan berikan kunci dan kerahasiaan aplikasi yang benar.", "Step 1 failed. Exception: %s" : "Langkah 1 gagal. Kecuali: %s", "Step 2 failed. Exception: %s" : "Langkah 2 gagal. Kecuali: %s", + "External storages" : "Penyimpanan Eksternal", "External storage" : "Penyimpanan eksternal", "Dropbox App Configuration" : "Konfigurasi Aplikasi Dropbox", "Google Drive App Configuration" : "Konfigurasi Aplikasi Google Drive", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nama layanan", "Request timeout (seconds)" : "Minta waktu habis (detik)", - "External storages" : "Penyimpanan Eksternal", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Dukungan cURL di PHP tidak diaktifkan atau terpasang. Mengaitkan %s tidak memungkinkan. Harap tanyakan administrator sistem anda untuk memasangnya.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Dukungan FTP di PHP tidak diaktifkan atau terpasang. Mengaitkan %s tidak memungkinkan. Harap tanya administrator sistem anda untuk memasangnya.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" tidak terpasang. Mengaitkan %s tidak memungkinkan. Harap tanya administrator sistem anda untuk memasangnya.", diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json index 3326954fb98..941781a838a 100644 --- a/apps/files_external/l10n/id.json +++ b/apps/files_external/l10n/id.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Silakan berikan kunci dan kerahasiaan aplikasi yang benar.", "Step 1 failed. Exception: %s" : "Langkah 1 gagal. Kecuali: %s", "Step 2 failed. Exception: %s" : "Langkah 2 gagal. Kecuali: %s", + "External storages" : "Penyimpanan Eksternal", "External storage" : "Penyimpanan eksternal", "Dropbox App Configuration" : "Konfigurasi Aplikasi Dropbox", "Google Drive App Configuration" : "Konfigurasi Aplikasi Google Drive", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nama layanan", "Request timeout (seconds)" : "Minta waktu habis (detik)", - "External storages" : "Penyimpanan Eksternal", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Dukungan cURL di PHP tidak diaktifkan atau terpasang. Mengaitkan %s tidak memungkinkan. Harap tanyakan administrator sistem anda untuk memasangnya.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Dukungan FTP di PHP tidak diaktifkan atau terpasang. Mengaitkan %s tidak memungkinkan. Harap tanya administrator sistem anda untuk memasangnya.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" tidak terpasang. Mengaitkan %s tidak memungkinkan. Harap tanya administrator sistem anda untuk memasangnya.", diff --git a/apps/files_external/l10n/is.js b/apps/files_external/l10n/is.js index 2362f0c0326..970dc094bac 100644 --- a/apps/files_external/l10n/is.js +++ b/apps/files_external/l10n/is.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Settu inn gildan forritslykil og leynilykil (secret).", "Step 1 failed. Exception: %s" : "Skref 1 mistókst. Undantekning: %s", "Step 2 failed. Exception: %s" : "Skref 2 mistókst. Undantekning: %s", + "External storages" : "Utanáliggjandi gagnageymslur", "External storage" : "Ytri gagnageymsla", "Dropbox App Configuration" : "Uppsetning Dropbox forrits", "Google Drive App Configuration" : "Uppsetning Google Drive forrits", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Heiti á þjónustu", "Request timeout (seconds)" : "Tímamörk á beiðni (sekúndur)", - "External storages" : "Utanáliggjandi gagnageymslur", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Stuðningur við cURL í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Stuðningur við FTP í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" er ekki uppsett. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", diff --git a/apps/files_external/l10n/is.json b/apps/files_external/l10n/is.json index 7d0fcedb985..375053e0a4d 100644 --- a/apps/files_external/l10n/is.json +++ b/apps/files_external/l10n/is.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Settu inn gildan forritslykil og leynilykil (secret).", "Step 1 failed. Exception: %s" : "Skref 1 mistókst. Undantekning: %s", "Step 2 failed. Exception: %s" : "Skref 2 mistókst. Undantekning: %s", + "External storages" : "Utanáliggjandi gagnageymslur", "External storage" : "Ytri gagnageymsla", "Dropbox App Configuration" : "Uppsetning Dropbox forrits", "Google Drive App Configuration" : "Uppsetning Google Drive forrits", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Heiti á þjónustu", "Request timeout (seconds)" : "Tímamörk á beiðni (sekúndur)", - "External storages" : "Utanáliggjandi gagnageymslur", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Stuðningur við cURL í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Stuðningur við FTP í PHP er ekki virkjaður eða ekki uppsettur. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" er ekki uppsett. Tenging %s í skráakerfi er ekki möguleg. Biddu kerfisstjórann þinn um að setja þetta upp.", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index eedb78f0368..ecc49b7413a 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Fornisci chiave e segreto dell'applicazione validi.", "Step 1 failed. Exception: %s" : "Fase 1 non riuscita. Eccezione: %s", "Step 2 failed. Exception: %s" : "Fase 2 non riuscita. Eccezione: %s", + "External storages" : "Archiviazioni esterne", "External storage" : "Archiviazione esterna", "Dropbox App Configuration" : "Configurazione applicazione Dropbox", "Google Drive App Configuration" : "Configurazione applicazione Google Drive", @@ -38,6 +39,7 @@ OC.L10N.register( "Credentials saved" : "Credenziali salvate", "Credentials saving failed" : "Salvataggio delle credenziali non riuscito", "Credentials required" : "Credenziali richieste", + "Storage with ID \"%d\" not found" : "Archiviazione con ID \"%d\" non trovata", "Invalid backend or authentication mechanism class" : "Motore o classe del meccanismo di autenticazione non valido", "Invalid mount point" : "Punto di mount non valido", "Objectstore forbidden" : "Objectstore vietato", @@ -48,6 +50,7 @@ OC.L10N.register( "Unsatisfied authentication mechanism parameters" : "Parametri del meccanismo di autenticazione non soddisfatti", "Insufficient data: %s" : "Dati insufficienti: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "Archiviazione con ID \"%d\" non modificabile dall'utente", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", @@ -100,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nome servizio", "Request timeout (seconds)" : "Tempo massimo della richiesta (secondi)", - "External storages" : "Archiviazioni esterne", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Il supporto cURL di PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Il supporto FTP in PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" non è installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index eae20972e47..532d18a281b 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Fornisci chiave e segreto dell'applicazione validi.", "Step 1 failed. Exception: %s" : "Fase 1 non riuscita. Eccezione: %s", "Step 2 failed. Exception: %s" : "Fase 2 non riuscita. Eccezione: %s", + "External storages" : "Archiviazioni esterne", "External storage" : "Archiviazione esterna", "Dropbox App Configuration" : "Configurazione applicazione Dropbox", "Google Drive App Configuration" : "Configurazione applicazione Google Drive", @@ -36,6 +37,7 @@ "Credentials saved" : "Credenziali salvate", "Credentials saving failed" : "Salvataggio delle credenziali non riuscito", "Credentials required" : "Credenziali richieste", + "Storage with ID \"%d\" not found" : "Archiviazione con ID \"%d\" non trovata", "Invalid backend or authentication mechanism class" : "Motore o classe del meccanismo di autenticazione non valido", "Invalid mount point" : "Punto di mount non valido", "Objectstore forbidden" : "Objectstore vietato", @@ -46,6 +48,7 @@ "Unsatisfied authentication mechanism parameters" : "Parametri del meccanismo di autenticazione non soddisfatti", "Insufficient data: %s" : "Dati insufficienti: %s", "%s" : "%s", + "Storage with ID \"%d\" is not user editable" : "Archiviazione con ID \"%d\" non modificabile dall'utente", "Access key" : "Chiave di accesso", "Secret key" : "Chiave segreta", "Builtin" : "Integrata", @@ -98,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Nome servizio", "Request timeout (seconds)" : "Tempo massimo della richiesta (secondi)", - "External storages" : "Archiviazioni esterne", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Il supporto cURL di PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Il supporto FTP in PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" non è installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index fa923be83c7..0223d60fc64 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "有効なアプリのキーとパスワードを入力してください。", "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s", "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s", + "External storages" : "外部ストレージ", "External storage" : "外部ストレージ", "Dropbox App Configuration" : "Dropbox アプリ設定", "Google Drive App Configuration" : "Google アプリ設定", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack ObjectStorage", "Service name" : "サービス名", "Request timeout (seconds)" : "リクエストがタイムアウトするまでの秒数", - "External storages" : "外部ストレージ", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index d8b415df9c6..b80c3f3fddc 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "有効なアプリのキーとパスワードを入力してください。", "Step 1 failed. Exception: %s" : "ステップ 1 の実行に失敗しました。例外: %s", "Step 2 failed. Exception: %s" : "ステップ 2 の実行に失敗しました。例外: %s", + "External storages" : "外部ストレージ", "External storage" : "外部ストレージ", "Dropbox App Configuration" : "Dropbox アプリ設定", "Google Drive App Configuration" : "Google アプリ設定", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "OpenStack ObjectStorage", "Service name" : "サービス名", "Request timeout (seconds)" : "リクエストがタイムアウトするまでの秒数", - "External storages" : "外部ストレージ", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPでのcURLのサポートが有効になっていないか、インストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHPのFTPサポートが有効になっていないか、インストールされていません。%s のマウントは不可能です。システム管理者にインストールを依頼してください。", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\"はインストールされていません。 %s のマウントは不可能です。システム管理者にインストールを依頼してください。", diff --git a/apps/files_external/l10n/ko.js b/apps/files_external/l10n/ko.js index c0578979e22..ac0a4dda076 100644 --- a/apps/files_external/l10n/ko.js +++ b/apps/files_external/l10n/ko.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "올바른 앱 키와 비밀 값을 입력하십시오.", "Step 1 failed. Exception: %s" : "1단계 실패. 예외: %s", "Step 2 failed. Exception: %s" : "2단계 실패. 예외: %s", + "External storages" : "외부 저장소", "External storage" : "외부 저장소", "Dropbox App Configuration" : "Dropbox 앱 설정", "Google Drive App Configuration" : "구글 드라이브 앱 설정", @@ -97,7 +98,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack 객체 저장소", "Service name" : "서비스 이름", "Request timeout (seconds)" : "요청 시간 제한(초)", - "External storages" : "외부 저장소", "No external storage configured" : "외부 저장소가 설정되지 않았음", "You can add external storages in the personal settings" : "개인 설정에서 외부 저장소를 추가할 수 있습니다", "Name" : "이름", diff --git a/apps/files_external/l10n/ko.json b/apps/files_external/l10n/ko.json index 7ae25545ffc..6b09b8076f6 100644 --- a/apps/files_external/l10n/ko.json +++ b/apps/files_external/l10n/ko.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "올바른 앱 키와 비밀 값을 입력하십시오.", "Step 1 failed. Exception: %s" : "1단계 실패. 예외: %s", "Step 2 failed. Exception: %s" : "2단계 실패. 예외: %s", + "External storages" : "외부 저장소", "External storage" : "외부 저장소", "Dropbox App Configuration" : "Dropbox 앱 설정", "Google Drive App Configuration" : "구글 드라이브 앱 설정", @@ -95,7 +96,6 @@ "OpenStack Object Storage" : "OpenStack 객체 저장소", "Service name" : "서비스 이름", "Request timeout (seconds)" : "요청 시간 제한(초)", - "External storages" : "외부 저장소", "No external storage configured" : "외부 저장소가 설정되지 않았음", "You can add external storages in the personal settings" : "개인 설정에서 외부 저장소를 추가할 수 있습니다", "Name" : "이름", diff --git a/apps/files_external/l10n/nb.js b/apps/files_external/l10n/nb.js index 72c33458ae7..c9ba7b267da 100644 --- a/apps/files_external/l10n/nb.js +++ b/apps/files_external/l10n/nb.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Vær vennlig å oppgi gyldig appnøkkel og hemmelighet.", "Step 1 failed. Exception: %s" : "Steg 1 mislyktes. Unntak: %s", "Step 2 failed. Exception: %s" : "Steg 2 mislyktes. Unntak: %s", + "External storages" : "Ekstern lagring", "External storage" : "Ekstern lagringsplass", "Dropbox App Configuration" : "Oppsett for Dropbox-program", "Google Drive App Configuration" : "Oppsett av Google Drive-program", @@ -30,7 +31,7 @@ OC.L10N.register( "There was an error with message: " : "Det oppstod en feil med melding: ", "External mount error" : "Ekstern oppkoblingsfeil", "external-storage" : "eksternlagring", - "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windowsnettverks-disker: Tomt svar fra serveren", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windowsnettverks-disker: Tomt svar fra tjeneren", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Noen av de oppsatte eksterne oppkoblingspunktene er ikke tilkoblet. Klikk på de røde raden(e) for mer informasjon.", "Please enter the credentials for the {mount} mount" : "Legg inn påloggingsdetaljer for {mount}", "Username" : "Brukernavn", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack objektlager", "Service name" : "Tjenestenavn", "Request timeout (seconds)" : "Tidsavbrudd for forespørsel (sekunder)", - "External storages" : "Ekstern lagring", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> Støtte for cURL i PHP er ikke aktivert eller installert. Oppkobling av %s er ikke mulig. Be systemadministratoren om å installere det.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å få dette installert.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Vennligst spør din systemadministrator om å installere det.", diff --git a/apps/files_external/l10n/nb.json b/apps/files_external/l10n/nb.json index 7d36ac32850..f78d09efd4b 100644 --- a/apps/files_external/l10n/nb.json +++ b/apps/files_external/l10n/nb.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Vær vennlig å oppgi gyldig appnøkkel og hemmelighet.", "Step 1 failed. Exception: %s" : "Steg 1 mislyktes. Unntak: %s", "Step 2 failed. Exception: %s" : "Steg 2 mislyktes. Unntak: %s", + "External storages" : "Ekstern lagring", "External storage" : "Ekstern lagringsplass", "Dropbox App Configuration" : "Oppsett for Dropbox-program", "Google Drive App Configuration" : "Oppsett av Google Drive-program", @@ -28,7 +29,7 @@ "There was an error with message: " : "Det oppstod en feil med melding: ", "External mount error" : "Ekstern oppkoblingsfeil", "external-storage" : "eksternlagring", - "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windowsnettverks-disker: Tomt svar fra serveren", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Klarte ikke å hente listen over oppkoblingspunkter for Windowsnettverks-disker: Tomt svar fra tjeneren", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Noen av de oppsatte eksterne oppkoblingspunktene er ikke tilkoblet. Klikk på de røde raden(e) for mer informasjon.", "Please enter the credentials for the {mount} mount" : "Legg inn påloggingsdetaljer for {mount}", "Username" : "Brukernavn", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack objektlager", "Service name" : "Tjenestenavn", "Request timeout (seconds)" : "Tidsavbrudd for forespørsel (sekunder)", - "External storages" : "Ekstern lagring", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> Støtte for cURL i PHP er ikke aktivert eller installert. Oppkobling av %s er ikke mulig. Be systemadministratoren om å installere det.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å få dette installert.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Vennligst spør din systemadministrator om å installere det.", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 733238772d2..15c579b9e7e 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Geef een geldige app sleutel en geheime sleutel op.", "Step 1 failed. Exception: %s" : "Stap 1 is mislukt. Uitzondering: %s", "Step 2 failed. Exception: %s" : "Stap 2 is mislukt. Uitzondering: %s", + "External storages" : "Externe opslag", "External storage" : "Externe opslag", "Dropbox App Configuration" : "Dropbox app configuratie", "Google Drive App Configuration" : "Google Drive app configuratie", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Servicenaam", "Request timeout (seconds)" : "Aanvraag time-out (seconds)", - "External storages" : "Externe opslag", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index ff460235d40..5000b7d586c 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Geef een geldige app sleutel en geheime sleutel op.", "Step 1 failed. Exception: %s" : "Stap 1 is mislukt. Uitzondering: %s", "Step 2 failed. Exception: %s" : "Stap 2 is mislukt. Uitzondering: %s", + "External storages" : "Externe opslag", "External storage" : "Externe opslag", "Dropbox App Configuration" : "Dropbox app configuratie", "Google Drive App Configuration" : "Google Drive app configuratie", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Servicenaam", "Request timeout (seconds)" : "Aanvraag time-out (seconds)", - "External storages" : "Externe opslag", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Curl ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je systeembeheerder dit te installeren.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP ondersteuning in PHP is niet ingeschakeld of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder dit te installeren.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag je beheerder om dit te installeren.", diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js index d35058891e3..ecad2378aed 100644 --- a/apps/files_external/l10n/pl.js +++ b/apps/files_external/l10n/pl.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Proszę podać prawidłowy klucz aplikacji i klucz sekretny.", "Step 1 failed. Exception: %s" : "Krok 1 błędny. Błąd: %s", "Step 2 failed. Exception: %s" : "Krok 2 błędny. Błąd: %s", + "External storages" : "Zewnętrzne zasoby dyskowe", "External storage" : "Zewnętrzne zasoby dyskowe", "Dropbox App Configuration" : "Konfiguracja aplikacji Dropbox", "Google Drive App Configuration" : "Konfiguracja aplikacji Google Drive", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Magazyn obiektów OpenStack", "Service name" : "Nazwa serwisu", "Request timeout (seconds)" : "Limit czasu żądania (sekundy)", - "External storages" : "Zewnętrzne zasoby dyskowe", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Obsługa cURL w PHP jest wyłączona lub nie jest zainstalowana. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby ją zainstalował.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Obsługa FTP w PHP jest wyłączona lub nie jest zainstalowana. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby ją zainstalował.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" nie jest zainstalowane. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby dokonał instalacji.", diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json index 3de59414e30..55a1c33e28a 100644 --- a/apps/files_external/l10n/pl.json +++ b/apps/files_external/l10n/pl.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Proszę podać prawidłowy klucz aplikacji i klucz sekretny.", "Step 1 failed. Exception: %s" : "Krok 1 błędny. Błąd: %s", "Step 2 failed. Exception: %s" : "Krok 2 błędny. Błąd: %s", + "External storages" : "Zewnętrzne zasoby dyskowe", "External storage" : "Zewnętrzne zasoby dyskowe", "Dropbox App Configuration" : "Konfiguracja aplikacji Dropbox", "Google Drive App Configuration" : "Konfiguracja aplikacji Google Drive", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "Magazyn obiektów OpenStack", "Service name" : "Nazwa serwisu", "Request timeout (seconds)" : "Limit czasu żądania (sekundy)", - "External storages" : "Zewnętrzne zasoby dyskowe", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Obsługa cURL w PHP jest wyłączona lub nie jest zainstalowana. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby ją zainstalował.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Obsługa FTP w PHP jest wyłączona lub nie jest zainstalowana. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby ją zainstalował.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" nie jest zainstalowane. Zamontowanie %s jest niemożliwe. Proszę poprosić swojego administratora systemu, żeby dokonał instalacji.", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index dc307664c29..3f3cc25b6c2 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Por favor forneça uma chave de aplicativo e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", + "External storages" : "Armazenamentos externos", "External storage" : "Armazenamento Externo", "Dropbox App Configuration" : "Configuração do Aplicativo Dropbox", "Google Drive App Configuration" : "Configuração do Aplicativo Google Drive", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "External storages" : "Armazenamentos externos", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 8703e577756..0475feb5d7b 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Por favor forneça uma chave de aplicativo e segurança válidos.", "Step 1 failed. Exception: %s" : "Passo 1 falhou. Exceção: %s", "Step 2 failed. Exception: %s" : "Passo 2 falhou. Exceção: %s", + "External storages" : "Armazenamentos externos", "External storage" : "Armazenamento Externo", "Dropbox App Configuration" : "Configuração do Aplicativo Dropbox", "Google Drive App Configuration" : "Configuração do Aplicativo Google Drive", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", - "External storages" : "Armazenamentos externos", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a cURL no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "O suporte a FTP no PHP não está habilitado ou instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. A montagem de %s não é possível. Por favor, solicite a instalação ao administrador do sistema.", diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js index c6ad1041781..7e8f493c759 100644 --- a/apps/files_external/l10n/ru.js +++ b/apps/files_external/l10n/ru.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Пожалуйста укажите корректные ключ и секрет приложения.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", + "External storages" : "Внешние хранилища", "External storage" : "Внешнее хранилище", "Dropbox App Configuration" : "Настройка приложения Dropbox", "Google Drive App Configuration" : "Настройка приложения Google Drive", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Хранилище объектов OpenStack", "Service name" : "Название сервиса", "Request timeout (seconds)" : "Таймаут запроса (в секундах)", - "External storages" : "Внешние хранилища", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.", diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json index b14a55a4a18..b238ed72c59 100644 --- a/apps/files_external/l10n/ru.json +++ b/apps/files_external/l10n/ru.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Пожалуйста укажите корректные ключ и секрет приложения.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", + "External storages" : "Внешние хранилища", "External storage" : "Внешнее хранилище", "Dropbox App Configuration" : "Настройка приложения Dropbox", "Google Drive App Configuration" : "Настройка приложения Google Drive", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "Хранилище объектов OpenStack", "Service name" : "Название сервиса", "Request timeout (seconds)" : "Таймаут запроса (в секундах)", - "External storages" : "Внешние хранилища", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка cURL в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Поддержка FTP в PHP не включена и/или не установлена, монтирование %s невозможно. Обратитесь к вашему системному администратору.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" не установлен, монтирование %s невозможно. Обратитесь к вашему системному администратору.", diff --git a/apps/files_external/l10n/sq.js b/apps/files_external/l10n/sq.js index b36623211b5..a112d2f7933 100644 --- a/apps/files_external/l10n/sq.js +++ b/apps/files_external/l10n/sq.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Ju lutemi jepni një kyç dhe një të fshehtë aplikacioni të vlefshme.", "Step 1 failed. Exception: %s" : "Hapi 1 dështoi. Përjashtim: %s", "Step 2 failed. Exception: %s" : "Hapi 2 dështoi. Përjashtim: %s", + "External storages" : "Kujtesë e jashtëme", "External storage" : "Depozitë e jashtme", "Dropbox App Configuration" : "Formësim i Aplikacionit Dropbox", "Google Drive App Configuration" : "Formësim i Aplikacionit Google Drive", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "Depozitë OpenStack Object", "Service name" : "Emër shërbimi", "Request timeout (seconds)" : "Kohë skadimi kërkese (sekonda)", - "External storages" : "Kujtesë e jashtëme", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Mbështetja e cURL në PHP nuk është e instaluar ose e aktivizuar. Lidhja e %s nuk është e mundur. Ju lutemi kërkojini administratorin të sistemit tuaj që ta instaloj.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Mbështetja e FTP në PHP nuk është e aktivizuar ose instaluar.Lidhja e %s nuk është e mundur.Ju lutem kërkojini administratorit të sistemit tuaj që ta instalojë.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" nuk është instaluar.Montimi i %s nuk është i mundur.Ju lutem kërkojini administratorit të sistemit tuaj ta instalojë.", diff --git a/apps/files_external/l10n/sq.json b/apps/files_external/l10n/sq.json index 9d3b25c1961..228c285b2d3 100644 --- a/apps/files_external/l10n/sq.json +++ b/apps/files_external/l10n/sq.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Ju lutemi jepni një kyç dhe një të fshehtë aplikacioni të vlefshme.", "Step 1 failed. Exception: %s" : "Hapi 1 dështoi. Përjashtim: %s", "Step 2 failed. Exception: %s" : "Hapi 2 dështoi. Përjashtim: %s", + "External storages" : "Kujtesë e jashtëme", "External storage" : "Depozitë e jashtme", "Dropbox App Configuration" : "Formësim i Aplikacionit Dropbox", "Google Drive App Configuration" : "Formësim i Aplikacionit Google Drive", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "Depozitë OpenStack Object", "Service name" : "Emër shërbimi", "Request timeout (seconds)" : "Kohë skadimi kërkese (sekonda)", - "External storages" : "Kujtesë e jashtëme", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Mbështetja e cURL në PHP nuk është e instaluar ose e aktivizuar. Lidhja e %s nuk është e mundur. Ju lutemi kërkojini administratorin të sistemit tuaj që ta instaloj.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Mbështetja e FTP në PHP nuk është e aktivizuar ose instaluar.Lidhja e %s nuk është e mundur.Ju lutem kërkojini administratorit të sistemit tuaj që ta instalojë.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" nuk është instaluar.Montimi i %s nuk është i mundur.Ju lutem kërkojini administratorit të sistemit tuaj ta instalojë.", diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js index fcb91f14ae4..3d3abb7409d 100644 --- a/apps/files_external/l10n/sv.js +++ b/apps/files_external/l10n/sv.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Vänligen ange en giltig applikationsnyckel och hemlig fras.", "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", + "External storages" : "Extern Lagring", "External storage" : "Extern lagring", "Dropbox App Configuration" : "Dropbox Konfiguration", "Google Drive App Configuration" : "Google Drive Konfiguration", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Namn på tjänst", "Request timeout (seconds)" : "Sekunder för anslutningsförsök", - "External storages" : "Extern Lagring", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-stöd i PHP är inte aktiverat eller har inte installerats. Montering av %s är inte möjlig. Be din systemadministratör om installation.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP-stöd i PHP är inte aktiverat eller har inte installerats. Montering av %s är inte möjlig. Be din systemadministratör om installation.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" är inte installerad. Montering av %s är inte möjlig. Be din systemadministratör om installation.", diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json index 6fd3d8d34ef..adae13cb453 100644 --- a/apps/files_external/l10n/sv.json +++ b/apps/files_external/l10n/sv.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Vänligen ange en giltig applikationsnyckel och hemlig fras.", "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", + "External storages" : "Extern Lagring", "External storage" : "Extern lagring", "Dropbox App Configuration" : "Dropbox Konfiguration", "Google Drive App Configuration" : "Google Drive Konfiguration", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "OpenStack Object Storage", "Service name" : "Namn på tjänst", "Request timeout (seconds)" : "Sekunder för anslutningsförsök", - "External storages" : "Extern Lagring", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "cURL-stöd i PHP är inte aktiverat eller har inte installerats. Montering av %s är inte möjlig. Be din systemadministratör om installation.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "FTP-stöd i PHP är inte aktiverat eller har inte installerats. Montering av %s är inte möjlig. Be din systemadministratör om installation.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" är inte installerad. Montering av %s är inte möjlig. Be din systemadministratör om installation.", diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js index 0c255199915..8b1092b09ad 100644 --- a/apps/files_external/l10n/tr.js +++ b/apps/files_external/l10n/tr.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "Lütfen geçerli bir uygulama anahtarı ve parola yazın.", "Step 1 failed. Exception: %s" : "1. Adım tamamlanamadı. Sorun: %s", "Step 2 failed. Exception: %s" : "2. Adım tamamlanamadı. Sorun: %s", + "External storages" : "Dış depolama", "External storage" : "Dış depolama", "Dropbox App Configuration" : "Dropbox Uygulaması Yapılandırması", "Google Drive App Configuration" : "Google Drive Uygulaması Yapılandırması", @@ -102,7 +103,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack Nesne Depolama", "Service name" : "Hizmet adı", "Request timeout (seconds)" : "İstek zaman aşımı (saniye)", - "External storages" : "Dış depolama", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s kurulmamış. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json index 7d5b940897e..2712aaead8f 100644 --- a/apps/files_external/l10n/tr.json +++ b/apps/files_external/l10n/tr.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "Lütfen geçerli bir uygulama anahtarı ve parola yazın.", "Step 1 failed. Exception: %s" : "1. Adım tamamlanamadı. Sorun: %s", "Step 2 failed. Exception: %s" : "2. Adım tamamlanamadı. Sorun: %s", + "External storages" : "Dış depolama", "External storage" : "Dış depolama", "Dropbox App Configuration" : "Dropbox Uygulaması Yapılandırması", "Google Drive App Configuration" : "Google Drive Uygulaması Yapılandırması", @@ -100,7 +101,6 @@ "OpenStack Object Storage" : "OpenStack Nesne Depolama", "Service name" : "Hizmet adı", "Request timeout (seconds)" : "İstek zaman aşımı (saniye)", - "External storages" : "Dış depolama", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "%s kurulmamış. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js index 5661efc4f14..f0d7b2f47e0 100644 --- a/apps/files_external/l10n/zh_CN.js +++ b/apps/files_external/l10n/zh_CN.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "请提供有效的 appkey 和密钥.", "Step 1 failed. Exception: %s" : "步骤 1 失败. 异常: %s", "Step 2 failed. Exception: %s" : "步骤 2 失败. 异常: %s", + "External storages" : "外部存储", "External storage" : "外部存储", "Dropbox App Configuration" : "Dropbox 配置", "Google Drive App Configuration" : "Google Drive 配置", @@ -100,7 +101,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack 对象存储", "Service name" : "服务名称", "Request timeout (seconds)" : "请求超时时间 (秒)", - "External storages" : "外部存储", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装或启用 PHP 中的 cURL 支持. 无法挂载 %s. 请联系您的系统管理员安装.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装或启用 PHP 中的 FTP 支持. 无法挂载 %s. 请联系您的系统管理员安装.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装 \"%s\". 无法挂载 %s. 请联系您的系统管理员安装.", diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json index d7201ec7cf7..e12a494bd09 100644 --- a/apps/files_external/l10n/zh_CN.json +++ b/apps/files_external/l10n/zh_CN.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "请提供有效的 appkey 和密钥.", "Step 1 failed. Exception: %s" : "步骤 1 失败. 异常: %s", "Step 2 failed. Exception: %s" : "步骤 2 失败. 异常: %s", + "External storages" : "外部存储", "External storage" : "外部存储", "Dropbox App Configuration" : "Dropbox 配置", "Google Drive App Configuration" : "Google Drive 配置", @@ -98,7 +99,6 @@ "OpenStack Object Storage" : "OpenStack 对象存储", "Service name" : "服务名称", "Request timeout (seconds)" : "请求超时时间 (秒)", - "External storages" : "外部存储", "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装或启用 PHP 中的 cURL 支持. 无法挂载 %s. 请联系您的系统管理员安装.", "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装或启用 PHP 中的 FTP 支持. 无法挂载 %s. 请联系您的系统管理员安装.", "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "没有安装 \"%s\". 无法挂载 %s. 请联系您的系统管理员安装.", diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js index b404016f934..277fbb8454f 100644 --- a/apps/files_external/l10n/zh_TW.js +++ b/apps/files_external/l10n/zh_TW.js @@ -6,6 +6,7 @@ OC.L10N.register( "Please provide a valid app key and secret." : "請提供有效的應用程式金鑰及密碼", "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s", "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s", + "External storages" : "外部儲存", "External storage" : "外部儲存", "Dropbox App Configuration" : "Dropbox 應用設置", "Google Drive App Configuration" : "Google Drive 應用設置", @@ -83,7 +84,6 @@ OC.L10N.register( "OpenStack Object Storage" : "OpenStack 物件儲存", "Service name" : "服務名稱", "Request timeout (seconds)" : "請求超時 (秒)", - "External storages" : "外部儲存", "No external storage configured" : "目前尚未配置任何外部儲存", "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定", "Name" : "名稱", diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json index 8a63c441d39..8eb787c3584 100644 --- a/apps/files_external/l10n/zh_TW.json +++ b/apps/files_external/l10n/zh_TW.json @@ -4,6 +4,7 @@ "Please provide a valid app key and secret." : "請提供有效的應用程式金鑰及密碼", "Step 1 failed. Exception: %s" : "步驟 1 失敗,出現異常: %s", "Step 2 failed. Exception: %s" : "步驟 2 失敗,出現異常: %s", + "External storages" : "外部儲存", "External storage" : "外部儲存", "Dropbox App Configuration" : "Dropbox 應用設置", "Google Drive App Configuration" : "Google Drive 應用設置", @@ -81,7 +82,6 @@ "OpenStack Object Storage" : "OpenStack 物件儲存", "Service name" : "服務名稱", "Request timeout (seconds)" : "請求超時 (秒)", - "External storages" : "外部儲存", "No external storage configured" : "目前尚未配置任何外部儲存", "You can add external storages in the personal settings" : "在個人設定裡您可以自行加入外部儲存設定", "Name" : "名稱", diff --git a/apps/files_external/lib/Config/ExternalMountPoint.php b/apps/files_external/lib/Config/ExternalMountPoint.php new file mode 100644 index 00000000000..76a090b7ec4 --- /dev/null +++ b/apps/files_external/lib/Config/ExternalMountPoint.php @@ -0,0 +1,30 @@ +<?php +/** + * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_External\Config; + +use OC\Files\Mount\MountPoint; + +class ExternalMountPoint extends MountPoint { + public function getMountType() { + return 'external'; + } +} diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index 9d8c179dd32..bbd79994e39 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -88,7 +88,7 @@ ?> <form data-can-create="<?php echo $canCreateMounts?'true':'false' ?>" id="files_external" class="section" data-encryption-enabled="<?php echo $_['encryptionEnabled']?'true': 'false'; ?>"> - <h2><?php p($l->t('External storage')); ?></h2> + <h2 data-anchor-name="external-storage"><?php p($l->t('External storage')); ?></h2> <?php if (isset($_['dependencies']) and ($_['dependencies']<>'') and $canCreateMounts) print_unescaped(''.$_['dependencies'].''); ?> <table id="externalStorage" class="grid" data-admin='<?php print_unescaped(json_encode($_['visibilityType'] === BackendService::VISIBILITY_ADMIN)); ?>'> <thead> diff --git a/apps/files_sharing/lib/Controller/ShareesAPIController.php b/apps/files_sharing/lib/Controller/ShareesAPIController.php index eb65727c770..7d345efb3eb 100644 --- a/apps/files_sharing/lib/Controller/ShareesAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareesAPIController.php @@ -654,13 +654,15 @@ class ShareesAPIController extends OCSController { protected function getLookup($search) { $isEnabled = $this->config->getAppValue('files_sharing', 'lookupServerEnabled', 'no'); + $lookupServerUrl = $this->config->getSystemValue('lookup_server', 'https://lookup.nextcloud.com'); + $lookupServerUrl = rtrim($lookupServerUrl, '/'); $result = []; if($isEnabled === 'yes') { try { $client = $this->clientService->newClient(); $response = $client->get( - 'https://lookup.nextcloud.com/users?search=' . urlencode($search), + $lookupServerUrl . '/users?search=' . urlencode($search), [ 'timeout' => 10, 'connect_timeout' => 3, diff --git a/apps/files_sharing/lib/SharedMount.php b/apps/files_sharing/lib/SharedMount.php index d5ae303390f..b42682ab2a8 100644 --- a/apps/files_sharing/lib/SharedMount.php +++ b/apps/files_sharing/lib/SharedMount.php @@ -258,4 +258,8 @@ class SharedMount extends MountPoint implements MoveableMount { return -1; } } + + public function getMountType() { + return 'shared'; + } } diff --git a/apps/lookup_server_connector/appinfo/app.php b/apps/lookup_server_connector/appinfo/app.php index 639eeafcf3f..f0d624d5f3a 100644 --- a/apps/lookup_server_connector/appinfo/app.php +++ b/apps/lookup_server_connector/appinfo/app.php @@ -28,18 +28,24 @@ $dispatcher->addListener('OC\AccountManager::userUpdated', function(\Symfony\Com \OC::$server->getAppDataDir('identityproof'), \OC::$server->getCrypto() ); + + $config = \OC::$server->getConfig(); + $lookupServer = $config->getSystemValue('lookup_server', ''); + $updateLookupServer = new \OCA\LookupServerConnector\UpdateLookupServer( - new \OC\Accounts\AccountManager(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()), - \OC::$server->getConfig(), - \OC::$server->getSecureRandom(), + new \OC\Accounts\AccountManager( + \OC::$server->getDatabaseConnection(), + \OC::$server->getEventDispatcher(), + \OC::$server->getJobList() + ), \OC::$server->getHTTPClientService(), - $keyManager, new \OC\Security\IdentityProof\Signer( $keyManager, new \OC\AppFramework\Utility\TimeFactory(), \OC::$server->getUserManager() ), - \OC::$server->getJobList() + \OC::$server->getJobList(), + $lookupServer ); $updateLookupServer->userUpdated($user); }); diff --git a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php index f33323b2d4f..faeef05da17 100644 --- a/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php +++ b/apps/lookup_server_connector/lib/BackgroundJobs/RetryJob.php @@ -26,6 +26,7 @@ namespace OCA\LookupServerConnector\BackgroundJobs; use OC\BackgroundJob\Job; use OCP\BackgroundJob\IJobList; use OCP\Http\Client\IClientService; +use OCP\ILogger; class RetryJob extends Job { /** @var IClientService */ @@ -36,21 +37,28 @@ class RetryJob extends Job { private $lookupServer = 'https://lookup.nextcloud.com/users'; /** - * @param IClientService|null $clientService - * @param IJobList|null $jobList + * @param IClientService $clientService + * @param IJobList $jobList */ - public function __construct(IClientService $clientService = null, - IJobList $jobList = null) { - if($clientService !== null) { - $this->clientService = $clientService; - } else { - $this->clientService = \OC::$server->getHTTPClientService(); - } - if($jobList !== null) { - $this->jobList = $jobList; - } else { - $this->jobList = \OC::$server->getJobList(); + public function __construct(IClientService $clientService, + IJobList $jobList) { + $this->clientService = $clientService; + $this->jobList = $jobList; + } + + /** + * run the job, then remove it from the jobList + * + * @param JobList $jobList + * @param ILogger $logger + */ + public function execute($jobList, ILogger $logger = null) { + + if ($this->shouldRun($this->argument)) { + parent::execute($jobList, $logger); + $jobList->remove($this, $this->argument); } + } protected function run($argument) { diff --git a/apps/lookup_server_connector/lib/UpdateLookupServer.php b/apps/lookup_server_connector/lib/UpdateLookupServer.php index 86865311725..3a7c2fa7236 100644 --- a/apps/lookup_server_connector/lib/UpdateLookupServer.php +++ b/apps/lookup_server_connector/lib/UpdateLookupServer.php @@ -23,14 +23,11 @@ namespace OCA\LookupServerConnector; use OC\Accounts\AccountManager; -use OC\Security\IdentityProof\Manager; use OC\Security\IdentityProof\Signer; use OCA\LookupServerConnector\BackgroundJobs\RetryJob; use OCP\BackgroundJob\IJobList; use OCP\Http\Client\IClientService; -use OCP\IConfig; use OCP\IUser; -use OCP\Security\ISecureRandom; /** * Class UpdateLookupServer @@ -40,44 +37,36 @@ use OCP\Security\ISecureRandom; class UpdateLookupServer { /** @var AccountManager */ private $accountManager; - /** @var IConfig */ - private $config; - /** @var ISecureRandom */ - private $secureRandom; /** @var IClientService */ private $clientService; - /** @var Manager */ - private $keyManager; /** @var Signer */ private $signer; /** @var IJobList */ private $jobList; /** @var string URL point to lookup server */ - private $lookupServer = 'https://lookup.nextcloud.com/users'; + private $lookupServer = 'https://lookup.nextcloud.com'; /** * @param AccountManager $accountManager - * @param IConfig $config - * @param ISecureRandom $secureRandom * @param IClientService $clientService - * @param Manager $manager * @param Signer $signer * @param IJobList $jobList + * @param string $lookupServer if nothing is given we use the default lookup server */ public function __construct(AccountManager $accountManager, - IConfig $config, - ISecureRandom $secureRandom, IClientService $clientService, - Manager $manager, Signer $signer, - IJobList $jobList) { + IJobList $jobList, + $lookupServer = '') { $this->accountManager = $accountManager; - $this->config = $config; - $this->secureRandom = $secureRandom; $this->clientService = $clientService; - $this->keyManager = $manager; $this->signer = $signer; $this->jobList = $jobList; + if ($lookupServer !== '') { + $this->lookupServer = $lookupServer; + } + $this->lookupServer = rtrim($this->lookupServer, '/'); + $this->lookupServer .= '/users'; } /** @@ -113,6 +102,13 @@ class UpdateLookupServer { $dataArray['website'] = isset($publicData[AccountManager::PROPERTY_WEBSITE]) ? $publicData[AccountManager::PROPERTY_WEBSITE]['value'] : ''; $dataArray['twitter'] = isset($publicData[AccountManager::PROPERTY_TWITTER]) ? $publicData[AccountManager::PROPERTY_TWITTER]['value'] : ''; $dataArray['phone'] = isset($publicData[AccountManager::PROPERTY_PHONE]) ? $publicData[AccountManager::PROPERTY_PHONE]['value'] : ''; + $dataArray['twitter_signature'] = isset($publicData[AccountManager::PROPERTY_TWITTER]['signature']) ? $publicData[AccountManager::PROPERTY_TWITTER]['signature'] : ''; + $dataArray['website_signature'] = isset($publicData[AccountManager::PROPERTY_WEBSITE]['signature']) ? $publicData[AccountManager::PROPERTY_WEBSITE]['signature'] : ''; + $dataArray['verificationStatus'] = + [ + AccountManager::PROPERTY_WEBSITE => isset($publicData[AccountManager::PROPERTY_WEBSITE]) ? $publicData[AccountManager::PROPERTY_WEBSITE]['verified'] : '', + AccountManager::PROPERTY_TWITTER => isset($publicData[AccountManager::PROPERTY_TWITTER]) ? $publicData[AccountManager::PROPERTY_TWITTER]['verified'] : '', + ]; } $dataArray = $this->signer->sign('lookupserver', $dataArray, $user); diff --git a/apps/sharebymail/l10n/de.js b/apps/sharebymail/l10n/de.js index ee50fbe21dc..05fccf7252c 100644 --- a/apps/sharebymail/l10n/de.js +++ b/apps/sharebymail/l10n/de.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Sie teilen {file} mit {email} über E-Mail", "%3$s shared %1$s with %2$s by mail" : "%3$s teilt %1$s mit %2$s über E-mail", "{actor} shared {file} with {email} by mail" : "{actor} teilt {file} mit {email} über E-Mail", + "Password to access %1$s was sent to %2s" : "Passwort für den Zugriff auf %1$s wurde an %2s versandt ", + "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", + "Password to access %1$s was sent to you" : " Passwort für den Zugriff auf %1$s wurde an Dich versandt ", + "Password to access {file} was sent to you" : " Passwort für den Zugriff auf {file} wurde an Dich versandt ", "Sharing %s failed, this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erstelltes Passwort kann nicht versandt werden. Bitte gebe in Deinen persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche es erneut.", "Failed to send share by E-mail" : "Senden der Freigabe über Mail ist fehlgeschlagen", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Im Teilen-Dialog kannst Du jederzeit ein anderes Passwort wählen.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Share by mail" : "Geteilt über eine E-Mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Ermöglicht Nutzern eine personalisierte Verknüpfung zu einer Datei oder einem Ordner durch Eingabe einer E-Mail-Adresse zu teilen.", "Send password by mail" : "Passwort per Mail senden", "Enforce password protection" : "Passwortschutz erzwingen", "Failed to create the E-mail" : "Erstellen der E-Mail ist fehlgeschalgen", diff --git a/apps/sharebymail/l10n/de.json b/apps/sharebymail/l10n/de.json index 17257a93d23..1d19e66c376 100644 --- a/apps/sharebymail/l10n/de.json +++ b/apps/sharebymail/l10n/de.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Sie teilen {file} mit {email} über E-Mail", "%3$s shared %1$s with %2$s by mail" : "%3$s teilt %1$s mit %2$s über E-mail", "{actor} shared {file} with {email} by mail" : "{actor} teilt {file} mit {email} über E-Mail", + "Password to access %1$s was sent to %2s" : "Passwort für den Zugriff auf %1$s wurde an %2s versandt ", + "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", + "Password to access %1$s was sent to you" : " Passwort für den Zugriff auf %1$s wurde an Dich versandt ", + "Password to access {file} was sent to you" : " Passwort für den Zugriff auf {file} wurde an Dich versandt ", "Sharing %s failed, this item is already shared with %s" : "Freigabe von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wird", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erstelltes Passwort kann nicht versandt werden. Bitte gebe in Deinen persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche es erneut.", "Failed to send share by E-mail" : "Senden der Freigabe über Mail ist fehlgeschlagen", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Im Teilen-Dialog kannst Du jederzeit ein anderes Passwort wählen.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Share by mail" : "Geteilt über eine E-Mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Ermöglicht Nutzern eine personalisierte Verknüpfung zu einer Datei oder einem Ordner durch Eingabe einer E-Mail-Adresse zu teilen.", "Send password by mail" : "Passwort per Mail senden", "Enforce password protection" : "Passwortschutz erzwingen", "Failed to create the E-mail" : "Erstellen der E-Mail ist fehlgeschalgen", diff --git a/apps/sharebymail/l10n/de_DE.js b/apps/sharebymail/l10n/de_DE.js index f8bd6112921..5bbaa1c1d23 100644 --- a/apps/sharebymail/l10n/de_DE.js +++ b/apps/sharebymail/l10n/de_DE.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Sie haben {file} mit {email} per E-Mail geteilt ", "%3$s shared %1$s with %2$s by mail" : "%3$s hat %1$s mit %2$s per E-Mail geteilt", "{actor} shared {file} with {email} by mail" : "{actor} hat {file} mit {email} per E-Mail geteilt", + "Password to access %1$s was sent to %2s" : "Passwort für den Zugriff auf %1$s wurde an %2s versandt ", + "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", + "Password to access %1$s was sent to you" : "Passwort für den Zugriff auf %1$s wurde an Sie versandt", + "Password to access {file} was sent to you" : " Passwort für den Zugriff auf {file} wurde an Sie versandt ", "Sharing %s failed, this item is already shared with %s" : "Teilen von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wurde", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erstelltes Passwort kann nicht versandt werden. Bitte geben Sie in Ihren persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche Sie es erneut.", "Failed to send share by E-mail" : "Fehler beim Senden der Freigabe per E-Mail", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Im Teilen-Dialog können Sie jederzeit ein anderes Passwort wählen.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Share by mail" : "Geteilt über eine E-Mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Ermöglicht Nutzern eine personalisierte Verknüpfung zu einer Datei oder einem Ordner durch Eingabe einer E-Mail-Adresse zu teilen.", "Send password by mail" : "Passwort per Mail senden", "Enforce password protection" : "Passwortschutz erzwingen", "Failed to create the E-mail" : "Erstellen der E-Mail fehlgeschlagen", diff --git a/apps/sharebymail/l10n/de_DE.json b/apps/sharebymail/l10n/de_DE.json index a9732b375be..bf55e9e0399 100644 --- a/apps/sharebymail/l10n/de_DE.json +++ b/apps/sharebymail/l10n/de_DE.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Sie haben {file} mit {email} per E-Mail geteilt ", "%3$s shared %1$s with %2$s by mail" : "%3$s hat %1$s mit %2$s per E-Mail geteilt", "{actor} shared {file} with {email} by mail" : "{actor} hat {file} mit {email} per E-Mail geteilt", + "Password to access %1$s was sent to %2s" : "Passwort für den Zugriff auf %1$s wurde an %2s versandt ", + "Password to access {file} was sent to {email}" : "Passwort für den Zugriff auf {file} wurde an {email} versandt ", + "Password to access %1$s was sent to you" : "Passwort für den Zugriff auf %1$s wurde an Sie versandt", + "Password to access {file} was sent to you" : " Passwort für den Zugriff auf {file} wurde an Sie versandt ", "Sharing %s failed, this item is already shared with %s" : "Teilen von %s fehlgeschlagen, da dieses Objekt schon mit %s geteilt wurde", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Automatisch erstelltes Passwort kann nicht versandt werden. Bitte geben Sie in Ihren persönlichen Einstellungen eine gültige E-Mail-Adresse ein und versuche Sie es erneut.", "Failed to send share by E-mail" : "Fehler beim Senden der Freigabe per E-Mail", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Im Teilen-Dialog können Sie jederzeit ein anderes Passwort wählen.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Share by mail" : "Geteilt über eine E-Mail", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Ermöglicht Nutzern eine personalisierte Verknüpfung zu einer Datei oder einem Ordner durch Eingabe einer E-Mail-Adresse zu teilen.", "Send password by mail" : "Passwort per Mail senden", "Enforce password protection" : "Passwortschutz erzwingen", "Failed to create the E-mail" : "Erstellen der E-Mail fehlgeschlagen", diff --git a/apps/sharebymail/l10n/es_MX.js b/apps/sharebymail/l10n/es_MX.js index bf4a894deff..7125a06f248 100644 --- a/apps/sharebymail/l10n/es_MX.js +++ b/apps/sharebymail/l10n/es_MX.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Usted ha compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s ha compartido %1$s con %2$s por correo ", "{actor} shared {file} with {email} by mail" : "{actor} ha compartido {file} con {email} por correo", + "Password to access %1$s was sent to %2s" : "La contraseña para acceder %1$s fue enviada a %2s", + "Password to access {file} was sent to {email}" : "La contraseña para acceder {file} ha sido enviada a {email}", + "Password to access %1$s was sent to you" : "La contraseña para acceder %1$s se le ha sido enviada ", + "Password to access {file} was sent to you" : "La contraseña para acceder {file} se le ha sido enviada", "Sharing %s failed, this item is already shared with %s" : "Se presentó una falla al compartir %s, este elemento ya ha sido compartido con %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No es posible enviarle la contraseña auto-generada. Favor de establecer una dirección de correo electrónico váilida en sus ajustes personales y volver a intentarlo.", "Failed to send share by E-mail" : "Se presentó una falla al enviar el recurso compartido por correo electrónico", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Puede elegir una contraseña diferente en cualquier momento en la ventana de diálogo de compartir. ", "Could not find share" : "No fue posible encontrar el elemento compartido", "Share by mail" : "Compartir por correo", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Le permite a los usuarios compartir una liga personalizada a un archivo o carpeta colocando una dirección de correo eletrónico. ", "Send password by mail" : "La contraseña ha sido enviada por correo", "Enforce password protection" : "Forzar protección con contraseña", "Failed to create the E-mail" : "Se presentó una falla al crear el correo electrónico", diff --git a/apps/sharebymail/l10n/es_MX.json b/apps/sharebymail/l10n/es_MX.json index a18fb0eb0b2..8742d099955 100644 --- a/apps/sharebymail/l10n/es_MX.json +++ b/apps/sharebymail/l10n/es_MX.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Usted ha compartido {file} con {email} por correo", "%3$s shared %1$s with %2$s by mail" : "%3$s ha compartido %1$s con %2$s por correo ", "{actor} shared {file} with {email} by mail" : "{actor} ha compartido {file} con {email} por correo", + "Password to access %1$s was sent to %2s" : "La contraseña para acceder %1$s fue enviada a %2s", + "Password to access {file} was sent to {email}" : "La contraseña para acceder {file} ha sido enviada a {email}", + "Password to access %1$s was sent to you" : "La contraseña para acceder %1$s se le ha sido enviada ", + "Password to access {file} was sent to you" : "La contraseña para acceder {file} se le ha sido enviada", "Sharing %s failed, this item is already shared with %s" : "Se presentó una falla al compartir %s, este elemento ya ha sido compartido con %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "No es posible enviarle la contraseña auto-generada. Favor de establecer una dirección de correo electrónico váilida en sus ajustes personales y volver a intentarlo.", "Failed to send share by E-mail" : "Se presentó una falla al enviar el recurso compartido por correo electrónico", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Puede elegir una contraseña diferente en cualquier momento en la ventana de diálogo de compartir. ", "Could not find share" : "No fue posible encontrar el elemento compartido", "Share by mail" : "Compartir por correo", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Le permite a los usuarios compartir una liga personalizada a un archivo o carpeta colocando una dirección de correo eletrónico. ", "Send password by mail" : "La contraseña ha sido enviada por correo", "Enforce password protection" : "Forzar protección con contraseña", "Failed to create the E-mail" : "Se presentó una falla al crear el correo electrónico", diff --git a/apps/sharebymail/l10n/fr.js b/apps/sharebymail/l10n/fr.js index f8341861a42..ae620940064 100644 --- a/apps/sharebymail/l10n/fr.js +++ b/apps/sharebymail/l10n/fr.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Vous avez partagé {file} avec {email} par email", "%3$s shared %1$s with %2$s by mail" : "%3$s a partagé %1$s avec %2$s par email", "{actor} shared {file} with {email} by mail" : "{actor} a partagé {file} avec {email} par email", + "Password to access %1$s was sent to %2s" : "Le mot de passe pour accèder à %1$s a été envoyé à %2s", + "Password to access {file} was sent to {email}" : "Le mot de passe pour accèder à {file} a été envoyé à {email}", + "Password to access %1$s was sent to you" : "Le mot de passe pour accèder à %1$s vous a été envoyé", + "Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé", "Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.", "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email", diff --git a/apps/sharebymail/l10n/fr.json b/apps/sharebymail/l10n/fr.json index 78d51ed6116..8578b36fc4c 100644 --- a/apps/sharebymail/l10n/fr.json +++ b/apps/sharebymail/l10n/fr.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Vous avez partagé {file} avec {email} par email", "%3$s shared %1$s with %2$s by mail" : "%3$s a partagé %1$s avec %2$s par email", "{actor} shared {file} with {email} by mail" : "{actor} a partagé {file} avec {email} par email", + "Password to access %1$s was sent to %2s" : "Le mot de passe pour accèder à %1$s a été envoyé à %2s", + "Password to access {file} was sent to {email}" : "Le mot de passe pour accèder à {file} a été envoyé à {email}", + "Password to access %1$s was sent to you" : "Le mot de passe pour accèder à %1$s vous a été envoyé", + "Password to access {file} was sent to you" : "Le mot de passe pour accèder à {file} vous a été envoyé", "Sharing %s failed, this item is already shared with %s" : "Le partage de %s a échoué, cet élément est déjà partagé avec %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Nous ne pouvons pas vous envoyer le mot de passe généré automatiquement. Veuillez renseigner une adresse e-mail valide dans vos paramètres personnels puis réessayer.", "Failed to send share by E-mail" : "Erreur lors de l'envoi du partage par email", diff --git a/apps/sharebymail/l10n/is.js b/apps/sharebymail/l10n/is.js index 48bba82928c..15d6784a18a 100644 --- a/apps/sharebymail/l10n/is.js +++ b/apps/sharebymail/l10n/is.js @@ -5,16 +5,32 @@ OC.L10N.register( "Shared with {email}" : "Deilt með {email}", "Shared with %1$s by %2$s" : "Deilt með %1$s af %2$s", "Shared with {email} by {actor}" : "Deilt með {email} af {actor}", + "Password for mail share sent to %1$s" : "Lykilorð fyrir póstsameign var sent til %1$s", + "Password for mail share sent to {email}" : "Lykilorð fyrir póstsameign var sent til {email}", + "Password for mail share sent to you" : "Lykilorð fyrir póstsameign var sent til þín", "You shared %1$s with %2$s by mail" : "Þú deildir %1$s með %2$s með tölvupósti", "You shared {file} with {email} by mail" : "Þú deildir {file} með {email} með tölvupósti", "%3$s shared %1$s with %2$s by mail" : "%3$s deildi %1$s með %2$s með tölvupósti", "{actor} shared {file} with {email} by mail" : "{actor} deildi {file} með {email} með tölvupósti", + "Password to access %1$s was sent to %2s" : "Lykilorð fyrir aðgang að %1$s var sent til %2s", + "Password to access {file} was sent to {email}" : "Lykilorð fyrir aðgang að {file} var sent til {email}", + "Password to access %1$s was sent to you" : "Lykilorð fyrir aðgang að %1$s var sent til þín", + "Password to access {file} was sent to you" : "Lykilorð fyrir aðgang að {file} var sent til þín", "Sharing %s failed, this item is already shared with %s" : "Deiling %s mistókst, því þessu atriði er þegar deilt með %s", "Failed to send share by E-mail" : "Gat ekki sent sameign með tölvupósti", "%s shared »%s« with you" : "%s deildi »%s« með þér", "%s shared »%s« with you on behalf of %s" : "%s deildi »%s« með þér fyrir hönd %s", - "Failed to create the E-mail" : "Mistókst að útbúa tölvupóstinn", + "%s shared »%s« with you." : "%s deildi »%s« með þér", + "%s shared »%s« with you on behalf of %s." : "%s deildi »%s« með þér fyrir hönd %s", + "Click the button below to open it." : "Smelltu á tengilinn hér fyrir neðan til að opna það.", + "Open »%s«" : "Opna »%s«", + "%s via %s" : "%s með %s", + "Password to access »%s«" : "Lykilorð fyrir aðgang að »%s«", "Could not find share" : "Gat ekki fundið sameign", + "Share by mail" : "Deila með tölvupósti", + "Send password by mail" : "Senda lykilorð með pósti", + "Enforce password protection" : "Krefjast verndunar með aðgangsorði", + "Failed to create the E-mail" : "Mistókst að útbúa tölvupóstinn", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Góðan daginn,\n\n%s deildi »%s« með þér fyrir hönd %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Góðan daginn,\n\n%s deildi »%s« með þér.\n\n%s\n\n", "Cheers!" : "Til hamingju!", diff --git a/apps/sharebymail/l10n/is.json b/apps/sharebymail/l10n/is.json index 915c340c87c..4ba0afd02cf 100644 --- a/apps/sharebymail/l10n/is.json +++ b/apps/sharebymail/l10n/is.json @@ -3,16 +3,32 @@ "Shared with {email}" : "Deilt með {email}", "Shared with %1$s by %2$s" : "Deilt með %1$s af %2$s", "Shared with {email} by {actor}" : "Deilt með {email} af {actor}", + "Password for mail share sent to %1$s" : "Lykilorð fyrir póstsameign var sent til %1$s", + "Password for mail share sent to {email}" : "Lykilorð fyrir póstsameign var sent til {email}", + "Password for mail share sent to you" : "Lykilorð fyrir póstsameign var sent til þín", "You shared %1$s with %2$s by mail" : "Þú deildir %1$s með %2$s með tölvupósti", "You shared {file} with {email} by mail" : "Þú deildir {file} með {email} með tölvupósti", "%3$s shared %1$s with %2$s by mail" : "%3$s deildi %1$s með %2$s með tölvupósti", "{actor} shared {file} with {email} by mail" : "{actor} deildi {file} með {email} með tölvupósti", + "Password to access %1$s was sent to %2s" : "Lykilorð fyrir aðgang að %1$s var sent til %2s", + "Password to access {file} was sent to {email}" : "Lykilorð fyrir aðgang að {file} var sent til {email}", + "Password to access %1$s was sent to you" : "Lykilorð fyrir aðgang að %1$s var sent til þín", + "Password to access {file} was sent to you" : "Lykilorð fyrir aðgang að {file} var sent til þín", "Sharing %s failed, this item is already shared with %s" : "Deiling %s mistókst, því þessu atriði er þegar deilt með %s", "Failed to send share by E-mail" : "Gat ekki sent sameign með tölvupósti", "%s shared »%s« with you" : "%s deildi »%s« með þér", "%s shared »%s« with you on behalf of %s" : "%s deildi »%s« með þér fyrir hönd %s", - "Failed to create the E-mail" : "Mistókst að útbúa tölvupóstinn", + "%s shared »%s« with you." : "%s deildi »%s« með þér", + "%s shared »%s« with you on behalf of %s." : "%s deildi »%s« með þér fyrir hönd %s", + "Click the button below to open it." : "Smelltu á tengilinn hér fyrir neðan til að opna það.", + "Open »%s«" : "Opna »%s«", + "%s via %s" : "%s með %s", + "Password to access »%s«" : "Lykilorð fyrir aðgang að »%s«", "Could not find share" : "Gat ekki fundið sameign", + "Share by mail" : "Deila með tölvupósti", + "Send password by mail" : "Senda lykilorð með pósti", + "Enforce password protection" : "Krefjast verndunar með aðgangsorði", + "Failed to create the E-mail" : "Mistókst að útbúa tölvupóstinn", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Góðan daginn,\n\n%s deildi »%s« með þér fyrir hönd %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Góðan daginn,\n\n%s deildi »%s« með þér.\n\n%s\n\n", "Cheers!" : "Til hamingju!", diff --git a/apps/sharebymail/l10n/nb.js b/apps/sharebymail/l10n/nb.js index 77ff5479075..9d2ba5fc775 100644 --- a/apps/sharebymail/l10n/nb.js +++ b/apps/sharebymail/l10n/nb.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Du delte {file} med {email} via e-post", "%3$s shared %1$s with %2$s by mail" : "%3$s delte %1$s med %2$s via e-post", "{actor} shared {file} with {email} by mail" : "{actor} delte {file} med {email} via e-post", + "Password to access %1$s was sent to %2s" : "Passord for tilgang til %1$s sendt til %2s", + "Password to access {file} was sent to {email}" : "Passord for tilgang til {file} ble sendt til {email}", + "Password to access %1$s was sent to you" : "Passord for tilgang til %1$s ble sendt til deg", + "Password to access {file} was sent to you" : "Du ble tildelt passord for å benytte {file}", "Sharing %s failed, this item is already shared with %s" : "Deling %s feilet, dette elementet er allerede delt med %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Vi kan ikke sende det auto-genererte passordet. Angi en gyldig e-postadresse i dine personlige innstillinger og prøv igjen.", "Failed to send share by E-mail" : "Feilet når delingen skulle sendes på epost", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Du kan velge et annet passord når som helst i delingsdialogvinduet.", "Could not find share" : "Delingen ble ikke funnet", "Share by mail" : "Del via e-post", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Tillater brukere å dele en personalisert lenke til ei fil eller mappe ved å skrive inn en e-postadresse.", "Send password by mail" : "Send passord via e-post", "Enforce password protection" : "Krev passordbeskyttelse", "Failed to create the E-mail" : "Feilet ved opprettelse av epost", diff --git a/apps/sharebymail/l10n/nb.json b/apps/sharebymail/l10n/nb.json index 3c3e1fc30b8..58c50c7af91 100644 --- a/apps/sharebymail/l10n/nb.json +++ b/apps/sharebymail/l10n/nb.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Du delte {file} med {email} via e-post", "%3$s shared %1$s with %2$s by mail" : "%3$s delte %1$s med %2$s via e-post", "{actor} shared {file} with {email} by mail" : "{actor} delte {file} med {email} via e-post", + "Password to access %1$s was sent to %2s" : "Passord for tilgang til %1$s sendt til %2s", + "Password to access {file} was sent to {email}" : "Passord for tilgang til {file} ble sendt til {email}", + "Password to access %1$s was sent to you" : "Passord for tilgang til %1$s ble sendt til deg", + "Password to access {file} was sent to you" : "Du ble tildelt passord for å benytte {file}", "Sharing %s failed, this item is already shared with %s" : "Deling %s feilet, dette elementet er allerede delt med %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Vi kan ikke sende det auto-genererte passordet. Angi en gyldig e-postadresse i dine personlige innstillinger og prøv igjen.", "Failed to send share by E-mail" : "Feilet når delingen skulle sendes på epost", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "Du kan velge et annet passord når som helst i delingsdialogvinduet.", "Could not find share" : "Delingen ble ikke funnet", "Share by mail" : "Del via e-post", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Tillater brukere å dele en personalisert lenke til ei fil eller mappe ved å skrive inn en e-postadresse.", "Send password by mail" : "Send passord via e-post", "Enforce password protection" : "Krev passordbeskyttelse", "Failed to create the E-mail" : "Feilet ved opprettelse av epost", diff --git a/apps/sharebymail/l10n/pt_BR.js b/apps/sharebymail/l10n/pt_BR.js index 08e6e1b0191..edc96e08ef2 100644 --- a/apps/sharebymail/l10n/pt_BR.js +++ b/apps/sharebymail/l10n/pt_BR.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", + "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", + "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", + "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", @@ -33,12 +37,13 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", "Share by mail" : "Compartilhamento por email", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", "Send password by mail" : "Enviar senha por email", "Enforce password protection" : "Reforce a proteção por senha", "Failed to create the E-mail" : "Falhou ao criar o email", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Olá,<br><br>%s compartilhou <a href=\"%s\">%s</a> com você em nome de %s.<br><br>", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Olá,<br><br>%s compartilhou <a href=\"%s\">%s</a> com você.<br><br>" }, diff --git a/apps/sharebymail/l10n/pt_BR.json b/apps/sharebymail/l10n/pt_BR.json index 7daeb9bbcf9..014f325a457 100644 --- a/apps/sharebymail/l10n/pt_BR.json +++ b/apps/sharebymail/l10n/pt_BR.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "Você compartilhou {file} com {email} por email", "%3$s shared %1$s with %2$s by mail" : "%3$s compartilou %1$s com %2$s por email", "{actor} shared {file} with {email} by mail" : "{actor} compartilhou {file} com {email} por email", + "Password to access %1$s was sent to %2s" : "A senha para acesso %1$s foi enviada para %2s", + "Password to access {file} was sent to {email}" : "A senha para acesso {file} foi enviada para {email}", + "Password to access %1$s was sent to you" : "A senha para acesso %1$s foi enviada para você", + "Password to access {file} was sent to you" : "A senha para acesso {file} foi enviada para você", "Sharing %s failed, this item is already shared with %s" : "O compartilhamento %s falhou, pois este item já está compartilhado com %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Não pudemos enviar a você a senha auto-gerada. por favor defina um email válido em sua configuração e tente novamente.", "Failed to send share by E-mail" : "Falha ao enviar compartilhamento por email", @@ -31,12 +35,13 @@ "You can choose a different password at any time in the share dialog." : "Você pode escolher uma senha diferente a qualquer momento no diálogo compartilhamento.", "Could not find share" : "Não foi possível encontrar o compartilhamento", "Share by mail" : "Compartilhamento por email", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Permite que os usuários compartilhem um link personalizado para um arquivo ou pasta, inserindo um endereço de email.", "Send password by mail" : "Enviar senha por email", "Enforce password protection" : "Reforce a proteção por senha", "Failed to create the E-mail" : "Falhou ao criar o email", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você em nome de %s.\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Olá,\n%s compartilhou »%s« com você.\n%s\n", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Olá,<br><br>%s compartilhou <a href=\"%s\">%s</a> com você em nome de %s.<br><br>", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Olá,<br><br>%s compartilhou <a href=\"%s\">%s</a> com você.<br><br>" },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/apps/sharebymail/l10n/tr.js b/apps/sharebymail/l10n/tr.js index 2521ebd0e7d..191f0cfe54b 100644 --- a/apps/sharebymail/l10n/tr.js +++ b/apps/sharebymail/l10n/tr.js @@ -12,6 +12,10 @@ OC.L10N.register( "You shared {file} with {email} by mail" : "{file} dosyasını {email} ile e-posta üzerinden paylaştınız", "%3$s shared %1$s with %2$s by mail" : "%3$s, %1$s dosyasını %2$s ile e-posta üzerinden paylaştı", "{actor} shared {file} with {email} by mail" : "{actor}, {file} dosyasını {email} ile e-posta üzerinden paylaştı", + "Password to access %1$s was sent to %2s" : "%1$s dosyasına erişim parolası %2s adresine gönderildi", + "Password to access {file} was sent to {email}" : "{file} dosyasına erişim parolası {email} adresine gönderildi", + "Password to access %1$s was sent to you" : "%1$s dosyasına erişim parolası size gönderildi", + "Password to access {file} was sent to you" : "{file} dosyasına erişim parolası size gönderildi", "Sharing %s failed, this item is already shared with %s" : "%s paylaşılamadı, bu öge zaten %s ile paylaşılmış", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Otomatik üretilen parola size gönderilemedi. Lütfen kişisel ayarlarınızdan geçerli bir e-posta adresi ayarlayın ve yeniden deneyin.", "Failed to send share by E-mail" : "Paylaşım e-postası gönderilemedi", @@ -33,6 +37,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "İstediğiniz zaman paylaşım bölümünden farklı bir parola belirtebilirsiniz.", "Could not find share" : "Paylaşım bulunamadı", "Share by mail" : "E-posta ile paylaş", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Kullanıcıların bir e-posta adresi yazarak bir dosya ya da klasör için kişisel bir bağlantı paylaşmasını sağlar.", "Send password by mail" : "Parolayı e-posta ile gönder", "Enforce password protection" : "Parola koruması dayatılsın", "Failed to create the E-mail" : "E-posta oluşturulamadı", diff --git a/apps/sharebymail/l10n/tr.json b/apps/sharebymail/l10n/tr.json index 87c6a29f011..9261dc3d3cb 100644 --- a/apps/sharebymail/l10n/tr.json +++ b/apps/sharebymail/l10n/tr.json @@ -10,6 +10,10 @@ "You shared {file} with {email} by mail" : "{file} dosyasını {email} ile e-posta üzerinden paylaştınız", "%3$s shared %1$s with %2$s by mail" : "%3$s, %1$s dosyasını %2$s ile e-posta üzerinden paylaştı", "{actor} shared {file} with {email} by mail" : "{actor}, {file} dosyasını {email} ile e-posta üzerinden paylaştı", + "Password to access %1$s was sent to %2s" : "%1$s dosyasına erişim parolası %2s adresine gönderildi", + "Password to access {file} was sent to {email}" : "{file} dosyasına erişim parolası {email} adresine gönderildi", + "Password to access %1$s was sent to you" : "%1$s dosyasına erişim parolası size gönderildi", + "Password to access {file} was sent to you" : "{file} dosyasına erişim parolası size gönderildi", "Sharing %s failed, this item is already shared with %s" : "%s paylaşılamadı, bu öge zaten %s ile paylaşılmış", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Otomatik üretilen parola size gönderilemedi. Lütfen kişisel ayarlarınızdan geçerli bir e-posta adresi ayarlayın ve yeniden deneyin.", "Failed to send share by E-mail" : "Paylaşım e-postası gönderilemedi", @@ -31,6 +35,7 @@ "You can choose a different password at any time in the share dialog." : "İstediğiniz zaman paylaşım bölümünden farklı bir parola belirtebilirsiniz.", "Could not find share" : "Paylaşım bulunamadı", "Share by mail" : "E-posta ile paylaş", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Kullanıcıların bir e-posta adresi yazarak bir dosya ya da klasör için kişisel bir bağlantı paylaşmasını sağlar.", "Send password by mail" : "Parolayı e-posta ile gönder", "Enforce password protection" : "Parola koruması dayatılsın", "Failed to create the E-mail" : "E-posta oluşturulamadı", diff --git a/apps/systemtags/l10n/de.js b/apps/systemtags/l10n/de.js index 8890255ed27..d9a3e688aba 100644 --- a/apps/systemtags/l10n/de.js +++ b/apps/systemtags/l10n/de.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (unsichtbar)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei wurden geändert", "Collaborative tags" : "Zusammenarbeits-Tags", + "Create and edit collaborative tags. These tags affect all users." : "Ersttele und bearbeite Zusammenarbeits-Tags. Diese Tags betreffen alle Benutzer.", + "Select tag …" : "Tag wählen ...", "Name" : "Name", "Delete" : "Löschen", "Public" : "Öffentlich", diff --git a/apps/systemtags/l10n/de.json b/apps/systemtags/l10n/de.json index 02fdeb80137..da66aeab4f5 100644 --- a/apps/systemtags/l10n/de.json +++ b/apps/systemtags/l10n/de.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (unsichtbar)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei wurden geändert", "Collaborative tags" : "Zusammenarbeits-Tags", + "Create and edit collaborative tags. These tags affect all users." : "Ersttele und bearbeite Zusammenarbeits-Tags. Diese Tags betreffen alle Benutzer.", + "Select tag …" : "Tag wählen ...", "Name" : "Name", "Delete" : "Löschen", "Public" : "Öffentlich", diff --git a/apps/systemtags/l10n/de_DE.js b/apps/systemtags/l10n/de_DE.js index b0c68b393d9..2a54747145a 100644 --- a/apps/systemtags/l10n/de_DE.js +++ b/apps/systemtags/l10n/de_DE.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (unsichtbar)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei wurden geändert", "Collaborative tags" : "Gemeinsame Tags", + "Create and edit collaborative tags. These tags affect all users." : "Erstellen und bearbeiten Sie Zusammenarbeits-Tags. Diese Tags betreffen alle Benutzer.", + "Select tag …" : "Tag wählen ...", "Name" : "Name", "Delete" : "Löschen", "Public" : "Öffentlich", diff --git a/apps/systemtags/l10n/de_DE.json b/apps/systemtags/l10n/de_DE.json index dde01ca5722..b3db89c4291 100644 --- a/apps/systemtags/l10n/de_DE.json +++ b/apps/systemtags/l10n/de_DE.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (unsichtbar)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-Tags</strong> für eine Datei wurden geändert", "Collaborative tags" : "Gemeinsame Tags", + "Create and edit collaborative tags. These tags affect all users." : "Erstellen und bearbeiten Sie Zusammenarbeits-Tags. Diese Tags betreffen alle Benutzer.", + "Select tag …" : "Tag wählen ...", "Name" : "Name", "Delete" : "Löschen", "Public" : "Öffentlich", diff --git a/apps/systemtags/l10n/es_MX.js b/apps/systemtags/l10n/es_MX.js index b0ab0534c92..cc0f3ed3b93 100644 --- a/apps/systemtags/l10n/es_MX.js +++ b/apps/systemtags/l10n/es_MX.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (invisible) ", "<strong>System tags</strong> for a file have been modified" : "Las <strong>etiquetas del sistema</strong> para un archivo han sido modificadas", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crear y editar etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios. ", + "Select tag …" : "Seleccionar etiqueta ...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/es_MX.json b/apps/systemtags/l10n/es_MX.json index 601cb331a23..39d40dd6d9b 100644 --- a/apps/systemtags/l10n/es_MX.json +++ b/apps/systemtags/l10n/es_MX.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (invisible) ", "<strong>System tags</strong> for a file have been modified" : "Las <strong>etiquetas del sistema</strong> para un archivo han sido modificadas", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crear y editar etiquetas colaborativas. Estas etiquetas afectan a todos los usuarios. ", + "Select tag …" : "Seleccionar etiqueta ...", "Name" : "Nombre", "Delete" : "Borrar", "Public" : "Público", diff --git a/apps/systemtags/l10n/fr.js b/apps/systemtags/l10n/fr.js index 34190e45eff..b43d0518749 100644 --- a/apps/systemtags/l10n/fr.js +++ b/apps/systemtags/l10n/fr.js @@ -42,6 +42,7 @@ OC.L10N.register( "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", "Collaborative tags" : "Étiquettes collaboratives ", + "Select tag …" : "Sélectionner une étiquette…", "Name" : "Nom", "Delete" : "Supprimer", "Public" : "Public", diff --git a/apps/systemtags/l10n/fr.json b/apps/systemtags/l10n/fr.json index 27068e3ec47..f4c52009f1a 100644 --- a/apps/systemtags/l10n/fr.json +++ b/apps/systemtags/l10n/fr.json @@ -40,6 +40,7 @@ "%s (invisible)" : "%s (invisible)", "<strong>System tags</strong> for a file have been modified" : "<strong>Les étiquettes collaboratives</strong> pour un fichier ont été modifiées", "Collaborative tags" : "Étiquettes collaboratives ", + "Select tag …" : "Sélectionner une étiquette…", "Name" : "Nom", "Delete" : "Supprimer", "Public" : "Public", diff --git a/apps/systemtags/l10n/is.js b/apps/systemtags/l10n/is.js index ea55c55683d..57a121de3e9 100644 --- a/apps/systemtags/l10n/is.js +++ b/apps/systemtags/l10n/is.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (ósýnilegt)", "<strong>System tags</strong> for a file have been modified" : "<strong>Kerfismerkjum</strong> á skrá hefur verið breytt", "Collaborative tags" : "Samstarfsmerkingar", + "Create and edit collaborative tags. These tags affect all users." : "Búðu til og breyttu merkjum fyrir samstarfsupplýsingar. Þessi merki hafa áhrif á alla notendur.", + "Select tag …" : "Veldu merki ...", "Name" : "Heiti", "Delete" : "Eyða", "Public" : "Opinbert", diff --git a/apps/systemtags/l10n/is.json b/apps/systemtags/l10n/is.json index 1a78c0a03e1..de25ad69d13 100644 --- a/apps/systemtags/l10n/is.json +++ b/apps/systemtags/l10n/is.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (ósýnilegt)", "<strong>System tags</strong> for a file have been modified" : "<strong>Kerfismerkjum</strong> á skrá hefur verið breytt", "Collaborative tags" : "Samstarfsmerkingar", + "Create and edit collaborative tags. These tags affect all users." : "Búðu til og breyttu merkjum fyrir samstarfsupplýsingar. Þessi merki hafa áhrif á alla notendur.", + "Select tag …" : "Veldu merki ...", "Name" : "Heiti", "Delete" : "Eyða", "Public" : "Opinbert", diff --git a/apps/systemtags/l10n/nb.js b/apps/systemtags/l10n/nb.js index 925a2d1ef4f..d80c14ff3e4 100644 --- a/apps/systemtags/l10n/nb.js +++ b/apps/systemtags/l10n/nb.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (usynlig)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-merkelapper</strong> for en fil er endret", "Collaborative tags" : "Felles merkelapper", + "Create and edit collaborative tags. These tags affect all users." : "Opprett og rediger samarbeidsmessige merkelapper. Disse har innvirkning på alle brukere.", + "Select tag …" : "Velg merkelapp…", "Name" : "Navn", "Delete" : "Slett", "Public" : "Offentlig", diff --git a/apps/systemtags/l10n/nb.json b/apps/systemtags/l10n/nb.json index fb70bfeed84..befa7af4f8a 100644 --- a/apps/systemtags/l10n/nb.json +++ b/apps/systemtags/l10n/nb.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (usynlig)", "<strong>System tags</strong> for a file have been modified" : "<strong>System-merkelapper</strong> for en fil er endret", "Collaborative tags" : "Felles merkelapper", + "Create and edit collaborative tags. These tags affect all users." : "Opprett og rediger samarbeidsmessige merkelapper. Disse har innvirkning på alle brukere.", + "Select tag …" : "Velg merkelapp…", "Name" : "Navn", "Delete" : "Slett", "Public" : "Offentlig", diff --git a/apps/systemtags/l10n/pt_BR.js b/apps/systemtags/l10n/pt_BR.js index cae367c449d..cacfea73625 100644 --- a/apps/systemtags/l10n/pt_BR.js +++ b/apps/systemtags/l10n/pt_BR.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (invisível)", "<strong>System tags</strong> for a file have been modified" : "<strong>As etiquetas de sistema</strong> para um arquivo foram modificadas", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crie e edite etiquetas colaborativas. Estas etiquetas afetam todos os usuários.", + "Select tag …" : "Selecionar etiqueta...", "Name" : "Nome", "Delete" : "Excluir", "Public" : "Público", diff --git a/apps/systemtags/l10n/pt_BR.json b/apps/systemtags/l10n/pt_BR.json index 01bd5185198..7ad9d4ad83f 100644 --- a/apps/systemtags/l10n/pt_BR.json +++ b/apps/systemtags/l10n/pt_BR.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (invisível)", "<strong>System tags</strong> for a file have been modified" : "<strong>As etiquetas de sistema</strong> para um arquivo foram modificadas", "Collaborative tags" : "Etiquetas colaborativas", + "Create and edit collaborative tags. These tags affect all users." : "Crie e edite etiquetas colaborativas. Estas etiquetas afetam todos os usuários.", + "Select tag …" : "Selecionar etiqueta...", "Name" : "Nome", "Delete" : "Excluir", "Public" : "Público", diff --git a/apps/systemtags/l10n/tr.js b/apps/systemtags/l10n/tr.js index 9e9b1aa2963..e425aed1f2e 100644 --- a/apps/systemtags/l10n/tr.js +++ b/apps/systemtags/l10n/tr.js @@ -42,6 +42,8 @@ OC.L10N.register( "%s (invisible)" : "%s (gizli)", "<strong>System tags</strong> for a file have been modified" : "Bir dosyanın <strong>sistem etiketleri</strong> değiştirildi", "Collaborative tags" : "İşbirliği etiketleri", + "Create and edit collaborative tags. These tags affect all users." : "İşbirliği etiketlerini oluşturun ve düzenleyin. Bu etiketler tüm kullanıcıları etkiler.", + "Select tag …" : "Etiket seçin...", "Name" : "Ad", "Delete" : "Sil", "Public" : "Herkese açık", diff --git a/apps/systemtags/l10n/tr.json b/apps/systemtags/l10n/tr.json index 0e56462da7e..ab28172ffc8 100644 --- a/apps/systemtags/l10n/tr.json +++ b/apps/systemtags/l10n/tr.json @@ -40,6 +40,8 @@ "%s (invisible)" : "%s (gizli)", "<strong>System tags</strong> for a file have been modified" : "Bir dosyanın <strong>sistem etiketleri</strong> değiştirildi", "Collaborative tags" : "İşbirliği etiketleri", + "Create and edit collaborative tags. These tags affect all users." : "İşbirliği etiketlerini oluşturun ve düzenleyin. Bu etiketler tüm kullanıcıları etkiler.", + "Select tag …" : "Etiket seçin...", "Name" : "Ad", "Delete" : "Sil", "Public" : "Herkese açık", diff --git a/apps/systemtags/l10n/zh_CN.js b/apps/systemtags/l10n/zh_CN.js index c4a3602828a..4d998b335bb 100644 --- a/apps/systemtags/l10n/zh_CN.js +++ b/apps/systemtags/l10n/zh_CN.js @@ -16,32 +16,34 @@ OC.L10N.register( "{actor} added system tag {systemtag}" : "{actor} 已添加的系统标签 {systemtag}", "Removed system tag %1$s" : "已移除的系统标签 %1$s", "Removed system tag {systemtag}" : "已移除的系统标签 {systemtag}", - "%1$s removed system tag %2$s" : "%1$s 已移除的系统标签 %2$s", - "{actor} removed system tag {systemtag}" : "{actor} 已移除的系统标签 {systemtag}", - "You created system tag %1$s" : "您已创建的系统标签 %1$s", - "You created system tag {systemtag}" : "已创建系统标签 {systemtag}", + "%1$s removed system tag %2$s" : "%1$s 删除了系统标签 %2$s", + "{actor} removed system tag {systemtag}" : "{actor} 删除了系统标签 {systemtag}", + "You created system tag %1$s" : "您创建了系统标签 %1$s", + "You created system tag {systemtag}" : "您创建了系统标签 {systemtag}", "%1$s created system tag %2$s" : "%1$s 创建了系统标签 %2$s", - "{actor} created system tag {systemtag}" : "{actor} 已创建系统标签 {systemtag}", - "You deleted system tag %1$s" : "删除了系统标签 %1$s", - "You deleted system tag {systemtag}" : "您已删除系统标签 {systemtag}", + "{actor} created system tag {systemtag}" : "{actor} 创建了系统标签 {systemtag}", + "You deleted system tag %1$s" : "您删除了系统标签 %1$s", + "You deleted system tag {systemtag}" : "您删除了系统标签 {systemtag}", "%1$s deleted system tag %2$s" : "%1$s 删除了系统标签 %2$s", - "{actor} deleted system tag {systemtag}" : "{actor} 删除系统标签 {systemtag}", - "You updated system tag %2$s to %1$s" : "您已将系统标签 %2$s 更新为 %1$s", - "You updated system tag {oldsystemtag} to {newsystemtag}" : "您已将系统标签 {oldsystemtag} 更新为 {newsystemtag}", - "%1$s updated system tag %3$s to %2$s" : "%1$s 更新了系统标签 %3$s 为 %2$s", - "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor}更新系统标签{oldsystemtag}到{newsystemtag}", - "You added system tag %2$s to %1$s" : "你填加系统标签%2$s到%1$s", - "You added system tag {systemtag} to {file}" : "你添加了系统标记 {systemtag} 到 {file}", - "%1$s added system tag %3$s to %2$s" : "%1$s 添加系统标记 %3$s 到 %2$s", - "{actor} added system tag {systemtag} to {file}" : "{actor} 添加系统标记 {systemtag} 到 {file}", - "You removed system tag %2$s from %1$s" : "你移除的系统标记 %2$s 于 %1$s", - "You removed system tag {systemtag} from {file}" : "你移除了系统标记 {systemtag} 从 {file}", - "%1$s removed system tag %3$s from %2$s" : "%1$s 移除了系统标记 %3$s 从 %2$s", - "{actor} removed system tag {systemtag} from {file}" : "{actor} 移除了系统标记 {systemtag} 从 {file}", + "{actor} deleted system tag {systemtag}" : "{actor} 删除了系统标签 {systemtag}", + "You updated system tag %2$s to %1$s" : "您已经将系统标签 %2$s 更新为 %1$s", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "您已经将系统标签 {oldsystemtag} 更新为 {newsystemtag}", + "%1$s updated system tag %3$s to %2$s" : "%1$s 已经将系统标签 %3$s 更新为 %2$s", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} 已经将系统标签 {oldsystemtag} 更新为 {newsystemtag}", + "You added system tag %2$s to %1$s" : "您为 %1$s 填加了系统标签 %2$s", + "You added system tag {systemtag} to {file}" : "您为 {file} 添加了系统标签 {systemtag}", + "%1$s added system tag %3$s to %2$s" : "%1$s 为 %2$s 添加了系统标签 %3$s", + "{actor} added system tag {systemtag} to {file}" : "{actor} 为 {file} 添加了系统标签 {systemtag}", + "You removed system tag %2$s from %1$s" : "您从 %1$s 移除了系统标签 %2$s", + "You removed system tag {systemtag} from {file}" : "您从 {file} 移除了系统标签 {systemtag}.", + "%1$s removed system tag %3$s from %2$s" : "%1$s 从 %2$s 移除了系统标签 %3$s", + "{actor} removed system tag {systemtag} from {file}" : "{actor} 从 {file} 中移除了系统标签 {systemtag}", "%s (restricted)" : "%s (受限)", "%s (invisible)" : "%s (不可见)", "<strong>System tags</strong> for a file have been modified" : "已更改的文件的<strong>系统标签</strong> ", - "Collaborative tags" : "协同标记", + "Collaborative tags" : "协同标签", + "Create and edit collaborative tags. These tags affect all users." : "创建并编辑协同标签. 这些标签影响全部用户.", + "Select tag …" : "选择标签...", "Name" : "名称", "Delete" : "删除", "Public" : "公开", diff --git a/apps/systemtags/l10n/zh_CN.json b/apps/systemtags/l10n/zh_CN.json index d34852451ed..4d53fabe757 100644 --- a/apps/systemtags/l10n/zh_CN.json +++ b/apps/systemtags/l10n/zh_CN.json @@ -14,32 +14,34 @@ "{actor} added system tag {systemtag}" : "{actor} 已添加的系统标签 {systemtag}", "Removed system tag %1$s" : "已移除的系统标签 %1$s", "Removed system tag {systemtag}" : "已移除的系统标签 {systemtag}", - "%1$s removed system tag %2$s" : "%1$s 已移除的系统标签 %2$s", - "{actor} removed system tag {systemtag}" : "{actor} 已移除的系统标签 {systemtag}", - "You created system tag %1$s" : "您已创建的系统标签 %1$s", - "You created system tag {systemtag}" : "已创建系统标签 {systemtag}", + "%1$s removed system tag %2$s" : "%1$s 删除了系统标签 %2$s", + "{actor} removed system tag {systemtag}" : "{actor} 删除了系统标签 {systemtag}", + "You created system tag %1$s" : "您创建了系统标签 %1$s", + "You created system tag {systemtag}" : "您创建了系统标签 {systemtag}", "%1$s created system tag %2$s" : "%1$s 创建了系统标签 %2$s", - "{actor} created system tag {systemtag}" : "{actor} 已创建系统标签 {systemtag}", - "You deleted system tag %1$s" : "删除了系统标签 %1$s", - "You deleted system tag {systemtag}" : "您已删除系统标签 {systemtag}", + "{actor} created system tag {systemtag}" : "{actor} 创建了系统标签 {systemtag}", + "You deleted system tag %1$s" : "您删除了系统标签 %1$s", + "You deleted system tag {systemtag}" : "您删除了系统标签 {systemtag}", "%1$s deleted system tag %2$s" : "%1$s 删除了系统标签 %2$s", - "{actor} deleted system tag {systemtag}" : "{actor} 删除系统标签 {systemtag}", - "You updated system tag %2$s to %1$s" : "您已将系统标签 %2$s 更新为 %1$s", - "You updated system tag {oldsystemtag} to {newsystemtag}" : "您已将系统标签 {oldsystemtag} 更新为 {newsystemtag}", - "%1$s updated system tag %3$s to %2$s" : "%1$s 更新了系统标签 %3$s 为 %2$s", - "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor}更新系统标签{oldsystemtag}到{newsystemtag}", - "You added system tag %2$s to %1$s" : "你填加系统标签%2$s到%1$s", - "You added system tag {systemtag} to {file}" : "你添加了系统标记 {systemtag} 到 {file}", - "%1$s added system tag %3$s to %2$s" : "%1$s 添加系统标记 %3$s 到 %2$s", - "{actor} added system tag {systemtag} to {file}" : "{actor} 添加系统标记 {systemtag} 到 {file}", - "You removed system tag %2$s from %1$s" : "你移除的系统标记 %2$s 于 %1$s", - "You removed system tag {systemtag} from {file}" : "你移除了系统标记 {systemtag} 从 {file}", - "%1$s removed system tag %3$s from %2$s" : "%1$s 移除了系统标记 %3$s 从 %2$s", - "{actor} removed system tag {systemtag} from {file}" : "{actor} 移除了系统标记 {systemtag} 从 {file}", + "{actor} deleted system tag {systemtag}" : "{actor} 删除了系统标签 {systemtag}", + "You updated system tag %2$s to %1$s" : "您已经将系统标签 %2$s 更新为 %1$s", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "您已经将系统标签 {oldsystemtag} 更新为 {newsystemtag}", + "%1$s updated system tag %3$s to %2$s" : "%1$s 已经将系统标签 %3$s 更新为 %2$s", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} 已经将系统标签 {oldsystemtag} 更新为 {newsystemtag}", + "You added system tag %2$s to %1$s" : "您为 %1$s 填加了系统标签 %2$s", + "You added system tag {systemtag} to {file}" : "您为 {file} 添加了系统标签 {systemtag}", + "%1$s added system tag %3$s to %2$s" : "%1$s 为 %2$s 添加了系统标签 %3$s", + "{actor} added system tag {systemtag} to {file}" : "{actor} 为 {file} 添加了系统标签 {systemtag}", + "You removed system tag %2$s from %1$s" : "您从 %1$s 移除了系统标签 %2$s", + "You removed system tag {systemtag} from {file}" : "您从 {file} 移除了系统标签 {systemtag}.", + "%1$s removed system tag %3$s from %2$s" : "%1$s 从 %2$s 移除了系统标签 %3$s", + "{actor} removed system tag {systemtag} from {file}" : "{actor} 从 {file} 中移除了系统标签 {systemtag}", "%s (restricted)" : "%s (受限)", "%s (invisible)" : "%s (不可见)", "<strong>System tags</strong> for a file have been modified" : "已更改的文件的<strong>系统标签</strong> ", - "Collaborative tags" : "协同标记", + "Collaborative tags" : "协同标签", + "Create and edit collaborative tags. These tags affect all users." : "创建并编辑协同标签. 这些标签影响全部用户.", + "Select tag …" : "选择标签...", "Name" : "名称", "Delete" : "删除", "Public" : "公开", diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss index 9392bfb0ae2..d2196362d3b 100644 --- a/apps/theming/css/theming.scss +++ b/apps/theming/css/theming.scss @@ -12,22 +12,25 @@ /* invert header icons on bright background */ @if (lightness($color-primary) > 50) { - #header .icon-caret { - background-image: url(../../../core/img/actions/caret-dark.svg); - } .searchbox input[type="search"] { - background: transparent url(../../../core/img/actions/search.svg) no-repeat 6px center; + background: transparent url('../../../core/img/actions/search.svg') no-repeat 6px center; } #appmenu li a img { -webkit-filter: invert(1); filter: invert(1); filter: progid:DXImageTransform.Microsoft.BasicImage(invert='1'); } + #contactsmenu .icon-contacts { + background-image: url('../../../core/img/places/contacts-dark.svg'); + } + #settings .icon-settings-white { + background-image: url('../../../core/img/actions/settings-dark.svg'); + } } /* Colorized svg images */ .icon-file, .icon-filetype-text { - background-image: url(../img/core/filetypes/text.svg?v=#{$theming-cachebuster}); + background-image: url(./img/core/filetypes/text.svg?v=#{$theming-cachebuster}); } .icon-folder, .icon-filetype-folder { @@ -59,6 +62,6 @@ input.primary { @if (lightness($color-primary) > 50) { #body-login input.login { - background-image: url(../../../core/img/actions/confirm.svg); + background-image: url('../../../core/img/actions/confirm.svg'); } }
\ No newline at end of file diff --git a/apps/theming/l10n/fi.js b/apps/theming/l10n/fi.js index cd9b98d29d7..de016554c93 100644 --- a/apps/theming/l10n/fi.js +++ b/apps/theming/l10n/fi.js @@ -11,7 +11,7 @@ OC.L10N.register( "No file uploaded" : "Ei tiedostoa lähetetty", "Unsupported image type" : "Ei-tuettu kuvatiedostomuoto", "You are already using a custom theme" : "Käytät jo kustomoitua ulkoasua", - "Theming" : "Ulkoasu", + "Theming" : "Teema", "Name" : "Nimi", "reset to default" : "palauta oletukseksi", "Web address" : "Verkko-osoite", diff --git a/apps/theming/l10n/fi.json b/apps/theming/l10n/fi.json index d4577c727dd..093acccde75 100644 --- a/apps/theming/l10n/fi.json +++ b/apps/theming/l10n/fi.json @@ -9,7 +9,7 @@ "No file uploaded" : "Ei tiedostoa lähetetty", "Unsupported image type" : "Ei-tuettu kuvatiedostomuoto", "You are already using a custom theme" : "Käytät jo kustomoitua ulkoasua", - "Theming" : "Ulkoasu", + "Theming" : "Teema", "Name" : "Nimi", "reset to default" : "palauta oletukseksi", "Web address" : "Verkko-osoite", diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php index 61fe57c3c75..f7c8f591fc7 100644 --- a/apps/theming/templates/settings-admin.php +++ b/apps/theming/templates/settings-admin.php @@ -28,7 +28,7 @@ style('theming', 'settings-admin'); ?> <div id="theming" class="section"> <h2 class="inlineblock"><?php p($l->t('Theming')); ?></h2> - <p class="settings-hint"><?php p($l->t('Theming makes it possible to easily customize the look and feel of your instance. This will be visible for all users.')); ?></p> + <p class="settings-hint"><?php p($l->t('Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users.')); ?></p> <div id="theming_settings_msg" class="msg success inlineblock" style="display: none;">Saved</div> <?php if ($_['themable'] === false) { ?> <p> diff --git a/apps/twofactor_backupcodes/templates/personal.php b/apps/twofactor_backupcodes/templates/personal.php index 23b06e23058..3076e16a166 100644 --- a/apps/twofactor_backupcodes/templates/personal.php +++ b/apps/twofactor_backupcodes/templates/personal.php @@ -7,6 +7,6 @@ style('twofactor_backupcodes', 'style'); ?> <div class="section"> - <h2><?php p($l->t('Second-factor backup codes')); ?></h2> + <h2 data-anchor-name="second-factor-backup-codes"><?php p($l->t('Second-factor backup codes')); ?></h2> <div id="twofactor-backupcodes-settings"></div> </div> diff --git a/apps/updatenotification/l10n/nb.js b/apps/updatenotification/l10n/nb.js index 5e05b025299..bd1e6cf8859 100644 --- a/apps/updatenotification/l10n/nb.js +++ b/apps/updatenotification/l10n/nb.js @@ -19,7 +19,7 @@ OC.L10N.register( "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kan alltid oppdatere til en nyere versjon / eksperimentell kanal. Men du kan aldri nedgradere til en mer stabil kanal.", "Notify members of the following groups about available updates:" : "Informer medlemmene i følgende grupper om tilgjengelig oppdateringer:", "Only notification for app updates are available." : "Kun varsler for app oppdateringer er tilgjengelig.", - "The selected update channel makes dedicated notifications for the server obsolete." : "Den valgte oppdateringskanalen gjør at dedikerte varsler til denne serveren utdatert.", + "The selected update channel makes dedicated notifications for the server obsolete." : "Den valgte oppdateringskanalen gjør dedikerte varsler til denne tjeneren utdatert.", "The selected update channel does not support updates of the server." : "Den valgte oppdateringskanalen tilbyr ikke oppdateringer av tjeneren." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/nb.json b/apps/updatenotification/l10n/nb.json index 41fb9d83e00..9d2127ace72 100644 --- a/apps/updatenotification/l10n/nb.json +++ b/apps/updatenotification/l10n/nb.json @@ -17,7 +17,7 @@ "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Du kan alltid oppdatere til en nyere versjon / eksperimentell kanal. Men du kan aldri nedgradere til en mer stabil kanal.", "Notify members of the following groups about available updates:" : "Informer medlemmene i følgende grupper om tilgjengelig oppdateringer:", "Only notification for app updates are available." : "Kun varsler for app oppdateringer er tilgjengelig.", - "The selected update channel makes dedicated notifications for the server obsolete." : "Den valgte oppdateringskanalen gjør at dedikerte varsler til denne serveren utdatert.", + "The selected update channel makes dedicated notifications for the server obsolete." : "Den valgte oppdateringskanalen gjør dedikerte varsler til denne tjeneren utdatert.", "The selected update channel does not support updates of the server." : "Den valgte oppdateringskanalen tilbyr ikke oppdateringer av tjeneren." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index 16be6a4ba1b..a1f6bb440a4 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", + "Your password will expire tomorrow." : "Dein Passwort läuft morgen ab", + "Your password will expire today." : "Dein Passwort läuft heute ab", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"], "LDAP / AD integration" : "LDAP / AD Integration", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index bd6b2dcc0d2..234355bc34c 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", + "Your password will expire tomorrow." : "Dein Passwort läuft morgen ab", + "Your password will expire today." : "Dein Passwort läuft heute ab", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Dein Passwort läuft in %n Tag ab","Dein Passwort läuft in %n Tagen ab"], "LDAP / AD integration" : "LDAP / AD Integration", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js index 768fa8b17d0..16a39130585 100644 --- a/apps/user_ldap/l10n/de_DE.js +++ b/apps/user_ldap/l10n/de_DE.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", + "Your password will expire tomorrow." : "Ihr Passwort läuft morgen ab", + "Your password will expire today." : "Ihr Passwort läuft heute ab", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tage ab","Ihr Passwort läuft in %n Tagen ab"], "LDAP / AD integration" : "LDAP/AD-Integration", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json index 04c83419dd3..3e707d6ba17 100644 --- a/apps/user_ldap/l10n/de_DE.json +++ b/apps/user_ldap/l10n/de_DE.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Das Gruppenfeld wurde deaktiviert, da der LDAP / AD-Server memberOf nicht unterstützt.", "Password change rejected. Hint: " : "Passwortändertung verweigert. Hinweis:", "Please login with the new password" : "Bitte mit dem neuen Passwort anmelden", + "Your password will expire tomorrow." : "Ihr Passwort läuft morgen ab", + "Your password will expire today." : "Ihr Passwort läuft heute ab", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Ihr Passwort läuft in %n Tage ab","Ihr Passwort läuft in %n Tagen ab"], "LDAP / AD integration" : "LDAP/AD-Integration", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], diff --git a/apps/user_ldap/l10n/es_MX.js b/apps/user_ldap/l10n/es_MX.js index e0a8aecb939..6a3dd19978a 100644 --- a/apps/user_ldap/l10n/es_MX.js +++ b/apps/user_ldap/l10n/es_MX.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Favor de iniciar sesion con la nueva contraseña", + "Your password will expire tomorrow." : "Su contraseña expirará mañana.", + "Your password will expire today." : "Su contraseña expirará el día de hoy. ", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], "LDAP / AD integration" : "Integración con LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], diff --git a/apps/user_ldap/l10n/es_MX.json b/apps/user_ldap/l10n/es_MX.json index 5478beea589..b3a56b09562 100644 --- a/apps/user_ldap/l10n/es_MX.json +++ b/apps/user_ldap/l10n/es_MX.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadro de grupo está deshabilitado, porque el servidor LDAP / AD no soporta memberOf.", "Password change rejected. Hint: " : "Cambio de contraseña rechazado. Pista: ", "Please login with the new password" : "Favor de iniciar sesion con la nueva contraseña", + "Your password will expire tomorrow." : "Su contraseña expirará mañana.", + "Your password will expire today." : "Su contraseña expirará el día de hoy. ", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["La contraseña expirará dentro de %n día. ","La contraseña expirará dentro de %n días. "], "LDAP / AD integration" : "Integración con LDAP / AD", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","%s grupos encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","%s usuarios encontrados"], diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js index efb8574d47b..f2d2c22fac7 100644 --- a/apps/user_ldap/l10n/fr.js +++ b/apps/user_ldap/l10n/fr.js @@ -55,6 +55,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP / AD ne prend pas en charge memberOf.", "Password change rejected. Hint: " : "La modification du mot de passe a été rejetée. Indice :", "Please login with the new password" : "Veuillez vous connecter avec le nouveau mot de passe", + "Your password will expire tomorrow." : "Votre mot de passe va expirer demain.", + "Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours."], "LDAP / AD integration" : "Intégration LDAP/AD", "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json index 24abea6f372..217cd85b5d0 100644 --- a/apps/user_ldap/l10n/fr.json +++ b/apps/user_ldap/l10n/fr.json @@ -53,6 +53,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Les groupes sont désactivés car le serveur LDAP / AD ne prend pas en charge memberOf.", "Password change rejected. Hint: " : "La modification du mot de passe a été rejetée. Indice :", "Please login with the new password" : "Veuillez vous connecter avec le nouveau mot de passe", + "Your password will expire tomorrow." : "Votre mot de passe va expirer demain.", + "Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours."], "LDAP / AD integration" : "Intégration LDAP/AD", "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], diff --git a/apps/user_ldap/l10n/nb.js b/apps/user_ldap/l10n/nb.js index 06921ce04e0..30f67da3568 100644 --- a/apps/user_ldap/l10n/nb.js +++ b/apps/user_ldap/l10n/nb.js @@ -12,6 +12,7 @@ OC.L10N.register( "No data specified" : "Ingen data spesifisert", " Could not set configuration %s" : "Klarte ikke å utføre oppsett %s", "Action does not exist" : "Handlingen finnes ikke", + "LDAP user and group backend" : "LDAP bruker- og gruppe -bakende", "Renewing …" : "Fornyer…", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -29,7 +30,7 @@ OC.L10N.register( "Please specify the port, it could not be auto-detected." : "Spesifiser porten. Den kunne ikke påvises automatisk.", "Base DN could not be auto-detected, please revise credentials, host and port." : "Base-DN kunne ikke påvises automatisk. Se igjennom pålogginsdetaljer, vertsnavn og portnummer.", "Could not detect Base DN, please enter it manually." : "Klarte ikke å påvise base-DN. Det må skrives inn manuelt.", - "{nthServer}. Server" : "{nthServer}. tjener", + "{nthServer}. Server" : "{nthServer}. Tjener", "No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt base-DN. Revider oppsettet.", "More than 1,000 directory entries available." : "Mer enn 1.000 katalogoppføringer tilgjengelig.", " entries available within the provided Base DN" : "oppføringer tilgjengelig innenfor angitt base-DN", @@ -54,6 +55,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP- / AD-tjeneren ikke støtter memberOf.", "Password change rejected. Hint: " : "Passordendring avslått. Hint:", "Please login with the new password" : "Logg inn med det nye passordet", + "Your password will expire tomorrow." : "Passordet ditt utløper i morgen.", + "Your password will expire today." : "Passordet ditt utløper i dag.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."], "LDAP / AD integration" : "LDAP / AD integrasjon", "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], @@ -121,7 +125,7 @@ OC.L10N.register( "Expert" : "Ekspert", "Advanced" : "Avansert", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og serveren vil ikke virke. Be systemadministratoren installere den.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og tjeneren vil ikke virke. Be systemadministratoren installere den.", "Connection Settings" : "Innstillinger for tilkobling", "Configuration Active" : "Oppsett aktivt", "When unchecked, this configuration will be skipped." : "Overser oppsettet når ikke avhuket.", diff --git a/apps/user_ldap/l10n/nb.json b/apps/user_ldap/l10n/nb.json index 2520aa42bff..dccc6f3e8b0 100644 --- a/apps/user_ldap/l10n/nb.json +++ b/apps/user_ldap/l10n/nb.json @@ -10,6 +10,7 @@ "No data specified" : "Ingen data spesifisert", " Could not set configuration %s" : "Klarte ikke å utføre oppsett %s", "Action does not exist" : "Handlingen finnes ikke", + "LDAP user and group backend" : "LDAP bruker- og gruppe -bakende", "Renewing …" : "Fornyer…", "Very weak password" : "Veldig svakt passord", "Weak password" : "Svakt passord", @@ -27,7 +28,7 @@ "Please specify the port, it could not be auto-detected." : "Spesifiser porten. Den kunne ikke påvises automatisk.", "Base DN could not be auto-detected, please revise credentials, host and port." : "Base-DN kunne ikke påvises automatisk. Se igjennom pålogginsdetaljer, vertsnavn og portnummer.", "Could not detect Base DN, please enter it manually." : "Klarte ikke å påvise base-DN. Det må skrives inn manuelt.", - "{nthServer}. Server" : "{nthServer}. tjener", + "{nthServer}. Server" : "{nthServer}. Tjener", "No object found in the given Base DN. Please revise." : "Intet objekt funnet i angitt base-DN. Revider oppsettet.", "More than 1,000 directory entries available." : "Mer enn 1.000 katalogoppføringer tilgjengelig.", " entries available within the provided Base DN" : "oppføringer tilgjengelig innenfor angitt base-DN", @@ -52,6 +53,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Gruppeboksen ble deaktivert fordi LDAP- / AD-tjeneren ikke støtter memberOf.", "Password change rejected. Hint: " : "Passordendring avslått. Hint:", "Please login with the new password" : "Logg inn med det nye passordet", + "Your password will expire tomorrow." : "Passordet ditt utløper i morgen.", + "Your password will expire today." : "Passordet ditt utløper i dag.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Passordet ditt utløper om %n dag.","Passordet ditt utløper om %n dager."], "LDAP / AD integration" : "LDAP / AD integrasjon", "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], @@ -119,7 +123,7 @@ "Expert" : "Ekspert", "Advanced" : "Avansert", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og serveren vil ikke virke. Be systemadministratoren installere den.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advarsel:</b> PHP LDAP-modulen er ikke installert og tjeneren vil ikke virke. Be systemadministratoren installere den.", "Connection Settings" : "Innstillinger for tilkobling", "Configuration Active" : "Oppsett aktivt", "When unchecked, this configuration will be skipped." : "Overser oppsettet når ikke avhuket.", diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index da601d77b39..5242b928672 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada pois o servidor LDAP / AD não suporta memberOf.", "Password change rejected. Hint: " : "Troca de senha rejeitada. Dica:", "Please login with the new password" : "Logue-se com a nova senha", + "Your password will expire tomorrow." : "Sua senha vai expirar amanhã.", + "Your password will expire today." : "Sua senha vai expirar hoje.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias."], "LDAP / AD integration" : "Integração LDAP / AD", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","%s usuários encontrados"], diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index f4026252ff7..db0dd00c381 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "A caixa do grupo foi desativada pois o servidor LDAP / AD não suporta memberOf.", "Password change rejected. Hint: " : "Troca de senha rejeitada. Dica:", "Please login with the new password" : "Logue-se com a nova senha", + "Your password will expire tomorrow." : "Sua senha vai expirar amanhã.", + "Your password will expire today." : "Sua senha vai expirar hoje.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Sua senha vai expirar dentro de%n dia.","Sua senha vai expirar dentro de%ndias."], "LDAP / AD integration" : "Integração LDAP / AD", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","%s usuários encontrados"], diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 6686bfd7f14..842500e18bd 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -56,6 +56,9 @@ OC.L10N.register( "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP / AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", + "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın süresi bugün dolacak.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], "LDAP / AD integration" : "LDAP / AD bütünleştirmesi", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index 691794be037..94bd9b6ccef 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -54,6 +54,9 @@ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "LDAP / AD sunucusu memberOf parametresini desteklemediğinden grup kutusu devre dışı.", "Password change rejected. Hint: " : "Parola değişimi reddedildi. İpucu:", "Please login with the new password" : "Lütfen yeni parolanız ile oturum açın", + "Your password will expire tomorrow." : "Parolanızın süresi yarın dolacak.", + "Your password will expire today." : "Parolanızın süresi bugün dolacak.", + "_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Parolanızın süresi %n gün içinde dolacak.","Parolanızın süresi %n gün içinde dolacak."], "LDAP / AD integration" : "LDAP / AD bütünleştirmesi", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], diff --git a/apps/user_ldap/l10n/zh_CN.js b/apps/user_ldap/l10n/zh_CN.js index b45ac7a3662..70ace5ad71c 100644 --- a/apps/user_ldap/l10n/zh_CN.js +++ b/apps/user_ldap/l10n/zh_CN.js @@ -12,6 +12,10 @@ OC.L10N.register( "No data specified" : "未指定数据", " Could not set configuration %s" : " 无法设定配置文件 %s", "Action does not exist" : "操作不存在", + "Weak password" : "弱密码", + "So-so password" : "一般的密码", + "Good password" : "不错的密码", + "Strong password" : "很好的密码", "The Base DN appears to be wrong" : "Base DN似乎错了", "Testing configuration…" : "测试配置...", "Configuration incorrect" : "配置错误", @@ -47,6 +51,9 @@ OC.L10N.register( "Please provide a login name to test against" : "请提供登录名以测试", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "该组框被禁用,因为LDAP/ AD服务器不支持memberOf。", "Password change rejected. Hint: " : "密码更改出错。提示:", + "Please login with the new password" : "请使用新密码登录", + "Your password will expire tomorrow." : "您的密码将在明天过期", + "Your password will expire today." : "您的明码将在今天过期", "LDAP / AD integration" : "LDAP / AD 整合", "_%s group found_::_%s groups found_" : ["发现 %s 个群组"], "_%s user found_::_%s users found_" : ["发现 %s 个用户"], @@ -74,6 +81,7 @@ OC.L10N.register( "Verify settings" : "验证设置", "1. Server" : "1.服务器", "%s. Server:" : "%s.服务器", + "Add a new configuration" : "增加一个新的配置", "Copy current configuration into new directory binding" : "当前配置复制到新目录", "Delete the current configuration" : "删除当前配置", "Host" : "主机", @@ -96,6 +104,14 @@ OC.L10N.register( "Saving" : "保存中", "Back" : "返回", "Continue" : "继续", + "An internal error occurred." : "发生了一个内部错误。", + "Please try again or contact your administrator." : "请重试,或联系您的管理员。", + "Current password" : "当前密码", + "New password" : "新密码", + "Renew password" : "更新密码", + "Wrong password. Reset it?" : "密码错误。是否重置?", + "Wrong password." : "密码错误。", + "Cancel" : "取消!", "LDAP" : "LDAP", "Server" : "服务器", "Users" : "用户", diff --git a/apps/user_ldap/l10n/zh_CN.json b/apps/user_ldap/l10n/zh_CN.json index 1f78778fe8b..77dfd92f31a 100644 --- a/apps/user_ldap/l10n/zh_CN.json +++ b/apps/user_ldap/l10n/zh_CN.json @@ -10,6 +10,10 @@ "No data specified" : "未指定数据", " Could not set configuration %s" : " 无法设定配置文件 %s", "Action does not exist" : "操作不存在", + "Weak password" : "弱密码", + "So-so password" : "一般的密码", + "Good password" : "不错的密码", + "Strong password" : "很好的密码", "The Base DN appears to be wrong" : "Base DN似乎错了", "Testing configuration…" : "测试配置...", "Configuration incorrect" : "配置错误", @@ -45,6 +49,9 @@ "Please provide a login name to test against" : "请提供登录名以测试", "The group box was disabled, because the LDAP / AD server does not support memberOf." : "该组框被禁用,因为LDAP/ AD服务器不支持memberOf。", "Password change rejected. Hint: " : "密码更改出错。提示:", + "Please login with the new password" : "请使用新密码登录", + "Your password will expire tomorrow." : "您的密码将在明天过期", + "Your password will expire today." : "您的明码将在今天过期", "LDAP / AD integration" : "LDAP / AD 整合", "_%s group found_::_%s groups found_" : ["发现 %s 个群组"], "_%s user found_::_%s users found_" : ["发现 %s 个用户"], @@ -72,6 +79,7 @@ "Verify settings" : "验证设置", "1. Server" : "1.服务器", "%s. Server:" : "%s.服务器", + "Add a new configuration" : "增加一个新的配置", "Copy current configuration into new directory binding" : "当前配置复制到新目录", "Delete the current configuration" : "删除当前配置", "Host" : "主机", @@ -94,6 +102,14 @@ "Saving" : "保存中", "Back" : "返回", "Continue" : "继续", + "An internal error occurred." : "发生了一个内部错误。", + "Please try again or contact your administrator." : "请重试,或联系您的管理员。", + "Current password" : "当前密码", + "New password" : "新密码", + "Renew password" : "更新密码", + "Wrong password. Reset it?" : "密码错误。是否重置?", + "Wrong password." : "密码错误。", + "Cancel" : "取消!", "LDAP" : "LDAP", "Server" : "服务器", "Users" : "用户", diff --git a/build/integration/features/bootstrap/WebDav.php b/build/integration/features/bootstrap/WebDav.php index 3a018a2d0fa..9242b80ac13 100644 --- a/build/integration/features/bootstrap/WebDav.php +++ b/build/integration/features/bootstrap/WebDav.php @@ -45,8 +45,10 @@ trait WebDav { private $usingOldDavPath = true; /** @var ResponseInterface */ private $response; - /** @var map with user as key and another map as value, which has path as key and etag as value */ - private $storedETAG = NULL; + /** @var array map with user as key and another map as value, which has path as key and etag as value */ + private $storedETAG = null; + /** @var int */ + private $storedFileID = null; /** * @Given /^using dav path "([^"]*)"$/ @@ -749,4 +751,33 @@ trait WebDav { } + /** + * @param string $user + * @param string $path + * @return int + */ + private function getFileIdForPath($user, $path) { + $propertiesTable = new \Behat\Gherkin\Node\TableNode([["{http://owncloud.org/ns}fileid"]]); + $this->asGetsPropertiesOfFolderWith($user, 'file', $path, $propertiesTable); + return (int) $this->response['{http://owncloud.org/ns}fileid']; + } + + /** + * @Given /^User "([^"]*)" stores id of file "([^"]*)"$/ + * @param string $user + * @param string $path + */ + public function userStoresFileIdForPath($user, $path) { + $this->storedFileID = $this->getFileIdForPath($user, $path); + } + + /** + * @Given /^User "([^"]*)" checks id of file "([^"]*)"$/ + * @param string $user + * @param string $path + */ + public function userChecksFileIdForPath($user, $path) { + $currentFileID = $this->getFileIdForPath($user, $path); + PHPUnit_Framework_Assert::assertEquals($currentFileID, $this->storedFileID); + } } diff --git a/build/integration/features/webdav-related.feature b/build/integration/features/webdav-related.feature index 6aee59036d3..b8ed1c4a778 100644 --- a/build/integration/features/webdav-related.feature +++ b/build/integration/features/webdav-related.feature @@ -517,3 +517,64 @@ Feature: webdav-related | /textfile2.txt | | /textfile3.txt | | /textfile4.txt | + + Scenario: Checking file id after a move using new endpoint + Given using new dav path + And user "user0" exists + And User "user0" stores id of file "/textfile0.txt" + When User "user0" moves file "/textfile0.txt" to "/FOLDER/textfile0.txt" + Then User "user0" checks id of file "/FOLDER/textfile0.txt" + + Scenario: Checking file id after a move overwrite using new chunking endpoint + Given using new dav path + And user "user0" exists + And User "user0" copies file "/textfile0.txt" to "/existingFile.txt" + And User "user0" stores id of file "/existingFile.txt" + And user "user0" creates a new chunking upload with id "chunking-42" + And user "user0" uploads new chunk file "1" with "AAAAA" to id "chunking-42" + And user "user0" uploads new chunk file "2" with "BBBBB" to id "chunking-42" + And user "user0" uploads new chunk file "3" with "CCCCC" to id "chunking-42" + When user "user0" moves new chunk file with id "chunking-42" to "/existingFile.txt" + Then User "user0" checks id of file "/existingFile.txt" + + Scenario: Renaming a folder to a backslash encoded should return an error using old endpoint + Given using old dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/%5C" + Then the HTTP status code should be "400" + + Scenario: Renaming a folder beginning with a backslash encoded should return an error using old endpoint + Given using old dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/%5Ctestshare" + Then the HTTP status code should be "400" + + Scenario: Renaming a folder including a backslash encoded should return an error using old endpoint + Given using old dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/hola%5Chola" + Then the HTTP status code should be "400" + + Scenario: Renaming a folder to a backslash encoded should return an error using new endpoint + Given using new dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/%5C" + Then the HTTP status code should be "400" + + Scenario: Renaming a folder beginning with a backslash encoded should return an error using new endpoint + Given using new dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/%5Ctestshare" + Then the HTTP status code should be "400" + + Scenario: Renaming a folder including a backslash encoded should return an error using new endpoint + Given using new dav path + And user "user0" exists + And user "user0" created a folder "/testshare" + When User "user0" moves folder "/testshare" to "/hola%5Chola" + Then the HTTP status code should be "400" diff --git a/config/config.sample.php b/config/config.sample.php index 84b98550fb0..4646de33082 100644 --- a/config/config.sample.php +++ b/config/config.sample.php @@ -1515,4 +1515,9 @@ $CONFIG = array( */ 'copied_sample_config' => true, +/** + * use a custom lookup server to publish user data + */ +'lookup_server' => 'https://lookup.nextcloud.com', + ); diff --git a/core/Command/Upgrade.php b/core/Command/Upgrade.php index aec74849fea..2e518f52e21 100644 --- a/core/Command/Upgrade.php +++ b/core/Command/Upgrade.php @@ -87,12 +87,6 @@ class Upgrade extends Command { */ protected function execute(InputInterface $input, OutputInterface $output) { - $skip3rdPartyAppsDisable = false; - - if ($input->getOption('no-app-disable')) { - $skip3rdPartyAppsDisable = true; - } - if(\OC::checkUpgrade(false)) { if (OutputInterface::VERBOSITY_NORMAL < $output->getVerbosity()) { // Prepend each line with a little timestamp @@ -107,7 +101,9 @@ class Upgrade extends Command { $this->logger ); - $updater->setSkip3rdPartyAppsDisable($skip3rdPartyAppsDisable); + if ($input->getOption('no-app-disable')) { + $updater->setSkip3rdPartyAppsDisable(true); + } $dispatcher = \OC::$server->getEventDispatcher(); $progress = new ProgressBar($output); $progress->setFormat(" %message%\n %current%/%max% [%bar%] %percent:3s%%"); diff --git a/core/css/styles.scss b/core/css/styles.scss index 69a876240b0..f85ae93ccc8 100644 --- a/core/css/styles.scss +++ b/core/css/styles.scss @@ -1064,7 +1064,7 @@ span.ui-icon { background-size: 16px 16px; padding: 14px; cursor: pointer; - opacity: .7; + opacity: .6; } } diff --git a/core/img/actions/user-plus.svg b/core/img/actions/user-plus.svg new file mode 100644 index 00000000000..16c59261a73 --- /dev/null +++ b/core/img/actions/user-plus.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1792 1792"> + <path d="m576 896q-159 0-271.5-112.5t-112.5-271.5 112.5-271.5 271.5-112.5 271.5 112.5 112.5 271.5-112.5 271.5-271.5 112.5zm960 128h352q13 0 22.5 9.5t9.5 22.5v192q0 13-9.5 22.5t-22.5 9.5h-352v352q0 13-9.5 22.5t-22.5 9.5h-192q-13 0-22.5-9.5t-9.5-22.5v-352h-352q-13 0-22.5-9.5t-9.5-22.5v-192q0-13 9.5-22.5t22.5-9.5h352v-352q0-13 9.5-22.5t22.5-9.5h192q13 0 22.5 9.5t9.5 22.5v352zm-736 224q0 52 38 90t90 38h256v238q-68 50-171 50h-874q-121 0-194-69t-73-190q0-53 3.5-103.5t14-109 26.5-108.5 43-97.5 62-81 85.5-53.5 111.5-20q19 0 39 17 79 61 154.5 91.5t164.5 30.5 164.5-30.5 154.5-91.5q20-17 39-17 132 0 217 96h-223q-52 0-90 38t-38 90v192z"/> +</svg> diff --git a/core/img/actions/user-times.svg b/core/img/actions/user-times.svg new file mode 100644 index 00000000000..f853784efc2 --- /dev/null +++ b/core/img/actions/user-times.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 1792 1792"> + <path d="m576 896q-159 0-271.5-112.5t-112.5-271.5 112.5-271.5 271.5-112.5 271.5 112.5 112.5 271.5-112.5 271.5-271.5 112.5zm1077 320l249 249q9 9 9 23 0 13-9 22l-136 136q-9 9-22 9-14 0-23-9l-249-249-249 249q-9 9-23 9-13 0-22-9l-136-136q-9-9-9-22 0-14 9-23l249-249-249-249q-9-9-9-23 0-13 9-22l136-136q9-9 22-9 14 0 23 9l249 249 249-249q9-9 23-9 13 0 22 9l136 136q9 9 9 22 0 14-9 23zm-498 0l-181 181q-37 37-37 91 0 53 37 90l83 83q-21 3-44 3h-874q-121 0-194-69t-73-190q0-53 3.5-103.5t14-109 26.5-108.5 43-97.5 62-81 85.5-53.5 111.5-20q19 0 39 17 154 122 319 122t319-122q20-17 39-17 28 0 57 6-28 27-41 50t-13 56q0 54 37 91z"/> +</svg> diff --git a/core/img/actions/verified.svg b/core/img/actions/verified.svg new file mode 100644 index 00000000000..2f9e34e2394 --- /dev/null +++ b/core/img/actions/verified.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <path d="m8 0a3 3 0 0 0 -2.8281 2.0098 3 3 0 0 0 -0.1719 -0.0098 3 3 0 0 0 -3 3 3 3 0 0 0 0.0059 0.1719 3 3 0 0 0 -2.0059 2.8281 3 3 0 0 0 2.0098 2.828 3 3 0 0 0 -0.0098 0.172 3 3 0 0 0 3 3 3 3 0 0 0 0.1719 -0.006 3 3 0 0 0 2.8281 2.006 3 3 0 0 0 2.828 -2.01 3 3 0 0 0 0.172 0.01 3 3 0 0 0 3 -3 3 3 0 0 0 -0.006 -0.172 3 3 0 0 0 2.006 -2.828 3 3 0 0 0 -2.01 -2.8281 3 3 0 0 0 0.01 -0.1719 3 3 0 0 0 -3 -3 3 3 0 0 0 -0.172 0.0059 3 3 0 0 0 -2.828 -2.0059zm2.934 4.5625 1.433 1.4336-5.7772 5.7789-2.9511-2.9508 1.414-1.414 1.5371 1.5351 4.3442-4.3828z" fill-rule="evenodd" fill="#0082c9"/> +</svg> diff --git a/core/img/actions/verify.svg b/core/img/actions/verify.svg new file mode 100644 index 00000000000..5ad11481055 --- /dev/null +++ b/core/img/actions/verify.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <path d="m8 0a3 3 0 0 0 -2.8281 2.0098 3 3 0 0 0 -0.1719 -0.0098 3 3 0 0 0 -3 3 3 3 0 0 0 0.0059 0.1719 3 3 0 0 0 -2.0059 2.8281 3 3 0 0 0 2.0098 2.828 3 3 0 0 0 -0.0098 0.172 3 3 0 0 0 3 3 3 3 0 0 0 0.1719 -0.006 3 3 0 0 0 2.8281 2.006 3 3 0 0 0 2.828 -2.01 3 3 0 0 0 0.172 0.01 3 3 0 0 0 3 -3 3 3 0 0 0 -0.006 -0.172 3 3 0 0 0 2.006 -2.828 3 3 0 0 0 -2.01 -2.8281 3 3 0 0 0 0.01 -0.1719 3 3 0 0 0 -3 -3 3 3 0 0 0 -0.172 0.0059 3 3 0 0 0 -2.828 -2.0059zm2.934 4.5625 1.433 1.4336-5.7772 5.7789-2.9511-2.9508 1.414-1.414 1.5371 1.5351 4.3442-4.3828z" fill-rule="evenodd" fill="#969696"/> +</svg> diff --git a/core/img/actions/verifying.svg b/core/img/actions/verifying.svg new file mode 100644 index 00000000000..beb824b7eec --- /dev/null +++ b/core/img/actions/verifying.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1"> + <path d="m8 0a3 3 0 0 0 -2.8281 2.0098 3 3 0 0 0 -0.1719 -0.0098 3 3 0 0 0 -3 3 3 3 0 0 0 0.0059 0.1719 3 3 0 0 0 -2.0059 2.8281 3 3 0 0 0 2.0098 2.828 3 3 0 0 0 -0.0098 0.172 3 3 0 0 0 3 3 3 3 0 0 0 0.1719 -0.006 3 3 0 0 0 2.8281 2.006 3 3 0 0 0 2.828 -2.01 3 3 0 0 0 0.172 0.01 3 3 0 0 0 3 -3 3 3 0 0 0 -0.006 -0.172 3 3 0 0 0 2.006 -2.828 3 3 0 0 0 -2.01 -2.8281 3 3 0 0 0 0.01 -0.1719 3 3 0 0 0 -3 -3 3 3 0 0 0 -0.172 0.0059 3 3 0 0 0 -2.828 -2.0059zm-0.0352 3.4922c0.58455-0.00435 1.1821 0.096216 1.7559 0.33398 0.69638 0.28822 1.2735 0.7423 1.7246 1.2832l1.055-1.0547v3.375h-3.375l1.125-1.125c-0.2925-0.3924-0.6924-0.7131-1.1777-0.9141-1.4351-0.5944-3.0794 0.0942-3.6739 1.5293l-1.5644-0.6504c0.7133-1.7221 2.3772-2.7643 4.1308-2.7773zm-4.4648 5.3437h3.375l-0.98438 0.98438c0.2773 0.3207 0.6189 0.5997 1.0371 0.7737 1.4351 0.594 3.0793-0.095 3.6743-1.5295l1.5625 0.65039c-0.951 2.2961-3.5905 3.3941-5.8867 2.4431-0.6318-0.261-1.1678-0.651-1.5996-1.125l-1.1777 1.178v-3.3751z" fill-rule="evenodd" fill="#0082c9"/> +</svg> diff --git a/core/js/contactsmenu.js b/core/js/contactsmenu.js index 15c48887d20..9ce27509e8b 100644 --- a/core/js/contactsmenu.js +++ b/core/js/contactsmenu.js @@ -64,7 +64,7 @@ + '</a>' + '{{/if}}' + '{{#if contact.hasTwoActions}}' - + '<a class="second-action" href="{{contact.secondAction.hyperlink}}">' + + '<a class="second-action" href="{{contact.secondAction.hyperlink}}" title="{{contact.secondAction.title}}">' + ' <img src="{{contact.secondAction.icon}}">' + '</a>' + '{{/if}}' @@ -228,6 +228,8 @@ // Show tooltip for top action this.$('.top-action').tooltip({placement: 'left'}); + // Show tooltip for second action + this.$('.second-action').tooltip({placement: 'left'}); return this; }, diff --git a/core/js/files/client.js b/core/js/files/client.js index cde3afde9d7..e8cf5b9bdb4 100644 --- a/core/js/files/client.js +++ b/core/js/files/client.js @@ -114,7 +114,11 @@ /** * Preview availability */ - [Client.NS_NEXTCLOUD, 'has-preview'] + [Client.NS_NEXTCLOUD, 'has-preview'], + /** + * Mount type + */ + [Client.NS_NEXTCLOUD, 'mount-type'], ]; /** @@ -361,6 +365,11 @@ } } + var mounTypeProp = props['{' + Client.NS_NEXTCLOUD + '}mount-type']; + if (!_.isUndefined(mounTypeProp)) { + data.mountType = mounTypeProp; + } + // extend the parsed data using the custom parsers _.each(this._fileInfoParsers, function(parserFunction) { _.extend(data, parserFunction(response) || {}); diff --git a/core/js/share.js b/core/js/share.js index 262d0a5d166..194eba5fbd4 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -10,6 +10,7 @@ OC.Share = _.extend(OC.Share || {}, { SHARE_TYPE_EMAIL:4, SHARE_TYPE_REMOTE:6, SHARE_TYPE_CIRCLE:7, + SHARE_TYPE_GUEST:8, /** * Regular expression for splitting parts of remote share owners: diff --git a/core/js/sharedialogview.js b/core/js/sharedialogview.js index 3b09d13a7e2..007e13dd366 100644 --- a/core/js/sharedialogview.js +++ b/core/js/sharedialogview.js @@ -121,7 +121,7 @@ 'onShareWithFieldChanged' ); - OC.Plugins.attach('OCA.Share.ShareDialogView', this); + OC.Plugins.attach('OC.Share.ShareDialogView', this); }, onShareWithFieldChanged: function() { diff --git a/core/l10n/de.js b/core/l10n/de.js index db95ec3a297..e0ed6681902 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -51,12 +51,14 @@ OC.L10N.register( "%s (incompatible)" : "%s (inkompatibel)", "Following apps have been disabled: %s" : "Die folgenden Apps wurden deaktiviert: %s", "Already up to date" : "Bereits aktuell", - "No contacts found" : "Keine Adressen gefunden", - "Show all contacts …" : "Zeige alle Adressen...", - "There was an error loading your contacts" : "Fehler beim Laden Deiner Adressen", + "No contacts found" : "Keine Kontakte gefunden", + "Show all contacts …" : "Zeige alle Kontakte...", + "There was an error loading your contacts" : "Fehler beim Laden Deiner Kontakte", "Loading your contacts …" : "Lade Deine Adressen...", "Looking for {term} …" : "Suche nach {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Bei der Code-Integritätsprüfung sind Fehler aufgetreten. Mehr Informationen…</a>", + "No action available" : "Keine Aktion verfügbar", + "Error fetching contact actions" : "Fehler beim Einlesen der Kontakt-Aktionen", "Settings" : "Einstellungen", "Connection to server lost" : "Verbindung zum Server verloren", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem beim Laden der Seite, Seite wird in %n Sekunde nochmals geladen","Problem beim Laden der Seite, Seite wird in %n Sekunden nochmals geladen"], diff --git a/core/l10n/de.json b/core/l10n/de.json index abd82eefcad..3533b1eb96a 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -49,12 +49,14 @@ "%s (incompatible)" : "%s (inkompatibel)", "Following apps have been disabled: %s" : "Die folgenden Apps wurden deaktiviert: %s", "Already up to date" : "Bereits aktuell", - "No contacts found" : "Keine Adressen gefunden", - "Show all contacts …" : "Zeige alle Adressen...", - "There was an error loading your contacts" : "Fehler beim Laden Deiner Adressen", + "No contacts found" : "Keine Kontakte gefunden", + "Show all contacts …" : "Zeige alle Kontakte...", + "There was an error loading your contacts" : "Fehler beim Laden Deiner Kontakte", "Loading your contacts …" : "Lade Deine Adressen...", "Looking for {term} …" : "Suche nach {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Bei der Code-Integritätsprüfung sind Fehler aufgetreten. Mehr Informationen…</a>", + "No action available" : "Keine Aktion verfügbar", + "Error fetching contact actions" : "Fehler beim Einlesen der Kontakt-Aktionen", "Settings" : "Einstellungen", "Connection to server lost" : "Verbindung zum Server verloren", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem beim Laden der Seite, Seite wird in %n Sekunde nochmals geladen","Problem beim Laden der Seite, Seite wird in %n Sekunden nochmals geladen"], diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 6d0eddb9fc3..708bd46b6bf 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -51,12 +51,14 @@ OC.L10N.register( "%s (incompatible)" : "%s (inkompatibel)", "Following apps have been disabled: %s" : "Die folgenden Apps wurden deaktiviert: %s", "Already up to date" : "Bereits aktuell", - "No contacts found" : "Keine Adressen gefunden", - "Show all contacts …" : "Zeige alle Adressen...", - "There was an error loading your contacts" : "Fehler beim Laden Ihrer Adressen", - "Loading your contacts …" : "Lade Ihre Adressen ...", + "No contacts found" : "Keine Kontakte gefunden", + "Show all contacts …" : "Zeige alle Kontakte...", + "There was an error loading your contacts" : "Fehler beim Laden Ihrer Kontakte", + "Loading your contacts …" : "Lade Ihre Kontakte ...", "Looking for {term} …" : "Suche nach {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme bei der Code Integritätsprüfung. Mehr Informationen...</a>", + "No action available" : "Keine Aktion verfügbar", + "Error fetching contact actions" : "Fehler beim Einlesen der Kontakt-Aktionen", "Settings" : "Einstellungen", "Connection to server lost" : "Verbindung zum Server verloren", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem beim Laden der Seite, Seite wird in %n Sekunde nochmals geladen","Problem beim Laden der Seite. Seite wird in %n Sekunden erneut geladen"], diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index 3e29572b137..1825a5c74c4 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -49,12 +49,14 @@ "%s (incompatible)" : "%s (inkompatibel)", "Following apps have been disabled: %s" : "Die folgenden Apps wurden deaktiviert: %s", "Already up to date" : "Bereits aktuell", - "No contacts found" : "Keine Adressen gefunden", - "Show all contacts …" : "Zeige alle Adressen...", - "There was an error loading your contacts" : "Fehler beim Laden Ihrer Adressen", - "Loading your contacts …" : "Lade Ihre Adressen ...", + "No contacts found" : "Keine Kontakte gefunden", + "Show all contacts …" : "Zeige alle Kontakte...", + "There was an error loading your contacts" : "Fehler beim Laden Ihrer Kontakte", + "Loading your contacts …" : "Lade Ihre Kontakte ...", "Looking for {term} …" : "Suche nach {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Es gab Probleme bei der Code Integritätsprüfung. Mehr Informationen...</a>", + "No action available" : "Keine Aktion verfügbar", + "Error fetching contact actions" : "Fehler beim Einlesen der Kontakt-Aktionen", "Settings" : "Einstellungen", "Connection to server lost" : "Verbindung zum Server verloren", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem beim Laden der Seite, Seite wird in %n Sekunde nochmals geladen","Problem beim Laden der Seite. Seite wird in %n Sekunden erneut geladen"], diff --git a/core/l10n/es_MX.js b/core/l10n/es_MX.js index be3755deca7..bf2e584c82d 100644 --- a/core/l10n/es_MX.js +++ b/core/l10n/es_MX.js @@ -57,6 +57,8 @@ OC.L10N.register( "Loading your contacts …" : "Cargando sus contactos ... ", "Looking for {term} …" : "Buscando {term} ...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Se presentaron problemas con la verificación de integridad del código. Mayor información ...</a>", + "No action available" : "No hay acciones disponibles", + "Error fetching contact actions" : "Se presentó un error al traer las acciónes de contatos", "Settings" : "Ajustes", "Connection to server lost" : "Se ha perdido la conexión con el servidor", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Se presentó un erorr al cargar la página, recargando en %n segundo","Se presentó un erorr al cargar la página, recargando en %n segundo"], diff --git a/core/l10n/es_MX.json b/core/l10n/es_MX.json index 9a81983edc4..46c1a003bfc 100644 --- a/core/l10n/es_MX.json +++ b/core/l10n/es_MX.json @@ -55,6 +55,8 @@ "Loading your contacts …" : "Cargando sus contactos ... ", "Looking for {term} …" : "Buscando {term} ...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Se presentaron problemas con la verificación de integridad del código. Mayor información ...</a>", + "No action available" : "No hay acciones disponibles", + "Error fetching contact actions" : "Se presentó un error al traer las acciónes de contatos", "Settings" : "Ajustes", "Connection to server lost" : "Se ha perdido la conexión con el servidor", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Se presentó un erorr al cargar la página, recargando en %n segundo","Se presentó un erorr al cargar la página, recargando en %n segundo"], diff --git a/core/l10n/fr.js b/core/l10n/fr.js index d74cd39efe5..0af1365fa35 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -54,6 +54,7 @@ OC.L10N.register( "There was an error loading your contacts" : "Il y a eu une erreur lors du chargement de vos contacts", "Loading your contacts …" : "Chargement de vos contacts...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Il y a eu des problèmes à la vérification de l’intégrité du code. Plus d'infos...</a>", + "No action available" : "Aucune action disponible", "Settings" : "Paramètres", "Connection to server lost" : "Connexion au serveur perdu", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problème de chargement de la page, actualisation dans %n seconde","Problème de chargement de la page, actualisation dans %n secondes"], @@ -166,6 +167,7 @@ OC.L10N.register( "{sharee} (email)" : "{sharee} (email)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Partager", + "Share with other people by entering a user or group or an email address." : "Partager avec d'autres personnes en indiquant un utilisateur, un groupe ou une adresse email.", "Name or email address..." : "Nom ou adresse mail...", "Name or federated cloud ID..." : "Nom ou ID du cloud fédéré...", "Name, federated cloud ID or email address..." : "Nom, ID du cloud fédéré ou adresse mail...", @@ -266,6 +268,7 @@ OC.L10N.register( "Log in" : "Se connecter", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", + "You are about to grant \"%s\" access to your %s account." : "Vous êtes sur le point d'accorder à \"%s\" l'accès à votre compte \"%s\".", "Redirecting …" : "Redirection en cours...", "New password" : "Nouveau mot de passe", "New Password" : "Nouveau mot de passe", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index 0637a086a2b..6ec370f579d 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -52,6 +52,7 @@ "There was an error loading your contacts" : "Il y a eu une erreur lors du chargement de vos contacts", "Loading your contacts …" : "Chargement de vos contacts...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Il y a eu des problèmes à la vérification de l’intégrité du code. Plus d'infos...</a>", + "No action available" : "Aucune action disponible", "Settings" : "Paramètres", "Connection to server lost" : "Connexion au serveur perdu", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problème de chargement de la page, actualisation dans %n seconde","Problème de chargement de la page, actualisation dans %n secondes"], @@ -164,6 +165,7 @@ "{sharee} (email)" : "{sharee} (email)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Partager", + "Share with other people by entering a user or group or an email address." : "Partager avec d'autres personnes en indiquant un utilisateur, un groupe ou une adresse email.", "Name or email address..." : "Nom ou adresse mail...", "Name or federated cloud ID..." : "Nom ou ID du cloud fédéré...", "Name, federated cloud ID or email address..." : "Nom, ID du cloud fédéré ou adresse mail...", @@ -264,6 +266,7 @@ "Log in" : "Se connecter", "Stay logged in" : "Rester connecté", "Alternative Logins" : "Identifiants alternatifs", + "You are about to grant \"%s\" access to your %s account." : "Vous êtes sur le point d'accorder à \"%s\" l'accès à votre compte \"%s\".", "Redirecting …" : "Redirection en cours...", "New password" : "Nouveau mot de passe", "New Password" : "Nouveau mot de passe", diff --git a/core/l10n/is.js b/core/l10n/is.js index b9e896f2ed4..1f5f4676fec 100644 --- a/core/l10n/is.js +++ b/core/l10n/is.js @@ -54,6 +54,7 @@ OC.L10N.register( "Loading your contacts …" : "Hleð inn tengiliðalistum ...", "Looking for {term} …" : "Leita að {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Það komu upp vandamál með athugun á áreiðanleika kóða. Nánari upplýsingar…</a>", + "No action available" : "Engin aðgerð tiltæk", "Settings" : "Stillingar", "Connection to server lost" : "Tenging við miðlara rofnaði", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Vandamál við að hlaða inn síðu, endurhleð eftir %n sekúndu","Vandamál við að hlaða inn síðu, endurhleð eftir %n sekúndur"], @@ -268,6 +269,8 @@ OC.L10N.register( "Alternative Logins" : "Aðrar innskráningar", "You are about to grant \"%s\" access to your %s account." : "Þú ert að fara að leyfa \"%s\" aðgang að %s notandaaðgangnum þínum.", "App token" : "Teikn forrits", + "Alternative login using app token" : "Önnur innskráning með forritsteikni", + "Redirecting …" : "Endurbeini ...", "New password" : "Nýtt lykilorð", "New Password" : "Nýtt lykilorð", "Reset password" : "Endursetja lykilorð", diff --git a/core/l10n/is.json b/core/l10n/is.json index d17d32d79b2..9bd7e96bc46 100644 --- a/core/l10n/is.json +++ b/core/l10n/is.json @@ -52,6 +52,7 @@ "Loading your contacts …" : "Hleð inn tengiliðalistum ...", "Looking for {term} …" : "Leita að {term} …", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Það komu upp vandamál með athugun á áreiðanleika kóða. Nánari upplýsingar…</a>", + "No action available" : "Engin aðgerð tiltæk", "Settings" : "Stillingar", "Connection to server lost" : "Tenging við miðlara rofnaði", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Vandamál við að hlaða inn síðu, endurhleð eftir %n sekúndu","Vandamál við að hlaða inn síðu, endurhleð eftir %n sekúndur"], @@ -266,6 +267,8 @@ "Alternative Logins" : "Aðrar innskráningar", "You are about to grant \"%s\" access to your %s account." : "Þú ert að fara að leyfa \"%s\" aðgang að %s notandaaðgangnum þínum.", "App token" : "Teikn forrits", + "Alternative login using app token" : "Önnur innskráning með forritsteikni", + "Redirecting …" : "Endurbeini ...", "New password" : "Nýtt lykilorð", "New Password" : "Nýtt lykilorð", "Reset password" : "Endursetja lykilorð", diff --git a/core/l10n/nb.js b/core/l10n/nb.js index 18db108ae1e..16ac5e151db 100644 --- a/core/l10n/nb.js +++ b/core/l10n/nb.js @@ -57,6 +57,8 @@ OC.L10N.register( "Loading your contacts …" : "Laster inn kontaktene dine…", "Looking for {term} …" : "Ser etter {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Det oppstod problemer med sjekk av kode-integritet. Mer informasjon…</a>", + "No action available" : "Ingen handling tilgjengelig", + "Error fetching contact actions" : "Feil ved innhenting av kontakt-handlinger", "Settings" : "Innstillinger", "Connection to server lost" : "Mistet tilkobling til tjener", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem ved lasting av side, laster på nytt om %n sekund","Problem ved lasting av side, laster på nytt om %n sekunder"], @@ -100,16 +102,19 @@ OC.L10N.register( "Strong password" : "Sterkt passord", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vev-tjeneren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din vevtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", - "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.", + "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Denne tjeneren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne tjeneren hvis du vil ha full funksjonalitet.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen hurtigminne har blitt satt opp. For å øke ytelsen bør du sette opp et hurtigminne hvis det er tilgjengelig. Mer informasjon finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom er ikke lesbar for PHP, noe som frarådes av sikkerhetsgrunner. Mer informasjon finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du bruker PHP versjonen {version}. Vi anbefaler deg å oppgradere PHP versjonen for å utnytte <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> ytelse og sikkerhetsoppdateringer som tilbys av PHP Group</a>, så fort din distribusjon støtter det.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De omvendte mellomtjener-hodene er ikke satt opp rett, eller du kobler til Nextcloud fra en betrodd mellomtjener. Hvis du ikke kobler til Nextcloud fra en betrodd mellomtjener, er dette et sikkerhetsproblem, og kan tillate en angriper å forfalske deres IP-adresse slik den er synlig for Nextcloud. Ytterligere informasjon er å finne i <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjonen</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached er satt opp som distribuert mellomlager, men feil PHP-modul \"memcache\" er installert. \\OC\\Memcache\\Memcached støtter bare \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached-wikien</a> for informasjon om begge modulene.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Noen filer besto ikke gyldighetssjekken. Ytterligere informasjon om hvordan dette problemet kan løses finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste over ugyldige filer…</a> / <a href=\"{rescanEndpoint}\">Skann på ny…</a>)", "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "PHP OPcache er ikke satt opp rett. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For bedre ytelse anbefales det ↗</a> å bruke følgende innstillinger i <code>php.ini</code>:", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "PHP-funksjonen \"set_time_limit\" er ikke tilgjengelig. Dette kan resultere i at skript blir stoppet midt i kjøring, noe som knekker installasjonen din. Det anbefales sterkt å skru på denne funksjonen.", "Error occurred while checking server setup" : "Feil oppstod ved sjekking av tjener-oppsett", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Datamappen og filene dine er sannsynligvis tilgjengelige fra Internett. .htaccess-filen fungerer ikke. Det anbefales sterkt at du setter opp vev-tjeneren slik at datamappen ikke kan aksesseres eller at du flytter datamappen ut av vev-tjenerens dokumentrot.", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-header \"{header}\" er ikke satt opp lik \"{expected}\". Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\"- (Streng transportsikkerhet) HTTP-hodet er ikke satt opp til minst \"{seconds}\" sekunder. For forbedret sikkerhet anbefales det å skru på HSTS som beskrevet i våre <a href=\"{docUrl}\" rel=\"noreferrer\">sikkerhetstips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer tjeneren til å kreve HTTPS i stedet, som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.", "Shared" : "Delt", "Shared with {recipients}" : "Delt med {recipients}", @@ -152,6 +157,7 @@ OC.L10N.register( "Can create" : "Kan opprette", "Can change" : "Kan endre", "Can delete" : "Kan slette", + "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Access control" : "Tilgangskontroll", "Could not unshare" : "Kunne ikke avslutte deling", "Share details could not be loaded for this item." : "Klarte ikke å laste inn detaljer om deling for dette elementet.", @@ -200,7 +206,7 @@ OC.L10N.register( "An error occurred." : "En feil oppstod.", "Please reload the page." : "Last inn siden på nytt.", "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Oppdateringen var mislykket. For mer informasjon <a href=\"{url}\">se vår forum-artikkel</a> som beskriver dette problemet.", - "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "Oppdateringen feilet. Vennligst rapporter dette problemet til <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud miljøet</a>.", + "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "Oppdateringen feilet. Rapporter dette problemet til <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud-gemenskapen</a>.", "Continue to Nextcloud" : "Fortsett til Nextcloud", "_The update was successful. Redirecting you to Nextcloud in %n second._::_The update was successful. Redirecting you to Nextcloud in %n seconds._" : ["Oppdateringen var vellykket. Videresender deg til Nextcloud om %s sekund.","Oppdateringen var vellykket. Videresender deg til Nextcloud om %s sekunder."], "Searching other places" : "Søker andre steder", @@ -227,6 +233,7 @@ OC.L10N.register( "Message: %s" : "Melding: %s", "File: %s" : "Fil: %s", "Line: %s" : "Linje: %s", + "Trace" : "Sporing", "Security warning" : "Sikkerhetsadvarsel", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Datamappen og filene dine er sannsynligvis tilgjengelig fra Internett fordi .htaccess-filen ikke fungerer.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "For informasjon om hvordan du skal konfigurere tjeneren skikkelig, vennligst se i <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentasjonen</a>.", diff --git a/core/l10n/nb.json b/core/l10n/nb.json index 4cdaa800e07..f9e5b6616d1 100644 --- a/core/l10n/nb.json +++ b/core/l10n/nb.json @@ -55,6 +55,8 @@ "Loading your contacts …" : "Laster inn kontaktene dine…", "Looking for {term} …" : "Ser etter {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Det oppstod problemer med sjekk av kode-integritet. Mer informasjon…</a>", + "No action available" : "Ingen handling tilgjengelig", + "Error fetching contact actions" : "Feil ved innhenting av kontakt-handlinger", "Settings" : "Innstillinger", "Connection to server lost" : "Mistet tilkobling til tjener", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem ved lasting av side, laster på nytt om %n sekund","Problem ved lasting av side, laster på nytt om %n sekunder"], @@ -98,16 +100,19 @@ "Strong password" : "Sterkt passord", "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "Vev-tjeneren din er ikke satt opp til å tillate synkronisering av filer ennå, fordi WebDAV-grensesnittet ikke ser ut til å virke.", "Your web server is not set up properly to resolve \"{url}\". Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Din vevtjener er ikke satt opp korrekt for å hente \"{url}\". Mer informasjon finner du i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", - "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Denne serveren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne serveren hvis du vil ha full funksjonalitet.", + "This server has no working Internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. We suggest to enable Internet connection for this server if you want to have all features." : "Denne tjeneren har ingen fungerende internett-forbindelse. Dette betyr at noen funksjoner, som tilknytning av eksterne lagre, varslinger om oppdateringer eller installering av tredjeparts apper ikke vil virke. Fjerntilgang til filer og utsending av varsler på e-post vil kanskje ikke virke heller. Vi anbefaler å aktivere en internett-forbindelse for denne tjeneren hvis du vil ha full funksjonalitet.", "No memory cache has been configured. To enhance your performance please configure a memcache if available. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "Ingen hurtigminne har blitt satt opp. For å øke ytelsen bør du sette opp et hurtigminne hvis det er tilgjengelig. Mer informasjon finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "/dev/urandom is not readable by PHP which is highly discouraged for security reasons. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "/dev/urandom er ikke lesbar for PHP, noe som frarådes av sikkerhetsgrunner. Mer informasjon finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>.", "You are currently running PHP {version}. We encourage you to upgrade your PHP version to take advantage of <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\">performance and security updates provided by the PHP Group</a> as soon as your distribution supports it." : "Du bruker PHP versjonen {version}. Vi anbefaler deg å oppgradere PHP versjonen for å utnytte <a target=\"_blank\" rel=\"noreferrer\" href=\"{phpLink}\"> ytelse og sikkerhetsoppdateringer som tilbys av PHP Group</a>, så fort din distribusjon støtter det.", + "The reverse proxy headers configuration is incorrect, or you are accessing Nextcloud from a trusted proxy. If you are not accessing Nextcloud from a trusted proxy, this is a security issue and can allow an attacker to spoof their IP address as visible to Nextcloud. Further information can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>." : "De omvendte mellomtjener-hodene er ikke satt opp rett, eller du kobler til Nextcloud fra en betrodd mellomtjener. Hvis du ikke kobler til Nextcloud fra en betrodd mellomtjener, er dette et sikkerhetsproblem, og kan tillate en angriper å forfalske deres IP-adresse slik den er synlig for Nextcloud. Ytterligere informasjon er å finne i <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjonen</a>.", + "Memcached is configured as distributed cache, but the wrong PHP module \"memcache\" is installed. \\OC\\Memcache\\Memcached only supports \"memcached\" and not \"memcache\". See the <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached wiki about both modules</a>." : "Memcached er satt opp som distribuert mellomlager, men feil PHP-modul \"memcache\" er installert. \\OC\\Memcache\\Memcached støtter bare \"memcached\" og ikke \"memcache\". Se <a target=\"_blank\" rel=\"noreferrer\" href=\"{wikiLink}\">memcached-wikien</a> for informasjon om begge modulene.", "Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">documentation</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">List of invalid files…</a> / <a href=\"{rescanEndpoint}\">Rescan…</a>)" : "Noen filer besto ikke gyldighetssjekken. Ytterligere informasjon om hvordan dette problemet kan løses finnes i vår <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">dokumentasjon</a>. (<a href=\"{codeIntegrityDownloadEndpoint}\">Liste over ugyldige filer…</a> / <a href=\"{rescanEndpoint}\">Skann på ny…</a>)", "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "PHP OPcache er ikke satt opp rett. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For bedre ytelse anbefales det ↗</a> å bruke følgende innstillinger i <code>php.ini</code>:", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "PHP-funksjonen \"set_time_limit\" er ikke tilgjengelig. Dette kan resultere i at skript blir stoppet midt i kjøring, noe som knekker installasjonen din. Det anbefales sterkt å skru på denne funksjonen.", "Error occurred while checking server setup" : "Feil oppstod ved sjekking av tjener-oppsett", "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Datamappen og filene dine er sannsynligvis tilgjengelige fra Internett. .htaccess-filen fungerer ikke. Det anbefales sterkt at du setter opp vev-tjeneren slik at datamappen ikke kan aksesseres eller at du flytter datamappen ut av vev-tjenerens dokumentrot.", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "HTTP-header \"{header}\" er ikke satt opp lik \"{expected}\". Dette kan være en sikkerhetsrisiko og vi anbefaler at denne innstillingen endres.", + "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\"- (Streng transportsikkerhet) HTTP-hodet er ikke satt opp til minst \"{seconds}\" sekunder. For forbedret sikkerhet anbefales det å skru på HSTS som beskrevet i våre <a href=\"{docUrl}\" rel=\"noreferrer\">sikkerhetstips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du aksesserer denne nettsiden via HTTP. Vi anbefaler på det sterkeste at du konfigurerer tjeneren til å kreve HTTPS i stedet, som beskrevet i <a href=\"{docUrl}\">sikkerhetstips</a>.", "Shared" : "Delt", "Shared with {recipients}" : "Delt med {recipients}", @@ -150,6 +155,7 @@ "Can create" : "Kan opprette", "Can change" : "Kan endre", "Can delete" : "Kan slette", + "Secure drop (upload only)" : "Sikret filkasse (bare opplasting)", "Access control" : "Tilgangskontroll", "Could not unshare" : "Kunne ikke avslutte deling", "Share details could not be loaded for this item." : "Klarte ikke å laste inn detaljer om deling for dette elementet.", @@ -198,7 +204,7 @@ "An error occurred." : "En feil oppstod.", "Please reload the page." : "Last inn siden på nytt.", "The update was unsuccessful. For more information <a href=\"{url}\">check our forum post</a> covering this issue." : "Oppdateringen var mislykket. For mer informasjon <a href=\"{url}\">se vår forum-artikkel</a> som beskriver dette problemet.", - "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "Oppdateringen feilet. Vennligst rapporter dette problemet til <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud miljøet</a>.", + "The update was unsuccessful. Please report this issue to the <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud community</a>." : "Oppdateringen feilet. Rapporter dette problemet til <a href=\"https://github.com/nextcloud/server/issues\" target=\"_blank\">Nextcloud-gemenskapen</a>.", "Continue to Nextcloud" : "Fortsett til Nextcloud", "_The update was successful. Redirecting you to Nextcloud in %n second._::_The update was successful. Redirecting you to Nextcloud in %n seconds._" : ["Oppdateringen var vellykket. Videresender deg til Nextcloud om %s sekund.","Oppdateringen var vellykket. Videresender deg til Nextcloud om %s sekunder."], "Searching other places" : "Søker andre steder", @@ -225,6 +231,7 @@ "Message: %s" : "Melding: %s", "File: %s" : "Fil: %s", "Line: %s" : "Linje: %s", + "Trace" : "Sporing", "Security warning" : "Sikkerhetsadvarsel", "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Datamappen og filene dine er sannsynligvis tilgjengelig fra Internett fordi .htaccess-filen ikke fungerer.", "For information how to properly configure your server, please see the <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">documentation</a>." : "For informasjon om hvordan du skal konfigurere tjeneren skikkelig, vennligst se i <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dokumentasjonen</a>.", diff --git a/core/l10n/pl.js b/core/l10n/pl.js index ff414663d13..14e1af9a33b 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -14,6 +14,8 @@ OC.L10N.register( "No crop data provided" : "Brak danych do przycięcia", "No valid crop data provided" : "Brak danych do przycięcia", "Crop is not square" : "Przycięcie nie jest prostokątem", + "State token does not match" : "Token stanu nie pasuje", + "Auth flow can only be started unauthenticated." : "Autoryzacja przepływu może być rozpoczęta tylko niezautoryzowana", "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", "Couldn't reset password because the token is expired" : "Nie można zresetować hasła, ponieważ token wygasł", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nie udało się wysłać ponownego e-maila, ponieważ nie ma adresu e-mail do tego użytkownika. Proszę skontaktować się z administratorem.", @@ -49,7 +51,14 @@ OC.L10N.register( "%s (incompatible)" : "%s (niekompatybilne)", "Following apps have been disabled: %s" : "Poniższe aplikacje zostały wyłączone: %s", "Already up to date" : "Już zaktualizowano", + "No contacts found" : "Nie znaleziono żadnych kontaktów", + "Show all contacts …" : "Pokazuję wszystkie kontakty...", + "There was an error loading your contacts" : "Wystąpił błąd podczas ładowania twoich kontaktów", + "Loading your contacts …" : "Ładuję twoje kontakty...", + "Looking for {term} …" : "Szukam {term}...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Wystąpiły problemy przy sprawdzaniu integralności kodu Więcej informacji…</a>", + "No action available" : "Żadna akcja nie jest dostępna", + "Error fetching contact actions" : "Błąd podczas pobierania akcji dla kontaktu", "Settings" : "Ustawienia", "Connection to server lost" : "Utracone połączenie z serwerem", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem z załadowaniem strony, przeładowanie za %n sekundę","Problem z załadowaniem strony, przeładowanie za %n sekund","Problem z załadowaniem strony, przeładowanie za %n sekund"], @@ -103,6 +112,7 @@ OC.L10N.register( "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "PHP Opcache nie jest prawidłowo skonfigurowany <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dla lepszej wydajności zalecamy ↗</a> użycie następujących ustawień w <code>php.ini</code>:", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "Funkcja PHP \"set_time_limit\" nie jest dostępna. Może to powodować zatrzymanie skryptów w podczas działania i w efekcie przerwanie instalacji. Silnie rekomendujemy włączenie tej funkcji.", "Error occurred while checking server setup" : "Pojawił się błąd podczas sprawdzania ustawień serwera", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Twój katalog z danymi i twoje pliki prawdopodobnie są dostępne przez Internet. Plik .htaccess nie działa. Usilnie zalecamy, żebyś tak skonfigurował swój serwer, żeby katalog z danymi nie był dalej dostępny lub przenieś swój katalog z danymi poza katalog root serwera webowego.", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Nagłówek HTTP {header} nie jest skonfigurowany, aby pasował do {expected}. Jest to poterncjalne zagrożenie prywatności oraz bezpieczeństwa i zalecamy poprawienie tego ustawienia.", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Nagłówek HTTP \"Strict-Transport-Security\" nie jest ustawiony na przynajmniej \"{seconds}\" sekund. Dla zwiększenia bezpieczeństwa zalecamy ustawienie HSTS tak jak opisaliśmy to w naszych <a href=\"{docUrl}\" rel=\"noreferrer\">wskazówkach dot. bezpieczeństwa</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Dostęp do tej strony jest za pośrednictwem protokołu HTTP. Zalecamy skonfigurowanie dostępu do serwera za pomocą protokołu HTTPS zamiast HTTP, jak to opisano w naszych <a href=\"{docUrl}\">wskazówkach bezpieczeństwa</a>.", @@ -161,6 +171,13 @@ OC.L10N.register( "{sharee} (email)" : "{sharee} (e-mail)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Udostępnij", + "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy, ID chmury stowarzyszonej lub adres e-mail.", + "Share with other people by entering a user or group or a federated cloud ID." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy lub ID chmury stowarzyszonej.", + "Share with other people by entering a user or group or an email address." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy lub adresu e-mail.", + "Name or email address..." : "Nazwa lub adres e-mail...", + "Name or federated cloud ID..." : "Nazwa lub ID chmury stowarzyszonej...", + "Name, federated cloud ID or email address..." : "Nazwa, ID chmury stowarzyszonej lub adres e-mail...", + "Name..." : "Nazwa...", "Error removing share" : "Błąd podczas usuwania współdzielenia", "Non-existing tag #{tag}" : "Znacznik #{tag} nie istnieje", "restricted" : "ograniczone", @@ -257,6 +274,10 @@ OC.L10N.register( "Log in" : "Zaloguj", "Stay logged in" : "Pozostań zalogowany", "Alternative Logins" : "Alternatywne loginy", + "You are about to grant \"%s\" access to your %s account." : "Masz zamiar przyznać \"%s\" dostep do twojego %s konta.", + "App token" : "Token aplikacji", + "Alternative login using app token" : "Zaloguj alternatywnie używając tokenu aplikacji", + "Redirecting …" : "Przekierowuję...", "New password" : "Nowe hasło", "New Password" : "Nowe hasło", "Reset password" : "Zresetuj hasło", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 997d6b024a8..95589c8997b 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -12,6 +12,8 @@ "No crop data provided" : "Brak danych do przycięcia", "No valid crop data provided" : "Brak danych do przycięcia", "Crop is not square" : "Przycięcie nie jest prostokątem", + "State token does not match" : "Token stanu nie pasuje", + "Auth flow can only be started unauthenticated." : "Autoryzacja przepływu może być rozpoczęta tylko niezautoryzowana", "Couldn't reset password because the token is invalid" : "Nie można zresetować hasła, ponieważ token jest niepoprawny", "Couldn't reset password because the token is expired" : "Nie można zresetować hasła, ponieważ token wygasł", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nie udało się wysłać ponownego e-maila, ponieważ nie ma adresu e-mail do tego użytkownika. Proszę skontaktować się z administratorem.", @@ -47,7 +49,14 @@ "%s (incompatible)" : "%s (niekompatybilne)", "Following apps have been disabled: %s" : "Poniższe aplikacje zostały wyłączone: %s", "Already up to date" : "Już zaktualizowano", + "No contacts found" : "Nie znaleziono żadnych kontaktów", + "Show all contacts …" : "Pokazuję wszystkie kontakty...", + "There was an error loading your contacts" : "Wystąpił błąd podczas ładowania twoich kontaktów", + "Loading your contacts …" : "Ładuję twoje kontakty...", + "Looking for {term} …" : "Szukam {term}...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Wystąpiły problemy przy sprawdzaniu integralności kodu Więcej informacji…</a>", + "No action available" : "Żadna akcja nie jest dostępna", + "Error fetching contact actions" : "Błąd podczas pobierania akcji dla kontaktu", "Settings" : "Ustawienia", "Connection to server lost" : "Utracone połączenie z serwerem", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problem z załadowaniem strony, przeładowanie za %n sekundę","Problem z załadowaniem strony, przeładowanie za %n sekund","Problem z załadowaniem strony, przeładowanie za %n sekund"], @@ -101,6 +110,7 @@ "The PHP Opcache is not properly configured. <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">For better performance we recommend ↗</a> to use following settings in the <code>php.ini</code>:" : "PHP Opcache nie jest prawidłowo skonfigurowany <a target=\"_blank\" rel=\"noreferrer\" href=\"{docLink}\">Dla lepszej wydajności zalecamy ↗</a> użycie następujących ustawień w <code>php.ini</code>:", "The PHP function \"set_time_limit\" is not available. This could result in scripts being halted mid-execution, breaking your installation. We strongly recommend enabling this function." : "Funkcja PHP \"set_time_limit\" nie jest dostępna. Może to powodować zatrzymanie skryptów w podczas działania i w efekcie przerwanie instalacji. Silnie rekomendujemy włączenie tej funkcji.", "Error occurred while checking server setup" : "Pojawił się błąd podczas sprawdzania ustawień serwera", + "Your data directory and your files are probably accessible from the Internet. The .htaccess file is not working. It is strongly recommended that you configure your web server in a way that the data directory is no longer accessible or you move the data directory outside the web server document root." : "Twój katalog z danymi i twoje pliki prawdopodobnie są dostępne przez Internet. Plik .htaccess nie działa. Usilnie zalecamy, żebyś tak skonfigurował swój serwer, żeby katalog z danymi nie był dalej dostępny lub przenieś swój katalog z danymi poza katalog root serwera webowego.", "The \"{header}\" HTTP header is not configured to equal to \"{expected}\". This is a potential security or privacy risk and we recommend adjusting this setting." : "Nagłówek HTTP {header} nie jest skonfigurowany, aby pasował do {expected}. Jest to poterncjalne zagrożenie prywatności oraz bezpieczeństwa i zalecamy poprawienie tego ustawienia.", "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Nagłówek HTTP \"Strict-Transport-Security\" nie jest ustawiony na przynajmniej \"{seconds}\" sekund. Dla zwiększenia bezpieczeństwa zalecamy ustawienie HSTS tak jak opisaliśmy to w naszych <a href=\"{docUrl}\" rel=\"noreferrer\">wskazówkach dot. bezpieczeństwa</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Dostęp do tej strony jest za pośrednictwem protokołu HTTP. Zalecamy skonfigurowanie dostępu do serwera za pomocą protokołu HTTPS zamiast HTTP, jak to opisano w naszych <a href=\"{docUrl}\">wskazówkach bezpieczeństwa</a>.", @@ -159,6 +169,13 @@ "{sharee} (email)" : "{sharee} (e-mail)", "{sharee} ({type}, {owner})" : "{sharee} ({type}, {owner})", "Share" : "Udostępnij", + "Share with other people by entering a user or group, a federated cloud ID or an email address." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy, ID chmury stowarzyszonej lub adres e-mail.", + "Share with other people by entering a user or group or a federated cloud ID." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy lub ID chmury stowarzyszonej.", + "Share with other people by entering a user or group or an email address." : "Współdziel z innymi osobami przez wpisanie użytkownika lub grupy lub adresu e-mail.", + "Name or email address..." : "Nazwa lub adres e-mail...", + "Name or federated cloud ID..." : "Nazwa lub ID chmury stowarzyszonej...", + "Name, federated cloud ID or email address..." : "Nazwa, ID chmury stowarzyszonej lub adres e-mail...", + "Name..." : "Nazwa...", "Error removing share" : "Błąd podczas usuwania współdzielenia", "Non-existing tag #{tag}" : "Znacznik #{tag} nie istnieje", "restricted" : "ograniczone", @@ -255,6 +272,10 @@ "Log in" : "Zaloguj", "Stay logged in" : "Pozostań zalogowany", "Alternative Logins" : "Alternatywne loginy", + "You are about to grant \"%s\" access to your %s account." : "Masz zamiar przyznać \"%s\" dostep do twojego %s konta.", + "App token" : "Token aplikacji", + "Alternative login using app token" : "Zaloguj alternatywnie używając tokenu aplikacji", + "Redirecting …" : "Przekierowuję...", "New password" : "Nowe hasło", "New Password" : "Nowe hasło", "Reset password" : "Zresetuj hasło", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index 62883dd3803..dc6e0f5bd27 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -57,6 +57,8 @@ OC.L10N.register( "Loading your contacts …" : "Carregando seus contatos...", "Looking for {term} …" : "Procurando por {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Houve problemas com a verificação de integridade do código. Mais informações…</a>", + "No action available" : "Nenhuma ação disponível", + "Error fetching contact actions" : "Erro ao obter as ações de contato", "Settings" : "Configurações", "Connection to server lost" : "Conexão perdida com o servidor", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problema no carregamento da página, recarregando em %n segundo","Problema no carregamento da página, recarregando em %n segundos"], @@ -330,7 +332,7 @@ OC.L10N.register( "The update was successful. Redirecting you to Nextcloud now." : "A atualização terminou com sucesso. Redirecionando para Nextcloud agora.", "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Olá,\n\napenas para avisar que %s compartilhou %s com você.\nVeja isto: %s\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Olá,<br><br>só para avisar que %s compartilhou <strong>%s</strong> com você. <br><a href=\"%s\">Visualize-o!</a><br><br>" }, diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 95aef7d19af..3e12d124d0f 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -55,6 +55,8 @@ "Loading your contacts …" : "Carregando seus contatos...", "Looking for {term} …" : "Procurando por {term}…", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Houve problemas com a verificação de integridade do código. Mais informações…</a>", + "No action available" : "Nenhuma ação disponível", + "Error fetching contact actions" : "Erro ao obter as ações de contato", "Settings" : "Configurações", "Connection to server lost" : "Conexão perdida com o servidor", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Problema no carregamento da página, recarregando em %n segundo","Problema no carregamento da página, recarregando em %n segundos"], @@ -328,7 +330,7 @@ "The update was successful. Redirecting you to Nextcloud now." : "A atualização terminou com sucesso. Redirecionando para Nextcloud agora.", "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Olá,\n\napenas para avisar que %s compartilhou %s com você.\nVeja isto: %s\n\n", "The share will expire on %s." : "O compartilhamento irá expirar em %s.", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Use the following link to reset your password: {link}" : "Use o seguinte link para redefinir sua senha: {link}", "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> with you.<br><a href=\"%s\">View it!</a><br><br>" : "Olá,<br><br>só para avisar que %s compartilhou <strong>%s</strong> com você. <br><a href=\"%s\">Visualize-o!</a><br><br>" },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/core/l10n/tr.js b/core/l10n/tr.js index e0edb374618..0fa3793cb77 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -14,6 +14,8 @@ OC.L10N.register( "No crop data provided" : "Kırpma verileri belirtilmemiş", "No valid crop data provided" : "Geçerli bir kırpma verisi belirtilmemiş", "Crop is not square" : "Kırpma kare şeklinde değil", + "State token does not match" : "Durum kodu eşleşmiyor", + "Auth flow can only be started unauthenticated." : "Kimlik doğrulama işlemi yalnız kimlik doğrulanmamışken başlatılabilir.", "Couldn't reset password because the token is invalid" : "Kod geçersiz olduğundan parola sıfırlanamadı", "Couldn't reset password because the token is expired" : "Kodun süresi geçtiğinden parola sıfırlanamadı", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.", @@ -49,7 +51,14 @@ OC.L10N.register( "%s (incompatible)" : "%s (uyumsuz)", "Following apps have been disabled: %s" : "Aşağıdaki uygulamalar devre dışı bırakıldı: %s", "Already up to date" : "Zaten güncel", + "No contacts found" : "Herhangi bir kişi bulunamadı", + "Show all contacts …" : "Tüm kişileri görüntüle...", + "There was an error loading your contacts" : "Kişileriniz yüklenirken bir sorun çıktı", + "Loading your contacts …" : "Kişileriniz yükleniyor...", + "Looking for {term} …" : "{term} ifadesi aranıyor...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Kod bütünlük sınamasında sorunlar çıktı. Ayrıntılı bilgi…</a>", + "No action available" : "Yapılabilecek bir işlem yok", + "Error fetching contact actions" : "Kişi işlemleri alınırken sorun çıktı", "Settings" : "Ayarlar", "Connection to server lost" : "Sunucu bağlantısı kesildi", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Sayfa yüklenirken bir sorun çıktı. %n saniye sonra yeniden yüklenecek","Sayfa yüklenirken bir sorun çıktı. %n saniye sonra yeniden yüklenecek"], @@ -265,6 +274,10 @@ OC.L10N.register( "Log in" : "Oturum Aç", "Stay logged in" : "Bağlı kal", "Alternative Logins" : "Alternatif Oturum Açmalar", + "You are about to grant \"%s\" access to your %s account." : "\"%s\" erişim iznini %s hesabınıza vermek üzeresiniz.", + "App token" : "Uygulama Kodu", + "Alternative login using app token" : "Uygulama kodu ile alternatif oturum açma", + "Redirecting …" : "Yönlendiriliyor...", "New password" : "Yeni parola", "New Password" : "Yeni Parola", "Reset password" : "Parolayı sıfırla", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 922a9957310..e21e3c25728 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -12,6 +12,8 @@ "No crop data provided" : "Kırpma verileri belirtilmemiş", "No valid crop data provided" : "Geçerli bir kırpma verisi belirtilmemiş", "Crop is not square" : "Kırpma kare şeklinde değil", + "State token does not match" : "Durum kodu eşleşmiyor", + "Auth flow can only be started unauthenticated." : "Kimlik doğrulama işlemi yalnız kimlik doğrulanmamışken başlatılabilir.", "Couldn't reset password because the token is invalid" : "Kod geçersiz olduğundan parola sıfırlanamadı", "Couldn't reset password because the token is expired" : "Kodun süresi geçtiğinden parola sıfırlanamadı", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.", @@ -47,7 +49,14 @@ "%s (incompatible)" : "%s (uyumsuz)", "Following apps have been disabled: %s" : "Aşağıdaki uygulamalar devre dışı bırakıldı: %s", "Already up to date" : "Zaten güncel", + "No contacts found" : "Herhangi bir kişi bulunamadı", + "Show all contacts …" : "Tüm kişileri görüntüle...", + "There was an error loading your contacts" : "Kişileriniz yüklenirken bir sorun çıktı", + "Loading your contacts …" : "Kişileriniz yükleniyor...", + "Looking for {term} …" : "{term} ifadesi aranıyor...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">Kod bütünlük sınamasında sorunlar çıktı. Ayrıntılı bilgi…</a>", + "No action available" : "Yapılabilecek bir işlem yok", + "Error fetching contact actions" : "Kişi işlemleri alınırken sorun çıktı", "Settings" : "Ayarlar", "Connection to server lost" : "Sunucu bağlantısı kesildi", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["Sayfa yüklenirken bir sorun çıktı. %n saniye sonra yeniden yüklenecek","Sayfa yüklenirken bir sorun çıktı. %n saniye sonra yeniden yüklenecek"], @@ -263,6 +272,10 @@ "Log in" : "Oturum Aç", "Stay logged in" : "Bağlı kal", "Alternative Logins" : "Alternatif Oturum Açmalar", + "You are about to grant \"%s\" access to your %s account." : "\"%s\" erişim iznini %s hesabınıza vermek üzeresiniz.", + "App token" : "Uygulama Kodu", + "Alternative login using app token" : "Uygulama kodu ile alternatif oturum açma", + "Redirecting …" : "Yönlendiriliyor...", "New password" : "Yeni parola", "New Password" : "Yeni Parola", "Reset password" : "Parolayı sıfırla", diff --git a/core/l10n/zh_CN.js b/core/l10n/zh_CN.js index 731e2705933..ac94ef05305 100644 --- a/core/l10n/zh_CN.js +++ b/core/l10n/zh_CN.js @@ -14,10 +14,14 @@ OC.L10N.register( "No crop data provided" : "没有提供剪裁数据", "No valid crop data provided" : "没有提供有效的裁剪数据", "Crop is not square" : "裁剪的不是正方形", + "State token does not match" : "状态令牌无法匹配", "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码", "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.", + "Password reset" : "重置密码", "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "点击下面的按钮来重置你的密码。如果你并没有请求密码重置,请忽略这封邮件。", + "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "点击下述链接重置您的密码. 如果您没有请求重置密码, 请忽略本邮件.", + "Reset your password" : "重置您的密码", "%s password reset" : "重置 %s 的密码", "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.", "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.", @@ -46,7 +50,13 @@ OC.L10N.register( "%s (incompatible)" : "%s (不兼容)", "Following apps have been disabled: %s" : "下列应用已经被禁用: %s", "Already up to date" : "已经是最新", + "No contacts found" : "无法找到联系人", + "Show all contacts …" : "显示所有联系人...", + "There was an error loading your contacts" : "加载联系人出错", + "Loading your contacts …" : "加载您的联系人...", + "Looking for {term} …" : "查找 {term} ...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>", + "No action available" : "无可用操作", "Settings" : "设置", "Connection to server lost" : "与服务器的连接断开", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["加载页面出现问题,将在 %n 秒后重新加载"], @@ -69,6 +79,7 @@ OC.L10N.register( "No files in here" : "未找到文件", "Choose" : "选择", "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}", + "OK" : "确认", "Error loading message template: {error}" : "加载消息模板出错: {error}", "read-only" : "只读", "_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"], @@ -114,6 +125,7 @@ OC.L10N.register( "Expiration" : "过期", "Expiration date" : "过期日期", "Choose a password for the public link" : "为共享链接设置密码", + "Choose a password for the public link or press \"Enter ↵\"" : "为公开链接选择一个密码, 或按 \"Enter
\"", "Copied!" : "已经复制!", "Copy" : "复制", "Not supported!" : "无法支持!", @@ -126,15 +138,24 @@ OC.L10N.register( "Password protect" : "密码保护", "Allow upload and editing" : "允许上传和编辑", "Allow editing" : "允许编辑", + "upload only" : "仅上传", "Email link to person" : "发送链接到个人", "Send" : "发送", "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组", "Shared with you by {owner}" : "{owner} 分享给您", + "Choose a password for the mail share" : "为电子邮件分享选择一个密码", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享", "group" : "群组", "remote" : "外部", "email" : "邮件", + "shared by {sharer}" : "由 {sharer} 分享", "Unshare" : "取消共享", + "Can reshare" : "可以再次分享", + "Can edit" : "可以编辑", + "Can create" : "可以创建", + "Can change" : "可以修改", + "Can delete" : "可以删除", + "Access control" : "访问控制", "Could not unshare" : "无法共享", "Share details could not be loaded for this item." : "无法加载这个项目的分享详情", "_At least {count} character is needed for autocompletion_::_At least {count} characters are needed for autocompletion_" : ["{count}字符需要自动完成"], @@ -147,6 +168,10 @@ OC.L10N.register( "{sharee} (email)" : "{sharee} (邮件)", "{sharee} ({type}, {owner})" : "{share}({type},{owner})", "Share" : "分享", + "Name or email address..." : "姓名或电子邮件地址...", + "Name or federated cloud ID..." : "姓名或联合云 ID", + "Name, federated cloud ID or email address..." : "姓名, 联合云 ID 或电子邮件地址...", + "Name..." : "名称...", "Error removing share" : "移除分享时出错", "Non-existing tag #{tag}" : "标签 #{tag} 不存在", "restricted" : "受限", @@ -243,6 +268,8 @@ OC.L10N.register( "Log in" : "登录", "Stay logged in" : "保持登录", "Alternative Logins" : "其他登录方式", + "App token" : "App 令牌", + "Redirecting …" : "正在转向...", "New password" : "新密码", "New Password" : "新密码", "Reset password" : "重置密码", diff --git a/core/l10n/zh_CN.json b/core/l10n/zh_CN.json index 5d95fb9aff3..31f0615379c 100644 --- a/core/l10n/zh_CN.json +++ b/core/l10n/zh_CN.json @@ -12,10 +12,14 @@ "No crop data provided" : "没有提供剪裁数据", "No valid crop data provided" : "没有提供有效的裁剪数据", "Crop is not square" : "裁剪的不是正方形", + "State token does not match" : "状态令牌无法匹配", "Couldn't reset password because the token is invalid" : "令牌无效, 无法重置密码", "Couldn't reset password because the token is expired" : "令牌已过期, 无法重置密码", "Could not send reset email because there is no email address for this username. Please contact your administrator." : "该用户没有设置电子邮件地址, 无发送重置邮件. 请联系管理员.", + "Password reset" : "重置密码", "Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "点击下面的按钮来重置你的密码。如果你并没有请求密码重置,请忽略这封邮件。", + "Click the following link to reset your password. If you have not requested the password reset, then ignore this email." : "点击下述链接重置您的密码. 如果您没有请求重置密码, 请忽略本邮件.", + "Reset your password" : "重置您的密码", "%s password reset" : "重置 %s 的密码", "Couldn't send reset email. Please contact your administrator." : "未能成功发送重置邮件, 请联系管理员.", "Couldn't send reset email. Please make sure your username is correct." : "无法发送重置邮件, 请检查您的用户名是否正确.", @@ -44,7 +48,13 @@ "%s (incompatible)" : "%s (不兼容)", "Following apps have been disabled: %s" : "下列应用已经被禁用: %s", "Already up to date" : "已经是最新", + "No contacts found" : "无法找到联系人", + "Show all contacts …" : "显示所有联系人...", + "There was an error loading your contacts" : "加载联系人出错", + "Loading your contacts …" : "加载您的联系人...", + "Looking for {term} …" : "查找 {term} ...", "<a href=\"{docUrl}\">There were problems with the code integrity check. More information…</a>" : "<a href=\"{docUrl}\">代码完整性检查出现异常, 点击查看详细信息...</a>", + "No action available" : "无可用操作", "Settings" : "设置", "Connection to server lost" : "与服务器的连接断开", "_Problem loading page, reloading in %n second_::_Problem loading page, reloading in %n seconds_" : ["加载页面出现问题,将在 %n 秒后重新加载"], @@ -67,6 +77,7 @@ "No files in here" : "未找到文件", "Choose" : "选择", "Error loading file picker template: {error}" : "加载文件选择模板出错: {error}", + "OK" : "确认", "Error loading message template: {error}" : "加载消息模板出错: {error}", "read-only" : "只读", "_{count} file conflict_::_{count} file conflicts_" : ["{count} 个文件冲突"], @@ -112,6 +123,7 @@ "Expiration" : "过期", "Expiration date" : "过期日期", "Choose a password for the public link" : "为共享链接设置密码", + "Choose a password for the public link or press \"Enter ↵\"" : "为公开链接选择一个密码, 或按 \"Enter
\"", "Copied!" : "已经复制!", "Copy" : "复制", "Not supported!" : "无法支持!", @@ -124,15 +136,24 @@ "Password protect" : "密码保护", "Allow upload and editing" : "允许上传和编辑", "Allow editing" : "允许编辑", + "upload only" : "仅上传", "Email link to person" : "发送链接到个人", "Send" : "发送", "Shared with you and the group {group} by {owner}" : "{owner} 分享给您及 {group} 分组", "Shared with you by {owner}" : "{owner} 分享给您", + "Choose a password for the mail share" : "为电子邮件分享选择一个密码", "{{shareInitiatorDisplayName}} shared via link" : "{{shareInitiatorDisplayName}} 通过链接分享", "group" : "群组", "remote" : "外部", "email" : "邮件", + "shared by {sharer}" : "由 {sharer} 分享", "Unshare" : "取消共享", + "Can reshare" : "可以再次分享", + "Can edit" : "可以编辑", + "Can create" : "可以创建", + "Can change" : "可以修改", + "Can delete" : "可以删除", + "Access control" : "访问控制", "Could not unshare" : "无法共享", "Share details could not be loaded for this item." : "无法加载这个项目的分享详情", "_At least {count} character is needed for autocompletion_::_At least {count} characters are needed for autocompletion_" : ["{count}字符需要自动完成"], @@ -145,6 +166,10 @@ "{sharee} (email)" : "{sharee} (邮件)", "{sharee} ({type}, {owner})" : "{share}({type},{owner})", "Share" : "分享", + "Name or email address..." : "姓名或电子邮件地址...", + "Name or federated cloud ID..." : "姓名或联合云 ID", + "Name, federated cloud ID or email address..." : "姓名, 联合云 ID 或电子邮件地址...", + "Name..." : "名称...", "Error removing share" : "移除分享时出错", "Non-existing tag #{tag}" : "标签 #{tag} 不存在", "restricted" : "受限", @@ -241,6 +266,8 @@ "Log in" : "登录", "Stay logged in" : "保持登录", "Alternative Logins" : "其他登录方式", + "App token" : "App 令牌", + "Redirecting …" : "正在转向...", "New password" : "新密码", "New Password" : "新密码", "Reset password" : "重置密码", diff --git a/lib/base.php b/lib/base.php index 3ca4775dbe2..41e4ef9573c 100644 --- a/lib/base.php +++ b/lib/base.php @@ -806,6 +806,8 @@ class OC { } catch (\OC\ServerNotAvailableException $e) { // not a GC exception, pass it on throw $e; + } catch (\OC\ForbiddenException $e) { + // filesystem blocked for this request, ignore } catch (\Exception $e) { // a GC exception should not prevent users from using OC, // so log the exception diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 8a883938b55..2151aeff33b 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -789,6 +789,7 @@ return array( 'OC\\Settings\\Admin\\Sharing' => $baseDir . '/lib/private/Settings/Admin/Sharing.php', 'OC\\Settings\\Admin\\TipsTricks' => $baseDir . '/lib/private/Settings/Admin/TipsTricks.php', 'OC\\Settings\\Application' => $baseDir . '/settings/Application.php', + 'OC\\Settings\\BackgroundJobs\\VerifyUserData' => $baseDir . '/settings/BackgroundJobs/VerifyUserData.php', 'OC\\Settings\\Controller\\AdminSettingsController' => $baseDir . '/settings/Controller/AdminSettingsController.php', 'OC\\Settings\\Controller\\AppSettingsController' => $baseDir . '/settings/Controller/AppSettingsController.php', 'OC\\Settings\\Controller\\AuthSettingsController' => $baseDir . '/settings/Controller/AuthSettingsController.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 70761572620..ec5190bc71d 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -819,6 +819,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\Settings\\Admin\\Sharing' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Sharing.php', 'OC\\Settings\\Admin\\TipsTricks' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/TipsTricks.php', 'OC\\Settings\\Application' => __DIR__ . '/../../..' . '/settings/Application.php', + 'OC\\Settings\\BackgroundJobs\\VerifyUserData' => __DIR__ . '/../../..' . '/settings/BackgroundJobs/VerifyUserData.php', 'OC\\Settings\\Controller\\AdminSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AdminSettingsController.php', 'OC\\Settings\\Controller\\AppSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AppSettingsController.php', 'OC\\Settings\\Controller\\AuthSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AuthSettingsController.php', diff --git a/lib/l10n/de.js b/lib/l10n/de.js index a4c9547373a..e97bf847260 100644 --- a/lib/l10n/de.js +++ b/lib/l10n/de.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s und %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s und %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s und %5$s", + "Enterprise bundle" : "Firmen-Paket", + "Groupware bundle" : "Groupware-Paket", + "Social sharing bundle" : "Soziales-Teilen-Paket", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", "PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.", "%sbit or higher PHP required." : "%sbit oder höheres PHP wird benötigt.", diff --git a/lib/l10n/de.json b/lib/l10n/de.json index 7b2051ab3bf..ce4fe1bddb2 100644 --- a/lib/l10n/de.json +++ b/lib/l10n/de.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s und %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s und %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s und %5$s", + "Enterprise bundle" : "Firmen-Paket", + "Groupware bundle" : "Groupware-Paket", + "Social sharing bundle" : "Soziales-Teilen-Paket", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", "PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.", "%sbit or higher PHP required." : "%sbit oder höheres PHP wird benötigt.", diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index c8c8bcf1086..9913751fece 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s und %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s und %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s und %5$s", + "Enterprise bundle" : "Firmen-Paket", + "Groupware bundle" : "Groupware-Paket", + "Social sharing bundle" : "Soziales-Teilen-Paket", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", "PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.", "%sbit or higher PHP required." : "%sbit oder höheres PHP wird benötigt.", diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 1e3a96b7808..dbdd7dc5fa3 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s und %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s und %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s und %5$s", + "Enterprise bundle" : "Firmen-Paket", + "Groupware bundle" : "Groupware-Paket", + "Social sharing bundle" : "Soziales-Teilen-Paket", "PHP %s or higher is required." : "PHP %s oder höher wird benötigt.", "PHP with a version lower than %s is required." : "PHP wird in einer früheren Version als %s benötigt.", "%sbit or higher PHP required." : "%sbit oder höheres PHP wird benötigt.", diff --git a/lib/l10n/es_MX.js b/lib/l10n/es_MX.js index d25ade5160d..9dccb55040f 100644 --- a/lib/l10n/es_MX.js +++ b/lib/l10n/es_MX.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s y %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s y %5$s", + "Enterprise bundle" : "Paquete empresarial", + "Groupware bundle" : "Paquete de Groupware", + "Social sharing bundle" : "Paquete de compartido social", "PHP %s or higher is required." : "Se requiere de PHPH %s o superior.", "PHP with a version lower than %s is required." : "PHP con una versión inferiror a la %s es requerido. ", "%sbit or higher PHP required." : "se requiere PHP para %sbit o superior.", diff --git a/lib/l10n/es_MX.json b/lib/l10n/es_MX.json index 73719fc715d..1fe3e401bd3 100644 --- a/lib/l10n/es_MX.json +++ b/lib/l10n/es_MX.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s y %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s y %5$s", + "Enterprise bundle" : "Paquete empresarial", + "Groupware bundle" : "Paquete de Groupware", + "Social sharing bundle" : "Paquete de compartido social", "PHP %s or higher is required." : "Se requiere de PHPH %s o superior.", "PHP with a version lower than %s is required." : "PHP con una versión inferiror a la %s es requerido. ", "%sbit or higher PHP required." : "se requiere PHP para %sbit o superior.", diff --git a/lib/l10n/nb.js b/lib/l10n/nb.js index 606de2c8dc2..a85fd7b3f17 100644 --- a/lib/l10n/nb.js +++ b/lib/l10n/nb.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s", + "Enterprise bundle" : "Bedrifts-pakke", + "Groupware bundle" : "Gruppevare-pakke", + "Social sharing bundle" : "Sosialdelings-pakke", "PHP %s or higher is required." : "PHP %s eller nyere kreves.", "PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.", "%sbit or higher PHP required." : "%sbit eller høyere PHP kreves", @@ -96,7 +99,7 @@ OC.L10N.register( "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke sette utøpsdato. Delinger kan ikke utløpe senere enn %s etter at de har blitt delt", "Cannot set expiration date. Expiration date is in the past" : "Kan ikke sette utløpsdato. Utløpsdato er tilbake i tid", "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke fjerne utløpsdato. Delinger må ha en utløpsdato.", - "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-tjener %s må implementere grensesnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delings-tjener %s ikke funnet", "Sharing backend for %s not found" : "Delings-tjener for %s ikke funnet", "Sharing failed, because the user %s is the original sharer" : "Deling feilet fordi brukeren %s er den som delte opprinnelig", diff --git a/lib/l10n/nb.json b/lib/l10n/nb.json index 97c0d164723..a2b50f467dd 100644 --- a/lib/l10n/nb.json +++ b/lib/l10n/nb.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s", + "Enterprise bundle" : "Bedrifts-pakke", + "Groupware bundle" : "Gruppevare-pakke", + "Social sharing bundle" : "Sosialdelings-pakke", "PHP %s or higher is required." : "PHP %s eller nyere kreves.", "PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.", "%sbit or higher PHP required." : "%sbit eller høyere PHP kreves", @@ -94,7 +97,7 @@ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan ikke sette utøpsdato. Delinger kan ikke utløpe senere enn %s etter at de har blitt delt", "Cannot set expiration date. Expiration date is in the past" : "Kan ikke sette utløpsdato. Utløpsdato er tilbake i tid", "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ikke fjerne utløpsdato. Delinger må ha en utløpsdato.", - "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-server %s må implementere grensesnittet OCP\\Share_Backend", + "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delings-tjener %s må implementere grensesnittet OCP\\Share_Backend", "Sharing backend %s not found" : "Delings-tjener %s ikke funnet", "Sharing backend for %s not found" : "Delings-tjener for %s ikke funnet", "Sharing failed, because the user %s is the original sharer" : "Deling feilet fordi brukeren %s er den som delte opprinnelig", diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js index d690d655d60..7179616d7bc 100644 --- a/lib/l10n/pl.js +++ b/lib/l10n/pl.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s i %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s i %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s i %5$s", + "Enterprise bundle" : "Zestaw biznesowy", + "Groupware bundle" : "Zestaw pracy grupowej", + "Social sharing bundle" : "Zestaw współdzielenia społecznościowego", "PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.", "PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.", "%sbit or higher PHP required." : "%sbit lub wyższe PHP jest wymagane.", diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json index a46ec2da2cf..5d89fbdb42d 100644 --- a/lib/l10n/pl.json +++ b/lib/l10n/pl.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s i %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s i %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s i %5$s", + "Enterprise bundle" : "Zestaw biznesowy", + "Groupware bundle" : "Zestaw pracy grupowej", + "Social sharing bundle" : "Zestaw współdzielenia społecznościowego", "PHP %s or higher is required." : "PHP %s lub wyższe jest wymagane.", "PHP with a version lower than %s is required." : "Wersja PHP jest niższa niż %s, która jest wymagana.", "%sbit or higher PHP required." : "%sbit lub wyższe PHP jest wymagane.", diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 4f2dd051538..4487ab33ff9 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s", + "Enterprise bundle" : "Pacote Enterprise", + "Groupware bundle" : "Pacote Groupware", + "Social sharing bundle" : "Pacote de compartilhamento social", "PHP %s or higher is required." : "PHP %s ou superior é requerido.", "PHP with a version lower than %s is required." : "É requerida uma versão PHP mais antiga que a %s .", "%sbit or higher PHP required." : "%sbit ou maior é requerido.", diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index 5a965bd867b..b6a23238e15 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s", + "Enterprise bundle" : "Pacote Enterprise", + "Groupware bundle" : "Pacote Groupware", + "Social sharing bundle" : "Pacote de compartilhamento social", "PHP %s or higher is required." : "PHP %s ou superior é requerido.", "PHP with a version lower than %s is required." : "É requerida uma versão PHP mais antiga que a %s .", "%sbit or higher PHP required." : "%sbit ou maior é requerido.", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index 676e62f3cab..1af9c97aa02 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -12,6 +12,9 @@ OC.L10N.register( "%1$s, %2$s and %3$s" : "%1$s, %2$s ve %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s ve %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s ve %5$s", + "Enterprise bundle" : "Kurumsal paket", + "Groupware bundle" : "Grup paketi", + "Social sharing bundle" : "Sosyal ağ paketi", "PHP %s or higher is required." : "PHP %s ya da daha sonraki bir sürümü gerekli.", "PHP with a version lower than %s is required." : "PHP %s ya da daha önceki bir sürümü gerekli.", "%sbit or higher PHP required." : "%sbit ya da daha sonraki bir PHP sürümü gerekli.", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index 02b2d17cc50..5e155176aac 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -10,6 +10,9 @@ "%1$s, %2$s and %3$s" : "%1$s, %2$s ve %3$s", "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s ve %4$s", "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s ve %5$s", + "Enterprise bundle" : "Kurumsal paket", + "Groupware bundle" : "Grup paketi", + "Social sharing bundle" : "Sosyal ağ paketi", "PHP %s or higher is required." : "PHP %s ya da daha sonraki bir sürümü gerekli.", "PHP with a version lower than %s is required." : "PHP %s ya da daha önceki bir sürümü gerekli.", "%sbit or higher PHP required." : "%sbit ya da daha sonraki bir PHP sürümü gerekli.", diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php index 2eb518d4f04..41fdad148aa 100644 --- a/lib/private/Accounts/AccountManager.php +++ b/lib/private/Accounts/AccountManager.php @@ -23,6 +23,7 @@ namespace OC\Accounts; +use OCP\BackgroundJob\IJobList; use OCP\IDBConnection; use OCP\IUser; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -53,6 +54,10 @@ class AccountManager { const PROPERTY_ADDRESS = 'address'; const PROPERTY_TWITTER = 'twitter'; + const NOT_VERIFIED = '0'; + const VERIFICATION_IN_PROGRESS = '1'; + const VERIFIED = '2'; + /** @var IDBConnection database connection */ private $connection; @@ -62,15 +67,22 @@ class AccountManager { /** @var EventDispatcherInterface */ private $eventDispatcher; + /** @var IJobList */ + private $jobList; + /** * AccountManager constructor. * * @param IDBConnection $connection * @param EventDispatcherInterface $eventDispatcher + * @param IJobList $jobList */ - public function __construct(IDBConnection $connection, EventDispatcherInterface $eventDispatcher) { + public function __construct(IDBConnection $connection, + EventDispatcherInterface $eventDispatcher, + IJobList $jobList) { $this->connection = $connection; $this->eventDispatcher = $eventDispatcher; + $this->jobList = $jobList; } /** @@ -85,6 +97,8 @@ class AccountManager { if (empty($userData)) { $this->insertNewUser($user, $data); } elseif ($userData !== $data) { + $data = $this->checkEmailVerification($userData, $data, $user); + $data = $this->updateVerifyStatus($userData, $data); $this->updateExistingUser($user, $data); } else { // nothing needs to be done if new and old data set are the same @@ -120,7 +134,110 @@ class AccountManager { return $userData; } - return json_decode($result[0]['data'], true); + $userDataArray = json_decode($result[0]['data'], true); + + $userDataArray = $this->addMissingDefaultValues($userDataArray); + + return $userDataArray; + } + + /** + * check if we need to ask the server for email verification, if yes we create a cronjob + * + * @param $oldData + * @param $newData + * @param IUser $user + * @return array + */ + protected function checkEmailVerification($oldData, $newData, IUser $user) { + if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) { + $this->jobList->add('OC\Settings\BackgroundJobs\VerifyUserData', + [ + 'verificationCode' => '', + 'data' => $newData[self::PROPERTY_EMAIL]['value'], + 'type' => self::PROPERTY_EMAIL, + 'uid' => $user->getUID(), + 'try' => 0, + 'lastRun' => time() + ] + ); + $newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS; + } + + return $newData; + } + + /** + * make sure that all expected data are set + * + * @param array $userData + * @return array + */ + protected function addMissingDefaultValues(array $userData) { + + foreach ($userData as $key => $value) { + if (!isset($userData[$key]['verified'])) { + $userData[$key]['verified'] = self::NOT_VERIFIED; + } + } + + return $userData; + } + + /** + * reset verification status if personal data changed + * + * @param array $oldData + * @param array $newData + * @return array + */ + protected function updateVerifyStatus($oldData, $newData) { + + // which account was already verified successfully? + $twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED; + $websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED; + $emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED; + + // keep old verification status if we don't have a new one + if(!isset($newData[self::PROPERTY_TWITTER]['verified'])) { + // keep old verification status if value didn't changed and an old value exists + $keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']); + $newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED; + } + + if(!isset($newData[self::PROPERTY_WEBSITE]['verified'])) { + // keep old verification status if value didn't changed and an old value exists + $keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']); + $newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED; + } + + if(!isset($newData[self::PROPERTY_EMAIL]['verified'])) { + // keep old verification status if value didn't changed and an old value exists + $keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']); + $newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS; + } + + // reset verification status if a value from a previously verified data was changed + if($twitterVerified && + $oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value'] + ) { + $newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED; + } + + if($websiteVerified && + $oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value'] + ) { + $newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED; + } + + if($emailVerified && + $oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value'] + ) { + $newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED; + } + + return $newData; + } /** @@ -171,21 +288,25 @@ class AccountManager { [ 'value' => $user->getDisplayName(), 'scope' => self::VISIBILITY_CONTACTS_ONLY, + 'verified' => self::NOT_VERIFIED, ], self::PROPERTY_ADDRESS => [ 'value' => '', 'scope' => self::VISIBILITY_PRIVATE, + 'verified' => self::NOT_VERIFIED, ], self::PROPERTY_WEBSITE => [ 'value' => '', 'scope' => self::VISIBILITY_PRIVATE, + 'verified' => self::NOT_VERIFIED, ], self::PROPERTY_EMAIL => [ 'value' => $user->getEMailAddress(), 'scope' => self::VISIBILITY_CONTACTS_ONLY, + 'verified' => self::NOT_VERIFIED, ], self::PROPERTY_AVATAR => [ @@ -195,11 +316,13 @@ class AccountManager { [ 'value' => '', 'scope' => self::VISIBILITY_PRIVATE, + 'verified' => self::NOT_VERIFIED, ], self::PROPERTY_TWITTER => [ 'value' => '', 'scope' => self::VISIBILITY_PRIVATE, + 'verified' => self::NOT_VERIFIED, ], ]; } diff --git a/lib/private/Accounts/Hooks.php b/lib/private/Accounts/Hooks.php index 38e7e20485b..eca56913fbd 100644 --- a/lib/private/Accounts/Hooks.php +++ b/lib/private/Accounts/Hooks.php @@ -89,7 +89,8 @@ class Hooks { if (is_null($this->accountManager)) { $this->accountManager = new AccountManager( \OC::$server->getDatabaseConnection(), - \OC::$server->getEventDispatcher() + \OC::$server->getEventDispatcher(), + \OC::$server->getJobList() ); } return $this->accountManager; diff --git a/lib/private/Files/Mount/MountPoint.php b/lib/private/Files/Mount/MountPoint.php index 42b79596c98..e7a37e382ff 100644 --- a/lib/private/Files/Mount/MountPoint.php +++ b/lib/private/Files/Mount/MountPoint.php @@ -274,4 +274,8 @@ class MountPoint implements IMountPoint { public function getMountId() { return $this->mountId; } + + public function getMountType() { + return ''; + } } diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 70b74a8242e..5e581feba6e 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -88,7 +88,7 @@ class View { /** * @var \OCP\Lock\ILockingProvider */ - private $lockingProvider; + protected $lockingProvider; private $lockingEnabled; diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php index 1eb5b1e078b..95480975da5 100644 --- a/lib/private/Share/Constants.php +++ b/lib/private/Share/Constants.php @@ -33,6 +33,7 @@ class Constants { const SHARE_TYPE_CONTACT = 5; // ToDo Check if it is still in use otherwise remove it const SHARE_TYPE_REMOTE = 6; const SHARE_TYPE_CIRCLE = 7; + const SHARE_TYPE_GUEST = 8; const FORMAT_NONE = -1; const FORMAT_STATUSES = -2; diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php index 6220613cbb1..0477f23e552 100644 --- a/lib/private/User/Manager.php +++ b/lib/private/User/Manager.php @@ -38,6 +38,7 @@ use OCP\IUser; use OCP\IUserBackend; use OCP\IUserManager; use OCP\IConfig; +use OCP\UserInterface; /** * Class Manager @@ -279,49 +280,64 @@ class Manager extends PublicEmitter implements IUserManager { /** * @param string $uid * @param string $password - * @throws \Exception - * @return bool|\OC\User\User the created user or false + * @throws \InvalidArgumentException + * @return bool|IUser the created user or false */ public function createUser($uid, $password) { + foreach ($this->backends as $backend) { + if ($backend->implementsActions(Backend::CREATE_USER)) { + return $this->createUserFromBackend($uid, $password, $backend); + } + } + + return false; + } + + /** + * @param string $uid + * @param string $password + * @param UserInterface $backend + * @return IUser|null + * @throws \InvalidArgumentException + */ + public function createUserFromBackend($uid, $password, UserInterface $backend) { $l = \OC::$server->getL10N('lib'); + // Check the name for bad characters // Allowed are: "a-z", "A-Z", "0-9" and "_.@-'" if (preg_match('/[^a-zA-Z0-9 _\.@\-\']/', $uid)) { - throw new \Exception($l->t('Only the following characters are allowed in a username:' + throw new \InvalidArgumentException($l->t('Only the following characters are allowed in a username:' . ' "a-z", "A-Z", "0-9", and "_.@-\'"')); } // No empty username - if (trim($uid) == '') { - throw new \Exception($l->t('A valid username must be provided')); + if (trim($uid) === '') { + throw new \InvalidArgumentException($l->t('A valid username must be provided')); } // No whitespace at the beginning or at the end if (trim($uid) !== $uid) { - throw new \Exception($l->t('Username contains whitespace at the beginning or at the end')); + throw new \InvalidArgumentException($l->t('Username contains whitespace at the beginning or at the end')); } // Username only consists of 1 or 2 dots (directory traversal) if ($uid === '.' || $uid === '..') { - throw new \Exception($l->t('Username must not consist of dots only')); + throw new \InvalidArgumentException($l->t('Username must not consist of dots only')); } // No empty password - if (trim($password) == '') { - throw new \Exception($l->t('A valid password must be provided')); + if (trim($password) === '') { + throw new \InvalidArgumentException($l->t('A valid password must be provided')); } // Check if user already exists if ($this->userExists($uid)) { - throw new \Exception($l->t('The username is already being used')); + throw new \InvalidArgumentException($l->t('The username is already being used')); } - $this->emit('\OC\User', 'preCreateUser', array($uid, $password)); - foreach ($this->backends as $backend) { - if ($backend->implementsActions(Backend::CREATE_USER)) { - $backend->createUser($uid, $password); - $user = $this->getUserObject($uid, $backend); - $this->emit('\OC\User', 'postCreateUser', array($user, $password)); - return $user; - } + $this->emit('\OC\User', 'preCreateUser', [$uid, $password]); + $backend->createUser($uid, $password); + $user = $this->getUserObject($uid, $backend); + if ($user instanceof IUser) { + $this->emit('\OC\User', 'postCreateUser', [$user, $password]); } - return false; + return $user; } /** @@ -396,6 +412,28 @@ class Manager extends PublicEmitter implements IUserManager { * returns how many users have logged in once * * @return int + * @since 12.0.0 + */ + public function countDisabledUsers() { + $queryBuilder = \OC::$server->getDatabaseConnection()->getQueryBuilder(); + $queryBuilder->select($queryBuilder->createFunction('COUNT(*)')) + ->from('preferences') + ->where($queryBuilder->expr()->eq('appid', $queryBuilder->createNamedParameter('core'))) + ->andWhere($queryBuilder->expr()->eq('configkey', $queryBuilder->createNamedParameter('enabled'))) + ->andWhere($queryBuilder->expr()->eq('configvalue', $queryBuilder->createNamedParameter('false'))); + + $query = $queryBuilder->execute(); + + $result = (int)$query->fetchColumn(); + $query->closeCursor(); + + return $result; + } + + /** + * returns how many users have logged in once + * + * @return int * @since 11.0.0 */ public function countSeenUsers() { diff --git a/lib/public/Files/Mount/IMountPoint.php b/lib/public/Files/Mount/IMountPoint.php index 0876d8b11d6..47830c68ffb 100644 --- a/lib/public/Files/Mount/IMountPoint.php +++ b/lib/public/Files/Mount/IMountPoint.php @@ -119,4 +119,13 @@ interface IMountPoint { * @since 9.1.0 */ public function getMountId(); + + /** + * Get the type of mount point, used to distinguish things like shares and external storages + * in the web interface + * + * @return string + * @since 12.0.0 + */ + public function getMountType(); } diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php index 1f8c23dbedf..6c6724487de 100644 --- a/lib/public/IUserManager.php +++ b/lib/public/IUserManager.php @@ -123,13 +123,23 @@ interface IUserManager { /** * @param string $uid * @param string $password - * @throws \Exception + * @throws \InvalidArgumentException * @return bool|\OCP\IUser the created user of false * @since 8.0.0 */ public function createUser($uid, $password); /** + * @param string $uid + * @param string $password + * @param UserInterface $backend + * @return IUser|null + * @throws \InvalidArgumentException + * @since 12.0.0 + */ + public function createUserFromBackend($uid, $password, UserInterface $backend); + + /** * returns how many users per backend exist (if supported by backend) * * @return array an array of backend class as key and count number as value @@ -150,6 +160,14 @@ interface IUserManager { * @return int * @since 11.0.0 */ + public function countDisabledUsers(); + + /** + * returns how many users have logged in once + * + * @return int + * @since 11.0.0 + */ public function countSeenUsers(); /** diff --git a/settings/BackgroundJobs/VerifyUserData.php b/settings/BackgroundJobs/VerifyUserData.php new file mode 100644 index 00000000000..4a32398f6c4 --- /dev/null +++ b/settings/BackgroundJobs/VerifyUserData.php @@ -0,0 +1,273 @@ +<?php +/** + * @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * 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 + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + + +namespace OC\Settings\BackgroundJobs; + + +use OC\Accounts\AccountManager; +use OC\BackgroundJob\Job; +use OC\BackgroundJob\JobList; +use OCP\AppFramework\Http; +use OCP\BackgroundJob\IJobList; +use OCP\Http\Client\IClientService; +use OCP\IConfig; +use OCP\ILogger; +use OCP\IUserManager; + +class VerifyUserData extends Job { + + /** @var bool */ + private $retainJob = true; + + /** @var int max number of attempts to send the request */ + private $maxTry = 24; + + /** @var int how much time should be between two tries (1 hour) */ + private $interval = 3600; + + /** @var AccountManager */ + private $accountManager; + + /** @var IUserManager */ + private $userManager; + + /** @var IClientService */ + private $httpClientService; + + /** @var ILogger */ + private $logger; + + /** @var string */ + private $lookupServerUrl; + + /** + * VerifyUserData constructor. + * + * @param AccountManager $accountManager + * @param IUserManager $userManager + * @param IClientService $clientService + * @param ILogger $logger + * @param IConfig $config + */ + public function __construct(AccountManager $accountManager, + IUserManager $userManager, + IClientService $clientService, + ILogger $logger, + IConfig $config + ) { + $this->accountManager = $accountManager; + $this->userManager = $userManager; + $this->httpClientService = $clientService; + $this->logger = $logger; + + $lookupServerUrl = $config->getSystemValue('lookup_server', 'https://lookup.nextcloud.com'); + $this->lookupServerUrl = rtrim($lookupServerUrl, '/'); + } + + /** + * run the job, then remove it from the jobList + * + * @param JobList $jobList + * @param ILogger $logger + */ + public function execute($jobList, ILogger $logger = null) { + + if ($this->shouldRun($this->argument)) { + parent::execute($jobList, $logger); + $jobList->remove($this, $this->argument); + if ($this->retainJob) { + $this->reAddJob($jobList, $this->argument); + } + } + + } + + protected function run($argument) { + + $try = (int)$argument['try'] + 1; + + switch($argument['type']) { + case AccountManager::PROPERTY_WEBSITE: + $result = $this->verifyWebsite($argument); + break; + case AccountManager::PROPERTY_TWITTER: + case AccountManager::PROPERTY_EMAIL: + $result = $this->verifyViaLookupServer($argument, $argument['type']); + break; + default: + // no valid type given, no need to retry + $this->logger->error($argument['type'] . ' is no valid type for user account data.'); + $result = true; + } + + if ($result === true || $try > $this->maxTry) { + $this->retainJob = false; + } + } + + /** + * verify web page + * + * @param array $argument + * @return bool true if we could check the verification code, otherwise false + */ + protected function verifyWebsite(array $argument) { + + $result = false; + + $url = rtrim($argument['data'], '/') . '/.well-known/' . 'CloudIdVerificationCode.txt'; + + $client = $this->httpClientService->newClient(); + try { + $response = $client->get($url); + } catch (\Exception $e) { + return false; + } + + if ($response->getStatusCode() === Http::STATUS_OK) { + $result = true; + $publishedCode = $response->getBody(); + // remove new lines and spaces + $publishedCodeSanitized = trim(preg_replace('/\s\s+/', ' ', $publishedCode)); + $user = $this->userManager->get($argument['uid']); + // we don't check a valid user -> give up + if ($user === null) { + $this->logger->error($argument['uid'] . ' doesn\'t exist, can\'t verify user data.'); + return $result; + } + $userData = $this->accountManager->getUser($user); + + if ($publishedCodeSanitized === $argument['verificationCode']) { + $userData[AccountManager::PROPERTY_WEBSITE]['verified'] = AccountManager::VERIFIED; + } else { + $userData[AccountManager::PROPERTY_WEBSITE]['verified'] = AccountManager::NOT_VERIFIED; + } + + $this->accountManager->updateUser($user, $userData); + } + + return $result; + } + + /** + * verify email address + * + * @param array $argument + * @param string $dataType + * @return bool true if we could check the verification code, otherwise false + */ + protected function verifyViaLookupServer(array $argument, $dataType) { + + $user = $this->userManager->get($argument['uid']); + + // we don't check a valid user -> give up + if ($user === null) { + $this->logger->error($argument['uid'] . ' doesn\'t exist, can\'t verify user data.'); + return true; + } + + $localUserData = $this->accountManager->getUser($user); + $cloudId = $user->getCloudId(); + + // ask lookup-server for user data + $lookupServerData = $this->queryLookupServer($cloudId); + + // for some reasons we couldn't read any data from the lookup server, try again later + if (empty($lookupServerData)) { + return false; + } + + // lookup server has verification data for wrong user data (e.g. email address), try again later + if ($lookupServerData[$dataType]['value'] !== $argument['data']) { + return false; + } + + // lookup server hasn't verified the email address so far, try again later + if ($lookupServerData[$dataType]['verified'] === AccountManager::NOT_VERIFIED) { + return false; + } + + $localUserData[$dataType]['verified'] = AccountManager::VERIFIED; + $this->accountManager->updateUser($user, $localUserData); + + return true; + } + + /** + * @param string $cloudId + * @return array + */ + protected function queryLookupServer($cloudId) { + try { + $client = $this->httpClientService->newClient(); + $response = $client->get( + $this->lookupServerUrl . '/users?search=' . urlencode($cloudId) . '&exactCloudId=1', + [ + 'timeout' => 10, + 'connect_timeout' => 3, + ] + ); + + $body = json_decode($response->getBody(), true); + + if ($body['federationId'] === $cloudId) { + return $body; + } + + } catch (\Exception $e) { + // do nothing, we will just re-try later + } + + return []; + } + + /** + * re-add background job with new arguments + * + * @param IJobList $jobList + * @param array $argument + */ + protected function reAddJob(IJobList $jobList, array $argument) { + $jobList->add('OC\Settings\BackgroundJobs\VerifyUserData', + [ + 'verificationCode' => $argument['verificationCode'], + 'data' => $argument['data'], + 'type' => $argument['type'], + 'uid' => $argument['uid'], + 'try' => (int)$argument['try'] + 1, + 'lastRun' => time() + ] + ); + } + + /** + * test if it is time for the next run + * + * @param array $argument + * @return bool + */ + protected function shouldRun(array $argument) { + $lastRun = (int)$argument['lastRun']; + return ((time() - $lastRun) > $this->interval); + } + +} diff --git a/settings/Controller/UsersController.php b/settings/Controller/UsersController.php index b42d4faa569..4fed2655940 100644 --- a/settings/Controller/UsersController.php +++ b/settings/Controller/UsersController.php @@ -34,9 +34,12 @@ use OC\Accounts\AccountManager; use OC\AppFramework\Http; use OC\ForbiddenException; use OC\Settings\Mailer\NewUserMailHelper; +use OC\Security\IdentityProof\Manager; use OCP\App\IAppManager; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\DataResponse; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; @@ -48,6 +51,7 @@ use OCP\IUserManager; use OCP\IUserSession; use OCP\Mail\IMailer; use OCP\IAvatarManager; +use OCP\Security\ICrypto; use OCP\Security\ISecureRandom; /** @@ -82,6 +86,14 @@ class UsersController extends Controller { private $secureRandom; /** @var NewUserMailHelper */ private $newUserMailHelper; + /** @var ITimeFactory */ + private $timeFactory; + /** @var ICrypto */ + private $crypto; + /** @var Manager */ + private $keyManager; + /** @var IJobList */ + private $jobList; /** * @param string $appName @@ -100,6 +112,10 @@ class UsersController extends Controller { * @param AccountManager $accountManager * @param ISecureRandom $secureRandom * @param NewUserMailHelper $newUserMailHelper + * @param ITimeFactory $timeFactory + * @param ICrypto $crypto + * @param Manager $keyManager + * @param IJobList $jobList */ public function __construct($appName, IRequest $request, @@ -116,7 +132,11 @@ class UsersController extends Controller { IAvatarManager $avatarManager, AccountManager $accountManager, ISecureRandom $secureRandom, - NewUserMailHelper $newUserMailHelper) { + NewUserMailHelper $newUserMailHelper, + ITimeFactory $timeFactory, + ICrypto $crypto, + Manager $keyManager, + IJobList $jobList) { parent::__construct($appName, $request); $this->userManager = $userManager; $this->groupManager = $groupManager; @@ -130,6 +150,10 @@ class UsersController extends Controller { $this->accountManager = $accountManager; $this->secureRandom = $secureRandom; $this->newUserMailHelper = $newUserMailHelper; + $this->timeFactory = $timeFactory; + $this->crypto = $crypto; + $this->keyManager = $keyManager; + $this->jobList = $jobList; // check for encryption state - TODO see formatUserForIndex $this->isEncryptionAppEnabled = $appManager->isEnabledForUser('encryption'); @@ -201,6 +225,7 @@ class UsersController extends Controller { 'email' => $displayName, 'isRestoreDisabled' => !$restorePossible, 'isAvatarAvailable' => $avatarAvailable, + 'isEnabled' => $user->isEnabled(), ]; } @@ -229,11 +254,6 @@ class UsersController extends Controller { * TODO: Tidy up and write unit tests - code is mainly static method calls */ public function index($offset = 0, $limit = 10, $gid = '', $pattern = '', $backend = '') { - // FIXME: The JS sends the group '_everyone' instead of no GID for the "all users" group. - if($gid === '_everyone') { - $gid = ''; - } - // Remove backends if(!empty($backend)) { $activeBackends = $this->userManager->getBackends(); @@ -248,15 +268,18 @@ class UsersController extends Controller { $users = []; if ($this->isAdmin) { - - if($gid !== '') { + if($gid !== '' && $gid !== '_disabledUsers') { $batch = $this->getUsersForUID($this->groupManager->displayNamesInGroup($gid, $pattern, $limit, $offset)); } else { $batch = $this->userManager->search($pattern, $limit, $offset); } foreach ($batch as $user) { - $users[] = $this->formatUserForIndex($user); + if( ($gid !== '_disabledUsers' && $user->isEnabled()) || + ($gid === '_disabledUsers' && !$user->isEnabled()) + ) { + $users[] = $this->formatUserForIndex($user); + } } } else { @@ -269,7 +292,7 @@ class UsersController extends Controller { $subAdminOfGroups = $gids; // Set the $gid parameter to an empty value if the subadmin has no rights to access a specific group - if($gid !== '' && !in_array($gid, $subAdminOfGroups)) { + if($gid !== '' && $gid !== '_disabledUsers' && !in_array($gid, $subAdminOfGroups)) { $gid = ''; } @@ -294,7 +317,11 @@ class UsersController extends Controller { $this->groupManager->getUserGroupIds($user), $subAdminOfGroups )); - $users[] = $this->formatUserForIndex($user, $userGroups); + if( ($gid !== '_disabledUsers' && $user->isEnabled()) || + ($gid === '_disabledUsers' && !$user->isEnabled()) + ) { + $users[] = $this->formatUserForIndex($user, $userGroups); + } } } @@ -311,12 +338,12 @@ class UsersController extends Controller { * @param string $email * @return DataResponse */ - public function create($username, $password, array $groups=array(), $email='') { + public function create($username, $password, array $groups=[], $email='') { if($email !== '' && !$this->mailer->validateMailAddress($email)) { return new DataResponse( - array( + [ 'message' => (string)$this->l10n->t('Invalid mail address') - ), + ], Http::STATUS_UNPROCESSABLE_ENTITY ); } @@ -340,9 +367,9 @@ class UsersController extends Controller { if (empty($groups)) { return new DataResponse( - array( + [ 'message' => $this->l10n->t('No valid group selected'), - ), + ], Http::STATUS_FORBIDDEN ); } @@ -350,9 +377,9 @@ class UsersController extends Controller { if ($this->userManager->userExists($username)) { return new DataResponse( - array( + [ 'message' => (string)$this->l10n->t('A user with that name already exists.') - ), + ], Http::STATUS_CONFLICT ); } @@ -361,9 +388,9 @@ class UsersController extends Controller { if ($password === '') { if ($email === '') { return new DataResponse( - array( + [ 'message' => (string)$this->l10n->t('To send a password link to the user an email address is required.') - ), + ], Http::STATUS_UNPROCESSABLE_ENTITY ); } @@ -380,9 +407,9 @@ class UsersController extends Controller { $message = $this->l10n->t('Unable to create user.'); } return new DataResponse( - array( + [ 'message' => (string) $message, - ), + ], Http::STATUS_FORBIDDEN ); } @@ -407,7 +434,7 @@ class UsersController extends Controller { $emailTemplate = $this->newUserMailHelper->generateTemplate($user, $generatePasswordResetToken); $this->newUserMailHelper->sendMail($user, $emailTemplate); } catch(\Exception $e) { - $this->log->error("Can't send new user mail to $email: " . $e->getMessage(), array('app' => 'settings')); + $this->log->error("Can't send new user mail to $email: " . $e->getMessage(), ['app' => 'settings']); } } // fetch users groups @@ -420,9 +447,9 @@ class UsersController extends Controller { } return new DataResponse( - array( - 'message' => (string)$this->l10n->t('Unable to create user.') - ), + [ + 'message' => (string) $this->l10n->t('Unable to create user.') + ], Http::STATUS_FORBIDDEN ); @@ -441,24 +468,24 @@ class UsersController extends Controller { if($userId === $id) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Unable to delete user.') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Unable to delete user.') + ] + ], Http::STATUS_FORBIDDEN ); } if(!$this->isAdmin && !$this->groupManager->getSubAdmin()->isUserAccessible($this->userSession->getUser(), $user)) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( + 'data' => [ 'message' => (string)$this->l10n->t('Authentication error') - ) - ), + ] + ], Http::STATUS_FORBIDDEN ); } @@ -466,30 +493,186 @@ class UsersController extends Controller { if($user) { if($user->delete()) { return new DataResponse( - array( + [ 'status' => 'success', - 'data' => array( + 'data' => [ 'username' => $id - ) - ), + ] + ], Http::STATUS_NO_CONTENT ); } } return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( + 'data' => [ 'message' => (string)$this->l10n->t('Unable to delete user.') - ) - ), + ] + ], Http::STATUS_FORBIDDEN ); } /** * @NoAdminRequired + * + * @param string $id + * @param int $enabled + * @return DataResponse + */ + public function setEnabled($id, $enabled) { + $enabled = (bool)$enabled; + if($enabled) { + $errorMsgGeneral = (string) $this->l10n->t('Error while enabling user.'); + } else { + $errorMsgGeneral = (string) $this->l10n->t('Error while disabling user.'); + } + + $userId = $this->userSession->getUser()->getUID(); + $user = $this->userManager->get($id); + + if ($userId === $id) { + return new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => $errorMsgGeneral + ] + ], Http::STATUS_FORBIDDEN + ); + } + + if($user) { + if (!$this->isAdmin && !$this->groupManager->getSubAdmin()->isUserAccessible($this->userSession->getUser(), $user)) { + return new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => (string) $this->l10n->t('Authentication error') + ] + ], + Http::STATUS_FORBIDDEN + ); + } + + $user->setEnabled($enabled); + return new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => $id, + 'enabled' => $enabled + ] + ] + ); + } else { + return new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => $errorMsgGeneral + ] + ], + Http::STATUS_FORBIDDEN + ); + } + + } + + /** + * Set the mail address of a user + * + * @NoAdminRequired + * @NoSubadminRequired + * @PasswordConfirmationRequired + * + * @param string $account + * @param bool $onlyVerificationCode only return verification code without updating the data + * @return DataResponse + */ + public function getVerificationCode($account, $onlyVerificationCode) { + + $user = $this->userSession->getUser(); + + if ($user === null) { + return new DataResponse([], Http::STATUS_BAD_REQUEST); + } + + $accountData = $this->accountManager->getUser($user); + $cloudId = $user->getCloudId(); + $message = "Use my Federated Cloud ID to share with me: " . $cloudId; + $signature = $this->signMessage($user, $message); + + $code = $message . ' ' . $signature; + $codeMd5 = $message . ' ' . md5($signature); + + switch ($account) { + case 'verify-twitter': + $accountData[AccountManager::PROPERTY_TWITTER]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS; + $msg = $this->l10n->t('In order to verify your Twitter account post following tweet on Twitter (please make sure to post it without any line breaks):'); + $code = $codeMd5; + $type = AccountManager::PROPERTY_TWITTER; + $data = $accountData[AccountManager::PROPERTY_TWITTER]['value']; + $accountData[AccountManager::PROPERTY_TWITTER]['signature'] = $signature; + break; + case 'verify-website': + $accountData[AccountManager::PROPERTY_WEBSITE]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS; + $msg = $this->l10n->t('In order to verify your Website store following content in your web-root at \'.well-known/CloudIdVerificationCode.txt\' (please make sure that the complete text is in one line):'); + $type = AccountManager::PROPERTY_WEBSITE; + $data = $accountData[AccountManager::PROPERTY_WEBSITE]['value']; + $accountData[AccountManager::PROPERTY_WEBSITE]['signature'] = $signature; + break; + default: + return new DataResponse([], Http::STATUS_BAD_REQUEST); + } + + if ($onlyVerificationCode === false) { + $this->accountManager->updateUser($user, $accountData); + + $this->jobList->add('OC\Settings\BackgroundJobs\VerifyUserData', + [ + 'verificationCode' => $code, + 'data' => $data, + 'type' => $type, + 'uid' => $user->getUID(), + 'try' => 0, + 'lastRun' => $this->getCurrentTime() + ] + ); + } + + return new DataResponse(['msg' => $msg, 'code' => $code]); + } + + /** + * get current timestamp + * + * @return int + */ + protected function getCurrentTime() { + return time(); + } + + /** + * sign message with users private key + * + * @param IUser $user + * @param string $message + * + * @return string base64 encoded signature + */ + protected function signMessage(IUser $user, $message) { + $privateKey = $this->keyManager->getKey($user)->getPrivate(); + openssl_sign(json_encode($message), $signature, $privateKey, OPENSSL_ALGO_SHA512); + $signatureBase64 = base64_encode($signature); + + return $signatureBase64; + } + + /** + * @NoAdminRequired * @NoSubadminRequired * @PasswordConfirmationRequired * @@ -523,14 +706,14 @@ class UsersController extends Controller { $twitterScope ) { - if(!empty($email) && !$this->mailer->validateMailAddress($email)) { + if (!empty($email) && !$this->mailer->validateMailAddress($email)) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Invalid mail address') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Invalid mail address') + ] + ], Http::STATUS_UNPROCESSABLE_ENTITY ); } @@ -550,9 +733,9 @@ class UsersController extends Controller { try { $this->saveUserSettings($user, $data); return new DataResponse( - array( + [ 'status' => 'success', - 'data' => array( + 'data' => [ 'userId' => $user->getUID(), 'avatarScope' => $avatarScope, 'displayname' => $displayname, @@ -563,9 +746,9 @@ class UsersController extends Controller { 'websiteScope' => $websiteScope, 'address' => $address, 'addressScope' => $addressScope, - 'message' => (string)$this->l10n->t('Settings saved') - ) - ), + 'message' => (string) $this->l10n->t('Settings saved') + ] + ], Http::STATUS_OK ); } catch (ForbiddenException $e) { @@ -731,36 +914,36 @@ class UsersController extends Controller { && !$this->groupManager->getSubAdmin()->isUserAccessible($this->userSession->getUser(), $user) ) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Forbidden') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Forbidden') + ] + ], Http::STATUS_FORBIDDEN ); } if($mailAddress !== '' && !$this->mailer->validateMailAddress($mailAddress)) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Invalid mail address') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Invalid mail address') + ] + ], Http::STATUS_UNPROCESSABLE_ENTITY ); } if (!$user) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Invalid user') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Invalid user') + ] + ], Http::STATUS_UNPROCESSABLE_ENTITY ); } @@ -768,12 +951,12 @@ class UsersController extends Controller { // for the permission of setting a email address if (!$user->canChangeDisplayName()) { return new DataResponse( - array( + [ 'status' => 'error', - 'data' => array( - 'message' => (string)$this->l10n->t('Unable to change mail address') - ) - ), + 'data' => [ + 'message' => (string) $this->l10n->t('Unable to change mail address') + ] + ], Http::STATUS_FORBIDDEN ); } @@ -784,14 +967,14 @@ class UsersController extends Controller { try { $this->saveUserSettings($user, $userData); return new DataResponse( - array( + [ 'status' => 'success', - 'data' => array( + 'data' => [ 'username' => $id, 'mailAddress' => $mailAddress, - 'message' => (string)$this->l10n->t('Email saved') - ) - ), + 'message' => (string) $this->l10n->t('Email saved') + ] + ], Http::STATUS_OK ); } catch (ForbiddenException $e) { diff --git a/settings/css/settings.css b/settings/css/settings.css index 0a1d4e046fe..0777f7e4cf4 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -26,6 +26,9 @@ input#openid, input#webdav { width:20em; } .nav-icon-second-factor-backup-codes { background-image: url('../img/password.svg?v=1'); } +.nav-icon-ssl-root-certificate { + background-image: url('../img/password.svg?v=1'); +} #avatarform { min-width: 145px; @@ -135,6 +138,35 @@ input#openid, input#webdav { width:20em; } top: 82px; pointer-events: none; } + +/* verify accounts */ +#personal-settings-container .verify { + position: absolute; + right: 14px; + top: 70px; +} +#personal-settings-container .verify img { + padding: 12px 7px 6px; +} +/* only show pointer cursor when popup will be there */ +#personal-settings-container .verify-action { + cursor: pointer; +} +.verification-dialog { + display: none; + right: -9px; + top: 40px; + width: 275px; +} +.verification-dialog p { + padding: 10px; +} +.verification-dialog .verificationCode { + font-family: monospace; + display: block; + overflow-wrap: break-word; +} + .federationScopeMenu { top: 44px; margin: -5px 0px 0; @@ -426,15 +458,16 @@ table.grid th, table.grid td { font-weight: normal; } td.name, td.password { padding-left:.8em; } -td.password>img,td.displayName>img, td.remove>a, td.quota>img { visibility:hidden; vertical-align: middle;} +td.password>img,td.displayName>img, td.quota>img { visibility:hidden; } td.password, td.quota, td.displayName { width:12em; cursor:pointer; } -td.password>span, td.quota>span, rd.displayName>span { margin-right: 1.2em; color: #C7C7C7; } +td.password>span, td.quota>span { margin-right: 1.2em; color: #C7C7C7; } span.usersLastLoginTooltip { white-space: nowrap; } /* dropdowns will be relative to this element */ #userlist { position: relative; } + #userlist .mailAddress, #userlist .storageLocation, #userlist .userBackend, @@ -469,13 +502,51 @@ span.usersLastLoginTooltip { white-space: nowrap; } display: none; } +.bubble { + z-index:1; + right: -6px; + top: auto; +} +.bubble:after { + right: 5px; +} + +.popovermenu a.menuitem { + height: 20px; + margin: 0; + padding: 0; + line-height: initial; +} + +#userlist .popovermenu { + margin-top: 4px; + border-top-right-radius: 3px; +} + +#userlist .popovermenu>ul.userActionsMenu { + right: 10px; +} + +#userlist .popovermenu>ul.userActionsMenu a span { + margin-left: 5px; +} + +#userlist .popovermenu { + display:none; +} + tr:hover>td.password>span, tr:hover>td.displayName>span { margin:0; cursor:pointer; } -tr:hover>td.remove>a, tr:hover>td.password>img,tr:hover>td.displayName>img, tr:hover>td.quota>img { visibility:visible; cursor:pointer; } -td.remove { +tr:hover>td.password>img,tr:hover>td.displayName>img, tr:hover>td.quota>img { visibility:visible; cursor:pointer; } +td.userActions { width: 25px; + text-align: center; } -tr:hover>td.remove>a { - float: left; +td.userActions .action { + position: relative; + top: 3px; +} +td.userActions .action:hover { + cursor: pointer; } div.recoveryPassword { left:50em; display:block; position:absolute; top:-1px; } diff --git a/settings/js/federationsettingsview.js b/settings/js/federationsettingsview.js index 2715c1e1e08..1a0a3dcb4d1 100644 --- a/settings/js/federationsettingsview.js +++ b/settings/js/federationsettingsview.js @@ -130,14 +130,52 @@ // TODO: user loading/success feedback this._config.save(); this._setFieldScopeIcon(field, scope); + this._updateVerifyButton(field, scope); + }, + + _updateVerifyButton: function(field, scope) { + // show verification button if the value is set and the scope is 'public' + if (field === 'twitter' || field === 'website'|| field === 'email') { + var verify = this.$('#' + field + 'form > .verify'); + var scope = this.$('#' + field + 'scope').val(); + var value = this.$('#' + field).val(); + + if (scope === 'public' && value !== '') { + verify.removeClass('hidden'); + return true; + } else { + verify.addClass('hidden'); + } + } + + return false; }, _showInputChangeSuccess: function(field) { - var $icon = this.$('#' + field + 'form > span'); + var $icon = this.$('#' + field + 'form > .icon-checkmark'); $icon.fadeIn(200); setTimeout(function() { $icon.fadeOut(300); }, 2000); + + var scope = this.$('#' + field + 'scope').val(); + var verifyAvailable = this._updateVerifyButton(field, scope); + + // change verification buttons from 'verify' to 'verifying...' on value change + if (verifyAvailable) { + if (field === 'twitter' || field === 'website') { + var verifyStatus = this.$('#' + field + 'form > .verify > #verify-' + field); + verifyStatus.attr('data-origin-title', t('core', 'Verify')); + verifyStatus.attr('src', OC.imagePath('core', 'actions/verify.svg')); + verifyStatus.data('status', '0'); + verifyStatus.addClass('verify-action'); + } else if (field === 'email') { + var verifyStatus = this.$('#' + field + 'form > .verify > #verify-' + field); + verifyStatus.attr('data-origin-title', t('core', 'Verifying …')); + verifyStatus.data('status', '1'); + verifyStatus.attr('src', OC.imagePath('core', 'actions/verifying.svg')); + } + } }, _setFieldScopeIcon: function(field, scope) { diff --git a/settings/js/personal.js b/settings/js/personal.js index 52ab2f23f87..254ee8f415b 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -201,6 +201,58 @@ $(document).ready(function () { } }); + var showVerifyDialog = function(dialog, howToVerify, verificationCode) { + var dialogContent = dialog.children('.verification-dialog-content'); + dialogContent.children(".explainVerification").text(howToVerify); + dialogContent.children(".verificationCode").text(verificationCode); + dialog.css('display', 'block'); + }; + + $(".verify").click(function (event) { + + event.stopPropagation(); + + var verify = $(this); + var indicator = $(this).children('img'); + var accountId = indicator.attr('id'); + var status = indicator.data('status'); + + var onlyVerificationCode = false; + if (parseInt(status) === 1) { + onlyVerificationCode = true; + } + + if (indicator.hasClass('verify-action')) { + $.ajax( + OC.generateUrl('/settings/users/{account}/verify', {account: accountId}), + { + method: 'GET', + data: {onlyVerificationCode: onlyVerificationCode} + } + ).done(function (data) { + var dialog = verify.children('.verification-dialog'); + showVerifyDialog($(dialog), data.msg, data.code); + indicator.attr('data-origin-title', t('core', 'Verifying …')); + indicator.attr('src', OC.imagePath('core', 'actions/verifying.svg')); + indicator.data('status', '1'); + }); + } + + }); + + // When the user clicks anywhere outside of the verification dialog we close it + $(document).click(function(event){ + var element = event.target; + var isDialog = $(element).hasClass('verificationCode') + || $(element).hasClass('explainVerification') + || $(element).hasClass('verification-dialog-content') + || $(element).hasClass('verification-dialog'); + if (!isDialog) { + $(document).find('.verification-dialog').css('display', 'none'); + } + }); + + var federationSettingsView = new OC.Settings.FederationSettingsView({ el: '#personal-settings' }); @@ -334,7 +386,7 @@ $(document).ready(function () { $('#removeavatar').removeClass('hidden').addClass('inlineblock'); } }); - + // Show token views var collection = new OC.Settings.AuthTokenCollection(); diff --git a/settings/js/users/groups.js b/settings/js/users/groups.js index aac1609bce7..16621441a64 100644 --- a/settings/js/users/groups.js +++ b/settings/js/users/groups.js @@ -48,7 +48,8 @@ GroupList = { }, getUserCount: function ($groupLiElement) { - return parseInt($groupLiElement.data('usercount'), 10); + var count = parseInt($groupLiElement.data('usercount'), 10); + return isNaN(count) ? 0 : count; }, modGroupCount: function(gid, diff) { @@ -208,10 +209,17 @@ GroupList = { }, + showDisabledUsers: function () { + UserList.empty(); + UserList.update('_disabledUsers'); + $userGroupList.find('li').removeClass('active'); + GroupList.getGroupLI('_disabledUsers').addClass('active'); + }, + showGroup: function (gid) { GroupList.activeGID = gid; UserList.empty(); - UserList.update(gid); + UserList.update(gid === '_everyone' ? '' : gid); $userGroupList.find('li').removeClass('active'); if (gid !== undefined) { //TODO: treat Everyone properly @@ -364,6 +372,11 @@ $(document).ready( function () { GroupList.showGroup(GroupList.getElementGID(this)); }); + // show disabled users + $userGroupList.on('click', '.disabledusers', function () { + GroupList.showDisabledUsers(); + }); + $('#newgroupname').on('input', function(){ GroupList.handleAddGroupInput(this.value); }); diff --git a/settings/js/users/users.js b/settings/js/users/users.js index 46f4e5977be..387709cd64c 100644 --- a/settings/js/users/users.js +++ b/settings/js/users/users.js @@ -48,11 +48,12 @@ var UserList = { * 'backend': 'LDAP', * 'email': 'username@example.org' * 'isRestoreDisabled':false + * 'isEnabled': true * } */ add: function (user) { - if (this.currentGid && this.currentGid !== '_everyone' && _.indexOf(user.groups, this.currentGid) < 0) { - return; + if (this.currentGid && this.currentGid !== '_everyone' && this.currentGid !== '_disabledUsers' && _.indexOf(user.groups, this.currentGid) < 0) { + return false; } var $tr = $userListBody.find('tr:first-child').clone(); @@ -77,6 +78,7 @@ var UserList = { $tr.data('displayname', user.displayname); $tr.data('mailAddress', user.email); $tr.data('restoreDisabled', user.isRestoreDisabled); + $tr.data('userEnabled', user.isEnabled); $tr.find('.name').text(user.name); $tr.find('td.displayName > span').text(user.displayname); $tr.find('td.mailAddress > span').text(user.email); @@ -97,18 +99,17 @@ var UserList = { $tdSubadmins.find('.action').tooltip({placement: 'top'}); /** - * remove action + * user actions menu */ - if ($tr.find('td.remove img').length === 0 && OC.currentUser !== user.name) { - var deleteImage = $('<img class="action">').attr({ - src: OC.imagePath('core', 'actions/delete') + if ($tr.find('td.userActions > span > img').length === 0 && OC.currentUser !== user.name) { + var menuImage = $('<img class="svg action">').attr({ + src: OC.imagePath('core', 'actions/more') }); - var deleteLink = $('<a class="action delete">') - .attr({ href: '#', 'original-title': t('settings', 'Delete')}) - .append(deleteImage); - $tr.find('td.remove').append(deleteLink); + var menuLink = $('<span class="toggleUserActions"></span>') + .append(menuImage); + $tr.find('td.userActions > span').replaceWith(menuLink); } else if (OC.currentUser === user.name) { - $tr.find('td.remove a').remove(); + $tr.find('td.userActions').empty(); } /** @@ -160,14 +161,6 @@ var UserList = { * append generated row to user list */ $tr.appendTo($userList); - if(UserList.isEmpty === true) { - //when the list was emptied, one row was left, necessary to keep - //add working and the layout unbroken. We need to remove this item - $tr.show(); - $userListBody.find('tr:first').remove(); - UserList.isEmpty = false; - UserList.checkUsersToLoad(); - } $quotaSelect.on('change', UserList.onQuotaSelect); @@ -338,6 +331,9 @@ var UserList = { getRestoreDisabled: function(element) { return ($(element).closest('tr').data('restoreDisabled') || ''); }, + getUserEnabled: function(element) { + return ($(element).closest('tr').data('userEnabled') || ''); + }, initDeleteHandling: function() { //set up handler UserDeleteHandler = new DeleteHandler('/settings/users/users', 'username', @@ -351,7 +347,7 @@ var UserList = { UserList.undoRemove); //when to mark user for delete - $userListBody.on('click', '.delete', function () { + $userListBody.on('click', '.action-remove', function () { // Call function for handling delete/undo var uid = UserList.getUID(this); @@ -908,6 +904,62 @@ $(document).ready(function () { UserList._triggerGroupEdit($td, isSubadminSelect); }); + $userListBody.on('click', '.toggleUserActions', function (event) { + event.stopPropagation(); + var $td = $(this).closest('td'); + var $tr = $($td).closest('tr'); + var menudiv = $td.find('.popovermenu'); + + if(menudiv.is(':visible')) { + menudiv.fadeOut(100); + return; + } + menudiv.find('.action-togglestate').empty(); + if($tr.data('userEnabled')) { + $('.action-togglestate', $td).html('<span class="icon icon-close"></span><span>'+t('settings', 'Disable')+'</span>'); + } else { + $('.action-togglestate', $td).html('<span class="icon icon-add"></span><span>'+t('settings', 'Enable')+'</span>'); + } + menudiv.click(function() { menudiv.fadeOut(100); }); + menudiv.hover('', function() { menudiv.fadeOut(100); }); + menudiv.fadeIn(100); + }); + + $userListBody.on('click', '.action-togglestate', function (event) { + event.stopPropagation(); + var $td = $(this).closest('td'); + var $tr = $td.closest('tr'); + var uid = UserList.getUID($td); + var setEnabled = UserList.getUserEnabled($td) ? 0 : 1; + $.post( + OC.generateUrl('/settings/users/{id}/setEnabled', {id: uid}), + {username: uid, enabled: setEnabled}, + function (result) { + if (result && result.status==='success'){ + var count = GroupList.getUserCount(GroupList.getGroupLI('_disabledUsers')); + $tr.remove(); + if(result.data.enabled == 1) { + $tr.data('userEnabled', true); + GroupList.setUserCount(GroupList.getGroupLI('_disabledUsers'), count-1); + } else { + $tr.data('userEnabled', false); + GroupList.setUserCount(GroupList.getGroupLI('_disabledUsers'), count+1); + } + } else { + OC.dialogs.alert(result.data.message, t('settings', 'Error while changing status of {user}', {user: uid})); + } + } + ).fail(function(result){ + var message = 'Unknown error'; + if( result.responseJSON && + result.responseJSON.data && + result.responseJSON.data.message) { + message = result.responseJSON.data.message; + } + OC.dialogs.alert(message, t('settings', 'Error while changing status of {user}', {user: uid})); + }); + }); + // init the quota field select box after it is shown the first time $('#app-settings').one('show', function() { $(this).find('#default_quota').singleSelect().on('change', UserList.onQuotaSelect); diff --git a/settings/l10n/cs.js b/settings/l10n/cs.js index ed56fd79396..e347a1de6fb 100644 --- a/settings/l10n/cs.js +++ b/settings/l10n/cs.js @@ -292,7 +292,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví a mobilní klienti aktuálně přihlášeni k vašemu účtu.", "Device" : "Přístroj", "Last activity" : "Poslední aktivita", - "Passcodes that give an app or device permissions to access your account." : "Přihlašovací údaj poskytující aplikaci nebo přístroji oprávnění pro přístup k tomuto účtu.", "Name" : "Název", "App name" : "Jméno aplikace", "Create new app password" : "Vytvořit nové heslo aplikace", @@ -345,6 +344,7 @@ OC.L10N.register( "Cheers!" : "Ať slouží!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n", "For password recovery and notifications" : "Pro obnovení hesla a upozornění", + "Passcodes that give an app or device permissions to access your account." : "Přihlašovací údaj poskytující aplikaci nebo přístroji oprávnění pro přístup k tomuto účtu.", "Follow us on Google Plus!" : "Sledujte nás na Google Plus!", "Subscribe to our twitter channel!" : "Odebírejte náš twitter kanál!", "Subscribe to our news feed!" : "Odebírejte náš kanál s novinkami!", diff --git a/settings/l10n/cs.json b/settings/l10n/cs.json index 068639398d2..b79c384c4cb 100644 --- a/settings/l10n/cs.json +++ b/settings/l10n/cs.json @@ -290,7 +290,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví a mobilní klienti aktuálně přihlášeni k vašemu účtu.", "Device" : "Přístroj", "Last activity" : "Poslední aktivita", - "Passcodes that give an app or device permissions to access your account." : "Přihlašovací údaj poskytující aplikaci nebo přístroji oprávnění pro přístup k tomuto účtu.", "Name" : "Název", "App name" : "Jméno aplikace", "Create new app password" : "Vytvořit nové heslo aplikace", @@ -343,6 +342,7 @@ "Cheers!" : "Ať slouží!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Vítej,\n\njen ti dáváme vědět, že nyní máš %s účet.\n\nTvé uživatelské jméno: %s\nPřístup: %s\n\n", "For password recovery and notifications" : "Pro obnovení hesla a upozornění", + "Passcodes that give an app or device permissions to access your account." : "Přihlašovací údaj poskytující aplikaci nebo přístroji oprávnění pro přístup k tomuto účtu.", "Follow us on Google Plus!" : "Sledujte nás na Google Plus!", "Subscribe to our twitter channel!" : "Odebírejte náš twitter kanál!", "Subscribe to our news feed!" : "Odebírejte náš kanál s novinkami!", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 908fec976d2..b7448cd71d0 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Deine Apps", "Enabled apps" : "Aktivierte Apps", "Disabled apps" : "Deaktivierte Apps", + "App bundles" : "App-Pakete", "Wrong password" : "Falsches Passwort", "Saved" : "Gespeichert", "No user supplied" : "Kein Benutzer übermittelt", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Gut gemacht, %s!", "If you received this email, the email configuration seems to be correct." : "Wenn du diese E-Mail empfangen hast, sind die E-Mail-Einstellungen richtig", "Email setting test" : "E-Mail-Einstellungen testen", + "Email could not be sent. Check your mail server log" : "E-Mail konnte nicht versandt werden. Prüfe Dein E-Mail-Server-Protokoll", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfe Deine Einstellungen. (Fehler: %s)", "You need to set your user email before being able to send test emails." : "Zunächst muss die Benutzer-E-Mail-Adresse angegeben werden, bevor Test-E-Mails verschickt werden können.", "Invalid request" : "Fehlerhafte Anfrage", @@ -107,6 +109,7 @@ OC.L10N.register( "Approved" : "Geprüft", "Experimental" : "Experimentell", "No apps found for {query}" : "Keine Applikationen für {query} gefunden", + "Enable all" : "Alle aktivieren", "Allow filesystem access" : "Erlaube Dateisystem-Zugriff", "Disconnect" : "Trennen", "Revoke" : "Widerrufen", @@ -182,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "E-Mail-Server", "Open documentation" : "Dokumentation öffnen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es ist wichtig diesen Server so zu konfigurieren, dass E-Mails versandt werden können, z.B. für den Passwort-Reset und Benachrichtigungen.", "Send mode" : "Sendemodus", "Encryption" : "Verschlüsselung", "From address" : "Absenderadresse", @@ -197,6 +201,7 @@ OC.L10N.register( "Test email settings" : "E-Mail-Einstellungen testen", "Send email" : "E-Mail senden", "Server-side encryption" : "Serverseitige Verschlüsselung", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Serverseitige Verschlüsselung ermöglicht es die auf diesen Server hochgeladenen Dateien zu verschlüsseln. Dies führt allerdings auch zu Nachteilen, wie z.B. einem Geschwindigkeitsverlust. Sie sollte deshalb nur eingeschaltet werden, wenn sie wirklich benötigt wird.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", "Please read carefully before activating server-side encryption: " : "Bitte sorgfältig lesen, bevor die serverseitige Verschlüsselung aktiviert wird:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.", @@ -211,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Kodierungsschlüssel der alten Verschlüsselung migrieren (ownCloud <= 8.0).", "Start migration" : "Migration beginnen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Für die Sicherheit und Geschwindigkeit Deiner Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Dir hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen findest Du im Tipps & Tricks- Abschnitt und in der Dokumentation.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration durchlesen, sowie die PHP-Konfiguration Ihres Servers überprüfen, insbesondere dann, wenn PHP-FPM eingesetzt wird.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", @@ -231,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Um die optimale Geschwindigkeit zu erreichen ist es wichtig, dass die Hintergrund-Aktivitäten richtig konfiguriert sind. Für größere Installationen ist 'Cron' die empfohlene Einstellung. Weitere Informationen findest Du in der Dokumentation.", "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", @@ -238,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Um dies auszuführen, wird die PHP-Posix Erweiterung benötigt. Weitere Informationen in der {linkstart}PHP-Dokumentation{linkend}.", "Version" : "Version", "Sharing" : "Teilen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als Administrator kannst Du das Teilen-Verhalten feinabstimmen. Weitere Informationen findest Du in der Dokumentation.", "Allow apps to use the Share API" : "Apps die Benutzung der Share-API erlauben", "Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen", "Allow public uploads" : "Öffentliches Hochladen erlauben", @@ -256,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite. (Wird nur gezeigt wenn die Dateiliste nicht angezeigt wird.) ", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", "Tips & tricks" : "Tipps & Tricks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Es gibt ein Menge von Eigenschaften und Konfigurationsschaltern die es ermöglichen, die Installation optimal zu nutzen und anzupassen. Hier einige Verweise auf weitere Informationen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dies empfiehlt sich besonders, wenn Sie den Desktop-Client für die Dateisynchronisation verwenden.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation ↗</a> schauen.", @@ -334,7 +343,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Deinem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", "Last activity" : "Letzte Aktivität", - "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Dein Konto zugreifen können.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier können individuelle Passwörter for Apps erzeugt werden. So must Du nicht Dein Passwort verteilen. Jedes Passwort kann individuell widerrufen werden.", "Name" : "Name", "App name" : "App-Name", "Create new app password" : "Neues App-Passwort erstellen", @@ -343,7 +352,10 @@ OC.L10N.register( "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Follow us on Google+!" : "Folge uns auf Google+!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", + "Follow us on Twitter!" : "Folge uns auf Twitter!", + "Check out our blog!" : "Sieh Dir unseren Blog an!", "Subscribe to our newsletter!" : "Abonniere unseren Newsletter!", "Settings" : "Einstellungen", "Show storage location" : "Speicherort anzeigen", @@ -390,6 +402,7 @@ OC.L10N.register( "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nZugriff: %s\n", "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", + "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Dein Konto zugreifen können.", "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonniere unseren RSS-Feed!", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index ca64b996f82..ec952cf0767 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -9,6 +9,7 @@ "Your apps" : "Deine Apps", "Enabled apps" : "Aktivierte Apps", "Disabled apps" : "Deaktivierte Apps", + "App bundles" : "App-Pakete", "Wrong password" : "Falsches Passwort", "Saved" : "Gespeichert", "No user supplied" : "Kein Benutzer übermittelt", @@ -29,6 +30,7 @@ "Well done, %s!" : "Gut gemacht, %s!", "If you received this email, the email configuration seems to be correct." : "Wenn du diese E-Mail empfangen hast, sind die E-Mail-Einstellungen richtig", "Email setting test" : "E-Mail-Einstellungen testen", + "Email could not be sent. Check your mail server log" : "E-Mail konnte nicht versandt werden. Prüfe Dein E-Mail-Server-Protokoll", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfe Deine Einstellungen. (Fehler: %s)", "You need to set your user email before being able to send test emails." : "Zunächst muss die Benutzer-E-Mail-Adresse angegeben werden, bevor Test-E-Mails verschickt werden können.", "Invalid request" : "Fehlerhafte Anfrage", @@ -105,6 +107,7 @@ "Approved" : "Geprüft", "Experimental" : "Experimentell", "No apps found for {query}" : "Keine Applikationen für {query} gefunden", + "Enable all" : "Alle aktivieren", "Allow filesystem access" : "Erlaube Dateisystem-Zugriff", "Disconnect" : "Trennen", "Revoke" : "Widerrufen", @@ -180,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "E-Mail-Server", "Open documentation" : "Dokumentation öffnen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es ist wichtig diesen Server so zu konfigurieren, dass E-Mails versandt werden können, z.B. für den Passwort-Reset und Benachrichtigungen.", "Send mode" : "Sendemodus", "Encryption" : "Verschlüsselung", "From address" : "Absenderadresse", @@ -195,6 +199,7 @@ "Test email settings" : "E-Mail-Einstellungen testen", "Send email" : "E-Mail senden", "Server-side encryption" : "Serverseitige Verschlüsselung", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Serverseitige Verschlüsselung ermöglicht es die auf diesen Server hochgeladenen Dateien zu verschlüsseln. Dies führt allerdings auch zu Nachteilen, wie z.B. einem Geschwindigkeitsverlust. Sie sollte deshalb nur eingeschaltet werden, wenn sie wirklich benötigt wird.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", "Please read carefully before activating server-side encryption: " : "Bitte sorgfältig lesen, bevor die serverseitige Verschlüsselung aktiviert wird:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.", @@ -209,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Kodierungsschlüssel der alten Verschlüsselung migrieren (ownCloud <= 8.0).", "Start migration" : "Migration beginnen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Für die Sicherheit und Geschwindigkeit Deiner Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Dir hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen findest Du im Tipps & Tricks- Abschnitt und in der Dokumentation.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration durchlesen, sowie die PHP-Konfiguration Ihres Servers überprüfen, insbesondere dann, wenn PHP-FPM eingesetzt wird.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", @@ -229,6 +235,7 @@ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", "Cron was not executed yet!" : "Cron wurde bis jetzt noch nicht ausgeführt!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Um die optimale Geschwindigkeit zu erreichen ist es wichtig, dass die Hintergrund-Aktivitäten richtig konfiguriert sind. Für größere Installationen ist 'Cron' die empfohlene Einstellung. Weitere Informationen findest Du in der Dokumentation.", "Execute one task with each page loaded" : "Führe eine Aufgabe mit jeder geladenen Seite aus", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutze den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", @@ -236,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Um dies auszuführen, wird die PHP-Posix Erweiterung benötigt. Weitere Informationen in der {linkstart}PHP-Dokumentation{linkend}.", "Version" : "Version", "Sharing" : "Teilen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als Administrator kannst Du das Teilen-Verhalten feinabstimmen. Weitere Informationen findest Du in der Dokumentation.", "Allow apps to use the Share API" : "Apps die Benutzung der Share-API erlauben", "Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen", "Allow public uploads" : "Öffentliches Hochladen erlauben", @@ -254,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite. (Wird nur gezeigt wenn die Dateiliste nicht angezeigt wird.) ", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", "Tips & tricks" : "Tipps & Tricks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Es gibt ein Menge von Eigenschaften und Konfigurationsschaltern die es ermöglichen, die Installation optimal zu nutzen und anzupassen. Hier einige Verweise auf weitere Informationen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen wird empfohlen, auf ein anderes Datenbank-Backend zu wechseln.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dies empfiehlt sich besonders, wenn Sie den Desktop-Client für die Dateisynchronisation verwenden.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutze bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation ↗</a> schauen.", @@ -332,7 +341,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Deinem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", "Last activity" : "Letzte Aktivität", - "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Dein Konto zugreifen können.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier können individuelle Passwörter for Apps erzeugt werden. So must Du nicht Dein Passwort verteilen. Jedes Passwort kann individuell widerrufen werden.", "Name" : "Name", "App name" : "App-Name", "Create new app password" : "Neues App-Passwort erstellen", @@ -341,7 +350,10 @@ "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Follow us on Google+!" : "Folge uns auf Google+!", "Like our facebook page!" : "Like uns auf unserer Facebook-Seite!", + "Follow us on Twitter!" : "Folge uns auf Twitter!", + "Check out our blog!" : "Sieh Dir unseren Blog an!", "Subscribe to our newsletter!" : "Abonniere unseren Newsletter!", "Settings" : "Einstellungen", "Show storage location" : "Speicherort anzeigen", @@ -388,6 +400,7 @@ "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass du jetzt ein %s-Konto hast.\n\nDein Benutzername: %s\nZugriff: %s\n", "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", + "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Dein Konto zugreifen können.", "Follow us on Google Plus!" : "Folgen Sie uns auf Google Plus!", "Subscribe to our twitter channel!" : "Abonniere unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonniere unseren RSS-Feed!", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index c5a15384685..8a22f3bee0c 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Ihre Apps", "Enabled apps" : "Aktivierte Apps", "Disabled apps" : "Deaktivierte Apps", + "App bundles" : "App-Pakete", "Wrong password" : "Falsches Passwort", "Saved" : "Gespeichert", "No user supplied" : "Kein Benutzer angegeben", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Gut gemacht, 1 %s!", "If you received this email, the email configuration seems to be correct." : "Wenn du diese EMail empfangen hast, scheint die EMail Konfiguration korrekt zu sein.", "Email setting test" : "EMail Einstellung Test", + "Email could not be sent. Check your mail server log" : "E-Mail konnte nicht versandt werden. Prüfen Sie Ihr E-Mail-Server-Protokoll", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Einstellungen. (Fehler: %s)", "You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.", "Invalid request" : "Ungültige Anforderung", @@ -107,6 +109,7 @@ OC.L10N.register( "Approved" : "Geprüft", "Experimental" : "Experimentell", "No apps found for {query}" : "Keine Applikationen für {query} gefunden", + "Enable all" : "Alle aktivieren", "Allow filesystem access" : "Erlaube Dateisystem-Zugriff", "Disconnect" : "Trennen", "Revoke" : "Widerrufen", @@ -182,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "E-Mail-Server", "Open documentation" : "Dokumentation öffnen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es ist wichtig diesen Server so zu konfigurieren, dass E-Mails versandt werden können, z.B. für den Passwort-Reset und Benachrichtigungen.", "Send mode" : "Sendemodus", "Encryption" : "Verschlüsselung", "From address" : "Absenderadresse", @@ -197,6 +201,7 @@ OC.L10N.register( "Test email settings" : "E-Mail-Einstellungen testen", "Send email" : "E-Mail senden", "Server-side encryption" : "Serverseitige Verschlüsselung", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Serverseitige Verschlüsselung ermöglicht es die auf diesen Server hochgeladenen Dateien zu verschlüsseln. Dies führt allerdings auch zu Nachteilen, wie z.B. einem Geschwindigkeitsverlust. Sie sollte deshalb nur eingeschaltet werden, wenn sie wirklich benötigt wird.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", "Please read carefully before activating server-side encryption: " : "Bitte lesen Sie ganz genau, bevor Sie die serverseitige Verschlüsselung aktivieren:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.", @@ -211,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren.", "Start migration" : "Migration beginnen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Für die Sicherheit und Geschwindigkeit Deiner Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Ihnen hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen finden Sie im Tipps & Tricks- Abschnitt und in der Dokumentation.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schauen Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration ihres Servers, insbesondere dann, wenn Sie PHP-FPM einsetzten.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", @@ -231,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Um die optimale Geschwindigkeit zu erreichen ist es wichtig, dass die Hintergrund-Aktivitäten richtig konfiguriert sind. Für größere Installationen ist 'Cron' die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", @@ -238,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Um dies auszuführen, benötigen Sie die PHP-Posix Erweiterung. Weitere Informationen in der {linkstart}PHP-Dokumentation{linkend}.", "Version" : "Version", "Sharing" : "Teilen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als Administrator können sie das Teilen-Verhalten feinabstimmen. Weitere Informationen finden Sie in der Dokumentation.", "Allow apps to use the Share API" : "Apps die Benutzung der Share-API erlauben", "Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen", "Allow public uploads" : "Öffentliches Hochladen erlauben", @@ -256,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite. (Wird nur gezeigt wenn die Dateiliste nicht angezeigt wird.) ", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", "Tips & tricks" : "Tipps & Tricks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Es gibt ein Menge von Eigenschaften und Konfigurationsschaltern die es ermöglichen, die Installation optimal zu nutzen und anzupassen. Hier einige Verweise auf weitere Informationen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen empfehlen wir, auf ein anderes Datenbank-Backend zu wechseln.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dies wird insbesondere bei der Benutzung des Dektop-Clients zur Synchronisierung empfohlen.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation ↗</a> schauen.", @@ -334,7 +343,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Ihrem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", "Last activity" : "Letzte Aktivität", - "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Ihr Konto zugreifen können.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier können individuelle Passwörter for Apps erzeugt werden. So müssen Sie nicht Ihr Passwort verteilen. Jedes Passwort kann individuell widerrufen werden.", "Name" : "Name", "App name" : "App-Name", "Create new app password" : "Neues App-Passwort erstellen", @@ -343,7 +352,10 @@ OC.L10N.register( "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Follow us on Google+!" : "Folgen Sie uns auf Google+!", "Like our facebook page!" : "Liken Sie uns auf unserer Facebook-Seite!", + "Follow us on Twitter!" : "Folgen Sie uns auf Twitter!", + "Check out our blog!" : "Sehen Sie sich unseren Blog an!", "Subscribe to our newsletter!" : "Abonnieren Sie unseren Newsletter!", "Settings" : "Einstellungen", "Show storage location" : "Speicherort anzeigen", @@ -390,6 +402,7 @@ OC.L10N.register( "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.\n\nIhr Benutzername: %s\nZugriff: %s\n\n", "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", + "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Ihr Konto zugreifen können.", "Follow us on Google Plus!" : "Folgen Sie uns bei Google Plus!", "Subscribe to our twitter channel!" : "Abonnieren Sie unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonnieren Sie unseren RSS-Feed!", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 585b01ae2b0..297f468ce8b 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -9,6 +9,7 @@ "Your apps" : "Ihre Apps", "Enabled apps" : "Aktivierte Apps", "Disabled apps" : "Deaktivierte Apps", + "App bundles" : "App-Pakete", "Wrong password" : "Falsches Passwort", "Saved" : "Gespeichert", "No user supplied" : "Kein Benutzer angegeben", @@ -29,6 +30,7 @@ "Well done, %s!" : "Gut gemacht, 1 %s!", "If you received this email, the email configuration seems to be correct." : "Wenn du diese EMail empfangen hast, scheint die EMail Konfiguration korrekt zu sein.", "Email setting test" : "EMail Einstellung Test", + "Email could not be sent. Check your mail server log" : "E-Mail konnte nicht versandt werden. Prüfen Sie Ihr E-Mail-Server-Protokoll", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Beim Senden der E-Mail ist ein Problem aufgetreten. Bitte überprüfen Sie Ihre Einstellungen. (Fehler: %s)", "You need to set your user email before being able to send test emails." : "Sie müssen Ihre Benutzer-E-Mail-Adresse einstellen, bevor Sie Test-E-Mails versenden können.", "Invalid request" : "Ungültige Anforderung", @@ -105,6 +107,7 @@ "Approved" : "Geprüft", "Experimental" : "Experimentell", "No apps found for {query}" : "Keine Applikationen für {query} gefunden", + "Enable all" : "Alle aktivieren", "Allow filesystem access" : "Erlaube Dateisystem-Zugriff", "Disconnect" : "Trennen", "Revoke" : "Widerrufen", @@ -180,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "E-Mail-Server", "Open documentation" : "Dokumentation öffnen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es ist wichtig diesen Server so zu konfigurieren, dass E-Mails versandt werden können, z.B. für den Passwort-Reset und Benachrichtigungen.", "Send mode" : "Sendemodus", "Encryption" : "Verschlüsselung", "From address" : "Absenderadresse", @@ -195,6 +199,7 @@ "Test email settings" : "E-Mail-Einstellungen testen", "Send email" : "E-Mail senden", "Server-side encryption" : "Serverseitige Verschlüsselung", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Serverseitige Verschlüsselung ermöglicht es die auf diesen Server hochgeladenen Dateien zu verschlüsseln. Dies führt allerdings auch zu Nachteilen, wie z.B. einem Geschwindigkeitsverlust. Sie sollte deshalb nur eingeschaltet werden, wenn sie wirklich benötigt wird.", "Enable server-side encryption" : "Serverseitige Verschlüsselung aktivieren", "Please read carefully before activating server-side encryption: " : "Bitte lesen Sie ganz genau, bevor Sie die serverseitige Verschlüsselung aktivieren:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.", @@ -209,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Sie müssen Ihre Verschlüsselungsschlüssel von der alten Verschlüsselung (ownCloud <= 8.0) zur Neuen migrieren.", "Start migration" : "Migration beginnen", "Security & setup warnings" : "Sicherheits- & Einrichtungswarnungen", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Für die Sicherheit und Geschwindigkeit Deiner Installation ist es von großer Bedeutung, dass sie richtig konfiguriert ist. Um Ihnen hierbei zu helfen werden einige automatische Tests durchgeführt. Weitere Informationen finden Sie im Tipps & Tricks- Abschnitt und in der Dokumentation.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP scheint zur Abfrage von Systemumgebungsvariablen nicht richtig eingerichtet zu sein. Der Test mit getenv (\"PATH\") liefert nur eine leere Antwort zurück.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Bitte schauen Sie in der <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Installationsdokumentation ↗</a>auf Hinweise zur PHP-Konfiguration, sowie die PHP-Konfiguration ihres Servers, insbesondere dann, wenn Sie PHP-FPM einsetzten.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Die schreibgeschützte Konfiguration wurde aktiviert. Dies verhindert das Setzen einiger Einstellungen über die Web-Schnittstelle. Weiterhin muss bei jedem Update der Schreibzugriff auf die Datei händisch aktiviert werden.", @@ -229,6 +235,7 @@ "Last cron job execution: %s." : "Letzte Cron-Job-Ausführung: %s.", "Last cron job execution: %s. Something seems wrong." : "Letzte Cron-Job-Ausführung: %s. Möglicherweise liegt ein Fehler vor.", "Cron was not executed yet!" : "Cron wurde bislang noch nicht ausgeführt!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Um die optimale Geschwindigkeit zu erreichen ist es wichtig, dass die Hintergrund-Aktivitäten richtig konfiguriert sind. Für größere Installationen ist 'Cron' die empfohlene Einstellung. Weitere Informationen finden Sie in der Dokumentation.", "Execute one task with each page loaded" : "Eine Aufgabe bei jedem Laden einer Seite ausführen", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php ist als Webcron-Dienst registriert, der die cron.php alle 15 Minuten per HTTP aufruft.", "Use system's cron service to call the cron.php file every 15 minutes." : "Benutzen Sie den systemeigenen Cron-Dienst, um die cron.php alle 15 Minuten aufzurufen.", @@ -236,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Um dies auszuführen, benötigen Sie die PHP-Posix Erweiterung. Weitere Informationen in der {linkstart}PHP-Dokumentation{linkend}.", "Version" : "Version", "Sharing" : "Teilen", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Als Administrator können sie das Teilen-Verhalten feinabstimmen. Weitere Informationen finden Sie in der Dokumentation.", "Allow apps to use the Share API" : "Apps die Benutzung der Share-API erlauben", "Allow users to share via link" : "Benutzern erlauben, Inhalte über Links zu teilen", "Allow public uploads" : "Öffentliches Hochladen erlauben", @@ -254,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Zeige Haftungsausschluss auf der öffentlichen Upload-Seite. (Wird nur gezeigt wenn die Dateiliste nicht angezeigt wird.) ", "This text will be shown on the public link upload page when the file list is hidden." : "Dieser Text wird auf der öffentlichen Upload-Seite angezeigt wenn die Dateiliste nicht angezeigt wird.", "Tips & tricks" : "Tipps & Tricks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Es gibt ein Menge von Eigenschaften und Konfigurationsschaltern die es ermöglichen, die Installation optimal zu nutzen und anzupassen. Hier einige Verweise auf weitere Informationen.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite wird als Datenbank verwendet. Bei größeren Installationen empfehlen wir, auf ein anderes Datenbank-Backend zu wechseln.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dies wird insbesondere bei der Benutzung des Dektop-Clients zur Synchronisierung empfohlen.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Um zu einer anderen Datenbank zu migrieren, benutzen Sie bitte die Kommandozeile: 'occ db:convert-type', oder in die <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">Dokumentation ↗</a> schauen.", @@ -332,7 +341,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Aktuell in Ihrem Konto eingeloggte Web-, Desktop- und Mobil-Clients.", "Device" : "Gerät", "Last activity" : "Letzte Aktivität", - "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Ihr Konto zugreifen können.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Hier können individuelle Passwörter for Apps erzeugt werden. So müssen Sie nicht Ihr Passwort verteilen. Jedes Passwort kann individuell widerrufen werden.", "Name" : "Name", "App name" : "App-Name", "Create new app password" : "Neues App-Passwort erstellen", @@ -341,7 +350,10 @@ "Username" : "Benutzername", "Done" : "Erledigt", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Entwickelt von der {communityopen}Nextcloud Community{linkclose}, der {githubopen}Quellcode{linkclose} ist lizensiert unter {licenseopen}AGPL{linkclose}-Lizenz.", + "Follow us on Google+!" : "Folgen Sie uns auf Google+!", "Like our facebook page!" : "Liken Sie uns auf unserer Facebook-Seite!", + "Follow us on Twitter!" : "Folgen Sie uns auf Twitter!", + "Check out our blog!" : "Sehen Sie sich unseren Blog an!", "Subscribe to our newsletter!" : "Abonnieren Sie unseren Newsletter!", "Settings" : "Einstellungen", "Show storage location" : "Speicherort anzeigen", @@ -388,6 +400,7 @@ "Cheers!" : "Noch einen schönen Tag!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nhier nur kurz die Mitteilung, dass Sie jetzt ein %s-Konto haben.\n\nIhr Benutzername: %s\nZugriff: %s\n\n", "For password recovery and notifications" : "Für Passwort-Wiederherstellung und Benachrichtigungen", + "Passcodes that give an app or device permissions to access your account." : "PINs mit denen Apps oder Geräte auf Ihr Konto zugreifen können.", "Follow us on Google Plus!" : "Folgen Sie uns bei Google Plus!", "Subscribe to our twitter channel!" : "Abonnieren Sie unseren Twitter-Kanal!", "Subscribe to our news feed!" : "Abonnieren Sie unseren RSS-Feed!", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 7c613494b22..2f6db8de59d 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -324,7 +324,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, móviles y de escritorio actualmente conectados a tu cuenta.", "Device" : "Dispositivo", "Last activity" : "Última actividad", - "Passcodes that give an app or device permissions to access your account." : "Código de paso que da permisos a una app o dispositivo para acceder a tu cuenta.", "Name" : "Nombre", "App name" : "Nombre de la app", "Create new app password" : "Crear nueva contraseña de app", @@ -380,6 +379,7 @@ OC.L10N.register( "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola:,\n\nSolo queremos hacerle saber que ahora dispone de una cuenta en %s.\n\nSu usuario: %s\nAcceda: %s\n\n", "For password recovery and notifications" : "Para la recuperación de contraseña y notificaciones", + "Passcodes that give an app or device permissions to access your account." : "Código de paso que da permisos a una app o dispositivo para acceder a tu cuenta.", "Follow us on Google Plus!" : "¡Síganos en Google+!", "Subscribe to our twitter channel!" : "Suscríbete a nuestro canal de Twitter!", "Subscribe to our news feed!" : "¡Suscríbete a nuestro feed de noticias!", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index dce9110719b..835020742d9 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -322,7 +322,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, móviles y de escritorio actualmente conectados a tu cuenta.", "Device" : "Dispositivo", "Last activity" : "Última actividad", - "Passcodes that give an app or device permissions to access your account." : "Código de paso que da permisos a una app o dispositivo para acceder a tu cuenta.", "Name" : "Nombre", "App name" : "Nombre de la app", "Create new app password" : "Crear nueva contraseña de app", @@ -378,6 +377,7 @@ "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola:,\n\nSolo queremos hacerle saber que ahora dispone de una cuenta en %s.\n\nSu usuario: %s\nAcceda: %s\n\n", "For password recovery and notifications" : "Para la recuperación de contraseña y notificaciones", + "Passcodes that give an app or device permissions to access your account." : "Código de paso que da permisos a una app o dispositivo para acceder a tu cuenta.", "Follow us on Google Plus!" : "¡Síganos en Google+!", "Subscribe to our twitter channel!" : "Suscríbete a nuestro canal de Twitter!", "Subscribe to our news feed!" : "¡Suscríbete a nuestro feed de noticias!", diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index 5973e2739fb..5dd371e9bba 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Sus aplicaciones", "Enabled apps" : "Aplicaciones habilitadas", "Disabled apps" : "Aplicaciones deshabilitadas", + "App bundles" : "Paquetes de aplicacion", "Wrong password" : "Contraseña incorrecta", "Saved" : "Guardado", "No user supplied" : "No se proporcionó un usuario", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "¡Bien hecho, %s!", "If you received this email, the email configuration seems to be correct." : "Si usted ha recibido este correo electrónico, la configuración del correo electrónico parece estar correcta. ", "Email setting test" : "Prueba de ajustes de correo", + "Email could not be sent. Check your mail server log" : "No fue posible enviar el correo electrónico. Favor de verficiar la bitácora de su servidor de correo", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Se presentó un problema al enviar el correo electrónico. Favor de revisar sus ajustes (Error: %s)", "You need to set your user email before being able to send test emails." : "Requiere establecer su correo electrónico andes de poder enviar correos electrónicos de prueba. ", "Invalid request" : "Solicitud inválida", @@ -107,6 +109,7 @@ OC.L10N.register( "Approved" : "Aprovado", "Experimental" : "Experimental", "No apps found for {query}" : "No se encontraron aplicación para {query}", + "Enable all" : "Habilitar todo", "Allow filesystem access" : "Permitir acceso al sistema de archivos", "Disconnect" : "Desconectar", "Revoke" : "Revocar", @@ -168,7 +171,7 @@ OC.L10N.register( "Error creating user: {message}" : "Se presentó un error al crear el usuario: {message}", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "A valid email must be provided" : "Se debe proporcionar un correo electrónico válido", - "__language_name__" : "__language_name__", + "__language_name__" : "Español (México)", "Unlimited" : "Ilimitado", "Personal info" : "Información personal", "Sessions" : "Sesiones", @@ -182,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correo electrónico", "Open documentation" : "Abrir documentación", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es importante preparar este servidor para poder enviar correos electrónicos, como para restablecer contraseñas y notificaciones. ", "Send mode" : "Modo de envío", "Encryption" : "Encripción", "From address" : "De la dirección", @@ -197,6 +201,7 @@ OC.L10N.register( "Test email settings" : "Probar ajsutes de correo electrónico", "Send email" : "Enviar correo electrónico", "Server-side encryption" : "Encripción del lado del servidor", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "La encripción del lado del servidor hace posible encriptar archivos que serán cargados a este servidor. Esto trae consigo algunas limitaciónes como penalizaciones en el desemeño, asi que sólo habilítelo si es necesario. ", "Enable server-side encryption" : "Habilitar encripción del lado del servidor", "Please read carefully before activating server-side encryption: " : "Favor de leer detenidamente antes de activar la encripción del lado de servidor:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Una vez que la encripción se encuentre habilitada, todos lo archivos cargados al servidor desde ese momento en tiempo, se encriptarán en el servidor. Sólo será posible deshabilitar la encripción en una fecha posterior si el modulo de encripción activo soporta esa funcionalidad y si todas las preciondiciones están satisfechas (ejem. establecer una llave de recuperación).", @@ -211,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Usted necesita migar sus llaves de encripción de la encripción anterior (ownCloud <=8.0) a la actual. ", "Start migration" : "Comenzar migración", "Security & setup warnings" : "Advertencias de seguridad y configuración", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Es importante para la seguridad y desempeño de su instancia que todo esté configurado correctamente. Para ayudarlo con esto, estamos haciendo algunas verficaciones automáticas. Favor de consultar la sección de Consejos & Trucos de la documentación para más información. ", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Al parecer php no está correctamente configurado para consultar las variables de ambiente. La prueba con getenv(\"PATH\") solo está regresando una respuesta vacía. ", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Favor de consultar la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentación de instalación ↗</a> para las notas de configuración de php en su servidor, específicamente al usar php-fpm. ", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuración de Sólo Lectura ha sido habilitada. Esto previene establecer algunas configuraciones mediante la interface web. Adicionalmente, el archivo necesita que se le establezcan tener permisos de escritura manualemente en cada actualización. ", @@ -231,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Última ejecución de tareas de cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última ejecución de tareas de cron: %s. Algo parece estar mal. ", "Cron was not executed yet!" : "¡Aún no han sido ejecutas las tareas programadas!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para un desempeño ideal, es importante configurar los trabajos de fondo correctametne. Para instancias más grandes 'Cron' es el ajuste recomendado. Favor de consultar la documentación para más información. ", "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio de cron del sistema para llamar el archivo cron.php cada 15 minutos.", @@ -238,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para correr esto usted necesita la extensión posix de PHP. Favor de consultar la {linkstart}documentación de PHP{linkend} para más detalles. ", "Version" : "Versión", "Sharing" : "Compartiendo", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, usted puede hacer ajustes finos al comportamiento de compartir. Favor de consultar la documentación para más información. ", "Allow apps to use the Share API" : "Permitir que las aplicaciones usen el API para Compartir", "Allow users to share via link" : "Permitir a los usuarios compartir mediante ligas", "Allow public uploads" : "Permitir cargas públicas", @@ -256,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar el texto de exención de responsabilidad legal en la página de carga de ligas públicas. (Sólo se muestra cuando la lista de archivos está oculta.)", "This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la página de carga de la liga pública cuando la lista de archivos esté oculta. ", "Tips & tricks" : "Consejos & trucos", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Existen muchas funcionalidades y configuraciones disponibles para personalizar y usar de manera optima esta instancia. Aqui hay algunos consejos para más información. ", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "Actualmente está usando SQLite como el backend de base de datos. Para instalaciones más grandes le recomendamos cambiar a un backend de base de datos diferente.", "This is particularly recommended when using the desktop client for file synchronisation." : "Esto es particularmente recomendado cuando se usa el cliente de escritorio para sincronización de archivos. ", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar a otra base de datos, use la herramienta de la línea de comando 'occ db:convert-type', o consulte la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentación ↗</a>.", @@ -334,7 +343,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, de escritorio y móviles han iniciado sesión en su cuenta. ", "Device" : "Dispositivo", "Last activity" : "Última actividad", - "Passcodes that give an app or device permissions to access your account." : "Los códigos de seguridad que le dan permisos a la aplicación o dispositivo para accesar a su cuenta. ", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aquí usted puede generar contraseñas individuales para las aplicaciones para que usted no tenga que dar su contraseña. También puede revocalras individualmente. ", "Name" : "Nombre", "App name" : "Nombre de la aplicación", "Create new app password" : "Crear una nueva contraseña de aplicación", @@ -343,7 +352,10 @@ OC.L10N.register( "Username" : "Nombre de usuario", "Done" : "Terminado", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud {linkclose}, el {githubopen}código fuente {linkclose} está licenciado bajo {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "¡Síganos en Google+!", "Like our facebook page!" : "¡Dele un me gusta a nuestra página de facebook!", + "Follow us on Twitter!" : "¡Síganos en Twitter!", + "Check out our blog!" : "¡Visite nuestro blog!", "Subscribe to our newsletter!" : "¡Suscribase a nuestro boletín!", "Settings" : "Ajustes", "Show storage location" : "Mostrar la ubicación del almacenamiento", @@ -390,6 +402,7 @@ OC.L10N.register( "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola,\n\nsólo queremos informarle que ahora usted tiene una cuenta %s.\n\nSu nombre de usuario es: %s\n\nIngrese a ella: %s\n", "For password recovery and notifications" : "Para recuperación de contraseña y notificaciones", + "Passcodes that give an app or device permissions to access your account." : "Los códigos de seguridad que le dan permisos a la aplicación o dispositivo para accesar a su cuenta. ", "Follow us on Google Plus!" : "¡Síganos en Google Plus!", "Subscribe to our twitter channel!" : "¡Suscríbase a nuestro canal de twitter!", "Subscribe to our news feed!" : "¡Suscribase a nuestra fuente de noticias!", diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index b83ac0b8ef2..0a3a5cb5cde 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -9,6 +9,7 @@ "Your apps" : "Sus aplicaciones", "Enabled apps" : "Aplicaciones habilitadas", "Disabled apps" : "Aplicaciones deshabilitadas", + "App bundles" : "Paquetes de aplicacion", "Wrong password" : "Contraseña incorrecta", "Saved" : "Guardado", "No user supplied" : "No se proporcionó un usuario", @@ -29,6 +30,7 @@ "Well done, %s!" : "¡Bien hecho, %s!", "If you received this email, the email configuration seems to be correct." : "Si usted ha recibido este correo electrónico, la configuración del correo electrónico parece estar correcta. ", "Email setting test" : "Prueba de ajustes de correo", + "Email could not be sent. Check your mail server log" : "No fue posible enviar el correo electrónico. Favor de verficiar la bitácora de su servidor de correo", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Se presentó un problema al enviar el correo electrónico. Favor de revisar sus ajustes (Error: %s)", "You need to set your user email before being able to send test emails." : "Requiere establecer su correo electrónico andes de poder enviar correos electrónicos de prueba. ", "Invalid request" : "Solicitud inválida", @@ -105,6 +107,7 @@ "Approved" : "Aprovado", "Experimental" : "Experimental", "No apps found for {query}" : "No se encontraron aplicación para {query}", + "Enable all" : "Habilitar todo", "Allow filesystem access" : "Permitir acceso al sistema de archivos", "Disconnect" : "Desconectar", "Revoke" : "Revocar", @@ -166,7 +169,7 @@ "Error creating user: {message}" : "Se presentó un error al crear el usuario: {message}", "A valid password must be provided" : "Se debe proporcionar una contraseña válida", "A valid email must be provided" : "Se debe proporcionar un correo electrónico válido", - "__language_name__" : "__language_name__", + "__language_name__" : "Español (México)", "Unlimited" : "Ilimitado", "Personal info" : "Información personal", "Sessions" : "Sesiones", @@ -180,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "Servidor de correo electrónico", "Open documentation" : "Abrir documentación", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es importante preparar este servidor para poder enviar correos electrónicos, como para restablecer contraseñas y notificaciones. ", "Send mode" : "Modo de envío", "Encryption" : "Encripción", "From address" : "De la dirección", @@ -195,6 +199,7 @@ "Test email settings" : "Probar ajsutes de correo electrónico", "Send email" : "Enviar correo electrónico", "Server-side encryption" : "Encripción del lado del servidor", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "La encripción del lado del servidor hace posible encriptar archivos que serán cargados a este servidor. Esto trae consigo algunas limitaciónes como penalizaciones en el desemeño, asi que sólo habilítelo si es necesario. ", "Enable server-side encryption" : "Habilitar encripción del lado del servidor", "Please read carefully before activating server-side encryption: " : "Favor de leer detenidamente antes de activar la encripción del lado de servidor:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Una vez que la encripción se encuentre habilitada, todos lo archivos cargados al servidor desde ese momento en tiempo, se encriptarán en el servidor. Sólo será posible deshabilitar la encripción en una fecha posterior si el modulo de encripción activo soporta esa funcionalidad y si todas las preciondiciones están satisfechas (ejem. establecer una llave de recuperación).", @@ -209,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Usted necesita migar sus llaves de encripción de la encripción anterior (ownCloud <=8.0) a la actual. ", "Start migration" : "Comenzar migración", "Security & setup warnings" : "Advertencias de seguridad y configuración", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Es importante para la seguridad y desempeño de su instancia que todo esté configurado correctamente. Para ayudarlo con esto, estamos haciendo algunas verficaciones automáticas. Favor de consultar la sección de Consejos & Trucos de la documentación para más información. ", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "Al parecer php no está correctamente configurado para consultar las variables de ambiente. La prueba con getenv(\"PATH\") solo está regresando una respuesta vacía. ", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Favor de consultar la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentación de instalación ↗</a> para las notas de configuración de php en su servidor, específicamente al usar php-fpm. ", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "La configuración de Sólo Lectura ha sido habilitada. Esto previene establecer algunas configuraciones mediante la interface web. Adicionalmente, el archivo necesita que se le establezcan tener permisos de escritura manualemente en cada actualización. ", @@ -229,6 +235,7 @@ "Last cron job execution: %s." : "Última ejecución de tareas de cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última ejecución de tareas de cron: %s. Algo parece estar mal. ", "Cron was not executed yet!" : "¡Aún no han sido ejecutas las tareas programadas!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para un desempeño ideal, es importante configurar los trabajos de fondo correctametne. Para instancias más grandes 'Cron' es el ajuste recomendado. Favor de consultar la documentación para más información. ", "Execute one task with each page loaded" : "Ejecutar una tarea con cada página cargada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado en el servicio webcron para llamar a cron.php cada 15 minutos a través de HTTP.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar el servicio de cron del sistema para llamar el archivo cron.php cada 15 minutos.", @@ -236,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para correr esto usted necesita la extensión posix de PHP. Favor de consultar la {linkstart}documentación de PHP{linkend} para más detalles. ", "Version" : "Versión", "Sharing" : "Compartiendo", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, usted puede hacer ajustes finos al comportamiento de compartir. Favor de consultar la documentación para más información. ", "Allow apps to use the Share API" : "Permitir que las aplicaciones usen el API para Compartir", "Allow users to share via link" : "Permitir a los usuarios compartir mediante ligas", "Allow public uploads" : "Permitir cargas públicas", @@ -254,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar el texto de exención de responsabilidad legal en la página de carga de ligas públicas. (Sólo se muestra cuando la lista de archivos está oculta.)", "This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la página de carga de la liga pública cuando la lista de archivos esté oculta. ", "Tips & tricks" : "Consejos & trucos", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Existen muchas funcionalidades y configuraciones disponibles para personalizar y usar de manera optima esta instancia. Aqui hay algunos consejos para más información. ", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "Actualmente está usando SQLite como el backend de base de datos. Para instalaciones más grandes le recomendamos cambiar a un backend de base de datos diferente.", "This is particularly recommended when using the desktop client for file synchronisation." : "Esto es particularmente recomendado cuando se usa el cliente de escritorio para sincronización de archivos. ", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar a otra base de datos, use la herramienta de la línea de comando 'occ db:convert-type', o consulte la <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentación ↗</a>.", @@ -332,7 +341,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, de escritorio y móviles han iniciado sesión en su cuenta. ", "Device" : "Dispositivo", "Last activity" : "Última actividad", - "Passcodes that give an app or device permissions to access your account." : "Los códigos de seguridad que le dan permisos a la aplicación o dispositivo para accesar a su cuenta. ", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aquí usted puede generar contraseñas individuales para las aplicaciones para que usted no tenga que dar su contraseña. También puede revocalras individualmente. ", "Name" : "Nombre", "App name" : "Nombre de la aplicación", "Create new app password" : "Crear una nueva contraseña de aplicación", @@ -341,7 +350,10 @@ "Username" : "Nombre de usuario", "Done" : "Terminado", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud {linkclose}, el {githubopen}código fuente {linkclose} está licenciado bajo {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "¡Síganos en Google+!", "Like our facebook page!" : "¡Dele un me gusta a nuestra página de facebook!", + "Follow us on Twitter!" : "¡Síganos en Twitter!", + "Check out our blog!" : "¡Visite nuestro blog!", "Subscribe to our newsletter!" : "¡Suscribase a nuestro boletín!", "Settings" : "Ajustes", "Show storage location" : "Mostrar la ubicación del almacenamiento", @@ -388,6 +400,7 @@ "Cheers!" : "¡Saludos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hola,\n\nsólo queremos informarle que ahora usted tiene una cuenta %s.\n\nSu nombre de usuario es: %s\n\nIngrese a ella: %s\n", "For password recovery and notifications" : "Para recuperación de contraseña y notificaciones", + "Passcodes that give an app or device permissions to access your account." : "Los códigos de seguridad que le dan permisos a la aplicación o dispositivo para accesar a su cuenta. ", "Follow us on Google Plus!" : "¡Síganos en Google Plus!", "Subscribe to our twitter channel!" : "¡Suscríbase a nuestro canal de twitter!", "Subscribe to our news feed!" : "¡Suscribase a nuestra fuente de noticias!", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 574273f7c3a..83044262bcc 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -270,7 +270,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Web-gune, mahaigain eta mugikorrean zure kontuan saioa hasita dago.", "Device" : "Gailu", "Last activity" : "Azken jarduera", - "Passcodes that give an app or device permissions to access your account." : "Zure kontuan sartzeko aplikazio edo gailuei baimena ematen dien pasahitzak.", "Name" : "Izena", "App name" : "Aplikazioaren izena", "Create new app password" : "Sortu app pasahitza berria", @@ -318,6 +317,7 @@ OC.L10N.register( "Uninstall app" : "Desinstalatu aplikazioa", "Cheers!" : "Ongi izan!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Kaixo,\n\nJakinarazi nahi dizugu, badaukazula %s kontua.\n\nZure erabiltzaile izena: %s \nSar zaitez: %s\n", + "Passcodes that give an app or device permissions to access your account." : "Zure kontuan sartzeko aplikazio edo gailuei baimena ematen dien pasahitzak.", "Show last log in" : "Erakutsi azkeneko saio hasiera" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 927f85dec14..fa72ca55288 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -268,7 +268,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Web-gune, mahaigain eta mugikorrean zure kontuan saioa hasita dago.", "Device" : "Gailu", "Last activity" : "Azken jarduera", - "Passcodes that give an app or device permissions to access your account." : "Zure kontuan sartzeko aplikazio edo gailuei baimena ematen dien pasahitzak.", "Name" : "Izena", "App name" : "Aplikazioaren izena", "Create new app password" : "Sortu app pasahitza berria", @@ -316,6 +315,7 @@ "Uninstall app" : "Desinstalatu aplikazioa", "Cheers!" : "Ongi izan!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Kaixo,\n\nJakinarazi nahi dizugu, badaukazula %s kontua.\n\nZure erabiltzaile izena: %s \nSar zaitez: %s\n", + "Passcodes that give an app or device permissions to access your account." : "Zure kontuan sartzeko aplikazio edo gailuei baimena ematen dien pasahitzak.", "Show last log in" : "Erakutsi azkeneko saio hasiera" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/settings/l10n/fi.js b/settings/l10n/fi.js index 1393101a938..47a2587f0f3 100644 --- a/settings/l10n/fi.js +++ b/settings/l10n/fi.js @@ -301,7 +301,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Verkko-, työpöytä- ja mobiililaitteet, jotka ovat parhaillaan kirjautuneet tilillesi.", "Device" : "Laite", "Last activity" : "Viimeksi käytetty", - "Passcodes that give an app or device permissions to access your account." : "Sovellussalasana antaa sovellukselle tai laitteelle käyttöoikeuden tiliisi.", "Name" : "Nimi", "App name" : "Sovelluksen nimi", "Create new app password" : "Luo uusi sovellussalasana", @@ -357,6 +356,7 @@ OC.L10N.register( "Cheers!" : "Kiitos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\ntässä sinulle tiedoksi, että sinulla on nyt %s-tili.\n\nKäyttäjänimesi: %s\nKäytä sitä: %s\n\n", "For password recovery and notifications" : "Salasanan nollausta ja ilmoituksia varten", + "Passcodes that give an app or device permissions to access your account." : "Sovellussalasana antaa sovellukselle tai laitteelle käyttöoikeuden tiliisi.", "Follow us on Google Plus!" : "Seuraa meitä Google Plussassa!", "Subscribe to our twitter channel!" : "Seuraa Twitter-tiliämme!", "Subscribe to our news feed!" : "Tilaa uutissyötteemme!", diff --git a/settings/l10n/fi.json b/settings/l10n/fi.json index bbff8fdfe77..d3408c5809f 100644 --- a/settings/l10n/fi.json +++ b/settings/l10n/fi.json @@ -299,7 +299,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Verkko-, työpöytä- ja mobiililaitteet, jotka ovat parhaillaan kirjautuneet tilillesi.", "Device" : "Laite", "Last activity" : "Viimeksi käytetty", - "Passcodes that give an app or device permissions to access your account." : "Sovellussalasana antaa sovellukselle tai laitteelle käyttöoikeuden tiliisi.", "Name" : "Nimi", "App name" : "Sovelluksen nimi", "Create new app password" : "Luo uusi sovellussalasana", @@ -355,6 +354,7 @@ "Cheers!" : "Kiitos!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\ntässä sinulle tiedoksi, että sinulla on nyt %s-tili.\n\nKäyttäjänimesi: %s\nKäytä sitä: %s\n\n", "For password recovery and notifications" : "Salasanan nollausta ja ilmoituksia varten", + "Passcodes that give an app or device permissions to access your account." : "Sovellussalasana antaa sovellukselle tai laitteelle käyttöoikeuden tiliisi.", "Follow us on Google Plus!" : "Seuraa meitä Google Plussassa!", "Subscribe to our twitter channel!" : "Seuraa Twitter-tiliämme!", "Subscribe to our news feed!" : "Tilaa uutissyötteemme!", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index 1e4391b240b..8ddfdec621f 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -31,6 +31,7 @@ OC.L10N.register( "Well done, %s!" : "Bien joué, %s !", "If you received this email, the email configuration seems to be correct." : "Si vous avez reçu cet e-mail, la configuration de l'adresse e-mail semble être correcte.", "Email setting test" : "Test des paramètres e-mail", + "Email could not be sent. Check your mail server log" : "L'email n'a pu être envoyé. Vérifiez le journal du serveur de messagerie", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)", "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", "Invalid request" : "Requête non valide", @@ -107,6 +108,7 @@ OC.L10N.register( "Approved" : "Approuvée", "Experimental" : "Expérimentale", "No apps found for {query}" : "Aucune application trouvée pour {query}", + "Enable all" : "Tout activer", "Allow filesystem access" : "Autoriser l'accès au gestionnaire de fichiers", "Disconnect" : "Déconnexion", "Revoke" : "Révoquer", @@ -182,6 +184,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "Serveur e-mail", "Open documentation" : "Voir la documentation", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Il est important d'indiquer un serveur afin de pouvoir envoyer des mails en cas de perte de mot de passe et pour d'autres notifications.", "Send mode" : "Mode d'envoi", "Encryption" : "Chiffrement", "From address" : "Adresse source", @@ -334,7 +337,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", "Device" : "Appareil", "Last activity" : "Dernière activité", - "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Name" : "Nom", "App name" : "Nom de l'application", "Create new app password" : "Créer un nouveau mot de passe d'application", @@ -343,7 +345,10 @@ OC.L10N.register( "Username" : "Nom d'utilisateur", "Done" : "Terminé", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Développé par la {communityopen}communauté Nextcloud{linkclose}, le {githubopen}code source{linkclose} est sous licence {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Suivez-nous sur Google+ !", "Like our facebook page!" : "Aimez notre page facebook!", + "Follow us on Twitter!" : "Suivez-nous sur Twitter !", + "Check out our blog!" : "Découvrez notre blog !", "Subscribe to our newsletter!" : "Abonnez-vous à notre newsletter!", "Settings" : "Paramètres", "Show storage location" : "Afficher l'emplacement du stockage", @@ -390,6 +395,7 @@ OC.L10N.register( "Cheers!" : "À bientôt !", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,\n\nUn compte %s a été créé pour vous.\n\nVotre nom d'utilisateur : %s\nVisitez votre compte : %s\n\n", "For password recovery and notifications" : "Pour la récupération de mot de passe et les notifications", + "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Follow us on Google Plus!" : "Suiviez-nous sur Google Plus!", "Subscribe to our twitter channel!" : "Enregistrez notre page twitter!", "Subscribe to our news feed!" : "Abonnez-vous à notre flux d'actualités!", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 0a7714009e4..61c7498dbb7 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -29,6 +29,7 @@ "Well done, %s!" : "Bien joué, %s !", "If you received this email, the email configuration seems to be correct." : "Si vous avez reçu cet e-mail, la configuration de l'adresse e-mail semble être correcte.", "Email setting test" : "Test des paramètres e-mail", + "Email could not be sent. Check your mail server log" : "L'email n'a pu être envoyé. Vérifiez le journal du serveur de messagerie", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Une erreur est survenue lors de l'envoi de l'e-mail. Veuillez vérifier vos paramètres. (Erreur: %s)", "You need to set your user email before being able to send test emails." : "Vous devez définir une adresse e-mail dans vos paramètres personnels avant de pouvoir envoyer des e-mails de test.", "Invalid request" : "Requête non valide", @@ -105,6 +106,7 @@ "Approved" : "Approuvée", "Experimental" : "Expérimentale", "No apps found for {query}" : "Aucune application trouvée pour {query}", + "Enable all" : "Tout activer", "Allow filesystem access" : "Autoriser l'accès au gestionnaire de fichiers", "Disconnect" : "Déconnexion", "Revoke" : "Révoquer", @@ -180,6 +182,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "Serveur e-mail", "Open documentation" : "Voir la documentation", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Il est important d'indiquer un serveur afin de pouvoir envoyer des mails en cas de perte de mot de passe et pour d'autres notifications.", "Send mode" : "Mode d'envoi", "Encryption" : "Chiffrement", "From address" : "Adresse source", @@ -332,7 +335,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Clients web, desktop et mobiles actuellement connectés sur votre compte.", "Device" : "Appareil", "Last activity" : "Dernière activité", - "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Name" : "Nom", "App name" : "Nom de l'application", "Create new app password" : "Créer un nouveau mot de passe d'application", @@ -341,7 +343,10 @@ "Username" : "Nom d'utilisateur", "Done" : "Terminé", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Développé par la {communityopen}communauté Nextcloud{linkclose}, le {githubopen}code source{linkclose} est sous licence {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Suivez-nous sur Google+ !", "Like our facebook page!" : "Aimez notre page facebook!", + "Follow us on Twitter!" : "Suivez-nous sur Twitter !", + "Check out our blog!" : "Découvrez notre blog !", "Subscribe to our newsletter!" : "Abonnez-vous à notre newsletter!", "Settings" : "Paramètres", "Show storage location" : "Afficher l'emplacement du stockage", @@ -388,6 +393,7 @@ "Cheers!" : "À bientôt !", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Bonjour,\n\nUn compte %s a été créé pour vous.\n\nVotre nom d'utilisateur : %s\nVisitez votre compte : %s\n\n", "For password recovery and notifications" : "Pour la récupération de mot de passe et les notifications", + "Passcodes that give an app or device permissions to access your account." : "Codes de sécurité autorisant une application ou un appareil à accéder à votre compte.", "Follow us on Google Plus!" : "Suiviez-nous sur Google Plus!", "Subscribe to our twitter channel!" : "Enregistrez notre page twitter!", "Subscribe to our news feed!" : "Abonnez-vous à notre flux d'actualités!", diff --git a/settings/l10n/hu.js b/settings/l10n/hu.js index c67751ecb77..f7d2369309b 100644 --- a/settings/l10n/hu.js +++ b/settings/l10n/hu.js @@ -303,7 +303,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "A fiókodba jelenleg bejelentkezett web, asztali és mobil kliensek.", "Device" : "Eszköz", "Last activity" : "Utolsó tevékenység", - "Passcodes that give an app or device permissions to access your account." : "A számkódok jogosultságot adnak egy alkalmazás vagy eszköz részére a fiókod hozzáféréséhez.", "Name" : "Név", "App name" : "Alkalmazás név", "Create new app password" : "Új alkalmazás jelszó létrehozása", @@ -359,6 +358,7 @@ OC.L10N.register( "Cheers!" : "Üdv.", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Szia!\n\nSzeretnénk tudatni, hogy elkészült a fiókod: %s.\n\nA felhasználóneved: %s\nHozzáférés itt: %s\n", "For password recovery and notifications" : "Jelszó helyreállításhoz és értesítésekhez", + "Passcodes that give an app or device permissions to access your account." : "A számkódok jogosultságot adnak egy alkalmazás vagy eszköz részére a fiókod hozzáféréséhez.", "Follow us on Google Plus!" : "Kövess minket a Googe Plus-szon!", "Subscribe to our twitter channel!" : "Iratkozz fel a Twitter csatornánkra!", "Subscribe to our news feed!" : "Iratkozz fel a hírfolyamunkra!", diff --git a/settings/l10n/hu.json b/settings/l10n/hu.json index d63c59706b3..298c2683edd 100644 --- a/settings/l10n/hu.json +++ b/settings/l10n/hu.json @@ -301,7 +301,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "A fiókodba jelenleg bejelentkezett web, asztali és mobil kliensek.", "Device" : "Eszköz", "Last activity" : "Utolsó tevékenység", - "Passcodes that give an app or device permissions to access your account." : "A számkódok jogosultságot adnak egy alkalmazás vagy eszköz részére a fiókod hozzáféréséhez.", "Name" : "Név", "App name" : "Alkalmazás név", "Create new app password" : "Új alkalmazás jelszó létrehozása", @@ -357,6 +356,7 @@ "Cheers!" : "Üdv.", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Szia!\n\nSzeretnénk tudatni, hogy elkészült a fiókod: %s.\n\nA felhasználóneved: %s\nHozzáférés itt: %s\n", "For password recovery and notifications" : "Jelszó helyreállításhoz és értesítésekhez", + "Passcodes that give an app or device permissions to access your account." : "A számkódok jogosultságot adnak egy alkalmazás vagy eszköz részére a fiókod hozzáféréséhez.", "Follow us on Google Plus!" : "Kövess minket a Googe Plus-szon!", "Subscribe to our twitter channel!" : "Iratkozz fel a Twitter csatornánkra!", "Subscribe to our news feed!" : "Iratkozz fel a hírfolyamunkra!", diff --git a/settings/l10n/ia.js b/settings/l10n/ia.js index 41e5e46c509..25505b6fad4 100644 --- a/settings/l10n/ia.js +++ b/settings/l10n/ia.js @@ -213,7 +213,6 @@ OC.L10N.register( "Show First Run Wizard again" : "Monstrar le Assistente del Prime Execution de novo", "Device" : "Dispositivo", "Last activity" : "Ultime activitate", - "Passcodes that give an app or device permissions to access your account." : "Contrasignos que dona a tu application o dispositivo le permissiones pro acceder a tu conto.", "Name" : "Nomine", "App name" : "Nomine del application", "Create new app password" : "Crear un nove contrasigno pro application", @@ -245,6 +244,7 @@ OC.L10N.register( "This is used for sending out notifications." : "Isto es usate pro inviar notificationes.", "Uninstall app" : "De-installar application", "Cheers!" : "Congratulationes!", + "Passcodes that give an app or device permissions to access your account." : "Contrasignos que dona a tu application o dispositivo le permissiones pro acceder a tu conto.", "Follow us on Google Plus!" : "Seque nos in Google Plus!", "Subscribe to our twitter channel!" : "Subscribe a nostre canal Twitter!", "Subscribe to our news feed!" : "Subscribe a nostre syndication de novas!" diff --git a/settings/l10n/ia.json b/settings/l10n/ia.json index 5a780853764..c7068b50724 100644 --- a/settings/l10n/ia.json +++ b/settings/l10n/ia.json @@ -211,7 +211,6 @@ "Show First Run Wizard again" : "Monstrar le Assistente del Prime Execution de novo", "Device" : "Dispositivo", "Last activity" : "Ultime activitate", - "Passcodes that give an app or device permissions to access your account." : "Contrasignos que dona a tu application o dispositivo le permissiones pro acceder a tu conto.", "Name" : "Nomine", "App name" : "Nomine del application", "Create new app password" : "Crear un nove contrasigno pro application", @@ -243,6 +242,7 @@ "This is used for sending out notifications." : "Isto es usate pro inviar notificationes.", "Uninstall app" : "De-installar application", "Cheers!" : "Congratulationes!", + "Passcodes that give an app or device permissions to access your account." : "Contrasignos que dona a tu application o dispositivo le permissiones pro acceder a tu conto.", "Follow us on Google Plus!" : "Seque nos in Google Plus!", "Subscribe to our twitter channel!" : "Subscribe a nostre canal Twitter!", "Subscribe to our news feed!" : "Subscribe a nostre syndication de novas!" diff --git a/settings/l10n/id.js b/settings/l10n/id.js index ca4e0f54fab..4ec6c7eb7d8 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -242,7 +242,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Klien web, desktop dan mobile yang sedang login di akun Anda.", "Device" : "Perangkat", "Last activity" : "Aktivitas terakhir", - "Passcodes that give an app or device permissions to access your account." : "Kode kunci yang memberikan aplikasi atau perangkat izin untuk mengakses akun Anda.", "Name" : "Nama", "App name" : "Nama aplikasi", "Create new app password" : "Buat sandi aplikasi baru", @@ -289,6 +288,7 @@ OC.L10N.register( "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Module 'fileinfo' pada PHP tidak ada. Kami sangat menyarankan untuk mengaktifkan modul ini untuk mendapatkan hasil terbaik pada proses pendeteksian mime-type.", "Cheers!" : "Horee!", "For password recovery and notifications" : "Untuk pemulihan sandi dan pemberitahuan", + "Passcodes that give an app or device permissions to access your account." : "Kode kunci yang memberikan aplikasi atau perangkat izin untuk mengakses akun Anda.", "Show last log in" : "Tampilkan masuk terakhir" }, "nplurals=1; plural=0;"); diff --git a/settings/l10n/id.json b/settings/l10n/id.json index 9f94a031cdd..7ae7c8cc66d 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -240,7 +240,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Klien web, desktop dan mobile yang sedang login di akun Anda.", "Device" : "Perangkat", "Last activity" : "Aktivitas terakhir", - "Passcodes that give an app or device permissions to access your account." : "Kode kunci yang memberikan aplikasi atau perangkat izin untuk mengakses akun Anda.", "Name" : "Nama", "App name" : "Nama aplikasi", "Create new app password" : "Buat sandi aplikasi baru", @@ -287,6 +286,7 @@ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Module 'fileinfo' pada PHP tidak ada. Kami sangat menyarankan untuk mengaktifkan modul ini untuk mendapatkan hasil terbaik pada proses pendeteksian mime-type.", "Cheers!" : "Horee!", "For password recovery and notifications" : "Untuk pemulihan sandi dan pemberitahuan", + "Passcodes that give an app or device permissions to access your account." : "Kode kunci yang memberikan aplikasi atau perangkat izin untuk mengakses akun Anda.", "Show last log in" : "Tampilkan masuk terakhir" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/settings/l10n/is.js b/settings/l10n/is.js index 8c17c263362..dab29a5a1d4 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -1,6 +1,17 @@ OC.L10N.register( "settings", { + "{actor} changed your password" : "{actor} breytti lykilorðinu þínu", + "You changed your password" : "Þú breyttir lykilorðinu þínu", + "Your password was reset by an administrator" : "Kerfisstjóri breytti lykilorðinu þínu", + "{actor} changed your email address" : "{actor} breytti tölvupóstfanginu þínu", + "You changed your email address" : "Þú breyttir tölvupóstfanginu þínu", + "Your email address was changed by an administrator" : "Kerfisstjóri breytti tölvupóstfanginu þínu", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Breyting hefur orðið á <strong>lykilorði</strong> eða <strong>tölvupóstfangi</strong> þínu", + "Your apps" : "Forritin þín", + "Enabled apps" : "Virk forrit", + "Disabled apps" : "Óvirk forrit", + "App bundles" : "Forritavöndlar", "Wrong password" : "Rangt lykilorð", "Saved" : "Vistað", "No user supplied" : "Enginn notandi gefinn", @@ -16,6 +27,8 @@ OC.L10N.register( "Group already exists." : "Hópur er þegar til.", "Unable to add group." : "Ekki tókst að bæta hóp við.", "Unable to delete group." : "Get ekki eytt hópi.", + "Invalid SMTP password." : "Ógilt SMTP-lykilorð", + "Well done, %s!" : "Vel gert, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Vandamál kom upp við að senda tölvupóst. Farðu yfir stillingarnar þínar. (Villa: %s)", "You need to set your user email before being able to send test emails." : "Þú verður að gefa upp netfangið þitt svo að þú getir sent prófunarpósta.", "Invalid request" : "Ógild fyrirspurn", @@ -33,6 +46,11 @@ OC.L10N.register( "Invalid user" : "Ógildur notandi", "Unable to change mail address" : "Get ekki breytt tölvupóstfangi", "Email saved" : "Tölvupóstfang vistað", + "Welcome aboard" : "Velkomin um borð", + "Welcome aboard %s" : "Velkomin um borð %s", + "Your username is: %s" : "Notandanafnið þitt er: %s", + "Set your password" : "Stilltu lykilorðið þitt", + "Go to %s" : "Farðu í %s", "Your %s account was created" : "%s notandaaðgangurinn þinn var búinn til", "Password confirmation is required" : "Þörf á staðfestingu lykilorðs", "Couldn't remove app." : "Gat ekki fjarlægt forrit.", @@ -42,6 +60,7 @@ OC.L10N.register( "Migration in progress. Please wait until the migration is finished" : "Yfirfærsla er í gangi. Dokaðu við þar til henni er lokið", "Migration started …" : "Yfirfærsla hafin...", "Not saved" : "Ekki vistað", + "Sending…" : "Sendi...", "Email sent" : "Tölvupóstur sendur", "Official" : "Opinbert", "All" : "Allt", @@ -64,11 +83,15 @@ OC.L10N.register( "Updating...." : "Uppfæri...", "Error while updating app" : "Villa við að uppfæra forrit", "Updated" : "Uppfært", + "Removing …" : "Fjarlægi ...", + "Error while removing app" : "Villa við að fjarlægja forrit", + "Remove" : "Fjarlægja", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Forritið hefur verið virkjað, en það þarf að uppfæra það. Þú verður áframsendur á uppfærslusíðuna eftir 5 sekúndur.", "App update" : "Uppfærsla forrits", "Approved" : "Samþykkt", "Experimental" : "Á tilraunastigi", "No apps found for {query}" : "Engin forrit fundust fyrir \"{query}", + "Enable all" : "Virkja allt", "Allow filesystem access" : "Leyfa aðgang að skráakerfi", "Disconnect" : "Aftengjast", "Revoke" : "Afturkalla", @@ -228,6 +251,7 @@ OC.L10N.register( "Check the security of your Nextcloud over our security scan" : "Athugaðu öryggi Nextcloud-skýsins með öryggisskönnun okkar", "Hardening and security guidance" : "Brynjun og öryggisleiðbeiningar", "Developer documentation" : "Skjölun fyrir þróunaraðila", + "Limit to groups" : "Takmarka við hópa", "This app has an update available." : "Uppfærsla er tiltæk fyrir þetta forrit.", "by %s" : "frá %s", "%s-licensed" : "%s-notkunarleyfi", @@ -293,7 +317,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Veftól, tölvur og símar sem núna eru skráð inn á aðganginn þinn.", "Device" : "Tæki", "Last activity" : "Síðasta virkni", - "Passcodes that give an app or device permissions to access your account." : "Aðgangskóði sem gefur forriti eða tæki heimild til að nota notandaaðganginn þinn.", "Name" : "Heiti", "App name" : "Heiti forrits", "Create new app password" : "Búa til nýtt lykilorð forrits", @@ -302,7 +325,10 @@ OC.L10N.register( "Username" : "Notandanafn", "Done" : "Lokið", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Þróað af {communityopen}Nextcloud samfélaginu{linkclose}, {githubopen}grunnkóðinn{linkclose} er gefinn út með {licenseopen}AGPL{linkclose} notkunarleyfinu.", + "Follow us on Google+!" : "Fylgstu með okkur á Google+!", "Like our facebook page!" : "Líkaðu við Facebook-síðuna okkar!", + "Follow us on Twitter!" : "Fylgstu með okkur á Twitter!", + "Check out our blog!" : "Kíktu á bloggið okkar!", "Subscribe to our newsletter!" : "Gerstu áskrifandi að fréttabréfinu okkar!", "Settings" : "Stillingar", "Show storage location" : "Birta staðsetningu gagnageymslu", @@ -349,6 +375,7 @@ OC.L10N.register( "Cheers!" : "Til hamingju!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hæ þú,\n\nbara að láta þig vita að þú átt núna %s aðgang.\n\nNotandanafnið þitt: %s\nTengstu honum: %s\n\n", "For password recovery and notifications" : "Fyrir tilkynningar og endurheimtingu lykilorðs", + "Passcodes that give an app or device permissions to access your account." : "Aðgangskóði sem gefur forriti eða tæki heimild til að nota notandaaðganginn þinn.", "Follow us on Google Plus!" : "Fylgstu með okkur á Google Plus!", "Subscribe to our twitter channel!" : "Gerstu áskrifandi að twitter-rásinni okkar!", "Subscribe to our news feed!" : "Gerstu áskrifandi að fréttastraumi okkar!", diff --git a/settings/l10n/is.json b/settings/l10n/is.json index ad8b6265fee..dc0233db1c5 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -1,4 +1,15 @@ { "translations": { + "{actor} changed your password" : "{actor} breytti lykilorðinu þínu", + "You changed your password" : "Þú breyttir lykilorðinu þínu", + "Your password was reset by an administrator" : "Kerfisstjóri breytti lykilorðinu þínu", + "{actor} changed your email address" : "{actor} breytti tölvupóstfanginu þínu", + "You changed your email address" : "Þú breyttir tölvupóstfanginu þínu", + "Your email address was changed by an administrator" : "Kerfisstjóri breytti tölvupóstfanginu þínu", + "Your <strong>password</strong> or <strong>email</strong> was modified" : "Breyting hefur orðið á <strong>lykilorði</strong> eða <strong>tölvupóstfangi</strong> þínu", + "Your apps" : "Forritin þín", + "Enabled apps" : "Virk forrit", + "Disabled apps" : "Óvirk forrit", + "App bundles" : "Forritavöndlar", "Wrong password" : "Rangt lykilorð", "Saved" : "Vistað", "No user supplied" : "Enginn notandi gefinn", @@ -14,6 +25,8 @@ "Group already exists." : "Hópur er þegar til.", "Unable to add group." : "Ekki tókst að bæta hóp við.", "Unable to delete group." : "Get ekki eytt hópi.", + "Invalid SMTP password." : "Ógilt SMTP-lykilorð", + "Well done, %s!" : "Vel gert, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Vandamál kom upp við að senda tölvupóst. Farðu yfir stillingarnar þínar. (Villa: %s)", "You need to set your user email before being able to send test emails." : "Þú verður að gefa upp netfangið þitt svo að þú getir sent prófunarpósta.", "Invalid request" : "Ógild fyrirspurn", @@ -31,6 +44,11 @@ "Invalid user" : "Ógildur notandi", "Unable to change mail address" : "Get ekki breytt tölvupóstfangi", "Email saved" : "Tölvupóstfang vistað", + "Welcome aboard" : "Velkomin um borð", + "Welcome aboard %s" : "Velkomin um borð %s", + "Your username is: %s" : "Notandanafnið þitt er: %s", + "Set your password" : "Stilltu lykilorðið þitt", + "Go to %s" : "Farðu í %s", "Your %s account was created" : "%s notandaaðgangurinn þinn var búinn til", "Password confirmation is required" : "Þörf á staðfestingu lykilorðs", "Couldn't remove app." : "Gat ekki fjarlægt forrit.", @@ -40,6 +58,7 @@ "Migration in progress. Please wait until the migration is finished" : "Yfirfærsla er í gangi. Dokaðu við þar til henni er lokið", "Migration started …" : "Yfirfærsla hafin...", "Not saved" : "Ekki vistað", + "Sending…" : "Sendi...", "Email sent" : "Tölvupóstur sendur", "Official" : "Opinbert", "All" : "Allt", @@ -62,11 +81,15 @@ "Updating...." : "Uppfæri...", "Error while updating app" : "Villa við að uppfæra forrit", "Updated" : "Uppfært", + "Removing …" : "Fjarlægi ...", + "Error while removing app" : "Villa við að fjarlægja forrit", + "Remove" : "Fjarlægja", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Forritið hefur verið virkjað, en það þarf að uppfæra það. Þú verður áframsendur á uppfærslusíðuna eftir 5 sekúndur.", "App update" : "Uppfærsla forrits", "Approved" : "Samþykkt", "Experimental" : "Á tilraunastigi", "No apps found for {query}" : "Engin forrit fundust fyrir \"{query}", + "Enable all" : "Virkja allt", "Allow filesystem access" : "Leyfa aðgang að skráakerfi", "Disconnect" : "Aftengjast", "Revoke" : "Afturkalla", @@ -226,6 +249,7 @@ "Check the security of your Nextcloud over our security scan" : "Athugaðu öryggi Nextcloud-skýsins með öryggisskönnun okkar", "Hardening and security guidance" : "Brynjun og öryggisleiðbeiningar", "Developer documentation" : "Skjölun fyrir þróunaraðila", + "Limit to groups" : "Takmarka við hópa", "This app has an update available." : "Uppfærsla er tiltæk fyrir þetta forrit.", "by %s" : "frá %s", "%s-licensed" : "%s-notkunarleyfi", @@ -291,7 +315,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Veftól, tölvur og símar sem núna eru skráð inn á aðganginn þinn.", "Device" : "Tæki", "Last activity" : "Síðasta virkni", - "Passcodes that give an app or device permissions to access your account." : "Aðgangskóði sem gefur forriti eða tæki heimild til að nota notandaaðganginn þinn.", "Name" : "Heiti", "App name" : "Heiti forrits", "Create new app password" : "Búa til nýtt lykilorð forrits", @@ -300,7 +323,10 @@ "Username" : "Notandanafn", "Done" : "Lokið", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Þróað af {communityopen}Nextcloud samfélaginu{linkclose}, {githubopen}grunnkóðinn{linkclose} er gefinn út með {licenseopen}AGPL{linkclose} notkunarleyfinu.", + "Follow us on Google+!" : "Fylgstu með okkur á Google+!", "Like our facebook page!" : "Líkaðu við Facebook-síðuna okkar!", + "Follow us on Twitter!" : "Fylgstu með okkur á Twitter!", + "Check out our blog!" : "Kíktu á bloggið okkar!", "Subscribe to our newsletter!" : "Gerstu áskrifandi að fréttabréfinu okkar!", "Settings" : "Stillingar", "Show storage location" : "Birta staðsetningu gagnageymslu", @@ -347,6 +373,7 @@ "Cheers!" : "Til hamingju!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hæ þú,\n\nbara að láta þig vita að þú átt núna %s aðgang.\n\nNotandanafnið þitt: %s\nTengstu honum: %s\n\n", "For password recovery and notifications" : "Fyrir tilkynningar og endurheimtingu lykilorðs", + "Passcodes that give an app or device permissions to access your account." : "Aðgangskóði sem gefur forriti eða tæki heimild til að nota notandaaðganginn þinn.", "Follow us on Google Plus!" : "Fylgstu með okkur á Google Plus!", "Subscribe to our twitter channel!" : "Gerstu áskrifandi að twitter-rásinni okkar!", "Subscribe to our news feed!" : "Gerstu áskrifandi að fréttastraumi okkar!", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 26b69d9227e..b69d2a61915 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -1,6 +1,15 @@ OC.L10N.register( "settings", { + "{actor} changed your password" : "{actor} ha cambiato la tua password", + "You changed your password" : "Hai cambiato la tua password", + "Your password was reset by an administrator" : "La tua password è stata reimpostata da un amministratore", + "{actor} changed your email address" : "{actor} ha cambiato il tuo indirizzo email", + "You changed your email address" : "Hai cambiato il tuo indirizzo email", + "Your email address was changed by an administrator" : "Il tuo indirizzo email è stato cambiato da un amministratore", + "Your apps" : "Le tue applicazioni", + "Enabled apps" : "Applicazioni abilitate", + "Disabled apps" : "Applicazioni disabilitate", "Wrong password" : "Password errata", "Saved" : "Salvato", "No user supplied" : "Non è stato fornito alcun utente", @@ -16,6 +25,7 @@ OC.L10N.register( "Group already exists." : "Il gruppo esiste già.", "Unable to add group." : "Impossibile aggiungere il gruppo.", "Unable to delete group." : "Impossibile eliminare il gruppo.", + "Invalid SMTP password." : "Password SMTP non valida.", "Well done, %s!" : "Ben fatto, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni. (Errore: %s)", "You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.", @@ -34,6 +44,8 @@ OC.L10N.register( "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your password on %s was changed." : "La tua password su %s è stata modificata.", + "Password changed for %s" : "Password modificata per %s", "Set your password" : "Imposta la tua password", "Go to %s" : "Vai a %s", "Install Client" : "Installa client", @@ -297,7 +309,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", "Last activity" : "Ultima attività", - "Passcodes that give an app or device permissions to access your account." : "Codici di accesso per fornire alle applicazioni o ai dispositivi il permesso di accedere al tuo account.", "Name" : "Nome", "App name" : "Nome applicazione", "Create new app password" : "Crea nuova password di applicazione", @@ -351,6 +362,7 @@ OC.L10N.register( "Cheers!" : "Saluti!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ciao,\n\nvolevamo informarti che ora hai un account %s.\n\nIl tuo nome utente: %s\nAccedi: %s\n\n", "For password recovery and notifications" : "Per il ripristino della password e per le notifiche", + "Passcodes that give an app or device permissions to access your account." : "Codici di accesso per fornire alle applicazioni o ai dispositivi il permesso di accedere al tuo account.", "Follow us on Google Plus!" : "Seguici su Google Plus!", "Subscribe to our twitter channel!" : "Iscriviti al nostro canale twitter!", "Subscribe to our news feed!" : "Iscriviti alla nostra fonte di notizie!", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 402b814b13e..e968fbf86fa 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -1,4 +1,13 @@ { "translations": { + "{actor} changed your password" : "{actor} ha cambiato la tua password", + "You changed your password" : "Hai cambiato la tua password", + "Your password was reset by an administrator" : "La tua password è stata reimpostata da un amministratore", + "{actor} changed your email address" : "{actor} ha cambiato il tuo indirizzo email", + "You changed your email address" : "Hai cambiato il tuo indirizzo email", + "Your email address was changed by an administrator" : "Il tuo indirizzo email è stato cambiato da un amministratore", + "Your apps" : "Le tue applicazioni", + "Enabled apps" : "Applicazioni abilitate", + "Disabled apps" : "Applicazioni disabilitate", "Wrong password" : "Password errata", "Saved" : "Salvato", "No user supplied" : "Non è stato fornito alcun utente", @@ -14,6 +23,7 @@ "Group already exists." : "Il gruppo esiste già.", "Unable to add group." : "Impossibile aggiungere il gruppo.", "Unable to delete group." : "Impossibile eliminare il gruppo.", + "Invalid SMTP password." : "Password SMTP non valida.", "Well done, %s!" : "Ben fatto, %s!", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Si è verificato un problema durante l'invio dell'email. Controlla le tue impostazioni. (Errore: %s)", "You need to set your user email before being able to send test emails." : "Devi impostare l'indirizzo del tuo utente prima di poter provare l'invio delle email.", @@ -32,6 +42,8 @@ "Invalid user" : "Utente non valido", "Unable to change mail address" : "Impossibile cambiare l'indirizzo di posta", "Email saved" : "Email salvata", + "Your password on %s was changed." : "La tua password su %s è stata modificata.", + "Password changed for %s" : "Password modificata per %s", "Set your password" : "Imposta la tua password", "Go to %s" : "Vai a %s", "Install Client" : "Installa client", @@ -295,7 +307,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Client web, desktop e mobile attualmente connessi al tuo account.", "Device" : "Dispositivo", "Last activity" : "Ultima attività", - "Passcodes that give an app or device permissions to access your account." : "Codici di accesso per fornire alle applicazioni o ai dispositivi il permesso di accedere al tuo account.", "Name" : "Nome", "App name" : "Nome applicazione", "Create new app password" : "Crea nuova password di applicazione", @@ -349,6 +360,7 @@ "Cheers!" : "Saluti!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Ciao,\n\nvolevamo informarti che ora hai un account %s.\n\nIl tuo nome utente: %s\nAccedi: %s\n\n", "For password recovery and notifications" : "Per il ripristino della password e per le notifiche", + "Passcodes that give an app or device permissions to access your account." : "Codici di accesso per fornire alle applicazioni o ai dispositivi il permesso di accedere al tuo account.", "Follow us on Google Plus!" : "Seguici su Google Plus!", "Subscribe to our twitter channel!" : "Iscriviti al nostro canale twitter!", "Subscribe to our news feed!" : "Iscriviti alla nostra fonte di notizie!", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index ac286292fbd..f366f2037f1 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -293,7 +293,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "現在、Web、デスクトップ、モバイルアプリで ownCloud にログインしている端末一覧です。", "Device" : "デバイス", "Last activity" : "最後の活動", - "Passcodes that give an app or device permissions to access your account." : "パスコードで、アプリやデバイスにアカウントにアクセスするための権限を与えます。", "Name" : "名前", "App name" : "アプリ名", "Create new app password" : "新規アプリパスワードを作成", @@ -347,6 +346,7 @@ OC.L10N.register( "Cheers!" : "それでは!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用できるようになりました。\n\nユーザー名: %s\n接続URL: %s\n\n", "For password recovery and notifications" : "パスワード回復と通知用", + "Passcodes that give an app or device permissions to access your account." : "パスコードで、アプリやデバイスにアカウントにアクセスするための権限を与えます。", "Follow us on Google Plus!" : "Google Plusでフォロー!", "Subscribe to our twitter channel!" : "twitterチャンネルを購読する!", "Subscribe to our news feed!" : "私たちのニュースフィードを購読!", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index 7effbc2ebcd..9fe739a5be4 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -291,7 +291,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "現在、Web、デスクトップ、モバイルアプリで ownCloud にログインしている端末一覧です。", "Device" : "デバイス", "Last activity" : "最後の活動", - "Passcodes that give an app or device permissions to access your account." : "パスコードで、アプリやデバイスにアカウントにアクセスするための権限を与えます。", "Name" : "名前", "App name" : "アプリ名", "Create new app password" : "新規アプリパスワードを作成", @@ -345,6 +344,7 @@ "Cheers!" : "それでは!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "こんにちは、\n\nあなたのアカウント %s が利用できるようになりました。\n\nユーザー名: %s\n接続URL: %s\n\n", "For password recovery and notifications" : "パスワード回復と通知用", + "Passcodes that give an app or device permissions to access your account." : "パスコードで、アプリやデバイスにアカウントにアクセスするための権限を与えます。", "Follow us on Google Plus!" : "Google Plusでフォロー!", "Subscribe to our twitter channel!" : "twitterチャンネルを購読する!", "Subscribe to our news feed!" : "私たちのニュースフィードを購読!", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index f164668a8ce..f5de70d3fbb 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -279,7 +279,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "사용자 계정으로 로그인된 웹, 데스크톱, 모바일 클라이언트 목록입니다.", "Device" : "장치", "Last activity" : "최근 활동", - "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Name" : "이름", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", @@ -331,6 +330,7 @@ OC.L10N.register( "Cheers!" : "감사합니다!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", "For password recovery and notifications" : "암호 복구와 알림에 사용", + "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Follow us on Google Plus!" : "Google Plus를 팔로우하세요!", "Subscribe to our twitter channel!" : "Twitter 채널을 구독하세요!", "Subscribe to our news feed!" : "뉴스 피드를 구독하세요!", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 674af0a7154..3e87da41898 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -277,7 +277,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "사용자 계정으로 로그인된 웹, 데스크톱, 모바일 클라이언트 목록입니다.", "Device" : "장치", "Last activity" : "최근 활동", - "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Name" : "이름", "App name" : "앱 이름", "Create new app password" : "새로운 앱 암호 만들기", @@ -329,6 +328,7 @@ "Cheers!" : "감사합니다!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "안녕하세요.\n\n%s 계정을 사용할 수 있음을 알려 드립니다.\n\n사용자 이름: %s\n접근 링크: %s\n\n", "For password recovery and notifications" : "암호 복구와 알림에 사용", + "Passcodes that give an app or device permissions to access your account." : "앱 암호는 앱이나 장치가 사용자 계정에 접근할 수 있도록 해줍니다.", "Follow us on Google Plus!" : "Google Plus를 팔로우하세요!", "Subscribe to our twitter channel!" : "Twitter 채널을 구독하세요!", "Subscribe to our news feed!" : "뉴스 피드를 구독하세요!", diff --git a/settings/l10n/nb.js b/settings/l10n/nb.js index c17eb5ffe9a..b9597284680 100644 --- a/settings/l10n/nb.js +++ b/settings/l10n/nb.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Dine programmer", "Enabled apps" : "Påskrudde programmer", "Disabled apps" : "Avskrudde programmer", + "App bundles" : "Programpakker", "Wrong password" : "Feil passord", "Saved" : "Lagret", "No user supplied" : "Ingen bruker angitt", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Bra gjort, %s!", "If you received this email, the email configuration seems to be correct." : "Hvis du mottar denne e-posten, er e-postoppsettet rett.", "Email setting test" : "E-postinnstillingstest", + "Email could not be sent. Check your mail server log" : "E-post kunne ikke sendes. Sjekk tjenerloggen på din e-posttjener", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Et problem oppstod med sending av e-post. Sjekk innstillingene. (Feil: %s)", "You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.", "Invalid request" : "Ugyldig forespørsel", @@ -107,6 +109,7 @@ OC.L10N.register( "Approved" : "Godkjent", "Experimental" : "Eksperimentell", "No apps found for {query}" : "Ingen programmet funnet for \"{query}\"", + "Enable all" : "Skru på alle", "Allow filesystem access" : "Tillatt filsystem tilgang", "Disconnect" : "Koble fra", "Revoke" : "Avslå", @@ -182,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "E-posttjener", "Open documentation" : "Åpne dokumentasjonen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Det er viktig å sette opp denne tjeneren for å kunne sende e-poster, som tilbakestilling av e-poster og merknader.", "Send mode" : "Forsendelsesmåte", "Encryption" : "Kryptering", "From address" : "Fra adresse", @@ -197,6 +201,7 @@ OC.L10N.register( "Test email settings" : "Test innstillinger for e-post", "Send email" : "Send e-post", "Server-side encryption" : "Tjenerkryptering", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Kryptering på tjenersiden gjør det mulig å kryptere files som er lastet opp til denne tjeneren. Dette har begrensninger som ytelsesforverring, så bare skru på dette hvis det trengs.", "Enable server-side encryption" : "Aktiver tjenerkryptering", "Please read carefully before activating server-side encryption: " : "Vennligst les dette nøye før du aktiverer tjenerkrykptering:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Når kryptering er blitt aktivert, vil alle filer som lastes opp til tjeneren fra det tidspunktet av bli lagret kryptert på tjeneren. Det vil kun være mulig å deaktivere kryptering senere dersom den aktive krypteringsmodulen støtter det og alle forutsetninger (f.eks. å sette en gjenopprettingsnøkkel) er til stede.", @@ -211,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du må migrere krypteringsnøklene din fra den gamle krypteringen (ownCloud <= 8.0) til den nye.", "Start migration" : "Start migrering", "Security & setup warnings" : "Advarsler om sikkerhet og oppsett", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Det er viktig for sikkerheten og ytelsen på din installasjon at alt er satt opp rett. For å hjelpe deg er det satt i verk noen automatiske sjekker. Se \"Tips og triks\"-delen og i dokumentasjonen for mer informasjon", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php konfigurasjonsnotater og konfigurering av php på tjeneren din, særlig om du bruker php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Det skrivebeskyttede oppsettet er blitt aktivert. Dette forhindrer setting av visse oppsett via vev-grensesnittet. Videre må config-filen gjøres skrivbar manuelt for hver oppdatering.", @@ -231,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Siste kjøring av Cron-jobb: %s.", "Last cron job execution: %s. Something seems wrong." : "Siste kjøring av Cron-jobb: %s. Noe ser ut til å være galt.", "Cron was not executed yet!" : "Cron har ikke blitt kjørt enda!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "For optimal ytelse er det viktig å sette opp bakgrunnsjobber rett. For kjøring på større installasjoner er 'Cron' anbefalt innstilling. Se dokumentasjonen for mer informasjon.", "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert kvarter.", @@ -238,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "For å kjøre denne trenger du «PHP posix extension». Se {linkstart}PHP dokumentasjonen{linkend} for flere detaljer.", "Version" : "Versjon", "Sharing" : "Deling", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Som administrator kan du fininnstille delingsoppførselen. Se dokumentasjonen for mer informasjon.", "Allow apps to use the Share API" : "Tillat programmer å bruke API for deling", "Allow users to share via link" : "Tillat brukere å dele via lenke", "Allow public uploads" : "Tillat offentlig opplasting", @@ -256,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Vis ansvarsfraskrivelse på den offentlige opplastingssiden. (Vises kun nå fillisten er tom.)", "This text will be shown on the public link upload page when the file list is hidden." : "Denne teksten vises på den offentlig opplastingssiden når fillisten er tom.", "Tips & tricks" : "Tips og triks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Det er mange funksjoner og oppsettsbrytere tilgjengelig for optimal tilpasning og bruk av denne installasjonen. Her har du noen punkter med ytterligere informasjon.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite er for øyeblikket brukt som database. For større installasjoner vil vi anbefale deg å benytte en annen databasetype.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dette er spesielt anbefalt når skrivebordsklient brukes for filsynkronisering.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.", @@ -334,7 +343,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Følgende nett, skrivebord og mobile klienter er for øyeblikket logget på din konto.", "Device" : "Enhet", "Last activity" : "Seneste aktivitet", - "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Her kan du opprette egne passord for programmer slik at du ikke trenger å gi dem ditt passord. Du kan tilbakekalle dem individuelt også.", "Name" : "Navn", "App name" : "App navn", "Create new app password" : "Lag nytt app passord", @@ -343,7 +352,10 @@ OC.L10N.register( "Username" : "Brukernavn", "Done" : "Ferdig", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utviklet av {communityopen}Nextcloud mijøet{linkclose}, {githubopen}kildekoden{linkclose} er lisensiert under {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", + "Follow us on Google+!" : "Følg oss på Google+", "Like our facebook page!" : "Lik vår facebook side!", + "Follow us on Twitter!" : "Følg oss på Twitter", + "Check out our blog!" : "Sjekk ut bloggen vår", "Subscribe to our newsletter!" : "Abonner på vårt nyhetsbrev!", "Settings" : "Innstillinger", "Show storage location" : "Vis lagringssted", @@ -390,6 +402,7 @@ OC.L10N.register( "Cheers!" : "Hadet!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvil bare opplyse deg omat du har en %s konto.\n\nDitt brukernavn: %s\nGå dit: %s\n\n", "For password recovery and notifications" : "For passord-gjenoppretting og varsler", + "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", "Follow us on Google Plus!" : "Følg oss på Google Plus!", "Subscribe to our twitter channel!" : "Abonner på vår twitter kanal!", "Subscribe to our news feed!" : "Abonner på vår nyhetsstrøm!", diff --git a/settings/l10n/nb.json b/settings/l10n/nb.json index fd3416cfb74..77cedad2d12 100644 --- a/settings/l10n/nb.json +++ b/settings/l10n/nb.json @@ -9,6 +9,7 @@ "Your apps" : "Dine programmer", "Enabled apps" : "Påskrudde programmer", "Disabled apps" : "Avskrudde programmer", + "App bundles" : "Programpakker", "Wrong password" : "Feil passord", "Saved" : "Lagret", "No user supplied" : "Ingen bruker angitt", @@ -29,6 +30,7 @@ "Well done, %s!" : "Bra gjort, %s!", "If you received this email, the email configuration seems to be correct." : "Hvis du mottar denne e-posten, er e-postoppsettet rett.", "Email setting test" : "E-postinnstillingstest", + "Email could not be sent. Check your mail server log" : "E-post kunne ikke sendes. Sjekk tjenerloggen på din e-posttjener", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Et problem oppstod med sending av e-post. Sjekk innstillingene. (Feil: %s)", "You need to set your user email before being able to send test emails." : "Du må sette e-postadressen for brukeren din før du kan teste sending av e-post.", "Invalid request" : "Ugyldig forespørsel", @@ -105,6 +107,7 @@ "Approved" : "Godkjent", "Experimental" : "Eksperimentell", "No apps found for {query}" : "Ingen programmet funnet for \"{query}\"", + "Enable all" : "Skru på alle", "Allow filesystem access" : "Tillatt filsystem tilgang", "Disconnect" : "Koble fra", "Revoke" : "Avslå", @@ -180,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "E-posttjener", "Open documentation" : "Åpne dokumentasjonen", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Det er viktig å sette opp denne tjeneren for å kunne sende e-poster, som tilbakestilling av e-poster og merknader.", "Send mode" : "Forsendelsesmåte", "Encryption" : "Kryptering", "From address" : "Fra adresse", @@ -195,6 +199,7 @@ "Test email settings" : "Test innstillinger for e-post", "Send email" : "Send e-post", "Server-side encryption" : "Tjenerkryptering", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Kryptering på tjenersiden gjør det mulig å kryptere files som er lastet opp til denne tjeneren. Dette har begrensninger som ytelsesforverring, så bare skru på dette hvis det trengs.", "Enable server-side encryption" : "Aktiver tjenerkryptering", "Please read carefully before activating server-side encryption: " : "Vennligst les dette nøye før du aktiverer tjenerkrykptering:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Når kryptering er blitt aktivert, vil alle filer som lastes opp til tjeneren fra det tidspunktet av bli lagret kryptert på tjeneren. Det vil kun være mulig å deaktivere kryptering senere dersom den aktive krypteringsmodulen støtter det og alle forutsetninger (f.eks. å sette en gjenopprettingsnøkkel) er til stede.", @@ -209,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Du må migrere krypteringsnøklene din fra den gamle krypteringen (ownCloud <= 8.0) til den nye.", "Start migration" : "Start migrering", "Security & setup warnings" : "Advarsler om sikkerhet og oppsett", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Det er viktig for sikkerheten og ytelsen på din installasjon at alt er satt opp rett. For å hjelpe deg er det satt i verk noen automatiske sjekker. Se \"Tips og triks\"-delen og i dokumentasjonen for mer informasjon", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP ser ikke ut til å være satt opp riktig for å lese systemets miljøvariabler. Testen med getenv(\"PATH\") returnerer bare et tomt svar.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Vennligst sjekk <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installasjonsdokumentasjonen ↗</a> etter php konfigurasjonsnotater og konfigurering av php på tjeneren din, særlig om du bruker php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Det skrivebeskyttede oppsettet er blitt aktivert. Dette forhindrer setting av visse oppsett via vev-grensesnittet. Videre må config-filen gjøres skrivbar manuelt for hver oppdatering.", @@ -229,6 +235,7 @@ "Last cron job execution: %s." : "Siste kjøring av Cron-jobb: %s.", "Last cron job execution: %s. Something seems wrong." : "Siste kjøring av Cron-jobb: %s. Noe ser ut til å være galt.", "Cron was not executed yet!" : "Cron har ikke blitt kjørt enda!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "For optimal ytelse er det viktig å sette opp bakgrunnsjobber rett. For kjøring på større installasjoner er 'Cron' anbefalt innstilling. Se dokumentasjonen for mer informasjon.", "Execute one task with each page loaded" : "Utfør en oppgave med hver side som blir lastet", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php er registrert i en webcron-tjeneste for å kalle cron.php hvert 15. minutt over http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Bruk systemets cron-tjeneste til å kalle cron.php hvert kvarter.", @@ -236,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "For å kjøre denne trenger du «PHP posix extension». Se {linkstart}PHP dokumentasjonen{linkend} for flere detaljer.", "Version" : "Versjon", "Sharing" : "Deling", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Som administrator kan du fininnstille delingsoppførselen. Se dokumentasjonen for mer informasjon.", "Allow apps to use the Share API" : "Tillat programmer å bruke API for deling", "Allow users to share via link" : "Tillat brukere å dele via lenke", "Allow public uploads" : "Tillat offentlig opplasting", @@ -254,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Vis ansvarsfraskrivelse på den offentlige opplastingssiden. (Vises kun nå fillisten er tom.)", "This text will be shown on the public link upload page when the file list is hidden." : "Denne teksten vises på den offentlig opplastingssiden når fillisten er tom.", "Tips & tricks" : "Tips og triks", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Det er mange funksjoner og oppsettsbrytere tilgjengelig for optimal tilpasning og bruk av denne installasjonen. Her har du noen punkter med ytterligere informasjon.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite er for øyeblikket brukt som database. For større installasjoner vil vi anbefale deg å benytte en annen databasetype.", "This is particularly recommended when using the desktop client for file synchronisation." : "Dette er spesielt anbefalt når skrivebordsklient brukes for filsynkronisering.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "For å migrere til en annen database, bruk kommandolinjeverktøyet: 'occ db:convert-type', eller les i <a target=\"_blank\" href=\"%s\">dokumentasjonen ↗</a>.", @@ -332,7 +341,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Følgende nett, skrivebord og mobile klienter er for øyeblikket logget på din konto.", "Device" : "Enhet", "Last activity" : "Seneste aktivitet", - "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Her kan du opprette egne passord for programmer slik at du ikke trenger å gi dem ditt passord. Du kan tilbakekalle dem individuelt også.", "Name" : "Navn", "App name" : "App navn", "Create new app password" : "Lag nytt app passord", @@ -341,7 +350,10 @@ "Username" : "Brukernavn", "Done" : "Ferdig", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Utviklet av {communityopen}Nextcloud mijøet{linkclose}, {githubopen}kildekoden{linkclose} er lisensiert under {licenseopen}<abbr title=\"Affero General Public License\">AGPL</abbr>{linkclose}.", + "Follow us on Google+!" : "Følg oss på Google+", "Like our facebook page!" : "Lik vår facebook side!", + "Follow us on Twitter!" : "Følg oss på Twitter", + "Check out our blog!" : "Sjekk ut bloggen vår", "Subscribe to our newsletter!" : "Abonner på vårt nyhetsbrev!", "Settings" : "Innstillinger", "Show storage location" : "Vis lagringssted", @@ -388,6 +400,7 @@ "Cheers!" : "Hadet!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hei,\n\nvil bare opplyse deg omat du har en %s konto.\n\nDitt brukernavn: %s\nGå dit: %s\n\n", "For password recovery and notifications" : "For passord-gjenoppretting og varsler", + "Passcodes that give an app or device permissions to access your account." : "Passordet som gi en app eller enhet tilgang til din konto.", "Follow us on Google Plus!" : "Følg oss på Google Plus!", "Subscribe to our twitter channel!" : "Abonner på vår twitter kanal!", "Subscribe to our news feed!" : "Abonner på vår nyhetsstrøm!", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index b81252a7c7a..3753c939c1b 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -31,6 +31,7 @@ OC.L10N.register( "Well done, %s!" : "Goed gedaan, %s!", "If you received this email, the email configuration seems to be correct." : "Als je dit e-mailtje ontving, dan lijken de e-mailinstellingen correct.", "Email setting test" : "E-mailinstellingen test", + "Email could not be sent. Check your mail server log" : "Er kon geen e-mail verstuurd worden. Controleer je server log files", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Er ontstond een probleem bij het versturen van de e-mail. Controleer je instellingen. (Fout: %s)", "You need to set your user email before being able to send test emails." : "Je moet je e-mailadres invoeren voordat je testberichten kunt versturen.", "Invalid request" : "Ongeldige aanvraag", @@ -80,7 +81,7 @@ OC.L10N.register( "Email sent" : "E-mail verzonden", "Official" : "Officieel", "All" : "Alle", - "Update to %s" : "Bijgewerkt naar %s", + "Update to %s" : "Werk bij naar %s", "_You have %n app update pending_::_You have %n app updates pending_" : ["Er is %n update voor een applicatie","Er zijn %n applicaties die bijgewerkt kunnen worden"], "No apps found for your version" : "Geen apps gevonden voor jouw versie", "The app will be downloaded from the app store" : "De app zal worden gedownload van de app store", @@ -107,6 +108,7 @@ OC.L10N.register( "Approved" : "Goedgekeurd", "Experimental" : "Experimenteel", "No apps found for {query}" : "Geen apps gevonden voor {query}", + "Enable all" : "Alles activeren", "Allow filesystem access" : "Toestaan toegang bestandssysteem", "Disconnect" : "Verbreek verbinding", "Revoke" : "Intrekken", @@ -182,6 +184,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "E-mailserver", "Open documentation" : "Open documentatie", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Het is belangrijk deze server zo in te stellen dat er ook e-mails verstuurd kunnen worden om wachtwoord resets en meldingen bijvoorbeeld te versturen.", "Send mode" : "Verstuurmodus", "Encryption" : "Versleuteling", "From address" : "Afzenderadres", @@ -334,7 +337,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", "Last activity" : "Laatste activiteit", - "Passcodes that give an app or device permissions to access your account." : "Een toegangscode die een app of apparaat toegang geven om je account te gebruiken.", "Name" : "Naam", "App name" : "Appnaam", "Create new app password" : "Creëer een nieuw app wachtwoord", @@ -390,6 +392,7 @@ OC.L10N.register( "Cheers!" : "Proficiat!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nwe willen je laten weten dat je nu een %s account hebt.\n\nJe gebruikersnaam: %s\nGa naar: %s\n\n", "For password recovery and notifications" : "Voor wachtwoordherstel en meldingen", + "Passcodes that give an app or device permissions to access your account." : "Een toegangscode die een app of apparaat toegang geven om je account te gebruiken.", "Follow us on Google Plus!" : "Volg ons op Google Plus!", "Subscribe to our twitter channel!" : "Abonneer jezelf op ons twitter kanaal!", "Subscribe to our news feed!" : "Abonneer jezelf op onze nieuwsfeed!", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index ec82d7172ec..51b0d73f3aa 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -29,6 +29,7 @@ "Well done, %s!" : "Goed gedaan, %s!", "If you received this email, the email configuration seems to be correct." : "Als je dit e-mailtje ontving, dan lijken de e-mailinstellingen correct.", "Email setting test" : "E-mailinstellingen test", + "Email could not be sent. Check your mail server log" : "Er kon geen e-mail verstuurd worden. Controleer je server log files", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Er ontstond een probleem bij het versturen van de e-mail. Controleer je instellingen. (Fout: %s)", "You need to set your user email before being able to send test emails." : "Je moet je e-mailadres invoeren voordat je testberichten kunt versturen.", "Invalid request" : "Ongeldige aanvraag", @@ -78,7 +79,7 @@ "Email sent" : "E-mail verzonden", "Official" : "Officieel", "All" : "Alle", - "Update to %s" : "Bijgewerkt naar %s", + "Update to %s" : "Werk bij naar %s", "_You have %n app update pending_::_You have %n app updates pending_" : ["Er is %n update voor een applicatie","Er zijn %n applicaties die bijgewerkt kunnen worden"], "No apps found for your version" : "Geen apps gevonden voor jouw versie", "The app will be downloaded from the app store" : "De app zal worden gedownload van de app store", @@ -105,6 +106,7 @@ "Approved" : "Goedgekeurd", "Experimental" : "Experimenteel", "No apps found for {query}" : "Geen apps gevonden voor {query}", + "Enable all" : "Alles activeren", "Allow filesystem access" : "Toestaan toegang bestandssysteem", "Disconnect" : "Verbreek verbinding", "Revoke" : "Intrekken", @@ -180,6 +182,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "E-mailserver", "Open documentation" : "Open documentatie", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Het is belangrijk deze server zo in te stellen dat er ook e-mails verstuurd kunnen worden om wachtwoord resets en meldingen bijvoorbeeld te versturen.", "Send mode" : "Verstuurmodus", "Encryption" : "Versleuteling", "From address" : "Afzenderadres", @@ -332,7 +335,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Web, desktop en mobiele clients zijn nu ingelogd op je account.", "Device" : "Apparaat", "Last activity" : "Laatste activiteit", - "Passcodes that give an app or device permissions to access your account." : "Een toegangscode die een app of apparaat toegang geven om je account te gebruiken.", "Name" : "Naam", "App name" : "Appnaam", "Create new app password" : "Creëer een nieuw app wachtwoord", @@ -388,6 +390,7 @@ "Cheers!" : "Proficiat!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hallo,\n\nwe willen je laten weten dat je nu een %s account hebt.\n\nJe gebruikersnaam: %s\nGa naar: %s\n\n", "For password recovery and notifications" : "Voor wachtwoordherstel en meldingen", + "Passcodes that give an app or device permissions to access your account." : "Een toegangscode die een app of apparaat toegang geven om je account te gebruiken.", "Follow us on Google Plus!" : "Volg ons op Google Plus!", "Subscribe to our twitter channel!" : "Abonneer jezelf op ons twitter kanaal!", "Subscribe to our news feed!" : "Abonneer jezelf op onze nieuwsfeed!", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 566bfc8753e..4dceb71b87a 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -326,7 +326,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Aktualnie zalogowany na swoim koncie z Web, komputerów i mobilnych urządzeń.", "Device" : "Urządzenie", "Last activity" : "Ostatnia aktywność", - "Passcodes that give an app or device permissions to access your account." : "Hasła dostępu, które dają uprawnienia aplikacjom lub urządzeniom, do uzyskania dostępu do konta.", "Name" : "Nazwa", "App name" : "Nazwa aplikacji", "Create new app password" : "Utwórz nowe hasło do aplikacji", @@ -382,6 +381,7 @@ OC.L10N.register( "Cheers!" : "Pozdrawiam!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej,\n\ninformujemy cię, że posiadasz od teraz konto %s.\n\nTwoja nazwa użytkownika: %s\nZaloguj się: %s\n\n", "For password recovery and notifications" : "W celu odzyskania hasła i powiadomień", + "Passcodes that give an app or device permissions to access your account." : "Hasła dostępu, które dają uprawnienia aplikacjom lub urządzeniom, do uzyskania dostępu do konta.", "Follow us on Google Plus!" : "Śledź nas na Google Plus!", "Subscribe to our twitter channel!" : "Zapisz się do naszego kanału na Twitterze!", "Subscribe to our news feed!" : "Zapisz się do naszego kanału informacyjnego!", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index 2699a456f44..aae69c79924 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -324,7 +324,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Aktualnie zalogowany na swoim koncie z Web, komputerów i mobilnych urządzeń.", "Device" : "Urządzenie", "Last activity" : "Ostatnia aktywność", - "Passcodes that give an app or device permissions to access your account." : "Hasła dostępu, które dają uprawnienia aplikacjom lub urządzeniom, do uzyskania dostępu do konta.", "Name" : "Nazwa", "App name" : "Nazwa aplikacji", "Create new app password" : "Utwórz nowe hasło do aplikacji", @@ -380,6 +379,7 @@ "Cheers!" : "Pozdrawiam!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej,\n\ninformujemy cię, że posiadasz od teraz konto %s.\n\nTwoja nazwa użytkownika: %s\nZaloguj się: %s\n\n", "For password recovery and notifications" : "W celu odzyskania hasła i powiadomień", + "Passcodes that give an app or device permissions to access your account." : "Hasła dostępu, które dają uprawnienia aplikacjom lub urządzeniom, do uzyskania dostępu do konta.", "Follow us on Google Plus!" : "Śledź nas na Google Plus!", "Subscribe to our twitter channel!" : "Zapisz się do naszego kanału na Twitterze!", "Subscribe to our news feed!" : "Zapisz się do naszego kanału informacyjnego!", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index e40de0b8e0c..13b33efaf35 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -11,6 +11,7 @@ OC.L10N.register( "Your apps" : "Seus aplicativos", "Enabled apps" : "Aplicativos habilitados", "Disabled apps" : "Aplicativos desabilitados", + "App bundles" : "Pacotes de aplicativos", "Wrong password" : "Senha incorreta", "Saved" : "Salvo", "No user supplied" : "Nenhum usuário fornecido", @@ -31,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Bom trabalho, %s!", "If you received this email, the email configuration seems to be correct." : "Se você recebeu este email, é sinal que a configuração do email está correta.", "Email setting test" : "Teste da configuração de email", + "Email could not be sent. Check your mail server log" : "O email não pôde ser enviado. Verifique o log do servidor de email", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o email. Por favor, revise suas configurações. (Erro: %s)", "You need to set your user email before being able to send test emails." : "Você precisa configurar seu email de usuário antes de ser capaz de enviar emails de teste.", "Invalid request" : "Solicitação inválida", @@ -107,6 +109,7 @@ OC.L10N.register( "Approved" : "Aprovado", "Experimental" : "Experimental", "No apps found for {query}" : "Nenhum aplicativo encontrado para {query}", + "Enable all" : "Habilitar tudo", "Allow filesystem access" : "Permitir acesso ao sistema de arquivos", "Disconnect" : "Desconectar", "Revoke" : "Revogar", @@ -182,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "Servidor de email", "Open documentation" : "Abrir documentação", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar emails, assim como para redefinir a senha e notificações.", "Send mode" : "Modo de envio", "Encryption" : "Criptografia", "From address" : "Endereço \"From\"", @@ -197,6 +201,7 @@ OC.L10N.register( "Test email settings" : "Configurações do email de teste", "Send email" : "Enviar email", "Server-side encryption" : "Criptografia do lado do servidor", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "A criptografia do lado do servidor torna possível criptografar arquivos que são carregados para este servidor. Isso vem com limitações como uma diminuição de desempenho, portanto, habilite isso apenas se necessário.", "Enable server-side encryption" : "Habilitar a criptografia do lado do servidor", "Please read carefully before activating server-side encryption: " : "Por favor, leia com atenção antes de ativar a criptografia do lado do servidor:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez que a criptografia é ativada, todos os arquivos enviados ao servidor a partir desse ponto em diante serão criptografados e assim ficarão no servidor. Só será possível desativar a criptografia em uma data posterior se o módulo de criptografia ativo suportar essa função e todas as pré-condições sejam cumpridas (ex., defininindo uma chave de recuperação).", @@ -211,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Você precisa migrar suas chaves de criptografia a partir da antiga criptografia (ownCloud <= 8,0) para a nova.", "Start migration" : "Iniciar migração", "Security & setup warnings" : "Segurança & avisos de configuração", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "É importante para a segurança e o desempenho de sua instância que tudo esteja configurado corretamente. Para ajudá-lo com isso, estamos fazendo algumas verificações automáticas. Consulte a seção Dicas e a documentação para obter mais informações.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "O PHP não parece estar configurado corretamente para consultar as variáveis de ambiente do sistema. O teste com getenv(\"PATH\") só retorna uma resposta vazia.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor verifique a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação de instalação ↗</a> para as notas da configuração do PHP e do PHP do servidor, especialmente quando se utiliza php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "A configuração Somente-Leitura foi habilitada. Isso impede que algumas configurações sejam definidas via interface web. Além disso, o arquivo precisa ser definido manualmente com permissão de escrita para cada atualização.", @@ -231,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Última execução do trabalho Cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho Cron: %s. Algo parece errado.", "Cron was not executed yet!" : "Cron não foi executado ainda!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para um desempenho ideal, é importante configurar corretamente os trabalhos em segundo plano. Para instâncias maiores 'Cron' é a configuração recomendada. Consulte a documentação para obter mais informações.", "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sob http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php a cada 15 minutos.", @@ -238,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para rodar isso você precisa da extensão posix PHP. Veja a {linkstart}documentação PHP{linkend} para mais detalhes.", "Version" : "Versão", "Sharing" : "Compartilhamento", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, você pode ajustar o comportamento de compartilhamento. Consulte a documentação para obter mais informações.", "Allow apps to use the Share API" : "Permitir que aplicativos usem a API de compartilhamento", "Allow users to share via link" : "Permitir que os usuários compartilhem por link", "Allow public uploads" : "Permitir envio público", @@ -256,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar o texto de aviso na página pública do link de envio. (Só é mostrado quando a lista de arquivos está oculta.)", "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será mostrado na página de envio do link público quando a lista de arquivos está oculta.", "Tips & tricks" : "Dicas & Truques", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Há muitos recursos e opções de configuração disponíveis para otimizar e usar essa instância. Aqui estão algumas indicações para obter mais informações.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como backend de banco de dados. Para instalações maiores recomendamos que voce use um outro banco de dados", "This is particularly recommended when using the desktop client for file synchronisation." : "Isso é particulamente recomendado quando se utiliza um cliente para sincronização.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados use a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.", @@ -334,7 +343,7 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Clientes Web, desktop e móvel que estão conectados à sua conta.", "Device" : "Dispositivo", "Last activity" : "Última atividade", - "Passcodes that give an app or device permissions to access your account." : "Códigos de acesso que fornecem permissões a um aplicativo ou dispositivo para acessar sua conta.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui você pode gerar senhas individuais para aplicativos. Assim você não tem que dar sua senha. Você pode revogá-los individualmente também.", "Name" : "Nome", "App name" : "Nome do aplicativo", "Create new app password" : "Criar uma nova senha do aplicativo", @@ -343,7 +352,10 @@ OC.L10N.register( "Username" : "Nome de Usuário", "Done" : "Concluído", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud{linkclose}. O {githubopen}código fonte{linkclose} é licenciado sob a {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Siga-nos no Google+!", "Like our facebook page!" : "Curta nossa página no Facebook!", + "Follow us on Twitter!" : "Siga-nos no Twitter!", + "Check out our blog!" : "Confira nosso blog!", "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Settings" : "Configurações", "Show storage location" : "Mostrar localização do armazenamento", @@ -387,9 +399,10 @@ OC.L10N.register( "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "O módulo PHP 'fileinfo' está faltando. Recomendamos que ative este módulo para obter melhores resultados com a detecção de mime-type.", "Uninstall app" : "Desinstalar aplicativo", "Hey there,<br><br>just letting you know that you now have a %s account.<br><br>Your username: <strong>%s</strong><br>Access it: <strong><a href=\"%s\">%s</a></strong><br><br>" : "Olá,<br><br>só para lhe informar que agora você tem uma %s conta.<br><br>Nome de usuário: <strong>%s</strong><br>Acesse: <strong><a href=\"%s\">%s</a></strong><br><br>", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsó para lhe informar que você agora tem uma conta %s.\n\nNome de Usuário: %s\nAcesse: %s\n\n", "For password recovery and notifications" : "Para recuperação de senha e notificações", + "Passcodes that give an app or device permissions to access your account." : "Códigos de acesso que fornecem permissões a um aplicativo ou dispositivo para acessar sua conta.", "Follow us on Google Plus!" : "Siga-nos no Google Plus!", "Subscribe to our twitter channel!" : "Assine o nosso canal no Twitter!", "Subscribe to our news feed!" : "Assine nosso feed de notícias!", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 33c701dfaf3..585c771e15c 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -9,6 +9,7 @@ "Your apps" : "Seus aplicativos", "Enabled apps" : "Aplicativos habilitados", "Disabled apps" : "Aplicativos desabilitados", + "App bundles" : "Pacotes de aplicativos", "Wrong password" : "Senha incorreta", "Saved" : "Salvo", "No user supplied" : "Nenhum usuário fornecido", @@ -29,6 +30,7 @@ "Well done, %s!" : "Bom trabalho, %s!", "If you received this email, the email configuration seems to be correct." : "Se você recebeu este email, é sinal que a configuração do email está correta.", "Email setting test" : "Teste da configuração de email", + "Email could not be sent. Check your mail server log" : "O email não pôde ser enviado. Verifique o log do servidor de email", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocorreu um problema ao enviar o email. Por favor, revise suas configurações. (Erro: %s)", "You need to set your user email before being able to send test emails." : "Você precisa configurar seu email de usuário antes de ser capaz de enviar emails de teste.", "Invalid request" : "Solicitação inválida", @@ -105,6 +107,7 @@ "Approved" : "Aprovado", "Experimental" : "Experimental", "No apps found for {query}" : "Nenhum aplicativo encontrado para {query}", + "Enable all" : "Habilitar tudo", "Allow filesystem access" : "Permitir acesso ao sistema de arquivos", "Disconnect" : "Desconectar", "Revoke" : "Revogar", @@ -180,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "Servidor de email", "Open documentation" : "Abrir documentação", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para poder enviar emails, assim como para redefinir a senha e notificações.", "Send mode" : "Modo de envio", "Encryption" : "Criptografia", "From address" : "Endereço \"From\"", @@ -195,6 +199,7 @@ "Test email settings" : "Configurações do email de teste", "Send email" : "Enviar email", "Server-side encryption" : "Criptografia do lado do servidor", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "A criptografia do lado do servidor torna possível criptografar arquivos que são carregados para este servidor. Isso vem com limitações como uma diminuição de desempenho, portanto, habilite isso apenas se necessário.", "Enable server-side encryption" : "Habilitar a criptografia do lado do servidor", "Please read carefully before activating server-side encryption: " : "Por favor, leia com atenção antes de ativar a criptografia do lado do servidor:", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Uma vez que a criptografia é ativada, todos os arquivos enviados ao servidor a partir desse ponto em diante serão criptografados e assim ficarão no servidor. Só será possível desativar a criptografia em uma data posterior se o módulo de criptografia ativo suportar essa função e todas as pré-condições sejam cumpridas (ex., defininindo uma chave de recuperação).", @@ -209,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Você precisa migrar suas chaves de criptografia a partir da antiga criptografia (ownCloud <= 8,0) para a nova.", "Start migration" : "Iniciar migração", "Security & setup warnings" : "Segurança & avisos de configuração", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "É importante para a segurança e o desempenho de sua instância que tudo esteja configurado corretamente. Para ajudá-lo com isso, estamos fazendo algumas verificações automáticas. Consulte a seção Dicas e a documentação para obter mais informações.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "O PHP não parece estar configurado corretamente para consultar as variáveis de ambiente do sistema. O teste com getenv(\"PATH\") só retorna uma resposta vazia.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Por favor verifique a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação de instalação ↗</a> para as notas da configuração do PHP e do PHP do servidor, especialmente quando se utiliza php-fpm.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "A configuração Somente-Leitura foi habilitada. Isso impede que algumas configurações sejam definidas via interface web. Além disso, o arquivo precisa ser definido manualmente com permissão de escrita para cada atualização.", @@ -229,6 +235,7 @@ "Last cron job execution: %s." : "Última execução do trabalho Cron: %s.", "Last cron job execution: %s. Something seems wrong." : "Última execução do trabalho Cron: %s. Algo parece errado.", "Cron was not executed yet!" : "Cron não foi executado ainda!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "Para um desempenho ideal, é importante configurar corretamente os trabalhos em segundo plano. Para instâncias maiores 'Cron' é a configuração recomendada. Consulte a documentação para obter mais informações.", "Execute one task with each page loaded" : "Execute uma tarefa com cada página carregada", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php está registrado no serviço webcron para chamar cron.php a cada 15 minutos sob http.", "Use system's cron service to call the cron.php file every 15 minutes." : "Usar o serviço cron do sistema para chamar o arquivo cron.php a cada 15 minutos.", @@ -236,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Para rodar isso você precisa da extensão posix PHP. Veja a {linkstart}documentação PHP{linkend} para mais detalhes.", "Version" : "Versão", "Sharing" : "Compartilhamento", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, você pode ajustar o comportamento de compartilhamento. Consulte a documentação para obter mais informações.", "Allow apps to use the Share API" : "Permitir que aplicativos usem a API de compartilhamento", "Allow users to share via link" : "Permitir que os usuários compartilhem por link", "Allow public uploads" : "Permitir envio público", @@ -254,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Mostrar o texto de aviso na página pública do link de envio. (Só é mostrado quando a lista de arquivos está oculta.)", "This text will be shown on the public link upload page when the file list is hidden." : "Este texto será mostrado na página de envio do link público quando a lista de arquivos está oculta.", "Tips & tricks" : "Dicas & Truques", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Há muitos recursos e opções de configuração disponíveis para otimizar e usar essa instância. Aqui estão algumas indicações para obter mais informações.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "SQLite é usando atualmente como backend de banco de dados. Para instalações maiores recomendamos que voce use um outro banco de dados", "This is particularly recommended when using the desktop client for file synchronisation." : "Isso é particulamente recomendado quando se utiliza um cliente para sincronização.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Para migrar para outro banco de dados use a ferramenta de linha de comando: 'occ db:convert-type', ou consulte a <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentação ↗</a>.", @@ -332,7 +341,7 @@ "Web, desktop and mobile clients currently logged in to your account." : "Clientes Web, desktop e móvel que estão conectados à sua conta.", "Device" : "Dispositivo", "Last activity" : "Última atividade", - "Passcodes that give an app or device permissions to access your account." : "Códigos de acesso que fornecem permissões a um aplicativo ou dispositivo para acessar sua conta.", + "Here you can generate individual passwords for apps so you don’t have to give out your password. You can revoke them individually too." : "Aqui você pode gerar senhas individuais para aplicativos. Assim você não tem que dar sua senha. Você pode revogá-los individualmente também.", "Name" : "Nome", "App name" : "Nome do aplicativo", "Create new app password" : "Criar uma nova senha do aplicativo", @@ -341,7 +350,10 @@ "Username" : "Nome de Usuário", "Done" : "Concluído", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desenvolvido pela {communityopen}comunidade Nextcloud{linkclose}. O {githubopen}código fonte{linkclose} é licenciado sob a {licenseopen}AGPL{linkclose}.", + "Follow us on Google+!" : "Siga-nos no Google+!", "Like our facebook page!" : "Curta nossa página no Facebook!", + "Follow us on Twitter!" : "Siga-nos no Twitter!", + "Check out our blog!" : "Confira nosso blog!", "Subscribe to our newsletter!" : "Inscreva-se para receber nosso boletim informativo!", "Settings" : "Configurações", "Show storage location" : "Mostrar localização do armazenamento", @@ -385,9 +397,10 @@ "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "O módulo PHP 'fileinfo' está faltando. Recomendamos que ative este módulo para obter melhores resultados com a detecção de mime-type.", "Uninstall app" : "Desinstalar aplicativo", "Hey there,<br><br>just letting you know that you now have a %s account.<br><br>Your username: <strong>%s</strong><br>Access it: <strong><a href=\"%s\">%s</a></strong><br><br>" : "Olá,<br><br>só para lhe informar que agora você tem uma %s conta.<br><br>Nome de usuário: <strong>%s</strong><br>Acesse: <strong><a href=\"%s\">%s</a></strong><br><br>", - "Cheers!" : "Saúde!", + "Cheers!" : "Saudações!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Olá,\n\nsó para lhe informar que você agora tem uma conta %s.\n\nNome de Usuário: %s\nAcesse: %s\n\n", "For password recovery and notifications" : "Para recuperação de senha e notificações", + "Passcodes that give an app or device permissions to access your account." : "Códigos de acesso que fornecem permissões a um aplicativo ou dispositivo para acessar sua conta.", "Follow us on Google Plus!" : "Siga-nos no Google Plus!", "Subscribe to our twitter channel!" : "Assine o nosso canal no Twitter!", "Subscribe to our news feed!" : "Assine nosso feed de notícias!", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 052f49ba0ff..038073a2ed5 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -334,7 +334,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", "Last activity" : "Последние действия", - "Passcodes that give an app or device permissions to access your account." : "Код доступа, который дает приложению или устройству разрешения на доступ к вашей учётной записи.", "Name" : "Название", "App name" : "Название приложения", "Create new app password" : "Создать новый пароль для приложения", @@ -390,6 +389,7 @@ OC.L10N.register( "Cheers!" : "Удачи!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", "For password recovery and notifications" : "Для восстановления пароля и уведомлений", + "Passcodes that give an app or device permissions to access your account." : "Код доступа, который дает приложению или устройству разрешения на доступ к вашей учётной записи.", "Follow us on Google Plus!" : "Следите за нашими новостями в Google Plus!", "Subscribe to our twitter channel!" : "Подпишитесь на наш twitter-канал!", "Subscribe to our news feed!" : "Подпишитесь на нашу ленту новостей!", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 2ffd1bceab8..dee3f53a888 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -332,7 +332,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Веб, настольные и мобильные клиенты, которые в настоящий момент авторизованы вашей учётной записью.", "Device" : "Устройство", "Last activity" : "Последние действия", - "Passcodes that give an app or device permissions to access your account." : "Код доступа, который дает приложению или устройству разрешения на доступ к вашей учётной записи.", "Name" : "Название", "App name" : "Название приложения", "Create new app password" : "Создать новый пароль для приложения", @@ -388,6 +387,7 @@ "Cheers!" : "Удачи!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Здравствуйте,\n\nПросто хотим сообщить, что теперь у вас есть учетная запись на %s.\n\nИмя пользователя: %s\nЗайти: %s\n", "For password recovery and notifications" : "Для восстановления пароля и уведомлений", + "Passcodes that give an app or device permissions to access your account." : "Код доступа, который дает приложению или устройству разрешения на доступ к вашей учётной записи.", "Follow us on Google Plus!" : "Следите за нашими новостями в Google Plus!", "Subscribe to our twitter channel!" : "Подпишитесь на наш twitter-канал!", "Subscribe to our news feed!" : "Подпишитесь на нашу ленту новостей!", diff --git a/settings/l10n/sk.js b/settings/l10n/sk.js index 9505e47fc10..fac770cf53c 100644 --- a/settings/l10n/sk.js +++ b/settings/l10n/sk.js @@ -263,7 +263,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví, alebo mobilní klienti práve prihlásení na váš účet.", "Device" : "Zariadenie", "Last activity" : "Posledná aktivita", - "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Name" : "Názov", "App name" : "Názov aplikácie", "Create new app password" : "Vytvoriť nové heslo aplikácie", @@ -315,6 +314,7 @@ OC.L10N.register( "Cheers!" : "Pekný deň!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Dobrý deň,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", "For password recovery and notifications" : "Pre obnovu hesla a oznámenia", + "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Follow us on Google Plus!" : "Sleduj nás na Google Plus!", "Show last log in" : "Zobraziť posledné prihlásenie" }, diff --git a/settings/l10n/sk.json b/settings/l10n/sk.json index 8e49e6a8350..684df4ccf8f 100644 --- a/settings/l10n/sk.json +++ b/settings/l10n/sk.json @@ -261,7 +261,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Weboví, desktopoví, alebo mobilní klienti práve prihlásení na váš účet.", "Device" : "Zariadenie", "Last activity" : "Posledná aktivita", - "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Name" : "Názov", "App name" : "Názov aplikácie", "Create new app password" : "Vytvoriť nové heslo aplikácie", @@ -313,6 +312,7 @@ "Cheers!" : "Pekný deň!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Dobrý deň,\n\ntoto je oznámenie o novo vytvorenom účte %s.\n\nVaše používateľské meno: %s\nPrihlásiť sa môžete tu: %s\n\n", "For password recovery and notifications" : "Pre obnovu hesla a oznámenia", + "Passcodes that give an app or device permissions to access your account." : "Prístupové heslá, ktoré dovolia aplikáciam alebo zariadeniam prístup na váš účet.", "Follow us on Google Plus!" : "Sleduj nás na Google Plus!", "Show last log in" : "Zobraziť posledné prihlásenie" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 1ef63fa1d03..d6ddda2316c 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -282,7 +282,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Klientë në rrjet, desktop dhe celular kanë hyrë aktualisht në llogarinë tuaj.", "Device" : "Pajisje", "Last activity" : "Aktiviteti i fundit", - "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Name" : "Emër", "App name" : "Emër aplikacioni", "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", @@ -335,6 +334,7 @@ OC.L10N.register( "Cheers!" : "Gëzuar!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", "For password recovery and notifications" : "Për rimarrje fjalëkalimesh dhe njoftime ", + "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Follow us on Google Plus!" : "Na ndiqni në Google Plus!", "Subscribe to our twitter channel!" : "Abonohuni në kanalin tonë në twitter!", "Subscribe to our news feed!" : "Abonohuni në kanalin tonë në twitter!", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index c787d41324b..4b90685f3dd 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -280,7 +280,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Klientë në rrjet, desktop dhe celular kanë hyrë aktualisht në llogarinë tuaj.", "Device" : "Pajisje", "Last activity" : "Aktiviteti i fundit", - "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Name" : "Emër", "App name" : "Emër aplikacioni", "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", @@ -333,6 +332,7 @@ "Cheers!" : "Gëzuar!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Njatjeta,\n\nthjesht po ju bëjmë të ditur që tani keni një llogari %s.\n\nEmri juaj i përdoruesit: %s\nHyni në të te: %s\n\n", "For password recovery and notifications" : "Për rimarrje fjalëkalimesh dhe njoftime ", + "Passcodes that give an app or device permissions to access your account." : "Fjalëkalimet të cilat i japin një aplikacioni ose pajisje lejen për të aksesuar llogarinë tuaj.", "Follow us on Google Plus!" : "Na ndiqni në Google Plus!", "Subscribe to our twitter channel!" : "Abonohuni në kanalin tonë në twitter!", "Subscribe to our news feed!" : "Abonohuni në kanalin tonë në twitter!", diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js index 263d420c366..2da23e7a693 100644 --- a/settings/l10n/sv.js +++ b/settings/l10n/sv.js @@ -291,7 +291,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Webb, skrivbordsklienter och mobila klienter som är inloggade på ditt konto just nu.", "Device" : "Enhet", "Last activity" : "Senaste aktivitet", - "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Name" : "Namn", "App name" : "Appnamn", "Create new app password" : "Skapa nytt applösenord", @@ -344,6 +343,7 @@ OC.L10N.register( "Cheers!" : "Ha de fint!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nLogga in: %s\n\n", "For password recovery and notifications" : "För lösenordsåterställning och notifieringar", + "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Follow us on Google Plus!" : "Fälj oss på Google Plus!", "Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!", "Subscribe to our news feed!" : "Prenumerera på vårt nyhetsflöde!", diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json index b35d2bf5f9f..a6ae2f5779b 100644 --- a/settings/l10n/sv.json +++ b/settings/l10n/sv.json @@ -289,7 +289,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Webb, skrivbordsklienter och mobila klienter som är inloggade på ditt konto just nu.", "Device" : "Enhet", "Last activity" : "Senaste aktivitet", - "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Name" : "Namn", "App name" : "Appnamn", "Create new app password" : "Skapa nytt applösenord", @@ -342,6 +341,7 @@ "Cheers!" : "Ha de fint!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Hej där,\n\nTänkte bara informera om att du nu har ett %s konto.\n\nDitt användarnamn: %s\nLogga in: %s\n\n", "For password recovery and notifications" : "För lösenordsåterställning och notifieringar", + "Passcodes that give an app or device permissions to access your account." : "Lösenordskod som ger en applikation eller enhet rättigheter att ansluta till ditt konto.", "Follow us on Google Plus!" : "Fälj oss på Google Plus!", "Subscribe to our twitter channel!" : "Prenumerera på vårt Twitterkonto!", "Subscribe to our news feed!" : "Prenumerera på vårt nyhetsflöde!", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index 9711b527dbe..519c2a043bf 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -8,6 +8,10 @@ OC.L10N.register( "You changed your email address" : "E-posta adresinizi değiştirdiniz", "Your email address was changed by an administrator" : "E-posta adresiniz bir yönetici tarafından değiştirildi", "Your <strong>password</strong> or <strong>email</strong> was modified" : "<strong>Parolanız</strong> ya da <strong>e-posta adresiniz</strong> değiştirildi", + "Your apps" : "Uygulamalarınız", + "Enabled apps" : "Etkinleştirilmiş Uygulamalar", + "Disabled apps" : "Devre Dışı Uygulamalar", + "App bundles" : "Uygulama Paketleri", "Wrong password" : "Parola hatalı", "Saved" : "Kaydedildi", "No user supplied" : "Kullanıcı belirtilmemiş", @@ -28,6 +32,7 @@ OC.L10N.register( "Well done, %s!" : "Tamamdır %s!", "If you received this email, the email configuration seems to be correct." : "Bu e-postayı aldıysanız e-posta ayarları doğru olarak yapılmıştır.", "Email setting test" : "E-posta ayarları sınaması", + "Email could not be sent. Check your mail server log" : "E-posta gönderilemedi. E-posta sunucunuzun günlüklerine bakın", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "E-posta gönderilirken bir sorun çıktı. Lütfen ayarlarınızı gözden geçirin. (Hata: %s)", "You need to set your user email before being able to send test emails." : "Sınama e-postaları göndermeden önce kullanıcı e-postasını ayarlamalısınız.", "Invalid request" : "İstek geçersiz", @@ -96,11 +101,15 @@ OC.L10N.register( "Updating...." : "Güncelleniyor....", "Error while updating app" : "Uygulama güncellenirken sorun çıktı", "Updated" : "Güncellendi", + "Removing …" : "Kaldırılıyor...", + "Error while removing app" : "Uygulama kaldırılırken sorun çıktı", + "Remove" : "Kaldır", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Uygulama etkinleştirilmiş fakat güncellenmesi gerekiyor. 5 saniye içinde güncelleme sayfasına yönlendirileceksiniz.", "App update" : "Uygulama güncellemesi", "Approved" : "Onaylanmış", "Experimental" : "Deneysel", "No apps found for {query}" : "{query} aramasına uyan bir uygulama bulunamadı", + "Enable all" : "Tümünü Etkinleştir", "Allow filesystem access" : "Dosya sistemine erişilebilsin", "Disconnect" : "Bağlantıyı Kes", "Revoke" : "Geri Al", @@ -176,6 +185,7 @@ OC.L10N.register( "STARTTLS" : "STARTTLS", "Email server" : "E-posta sunucusu", "Open documentation" : "Belgeleri aç", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Bu sunucunun parola sıfırlama ve bildirim işlemleri için e-posta gönderebilecek şekilde ayarlanmış olması önemlidir.", "Send mode" : "Gönderim kipi", "Encryption" : "Şifreleme", "From address" : "Kimden adresi", @@ -191,6 +201,7 @@ OC.L10N.register( "Test email settings" : "E-posta ayarlarını sına", "Send email" : "E-posta gönder", "Server-side encryption" : "Sunucu tarafı şifreleme", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Sunucu tarafındaki şifreleme, sunucuya yüklenen dosyaların şifrelenebilmesini sağlar. Bu özellik genel başarımı düşürdüğünden yalnız gerek varsa etkinleştirin.", "Enable server-side encryption" : "Sunucu tarafı şifreleme kullanılsın", "Please read carefully before activating server-side encryption: " : "Lütfen sunucu tarafında şifrelemeyi etkinleştirmeden önce dikkatlice okuyun: ", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Şifreleme etkinleştirildiğinde, etkinleştirme anından sonra sunucuya yüklenen tüm dosyalar şifrelenir. Şifreleme daha sonra devre dışı bırakılmak istenirse, etkin şifreleme modülünün bu özelliği desteklemesi ve tüm ön koşulların (örneğin kurtarma anahtarı oluşturulması) yerine getirilmesi gerekir.", @@ -205,6 +216,7 @@ OC.L10N.register( "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Şifreleme anahtarlarınızı eski şifrelemeden (ownCloud <= 8.0) yenisine aktarmalısınız.", "Start migration" : "Aktarmayı başlat", "Security & setup warnings" : "Güvenlik ve kurulum uyarıları", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Kopyanızın güvenli ve yüksek başarımla çalışması için ayarların doğru yapılmış olması önemlidir. Bunu sağlamak için bazı otomatik denetimler yapılır. Ayrıntılı bilgi almak için İpuçları bölümüne ve belgelere bakın.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP sistem ortam değişkenlerini okuyamayacak şekilde hatalı olarak kurulmuş gibi görünüyor. getenv(\"PATH\") komutu ile yapılan sınama sonucunda boş bir cevap alındı.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lütfen PHP yapılandırma notları ve özellikle php-fpm kullanırken sunucunuzdaki PHP yapılandırması için <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">kurulum belgelerine ↗</a> bakın.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt Okunur yapılandırma etkinleştirilmiş. Bu yapılandırma, bazı ayarların web arayüzünden yapılmasını önler. Ayrıca, bu dosyanın her güncelleme öncesinde el ile yazılabilir yapılması gerekir.", @@ -225,6 +237,7 @@ OC.L10N.register( "Last cron job execution: %s." : "Zamanlanmış görevin son yürütülmesi: %s.", "Last cron job execution: %s. Something seems wrong." : "Zamanlanmış görevin son yürütülmesi: %s. Bir şeyler yanlış görünüyor.", "Cron was not executed yet!" : "Zamanlanmış görev henüz yürütülmemiş!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "En iyi başarım için art alan görevlerinin doğru şekilde ayarlanması önemlidir. Büyük kurulumlar için 'Cron' ayarı önerilir. Ayrıntılı bilgi almak için belgelere bakın.", "Execute one task with each page loaded" : "Her sayfa yüklemesinde bir görev yürütülsün", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden 15 dakikada bir yürütülmesi için webcron hizmetine kaydedildi.", "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını 15 dakikada bir çağırmak için sistem cron hizmeti kullanılır.", @@ -232,6 +245,7 @@ OC.L10N.register( "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Bunu çalıştıraiblmek için PHP posix eklentisi gereklidir. Ayrıntılı bilgi almak için {linkstart}PHP belgelerine{linkend} bakın.", "Version" : "Sürüm", "Sharing" : "Paylaşım", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Yönetici olarak paylaşma davranışı ile ilgili ince ayarları yapabilirsiniz. Ayrıntılı bilgi almak için belgelere bakın.", "Allow apps to use the Share API" : "Uygulamalar Paylaşım API kullanabilsin", "Allow users to share via link" : "Kullanıcıların bağlantı ile paylaşabilsin", "Allow public uploads" : "Herkes yükleme yapabilsin", @@ -250,6 +264,7 @@ OC.L10N.register( "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Herkese açık bağlantı yükleme sayfasındaki sorumluluk reddi bildirim metni (yalnız dosya listesi gizli iken görüntülenir).", "This text will be shown on the public link upload page when the file list is hidden." : "Dosya listesi gizli iken herkese açık bağlantı yükleme sayfasında görüntülenecek sorumluluk reddi bildirimi metni.", "Tips & tricks" : "İpucu ve incelikler", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Bu kopyayı kullanmak ve en iyi şekilde ayarlamak için çok sayıda özellik ve ayar seçeneği vardır. Ayrıntılı bilgi alabileceğiniz bazı konular şu şekildedir.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "Şu anda veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.", "This is particularly recommended when using the desktop client for file synchronisation." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' ya da <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">belgelere ↗</a> bakın.", @@ -261,6 +276,8 @@ OC.L10N.register( "Check the security of your Nextcloud over our security scan" : "Güvenlik sınamamızdan geçirerek Nextcloud güvenliğinizi denetleyin", "Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği", "Developer documentation" : "Geliştirici belgeleri", + "View in store" : "Mağazada görüntüle", + "Limit to groups" : "Şu gruplarla sınırla", "This app has an update available." : "Bu uygulama için bir güncelleme yayınlanmış.", "by %s" : "Yazar: %s", "%s-licensed" : "%s lisanslı", @@ -326,7 +343,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "Şu anda hesabınıza web, masaüstü ve mobil istemciler oturum açmış.", "Device" : "Aygıt", "Last activity" : "Son işlem", - "Passcodes that give an app or device permissions to access your account." : "Parola kodları bir uygulama ya da aygıtın hesabınıza erişmesini sağlar.", "Name" : "Ad", "App name" : "Uygulama adı", "Create new app password" : "Yeni uygulama parolası oluştur", @@ -335,7 +351,10 @@ OC.L10N.register( "Username" : "Kullanıcı Adı", "Done" : "Tamam", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud topluluğu tarafından geliştirilmiştir{linkclose}. {githubopen}Kaynak kodu{linkclose} {licenseopen}AGPL{linkclose} koşulları altında lisanslanmıştır.", + "Follow us on Google+!" : "Bizi Google+ üzerinde izleyin!", "Like our facebook page!" : "Facebook sayfamızı beğenin!", + "Follow us on Twitter!" : "Bizi Twitter üzerinde izleyin!", + "Check out our blog!" : "Bloğumuza bakın!", "Subscribe to our newsletter!" : " Bültenimize abone olun!", "Settings" : "Ayarlar", "Show storage location" : "Depolama konumu görüntülensin", @@ -382,6 +401,7 @@ OC.L10N.register( "Cheers!" : "Hoşçakalın!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba\n\nArtık bir %s hesabınızın olduğunu bildirmek istedik.\n\nKullanıcı adınız: %s\nŞuradan erişebilirsiniz: %s\n", "For password recovery and notifications" : "Parola sıfırlama ve bildirimler için", + "Passcodes that give an app or device permissions to access your account." : "Parola kodları bir uygulama ya da aygıtın hesabınıza erişmesini sağlar.", "Follow us on Google Plus!" : "Bizi Google Plus üzerinde izleyin", "Subscribe to our twitter channel!" : "Twitter kanalımıza abone olun!", "Subscribe to our news feed!" : "Haber akışımıza abone olun!", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index ba714f626f6..007ab133623 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -6,6 +6,10 @@ "You changed your email address" : "E-posta adresinizi değiştirdiniz", "Your email address was changed by an administrator" : "E-posta adresiniz bir yönetici tarafından değiştirildi", "Your <strong>password</strong> or <strong>email</strong> was modified" : "<strong>Parolanız</strong> ya da <strong>e-posta adresiniz</strong> değiştirildi", + "Your apps" : "Uygulamalarınız", + "Enabled apps" : "Etkinleştirilmiş Uygulamalar", + "Disabled apps" : "Devre Dışı Uygulamalar", + "App bundles" : "Uygulama Paketleri", "Wrong password" : "Parola hatalı", "Saved" : "Kaydedildi", "No user supplied" : "Kullanıcı belirtilmemiş", @@ -26,6 +30,7 @@ "Well done, %s!" : "Tamamdır %s!", "If you received this email, the email configuration seems to be correct." : "Bu e-postayı aldıysanız e-posta ayarları doğru olarak yapılmıştır.", "Email setting test" : "E-posta ayarları sınaması", + "Email could not be sent. Check your mail server log" : "E-posta gönderilemedi. E-posta sunucunuzun günlüklerine bakın", "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "E-posta gönderilirken bir sorun çıktı. Lütfen ayarlarınızı gözden geçirin. (Hata: %s)", "You need to set your user email before being able to send test emails." : "Sınama e-postaları göndermeden önce kullanıcı e-postasını ayarlamalısınız.", "Invalid request" : "İstek geçersiz", @@ -94,11 +99,15 @@ "Updating...." : "Güncelleniyor....", "Error while updating app" : "Uygulama güncellenirken sorun çıktı", "Updated" : "Güncellendi", + "Removing …" : "Kaldırılıyor...", + "Error while removing app" : "Uygulama kaldırılırken sorun çıktı", + "Remove" : "Kaldır", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "Uygulama etkinleştirilmiş fakat güncellenmesi gerekiyor. 5 saniye içinde güncelleme sayfasına yönlendirileceksiniz.", "App update" : "Uygulama güncellemesi", "Approved" : "Onaylanmış", "Experimental" : "Deneysel", "No apps found for {query}" : "{query} aramasına uyan bir uygulama bulunamadı", + "Enable all" : "Tümünü Etkinleştir", "Allow filesystem access" : "Dosya sistemine erişilebilsin", "Disconnect" : "Bağlantıyı Kes", "Revoke" : "Geri Al", @@ -174,6 +183,7 @@ "STARTTLS" : "STARTTLS", "Email server" : "E-posta sunucusu", "Open documentation" : "Belgeleri aç", + "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Bu sunucunun parola sıfırlama ve bildirim işlemleri için e-posta gönderebilecek şekilde ayarlanmış olması önemlidir.", "Send mode" : "Gönderim kipi", "Encryption" : "Şifreleme", "From address" : "Kimden adresi", @@ -189,6 +199,7 @@ "Test email settings" : "E-posta ayarlarını sına", "Send email" : "E-posta gönder", "Server-side encryption" : "Sunucu tarafı şifreleme", + "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "Sunucu tarafındaki şifreleme, sunucuya yüklenen dosyaların şifrelenebilmesini sağlar. Bu özellik genel başarımı düşürdüğünden yalnız gerek varsa etkinleştirin.", "Enable server-side encryption" : "Sunucu tarafı şifreleme kullanılsın", "Please read carefully before activating server-side encryption: " : "Lütfen sunucu tarafında şifrelemeyi etkinleştirmeden önce dikkatlice okuyun: ", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Şifreleme etkinleştirildiğinde, etkinleştirme anından sonra sunucuya yüklenen tüm dosyalar şifrelenir. Şifreleme daha sonra devre dışı bırakılmak istenirse, etkin şifreleme modülünün bu özelliği desteklemesi ve tüm ön koşulların (örneğin kurtarma anahtarı oluşturulması) yerine getirilmesi gerekir.", @@ -203,6 +214,7 @@ "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one." : "Şifreleme anahtarlarınızı eski şifrelemeden (ownCloud <= 8.0) yenisine aktarmalısınız.", "Start migration" : "Aktarmayı başlat", "Security & setup warnings" : "Güvenlik ve kurulum uyarıları", + "It's important for the security and performance of your instance that everything is configured correctly. To help you with that we are doing some automatic checks. Please see the Tips & Ticks section and the documentation for more information." : "Kopyanızın güvenli ve yüksek başarımla çalışması için ayarların doğru yapılmış olması önemlidir. Bunu sağlamak için bazı otomatik denetimler yapılır. Ayrıntılı bilgi almak için İpuçları bölümüne ve belgelere bakın.", "php does not seem to be setup properly to query system environment variables. The test with getenv(\"PATH\") only returns an empty response." : "PHP sistem ortam değişkenlerini okuyamayacak şekilde hatalı olarak kurulmuş gibi görünüyor. getenv(\"PATH\") komutu ile yapılan sınama sonucunda boş bir cevap alındı.", "Please check the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">installation documentation ↗</a> for php configuration notes and the php configuration of your server, especially when using php-fpm." : "Lütfen PHP yapılandırma notları ve özellikle php-fpm kullanırken sunucunuzdaki PHP yapılandırması için <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">kurulum belgelerine ↗</a> bakın.", "The Read-Only config has been enabled. This prevents setting some configurations via the web-interface. Furthermore, the file needs to be made writable manually for every update." : "Salt Okunur yapılandırma etkinleştirilmiş. Bu yapılandırma, bazı ayarların web arayüzünden yapılmasını önler. Ayrıca, bu dosyanın her güncelleme öncesinde el ile yazılabilir yapılması gerekir.", @@ -223,6 +235,7 @@ "Last cron job execution: %s." : "Zamanlanmış görevin son yürütülmesi: %s.", "Last cron job execution: %s. Something seems wrong." : "Zamanlanmış görevin son yürütülmesi: %s. Bir şeyler yanlış görünüyor.", "Cron was not executed yet!" : "Zamanlanmış görev henüz yürütülmemiş!", + "For optimal performance it's important to configure background jobs correctly. For bigger instances 'Cron' is the recommended setting. Please see the documentation for more information." : "En iyi başarım için art alan görevlerinin doğru şekilde ayarlanması önemlidir. Büyük kurulumlar için 'Cron' ayarı önerilir. Ayrıntılı bilgi almak için belgelere bakın.", "Execute one task with each page loaded" : "Her sayfa yüklemesinde bir görev yürütülsün", "cron.php is registered at a webcron service to call cron.php every 15 minutes over http." : "cron.php, http üzerinden 15 dakikada bir yürütülmesi için webcron hizmetine kaydedildi.", "Use system's cron service to call the cron.php file every 15 minutes." : "Cron.php dosyasını 15 dakikada bir çağırmak için sistem cron hizmeti kullanılır.", @@ -230,6 +243,7 @@ "To run this you need the PHP posix extension. See {linkstart}PHP documentation{linkend} for more details." : "Bunu çalıştıraiblmek için PHP posix eklentisi gereklidir. Ayrıntılı bilgi almak için {linkstart}PHP belgelerine{linkend} bakın.", "Version" : "Sürüm", "Sharing" : "Paylaşım", + "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Yönetici olarak paylaşma davranışı ile ilgili ince ayarları yapabilirsiniz. Ayrıntılı bilgi almak için belgelere bakın.", "Allow apps to use the Share API" : "Uygulamalar Paylaşım API kullanabilsin", "Allow users to share via link" : "Kullanıcıların bağlantı ile paylaşabilsin", "Allow public uploads" : "Herkes yükleme yapabilsin", @@ -248,6 +262,7 @@ "Show disclaimer text on the public link upload page. (Only shown when the file list is hidden.)" : "Herkese açık bağlantı yükleme sayfasındaki sorumluluk reddi bildirim metni (yalnız dosya listesi gizli iken görüntülenir).", "This text will be shown on the public link upload page when the file list is hidden." : "Dosya listesi gizli iken herkese açık bağlantı yükleme sayfasında görüntülenecek sorumluluk reddi bildirimi metni.", "Tips & tricks" : "İpucu ve incelikler", + "There are a lot of features and config switches available to optimally customize and use this instance. Here are some pointers for more information." : "Bu kopyayı kullanmak ve en iyi şekilde ayarlamak için çok sayıda özellik ve ayar seçeneği vardır. Ayrıntılı bilgi alabileceğiniz bazı konular şu şekildedir.", "SQLite is currently being used as the backend database. For larger installations we recommend that you switch to a different database backend." : "Şu anda veritabanı olarak SQLite kullanılıyor. Daha büyük kurulumlar için farklı bir veritabanı arka ucuna geçmenizi öneriyoruz.", "This is particularly recommended when using the desktop client for file synchronisation." : "Özellikle dosya eşitleme için masaüstü istemcisi kullanılırken SQLite kullanımı önerilmez.", "To migrate to another database use the command line tool: 'occ db:convert-type', or see the <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">documentation ↗</a>." : "Başka bir veritabanına geçmek için komut satırı aracını kullanın: 'occ db:convert-type' ya da <a target=\"_blank\" rel=\"noreferrer\" href=\"%s\">belgelere ↗</a> bakın.", @@ -259,6 +274,8 @@ "Check the security of your Nextcloud over our security scan" : "Güvenlik sınamamızdan geçirerek Nextcloud güvenliğinizi denetleyin", "Hardening and security guidance" : "Sağlamlaştırma ve güvenlik rehberliği", "Developer documentation" : "Geliştirici belgeleri", + "View in store" : "Mağazada görüntüle", + "Limit to groups" : "Şu gruplarla sınırla", "This app has an update available." : "Bu uygulama için bir güncelleme yayınlanmış.", "by %s" : "Yazar: %s", "%s-licensed" : "%s lisanslı", @@ -324,7 +341,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "Şu anda hesabınıza web, masaüstü ve mobil istemciler oturum açmış.", "Device" : "Aygıt", "Last activity" : "Son işlem", - "Passcodes that give an app or device permissions to access your account." : "Parola kodları bir uygulama ya da aygıtın hesabınıza erişmesini sağlar.", "Name" : "Ad", "App name" : "Uygulama adı", "Create new app password" : "Yeni uygulama parolası oluştur", @@ -333,7 +349,10 @@ "Username" : "Kullanıcı Adı", "Done" : "Tamam", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "{communityopen}Nextcloud topluluğu tarafından geliştirilmiştir{linkclose}. {githubopen}Kaynak kodu{linkclose} {licenseopen}AGPL{linkclose} koşulları altında lisanslanmıştır.", + "Follow us on Google+!" : "Bizi Google+ üzerinde izleyin!", "Like our facebook page!" : "Facebook sayfamızı beğenin!", + "Follow us on Twitter!" : "Bizi Twitter üzerinde izleyin!", + "Check out our blog!" : "Bloğumuza bakın!", "Subscribe to our newsletter!" : " Bültenimize abone olun!", "Settings" : "Ayarlar", "Show storage location" : "Depolama konumu görüntülensin", @@ -380,6 +399,7 @@ "Cheers!" : "Hoşçakalın!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "Merhaba\n\nArtık bir %s hesabınızın olduğunu bildirmek istedik.\n\nKullanıcı adınız: %s\nŞuradan erişebilirsiniz: %s\n", "For password recovery and notifications" : "Parola sıfırlama ve bildirimler için", + "Passcodes that give an app or device permissions to access your account." : "Parola kodları bir uygulama ya da aygıtın hesabınıza erişmesini sağlar.", "Follow us on Google Plus!" : "Bizi Google Plus üzerinde izleyin", "Subscribe to our twitter channel!" : "Twitter kanalımıza abone olun!", "Subscribe to our news feed!" : "Haber akışımıza abone olun!", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 9f05aa255f8..838f655e954 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -292,7 +292,6 @@ OC.L10N.register( "Web, desktop and mobile clients currently logged in to your account." : "您账号当前登录的 Web 页面, 桌面和客户端客户端.", "Device" : "设备", "Last activity" : "最后活跃", - "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Name" : "名称", "App name" : "应用名", "Create new app password" : "创建新应用密码", @@ -345,6 +344,7 @@ OC.L10N.register( "Cheers!" : "干杯!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "您好,\n\n您刚刚创建了 %s 账户.\n\n您的用户名: %s\n现在访问: %s\n", "For password recovery and notifications" : "用于密码恢复和通知", + "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Follow us on Google Plus!" : "在 Google+ 上关注我们!", "Subscribe to our twitter channel!" : "关注我们的 twitter!", "Subscribe to our news feed!" : "订阅我们 RSS 最新消息!", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index 9bbd890d399..7fa9be15a4f 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -290,7 +290,6 @@ "Web, desktop and mobile clients currently logged in to your account." : "您账号当前登录的 Web 页面, 桌面和客户端客户端.", "Device" : "设备", "Last activity" : "最后活跃", - "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Name" : "名称", "App name" : "应用名", "Create new app password" : "创建新应用密码", @@ -343,6 +342,7 @@ "Cheers!" : "干杯!", "Hey there,\n\njust letting you know that you now have a %s account.\n\nYour username: %s\nAccess it: %s\n\n" : "您好,\n\n您刚刚创建了 %s 账户.\n\n您的用户名: %s\n现在访问: %s\n", "For password recovery and notifications" : "用于密码恢复和通知", + "Passcodes that give an app or device permissions to access your account." : "Passcodes 可以使应用或设备访问您的账号.", "Follow us on Google Plus!" : "在 Google+ 上关注我们!", "Subscribe to our twitter channel!" : "关注我们的 twitter!", "Subscribe to our news feed!" : "订阅我们 RSS 最新消息!", diff --git a/settings/personal.php b/settings/personal.php index 2c46a9f8dd2..86ac4f753f4 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -40,7 +40,11 @@ OC_Util::checkLoggedIn(); $defaults = \OC::$server->getThemingDefaults(); $certificateManager = \OC::$server->getCertificateManager(); -$accountManager = new \OC\Accounts\AccountManager(\OC::$server->getDatabaseConnection(), \OC::$server->getEventDispatcher()); +$accountManager = new \OC\Accounts\AccountManager( + \OC::$server->getDatabaseConnection(), + \OC::$server->getEventDispatcher(), + \OC::$server->getJobList() +); $config = \OC::$server->getConfig(); $urlGenerator = \OC::$server->getURLGenerator(); @@ -181,6 +185,28 @@ $tmpl->assign('websiteScope', $userData[\OC\Accounts\AccountManager::PROPERTY_WE $tmpl->assign('twitterScope', $userData[\OC\Accounts\AccountManager::PROPERTY_TWITTER]['scope']); $tmpl->assign('addressScope', $userData[\OC\Accounts\AccountManager::PROPERTY_ADDRESS]['scope']); +$tmpl->assign('websiteVerification', $userData[\OC\Accounts\AccountManager::PROPERTY_WEBSITE]['verified']); +$tmpl->assign('twitterVerification', $userData[\OC\Accounts\AccountManager::PROPERTY_TWITTER]['verified']); +$tmpl->assign('emailVerification', $userData[\OC\Accounts\AccountManager::PROPERTY_EMAIL]['verified']); + +$needVerifyMessage = [\OC\Accounts\AccountManager::PROPERTY_EMAIL, \OC\Accounts\AccountManager::PROPERTY_WEBSITE, \OC\Accounts\AccountManager::PROPERTY_TWITTER]; + +foreach ($needVerifyMessage as $property) { + + switch ($userData[$property]['verified']) { + case \OC\Accounts\AccountManager::VERIFIED: + $message = $l->t('Verifying'); + break; + case \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS: + $message = $l->t('Verifying …'); + break; + default: + $message = $l->t('Verify'); + } + + $tmpl->assign($property . 'Message', $message); +} + $tmpl->assign('avatarChangeSupported', OC_User::canUserChangeAvatar(OC_User::getUser())); $tmpl->assign('certs', $certificateManager->listCertificates()); $tmpl->assign('showCertificates', $enableCertImport); @@ -220,8 +246,13 @@ $formsMap = array_map(function($form){ if (preg_match('%(<h2(?P<class>[^>]*)>.*?</h2>)%i', $form, $regs)) { $sectionName = str_replace('<h2'.$regs['class'].'>', '', $regs[0]); $sectionName = str_replace('</h2>', '', $sectionName); - $anchor = strtolower($sectionName); - $anchor = str_replace(' ', '-', $anchor); + if (strpos($regs['class'], 'data-anchor-name') !== false) { + preg_match('%.*data-anchor-name="(?P<anchor>[^"]*)"%i', $regs['class'], $matches); + $anchor = $matches['anchor']; + } else { + $anchor = strtolower($sectionName); + $anchor = str_replace(' ', '-', $anchor); + } return array( 'anchor' => $anchor, diff --git a/settings/routes.php b/settings/routes.php index b76bb213d0c..fb85b11f390 100644 --- a/settings/routes.php +++ b/settings/routes.php @@ -52,6 +52,8 @@ $application->registerRoutes($this, [ ['name' => 'Users#setDisplayName', 'url' => '/settings/users/{username}/displayName', 'verb' => 'POST'], ['name' => 'Users#setEMailAddress', 'url' => '/settings/users/{id}/mailAddress', 'verb' => 'PUT'], ['name' => 'Users#setUserSettings', 'url' => '/settings/users/{username}/settings', 'verb' => 'PUT'], + ['name' => 'Users#getVerificationCode', 'url' => '/settings/users/{account}/verify', 'verb' => 'GET'], + ['name' => 'Users#setEnabled', 'url' => '/settings/users/{id}/setEnabled', 'verb' => 'POST'], ['name' => 'Users#stats', 'url' => '/settings/users/stats', 'verb' => 'GET'], ['name' => 'LogSettings#setLogLevel', 'url' => '/settings/admin/log/level', 'verb' => 'POST'], ['name' => 'LogSettings#getEntries', 'url' => '/settings/admin/log/entries', 'verb' => 'GET'], diff --git a/settings/templates/certificates.php b/settings/templates/certificates.php index 16f8dda31ad..ac0a2293800 100644 --- a/settings/templates/certificates.php +++ b/settings/templates/certificates.php @@ -1,5 +1,5 @@ <div class="section"> - <h2><?php p($l->t('SSL Root Certificates')); ?></h2> + <h2 data-anchor-name="ssl-root-certificate"><?php p($l->t('SSL Root Certificates')); ?></h2> <table id="sslCertificate" class="grid" data-type="<?php p($_['type']); ?>"> <thead> <tr> diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 7854ea31721..3e30d775395 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -99,6 +99,21 @@ <label for="email"><?php p($l->t('Email')); ?></label> <span class="icon-password"/> </h2> + <div class="verify <?php if ($_['email'] === '' || $_['emailScope'] !== 'public') p('hidden'); ?>"> + <img id="verify-email" title="<?php p($_['emailMessage']); ?>" data-status="<?php p($_['emailVerification']) ?>" src=" + <?php + switch($_['emailVerification']) { + case \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS: + p(image_path('core', 'actions/verifying.svg')); + break; + case \OC\Accounts\AccountManager::VERIFIED: + p(image_path('core', 'actions/verified.svg')); + break; + default: + p(image_path('core', 'actions/verify.svg')); + } + ?>"> + </div> <input type="email" name="email" id="email" value="<?php p($_['email']); ?>" <?php if(!$_['displayNameChangeSupported']) { print_unescaped('class="hidden"'); } ?> placeholder="<?php p($l->t('Your email address')); ?>" @@ -151,8 +166,32 @@ <label for="website"><?php p($l->t('Website')); ?></label> <span class="icon-password"/> </h2> + <div class="verify <?php if ($_['website'] === '' || $_['websiteScope'] !== 'public') p('hidden'); ?>"> + <img id="verify-website" title="<?php p($_['websiteMessage']); ?>" data-status="<?php p($_['websiteVerification']) ?>" src=" + <?php + switch($_['websiteVerification']) { + case \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS: + p(image_path('core', 'actions/verifying.svg')); + break; + case \OC\Accounts\AccountManager::VERIFIED: + p(image_path('core', 'actions/verified.svg')); + break; + default: + p(image_path('core', 'actions/verify.svg')); + } + ?>" + <?php if($_['websiteVerification'] === \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS || $_['websiteVerification'] === \OC\Accounts\AccountManager::NOT_VERIFIED) print_unescaped(' class="verify-action"') ?> + > + <div class="verification-dialog popovermenu bubble menu"> + <div class="verification-dialog-content"> + <p class="explainVerification"></p> + <p class="verificationCode"></p> + <p><?php p($l->t('It can take up to 24 hours before the account is displayed as verified.'));?></p> + </div> + </div> + </div> <input type="text" name="website" id="website" value="<?php p($_['website']); ?>" - placeholder="<?php p($l->t('Your website')); ?>" + placeholder="<?php p($l->t('Link https://…')); ?>" autocomplete="on" autocapitalize="none" autocorrect="off" /> <span class="icon-checkmark hidden"/> <input type="hidden" id="websitescope" value="<?php p($_['websiteScope']) ?>"> @@ -164,8 +203,32 @@ <label for="twitter"><?php p($l->t('Twitter')); ?></label> <span class="icon-password"/> </h2> + <div class="verify <?php if ($_['twitter'] === '' || $_['twitterScope'] !== 'public') p('hidden'); ?>"> + <img id="verify-twitter" title="<?php p($_['twitterMessage']); ?>" data-status="<?php p($_['twitterVerification']) ?>" src=" + <?php + switch($_['twitterVerification']) { + case \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS: + p(image_path('core', 'actions/verifying.svg')); + break; + case \OC\Accounts\AccountManager::VERIFIED: + p(image_path('core', 'actions/verified.svg')); + break; + default: + p(image_path('core', 'actions/verify.svg')); + } + ?>" + <?php if($_['twitterVerification'] === \OC\Accounts\AccountManager::VERIFICATION_IN_PROGRESS || $_['twitterVerification'] === \OC\Accounts\AccountManager::NOT_VERIFIED) print_unescaped(' class="verify-action"') ?> + > + <div class="verification-dialog popovermenu bubble menu"> + <div class="verification-dialog-content"> + <p class="explainVerification"></p> + <p class="verificationCode"></p> + <p><?php p($l->t('It can take up to 24 hours before the account is displayed as verified.'));?></p> + </div> + </div> + </div> <input type="text" name="twitter" id="twitter" value="<?php p($_['twitter']); ?>" - placeholder="<?php p($l->t('Your Twitter handle')); ?>" + placeholder="<?php p($l->t('Twitter handle @…')); ?>" autocomplete="on" autocapitalize="none" autocorrect="off" /> <span class="icon-checkmark hidden"/> <input type="hidden" id="twitterscope" value="<?php p($_['twitterScope']) ?>"> @@ -273,7 +336,7 @@ if($_['passwordChangeSupported']) { <div id="sessions" class="section"> <h2><?php p($l->t('Sessions'));?></h2> - <p class="settings-hint hidden-when-empty"><?php p($l->t('Web, desktop and mobile clients currently logged in to your account.'));?></span> + <p class="settings-hint hidden-when-empty"><?php p($l->t('Web, desktop and mobile clients currently logged in to your account.'));?></p> <table class="icon-loading"> <thead class="token-list-header"> <tr> diff --git a/settings/templates/users/part.grouplist.php b/settings/templates/users/part.grouplist.php index beb0f275a33..5dfd7836f6a 100644 --- a/settings/templates/users/part.grouplist.php +++ b/settings/templates/users/part.grouplist.php @@ -37,6 +37,15 @@ </li> <?php endforeach; ?> + <!-- Disabled Users --> + <?php $disabledUsersGroup = $_["disabledUsersGroup"] ?> + <li data-gid="_disabledUsers" data-usercount="<?php if($disabledUsersGroup['usercount'] > 0) { p($disabledUsersGroup['usercount']); } ?>" class="isgroup"> + <a href="#"><span class="groupname"><?php p($l->t('Disabled')); ?></span></a> + <span class="utils"> + <span class="usercount"><?php if($disabledUsersGroup['usercount'] > 0) { p($disabledUsersGroup['usercount']); } ?></span> + </span> + </li> + <!--List of Groups--> <?php foreach($_["groups"] as $group): ?> <li data-gid="<?php p($group['name']) ?>" data-usercount="<?php p($group['usercount']) ?>" class="isgroup"> diff --git a/settings/templates/users/part.userlist.php b/settings/templates/users/part.userlist.php index 7e7e1561e2f..b908109ad2d 100644 --- a/settings/templates/users/part.userlist.php +++ b/settings/templates/users/part.userlist.php @@ -14,7 +14,7 @@ <th class="storageLocation" scope="col"><?php p($l->t('Storage location')); ?></th> <th class="userBackend" scope="col"><?php p($l->t('User backend')); ?></th> <th class="lastLogin" scope="col"><?php p($l->t('Last login')); ?></th> - <th id="headerRemove"> </th> + <th class="userActions"></th> </tr> </thead> <tbody> @@ -63,7 +63,21 @@ <td class="storageLocation"></td> <td class="userBackend"></td> <td class="lastLogin"></td> - <td class="remove"></td> + <td class="userActions"><span></span> + <div class="popovermenu bubble open menu"> + <ul class="userActionsMenu"> + <li> + <a href="#" class="menuitem action-togglestate permanent" data-action="togglestate"></a> + </li> + <li> + <a href="#" class="menuitem action-remove permanent" data-action="remove"> + <span class="icon icon-delete"></span> + <span><?php p($l->t('Delete')); ?></span> + </a> + </li> + </ul> + </div> + </td> </tr> </tbody> </table> diff --git a/settings/users.php b/settings/users.php index 1986592af75..4d214bf9502 100644 --- a/settings/users.php +++ b/settings/users.php @@ -45,6 +45,7 @@ $groupManager = \OC::$server->getGroupManager(); // Set the sort option: SORT_USERCOUNT or SORT_GROUPNAME $sortGroupsBy = \OC\Group\MetaData::SORT_USERCOUNT; +$isLDAPUsed = false; if (\OC_App::isEnabled('user_ldap')) { $isLDAPUsed = $groupManager->isBackendUsed('\OCA\User_LDAP\Group_LDAP') @@ -59,12 +60,15 @@ $config = \OC::$server->getConfig(); $isAdmin = OC_User::isAdminUser(OC_User::getUser()); +$isDisabled = !OC_User::isEnabled(OC_User::getUser()); + $groupsInfo = new \OC\Group\MetaData( OC_User::getUser(), $isAdmin, $groupManager, \OC::$server->getUserSession() ); + $groupsInfo->setSorting($sortGroupsBy); list($adminGroup, $groups) = $groupsInfo->get(); @@ -93,6 +97,13 @@ if($isAdmin) { $subAdmins = false; } +$disabledUsers = $isLDAPUsed ? 0 : $userManager->countDisabledUsers(); +$disabledUsersGroup = [ + 'id' => '_disabledUsers', + 'name' => '_disabledUsers', + 'usercount' => $disabledUsers +]; + // load preset quotas $quotaPreset=$config->getAppValue('files', 'quota_preset', '1 GB, 5 GB, 10 GB'); $quotaPreset=explode(',', $quotaPreset); @@ -111,6 +122,7 @@ $tmpl = new OC_Template("settings", "users/main", "user"); $tmpl->assign('groups', $groups); $tmpl->assign('sortGroups', $sortGroupsBy); $tmpl->assign('adminGroup', $adminGroup); +$tmpl->assign('disabledUsersGroup', $disabledUsersGroup); $tmpl->assign('isAdmin', (int)$isAdmin); $tmpl->assign('subadmins', $subAdmins); $tmpl->assign('numofgroups', count($groups) + count($adminGroup)); diff --git a/tests/Settings/Controller/UsersControllerTest.php b/tests/Settings/Controller/UsersControllerTest.php index d659d812b0d..5905023e960 100644 --- a/tests/Settings/Controller/UsersControllerTest.php +++ b/tests/Settings/Controller/UsersControllerTest.php @@ -18,6 +18,7 @@ use OCP\App\IAppManager; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; use OCP\IAvatar; use OCP\IAvatarManager; use OCP\IConfig; @@ -74,6 +75,10 @@ class UsersControllerTest extends \Test\TestCase { private $newUserMailHelper; /** @var ICrypto | \PHPUnit_Framework_MockObject_MockObject */ private $crypto; + /** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */ + private $jobList; + /** @var \OC\Security\IdentityProof\Manager |\PHPUnit_Framework_MockObject_MockObject */ + private $securityManager; protected function setUp() { parent::setUp(); @@ -92,6 +97,10 @@ class UsersControllerTest extends \Test\TestCase { $this->timeFactory = $this->createMock(ITimeFactory::class); $this->crypto = $this->createMock(ICrypto::class); $this->newUserMailHelper = $this->createMock(NewUserMailHelper::class); + $this->timeFactory = $this->createMock(ITimeFactory::class); + $this->crypto = $this->createMock(ICrypto::class); + $this->securityManager = $this->getMockBuilder(\OC\Security\IdentityProof\Manager::class)->disableOriginalConstructor()->getMock(); + $this->jobList = $this->createMock(IJobList::class); $this->l = $this->createMock(IL10N::class); $this->l->method('t') ->will($this->returnCallback(function ($text, $parameters = []) { @@ -136,7 +145,12 @@ class UsersControllerTest extends \Test\TestCase { $this->avatarManager, $this->accountManager, $this->secureRandom, - $this->newUserMailHelper + $this->newUserMailHelper, + $this->timeFactory, + $this->crypto, + $this->securityManager, + $this->jobList + ); } else { return $this->getMockBuilder(UsersController::class) @@ -157,7 +171,11 @@ class UsersControllerTest extends \Test\TestCase { $this->avatarManager, $this->accountManager, $this->secureRandom, - $this->newUserMailHelper + $this->newUserMailHelper, + $this->timeFactory, + $this->crypto, + $this->securityManager, + $this->jobList ] )->setMethods($mockedMethods)->getMock(); } @@ -193,6 +211,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('OC_User_Database')); + $foo->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $admin = $this->createMock(User::class); $admin ->expects($this->exactly(2)) @@ -222,6 +243,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $admin->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $bar = $this->createMock(User::class); $bar ->expects($this->exactly(2)) @@ -249,6 +273,15 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $bar->expects($this->at(0)) + ->method('isEnabled') + ->willReturn(true); + $bar->expects($this->at(1)) + ->method('isEnabled') + ->willReturn(true); + $bar->expects($this->at(2)) + ->method('isEnabled') + ->willReturn(false); $this->groupManager ->expects($this->once()) @@ -312,6 +345,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'foo@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), 1 => array( 'name' => 'admin', @@ -325,6 +359,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => false, + 'isEnabled' => true, ), 2 => array( 'name' => 'bar', @@ -338,6 +373,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => false, ), ) ); @@ -381,6 +417,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('OC_User_Database')); + $foo->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $admin = $this->createMock(User::class); $admin ->expects($this->exactly(2)) @@ -410,6 +449,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $admin->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $bar = $this->createMock(User::class); $bar ->expects($this->exactly(2)) @@ -437,6 +479,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $bar->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $this->groupManager ->expects($this->at(2)) @@ -514,6 +559,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ], 1=> [ 'name' => 'foo', @@ -527,6 +573,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'foo@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ], 2 => [ 'name' => 'admin', @@ -540,6 +587,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => false, + 'isEnabled' => true, ], ] ); @@ -582,6 +630,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('OC_User_Database')); + $foo->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $admin = $this->createMock(User::class); $admin ->expects($this->exactly(2)) @@ -611,6 +662,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $admin->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $bar = $this->createMock(User::class); $bar ->expects($this->exactly(2)) @@ -638,6 +692,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn(Dummy::class); + $bar->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $this->userManager ->expects($this->once()) @@ -674,6 +731,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'foo@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), 1 => array( 'name' => 'admin', @@ -687,6 +745,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'admin@bar.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => false, + 'isEnabled' => true, ), 2 => array( 'name' => 'bar', @@ -700,6 +759,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'bar@dummy.com', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), ) ); @@ -737,6 +797,10 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('OC_User_Database')); + $user->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); + $this->userManager ->expects($this->once()) ->method('getBackends') @@ -775,6 +839,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => null, 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ) ) ); @@ -814,6 +879,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('bar')); + $user->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $this->userManager ->expects($this->once()) @@ -846,6 +914,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => null, 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), Http::STATUS_CREATED ); @@ -870,6 +939,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue('bar')); + $user->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $existingGroup = $this->getMockBuilder('\OCP\IGroup') ->disableOriginalConstructor()->getMock(); $existingGroup @@ -928,6 +1000,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => null, 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), Http::STATUS_CREATED ); @@ -957,6 +1030,9 @@ class UsersControllerTest extends \Test\TestCase { ->method('getBackendClassName') ->will($this->returnValue('bar')); $subGroup1 = $this->createMock(IGroup::class); + $newUser->expects($this->any()) + ->method('isEnabled') + ->willReturn(true); $subGroup1 ->expects($this->any()) ->method('getGID') @@ -1016,6 +1092,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => null, 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ), Http::STATUS_CREATED ); @@ -1445,7 +1522,8 @@ class UsersControllerTest extends \Test\TestCase { } private function mockUser($userId = 'foo', $displayName = 'M. Foo', - $lastLogin = 500, $home = '/home/foo', $backend = 'OC_User_Database') { + $lastLogin = 500, $home = '/home/foo', + $backend = 'OC_User_Database', $enabled = true) { $user = $this->createMock(User::class); $user ->expects($this->any()) @@ -1465,6 +1543,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->will($this->returnValue($backend)); + $user->expects($this->any()) + ->method('isEnabled') + ->willReturn($enabled); $result = [ 'name' => $userId, @@ -1478,6 +1559,7 @@ class UsersControllerTest extends \Test\TestCase { 'email' => null, 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => $enabled, ]; return [$user, $result]; @@ -2141,6 +2223,11 @@ class UsersControllerTest extends \Test\TestCase { /** * @dataProvider setEmailAddressData * + * @param string $mailAddress + * @param bool $isValid + * @param bool $expectsUpdate + * @param bool $canChangeDisplayName + * @param int $responseCode */ public function testSetEMailAddress($mailAddress, $isValid, $expectsUpdate, $canChangeDisplayName, $responseCode) { $user = $this->createMock(User::class); @@ -2212,6 +2299,9 @@ class UsersControllerTest extends \Test\TestCase { ->expects($this->once()) ->method('getBackendClassName') ->willReturn('bar'); + $user + ->method('isEnabled') + ->willReturn(true); $this->userManager ->expects($this->once()) @@ -2261,10 +2351,519 @@ class UsersControllerTest extends \Test\TestCase { 'email' => 'abc@example.org', 'isRestoreDisabled' => false, 'isAvatarAvailable' => true, + 'isEnabled' => true, ], Http::STATUS_CREATED ); $response = $controller->create('foo', '', array(), 'abc@example.org'); $this->assertEquals($expectedResponse, $response); } + + /** + * @param string $account + * @param string $type + * @param array $dataBefore + * @param array $expectedData + * + * @dataProvider dataTestGetVerificationCode + */ + public function testGetVerificationCode($account, $type, $dataBefore, $expectedData, $onlyVerificationCode) { + + $message = 'Use my Federated Cloud ID to share with me: user@nextcloud.com'; + $signature = 'theSignature'; + + $code = $message . ' ' . $signature; + if($type === AccountManager::PROPERTY_TWITTER) { + $code = $message . ' ' . md5($signature); + } + + $controller = $this->getController(false, ['signMessage', 'getCurrentTime']); + + $user = $this->createMock(IUser::class); + $this->userSession->expects($this->once())->method('getUser')->willReturn($user); + $this->accountManager->expects($this->once())->method('getUser')->with($user)->willReturn($dataBefore); + $user->expects($this->any())->method('getCloudId')->willReturn('user@nextcloud.com'); + $user->expects($this->any())->method('getUID')->willReturn('uid'); + $controller->expects($this->once())->method('signMessage')->with($user, $message)->willReturn($signature); + $controller->expects($this->any())->method('getCurrentTime')->willReturn(1234567); + + if ($onlyVerificationCode === false) { + $this->accountManager->expects($this->once())->method('updateUser')->with($user, $expectedData); + $this->jobList->expects($this->once())->method('add') + ->with('OC\Settings\BackgroundJobs\VerifyUserData', + [ + 'verificationCode' => $code, + 'data' => $dataBefore[$type]['value'], + 'type' => $type, + 'uid' => 'uid', + 'try' => 0, + 'lastRun' => 1234567 + ]); + } + + $result = $controller->getVerificationCode($account, $onlyVerificationCode); + + $data = $result->getData(); + $this->assertSame(Http::STATUS_OK, $result->getStatus()); + $this->assertSame($code, $data['code']); + } + + public function dataTestGetVerificationCode() { + + $accountDataBefore = [ + AccountManager::PROPERTY_WEBSITE => ['value' => 'https://nextcloud.com', 'verified' => AccountManager::NOT_VERIFIED], + AccountManager::PROPERTY_TWITTER => ['value' => '@nextclouders', 'verified' => AccountManager::NOT_VERIFIED, 'signature' => 'theSignature'], + ]; + + $accountDataAfterWebsite = [ + AccountManager::PROPERTY_WEBSITE => ['value' => 'https://nextcloud.com', 'verified' => AccountManager::VERIFICATION_IN_PROGRESS, 'signature' => 'theSignature'], + AccountManager::PROPERTY_TWITTER => ['value' => '@nextclouders', 'verified' => AccountManager::NOT_VERIFIED, 'signature' => 'theSignature'], + ]; + + $accountDataAfterTwitter = [ + AccountManager::PROPERTY_WEBSITE => ['value' => 'https://nextcloud.com', 'verified' => AccountManager::NOT_VERIFIED], + AccountManager::PROPERTY_TWITTER => ['value' => '@nextclouders', 'verified' => AccountManager::VERIFICATION_IN_PROGRESS, 'signature' => 'theSignature'], + ]; + + return [ + ['verify-twitter', AccountManager::PROPERTY_TWITTER, $accountDataBefore, $accountDataAfterTwitter, false], + ['verify-website', AccountManager::PROPERTY_WEBSITE, $accountDataBefore, $accountDataAfterWebsite, false], + ['verify-twitter', AccountManager::PROPERTY_TWITTER, $accountDataBefore, $accountDataAfterTwitter, true], + ['verify-website', AccountManager::PROPERTY_WEBSITE, $accountDataBefore, $accountDataAfterWebsite, true], + ]; + } + + /** + * test get verification code in case no valid user was given + */ + public function testGetVerificationCodeInvalidUser() { + + $controller = $this->getController(); + $this->userSession->expects($this->once())->method('getUser')->willReturn(null); + $result = $controller->getVerificationCode('account', false); + + $this->assertSame(Http::STATUS_BAD_REQUEST, $result->getStatus()); + } + + public function testDisableUserFailsDueSameUser() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('abc')); + $this->userSession + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while disabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(true)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testDisableUserFailsDueNoAdminAndNoSubadmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(2)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->never()) + ->method('setEnabled'); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $subadmin = $this->createMock('\OC\SubAdmin'); + $subadmin->expects($this->once()) + ->method('isUserAccessible') + ->will($this->returnValue(false)); + $this->groupManager + ->expects($this->once()) + ->method('getSubAdmin') + ->willReturn($subadmin); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Authentication error', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(false)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testDisableUserFailsDueNoUser() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn(null); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while disabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(true)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testDisableUserFailsDueNoUserForSubAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn(null); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while disabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(false)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testDisableUserSuccessForAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->once()) + ->method('setEnabled') + ->with(false); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => 'abc', + 'enabled' => 0, + ], + ] + ); + $response = $this->getController(true)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testDisableUserSuccessForSubAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(2)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->once()) + ->method('setEnabled'); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $subadmin = $this->createMock('\OC\SubAdmin'); + $subadmin->expects($this->once()) + ->method('isUserAccessible') + ->will($this->returnValue(true)); + $this->groupManager + ->expects($this->once()) + ->method('getSubAdmin') + ->willReturn($subadmin); + + $expectedResponse = new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => 'abc', + 'enabled' => 0, + ], + ] + ); + $response = $this->getController(false)->setEnabled('abc', false); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserFailsDueSameUser() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('abc')); + $this->userSession + ->expects($this->once()) + ->method('getUser') + ->will($this->returnValue($user)); + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while enabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(true)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserFailsDueNoAdminAndNoSubadmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(2)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->never()) + ->method('setEnabled'); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $subadmin = $this->createMock('\OC\SubAdmin'); + $subadmin->expects($this->once()) + ->method('isUserAccessible') + ->will($this->returnValue(false)); + $this->groupManager + ->expects($this->once()) + ->method('getSubAdmin') + ->willReturn($subadmin); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Authentication error', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(false)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserFailsDueNoUser() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn(null); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while enabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(true)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserFailsDueNoUserForSubAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn(null); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'error', + 'data' => [ + 'message' => 'Error while enabling user.', + ], + ], + Http::STATUS_FORBIDDEN + ); + $response = $this->getController(false)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserSuccessForAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(1)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->once()) + ->method('setEnabled'); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $this->groupManager + ->expects($this->never()) + ->method('getSubAdmin'); + + $expectedResponse = new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => 'abc', + 'enabled' => 1, + ], + ] + ); + $response = $this->getController(true)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } + + public function testEnableUserSuccessForSubAdmin() { + $user = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user->expects($this->once()) + ->method('getUID') + ->will($this->returnValue('def')); + $this->userSession + ->expects($this->exactly(2)) + ->method('getUser') + ->will($this->returnValue($user)); + $user2 = $this->getMockBuilder('\OC\User\User') + ->disableOriginalConstructor()->getMock(); + $user2->expects($this->once()) + ->method('setEnabled') + ->with(true); + $this->userManager + ->expects($this->once()) + ->method('get') + ->with('abc') + ->willReturn($user2); + + $subadmin = $this->createMock('\OC\SubAdmin'); + $subadmin->expects($this->once()) + ->method('isUserAccessible') + ->will($this->returnValue(true)); + $this->groupManager + ->expects($this->once()) + ->method('getSubAdmin') + ->willReturn($subadmin); + + $expectedResponse = new DataResponse( + [ + 'status' => 'success', + 'data' => [ + 'username' => 'abc', + 'enabled' => 1, + ], + ] + ); + $response = $this->getController(false)->setEnabled('abc', true); + $this->assertEquals($expectedResponse, $response); + } } diff --git a/tests/lib/Accounts/AccountsManagerTest.php b/tests/lib/Accounts/AccountsManagerTest.php index e6c1552fdc0..6cefebdea86 100644 --- a/tests/lib/Accounts/AccountsManagerTest.php +++ b/tests/lib/Accounts/AccountsManagerTest.php @@ -24,6 +24,7 @@ namespace Test\Accounts; use OC\Accounts\AccountManager; +use OCP\BackgroundJob\IJobList; use OCP\IUser; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -43,6 +44,9 @@ class AccountsManagerTest extends TestCase { /** @var EventDispatcherInterface | \PHPUnit_Framework_MockObject_MockObject */ private $eventDispatcher; + /** @var IJobList | \PHPUnit_Framework_MockObject_MockObject */ + private $jobList; + /** @var string accounts table name */ private $table = 'accounts'; @@ -51,6 +55,7 @@ class AccountsManagerTest extends TestCase { $this->eventDispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface') ->disableOriginalConstructor()->getMock(); $this->connection = \OC::$server->getDatabaseConnection(); + $this->jobList = $this->getMockBuilder(IJobList::class)->getMock(); } public function tearDown() { @@ -67,7 +72,7 @@ class AccountsManagerTest extends TestCase { */ public function getInstance($mockedMethods = null) { return $this->getMockBuilder('OC\Accounts\AccountManager') - ->setConstructorArgs([$this->connection, $this->eventDispatcher]) + ->setConstructorArgs([$this->connection, $this->eventDispatcher, $this->jobList]) ->setMethods($mockedMethods) ->getMock(); @@ -75,15 +80,24 @@ class AccountsManagerTest extends TestCase { /** * @dataProvider dataTrueFalse + * + * @param array $newData + * @param array $oldData + * @param bool $insertNew + * @param bool $updateExisting */ - public function testUpdateUser($newData, $oldData, $insertNew, $updateExisitng) { - $accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser']); + public function testUpdateUser($newData, $oldData, $insertNew, $updateExisting) { + $accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser', 'updateVerifyStatus', 'checkEmailVerification']); /** @var IUser $user */ $user = $this->createMock(IUser::class); $accountManager->expects($this->once())->method('getUser')->with($user)->willReturn($oldData); - if ($updateExisitng) { + if ($updateExisting) { + $accountManager->expects($this->once())->method('checkEmailVerification') + ->with($oldData, $newData, $user)->willReturn($newData); + $accountManager->expects($this->once())->method('updateVerifyStatus') + ->with($oldData, $newData)->willReturn($newData); $accountManager->expects($this->once())->method('updateExistingUser') ->with($user, $newData); $accountManager->expects($this->never())->method('insertNewUser'); @@ -94,8 +108,10 @@ class AccountsManagerTest extends TestCase { $accountManager->expects($this->never())->method('updateExistingUser'); } - if (!$insertNew && !$updateExisitng) { + if (!$insertNew && !$updateExisting) { $accountManager->expects($this->never())->method('updateExistingUser'); + $accountManager->expects($this->never())->method('checkEmailVerification'); + $accountManager->expects($this->never())->method('updateVerifyStatus'); $accountManager->expects($this->never())->method('insertNewUser'); $this->eventDispatcher->expects($this->never())->method('dispatch'); } else { @@ -133,13 +149,22 @@ class AccountsManagerTest extends TestCase { * @param book $userAlreadyExists */ public function testGetUser($setUser, $setData, $askUser, $expectedData, $userAlreadyExists) { - $accountManager = $this->getInstance(['buildDefaultUserRecord', 'insertNewUser']); + $accountManager = $this->getInstance(['buildDefaultUserRecord', 'insertNewUser', 'addMissingDefaultValues']); if (!$userAlreadyExists) { $accountManager->expects($this->once())->method('buildDefaultUserRecord') ->with($askUser)->willReturn($expectedData); $accountManager->expects($this->once())->method('insertNewUser') ->with($askUser, $expectedData); } + + if(empty($expectedData)) { + $accountManager->expects($this->never())->method('addMissingDefaultValues'); + + } else { + $accountManager->expects($this->once())->method('addMissingDefaultValues')->with($expectedData) + ->willReturn($expectedData); + } + $this->addDummyValuesToTable($setUser, $setData); $this->assertEquals($expectedData, $accountManager->getUser($askUser) @@ -184,6 +209,25 @@ class AccountsManagerTest extends TestCase { $this->assertEquals($data, $dataFromDb); } + public function testAddMissingDefaultValues() { + + $accountManager = $this->getInstance(); + + $input = [ + 'key1' => ['value' => 'value1', 'verified' => '0'], + 'key2' => ['value' => 'value1'], + ]; + + $expected = [ + 'key1' => ['value' => 'value1', 'verified' => '0'], + 'key2' => ['value' => 'value1', 'verified' => '0'], + ]; + + $result = $this->invokePrivate($accountManager, 'addMissingDefaultValues', [$input]); + + $this->assertSame($expected, $result); + } + private function addDummyValuesToTable($uid, $data) { $query = $this->connection->getQueryBuilder(); diff --git a/tests/lib/User/ManagerTest.php b/tests/lib/User/ManagerTest.php index 671b2ac57c1..cf725aae671 100644 --- a/tests/lib/User/ManagerTest.php +++ b/tests/lib/User/ManagerTest.php @@ -291,10 +291,18 @@ class ManagerTest extends TestCase { * @dataProvider dataCreateUserInvalid */ public function testCreateUserInvalid($uid, $password, $exception) { + /** @var \Test\Util\User\Dummy|\PHPUnit_Framework_MockObject_MockObject $backend */ + $backend = $this->createMock(\Test\Util\User\Dummy::class); + $backend->expects($this->once()) + ->method('implementsActions') + ->with(\OC\User\Backend::CREATE_USER) + ->willReturn(true); - $this->setExpectedException(\Exception::class, $exception); $manager = new \OC\User\Manager($this->config); + $manager->registerBackend($backend); + + $this->setExpectedException(\InvalidArgumentException::class, $exception); $manager->createUser($uid, $password); } @@ -362,10 +370,8 @@ class ManagerTest extends TestCase { $backend->expects($this->never()) ->method('createUser'); - $backend->expects($this->once()) - ->method('userExists') - ->with($this->equalTo('foo')) - ->will($this->returnValue(false)); + $backend->expects($this->never()) + ->method('userExists'); $manager = new \OC\User\Manager($this->config); $manager->registerBackend($backend); @@ -504,6 +510,31 @@ class ManagerTest extends TestCase { $this->assertEquals(7 + 16, $users); } + public function testCountUsersOnlyDisabled() { + $manager = \OC::$server->getUserManager(); + // count other users in the db before adding our own + $countBefore = $manager->countDisabledUsers(); + + //Add test users + $user1 = $manager->createUser('testdisabledcount1', 'testdisabledcount1'); + + $user2 = $manager->createUser('testdisabledcount2', 'testdisabledcount2'); + $user2->setEnabled(false); + + $user3 = $manager->createUser('testdisabledcount3', 'testdisabledcount3'); + + $user4 = $manager->createUser('testdisabledcount4', 'testdisabledcount4'); + $user4->setEnabled(false); + + $this->assertEquals($countBefore + 2, $manager->countDisabledUsers()); + + //cleanup + $user1->delete(); + $user2->delete(); + $user3->delete(); + $user4->delete(); + } + public function testCountUsersOnlySeen() { $manager = \OC::$server->getUserManager(); // count other users in the db before adding our own diff --git a/version.php b/version.php index 011c693d7b3..1e44a19368e 100644 --- a/version.php +++ b/version.php @@ -37,7 +37,6 @@ $OC_VersionCanBeUpgradedFrom = [ '12.0' => true, ], 'owncloud' => [ - '10.0' => true, ], ]; |