diff options
Diffstat (limited to 'apps')
211 files changed, 3955 insertions, 917 deletions
diff --git a/apps/dav/l10n/es_MX.js b/apps/dav/l10n/es_MX.js index 73868dfaa84..d8753d65d34 100644 --- a/apps/dav/l10n/es_MX.js +++ b/apps/dav/l10n/es_MX.js @@ -9,16 +9,16 @@ OC.L10N.register( "You deleted calendar {calendar}" : "Usted borró el calendario {calendar}", "{actor} updated calendar {calendar}" : "{actor} actualizó el calendario {calendar}", "You updated calendar {calendar}" : "Usted actualizó el calendario {calendar}", - "{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted", - "You shared calendar {calendar} with {user}" : "Usted compartió el calendarió {calendar} con {user}", + "{actor} shared calendar {calendar} with you" : "{actor} ha compartido el calendario {calendar} con usted", + "You shared calendar {calendar} with {user}" : "Usted ha compartido el calendario {calendar} con {user}", "{actor} shared calendar {calendar} with {user}" : "{actor} compartió el calendario {calendar} con {user}", - "{actor} unshared calendar {calendar} from you" : "{actor} dejó de compartir el calendario {calendar} con usted", - "You unshared calendar {calendar} from {user}" : "Usted dejó de compartir el calendario {calendar} con {user}", + "{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} con usted", + "You unshared calendar {calendar} from {user}" : "Usted ha dejado de compartir el calendario {calendar} con {user}", "{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}", "{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo", - "You shared calendar {calendar} with group {group}" : "Usted compartió el calendario {calendar} con el grupo {group}", - "{actor} shared calendar {calendar} with group {group}" : "{actor} compatió el calendario {calendar} con el grupo {group}", - "You unshared calendar {calendar} from group {group}" : "Usted dejó de compartir el calendario {calendar} con el grupo{group}", + "You shared calendar {calendar} with group {group}" : "Usted ha compartido el calendario {calendar} con el grupo {group}", + "{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}", + "You unshared calendar {calendar} from group {group}" : "Usted ha dejado de compartir el calendario {calendar} con el grupo {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} dejó de compartir el calendrio {calendar} con el grupo {group}", "{actor} created event {event} in calendar {calendar}" : "{actor} creó el evento {event} en el calendario {calendar}", "You created event {event} in calendar {calendar}" : "Usted creó el evento {event} en el calendario {calendar}", diff --git a/apps/dav/l10n/es_MX.json b/apps/dav/l10n/es_MX.json index 650b58eab3c..1eb8d35975c 100644 --- a/apps/dav/l10n/es_MX.json +++ b/apps/dav/l10n/es_MX.json @@ -7,16 +7,16 @@ "You deleted calendar {calendar}" : "Usted borró el calendario {calendar}", "{actor} updated calendar {calendar}" : "{actor} actualizó el calendario {calendar}", "You updated calendar {calendar}" : "Usted actualizó el calendario {calendar}", - "{actor} shared calendar {calendar} with you" : "{actor} compartió el calendario {calendar} con usted", - "You shared calendar {calendar} with {user}" : "Usted compartió el calendarió {calendar} con {user}", + "{actor} shared calendar {calendar} with you" : "{actor} ha compartido el calendario {calendar} con usted", + "You shared calendar {calendar} with {user}" : "Usted ha compartido el calendario {calendar} con {user}", "{actor} shared calendar {calendar} with {user}" : "{actor} compartió el calendario {calendar} con {user}", - "{actor} unshared calendar {calendar} from you" : "{actor} dejó de compartir el calendario {calendar} con usted", - "You unshared calendar {calendar} from {user}" : "Usted dejó de compartir el calendario {calendar} con {user}", + "{actor} unshared calendar {calendar} from you" : "{actor} ha dejado de compartir el calendario {calendar} con usted", + "You unshared calendar {calendar} from {user}" : "Usted ha dejado de compartir el calendario {calendar} con {user}", "{actor} unshared calendar {calendar} from {user}" : "{actor} dejó de compartir el calendario {calendar} con {user}", "{actor} unshared calendar {calendar} from themselves" : "{actor} dejó de compartir {el calendario calendar} con él mismo", - "You shared calendar {calendar} with group {group}" : "Usted compartió el calendario {calendar} con el grupo {group}", - "{actor} shared calendar {calendar} with group {group}" : "{actor} compatió el calendario {calendar} con el grupo {group}", - "You unshared calendar {calendar} from group {group}" : "Usted dejó de compartir el calendario {calendar} con el grupo{group}", + "You shared calendar {calendar} with group {group}" : "Usted ha compartido el calendario {calendar} con el grupo {group}", + "{actor} shared calendar {calendar} with group {group}" : "{actor} compartió el calendario {calendar} con el grupo {group}", + "You unshared calendar {calendar} from group {group}" : "Usted ha dejado de compartir el calendario {calendar} con el grupo {group}", "{actor} unshared calendar {calendar} from group {group}" : "{actor} dejó de compartir el calendrio {calendar} con el grupo {group}", "{actor} created event {event} in calendar {calendar}" : "{actor} creó el evento {event} en el calendario {calendar}", "You created event {event} in calendar {calendar}" : "Usted creó el evento {event} en el calendario {calendar}", diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 7976c1490ff..631593974e7 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -621,7 +621,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription } $transp = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp'; if (isset($properties[$transp])) { - $values['transparent'] = $properties[$transp]->getValue()==='transparent'; + $values['transparent'] = (int) ($properties[$transp]->getValue() === 'transparent'); } foreach($this->propertyMap as $xmlName=>$dbName) { @@ -674,7 +674,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription switch ($propertyName) { case '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp' : $fieldName = 'transparent'; - $newValues[$fieldName] = $propertyValue->getValue() === 'transparent'; + $newValues[$fieldName] = (int) ($propertyValue->getValue() === 'transparent'); break; default : $fieldName = $this->propertyMap[$propertyName]; diff --git a/apps/dav/lib/CalDAV/Calendar.php b/apps/dav/lib/CalDAV/Calendar.php index ef8e21be83a..d1eff1aeaa3 100644 --- a/apps/dav/lib/CalDAV/Calendar.php +++ b/apps/dav/lib/CalDAV/Calendar.php @@ -175,12 +175,11 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable { } function propPatch(PropPatch $propPatch) { - $mutations = $propPatch->getMutations(); - // If this is a shared calendar, the user can only change the enabled property, to hide it. - if ($this->isShared() && (sizeof($mutations) !== 1 || !isset($mutations['{http://owncloud.org/ns}calendar-enabled']))) { - throw new Forbidden(); + // parent::propPatch will only update calendars table + // if calendar is shared, changes have to be made to the properties table + if (!$this->isShared()) { + parent::propPatch($propPatch); } - parent::propPatch($propPatch); } function getChild($name) { @@ -283,7 +282,7 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IShareable { return isset($this->calendarInfo['{http://owncloud.org/ns}public']); } - private function isShared() { + protected function isShared() { if (!isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) { return false; } diff --git a/apps/dav/lib/CalDAV/CalendarObject.php b/apps/dav/lib/CalDAV/CalendarObject.php index c5dc50650af..86aa2c98e8d 100644 --- a/apps/dav/lib/CalDAV/CalendarObject.php +++ b/apps/dav/lib/CalDAV/CalendarObject.php @@ -43,7 +43,7 @@ class CalendarObject extends \Sabre\CalDAV\CalendarObject { return $data; } - private function isShared() { + protected function isShared() { if (!isset($this->calendarInfo['{http://owncloud.org/ns}owner-principal'])) { return false; } diff --git a/apps/dav/lib/CalDAV/PublicCalendar.php b/apps/dav/lib/CalDAV/PublicCalendar.php new file mode 100644 index 00000000000..63cbdbfa118 --- /dev/null +++ b/apps/dav/lib/CalDAV/PublicCalendar.php @@ -0,0 +1,87 @@ +<?php +/** + * @copyright Copyright (c) 2017, Georg Ehrke + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV; + +use Sabre\DAV\Exception\NotFound; + +class PublicCalendar extends Calendar { + + /** + * @param string $name + * @throws NotFound + * @return PublicCalendarObject + */ + public function getChild($name) { + $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'], $name); + + if (!$obj) { + throw new NotFound('Calendar object not found'); + } + if ($obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) { + throw new NotFound('Calendar object not found'); + } + $obj['acl'] = $this->getChildACL(); + + return new PublicCalendarObject($this->caldavBackend, $this->calendarInfo, $obj); + } + + /** + * @return PublicCalendarObject[] + */ + public function getChildren() { + $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); + $children = []; + foreach ($objs as $obj) { + if ($obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) { + continue; + } + $obj['acl'] = $this->getChildACL(); + $children[] = new PublicCalendarObject($this->caldavBackend, $this->calendarInfo, $obj); + } + return $children; + } + + /** + * @param string[] $paths + * @return PublicCalendarObject[] + */ + public function getMultipleChildren(array $paths) { + $objs = $this->caldavBackend->getMultipleCalendarObjects($this->calendarInfo['id'], $paths); + $children = []; + foreach ($objs as $obj) { + if ($obj['classification'] === CalDavBackend::CLASSIFICATION_PRIVATE) { + continue; + } + $obj['acl'] = $this->getChildACL(); + $children[] = new PublicCalendarObject($this->caldavBackend, $this->calendarInfo, $obj); + } + return $children; + } + + /** + * public calendars are always shared + * @return bool + */ + protected function isShared() { + return true; + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/PublicCalendarObject.php b/apps/dav/lib/CalDAV/PublicCalendarObject.php new file mode 100644 index 00000000000..a4e33ca5ce1 --- /dev/null +++ b/apps/dav/lib/CalDAV/PublicCalendarObject.php @@ -0,0 +1,33 @@ +<?php +/** + * @copyright Copyright (c) 2017, Georg Ehrke + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace OCA\DAV\CalDAV; + +class PublicCalendarObject extends CalendarObject { + + /** + * public calendars are always shared + * @return bool + */ + protected function isShared() { + return true; + } +}
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/PublicCalendarRoot.php b/apps/dav/lib/CalDAV/PublicCalendarRoot.php index 6d74b97f96e..20654549884 100644 --- a/apps/dav/lib/CalDAV/PublicCalendarRoot.php +++ b/apps/dav/lib/CalDAV/PublicCalendarRoot.php @@ -21,7 +21,6 @@ namespace OCA\DAV\CalDAV; use Sabre\DAV\Collection; -use Sabre\DAV\Exception\NotFound; class PublicCalendarRoot extends Collection { @@ -48,20 +47,13 @@ class PublicCalendarRoot extends Collection { */ function getChild($name) { $calendar = $this->caldavBackend->getPublicCalendar($name); - return new Calendar($this->caldavBackend, $calendar, $this->l10n); + return new PublicCalendar($this->caldavBackend, $calendar, $this->l10n); } /** * @inheritdoc */ function getChildren() { - $calendars = $this->caldavBackend->getPublicCalendars(); - $children = []; - foreach ($calendars as $calendar) { - // TODO: maybe implement a new class PublicCalendar ??? - $children[] = new Calendar($this->caldavBackend, $calendar, $this->l10n); - } - - return $children; + return []; } } diff --git a/apps/dav/lib/Files/CustomPropertiesBackend.php b/apps/dav/lib/DAV/CustomPropertiesBackend.php index 43c02e7d6eb..ee0d0407015 100644 --- a/apps/dav/lib/Files/CustomPropertiesBackend.php +++ b/apps/dav/lib/DAV/CustomPropertiesBackend.php @@ -1,9 +1,11 @@ <?php /** * @copyright Copyright (c) 2016, ownCloud, Inc. + * @copyright Copyright (c) 2017, Georg Ehrke <oc.list@georgehrke.com> * * @author Robin Appelman <robin@icewind.nl> * @author Thomas Müller <thomas.mueller@tmit.eu> + * @author Georg Ehrke <oc.list@georgehrke.com> * * @license AGPL-3.0 * @@ -21,7 +23,7 @@ * */ -namespace OCA\DAV\Files; +namespace OCA\DAV\DAV; use OCP\IDBConnection; use OCP\IUser; @@ -102,6 +104,26 @@ class CustomPropertiesBackend implements BackendInterface { $this->ignoredProperties ); + // substr of calendars/ => path is inside the CalDAV component + // two '/' => this a calendar (no calendar-home nor calendar object) + if (substr($path, 0, 10) === 'calendars/' && substr_count($path, '/') === 2) { + $allRequestedProps = $propFind->getRequestedProperties(); + $customPropertiesForShares = [ + '{DAV:}displayname', + '{urn:ietf:params:xml:ns:caldav}calendar-description', + '{urn:ietf:params:xml:ns:caldav}calendar-timezone', + '{http://apple.com/ns/ical/}calendar-order', + '{http://apple.com/ns/ical/}calendar-color', + '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp', + ]; + + foreach ($customPropertiesForShares as $customPropertyForShares) { + if (in_array($customPropertyForShares, $allRequestedProps)) { + $requestedProps[] = $customPropertyForShares; + } + } + } + if (empty($requestedProps)) { return; } diff --git a/apps/dav/lib/Files/FileSearchBackend.php b/apps/dav/lib/Files/FileSearchBackend.php index 5816c659932..0d837807fd8 100644 --- a/apps/dav/lib/Files/FileSearchBackend.php +++ b/apps/dav/lib/Files/FileSearchBackend.php @@ -116,6 +116,7 @@ class FileSearchBackend implements ISearchBackend { new SearchPropertyDefinition('{DAV:}getlastmodified', true, true, true, SearchPropertyDefinition::DATATYPE_DATETIME), new SearchPropertyDefinition(FilesPlugin::SIZE_PROPERTYNAME, true, true, true, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER), new SearchPropertyDefinition(TagsPlugin::FAVORITE_PROPERTYNAME, true, true, true, SearchPropertyDefinition::DATATYPE_BOOLEAN), + new SearchPropertyDefinition(FilesPlugin::INTERNAL_FILEID_PROPERTYNAME, true, true, false, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER), // select only properties new SearchPropertyDefinition('{DAV:}resourcetype', false, true, false), @@ -127,7 +128,6 @@ class FileSearchBackend implements ISearchBackend { new SearchPropertyDefinition(FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME, false, true, false), new SearchPropertyDefinition(FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME, false, true, false), new SearchPropertyDefinition(FilesPlugin::HAS_PREVIEW_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_BOOLEAN), - new SearchPropertyDefinition(FilesPlugin::INTERNAL_FILEID_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER), new SearchPropertyDefinition(FilesPlugin::FILEID_PROPERTYNAME, false, true, false, SearchPropertyDefinition::DATATYPE_NONNEGATIVE_INTEGER), ]; } @@ -222,7 +222,7 @@ class FileSearchBackend implements ISearchBackend { case Operator::OPERATION_IS_COLLECTION: return new SearchComparison('eq', 'mimetype', ICacheEntry::DIRECTORY_MIMETYPE); default: - throw new \InvalidArgumentException('Unsupported operation ' . $trimmedType. ' (' . $operator->type . ')'); + throw new \InvalidArgumentException('Unsupported operation ' . $trimmedType . ' (' . $operator->type . ')'); } } @@ -244,6 +244,8 @@ class FileSearchBackend implements ISearchBackend { return 'favorite'; case TagsPlugin::TAGS_PROPERTYNAME: return 'tagname'; + case FilesPlugin::INTERNAL_FILEID_PROPERTYNAME: + return 'fileid'; default: throw new \InvalidArgumentException('Unsupported property for search or order: ' . $propertyName); } @@ -266,7 +268,7 @@ class FileSearchBackend implements ISearchBackend { return 0 + $value; } $date = \DateTime::createFromFormat(\DateTime::ATOM, $value); - return ($date instanceof \DateTime) ? $date->getTimestamp() : 0; + return ($date instanceof \DateTime) ? $date->getTimestamp() : 0; default: return $value; } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 031bc1d3d81..a5c1379eb7e 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -42,9 +42,9 @@ use OCA\DAV\Connector\Sabre\FilesPlugin; use OCA\DAV\Connector\Sabre\FilesReportPlugin; use OCA\DAV\Connector\Sabre\SharesPlugin; use OCA\DAV\DAV\PublicAuth; +use OCA\DAV\DAV\CustomPropertiesBackend; use OCA\DAV\Connector\Sabre\QuotaPlugin; use OCA\DAV\Files\BrowserErrorPagePlugin; -use OCA\DAV\Files\CustomPropertiesBackend; use OCA\DAV\SystemTag\SystemTagPlugin; use OCP\IRequest; use OCP\SabrePluginEvent; diff --git a/apps/dav/tests/unit/CalDAV/CalendarTest.php b/apps/dav/tests/unit/CalDAV/CalendarTest.php index 70a072f04de..b80d510356e 100644 --- a/apps/dav/tests/unit/CalDAV/CalendarTest.php +++ b/apps/dav/tests/unit/CalDAV/CalendarTest.php @@ -34,7 +34,7 @@ use Test\TestCase; class CalendarTest extends TestCase { /** @var IL10N */ - private $l10n; + protected $l10n; public function setUp() { parent::setUp(); @@ -109,7 +109,7 @@ class CalendarTest extends TestCase { ['user1', 'user2', [], true], ['user1', 'user2', [ '{http://owncloud.org/ns}calendar-enabled' => true, - ], false], + ], true], ['user1', 'user2', [ '{DAV:}displayname' => true, ], true], @@ -134,7 +134,7 @@ class CalendarTest extends TestCase { /** * @dataProvider dataPropPatch */ - public function testPropPatch($ownerPrincipal, $principalUri, $mutations, $throws) { + public function testPropPatch($ownerPrincipal, $principalUri, $mutations, $shared) { /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); $calendarInfo = [ @@ -144,14 +144,15 @@ class CalendarTest extends TestCase { 'uri' => 'default' ]; $c = new Calendar($backend, $calendarInfo, $this->l10n); + $propPatch = new PropPatch($mutations); - if ($throws) { - $this->setExpectedException('\Sabre\DAV\Exception\Forbidden'); - } - $c->propPatch(new PropPatch($mutations)); - if (!$throws) { - $this->assertTrue(true); + if (!$shared) { + $backend->expects($this->once()) + ->method('updateCalendar') + ->with(666, $propPatch); } + $c->propPatch($propPatch); + $this->assertTrue(true); } /** diff --git a/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php b/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php index 59fa4747a93..7c424fd0dd1 100644 --- a/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php +++ b/apps/dav/tests/unit/CalDAV/PublicCalendarRootTest.php @@ -3,6 +3,7 @@ namespace OCA\DAV\Tests\unit\CalDAV; use OCA\DAV\CalDAV\Calendar; +use OCA\DAV\CalDAV\PublicCalendar; use OCA\DAV\Connector\Sabre\Principal; use OCP\IL10N; use OCA\DAV\CalDAV\CalDavBackend; @@ -21,7 +22,7 @@ use Test\TestCase; */ class PublicCalendarRootTest extends TestCase { - const UNIT_TEST_USER = 'principals/users/caldav-unit-test'; + const UNIT_TEST_USER = ''; /** @var CalDavBackend */ private $backend; /** @var PublicCalendarRoot */ @@ -92,13 +93,8 @@ class PublicCalendarRootTest extends TestCase { public function testGetChildren() { $this->createPublicCalendar(); - - $publicCalendars = $this->backend->getPublicCalendars(); - $calendarResults = $this->publicCalendarRoot->getChildren(); - - $this->assertEquals(1, count($calendarResults)); - $this->assertEquals(new Calendar($this->backend, $publicCalendars[0], $this->l10n), $calendarResults[0]); + $this->assertSame([], $calendarResults); } /** @@ -108,11 +104,11 @@ class PublicCalendarRootTest extends TestCase { $this->backend->createCalendar(self::UNIT_TEST_USER, 'Example', []); $calendarInfo = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER)[0]; - $calendar = new Calendar($this->backend, $calendarInfo, $this->l10n); + $calendar = new PublicCalendar($this->backend, $calendarInfo, $this->l10n); $publicUri = $calendar->setPublishStatus(true); $calendarInfo = $this->backend->getPublicCalendar($publicUri); - $calendar = new Calendar($this->backend, $calendarInfo, $this->l10n); + $calendar = new PublicCalendar($this->backend, $calendarInfo, $this->l10n); return $calendar; } diff --git a/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php b/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php new file mode 100644 index 00000000000..85a6a4c5614 --- /dev/null +++ b/apps/dav/tests/unit/CalDAV/PublicCalendarTest.php @@ -0,0 +1,153 @@ +<?php +/** + * @copyright Copyright (c) 2017, Georg Ehrke + * + * @author Georg Ehrke <oc.list@georgehrke.com> + * + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + +namespace OCA\DAV\Tests\unit\CalDAV; + +use OCA\DAV\CalDAV\PublicCalendar; +use OCA\DAV\CalDAV\CalDavBackend; +use Sabre\VObject\Reader; + +class PublicCalendarTest extends CalendarTest { + + public function testPrivateClassification() { + + $calObject0 = ['uri' => 'event-0', 'classification' => CalDavBackend::CLASSIFICATION_PUBLIC]; + $calObject1 = ['uri' => 'event-1', 'classification' => CalDavBackend::CLASSIFICATION_CONFIDENTIAL]; + $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE]; + + /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); + $backend->expects($this->any())->method('getCalendarObjects')->willReturn([ + $calObject0, $calObject1, $calObject2 + ]); + $backend->expects($this->any())->method('getMultipleCalendarObjects') + ->with(666, ['event-0', 'event-1', 'event-2']) + ->willReturn([ + $calObject0, $calObject1, $calObject2 + ]); + $backend->expects($this->any())->method('getCalendarObject') + ->willReturn($calObject2)->with(666, 'event-2'); + + $calendarInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'user2', + 'principaluri' => 'user2', + 'id' => 666, + 'uri' => 'cal', + ]; + + $c = new PublicCalendar($backend, $calendarInfo, $this->l10n); + $children = $c->getChildren(); + $this->assertEquals(2, count($children)); + $children = $c->getMultipleChildren(['event-0', 'event-1', 'event-2']); + $this->assertEquals(2, count($children)); + + $this->assertFalse($c->childExists('event-2')); + } + + public function testConfidentialClassification() { + $start = '20160609'; + $end = '20160610'; + + $calData = <<<EOD +BEGIN:VCALENDAR +PRODID:-//ownCloud calendar v1.2.2 +BEGIN:VEVENT +CREATED:20160602T133732 +DTSTAMP:20160602T133732 +LAST-MODIFIED:20160602T133732 +UID:wej2z68l9h +SUMMARY:Test Event +LOCATION:Somewhere ... +ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;CUTYPE=INDIVIDUAL;CN=de + epdiver:MAILTO:thomas.mueller@tmit.eu +ORGANIZER;CN=deepdiver:MAILTO:thomas.mueller@tmit.eu +DESCRIPTION:maybe .... +DTSTART;TZID=Europe/Berlin;VALUE=DATE:$start +DTEND;TZID=Europe/Berlin;VALUE=DATE:$end +RRULE:FREQ=DAILY +BEGIN:VALARM +ACTION:AUDIO +TRIGGER:-PT15M +END:VALARM +END:VEVENT +BEGIN:VTIMEZONE +TZID:Europe/Berlin +BEGIN:DAYLIGHT +DTSTART:19810329T020000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +TZNAME:MESZ +TZOFFSETFROM:+0100 +TZOFFSETTO:+0200 +END:DAYLIGHT +BEGIN:STANDARD +DTSTART:19961027T030000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +TZNAME:MEZ +TZOFFSETFROM:+0200 +TZOFFSETTO:+0100 +END:STANDARD +END:VTIMEZONE +END:VCALENDAR +EOD; + + $calObject0 = ['uri' => 'event-0', 'classification' => CalDavBackend::CLASSIFICATION_PUBLIC]; + $calObject1 = ['uri' => 'event-1', 'classification' => CalDavBackend::CLASSIFICATION_CONFIDENTIAL, 'calendardata' => $calData]; + $calObject2 = ['uri' => 'event-2', 'classification' => CalDavBackend::CLASSIFICATION_PRIVATE]; + + /** @var \PHPUnit_Framework_MockObject_MockObject | CalDavBackend $backend */ + $backend = $this->getMockBuilder(CalDavBackend::class)->disableOriginalConstructor()->getMock(); + $backend->expects($this->any())->method('getCalendarObjects')->willReturn([ + $calObject0, $calObject1, $calObject2 + ]); + $backend->expects($this->any())->method('getMultipleCalendarObjects') + ->with(666, ['event-0', 'event-1', 'event-2']) + ->willReturn([ + $calObject0, $calObject1, $calObject2 + ]); + $backend->expects($this->any())->method('getCalendarObject') + ->willReturn($calObject1)->with(666, 'event-1'); + + $calendarInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'user1', + 'principaluri' => 'user2', + 'id' => 666, + 'uri' => 'cal', + ]; + $c = new PublicCalendar($backend, $calendarInfo, $this->l10n); + + $this->assertEquals(count($c->getChildren()), 2); + + // test private event + $privateEvent = $c->getChild('event-1'); + $calData = $privateEvent->get(); + $event = Reader::read($calData); + + $this->assertEquals($start, $event->VEVENT->DTSTART->getValue()); + $this->assertEquals($end, $event->VEVENT->DTEND->getValue()); + + $this->assertEquals('Busy', $event->VEVENT->SUMMARY->getValue()); + $this->assertArrayNotHasKey('ATTENDEE', $event->VEVENT); + $this->assertArrayNotHasKey('LOCATION', $event->VEVENT); + $this->assertArrayNotHasKey('DESCRIPTION', $event->VEVENT); + $this->assertArrayNotHasKey('ORGANIZER', $event->VEVENT); + } +}
\ No newline at end of file diff --git a/apps/dav/tests/unit/DAV/CustomPropertiesBackendTest.php b/apps/dav/tests/unit/DAV/CustomPropertiesBackendTest.php new file mode 100644 index 00000000000..780324abaa6 --- /dev/null +++ b/apps/dav/tests/unit/DAV/CustomPropertiesBackendTest.php @@ -0,0 +1,170 @@ +<?php +/** + * @copyright Copyright (c) 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\Tests\DAV; + +use OCA\DAV\DAV\CustomPropertiesBackend; +use OCP\IDBConnection; +use OCP\IUser; +use Sabre\DAV\PropFind; +use Sabre\DAV\PropPatch; +use Sabre\DAV\Tree; +use Test\TestCase; + +class CustomPropertiesBackendTest extends TestCase { + + /** @var Tree | \PHPUnit_Framework_MockObject_MockObject */ + private $tree; + + /** @var IDBConnection | \PHPUnit_Framework_MockObject_MockObject */ + private $dbConnection; + + /** @var IUser | \PHPUnit_Framework_MockObject_MockObject */ + private $user; + + /** @var CustomPropertiesBackend | \PHPUnit_Framework_MockObject_MockObject */ + private $backend; + + public function setUp() { + parent::setUp(); + + $this->tree = $this->createMock(Tree::class); + $this->dbConnection = $this->createMock(IDBConnection::class); + $this->user = $this->createMock(IUser::class); + $this->user->expects($this->once()) + ->method('getUID') + ->with() + ->will($this->returnValue('dummy_user_42')); + + $this->backend = new CustomPropertiesBackend($this->tree, + $this->dbConnection, $this->user); + } + + public function testPropFindNoDbCalls() { + $propFind = $this->createMock(PropFind::class); + $propFind->expects($this->at(0)) + ->method('get404Properties') + ->with() + ->will($this->returnValue([ + '{http://owncloud.org/ns}permissions', + '{http://owncloud.org/ns}downloadURL', + '{http://owncloud.org/ns}dDC', + '{http://owncloud.org/ns}size', + ])); + + $this->dbConnection->expects($this->never()) + ->method($this->anything()); + + $this->backend->propFind('foo_bar_path_1337_0', $propFind); + } + + public function testPropFindCalendarCall() { + $propFind = $this->createMock(PropFind::class); + $propFind->expects($this->at(0)) + ->method('get404Properties') + ->with() + ->will($this->returnValue([ + '{DAV:}getcontentlength', + '{DAV:}getcontenttype', + '{DAV:}getetag', + '{abc}def' + ])); + + $propFind->expects($this->at(1)) + ->method('getRequestedProperties') + ->with() + ->will($this->returnValue([ + '{DAV:}getcontentlength', + '{DAV:}getcontenttype', + '{DAV:}getetag', + '{DAV:}displayname', + '{urn:ietf:params:xml:ns:caldav}calendar-description', + '{urn:ietf:params:xml:ns:caldav}calendar-timezone', + '{abc}def' + ])); + + $statement = $this->createMock('\Doctrine\DBAL\Driver\Statement'); + $this->dbConnection->expects($this->once()) + ->method('executeQuery') + ->with('SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` in (?)', + ['dummy_user_42', 'calendars/foo/bar_path_1337_0', [ + 3 => '{abc}def', + 4 => '{DAV:}displayname', + 5 => '{urn:ietf:params:xml:ns:caldav}calendar-description', + 6 => '{urn:ietf:params:xml:ns:caldav}calendar-timezone']], + [null, null, 102]) + ->will($this->returnValue($statement)); + + $this->backend->propFind('calendars/foo/bar_path_1337_0', $propFind); + } + + /** + * @dataProvider propPatchProvider + */ + public function testPropPatch($path, $propPatch) { + $propPatch->expects($this->once()) + ->method('handleRemaining'); + + $this->backend->propPatch($path, $propPatch); + } + + public function propPatchProvider() { + $propPatchMock = $this->createMock(PropPatch::class); + return [ + ['foo_bar_path_1337', $propPatchMock], + ]; + } + + public function testDelete() { + $statement = $this->createMock('\Doctrine\DBAL\Driver\Statement'); + $statement->expects($this->at(0)) + ->method('execute') + ->with(['dummy_user_42', 'foo_bar_path_1337']); + $statement->expects($this->at(1)) + ->method('closeCursor') + ->with(); + + $this->dbConnection->expects($this->at(0)) + ->method('prepare') + ->with('DELETE FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?') + ->will($this->returnValue($statement)); + + $this->backend->delete('foo_bar_path_1337'); + } + + public function testMove() { + $statement = $this->createMock('\Doctrine\DBAL\Driver\Statement'); + $statement->expects($this->at(0)) + ->method('execute') + ->with(['bar_foo_path_7331', 'dummy_user_42', 'foo_bar_path_1337']); + $statement->expects($this->at(1)) + ->method('closeCursor') + ->with(); + + $this->dbConnection->expects($this->at(0)) + ->method('prepare') + ->with('UPDATE `*PREFIX*properties` SET `propertypath` = ? WHERE `userid` = ? AND `propertypath` = ?') + ->will($this->returnValue($statement)); + + $this->backend->move('foo_bar_path_1337', 'bar_foo_path_7331'); + } +} diff --git a/apps/encryption/l10n/es_MX.js b/apps/encryption/l10n/es_MX.js index ad94a24e114..3aec9628585 100644 --- a/apps/encryption/l10n/es_MX.js +++ b/apps/encryption/l10n/es_MX.js @@ -1,28 +1,64 @@ OC.L10N.register( "encryption", { - "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos", - "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor compruebe su contraseña.", - "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", - "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!", - "Password successfully changed." : "Su contraseña ha sido cambiada", - "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.", - "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la aplicación de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", - "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", + "Missing recovery key password" : "Contraseña de llave de recuperacion faltante", + "Please repeat the recovery key password" : "Favor de reingresar la contraseña de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "Las contraseñas de la llave de recuperación no coinciden", + "Recovery key successfully enabled" : "Llave de recuperación habilitada exitosamente", + "Could not enable recovery key. Please check your recovery key password!" : "No fue posible habilitar la llave de recuperación. ¡Favor de comprobar la contraseña de su llave de recuperación!", + "Recovery key successfully disabled" : "Llave de recuperación deshabilitada exitosamente", + "Could not disable recovery key. Please check your recovery key password!" : "No fue posible deshabilitar la llave de recuperación. ¡Favor de comprobar la contraseña de la llave de recuperación!", + "Missing parameters" : "Parámetros faltantes", + "Please provide the old recovery password" : "Favor de proporcionar su contraseña de recuperación anterior", + "Please provide a new recovery password" : "Favor de proporcionar una nueva contraseña de recuperación", + "Please repeat the new recovery password" : "Favor de reingresar la nueva contraseña de recuperación", + "Password successfully changed." : "La contraseña ha sido cambiada exitosamente", + "Could not change the password. Maybe the old password was not correct." : "No fue posible cambiar la contraseña. Favor de verificar que contraseña anterior sea correcta.", + "Recovery Key disabled" : "Llave de recuperación deshabilitada", + "Recovery Key enabled" : "Llave de recuperación habilitada", + "Could not enable the recovery key, please try again or contact your administrator" : "No fue posible habilitar la llave de recuperación, favor de intentarlo de nuevo o contacte a su administrador", + "Could not update the private key password." : "No fue posible actualizar la contraseña de la llave privada.", + "The old password was not correct, please try again." : "La contraseña anterior no es correcta, favor de intentar de nuevo. ", + "The current log-in password was not correct, please try again." : "La contraseña actual para iniciar sesión fue incorrecta, favor de volverlo a intentar. ", + "Private key password successfully updated." : "Contraseña de llave privada actualizada exitosamente.", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Usted necesita migar sus llaves de encripción de la encripción anterior (ownCloud <=8.0) a la nueva. Favor de ejecutar 'occ encryption:migrate' o contacte a su adminstrador", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "La llave de encripción privada es inválida para la aplicación de encripción. Favor de actualizar la contraseña de su llave privada en sus ajustes personales para recuperar el acceso a sus archivos encriptados. ", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "La aplicación de encripción está habilitada, pero sus llaves no han sido inicializadas. Favor de cerrar sesión e iniciar sesión de nuevo. ", + "Encryption app is enabled and ready" : "La aplicación de encripción se cuentra habilitada y lista", + "Bad Signature" : "Firma equivocada", + "Missing Signature" : "Firma faltante", + "one-time password for server-side-encryption" : "Contraseña de una-sola-vez para la encripción del lado del servidor", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es posible decriptar este archivo, posiblemente sea un archivo compartido. Favor de solicitar al dueño del archivo que lo vuelva a compartir con usted.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es posible leer este archivo, posiblemente sea un archivo compatido. Favor de solicitar al dueño que vuelva a compartirlo con usted. ", + "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" : "Hola,\n\nel administrador ha habilitado la encripción de lado del servidor. Sus archivos fueron encriptados usando la contraseña '%s'\n\nFavor de iniciar sesión en la interface web, vaya a la sección \"módulo de encripción básica\" de sus ajustes personales y actualice su contraseña de encripción ingresando esta contraseña en el campo 'contraseña de inicio de sesión anterior' y su contraseña de inicio de sesión actual. \n", + "The share will expire on %s." : "El elemento compartido expirará el %s.", "Cheers!" : "¡Saludos!", - "Recovery key password" : "Contraseña de clave de recuperación", - "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación", + "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>" : "Hola, <br><br>el administrador ha habilitado la encripción del lado del servidor. Sus archivos fueron encriptados usando la contraseña <strong>%s</strong>.<br><br> Favor de iniciar sesisón en la interface web, vaya a la sección \"módulo de encripción básica\" de sus ajustes personales y actualice su contraseña de encripción ingresando esta contraseña en el campo \"contraseña de inicio de sesión anterior\" y su contraseña de inicio de sesión actual. <br><br>", + "Default encryption module" : "Módulo de encripción predeterminado", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción esta habilitada pero sus llaves no han sido inicializadas, favor de salir y volver a entrar a la sesion", + "Encrypt the home storage" : "Encriptar el almacenamiento de inicio", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Habilitar esta opción encripta todos los archivos almacenados en el almacenamiento principal, de otro modo, sólo los archivos en el almacenamiento externo serán encriptados", + "Enable recovery key" : "Habilitar llave de recuperación", + "Disable recovery key" : "Deshabilitar llave de recuperación", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La llave de recuperación es una llave de encripción que se usa para encriptar archivos. Permite la recuperación de los archivos del usuario si este olvida su contraseña. ", + "Recovery key password" : "Contraseña de llave de recuperación", + "Repeat recovery key password" : "Repetir la contraseña de la llave de recuperación", + "Change recovery key password:" : "Cambiar la contraseña de la llave de recuperación:", + "Old recovery key password" : "Anterior contraseña de llave de recuperación", + "New recovery key password" : "Nueva contraseña de llave de recuperación", + "Repeat new recovery key password" : "Reingresar la nueva contraseña de llave de recuperación", "Change Password" : "Cambiar contraseña", - " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus archivos.", - "Old log-in password" : "Contraseña de acceso antigua", - "Current log-in password" : "Contraseña de acceso actual", - "Update Private Key Password" : "Actualizar Contraseña de Clave Privada", + "Basic encryption module" : "Módulo de encripción básica", + "Your private key password no longer matches your log-in password." : "Su contraseña de llave privada ya no corresónde con su contraseña de inicio de sesión. ", + "Set your old private key password to your current log-in password:" : "Establezca su contraseña de llave privada a su contraseña actual de inicio de seisón:", + " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su contraseña anterior le puede pedir a su administrador que recupere sus archivos.", + "Old log-in password" : "Contraseña anterior", + "Current log-in password" : "Contraseña actual", + "Update Private Key Password" : "Actualizar Contraseña de Llave Privada", "Enable password recovery:" : "Habilitar la recuperación de contraseña:", - "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos cifrados en caso de pérdida de contraseña", - "Enabled" : "Habilitar", - "Disabled" : "Deshabilitado" + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos encriptados en caso de perder la contraseña", + "Enabled" : "Habilitado", + "Disabled" : "Deshabilitado", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción está habilitada pero tus llaves no han sido establecidas, favor de cerrar la sesión y volver a iniciarla." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/encryption/l10n/es_MX.json b/apps/encryption/l10n/es_MX.json index 5a64c7c8777..d29ac057514 100644 --- a/apps/encryption/l10n/es_MX.json +++ b/apps/encryption/l10n/es_MX.json @@ -1,26 +1,62 @@ { "translations": { - "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos", - "Could not enable recovery key. Please check your recovery key password!" : "No se pudo habilitar la clave de recuperación. Por favor compruebe su contraseña.", - "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", - "Could not disable recovery key. Please check your recovery key password!" : "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!", - "Password successfully changed." : "Su contraseña ha sido cambiada", - "Could not change the password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.", - "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la aplicación de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", - "The share will expire on %s." : "El objeto dejará de ser compartido el %s.", + "Missing recovery key password" : "Contraseña de llave de recuperacion faltante", + "Please repeat the recovery key password" : "Favor de reingresar la contraseña de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "Las contraseñas de la llave de recuperación no coinciden", + "Recovery key successfully enabled" : "Llave de recuperación habilitada exitosamente", + "Could not enable recovery key. Please check your recovery key password!" : "No fue posible habilitar la llave de recuperación. ¡Favor de comprobar la contraseña de su llave de recuperación!", + "Recovery key successfully disabled" : "Llave de recuperación deshabilitada exitosamente", + "Could not disable recovery key. Please check your recovery key password!" : "No fue posible deshabilitar la llave de recuperación. ¡Favor de comprobar la contraseña de la llave de recuperación!", + "Missing parameters" : "Parámetros faltantes", + "Please provide the old recovery password" : "Favor de proporcionar su contraseña de recuperación anterior", + "Please provide a new recovery password" : "Favor de proporcionar una nueva contraseña de recuperación", + "Please repeat the new recovery password" : "Favor de reingresar la nueva contraseña de recuperación", + "Password successfully changed." : "La contraseña ha sido cambiada exitosamente", + "Could not change the password. Maybe the old password was not correct." : "No fue posible cambiar la contraseña. Favor de verificar que contraseña anterior sea correcta.", + "Recovery Key disabled" : "Llave de recuperación deshabilitada", + "Recovery Key enabled" : "Llave de recuperación habilitada", + "Could not enable the recovery key, please try again or contact your administrator" : "No fue posible habilitar la llave de recuperación, favor de intentarlo de nuevo o contacte a su administrador", + "Could not update the private key password." : "No fue posible actualizar la contraseña de la llave privada.", + "The old password was not correct, please try again." : "La contraseña anterior no es correcta, favor de intentar de nuevo. ", + "The current log-in password was not correct, please try again." : "La contraseña actual para iniciar sesión fue incorrecta, favor de volverlo a intentar. ", + "Private key password successfully updated." : "Contraseña de llave privada actualizada exitosamente.", + "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Usted necesita migar sus llaves de encripción de la encripción anterior (ownCloud <=8.0) a la nueva. Favor de ejecutar 'occ encryption:migrate' o contacte a su adminstrador", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "La llave de encripción privada es inválida para la aplicación de encripción. Favor de actualizar la contraseña de su llave privada en sus ajustes personales para recuperar el acceso a sus archivos encriptados. ", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "La aplicación de encripción está habilitada, pero sus llaves no han sido inicializadas. Favor de cerrar sesión e iniciar sesión de nuevo. ", + "Encryption app is enabled and ready" : "La aplicación de encripción se cuentra habilitada y lista", + "Bad Signature" : "Firma equivocada", + "Missing Signature" : "Firma faltante", + "one-time password for server-side-encryption" : "Contraseña de una-sola-vez para la encripción del lado del servidor", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es posible decriptar este archivo, posiblemente sea un archivo compartido. Favor de solicitar al dueño del archivo que lo vuelva a compartir con usted.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es posible leer este archivo, posiblemente sea un archivo compatido. Favor de solicitar al dueño que vuelva a compartirlo con usted. ", + "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" : "Hola,\n\nel administrador ha habilitado la encripción de lado del servidor. Sus archivos fueron encriptados usando la contraseña '%s'\n\nFavor de iniciar sesión en la interface web, vaya a la sección \"módulo de encripción básica\" de sus ajustes personales y actualice su contraseña de encripción ingresando esta contraseña en el campo 'contraseña de inicio de sesión anterior' y su contraseña de inicio de sesión actual. \n", + "The share will expire on %s." : "El elemento compartido expirará el %s.", "Cheers!" : "¡Saludos!", - "Recovery key password" : "Contraseña de clave de recuperación", - "Change recovery key password:" : "Cambiar la contraseña de la clave de recuperación", + "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>" : "Hola, <br><br>el administrador ha habilitado la encripción del lado del servidor. Sus archivos fueron encriptados usando la contraseña <strong>%s</strong>.<br><br> Favor de iniciar sesisón en la interface web, vaya a la sección \"módulo de encripción básica\" de sus ajustes personales y actualice su contraseña de encripción ingresando esta contraseña en el campo \"contraseña de inicio de sesión anterior\" y su contraseña de inicio de sesión actual. <br><br>", + "Default encryption module" : "Módulo de encripción predeterminado", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción esta habilitada pero sus llaves no han sido inicializadas, favor de salir y volver a entrar a la sesion", + "Encrypt the home storage" : "Encriptar el almacenamiento de inicio", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Habilitar esta opción encripta todos los archivos almacenados en el almacenamiento principal, de otro modo, sólo los archivos en el almacenamiento externo serán encriptados", + "Enable recovery key" : "Habilitar llave de recuperación", + "Disable recovery key" : "Deshabilitar llave de recuperación", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La llave de recuperación es una llave de encripción que se usa para encriptar archivos. Permite la recuperación de los archivos del usuario si este olvida su contraseña. ", + "Recovery key password" : "Contraseña de llave de recuperación", + "Repeat recovery key password" : "Repetir la contraseña de la llave de recuperación", + "Change recovery key password:" : "Cambiar la contraseña de la llave de recuperación:", + "Old recovery key password" : "Anterior contraseña de llave de recuperación", + "New recovery key password" : "Nueva contraseña de llave de recuperación", + "Repeat new recovery key password" : "Reingresar la nueva contraseña de llave de recuperación", "Change Password" : "Cambiar contraseña", - " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus archivos.", - "Old log-in password" : "Contraseña de acceso antigua", - "Current log-in password" : "Contraseña de acceso actual", - "Update Private Key Password" : "Actualizar Contraseña de Clave Privada", + "Basic encryption module" : "Módulo de encripción básica", + "Your private key password no longer matches your log-in password." : "Su contraseña de llave privada ya no corresónde con su contraseña de inicio de sesión. ", + "Set your old private key password to your current log-in password:" : "Establezca su contraseña de llave privada a su contraseña actual de inicio de seisón:", + " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su contraseña anterior le puede pedir a su administrador que recupere sus archivos.", + "Old log-in password" : "Contraseña anterior", + "Current log-in password" : "Contraseña actual", + "Update Private Key Password" : "Actualizar Contraseña de Llave Privada", "Enable password recovery:" : "Habilitar la recuperación de contraseña:", - "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos cifrados en caso de pérdida de contraseña", - "Enabled" : "Habilitar", - "Disabled" : "Deshabilitado" + "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción le permitirá volver a tener acceso a sus archivos encriptados en caso de perder la contraseña", + "Enabled" : "Habilitado", + "Disabled" : "Deshabilitado", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción está habilitada pero tus llaves no han sido establecidas, favor de cerrar la sesión y volver a iniciarla." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/encryption/l10n/fi.js b/apps/encryption/l10n/fi.js index b926b08fc7a..10229e7706e 100644 --- a/apps/encryption/l10n/fi.js +++ b/apps/encryption/l10n/fi.js @@ -22,6 +22,9 @@ OC.L10N.register( "The current log-in password was not correct, please try again." : "Nykyinen kirjautumiseen käytettävä salasana oli väärin, yritä uudelleen.", "Private key password successfully updated." : "Yksityisen avaimen salasana päivitettiin onnistuneesti.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Salausavaimet tulee siirtää vanhasta salaustavasta (ownCloud <= 8.0) uuteen salaustapaan. Suorita 'occ encryption:migrate' tai ota yhteys ylläpitoon", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Salaussovelluksen salausavain on virheellinen. Ole hyvä ja päivitä salausavain henkilökohtaisissa asetuksissasi jotta voit taas avata salauskirjoitetut tiedostosi.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.", + "Encryption app is enabled and ready" : "Salaussovellus on aktivoitu ja valmis", "Bad Signature" : "Virheellinen allekirjoitus", "Missing Signature" : "Puuttuva allekirjoitus", "one-time password for server-side-encryption" : "kertakäyttöinen salasana palvelinpään salausta varten", @@ -29,6 +32,8 @@ 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." : "Tiedostoa ei voi lukea, se on luultavasti jaettu tiedosto. Pyydä tiedoston omistajaa jakamaan tiedosto uudelleen kanssasi.", "The share will expire on %s." : "Jakaminen päättyy %s.", "Cheers!" : "Kiitos!", + "Default encryption module" : "Oletus salausmoduuli", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on aktivoitu, mutta avaimia ei ole alustettu, kirjaudu uudelleen sisään", "Encrypt the home storage" : "Salaa oma kotitila", "Enable recovery key" : "Ota palautusavain käyttöön", "Disable recovery key" : "Poista palautusavain käytöstä", @@ -40,6 +45,7 @@ OC.L10N.register( "New recovery key password" : "Uusi salausavaimen salasana", "Repeat new recovery key password" : "Toista uusi salausavaimen salasana", "Change Password" : "Vaihda salasana", + "Basic encryption module" : "Perus salausmoduuli", "Your private key password no longer matches your log-in password." : "Salaisen avaimesi salasana ei enää vastaa kirjautumissalasanaasi.", "Set your old private key password to your current log-in password:" : "Aseta yksityisen avaimen vanha salasana vastaamaan nykyistä kirjautumissalasanaasi:", " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.", diff --git a/apps/encryption/l10n/fi.json b/apps/encryption/l10n/fi.json index 96cc9ea8b6f..14b3b95fc24 100644 --- a/apps/encryption/l10n/fi.json +++ b/apps/encryption/l10n/fi.json @@ -20,6 +20,9 @@ "The current log-in password was not correct, please try again." : "Nykyinen kirjautumiseen käytettävä salasana oli väärin, yritä uudelleen.", "Private key password successfully updated." : "Yksityisen avaimen salasana päivitettiin onnistuneesti.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Salausavaimet tulee siirtää vanhasta salaustavasta (ownCloud <= 8.0) uuteen salaustapaan. Suorita 'occ encryption:migrate' tai ota yhteys ylläpitoon", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Salaussovelluksen salausavain on virheellinen. Ole hyvä ja päivitä salausavain henkilökohtaisissa asetuksissasi jotta voit taas avata salauskirjoitetut tiedostosi.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.", + "Encryption app is enabled and ready" : "Salaussovellus on aktivoitu ja valmis", "Bad Signature" : "Virheellinen allekirjoitus", "Missing Signature" : "Puuttuva allekirjoitus", "one-time password for server-side-encryption" : "kertakäyttöinen salasana palvelinpään salausta varten", @@ -27,6 +30,8 @@ "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tiedostoa ei voi lukea, se on luultavasti jaettu tiedosto. Pyydä tiedoston omistajaa jakamaan tiedosto uudelleen kanssasi.", "The share will expire on %s." : "Jakaminen päättyy %s.", "Cheers!" : "Kiitos!", + "Default encryption module" : "Oletus salausmoduuli", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on aktivoitu, mutta avaimia ei ole alustettu, kirjaudu uudelleen sisään", "Encrypt the home storage" : "Salaa oma kotitila", "Enable recovery key" : "Ota palautusavain käyttöön", "Disable recovery key" : "Poista palautusavain käytöstä", @@ -38,6 +43,7 @@ "New recovery key password" : "Uusi salausavaimen salasana", "Repeat new recovery key password" : "Toista uusi salausavaimen salasana", "Change Password" : "Vaihda salasana", + "Basic encryption module" : "Perus salausmoduuli", "Your private key password no longer matches your log-in password." : "Salaisen avaimesi salasana ei enää vastaa kirjautumissalasanaasi.", "Set your old private key password to your current log-in password:" : "Aseta yksityisen avaimen vanha salasana vastaamaan nykyistä kirjautumissalasanaasi:", " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.", diff --git a/apps/encryption/l10n/hu.js b/apps/encryption/l10n/hu.js index 9782ec439cc..0b93142bfd4 100644 --- a/apps/encryption/l10n/hu.js +++ b/apps/encryption/l10n/hu.js @@ -23,6 +23,7 @@ OC.L10N.register( "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Migrálni kell a titkosítási kulcsaidat a rég titkosításról (ownCloud <= 8.0) az újra. Kérlek futtasd az 'occ encryption:migrate' parancsot, vagy lépj kapcsolatba az adminisztrátorral", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A titkosító alkalmazás privát kulcsa érvénytelen. A titkosított fájljaidhoz való hozzáféréshez frissítsd a privát kulcsod jelszavát a személyes beállításoknál.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A fájlok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérlek, hogy jelentkezz ki, és lépj be újra!", "Encryption app is enabled and ready" : "A titkosító alkalmazás engedélyezve és készen áll", "Bad Signature" : "Rossz aláírás", "Missing Signature" : "Hiányzó aláírás", diff --git a/apps/encryption/l10n/hu.json b/apps/encryption/l10n/hu.json index 54d55df0679..7f6814fa533 100644 --- a/apps/encryption/l10n/hu.json +++ b/apps/encryption/l10n/hu.json @@ -21,6 +21,7 @@ "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Migrálni kell a titkosítási kulcsaidat a rég titkosításról (ownCloud <= 8.0) az újra. Kérlek futtasd az 'occ encryption:migrate' parancsot, vagy lépj kapcsolatba az adminisztrátorral", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "A titkosító alkalmazás privát kulcsa érvénytelen. A titkosított fájljaidhoz való hozzáféréshez frissítsd a privát kulcsod jelszavát a személyes beállításoknál.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "A fájlok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérlek, hogy jelentkezz ki, és lépj be újra!", "Encryption app is enabled and ready" : "A titkosító alkalmazás engedélyezve és készen áll", "Bad Signature" : "Rossz aláírás", "Missing Signature" : "Hiányzó aláírás", diff --git a/apps/encryption/l10n/nl.js b/apps/encryption/l10n/nl.js index b34b26435eb..441326493e4 100644 --- a/apps/encryption/l10n/nl.js +++ b/apps/encryption/l10n/nl.js @@ -4,9 +4,9 @@ OC.L10N.register( "Missing recovery key password" : "Ontbrekende wachtwoord herstelsleutel", "Please repeat the recovery key password" : "Herhaal het herstelsleutel wachtwoord", "Repeated recovery key password does not match the provided recovery key password" : "Het herhaalde herstelsleutel wachtwoord kwam niet overeen met het eerdere herstelsleutel wachtwoord ", - "Recovery key successfully enabled" : "Herstelsleutel succesvol geactiveerd", + "Recovery key successfully enabled" : "Herstelsleutel succesvol ingeschakeld", "Could not enable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet activeren. Controleer het wachtwoord van je herstelsleutel!", - "Recovery key successfully disabled" : "Herstelsleutel succesvol gedeactiveerd", + "Recovery key successfully disabled" : "Herstelsleutel succesvol uitgeschakeld", "Could not disable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet deactiveren. Controleer het wachtwoord van je herstelsleutel!", "Missing parameters" : "Ontbrekende parameters", "Please provide the old recovery password" : "Geef het oude herstelwachtwoord op", @@ -14,7 +14,7 @@ OC.L10N.register( "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord", "Password successfully changed." : "Wachtwoord succesvol gewijzigd.", "Could not change the password. Maybe the old password was not correct." : "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.", - "Recovery Key disabled" : "Herstelsleutel gedeactiveerd", + "Recovery Key disabled" : "Herstelsleutel uitgeschakeld", "Recovery Key enabled" : "Herstelsleutel ingeschakeld", "Could not enable the recovery key, please try again or contact your administrator" : "Kon herstelsleutel niet inschakelen, probeer het opnieuw, of neem contact op met je beheerder", "Could not update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.", @@ -23,8 +23,8 @@ OC.L10N.register( "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Je moet je cryptosleutels van de oude versleuteling (ownCloud <= 8.0) migreren naar de nieuwe. Start 'occ encryption:migrate' of neem contact op met je beheerder", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ongeldige privésleutel voor de crypto app. Werk het privésleutel wachtwoord bij in je persoonlijke instellingen om opnieuw toegang te krijgen tot je versleutelde bestanden.", - "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", - "Encryption app is enabled and ready" : "Encryptie app is geactiveerd en gereed", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", + "Encryption app is enabled and ready" : "Encryptie app is ingeschakeld en gereed", "Bad Signature" : "Verkeerde handtekening", "Missing Signature" : "Missende ondertekening", "one-time password for server-side-encryption" : "eenmalig wachtwoord voor server-side versleuteling", @@ -35,7 +35,7 @@ OC.L10N.register( "Cheers!" : "Proficiat!", "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>" : "Hallo daar,<br><br>de beheerder heeft server-side versleuteling ingeschakeld. Je bestanden werden versleuteld met het wachtwoord <strong>%s</strong>.<br><br>Login op de webinterface, ga naar 'basis cryptomodule' in je persoonlijke instellingen en pas je cryptowachtwoord aan door dit wachtwoord in het \"oude inlog wachtwoord\" veld in te vullen alsmede in je huidige inlogwachtwoord.<br><br>", "Default encryption module" : "Standaard cryptomodule", - "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", "Encrypt the home storage" : "Versleutel de eigen serveropslag", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Het inschakelen van deze optie zorgt voor versleutelen van alle bestanden op do hoofdopslag, anders worden alleen bestanden op externe opslag versleuteld", "Enable recovery key" : "Activeer herstelsleutel", @@ -57,8 +57,8 @@ OC.L10N.register( "Update Private Key Password" : "Bijwerken wachtwoord Privésleutel", "Enable password recovery:" : "Activeren wachtwoord herstel:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Het activeren van deze optie maakt het mogelijk om je versleutelde bestanden te benaderen als je wachtwoord kwijt is", - "Enabled" : "Geactiveerd", - "Disabled" : "Gedeactiveerd", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in." + "Enabled" : "Ingeschakeld", + "Disabled" : "Uitgeschakeld", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/encryption/l10n/nl.json b/apps/encryption/l10n/nl.json index 292dd1b3cac..a8c477566f8 100644 --- a/apps/encryption/l10n/nl.json +++ b/apps/encryption/l10n/nl.json @@ -2,9 +2,9 @@ "Missing recovery key password" : "Ontbrekende wachtwoord herstelsleutel", "Please repeat the recovery key password" : "Herhaal het herstelsleutel wachtwoord", "Repeated recovery key password does not match the provided recovery key password" : "Het herhaalde herstelsleutel wachtwoord kwam niet overeen met het eerdere herstelsleutel wachtwoord ", - "Recovery key successfully enabled" : "Herstelsleutel succesvol geactiveerd", + "Recovery key successfully enabled" : "Herstelsleutel succesvol ingeschakeld", "Could not enable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet activeren. Controleer het wachtwoord van je herstelsleutel!", - "Recovery key successfully disabled" : "Herstelsleutel succesvol gedeactiveerd", + "Recovery key successfully disabled" : "Herstelsleutel succesvol uitgeschakeld", "Could not disable recovery key. Please check your recovery key password!" : "Kon herstelsleutel niet deactiveren. Controleer het wachtwoord van je herstelsleutel!", "Missing parameters" : "Ontbrekende parameters", "Please provide the old recovery password" : "Geef het oude herstelwachtwoord op", @@ -12,7 +12,7 @@ "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord", "Password successfully changed." : "Wachtwoord succesvol gewijzigd.", "Could not change the password. Maybe the old password was not correct." : "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.", - "Recovery Key disabled" : "Herstelsleutel gedeactiveerd", + "Recovery Key disabled" : "Herstelsleutel uitgeschakeld", "Recovery Key enabled" : "Herstelsleutel ingeschakeld", "Could not enable the recovery key, please try again or contact your administrator" : "Kon herstelsleutel niet inschakelen, probeer het opnieuw, of neem contact op met je beheerder", "Could not update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.", @@ -21,8 +21,8 @@ "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Je moet je cryptosleutels van de oude versleuteling (ownCloud <= 8.0) migreren naar de nieuwe. Start 'occ encryption:migrate' of neem contact op met je beheerder", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ongeldige privésleutel voor de crypto app. Werk het privésleutel wachtwoord bij in je persoonlijke instellingen om opnieuw toegang te krijgen tot je versleutelde bestanden.", - "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", - "Encryption app is enabled and ready" : "Encryptie app is geactiveerd en gereed", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", + "Encryption app is enabled and ready" : "Encryptie app is ingeschakeld en gereed", "Bad Signature" : "Verkeerde handtekening", "Missing Signature" : "Missende ondertekening", "one-time password for server-side-encryption" : "eenmalig wachtwoord voor server-side versleuteling", @@ -33,7 +33,7 @@ "Cheers!" : "Proficiat!", "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>" : "Hallo daar,<br><br>de beheerder heeft server-side versleuteling ingeschakeld. Je bestanden werden versleuteld met het wachtwoord <strong>%s</strong>.<br><br>Login op de webinterface, ga naar 'basis cryptomodule' in je persoonlijke instellingen en pas je cryptowachtwoord aan door dit wachtwoord in het \"oude inlog wachtwoord\" veld in te vullen alsmede in je huidige inlogwachtwoord.<br><br>", "Default encryption module" : "Standaard cryptomodule", - "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", "Encrypt the home storage" : "Versleutel de eigen serveropslag", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Het inschakelen van deze optie zorgt voor versleutelen van alle bestanden op do hoofdopslag, anders worden alleen bestanden op externe opslag versleuteld", "Enable recovery key" : "Activeer herstelsleutel", @@ -55,8 +55,8 @@ "Update Private Key Password" : "Bijwerken wachtwoord Privésleutel", "Enable password recovery:" : "Activeren wachtwoord herstel:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Het activeren van deze optie maakt het mogelijk om je versleutelde bestanden te benaderen als je wachtwoord kwijt is", - "Enabled" : "Geactiveerd", - "Disabled" : "Gedeactiveerd", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in." + "Enabled" : "Ingeschakeld", + "Disabled" : "Uitgeschakeld", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is ingeschakeld, maar je sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/encryption/l10n/pt_BR.js b/apps/encryption/l10n/pt_BR.js index 1e87489c2e5..f8bb3026a8c 100644 --- a/apps/encryption/l10n/pt_BR.js +++ b/apps/encryption/l10n/pt_BR.js @@ -1,35 +1,36 @@ OC.L10N.register( "encryption", { - "Missing recovery key password" : "Senha da chave de recuperação em falta", + "Missing recovery key password" : "Está faltando a senha da chave de recuperação", "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação", - "Repeated recovery key password does not match the provided recovery key password" : "A senha repetidas da chave de valorização não corresponde a senha da chave de recuperação prevista", + "Repeated recovery key password does not match the provided recovery key password" : "A senha repetida da chave de recuperação não corresponde a senha da chave de recuperação fornecida", "Recovery key successfully enabled" : "Recuperação de chave habilitada com sucesso", "Could not enable recovery key. Please check your recovery key password!" : "Impossível habilitar recuperação de chave. Por favor, verifique sua senha para recuperação de chave!", "Recovery key successfully disabled" : "Recuperação de chave desabilitada com sucesso", "Could not disable recovery key. Please check your recovery key password!" : "Impossível desabilitar recuperação de chave. Por favor, verifique sua senha para recuperação de chave!", - "Missing parameters" : "Parâmetros que faltam", + "Missing parameters" : "Parâmetros faltantes", "Please provide the old recovery password" : "Por favor, forneça a antiga senha de recuperação", "Please provide a new recovery password" : "Por favor, forneça a nova senha de recuperação", "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", - "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.", + "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estivesse correta.", "Recovery Key disabled" : "Recuperação de chave desativada", "Recovery Key enabled" : "Recuperação de chave ativada", "Could not enable the recovery key, please try again or contact your administrator" : "Não foi possível ativar a recuperação de chave. Tente novamente ou entre em contato com seu administrador", "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", - "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.", - "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor tente novamente.", + "The current log-in password was not correct, please try again." : "A senha atual de acesso não estava correta, por favor tente novamente.", "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Você precisa migrar suas chaves de criptografia a partir da antiga criptografia (ownCloud <= 8,0) para a nova. Por favor, execute 'occ encryption:migrate' ou contate o seu administrador", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para o aplicativo de criptografia. Atualize a senha da sua chave privada nas configurações pessoais para recuperar o acesso aos seus arquivos criptografados.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "O aplicativo de criptografia está habilitada mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encryption app is enabled and ready" : "O aplicativo de criptografia está ativo e pronto", "Bad Signature" : "Assinatura ruim", - "Missing Signature" : "Faltando assinatura", - "one-time password for server-side-encryption" : "senha de uso único para criptografia-lado-servidor", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Por favor, peça ao dono do arquivo para compartilhá-lo com você.", - "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, provavelmente este é um arquivo compartilhado. Por favor, pergunte o dono do arquivo para recompartilhar o arquivo 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 criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login para a 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 atual senha-de-login.\n\n", + "Missing Signature" : "Assinatura faltante", + "one-time password for server-side-encryption" : "senha de uso único para criptografia do lado do servidor", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para compartilhá-lo com você.", + "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 recompartilhar o arquivo 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 para a 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!" : "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 criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login para a 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 atual senha-de-login.<br><br>", @@ -39,9 +40,9 @@ OC.L10N.register( "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativar essa opção de criptografia para todos os arquivos armazenados no armazenamento principal, caso contrário, apenas arquivos no armazenamento externo serão criptografados", "Enable recovery key" : "Habilitar recuperação de chave", "Disable recovery key" : "Dasabilitar chave de recuperação", - "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar arquivos. Ela permite a recuperação de arquivos de um usuário esquecer sua senha.", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de criptografia extra que é utilizada para criptografar arquivos. Ela permite a recuperação de arquivos se um usuário esquecer a senha.", "Recovery key password" : "Senha da chave de recuperação", - "Repeat recovery key password" : "Repita senha da chave de recuperação", + "Repeat recovery key password" : "Repita a senha da chave de recuperação", "Change recovery key password:" : "Mudar a senha da chave de recuperação:", "Old recovery key password" : "Senha da chave de recuperação antiga", "New recovery key password" : "Nova senha da chave de recuperação", @@ -52,12 +53,12 @@ OC.L10N.register( "Set your old private key password to your current log-in password:" : "Defina a sua antiga senha da chave privada para sua senha de login atual:", " If you don't remember your old password you can ask your administrator to recover your files." : "Se você não se lembra de sua antiga senha você pode pedir ao administrador que recupere seus arquivos.", "Old log-in password" : "Senha antiga de login", - "Current log-in password" : "Senha de login atual", + "Current log-in password" : "Senha atual de login", "Update Private Key Password" : "Atualizar senha de chave privada", "Enable password recovery:" : "Habilitar recuperação de senha:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ativar essa opção vai permitir que você obtenha novamente acesso aos seus arquivos criptografados em caso de perda de senha", "Enabled" : "Habilitado", "Disabled" : "Desabilitado", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente" + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo criptografia está ativado, mas as chaves não estão inicializadas. Por favor saia e entre novamente" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/encryption/l10n/pt_BR.json b/apps/encryption/l10n/pt_BR.json index 730b65f9a73..c03061ae608 100644 --- a/apps/encryption/l10n/pt_BR.json +++ b/apps/encryption/l10n/pt_BR.json @@ -1,33 +1,34 @@ { "translations": { - "Missing recovery key password" : "Senha da chave de recuperação em falta", + "Missing recovery key password" : "Está faltando a senha da chave de recuperação", "Please repeat the recovery key password" : "Por favor, repita a senha da chave de recuperação", - "Repeated recovery key password does not match the provided recovery key password" : "A senha repetidas da chave de valorização não corresponde a senha da chave de recuperação prevista", + "Repeated recovery key password does not match the provided recovery key password" : "A senha repetida da chave de recuperação não corresponde a senha da chave de recuperação fornecida", "Recovery key successfully enabled" : "Recuperação de chave habilitada com sucesso", "Could not enable recovery key. Please check your recovery key password!" : "Impossível habilitar recuperação de chave. Por favor, verifique sua senha para recuperação de chave!", "Recovery key successfully disabled" : "Recuperação de chave desabilitada com sucesso", "Could not disable recovery key. Please check your recovery key password!" : "Impossível desabilitar recuperação de chave. Por favor, verifique sua senha para recuperação de chave!", - "Missing parameters" : "Parâmetros que faltam", + "Missing parameters" : "Parâmetros faltantes", "Please provide the old recovery password" : "Por favor, forneça a antiga senha de recuperação", "Please provide a new recovery password" : "Por favor, forneça a nova senha de recuperação", "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", - "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.", + "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estivesse correta.", "Recovery Key disabled" : "Recuperação de chave desativada", "Recovery Key enabled" : "Recuperação de chave ativada", "Could not enable the recovery key, please try again or contact your administrator" : "Não foi possível ativar a recuperação de chave. Tente novamente ou entre em contato com seu administrador", "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", - "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.", - "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor tente novamente.", + "The current log-in password was not correct, please try again." : "A senha atual de acesso não estava correta, por favor tente novamente.", "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Você precisa migrar suas chaves de criptografia a partir da antiga criptografia (ownCloud <= 8,0) para a nova. Por favor, execute 'occ encryption:migrate' ou contate o seu administrador", "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida para o aplicativo de criptografia. Atualize a senha da sua chave privada nas configurações pessoais para recuperar o acesso aos seus arquivos criptografados.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "O aplicativo de criptografia está habilitada mas suas chaves não foram inicializadas. Por favor, saia e entre novamente.", "Encryption app is enabled and ready" : "O aplicativo de criptografia está ativo e pronto", "Bad Signature" : "Assinatura ruim", - "Missing Signature" : "Faltando assinatura", - "one-time password for server-side-encryption" : "senha de uso único para criptografia-lado-servidor", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Por favor, peça ao dono do arquivo para compartilhá-lo com você.", - "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, provavelmente este é um arquivo compartilhado. Por favor, pergunte o dono do arquivo para recompartilhar o arquivo 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 criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha '%s'.\n\nPor favor faça o login para a 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 atual senha-de-login.\n\n", + "Missing Signature" : "Assinatura faltante", + "one-time password for server-side-encryption" : "senha de uso único para criptografia do lado do servidor", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptografado pois provavelmente é um arquivo compartilhado. Por favor, peça ao dono do arquivo para compartilhá-lo com você.", + "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 recompartilhar o arquivo 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 para a 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!" : "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 criptografia-lado-servidor. Os seus arquivos foram criptografados usando a senha <strong>%s</strong>.<br><br>Por favor, faça o login para a 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 atual senha-de-login.<br><br>", @@ -37,9 +38,9 @@ "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ativar essa opção de criptografia para todos os arquivos armazenados no armazenamento principal, caso contrário, apenas arquivos no armazenamento externo serão criptografados", "Enable recovery key" : "Habilitar recuperação de chave", "Disable recovery key" : "Dasabilitar chave de recuperação", - "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de encriptação extra que é utilizada para encriptar arquivos. Ela permite a recuperação de arquivos de um usuário esquecer sua senha.", + "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "A chave de recuperação é uma chave de criptografia extra que é utilizada para criptografar arquivos. Ela permite a recuperação de arquivos se um usuário esquecer a senha.", "Recovery key password" : "Senha da chave de recuperação", - "Repeat recovery key password" : "Repita senha da chave de recuperação", + "Repeat recovery key password" : "Repita a senha da chave de recuperação", "Change recovery key password:" : "Mudar a senha da chave de recuperação:", "Old recovery key password" : "Senha da chave de recuperação antiga", "New recovery key password" : "Nova senha da chave de recuperação", @@ -50,12 +51,12 @@ "Set your old private key password to your current log-in password:" : "Defina a sua antiga senha da chave privada para sua senha de login atual:", " If you don't remember your old password you can ask your administrator to recover your files." : "Se você não se lembra de sua antiga senha você pode pedir ao administrador que recupere seus arquivos.", "Old log-in password" : "Senha antiga de login", - "Current log-in password" : "Senha de login atual", + "Current log-in password" : "Senha atual de login", "Update Private Key Password" : "Atualizar senha de chave privada", "Enable password recovery:" : "Habilitar recuperação de senha:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Ativar essa opção vai permitir que você obtenha novamente acesso aos seus arquivos criptografados em caso de perda de senha", "Enabled" : "Habilitado", "Disabled" : "Desabilitado", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente" + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "O aplicativo criptografia está ativado, mas as chaves não estão inicializadas. Por favor saia e entre novamente" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/encryption/lib/KeyManager.php b/apps/encryption/lib/KeyManager.php index caae154b2d3..32872ae99b3 100644 --- a/apps/encryption/lib/KeyManager.php +++ b/apps/encryption/lib/KeyManager.php @@ -399,6 +399,10 @@ class KeyManager { * @return string */ public function getFileKey($path, $uid) { + if ($uid === '') { + $uid = null; + } + $publicAccess = is_null($uid); $encryptedFileKey = $this->keyStorage->getFileKey($path, $this->fileKeyId, Encryption::ID); if (empty($encryptedFileKey)) { @@ -407,9 +411,16 @@ class KeyManager { if ($this->util->isMasterKeyEnabled()) { $uid = $this->getMasterKeyId(); - } - - if (is_null($uid)) { + $shareKey = $this->getShareKey($path, $uid); + if ($publicAccess) { + $privateKey = $this->getSystemPrivateKey($uid); + $privateKey = $this->crypt->decryptPrivateKey($privateKey, $this->getMasterKeyPassword(), $uid); + } else { + // when logged in, the master key is already decrypted in the session + $privateKey = $this->session->getPrivateKey(); + } + } else if ($publicAccess) { + // use public share key for public links $uid = $this->getPublicShareKeyId(); $shareKey = $this->getShareKey($path, $uid); $privateKey = $this->keyStorage->getSystemUserKey($this->publicShareKeyId . '.privateKey', Encryption::ID); diff --git a/apps/encryption/tests/KeyManagerTest.php b/apps/encryption/tests/KeyManagerTest.php index 40def135816..a8441427a2c 100644 --- a/apps/encryption/tests/KeyManagerTest.php +++ b/apps/encryption/tests/KeyManagerTest.php @@ -349,6 +349,19 @@ class KeyManagerTest extends TestCase { $this->assertTrue($this->instance->getEncryptedFileKey('/')); } + public function dataTestGetFileKey() { + return [ + ['user1', false, 'privateKey', true], + ['user1', false, false, ''], + ['user1', true, 'privateKey', true], + ['user1', true, false, ''], + [null, false, 'privateKey', true], + [null, false, false, ''], + [null, true, 'privateKey', true], + [null, true, false, ''] + ]; + } + /** * @dataProvider dataTestGetFileKey * @@ -363,6 +376,10 @@ class KeyManagerTest extends TestCase { if ($isMasterKeyEnabled) { $expectedUid = 'masterKeyId'; + $this->configMock->expects($this->any())->method('getSystemValue')->with('secret') + ->willReturn('password'); + } else if (!$uid) { + $expectedUid = 'systemKeyId'; } else { $expectedUid = $uid; } @@ -379,6 +396,9 @@ class KeyManagerTest extends TestCase { ->with($path, $expectedUid . '.shareKey', 'OC_DEFAULT_MODULE') ->willReturn(true); + $this->utilMock->expects($this->any())->method('isMasterKeyEnabled') + ->willReturn($isMasterKeyEnabled); + if (is_null($uid)) { $this->keyStorageMock->expects($this->once()) ->method('getSystemUserKey') @@ -389,8 +409,6 @@ class KeyManagerTest extends TestCase { } else { $this->keyStorageMock->expects($this->never()) ->method('getSystemUserKey'); - $this->utilMock->expects($this->once())->method('isMasterKeyEnabled') - ->willReturn($isMasterKeyEnabled); $this->sessionMock->expects($this->once())->method('getPrivateKey')->willReturn($privateKey); } @@ -409,19 +427,6 @@ class KeyManagerTest extends TestCase { } - public function dataTestGetFileKey() { - return [ - ['user1', false, 'privateKey', true], - ['user1', false, false, ''], - ['user1', true, 'privateKey', true], - ['user1', true, false, ''], - ['', false, 'privateKey', true], - ['', false, false, ''], - ['', true, 'privateKey', true], - ['', true, false, ''] - ]; - } - public function testDeletePrivateKey() { $this->keyStorageMock->expects($this->once()) ->method('deleteUserKey') diff --git a/apps/federatedfilesharing/l10n/es_MX.js b/apps/federatedfilesharing/l10n/es_MX.js new file mode 100644 index 00000000000..e1de2d7f6c0 --- /dev/null +++ b/apps/federatedfilesharing/l10n/es_MX.js @@ -0,0 +1,51 @@ +OC.L10N.register( + "federatedfilesharing", + { + "Federated sharing" : "Elementos compartidos federados", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?", + "Remote share" : "Elemento compartido remoto", + "Remote share password" : "Contraseña del elemento compartido remoto", + "Cancel" : "Cancelar", + "Add remote share" : "Agregar elemento compartido remoto", + "Copy" : "Copiar", + "Copied!" : "¡Copiado!", + "Not supported!" : "¡No soportado!", + "Press ⌘-C to copy." : "Presione ⌘-C para copiar.", + "Press Ctrl-C to copy." : "Presione Ctrl-C para copiar.", + "Invalid Federated Cloud ID" : "El ID de la Nube Federada es inválido", + "Server to server sharing is not enabled on this server" : "Compartir de servidor a servidor no está habilitado en este servidor", + "Couldn't establish a federated share." : "No fue posible establecer el elemento compartido federado. ", + "Couldn't establish a federated share, maybe the password was wrong." : "No fue posible establecer el elemento compartido federado, tal vez la contraseña sea incorrecta. ", + "Federated Share request was successful, you will receive a invitation. Check your notifications." : "La solicitud del elemento compatido federado fue exitosa, recibirá una invitación. Verifique sus notificaciones. ", + "The mountpoint name contains invalid characters." : "El nombre del punto de montaje contiene caracteres inválidos.", + "Not allowed to create a federated share with the owner." : "No está permitido crear un elemento compartido federado con el dueño. ", + "Invalid or untrusted SSL certificate" : "Certificado SSL inválido o no confiable", + "Could not authenticate to remote share, password might be wrong" : "No fue posible autenticarse ante el elemento compartido remoto, la contraseña puede estar mal", + "Storage not valid" : "Almacenamiento inválido", + "Federated Share successfully added" : "El Elemento Compartido Federado fue agregado exitosamente", + "Couldn't add remote share" : "No fue posible agregar el elemento compartido remoto", + "Sharing %s failed, because this item is already shared with %s" : "Se presentó una falla al compartir %s, porque este elemento ya se encuentra compartido con %s", + "Not allowed to create a federated share with the same user" : "No está permitido crear un elelmento compartido federado con el mismo usuario", + "File is already shared with %s" : "El archivo ya ha sido compartido con %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Se presentó una falla al compartir %s, no fue posible encontrar %s, tal vez el servidor no está alcanzable o usa un certificado auto-firmado.", + "Could not find share" : "No fue posible encontrar el elemento compartido", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Usted ha recibido \"%3$s\" como un elemento compartido remoto de %1$s (de parte de %2$s)", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Usted ha recibido {share} como un elemento compartido remoto de {user} (de parte de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Usted ha recibido \"%3$s\" como un elemento compartido remoto de %1$s", + "You received {share} as a remote share from {user}" : "Usted recibió {share} como un elemento compartido remoto de {user}", + "Accept" : "Aceptar", + "Decline" : "Rechazar", + "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud, ver %s", + "Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud", + "Open documentation" : "Abrir documentación", + "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" : "Buscar usuarios en las libretas de contactos globales y públicas", + "Federated Cloud" : "Nube Federada", + "Your Federated Cloud ID:" : "Su ID de Nube Federada:", + "Share it:" : "Compartirlo:", + "Add to your website" : "Agregar a su sitio web", + "Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud", + "HTML Code:" : "Código HTML:" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/es_MX.json b/apps/federatedfilesharing/l10n/es_MX.json new file mode 100644 index 00000000000..ac45e4ea77d --- /dev/null +++ b/apps/federatedfilesharing/l10n/es_MX.json @@ -0,0 +1,49 @@ +{ "translations": { + "Federated sharing" : "Elementos compartidos federados", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?", + "Remote share" : "Elemento compartido remoto", + "Remote share password" : "Contraseña del elemento compartido remoto", + "Cancel" : "Cancelar", + "Add remote share" : "Agregar elemento compartido remoto", + "Copy" : "Copiar", + "Copied!" : "¡Copiado!", + "Not supported!" : "¡No soportado!", + "Press ⌘-C to copy." : "Presione ⌘-C para copiar.", + "Press Ctrl-C to copy." : "Presione Ctrl-C para copiar.", + "Invalid Federated Cloud ID" : "El ID de la Nube Federada es inválido", + "Server to server sharing is not enabled on this server" : "Compartir de servidor a servidor no está habilitado en este servidor", + "Couldn't establish a federated share." : "No fue posible establecer el elemento compartido federado. ", + "Couldn't establish a federated share, maybe the password was wrong." : "No fue posible establecer el elemento compartido federado, tal vez la contraseña sea incorrecta. ", + "Federated Share request was successful, you will receive a invitation. Check your notifications." : "La solicitud del elemento compatido federado fue exitosa, recibirá una invitación. Verifique sus notificaciones. ", + "The mountpoint name contains invalid characters." : "El nombre del punto de montaje contiene caracteres inválidos.", + "Not allowed to create a federated share with the owner." : "No está permitido crear un elemento compartido federado con el dueño. ", + "Invalid or untrusted SSL certificate" : "Certificado SSL inválido o no confiable", + "Could not authenticate to remote share, password might be wrong" : "No fue posible autenticarse ante el elemento compartido remoto, la contraseña puede estar mal", + "Storage not valid" : "Almacenamiento inválido", + "Federated Share successfully added" : "El Elemento Compartido Federado fue agregado exitosamente", + "Couldn't add remote share" : "No fue posible agregar el elemento compartido remoto", + "Sharing %s failed, because this item is already shared with %s" : "Se presentó una falla al compartir %s, porque este elemento ya se encuentra compartido con %s", + "Not allowed to create a federated share with the same user" : "No está permitido crear un elelmento compartido federado con el mismo usuario", + "File is already shared with %s" : "El archivo ya ha sido compartido con %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable or uses a self-signed certificate." : "Se presentó una falla al compartir %s, no fue posible encontrar %s, tal vez el servidor no está alcanzable o usa un certificado auto-firmado.", + "Could not find share" : "No fue posible encontrar el elemento compartido", + "You received \"%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Usted ha recibido \"%3$s\" como un elemento compartido remoto de %1$s (de parte de %2$s)", + "You received {share} as a remote share from {user} (on behalf of {behalf})" : "Usted ha recibido {share} como un elemento compartido remoto de {user} (de parte de {behalf})", + "You received \"%3$s\" as a remote share from %1$s" : "Usted ha recibido \"%3$s\" como un elemento compartido remoto de %1$s", + "You received {share} as a remote share from {user}" : "Usted recibió {share} como un elemento compartido remoto de {user}", + "Accept" : "Aceptar", + "Decline" : "Rechazar", + "Share with me through my #Nextcloud Federated Cloud ID, see %s" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud, ver %s", + "Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud", + "Open documentation" : "Abrir documentación", + "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" : "Buscar usuarios en las libretas de contactos globales y públicas", + "Federated Cloud" : "Nube Federada", + "Your Federated Cloud ID:" : "Su ID de Nube Federada:", + "Share it:" : "Compartirlo:", + "Add to your website" : "Agregar a su sitio web", + "Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud", + "HTML Code:" : "Código HTML:" +},"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 9ef9074e984..6b0ed8caab4 100644 --- a/apps/federatedfilesharing/l10n/nl.js +++ b/apps/federatedfilesharing/l10n/nl.js @@ -13,7 +13,7 @@ OC.L10N.register( "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", "Press Ctrl-C to copy." : "Druk op Ctrl-C om te kopiëren.", "Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID", - "Server to server sharing is not enabled on this server" : "Server met server delen is op deze server niet geactiveerd", + "Server to server sharing is not enabled on this server" : "Server met server delen is op deze server niet ingeschakeld", "Couldn't establish a federated share." : "Kon geen gefedereerde share tot stand brengen", "Couldn't establish a federated share, maybe the password was wrong." : "Kon geen gefedereerde share tot stand brengen, misschien was het wachtwoord onjuist.", "Federated Share request was successful, you will receive a invitation. Check your notifications." : "De gefedereerde share aanvraag is geslaagd, je ontvangt een uitnodiging. Controleer je meldingen.", diff --git a/apps/federatedfilesharing/l10n/nl.json b/apps/federatedfilesharing/l10n/nl.json index 73a6b042aee..de993851166 100644 --- a/apps/federatedfilesharing/l10n/nl.json +++ b/apps/federatedfilesharing/l10n/nl.json @@ -11,7 +11,7 @@ "Press ⌘-C to copy." : "Druk op ⌘-C om te kopiëren.", "Press Ctrl-C to copy." : "Druk op Ctrl-C om te kopiëren.", "Invalid Federated Cloud ID" : "Ongeldige Federated Cloud ID", - "Server to server sharing is not enabled on this server" : "Server met server delen is op deze server niet geactiveerd", + "Server to server sharing is not enabled on this server" : "Server met server delen is op deze server niet ingeschakeld", "Couldn't establish a federated share." : "Kon geen gefedereerde share tot stand brengen", "Couldn't establish a federated share, maybe the password was wrong." : "Kon geen gefedereerde share tot stand brengen, misschien was het wachtwoord onjuist.", "Federated Share request was successful, you will receive a invitation. Check your notifications." : "De gefedereerde share aanvraag is geslaagd, je ontvangt een uitnodiging. Controleer je meldingen.", diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php index fb49978b7af..9063bbf7450 100644 --- a/apps/federatedfilesharing/lib/FederatedShareProvider.php +++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php @@ -941,7 +941,7 @@ class FederatedShareProvider implements IShareProvider { */ public function isOutgoingServer2serverShareEnabled() { $result = $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes'); - return ($result === 'yes') ? true : false; + return ($result === 'yes'); } /** @@ -951,7 +951,7 @@ class FederatedShareProvider implements IShareProvider { */ public function isIncomingServer2serverShareEnabled() { $result = $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes'); - return ($result === 'yes') ? true : false; + return ($result === 'yes'); } /** @@ -961,6 +961,17 @@ class FederatedShareProvider implements IShareProvider { */ public function isLookupServerQueriesEnabled() { $result = $this->config->getAppValue('files_sharing', 'lookupServerEnabled', 'no'); - return ($result === 'yes') ? true : false; + return ($result === 'yes'); + } + + + /** + * Check if it is allowed to publish user specific data to the lookup server + * + * @return bool + */ + public function isLookupServerUploadEnabled() { + $result = $this->config->getAppValue('files_sharing', 'lookupServerUploadEnabled', 'yes'); + return ($result === 'yes'); } } diff --git a/apps/federatedfilesharing/lib/Settings/Admin.php b/apps/federatedfilesharing/lib/Settings/Admin.php index 20ff6ae6f4a..baac4b1086f 100644 --- a/apps/federatedfilesharing/lib/Settings/Admin.php +++ b/apps/federatedfilesharing/lib/Settings/Admin.php @@ -44,6 +44,7 @@ class Admin implements ISettings { 'outgoingServer2serverShareEnabled' => $this->fedShareProvider->isOutgoingServer2serverShareEnabled(), 'incomingServer2serverShareEnabled' => $this->fedShareProvider->isIncomingServer2serverShareEnabled(), 'lookupServerEnabled' => $this->fedShareProvider->isLookupServerQueriesEnabled(), + 'lookupServerUploadEnabled' => $this->fedShareProvider->isLookupServerUploadEnabled(), ]; return new TemplateResponse('federatedfilesharing', 'settings-admin', $parameters, ''); diff --git a/apps/federatedfilesharing/templates/settings-admin.php b/apps/federatedfilesharing/templates/settings-admin.php index d71ce20d13c..b60ff1083b0 100644 --- a/apps/federatedfilesharing/templates/settings-admin.php +++ b/apps/federatedfilesharing/templates/settings-admin.php @@ -29,7 +29,15 @@ script('federatedfilesharing', 'settings-admin'); <input type="checkbox" name="lookupServerEnabled" id="lookupServerEnabled" class="checkbox" value="1" <?php if ($_['lookupServerEnabled']) print_unescaped('checked="checked"'); ?> /> <label for="lookupServerEnabled"> - <?php p($l->t('Search global and public address book for users'));?> + <?php p($l->t('Search global and public address book for users and let local users publish their data'));?> </label><br/> </p> + <p> + <input type="checkbox" name="lookupServerUploadEnabled" id="lookupServerUploadEnabled" class="checkbox" + value="1" <?php if ($_['lookupServerUploadEnabled']) print_unescaped('checked="checked"'); ?> /> + <label for="lookupServerUploadEnabled"> + <?php p($l->t('Allow users to publish their data to a global and public address book'));?> + </label><br/> + </p> + </div> diff --git a/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php b/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php index 61f87e9ec67..233395dec9f 100644 --- a/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php +++ b/apps/federatedfilesharing/tests/Controller/RequestHandlerControllerTest.php @@ -67,7 +67,7 @@ class RequestHandlerControllerTest extends TestCase { /** @var \OCA\FederatedFileSharing\AddressHandler|\PHPUnit_Framework_MockObject_MockObject */ private $addressHandler; - + /** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */ private $userManager; @@ -107,7 +107,7 @@ class RequestHandlerControllerTest extends TestCase { $this->userManager = $this->getMockBuilder('OCP\IUserManager')->getMock(); $this->cloudIdManager = new CloudIdManager(); - + $this->registerHttpHelper($httpHelperMock); $this->s2s = new RequestHandlerController( @@ -384,6 +384,7 @@ class RequestHandlerControllerTest extends TestCase { 'parent' => null, 'accepted' => '0', 'expiration' => null, + 'password' => null, 'mail_send' => '0' ]; diff --git a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php index 97d8ccd65c3..d9bc9a7e2ad 100644 --- a/apps/federatedfilesharing/tests/FederatedShareProviderTest.php +++ b/apps/federatedfilesharing/tests/FederatedShareProviderTest.php @@ -705,6 +705,38 @@ class FederatedShareProviderTest extends \Test\TestCase { ); } + /** + * @dataProvider dataTestFederatedSharingSettings + * + * @param string $isEnabled + * @param bool $expected + */ + public function testIsLookupServerQueriesEnabled($isEnabled, $expected) { + $this->config->expects($this->once())->method('getAppValue') + ->with('files_sharing', 'lookupServerEnabled', 'no') + ->willReturn($isEnabled); + + $this->assertSame($expected, + $this->provider->isLookupServerQueriesEnabled() + ); + } + + /** + * @dataProvider dataTestFederatedSharingSettings + * + * @param string $isEnabled + * @param bool $expected + */ + public function testIsLookupServerUploadEnabled($isEnabled, $expected) { + $this->config->expects($this->once())->method('getAppValue') + ->with('files_sharing', 'lookupServerUploadEnabled', 'yes') + ->willReturn($isEnabled); + + $this->assertSame($expected, + $this->provider->isLookupServerUploadEnabled() + ); + } + public function dataTestFederatedSharingSettings() { return [ ['yes', true], diff --git a/apps/federatedfilesharing/tests/Settings/AdminTest.php b/apps/federatedfilesharing/tests/Settings/AdminTest.php index c0b35a6427b..9eae6317bf7 100644 --- a/apps/federatedfilesharing/tests/Settings/AdminTest.php +++ b/apps/federatedfilesharing/tests/Settings/AdminTest.php @@ -69,11 +69,16 @@ class AdminTest extends TestCase { ->expects($this->once()) ->method('isLookupServerQueriesEnabled') ->willReturn($state); + $this->federatedShareProvider + ->expects($this->once()) + ->method('isLookupServerUploadEnabled') + ->willReturn($state); $params = [ 'outgoingServer2serverShareEnabled' => $state, 'incomingServer2serverShareEnabled' => $state, 'lookupServerEnabled' => $state, + 'lookupServerUploadEnabled' => $state ]; $expected = new TemplateResponse('federatedfilesharing', 'settings-admin', $params, ''); $this->assertEquals($expected, $this->admin->getForm()); diff --git a/apps/federation/l10n/es_MX.js b/apps/federation/l10n/es_MX.js index affca49c911..d14f9937f73 100644 --- a/apps/federation/l10n/es_MX.js +++ b/apps/federation/l10n/es_MX.js @@ -4,10 +4,10 @@ OC.L10N.register( "Added to the list of trusted servers" : "Agregado a la lista de servidores de confianza", "Server is already in the list of trusted servers." : "El servidor ya se encuentra en la lista de servidores de confianza.", "No server to federate with found" : "No se encontraron servidores para integrar a la federación", - "Could not add server" : "No se pudo agregar el servidor", + "Could not add server" : "No fue posible agregar el servidor", "Federation" : "Federación", "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se usará para auto-completar usuarios externos en el recurso compartido federado.", - "Add server automatically once a federated share was created successfully" : "Agregar el servidor automáticamente una vez que se genere exitosamente el recurso compartido federado", + "Add server automatically once a federated share was created successfully" : "Agregar el servidor automáticamente una vez que se genere exitosamente el elemento compartido federado", "Trusted servers" : "Servidores de confianza", "+ Add trusted server" : "+ Agregar servidor de confianza", "Trusted server" : "Servidor de confianza", diff --git a/apps/federation/l10n/es_MX.json b/apps/federation/l10n/es_MX.json index 15c3ab8e038..386e85dcffd 100644 --- a/apps/federation/l10n/es_MX.json +++ b/apps/federation/l10n/es_MX.json @@ -2,10 +2,10 @@ "Added to the list of trusted servers" : "Agregado a la lista de servidores de confianza", "Server is already in the list of trusted servers." : "El servidor ya se encuentra en la lista de servidores de confianza.", "No server to federate with found" : "No se encontraron servidores para integrar a la federación", - "Could not add server" : "No se pudo agregar el servidor", + "Could not add server" : "No fue posible agregar el servidor", "Federation" : "Federación", "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "La federación le permite conectarse con otros servidores de confianza para intercambiar el directorio de usuarios. Por ejemplo, esto se usará para auto-completar usuarios externos en el recurso compartido federado.", - "Add server automatically once a federated share was created successfully" : "Agregar el servidor automáticamente una vez que se genere exitosamente el recurso compartido federado", + "Add server automatically once a federated share was created successfully" : "Agregar el servidor automáticamente una vez que se genere exitosamente el elemento compartido federado", "Trusted servers" : "Servidores de confianza", "+ Add trusted server" : "+ Agregar servidor de confianza", "Trusted server" : "Servidor de confianza", diff --git a/apps/federation/l10n/is.js b/apps/federation/l10n/is.js index 1b20d2a74e5..a2fb6474ecc 100644 --- a/apps/federation/l10n/is.js +++ b/apps/federation/l10n/is.js @@ -6,7 +6,7 @@ OC.L10N.register( "No server to federate with found" : "Enginn þjónn sem hæfur er til skýjasambands fannst", "Could not add server" : "Gat ekki bætt við þjóni", "Federation" : "Samband", - "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Þjónasamband (federation) gerir þér kleift að tengjast öðrumtreystum skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.", + "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Þjónasamband (federation) gerir þér kleift að tengjast öðrum treystum skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.", "Add server automatically once a federated share was created successfully" : "Bæta þjóni við sjálfkrafa, hafi tekist að búa til sambandssameign", "Trusted servers" : "Treystir þjónar", "+ Add trusted server" : "+ Bæta við treystum þjóni", diff --git a/apps/federation/l10n/is.json b/apps/federation/l10n/is.json index e02867bfaf0..4d6979b9ba9 100644 --- a/apps/federation/l10n/is.json +++ b/apps/federation/l10n/is.json @@ -4,7 +4,7 @@ "No server to federate with found" : "Enginn þjónn sem hæfur er til skýjasambands fannst", "Could not add server" : "Gat ekki bætt við þjóni", "Federation" : "Samband", - "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Þjónasamband (federation) gerir þér kleift að tengjast öðrumtreystum skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.", + "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Þjónasamband (federation) gerir þér kleift að tengjast öðrum treystum skýjum til að skiptast á notendaskrám. Þetta er til dæmis notað til að sjálfklára nöfn ytri notenda við deilingu sambandssameigna.", "Add server automatically once a federated share was created successfully" : "Bæta þjóni við sjálfkrafa, hafi tekist að búa til sambandssameign", "Trusted servers" : "Treystir þjónar", "+ Add trusted server" : "+ Bæta við treystum þjóni", diff --git a/apps/federation/l10n/pt_BR.js b/apps/federation/l10n/pt_BR.js index d46445b85f1..7684b1cb009 100644 --- a/apps/federation/l10n/pt_BR.js +++ b/apps/federation/l10n/pt_BR.js @@ -5,7 +5,7 @@ OC.L10N.register( "Server is already in the list of trusted servers." : "O servidor já está na lista de servidores confiáveis.", "No server to federate with found" : "Nenhum servidor para associar com o encontrado", "Could not add server" : "Não foi possível adicionar servidor", - "Federation" : "Associação", + "Federation" : "Federação", "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federação permite que você conecte com outros servidores confiáveis para trocar o diretório do usuário. Por exemplo, este atributo será usado para completar automaticamente usuários externos para compartilhamento federado.", "Add server automatically once a federated share was created successfully" : "Adicionar servidor automaticamente uma vez que um compartilhamento associado foi criado com êxito", "Trusted servers" : "Servidores confiáveis", diff --git a/apps/federation/l10n/pt_BR.json b/apps/federation/l10n/pt_BR.json index dc4f2eadb92..c5887d8f6a3 100644 --- a/apps/federation/l10n/pt_BR.json +++ b/apps/federation/l10n/pt_BR.json @@ -3,7 +3,7 @@ "Server is already in the list of trusted servers." : "O servidor já está na lista de servidores confiáveis.", "No server to federate with found" : "Nenhum servidor para associar com o encontrado", "Could not add server" : "Não foi possível adicionar servidor", - "Federation" : "Associação", + "Federation" : "Federação", "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federação permite que você conecte com outros servidores confiáveis para trocar o diretório do usuário. Por exemplo, este atributo será usado para completar automaticamente usuários externos para compartilhamento federado.", "Add server automatically once a federated share was created successfully" : "Adicionar servidor automaticamente uma vez que um compartilhamento associado foi criado com êxito", "Trusted servers" : "Servidores confiáveis", diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index ad4d03a1bdb..75d9d0ebdfc 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -537,7 +537,8 @@ OC.Uploader.prototype = _.extend({ getUpload: function(data) { if (_.isString(data)) { return this._uploads[data]; - } else if (data.uploadId) { + } else if (data.uploadId && this._uploads[data.uploadId]) { + this._uploads[data.uploadId].data = data; return this._uploads[data.uploadId]; } return null; @@ -960,6 +961,7 @@ OC.Uploader.prototype = _.extend({ var bufferSize = 20; var buffer = []; var bufferIndex = 0; + var bufferIndex2 = 0; var bufferTotal = 0; for(var i = 0; i < bufferSize;i++){ buffer[i] = 0; @@ -1005,8 +1007,17 @@ OC.Uploader.prototype = _.extend({ bufferTotal = bufferTotal - (buffer[bufferIndex]) + remainingSeconds; buffer[bufferIndex] = remainingSeconds; //buffer to make it smoother bufferIndex = (bufferIndex + 1) % bufferSize; + bufferIndex2++; } - var smoothRemainingSeconds = (bufferTotal / bufferSize); //seconds + var smoothRemainingSeconds; + if (bufferIndex2 > 0 && bufferIndex2 < 20) { + smoothRemainingSeconds = bufferTotal / bufferIndex2; + } else if (bufferSize > 0) { + smoothRemainingSeconds = bufferTotal / bufferSize; + } else { + smoothRemainingSeconds = 1; + } + var h = moment.duration(smoothRemainingSeconds, "seconds").humanize(); $('#uploadprogressbar .label .mobile').text(h); $('#uploadprogressbar .label .desktop').text(h); diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index b4d7c160ed7..9639fc176c3 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -7,13 +7,13 @@ OC.L10N.register( "All files" : "Todos los archivos", "Recent" : "Reciente", "File could not be found" : "No fue posible encontrar el archivo", - "Home" : "Particular", + "Home" : "Inicio", "Close" : "Cerrar", "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"", "Upload cancelled." : "Carga cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero solo cuenta con {size2} disponible", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero sólo cuenta con {size2} disponible", "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe", "Not enough free space" : "No cuenta con suficiente espacio disponible", "Uploading..." : "Cargando...", @@ -75,9 +75,9 @@ OC.L10N.register( "Upload" : "Cargar", "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta", "Added to favorites" : "Agregado a los favoritos", - "Removed from favorites" : "Quitado de los favoritos", + "Removed from favorites" : "Eliminado de los favoritos", "You added {file} to your favorites" : "Usted agregó {file} a sus favoritos", - "You removed {file} from your favorites" : "Usted quitó {file} de sus favoritos", + "You removed {file} from your favorites" : "Usted eliminó {file} de sus favoritos", "File changes" : "Cambios al archivo", "Created by {user}" : "Creado por {user}", "Changed by {user}" : "Cambiado por {user}", @@ -102,7 +102,7 @@ OC.L10N.register( "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado </strong> o <strong>renombrado</strong>", "A new file or folder has been <strong>created</strong>" : "Un nuevo archivo ha sido <strong>creado</strong>", "A new file or folder has been <strong>deleted</strong>" : "Un nuevo archivo ha sido <strong>borrado</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite las notificación de la creación y cambios a sus <strong>archivos favoritos</strong> <em>(solo flujo)</em>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite las notificación de la creación y cambios a sus <strong>archivos favoritos</strong> <em>(sólo flujo)</em>", "A new file or folder has been <strong>restored</strong>" : "Un nuevo archivo ha sido <strong>restaurado</strong>", "Upload (max. %s)" : "Cargar (max. %s)", "File handling" : "Administración de archivos", @@ -126,6 +126,7 @@ OC.L10N.register( "Shared with you" : "Compartido con usted", "Shared with others" : "Compartido con otros", "Shared by link" : "Compartido por liga", + "Tags" : "Etiquetas", "Deleted files" : "Archivos borrados", "Text file" : "Archivo de texto", "New text file.txt" : "Nuevo ArchivoDeTexto.txt", diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index 921886af132..c570d6825b9 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -5,13 +5,13 @@ "All files" : "Todos los archivos", "Recent" : "Reciente", "File could not be found" : "No fue posible encontrar el archivo", - "Home" : "Particular", + "Home" : "Inicio", "Close" : "Cerrar", "Favorites" : "Favoritos", "Could not create folder \"{dir}\"" : "No fue posible crear la carpeta \"{dir}\"", "Upload cancelled." : "Carga cancelada.", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No fue posible cargar {filename} ya que es una carpeta o tiene un tamaño de 0 bytes", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero solo cuenta con {size2} disponible", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "No cuenta con suficiente espacio disponible, usted se encuentra cargando {size1} pero sólo cuenta con {size2} disponible", "Target folder \"{dir}\" does not exist any more" : "La carpeta destino \"{dir}\" ya no existe", "Not enough free space" : "No cuenta con suficiente espacio disponible", "Uploading..." : "Cargando...", @@ -73,9 +73,9 @@ "Upload" : "Cargar", "An error occurred while trying to update the tags" : "Se presentó un error al intentar actualizar la etiqueta", "Added to favorites" : "Agregado a los favoritos", - "Removed from favorites" : "Quitado de los favoritos", + "Removed from favorites" : "Eliminado de los favoritos", "You added {file} to your favorites" : "Usted agregó {file} a sus favoritos", - "You removed {file} from your favorites" : "Usted quitó {file} de sus favoritos", + "You removed {file} from your favorites" : "Usted eliminó {file} de sus favoritos", "File changes" : "Cambios al archivo", "Created by {user}" : "Creado por {user}", "Changed by {user}" : "Cambiado por {user}", @@ -100,7 +100,7 @@ "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Un archivo o carpeta ha sido <strong>cambiado </strong> o <strong>renombrado</strong>", "A new file or folder has been <strong>created</strong>" : "Un nuevo archivo ha sido <strong>creado</strong>", "A new file or folder has been <strong>deleted</strong>" : "Un nuevo archivo ha sido <strong>borrado</strong>", - "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite las notificación de la creación y cambios a sus <strong>archivos favoritos</strong> <em>(solo flujo)</em>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limite las notificación de la creación y cambios a sus <strong>archivos favoritos</strong> <em>(sólo flujo)</em>", "A new file or folder has been <strong>restored</strong>" : "Un nuevo archivo ha sido <strong>restaurado</strong>", "Upload (max. %s)" : "Cargar (max. %s)", "File handling" : "Administración de archivos", @@ -124,6 +124,7 @@ "Shared with you" : "Compartido con usted", "Shared with others" : "Compartido con otros", "Shared by link" : "Compartido por liga", + "Tags" : "Etiquetas", "Deleted files" : "Archivos borrados", "Text file" : "Archivo de texto", "New text file.txt" : "Nuevo ArchivoDeTexto.txt", diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js index 17e907f2786..fb96936ff44 100644 --- a/apps/files/l10n/fi.js +++ b/apps/files/l10n/fi.js @@ -6,7 +6,7 @@ OC.L10N.register( "Unknown error" : "Tuntematon virhe", "All files" : "Kaikki tiedostot", "Recent" : "Viimeaikaiset", - "File could not be found" : "TIedostoa ei löytynyt", + "File could not be found" : "Tiedostoa ei löytynyt", "Home" : "Koti", "Close" : "Sulje", "Favorites" : "Suosikit", @@ -27,6 +27,7 @@ OC.L10N.register( "Delete" : "Poista", "Disconnect storage" : "Katkaise yhteys tallennustilaan", "Unshare" : "Peru jakaminen", + "Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja", "Files" : "Tiedostot", "Details" : "Tiedot", "Select" : "Valitse", @@ -57,6 +58,7 @@ OC.L10N.register( "New" : "Uusi", "\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.", "File name cannot be empty." : "Tiedoston nimi ei voi olla tyhjä.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" ei ole sallittu tiedostomuoto", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!", "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Käyttäjän {owner} tallennustila on melkein täynnä ({usedSpacePercent} %)", @@ -77,6 +79,12 @@ OC.L10N.register( "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin", "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista", "File changes" : "Tiedostomuutokset", + "Created by {user}" : "Tekijänä {user}", + "Changed by {user}" : "Muokkaajana {user}", + "Deleted by {user}" : "Poistanut {user}", + "Restored by {user}" : "Palauttanut {user}", + "Renamed by {user}" : "Uudelleennimennyt {user}", + "Moved by {user}" : "Siirtänyt {user}", "You created {file}" : "Loit tiedoston {file}", "{user} created {file}" : "{user} loi tiedoston {file}", "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa", diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json index 94596d6b91b..59c47112731 100644 --- a/apps/files/l10n/fi.json +++ b/apps/files/l10n/fi.json @@ -4,7 +4,7 @@ "Unknown error" : "Tuntematon virhe", "All files" : "Kaikki tiedostot", "Recent" : "Viimeaikaiset", - "File could not be found" : "TIedostoa ei löytynyt", + "File could not be found" : "Tiedostoa ei löytynyt", "Home" : "Koti", "Close" : "Sulje", "Favorites" : "Suosikit", @@ -25,6 +25,7 @@ "Delete" : "Poista", "Disconnect storage" : "Katkaise yhteys tallennustilaan", "Unshare" : "Peru jakaminen", + "Could not load info for file \"{file}\"" : "Ei voida ladata tiedoston \"{file}\" tietoja", "Files" : "Tiedostot", "Details" : "Tiedot", "Select" : "Valitse", @@ -55,6 +56,7 @@ "New" : "Uusi", "\"{name}\" is an invalid file name." : "\"{name}\" on virheellinen tiedostonimi.", "File name cannot be empty." : "Tiedoston nimi ei voi olla tyhjä.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" ei ole sallittu tiedostomuoto", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Käyttäjän {owner} tallennustila on täynnä, tiedostoja ei voi enää päivittää tai synkronoida!", "Your storage is full, files can not be updated or synced anymore!" : "Tallennustila on loppu, tiedostoja ei voi enää päivittää tai synkronoida!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Käyttäjän {owner} tallennustila on melkein täynnä ({usedSpacePercent} %)", @@ -75,6 +77,12 @@ "You added {file} to your favorites" : "Lisäsit tiedoston {file} suosikkeihin", "You removed {file} from your favorites" : "Poistit tiedoston {file} suosikeista", "File changes" : "Tiedostomuutokset", + "Created by {user}" : "Tekijänä {user}", + "Changed by {user}" : "Muokkaajana {user}", + "Deleted by {user}" : "Poistanut {user}", + "Restored by {user}" : "Palauttanut {user}", + "Renamed by {user}" : "Uudelleennimennyt {user}", + "Moved by {user}" : "Siirtänyt {user}", "You created {file}" : "Loit tiedoston {file}", "{user} created {file}" : "{user} loi tiedoston {file}", "{file} was created in a public folder" : "Tiedosto {file} luotiin julkisessa kansiossa", diff --git a/apps/files/l10n/hu.js b/apps/files/l10n/hu.js index 7d93ff59ec4..9c8ad41159a 100644 --- a/apps/files/l10n/hu.js +++ b/apps/files/l10n/hu.js @@ -45,6 +45,7 @@ OC.L10N.register( "Could not create file \"{file}\" because it already exists" : "{file} fájl nem létrehozható, mert már létezik", "Could not create folder \"{dir}\" because it already exists" : "{dir} mappa nem hozható létre, mert már létezik", "Error deleting file \"{fileName}\"." : "Hiba történt {fileName} fájl törlése közben.", + "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek keresési eredmények más mappákban: {tag}{filter}{endtag}", "Name" : "Név", "Size" : "Méret", "Modified" : "Módosítva", @@ -57,6 +58,7 @@ OC.L10N.register( "New" : "Új", "\"{name}\" is an invalid file name." : "\"{name}\" érvénytelen, mint fájlnév.", "File name cannot be empty." : "A fájlnév nem lehet semmi.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" nem engedélyetett fájltípus", "Storage of {owner} is full, files can not be updated or synced anymore!" : "A {owner} felhasználó tárolója betelt, a fájlok nem frissíthetők és szinkronizálhatók többet!", "Your storage is full, files can not be updated or synced anymore!" : "A tároló tele van, a fájlok nem frissíthetőek vagy szinkronizálhatóak a jövőben.", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "A {owner} felhasználó tárolója majdnem betelt ({usedSpacePercent}%)", diff --git a/apps/files/l10n/hu.json b/apps/files/l10n/hu.json index 06cefdf3a4e..edad01f94bf 100644 --- a/apps/files/l10n/hu.json +++ b/apps/files/l10n/hu.json @@ -43,6 +43,7 @@ "Could not create file \"{file}\" because it already exists" : "{file} fájl nem létrehozható, mert már létezik", "Could not create folder \"{dir}\" because it already exists" : "{dir} mappa nem hozható létre, mert már létezik", "Error deleting file \"{fileName}\"." : "Hiba történt {fileName} fájl törlése közben.", + "No search results in other folders for {tag}{filter}{endtag}" : "Ehhez nincsenek keresési eredmények más mappákban: {tag}{filter}{endtag}", "Name" : "Név", "Size" : "Méret", "Modified" : "Módosítva", @@ -55,6 +56,7 @@ "New" : "Új", "\"{name}\" is an invalid file name." : "\"{name}\" érvénytelen, mint fájlnév.", "File name cannot be empty." : "A fájlnév nem lehet semmi.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" nem engedélyetett fájltípus", "Storage of {owner} is full, files can not be updated or synced anymore!" : "A {owner} felhasználó tárolója betelt, a fájlok nem frissíthetők és szinkronizálhatók többet!", "Your storage is full, files can not be updated or synced anymore!" : "A tároló tele van, a fájlok nem frissíthetőek vagy szinkronizálhatóak a jövőben.", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "A {owner} felhasználó tárolója majdnem betelt ({usedSpacePercent}%)", diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 6d92e6f2cc7..6560efafd9f 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -122,7 +122,7 @@ OC.L10N.register( "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", "No favorites" : "Engin eftirlæti", - "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem uppáhald birtast hér", + "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér", "Shared with you" : "Deilt með þér", "Shared with others" : "Deilt með öðrum", "Shared by link" : "Deilt með tengli", diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index 4abd99b106d..fc6e431d87b 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -120,7 +120,7 @@ "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", "No favorites" : "Engin eftirlæti", - "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem uppáhald birtast hér", + "Files and folders you mark as favorite will show up here" : "Skrár og möppur sem þú merkir sem eftirlæti birtast hér", "Shared with you" : "Deilt með þér", "Shared with others" : "Deilt með öðrum", "Shared by link" : "Deilt með tengli", diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 9fa3a0fdfaa..06669c9f94d 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -1,50 +1,143 @@ OC.L10N.register( "files", { + "Storage is temporarily not available" : "Späicherplaatz temporär net erreeschbar", + "Storage invalid" : "Späicherplatz net gülteg", "Unknown error" : "Et ass en onbekannte Fehler opgetrueden", - "There is no error, the file uploaded with success" : "Keen Feeler, Datei ass komplett ropgelueden ginn", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass", - "The uploaded file was only partially uploaded" : "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn", - "No file was uploaded" : "Et ass kee Fichier ropgeluede ginn", - "Missing a temporary folder" : "Et feelt en temporären Dossier", - "Failed to write to disk" : "Konnt net op den Disk schreiwen", - "Files" : "Dateien", "All files" : "All d'Fichieren", + "Recent" : "Rezent", + "File could not be found" : "Datei konnt net fonnt ginn", "Home" : "Doheem", "Close" : "Zoumaachen", "Favorites" : "Favoriten", + "Could not create folder \"{dir}\"" : "Dossier \"{dir}\" konnt net erstallt ginn", "Upload cancelled." : "Upload ofgebrach.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} konnt eropgelueden ginn, well et een Dossier ass oder d'Datei 0 Bytes huet", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Net genuch Späicher, du probéiers {size1} eropzelueden, et ass awer nëmmen méi {size2} fräi", + "Target folder \"{dir}\" does not exist any more" : "Den Dossier \"{dir}\" existéiert net méi", + "Not enough free space" : "Nët genuch Späicherplaatz", "Uploading..." : "Lueden erop...", "..." : "...", - "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} vun {totalSize} ({bitrate})", + "Actions" : "Aktiounen", "Download" : "Download", "Rename" : "Ëmbenennen", + "Move" : "Verschieben", + "Target folder" : "Ziel Dossier", "Delete" : "Läschen", + "Disconnect storage" : "Net connectéierten Späicher", "Unshare" : "Net méi deelen", + "Could not load info for file \"{file}\"" : "Et konnten keng Informatiounen zu {file} gelueden ginn", + "Files" : "Dateien", "Details" : "Detailer", "Select" : "Auswielen", + "Pending" : "Ausstoend", + "Unable to determine date" : "Datum kann net festgestallt ginn", "This operation is forbidden" : "Dës Operatioun ass verbueden.", "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur", + "Could not move \"{file}\", target exists" : "\"{file}\" konnt beweegt ginn. Et existéiert do schonn.", + "Could not move \"{file}\"" : "\"{file}\" konnt verreckelt ginn", + "{newName} already exists" : "{newName} gett et schon", + "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnt embenannt ginn, well et net méi existéiert", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" konnt net gesat ginn, well dësen schon am Dossier \"{dir}\" existéiert. Wiel weg. een aaneren", + "Could not rename \"{fileName}\"" : "\"{fileName}\" konnt net embenannt ginn", + "Could not create file \"{file}\"" : "\"{file}\" konnt net erstallt ginn", + "Could not create file \"{file}\" because it already exists" : "\"{file}\" konnt net erstallt ginn, well des schon existéiert", + "Could not create folder \"{dir}\" because it already exists" : "Den Dossier \"{dir}\" konnt net erstallt ginn, well desen schon existéiert", + "Error deleting file \"{fileName}\"." : "Fehler beim läschen vun \"{fileName}\".", + "No search results in other folders for {tag}{filter}{endtag}" : "Keng Resultater an aneren Dossieren fir {tag}{filter}{endtag} fonnt", "Name" : "Numm", "Size" : "Gréisst", "Modified" : "Geännert", + "_%n folder_::_%n folders_" : ["¦%n Dossier","¦%n Dossieren"], + "_%n file_::_%n files_" : ["¦%n Datei","¦%n Dateien"], + "{dirs} and {files}" : "{dirs} an {files}", + "_including %n hidden_::_including %n hidden_" : ["Beinhaltet ¦%n verstoppte Saach","Beinhaltet ¦%n verstoppte Saachen"], + "You don’t have permission to upload or create files here" : "Du hues net genuch Rechter hei Dokumenter eropzelueden oder ze erstellen", + "_Uploading %n file_::_Uploading %n files_" : ["Am Gaangen ¦%n Datei eropzelueden","Am Gaangen ¦%n Dateien eropzelueden"], "New" : "Nei", - "\"{name}\" is an invalid file name." : "\"{Numm}\" ass een ongültegen Numm fir e Fichier.", - "File name cannot be empty." : "Den Numm vum Fichier kann net eidel sinn.", + "\"{name}\" is an invalid file name." : "\"{name}\" ass een ongültegen Numm", + "File name cannot be empty." : "D'Datei kann net eidel sinn", + "\"{name}\" is not an allowed filetype" : "\"{name}\" ass een ongültegen Typ vun Datei", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Späicher vum {owener} ass voll, et kennen keng Dokumenter méi eropgelueden oder synchroniséiert ginn!", + "Your storage is full, files can not be updated or synced anymore!" : "Däin Späicher ass voll, et kennen keng Dateien méi eropgeluden oder synchrosniséiert ginn", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Späicher vum {owner} ass baal voll ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)" : "Däin Späicher ass baal voll ({usedSpacePercent}%)", + "_matches '{filter}'_::_match '{filter}'_" : ["entsprecht","entspriechen"], + "View in folder" : "Kuk am Dossier ", + "Path" : "Pad", + "_%n byte_::_%n bytes_" : ["¦%n Byte","¦%n Byte"], + "Favorited" : "Favoriséiert", + "Favorite" : "Favorit", + "Copy local link" : "Lokale Link kopéiert", "Folder" : "Dossier", "New folder" : "Neien Dossier", "Upload" : "Eroplueden", - "Upload (max. %s)" : "Eroplueden (max. %s)", + "An error occurred while trying to update the tags" : "Beim Updaten vun den Tags ass e Fehler entstaanen", + "Added to favorites" : "Zu den Favoriten dobaigesat", + "Removed from favorites" : "Vun den Favoriten eweggeholl", + "You added {file} to your favorites" : "Du hues {file} zu denger Favortiten dobäigesat", + "You removed {file} from your favorites" : "Du hues {file} aus dengen Favortiten geläscht", + "File changes" : "Datei Ännerungen", + "Created by {user}" : "Erstallt vum {user}", + "Changed by {user}" : "Geännert vum {user}", + "Deleted by {user}" : "Geläscht vum {user}", + "Restored by {user}" : "Erem hier gestallt vum {user}", + "Renamed by {user}" : "Embenannt vum {user}", + "Moved by {user}" : "Beweegt vum {user}", + "You created {file}" : "Du hues {file} erstallt", + "{user} created {file}" : "Den {user} huet {file} erstallt", + "{file} was created in a public folder" : "{file} ass an engem ëffentlechen Dossier erstallt ginn", + "You changed {file}" : "Du hues {file} verännert", + "{user} changed {file}" : "Den {user} huet {file} verännert", + "You deleted {file}" : "Du hues {file} geläscht", + "{user} deleted {file}" : "Den {user} huet {file} geläscht", + "You restored {file}" : "Du hues {file} erem hier gestallt", + "{user} restored {file}" : "Den {user} huet {file} erem hier gestallt", + "You renamed {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} embenannt", + "{user} renamed {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} embenannt", + "You moved {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} verreckelt", + "{user} moved {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} verreckelt", + "A file has been added to or removed from your <strong>favorites</strong>" : "Eng Datei gouf zu dengen Favoriten <strong> dobäigesat </strong> oder aus dengen Favortien <strong> geläscht </strong>", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eng Datei gouf <strong> verännert</strong> oder <strong> embenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eng nei Datei oder e neien Dossier gouf <strong> erstallt </strong>", + "A new file or folder has been <strong>deleted</strong>" : "Eng Datei oder en Dossier gouf <strong> geläscht</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitéier Notifikatiounen op d'Erstellen an Veränneren vun dengen <strong> Favoriten</strong> (nëmmen Floss)", + "A new file or folder has been <strong>restored</strong>" : "Eng Datei oder en Dossier gouf <strong> erem hier gestallt</strong>", + "Upload (max. %s)" : "Upload (maximal ¦%s)", "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", "Save" : "Späicheren", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Mat PHP-FPM kann et 5 Minutten dauern bis d'Ännerungen iwwerholl goufen", + "Missing permissions to edit from here." : "Net genuch Recher fir hei eppes ze veränneren", "Settings" : "Astellungen", - "No files in here" : "Hei sinn keng Fichieren", + "Show hidden files" : "Weis déi verstoppten Dateien", + "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benotz dess Address <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">, fir op deng Dateien via WebDAV zouzegräifen</a>", + "No files in here" : "Keng Dokumenter hei", + "Upload some content or sync with your devices!" : "Lued Dateien erop oder synchroniséier se mat dengen Appartaten", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Text file" : "Text Fichier" + "No favorites" : "Keng Favoriten", + "Files and folders you mark as favorite will show up here" : "Hei gesais du deng Favoriten", + "Shared with you" : "Mat dir gedeelt", + "Shared with others" : "Mat aaneren gedeelt", + "Shared by link" : "Mat engem Link gedeelt", + "Tags" : "Tags", + "Deleted files" : "Geläschten Dateien", + "Text file" : "Text Fichier", + "New text file.txt" : "Neien Text file.txt", + "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds} Stonn iwwereg","{hours}:{minutes}:{seconds} Stonnen iwwereg"], + "{hours}:{minutes}h" : "{hours}:{minutes} Stonnen", + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} Minute iwwereg","{minutes}:{seconds} Minuten iwwereg"], + "{minutes}:{seconds}m" : "{minutes}:{seconds} Minuten", + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} Sekonn iwwereg","{seconds} Sekonnen iwwereg"], + "{seconds}s" : "{seconds}s", + "Any moment now..." : "An engen Moment", + "Soon..." : "Geschwënn", + "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index 67da26b1ece..a00689bcec8 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -1,48 +1,141 @@ { "translations": { + "Storage is temporarily not available" : "Späicherplaatz temporär net erreeschbar", + "Storage invalid" : "Späicherplatz net gülteg", "Unknown error" : "Et ass en onbekannte Fehler opgetrueden", - "There is no error, the file uploaded with success" : "Keen Feeler, Datei ass komplett ropgelueden ginn", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass", - "The uploaded file was only partially uploaded" : "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn", - "No file was uploaded" : "Et ass kee Fichier ropgeluede ginn", - "Missing a temporary folder" : "Et feelt en temporären Dossier", - "Failed to write to disk" : "Konnt net op den Disk schreiwen", - "Files" : "Dateien", "All files" : "All d'Fichieren", + "Recent" : "Rezent", + "File could not be found" : "Datei konnt net fonnt ginn", "Home" : "Doheem", "Close" : "Zoumaachen", "Favorites" : "Favoriten", + "Could not create folder \"{dir}\"" : "Dossier \"{dir}\" konnt net erstallt ginn", "Upload cancelled." : "Upload ofgebrach.", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} konnt eropgelueden ginn, well et een Dossier ass oder d'Datei 0 Bytes huet", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Net genuch Späicher, du probéiers {size1} eropzelueden, et ass awer nëmmen méi {size2} fräi", + "Target folder \"{dir}\" does not exist any more" : "Den Dossier \"{dir}\" existéiert net méi", + "Not enough free space" : "Nët genuch Späicherplaatz", "Uploading..." : "Lueden erop...", "..." : "...", - "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} vun {totalSize} ({bitrate})", + "Actions" : "Aktiounen", "Download" : "Download", "Rename" : "Ëmbenennen", + "Move" : "Verschieben", + "Target folder" : "Ziel Dossier", "Delete" : "Läschen", + "Disconnect storage" : "Net connectéierten Späicher", "Unshare" : "Net méi deelen", + "Could not load info for file \"{file}\"" : "Et konnten keng Informatiounen zu {file} gelueden ginn", + "Files" : "Dateien", "Details" : "Detailer", "Select" : "Auswielen", + "Pending" : "Ausstoend", + "Unable to determine date" : "Datum kann net festgestallt ginn", "This operation is forbidden" : "Dës Operatioun ass verbueden.", "This directory is unavailable, please check the logs or contact the administrator" : "Dësen Dossier ass net disponibel, w.e.g. kontrolléiert d'Logs oder kontaktéiert den Administrateur", + "Could not move \"{file}\", target exists" : "\"{file}\" konnt beweegt ginn. Et existéiert do schonn.", + "Could not move \"{file}\"" : "\"{file}\" konnt verreckelt ginn", + "{newName} already exists" : "{newName} gett et schon", + "Could not rename \"{fileName}\", it does not exist any more" : "\"{fileName}\" konnt embenannt ginn, well et net méi existéiert", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "\"{targetName}\" konnt net gesat ginn, well dësen schon am Dossier \"{dir}\" existéiert. Wiel weg. een aaneren", + "Could not rename \"{fileName}\"" : "\"{fileName}\" konnt net embenannt ginn", + "Could not create file \"{file}\"" : "\"{file}\" konnt net erstallt ginn", + "Could not create file \"{file}\" because it already exists" : "\"{file}\" konnt net erstallt ginn, well des schon existéiert", + "Could not create folder \"{dir}\" because it already exists" : "Den Dossier \"{dir}\" konnt net erstallt ginn, well desen schon existéiert", + "Error deleting file \"{fileName}\"." : "Fehler beim läschen vun \"{fileName}\".", + "No search results in other folders for {tag}{filter}{endtag}" : "Keng Resultater an aneren Dossieren fir {tag}{filter}{endtag} fonnt", "Name" : "Numm", "Size" : "Gréisst", "Modified" : "Geännert", + "_%n folder_::_%n folders_" : ["¦%n Dossier","¦%n Dossieren"], + "_%n file_::_%n files_" : ["¦%n Datei","¦%n Dateien"], + "{dirs} and {files}" : "{dirs} an {files}", + "_including %n hidden_::_including %n hidden_" : ["Beinhaltet ¦%n verstoppte Saach","Beinhaltet ¦%n verstoppte Saachen"], + "You don’t have permission to upload or create files here" : "Du hues net genuch Rechter hei Dokumenter eropzelueden oder ze erstellen", + "_Uploading %n file_::_Uploading %n files_" : ["Am Gaangen ¦%n Datei eropzelueden","Am Gaangen ¦%n Dateien eropzelueden"], "New" : "Nei", - "\"{name}\" is an invalid file name." : "\"{Numm}\" ass een ongültegen Numm fir e Fichier.", - "File name cannot be empty." : "Den Numm vum Fichier kann net eidel sinn.", + "\"{name}\" is an invalid file name." : "\"{name}\" ass een ongültegen Numm", + "File name cannot be empty." : "D'Datei kann net eidel sinn", + "\"{name}\" is not an allowed filetype" : "\"{name}\" ass een ongültegen Typ vun Datei", + "Storage of {owner} is full, files can not be updated or synced anymore!" : "Späicher vum {owener} ass voll, et kennen keng Dokumenter méi eropgelueden oder synchroniséiert ginn!", + "Your storage is full, files can not be updated or synced anymore!" : "Däin Späicher ass voll, et kennen keng Dateien méi eropgeluden oder synchrosniséiert ginn", + "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Späicher vum {owner} ass baal voll ({usedSpacePercent}%)", + "Your storage is almost full ({usedSpacePercent}%)" : "Däin Späicher ass baal voll ({usedSpacePercent}%)", + "_matches '{filter}'_::_match '{filter}'_" : ["entsprecht","entspriechen"], + "View in folder" : "Kuk am Dossier ", + "Path" : "Pad", + "_%n byte_::_%n bytes_" : ["¦%n Byte","¦%n Byte"], + "Favorited" : "Favoriséiert", + "Favorite" : "Favorit", + "Copy local link" : "Lokale Link kopéiert", "Folder" : "Dossier", "New folder" : "Neien Dossier", "Upload" : "Eroplueden", - "Upload (max. %s)" : "Eroplueden (max. %s)", + "An error occurred while trying to update the tags" : "Beim Updaten vun den Tags ass e Fehler entstaanen", + "Added to favorites" : "Zu den Favoriten dobaigesat", + "Removed from favorites" : "Vun den Favoriten eweggeholl", + "You added {file} to your favorites" : "Du hues {file} zu denger Favortiten dobäigesat", + "You removed {file} from your favorites" : "Du hues {file} aus dengen Favortiten geläscht", + "File changes" : "Datei Ännerungen", + "Created by {user}" : "Erstallt vum {user}", + "Changed by {user}" : "Geännert vum {user}", + "Deleted by {user}" : "Geläscht vum {user}", + "Restored by {user}" : "Erem hier gestallt vum {user}", + "Renamed by {user}" : "Embenannt vum {user}", + "Moved by {user}" : "Beweegt vum {user}", + "You created {file}" : "Du hues {file} erstallt", + "{user} created {file}" : "Den {user} huet {file} erstallt", + "{file} was created in a public folder" : "{file} ass an engem ëffentlechen Dossier erstallt ginn", + "You changed {file}" : "Du hues {file} verännert", + "{user} changed {file}" : "Den {user} huet {file} verännert", + "You deleted {file}" : "Du hues {file} geläscht", + "{user} deleted {file}" : "Den {user} huet {file} geläscht", + "You restored {file}" : "Du hues {file} erem hier gestallt", + "{user} restored {file}" : "Den {user} huet {file} erem hier gestallt", + "You renamed {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} embenannt", + "{user} renamed {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} embenannt", + "You moved {oldfile} to {newfile}" : "Du hues {oldfile} zu {newfile} verreckelt", + "{user} moved {oldfile} to {newfile}" : "Den {user} huet {oldfile} zu {newfile} verreckelt", + "A file has been added to or removed from your <strong>favorites</strong>" : "Eng Datei gouf zu dengen Favoriten <strong> dobäigesat </strong> oder aus dengen Favortien <strong> geläscht </strong>", + "A file or folder has been <strong>changed</strong> or <strong>renamed</strong>" : "Eng Datei gouf <strong> verännert</strong> oder <strong> embenannt</strong>", + "A new file or folder has been <strong>created</strong>" : "Eng nei Datei oder e neien Dossier gouf <strong> erstallt </strong>", + "A new file or folder has been <strong>deleted</strong>" : "Eng Datei oder en Dossier gouf <strong> geläscht</strong>", + "Limit notifications about creation and changes to your <strong>favorite files</strong> <em>(Stream only)</em>" : "Limitéier Notifikatiounen op d'Erstellen an Veränneren vun dengen <strong> Favoriten</strong> (nëmmen Floss)", + "A new file or folder has been <strong>restored</strong>" : "Eng Datei oder en Dossier gouf <strong> erem hier gestallt</strong>", + "Upload (max. %s)" : "Upload (maximal ¦%s)", "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", "Save" : "Späicheren", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Mat PHP-FPM kann et 5 Minutten dauern bis d'Ännerungen iwwerholl goufen", + "Missing permissions to edit from here." : "Net genuch Recher fir hei eppes ze veränneren", "Settings" : "Astellungen", - "No files in here" : "Hei sinn keng Fichieren", + "Show hidden files" : "Weis déi verstoppten Dateien", + "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Benotz dess Address <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">, fir op deng Dateien via WebDAV zouzegräifen</a>", + "No files in here" : "Keng Dokumenter hei", + "Upload some content or sync with your devices!" : "Lued Dateien erop oder synchroniséier se mat dengen Appartaten", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", "Select all" : "All auswielen", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", - "Text file" : "Text Fichier" + "No favorites" : "Keng Favoriten", + "Files and folders you mark as favorite will show up here" : "Hei gesais du deng Favoriten", + "Shared with you" : "Mat dir gedeelt", + "Shared with others" : "Mat aaneren gedeelt", + "Shared by link" : "Mat engem Link gedeelt", + "Tags" : "Tags", + "Deleted files" : "Geläschten Dateien", + "Text file" : "Text Fichier", + "New text file.txt" : "Neien Text file.txt", + "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds} Stonn iwwereg","{hours}:{minutes}:{seconds} Stonnen iwwereg"], + "{hours}:{minutes}h" : "{hours}:{minutes} Stonnen", + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} Minute iwwereg","{minutes}:{seconds} Minuten iwwereg"], + "{minutes}:{seconds}m" : "{minutes}:{seconds} Minuten", + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} Sekonn iwwereg","{seconds} Sekonnen iwwereg"], + "{seconds}s" : "{seconds}s", + "Any moment now..." : "An engen Moment", + "Soon..." : "Geschwënn", + "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 0eb6603a1fa..498613452a3 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -73,7 +73,7 @@ OC.L10N.register( "Folder" : "Map", "New folder" : "Nieuwe map", "Upload" : "Uploaden", - "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de markeringen bij te werken", + "An error occurred while trying to update the tags" : "Er trad een fout op bij jouw poging om de markeringen bij te werken", "Added to favorites" : "Toevoegen aan favorieten", "Removed from favorites" : "Verwijderen uit favorieten", "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten", diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index e87e58b6195..43e9f670859 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -71,7 +71,7 @@ "Folder" : "Map", "New folder" : "Nieuwe map", "Upload" : "Uploaden", - "An error occurred while trying to update the tags" : "Er trad een fout op bij uw poging de markeringen bij te werken", + "An error occurred while trying to update the tags" : "Er trad een fout op bij jouw poging om de markeringen bij te werken", "Added to favorites" : "Toevoegen aan favorieten", "Removed from favorites" : "Verwijderen uit favorieten", "You added {file} to your favorites" : "Je voegde {file} toe aan favorieten", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index 154b72567c7..5ae55d039ca 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -1,7 +1,7 @@ OC.L10N.register( "files", { - "Storage is temporarily not available" : "Storage esta, temporariamente, indisponível", + "Storage is temporarily not available" : "Storage esté temporariamente indisponível", "Storage invalid" : "Armazenamento inválido", "Unknown error" : "Erro desconhecido", "All files" : "Todos os arquivos", @@ -34,17 +34,18 @@ OC.L10N.register( "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", - "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", - "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o alvo já existe", + "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou entre em contato com o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o destino já existe", "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"", "{newName} already exists" : "{newName} já existe", - "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele já não existe", - "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha um outro nome.", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele não existe mais", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha outro nome.", "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" porque ele já existe", "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" porque ela já existe", - "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao apagar o arquivo \"{fileName}\".", + "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".", + "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}", "Name" : "Nome", "Size" : "Tamanho", "Modified" : "Modificado", @@ -57,6 +58,7 @@ OC.L10N.register( "New" : "Novo", "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.", "File name cannot be empty." : "O nome do arquivo não pode estar vazio.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo válido", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Armazenamento do {owner} está cheio, os arquivos não podem ser mais atualizados ou sincronizados!", "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio, arquivos não podem mais ser atualizados ou sincronizados!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Armazenamento do {owner} está quase cheio ({usedSpacePercent}%)", @@ -65,7 +67,7 @@ OC.L10N.register( "View in folder" : "Exibir na pasta", "Path" : "Caminho", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], - "Favorited" : "Favorito", + "Favorited" : "Favoritado", "Favorite" : "Favorito", "Copy local link" : "Copiar link local", "Folder" : "Pasta", @@ -108,7 +110,7 @@ OC.L10N.register( "max. possible: " : "max. possível:", "Save" : "Salvar", "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.", - "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.", + "Missing permissions to edit from here." : "Faltando permissões para editar aqui.", "Settings" : "Configurações", "Show hidden files" : "Mostrar arquivos ocultos", "WebDAV" : "WebDAV", @@ -118,10 +120,10 @@ OC.L10N.register( "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", "Upload too large" : "Arquivo muito grande para envio", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excederam o tamanho máximo para arquivos no servidor.", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favoritos são mostrados aqui", - "Shared with you" : "Compartilhado com voce", + "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado via link", "Tags" : "Tags", @@ -130,9 +132,9 @@ OC.L10N.register( "New text file.txt" : "Novo texto file.txt", "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds} hora restante","{hours}:{minutes}:{seconds} horas restantes"], "{hours}:{minutes}h" : "{hours}:{minutes}h", - "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} minutos retantes","{minutes}:{seconds} minutos retantes"], + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} minutos retantes","{minutes}:{seconds} minutos restantes"], "{minutes}:{seconds}m" : "{minutes}:{seconds}m", - "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} segundos restantes","{seconds} secondos restantes"], + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} segundos restantes","{seconds} segundos restantes"], "{seconds}s" : "{seconds}s", "Any moment now..." : "A qualquer momento...", "Soon..." : "Logo...", diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 4e1ba96e2ee..d263544e0e4 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -1,5 +1,5 @@ { "translations": { - "Storage is temporarily not available" : "Storage esta, temporariamente, indisponível", + "Storage is temporarily not available" : "Storage esté temporariamente indisponível", "Storage invalid" : "Armazenamento inválido", "Unknown error" : "Erro desconhecido", "All files" : "Todos os arquivos", @@ -32,17 +32,18 @@ "Pending" : "Pendente", "Unable to determine date" : "Impossível determinar a data", "This operation is forbidden" : "Esta operação é proibida", - "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", - "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o alvo já existe", + "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor verifique os logs ou entre em contato com o administrador", + "Could not move \"{file}\", target exists" : "Não foi possível mover o \"{file}\", o destino já existe", "Could not move \"{file}\"" : "Não foi possível mover \"{file}\"", "{newName} already exists" : "{newName} já existe", - "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele já não existe", - "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha um outro nome.", + "Could not rename \"{fileName}\", it does not exist any more" : "Não foi possível renomear \"{fileName}\", ele não existe mais", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "O nome \"{targetName}\" já está sendo usado na pasta \"{dir}\". Por favor escolha outro nome.", "Could not rename \"{fileName}\"" : "Não foi possível renomear \"{fileName}\"", "Could not create file \"{file}\"" : "Não foi possível criar o arquivo \"{file}\"", "Could not create file \"{file}\" because it already exists" : "Não foi possível criar o arquivo \"{file}\" porque ele já existe", "Could not create folder \"{dir}\" because it already exists" : "Não foi possível criar a pasta \"{dir}\" porque ela já existe", - "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao apagar o arquivo \"{fileName}\".", + "Error deleting file \"{fileName}\"." : "Ocorreu um erro ao excluir o arquivo \"{fileName}\".", + "No search results in other folders for {tag}{filter}{endtag}" : "Sem resultados de pesquisa em outras pastas para {tag}{filter}{endtag}", "Name" : "Nome", "Size" : "Tamanho", "Modified" : "Modificado", @@ -55,6 +56,7 @@ "New" : "Novo", "\"{name}\" is an invalid file name." : "\"{name}\" é um nome de arquivo inválido.", "File name cannot be empty." : "O nome do arquivo não pode estar vazio.", + "\"{name}\" is not an allowed filetype" : "\"{name}\" não é um tipo de arquivo válido", "Storage of {owner} is full, files can not be updated or synced anymore!" : "Armazenamento do {owner} está cheio, os arquivos não podem ser mais atualizados ou sincronizados!", "Your storage is full, files can not be updated or synced anymore!" : "Seu armazenamento está cheio, arquivos não podem mais ser atualizados ou sincronizados!", "Storage of {owner} is almost full ({usedSpacePercent}%)" : "Armazenamento do {owner} está quase cheio ({usedSpacePercent}%)", @@ -63,7 +65,7 @@ "View in folder" : "Exibir na pasta", "Path" : "Caminho", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], - "Favorited" : "Favorito", + "Favorited" : "Favoritado", "Favorite" : "Favorito", "Copy local link" : "Copiar link local", "Folder" : "Pasta", @@ -106,7 +108,7 @@ "max. possible: " : "max. possível:", "Save" : "Salvar", "With PHP-FPM it might take 5 minutes for changes to be applied." : "Com PHP-FPM pode demorar 5 minutos para que as alterações sejam aplicadas.", - "Missing permissions to edit from here." : "Faltando permissões para editar a partir daqui.", + "Missing permissions to edit from here." : "Faltando permissões para editar aqui.", "Settings" : "Configurações", "Show hidden files" : "Mostrar arquivos ocultos", "WebDAV" : "WebDAV", @@ -116,10 +118,10 @@ "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", "Upload too large" : "Arquivo muito grande para envio", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excederam o tamanho máximo para arquivos no servidor.", "No favorites" : "Sem favoritos", "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favoritos são mostrados aqui", - "Shared with you" : "Compartilhado com voce", + "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado via link", "Tags" : "Tags", @@ -128,9 +130,9 @@ "New text file.txt" : "Novo texto file.txt", "_{hours}:{minutes}:{seconds} hour left_::_{hours}:{minutes}:{seconds} hours left_" : ["{hours}:{minutes}:{seconds} hora restante","{hours}:{minutes}:{seconds} horas restantes"], "{hours}:{minutes}h" : "{hours}:{minutes}h", - "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} minutos retantes","{minutes}:{seconds} minutos retantes"], + "_{minutes}:{seconds} minute left_::_{minutes}:{seconds} minutes left_" : ["{minutes}:{seconds} minutos retantes","{minutes}:{seconds} minutos restantes"], "{minutes}:{seconds}m" : "{minutes}:{seconds}m", - "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} segundos restantes","{seconds} secondos restantes"], + "_{seconds} second left_::_{seconds} seconds left_" : ["{seconds} segundos restantes","{seconds} segundos restantes"], "{seconds}s" : "{seconds}s", "Any moment now..." : "A qualquer momento...", "Soon..." : "Logo...", diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index b8981373ddd..397710545cb 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -87,7 +87,7 @@ OC.L10N.register( "Moved by {user}" : "Перемещено {user}", "You created {file}" : "Вы создали {file}", "{user} created {file}" : "{user} создал {file}", - "{file} was created in a public folder" : "{file} создан в общем каталоге", + "{file} was created in a public folder" : "{file} создан в общедоступом каталоге", "You changed {file}" : "Вы изменили {file}", "{user} changed {file}" : "{user} изменил {file}", "You deleted {file}" : "Вы удалили {file}", diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 3e41f1eef87..7e8801c8a9f 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -85,7 +85,7 @@ "Moved by {user}" : "Перемещено {user}", "You created {file}" : "Вы создали {file}", "{user} created {file}" : "{user} создал {file}", - "{file} was created in a public folder" : "{file} создан в общем каталоге", + "{file} was created in a public folder" : "{file} создан в общедоступом каталоге", "You changed {file}" : "Вы изменили {file}", "{user} changed {file}" : "{user} изменил {file}", "You deleted {file}" : "Вы удалили {file}", diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 976c0c00b89..4e35ea531eb 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -960,7 +960,7 @@ MountConfigListView.prototype = _.extend({ success: function(result) { var onCompletion = jQuery.Deferred(); $.each(result, function(i, storageParams) { - storageParams.mountPoint = storageParams.mountPoint.substr(1); // trim leading slash + storageParams.mountPoint = (storageParams.mountPoint === '/')? '/' : storageParams.mountPoint.substr(1); // trim leading slash var storageConfig = new self._storageConfigClass(); _.extend(storageConfig, storageParams); var $tr = self.newStorage(storageConfig, onCompletion); diff --git a/apps/files_external/l10n/es_MX.js b/apps/files_external/l10n/es_MX.js index be4478ab639..9d8273eaf11 100644 --- a/apps/files_external/l10n/es_MX.js +++ b/apps/files_external/l10n/es_MX.js @@ -1,27 +1,124 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Se presentó una falla al buscar las fichas de solicitud. Favor de verificar que su llave de aplicación y su secreto sean correctos. ", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Se presentó una falla al buscar las fichas de acceso. Favor de verificar que su llave de aplicación y su secreto sean correctos. ", + "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 storage" : "Almacenamiento externo", + "Dropbox App Configuration" : "Configuración de la aplicación Dropbox", + "Google Drive App Configuration" : "Configuración de Aplicación Google Drive", "Personal" : "Personal", + "System" : "Sistema", "Grant access" : "Conceder acceso", + "Error configuring OAuth1" : "Se presentó un error al configurar OAuth1", + "Error configuring OAuth2" : "Se presentó un error al configurar OAuth2", + "Generate keys" : "Generar llaves", + "Error generating key pair" : "Se presentó un error al generar el juego de llaves", + "All users. Type to select user or group." : "Todos los usuarios. Escriba para seleccionar el usuario o grupo", + "(group)" : "(grupo)", + "Compatibility with Mac NFD encoding (slow)" : "Compatibilidad con codificación Mac NFD (lenta)", + "Admin defined" : "Administrador definido", "Saved" : "Guardado", + "Saving..." : "Guardando...", + "Save" : "Guardar", + "Empty response from the server" : "Respuesta vacía del servidor", + "Couldn't access. Please logout and login to activate this mount point" : "No fue posible accesar. Favor de salir e iniciar sesión para activar este punto de montaje", + "Couldn't get the information from the remote server: {code} {type}" : "No fue posible obtener la información del servidor remoto: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "No fue posible obtener la lista de puntos de montaje externos: {type}", + "There was an error with message: " : "Se presentó un problema con el mensaje:", + "External mount error" : "Error de montaje externo", + "external-storage" : "almacenamiento externo", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "No fue posible obtener el listado de los puntos de montaje de la unidad de red de Windows: respuesta del servidor vacía ", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Algunos de los puntos de montaje externos configurados no se encuentran conectados. Favor de hacer click en los renglon(es) en rojo para más información", + "Please enter the credentials for the {mount} mount" : "Favor de ingresar las credenciales para el montaje {mount}", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "Save" : "Guardar", + "Credentials saved" : "Credenciales guardadas", + "Credentials saving failed" : "Se ha presentado una falla al guardar las credenciales", + "Credentials required" : "Se requieren credenciales", + "Storage with id \"%i\" not found" : "El almacenamiento con id \"%i\" no fue encontrado", + "Invalid backend or authentication mechanism class" : "Backend o clase de mecanismo de autenticación inválido ", + "Invalid mount point" : "Punto de montaje inválido", + "Objectstore forbidden" : "Objectstore prohibido", + "Invalid storage backend \"%s\"" : "Almacenamiento de backend \"%s\" inválido ", + "Not permitted to use backend \"%s\"" : "No está permitido usar el backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido el uso del mecanismo de autenticación \"%s\"", + "Unsatisfied backend parameters" : "Parametros del backend no satisfechos", + "Unsatisfied authentication mechanism parameters" : "Parametros no satisfechos del mecanismo de autenticación", + "Insufficient data: %s" : "Datos insuficientes: %s", + "%s" : "%s", + "Storage with id \"%i\" is not user editable" : "El almacenamiento con id \"%i\" no puede ser editado por el usuario", + "Access key" : "Llave de acceso", + "Secret key" : "Llave secreta", + "Builtin" : "Integrado", "None" : "Ninguno", - "API key" : "clave API", + "OAuth1" : "OAuth1", + "App key" : "Llave de la aplicación", + "App secret" : "Secreto de la aplicación", + "OAuth2" : "OAuth2", + "Client ID" : "ID del cliente", + "Client secret" : "Secreto del cliente", + "OpenStack" : "OpenStack", + "Rackspace" : "Rackspace", + "API key" : "Llave de API", + "Global credentials" : "Credenciales globales", + "Username and password" : "Nombre de usuario y contraseña", + "Log-in credentials, save in session" : "Credenciales para iniciar sesión, guardar en la sesión", + "RSA public key" : "Llave pública RSA", "Public key" : "Llave pública", + "Amazon S3" : "Amazon S3", + "Hostname" : "Nombre del servidor", "Port" : "Puerto", + "Region" : "Región", + "Enable SSL" : "Habilitar SSL", + "Enable Path Style" : "Habilitar Estilo de Ruta", "WebDAV" : "WebDAV", "URL" : "URL", + "Remote subfolder" : "Subcarpeta remota", + "Secure https://" : "Asegurar https:// ", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Servidor", + "Google Drive" : "Google Drive", + "Local" : "Local", "Location" : "Ubicación", + "Nextcloud" : "Nextcloud", + "SFTP" : "SFTP", + "Root" : "Raíz", + "SFTP with secret key login" : "Inicio de sesión SFTP con llave secreta", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartir", + "Domain" : "Dominio", + "SMB / CIFS using OC login" : "SMB / CIFS usando inicio de sesión OC", + "Username as share" : "Nombre de usuario como elemento compartido", + "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. ", + "No external storage configured" : "No se ha configurado el almacenamiento externo", + "You can add external storages in the personal settings" : "Usted puede agregar almacenamiento externo en los ajustes personales", "Name" : "Nombre", - "External Storage" : "Almacenamiento externo", + "Storage type" : "Tipo de almacenamiento", + "Scope" : "Alcance", + "Enable encryption" : "Habilitar encripción", + "Enable previews" : "Habilitar previsualizaciones", + "Enable sharing" : "Habilitar compartir", + "Check for changes" : "Verificar si hay cambios", + "Never" : "Nunca", + "Once every direct access" : "Una vez cada acceso directo", "Folder name" : "Nombre de la carpeta", + "Authentication" : "Autenticación", "Configuration" : "Configuración", - "Add storage" : "Añadir almacenamiento", - "Delete" : "Eliminar" + "Available for" : "Disponible para", + "Add storage" : "Agregar almacenamiento", + "Advanced settings" : "Ajustes avanzados", + "Delete" : "Borrar", + "Allow users to mount external storage" : "Permitir a los usuarios montar almacenamiento externo", + "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/es_MX.json b/apps/files_external/l10n/es_MX.json index b37b125f036..78534776c15 100644 --- a/apps/files_external/l10n/es_MX.json +++ b/apps/files_external/l10n/es_MX.json @@ -1,25 +1,122 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Se presentó una falla al buscar las fichas de solicitud. Favor de verificar que su llave de aplicación y su secreto sean correctos. ", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Se presentó una falla al buscar las fichas de acceso. Favor de verificar que su llave de aplicación y su secreto sean correctos. ", + "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 storage" : "Almacenamiento externo", + "Dropbox App Configuration" : "Configuración de la aplicación Dropbox", + "Google Drive App Configuration" : "Configuración de Aplicación Google Drive", "Personal" : "Personal", + "System" : "Sistema", "Grant access" : "Conceder acceso", + "Error configuring OAuth1" : "Se presentó un error al configurar OAuth1", + "Error configuring OAuth2" : "Se presentó un error al configurar OAuth2", + "Generate keys" : "Generar llaves", + "Error generating key pair" : "Se presentó un error al generar el juego de llaves", + "All users. Type to select user or group." : "Todos los usuarios. Escriba para seleccionar el usuario o grupo", + "(group)" : "(grupo)", + "Compatibility with Mac NFD encoding (slow)" : "Compatibilidad con codificación Mac NFD (lenta)", + "Admin defined" : "Administrador definido", "Saved" : "Guardado", + "Saving..." : "Guardando...", + "Save" : "Guardar", + "Empty response from the server" : "Respuesta vacía del servidor", + "Couldn't access. Please logout and login to activate this mount point" : "No fue posible accesar. Favor de salir e iniciar sesión para activar este punto de montaje", + "Couldn't get the information from the remote server: {code} {type}" : "No fue posible obtener la información del servidor remoto: {code} {type}", + "Couldn't get the list of external mount points: {type}" : "No fue posible obtener la lista de puntos de montaje externos: {type}", + "There was an error with message: " : "Se presentó un problema con el mensaje:", + "External mount error" : "Error de montaje externo", + "external-storage" : "almacenamiento externo", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "No fue posible obtener el listado de los puntos de montaje de la unidad de red de Windows: respuesta del servidor vacía ", + "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Algunos de los puntos de montaje externos configurados no se encuentran conectados. Favor de hacer click en los renglon(es) en rojo para más información", + "Please enter the credentials for the {mount} mount" : "Favor de ingresar las credenciales para el montaje {mount}", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "Save" : "Guardar", + "Credentials saved" : "Credenciales guardadas", + "Credentials saving failed" : "Se ha presentado una falla al guardar las credenciales", + "Credentials required" : "Se requieren credenciales", + "Storage with id \"%i\" not found" : "El almacenamiento con id \"%i\" no fue encontrado", + "Invalid backend or authentication mechanism class" : "Backend o clase de mecanismo de autenticación inválido ", + "Invalid mount point" : "Punto de montaje inválido", + "Objectstore forbidden" : "Objectstore prohibido", + "Invalid storage backend \"%s\"" : "Almacenamiento de backend \"%s\" inválido ", + "Not permitted to use backend \"%s\"" : "No está permitido usar el backend \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "No está permitido el uso del mecanismo de autenticación \"%s\"", + "Unsatisfied backend parameters" : "Parametros del backend no satisfechos", + "Unsatisfied authentication mechanism parameters" : "Parametros no satisfechos del mecanismo de autenticación", + "Insufficient data: %s" : "Datos insuficientes: %s", + "%s" : "%s", + "Storage with id \"%i\" is not user editable" : "El almacenamiento con id \"%i\" no puede ser editado por el usuario", + "Access key" : "Llave de acceso", + "Secret key" : "Llave secreta", + "Builtin" : "Integrado", "None" : "Ninguno", - "API key" : "clave API", + "OAuth1" : "OAuth1", + "App key" : "Llave de la aplicación", + "App secret" : "Secreto de la aplicación", + "OAuth2" : "OAuth2", + "Client ID" : "ID del cliente", + "Client secret" : "Secreto del cliente", + "OpenStack" : "OpenStack", + "Rackspace" : "Rackspace", + "API key" : "Llave de API", + "Global credentials" : "Credenciales globales", + "Username and password" : "Nombre de usuario y contraseña", + "Log-in credentials, save in session" : "Credenciales para iniciar sesión, guardar en la sesión", + "RSA public key" : "Llave pública RSA", "Public key" : "Llave pública", + "Amazon S3" : "Amazon S3", + "Hostname" : "Nombre del servidor", "Port" : "Puerto", + "Region" : "Región", + "Enable SSL" : "Habilitar SSL", + "Enable Path Style" : "Habilitar Estilo de Ruta", "WebDAV" : "WebDAV", "URL" : "URL", + "Remote subfolder" : "Subcarpeta remota", + "Secure https://" : "Asegurar https:// ", + "Dropbox" : "Dropbox", + "FTP" : "FTP", "Host" : "Servidor", + "Google Drive" : "Google Drive", + "Local" : "Local", "Location" : "Ubicación", + "Nextcloud" : "Nextcloud", + "SFTP" : "SFTP", + "Root" : "Raíz", + "SFTP with secret key login" : "Inicio de sesión SFTP con llave secreta", + "SMB / CIFS" : "SMB / CIFS", "Share" : "Compartir", + "Domain" : "Dominio", + "SMB / CIFS using OC login" : "SMB / CIFS usando inicio de sesión OC", + "Username as share" : "Nombre de usuario como elemento compartido", + "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. ", + "No external storage configured" : "No se ha configurado el almacenamiento externo", + "You can add external storages in the personal settings" : "Usted puede agregar almacenamiento externo en los ajustes personales", "Name" : "Nombre", - "External Storage" : "Almacenamiento externo", + "Storage type" : "Tipo de almacenamiento", + "Scope" : "Alcance", + "Enable encryption" : "Habilitar encripción", + "Enable previews" : "Habilitar previsualizaciones", + "Enable sharing" : "Habilitar compartir", + "Check for changes" : "Verificar si hay cambios", + "Never" : "Nunca", + "Once every direct access" : "Una vez cada acceso directo", "Folder name" : "Nombre de la carpeta", + "Authentication" : "Autenticación", "Configuration" : "Configuración", - "Add storage" : "Añadir almacenamiento", - "Delete" : "Eliminar" + "Available for" : "Disponible para", + "Add storage" : "Agregar almacenamiento", + "Advanced settings" : "Ajustes avanzados", + "Delete" : "Borrar", + "Allow users to mount external storage" : "Permitir a los usuarios montar almacenamiento externo", + "Allow users to mount the following external storage" : "Permitir a los usuarios montar el siguiente almacenamiento externo" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/fi.js b/apps/files_external/l10n/fi.js index 775874cf11a..aecba68e407 100644 --- a/apps/files_external/l10n/fi.js +++ b/apps/files_external/l10n/fi.js @@ -2,6 +2,8 @@ OC.L10N.register( "files_external", { "Fetching request tokens failed. Verify that your app key and secret are correct." : "Pyyntötunnisteen nouto epäonnistui. Tarkista että sovellusavaimesi ja -salaisuutesi ovat oikein.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Pyyntötunnisteen haku epäonnistui. Tarkista että sovellusavaimesi ja -salaisuutesi ovat oikein.", + "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 storage" : "Ulkoinen tallennustila", @@ -16,15 +18,18 @@ OC.L10N.register( "Error generating key pair" : "Virhe luotaessa avainparia", "All users. Type to select user or group." : "Kaikki käyttäjät. Kirjoita valitaksesi käyttäjän tai ryhmän.", "(group)" : "(ryhmä)", + "Compatibility with Mac NFD encoding (slow)" : "Yhteensopivuus Mac NFD -enkoodauksen kanssa (hidas)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", "Saving..." : "Tallennetaan...", "Save" : "Tallenna", "Empty response from the server" : "Tyhjä vastaus palvelimelta", "Couldn't access. Please logout and login to activate this mount point" : "Käyttö epäonnistui. Kirjaudu ulos ja takaisin sisään aktivoidaksesi tämän liitospisteen", + "Couldn't get the information from the remote server: {code} {type}" : "Tietojen saaminen etäpalvelimelta epäonnistui: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Erillisten liitospisteiden listauksen noutaminen epäonnistui: {type}", "There was an error with message: " : "Tapahtui virhe viestillä:", "External mount error" : "Ulkoinen liitosvirhe", + "external-storage" : "ulkoinen taltio", "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows-verkkoasemien liitospisteiden listauksen noutaminen epäonnistui: tyhjä vastaus palvelimelta", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Jotkin määritetyt erilliset liitospisteet eivät ole yhdistettynä. Napsauta punaisia rivejä saadaksesi lisätietoja", "Please enter the credentials for the {mount} mount" : "Anna kirjautumistiedot liitokselle {mount}", @@ -36,10 +41,15 @@ OC.L10N.register( "Storage with id \"%i\" not found" : "Tallennustilaa tunnisteella \"%i\" ei löytynyt", "Invalid backend or authentication mechanism class" : "Virheellinen tietovarasto tai tunnistautumismekanismin luokka", "Invalid mount point" : "Virheellinen liitoskohta", + "Objectstore forbidden" : "Objektimuisti estetty", "Invalid storage backend \"%s\"" : "Virheellinen tietovarasto \"%s\"", "Not permitted to use backend \"%s\"" : "Ei lupaa käyttää tietovarastoa \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Ei lupaa käyttää tunnistautumismekanismia \"%s\"", "Unsatisfied backend parameters" : "Riittämättömät tietovaraston parametrit", + "Unsatisfied authentication mechanism parameters" : "Riittämättömät tunnistautumismekanismin parametrit", + "Insufficient data: %s" : "Puutteellinen data: %s", "%s" : "%s", + "Storage with id \"%i\" is not user editable" : "Tallennustila, jolla on \"%i\" id, ei ole muokattavissa.", "Access key" : "Pääsyavain", "Secret key" : "Salainen avain", "Builtin" : "Sisäänrakennettu", @@ -52,17 +62,23 @@ OC.L10N.register( "Client secret" : "Asiakassalaisuus", "OpenStack" : "OpenStack", "Tenant name" : "Tenant nimi", + "Identity endpoint URL" : "Määritä URL-päätepiste", "Rackspace" : "Rackspace", "API key" : "API-avain", + "Global credentials" : "Globaalit valtuudet", + "Log-in credentials, save in database" : "Kirjautumistiedot, tallennetaan tietokantaan", "Username and password" : "Käyttäjätunnus ja salasana", "Log-in credentials, save in session" : "Kirjautumistiedot, tallenna istuntoon", "User entered, store in database" : "Käyttäjän antama, tallennettu tietokantaan", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", + "Bucket" : "Bucket", + "Hostname" : "Isäntänimi", "Port" : "Portti", "Region" : "Alue", "Enable SSL" : "Käytä SSL:ää", + "Enable Path Style" : "Aktivoi polun tyyli", "WebDAV" : "WebDAV", "URL" : "Verkko-osoite", "Remote subfolder" : "Etäalikansio", @@ -87,10 +103,14 @@ OC.L10N.register( "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.", "No external storage configured" : "Erillistä tallennustilaa ei ole määritetty", "You can add external storages in the personal settings" : "Voit lisätä erillisiä tallennustiloja henkilökohtaisista asetuksistasi", "Name" : "Nimi", "Storage type" : "Tallennustilan tyyppi", + "Scope" : "Näkyvyysalue", "Enable encryption" : "Käytä salausta", "Enable previews" : "Käytä esikatseluja", "Enable sharing" : "Käytä jakamista", diff --git a/apps/files_external/l10n/fi.json b/apps/files_external/l10n/fi.json index e8c1e205f53..eb1cb6ab1e5 100644 --- a/apps/files_external/l10n/fi.json +++ b/apps/files_external/l10n/fi.json @@ -1,5 +1,7 @@ { "translations": { "Fetching request tokens failed. Verify that your app key and secret are correct." : "Pyyntötunnisteen nouto epäonnistui. Tarkista että sovellusavaimesi ja -salaisuutesi ovat oikein.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "Pyyntötunnisteen haku epäonnistui. Tarkista että sovellusavaimesi ja -salaisuutesi ovat oikein.", + "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 storage" : "Ulkoinen tallennustila", @@ -14,15 +16,18 @@ "Error generating key pair" : "Virhe luotaessa avainparia", "All users. Type to select user or group." : "Kaikki käyttäjät. Kirjoita valitaksesi käyttäjän tai ryhmän.", "(group)" : "(ryhmä)", + "Compatibility with Mac NFD encoding (slow)" : "Yhteensopivuus Mac NFD -enkoodauksen kanssa (hidas)", "Admin defined" : "Ylläpitäjän määrittämä", "Saved" : "Tallennettu", "Saving..." : "Tallennetaan...", "Save" : "Tallenna", "Empty response from the server" : "Tyhjä vastaus palvelimelta", "Couldn't access. Please logout and login to activate this mount point" : "Käyttö epäonnistui. Kirjaudu ulos ja takaisin sisään aktivoidaksesi tämän liitospisteen", + "Couldn't get the information from the remote server: {code} {type}" : "Tietojen saaminen etäpalvelimelta epäonnistui: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Erillisten liitospisteiden listauksen noutaminen epäonnistui: {type}", "There was an error with message: " : "Tapahtui virhe viestillä:", "External mount error" : "Ulkoinen liitosvirhe", + "external-storage" : "ulkoinen taltio", "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Windows-verkkoasemien liitospisteiden listauksen noutaminen epäonnistui: tyhjä vastaus palvelimelta", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Jotkin määritetyt erilliset liitospisteet eivät ole yhdistettynä. Napsauta punaisia rivejä saadaksesi lisätietoja", "Please enter the credentials for the {mount} mount" : "Anna kirjautumistiedot liitokselle {mount}", @@ -34,10 +39,15 @@ "Storage with id \"%i\" not found" : "Tallennustilaa tunnisteella \"%i\" ei löytynyt", "Invalid backend or authentication mechanism class" : "Virheellinen tietovarasto tai tunnistautumismekanismin luokka", "Invalid mount point" : "Virheellinen liitoskohta", + "Objectstore forbidden" : "Objektimuisti estetty", "Invalid storage backend \"%s\"" : "Virheellinen tietovarasto \"%s\"", "Not permitted to use backend \"%s\"" : "Ei lupaa käyttää tietovarastoa \"%s\"", + "Not permitted to use authentication mechanism \"%s\"" : "Ei lupaa käyttää tunnistautumismekanismia \"%s\"", "Unsatisfied backend parameters" : "Riittämättömät tietovaraston parametrit", + "Unsatisfied authentication mechanism parameters" : "Riittämättömät tunnistautumismekanismin parametrit", + "Insufficient data: %s" : "Puutteellinen data: %s", "%s" : "%s", + "Storage with id \"%i\" is not user editable" : "Tallennustila, jolla on \"%i\" id, ei ole muokattavissa.", "Access key" : "Pääsyavain", "Secret key" : "Salainen avain", "Builtin" : "Sisäänrakennettu", @@ -50,17 +60,23 @@ "Client secret" : "Asiakassalaisuus", "OpenStack" : "OpenStack", "Tenant name" : "Tenant nimi", + "Identity endpoint URL" : "Määritä URL-päätepiste", "Rackspace" : "Rackspace", "API key" : "API-avain", + "Global credentials" : "Globaalit valtuudet", + "Log-in credentials, save in database" : "Kirjautumistiedot, tallennetaan tietokantaan", "Username and password" : "Käyttäjätunnus ja salasana", "Log-in credentials, save in session" : "Kirjautumistiedot, tallenna istuntoon", "User entered, store in database" : "Käyttäjän antama, tallennettu tietokantaan", "RSA public key" : "Julkinen RSA-avain", "Public key" : "Julkinen avain", "Amazon S3" : "Amazon S3", + "Bucket" : "Bucket", + "Hostname" : "Isäntänimi", "Port" : "Portti", "Region" : "Alue", "Enable SSL" : "Käytä SSL:ää", + "Enable Path Style" : "Aktivoi polun tyyli", "WebDAV" : "WebDAV", "URL" : "Verkko-osoite", "Remote subfolder" : "Etäalikansio", @@ -85,10 +101,14 @@ "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.", "No external storage configured" : "Erillistä tallennustilaa ei ole määritetty", "You can add external storages in the personal settings" : "Voit lisätä erillisiä tallennustiloja henkilökohtaisista asetuksistasi", "Name" : "Nimi", "Storage type" : "Tallennustilan tyyppi", + "Scope" : "Näkyvyysalue", "Enable encryption" : "Käytä salausta", "Enable previews" : "Käytä esikatseluja", "Enable sharing" : "Käytä jakamista", diff --git a/apps/files_external/l10n/is.js b/apps/files_external/l10n/is.js index 62176e1fabd..d75741df884 100644 --- a/apps/files_external/l10n/is.js +++ b/apps/files_external/l10n/is.js @@ -33,7 +33,7 @@ OC.L10N.register( "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Gat ekki fengið lista yfir tengipunkta Windows-netdrifa: autt svar frá þjóni", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sumir uppsettir tengipunktar eru ekki tengdir í skráakerfið. Smelltu á rauðu örina/örvarnar til að fá frekari upplýsingar", "Please enter the credentials for the {mount} mount" : "Settu inn auðkenni fyrir {mount} tengipunktinn", - "Username" : "Notendanafn", + "Username" : "Notandanafn", "Password" : "Lykilorð", "Credentials saved" : "Auðkenni vistuð", "Credentials saving failed" : "Vistun auðkenna tókst ekki", diff --git a/apps/files_external/l10n/is.json b/apps/files_external/l10n/is.json index d051aefa57b..c8a08e539a3 100644 --- a/apps/files_external/l10n/is.json +++ b/apps/files_external/l10n/is.json @@ -31,7 +31,7 @@ "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Gat ekki fengið lista yfir tengipunkta Windows-netdrifa: autt svar frá þjóni", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Sumir uppsettir tengipunktar eru ekki tengdir í skráakerfið. Smelltu á rauðu örina/örvarnar til að fá frekari upplýsingar", "Please enter the credentials for the {mount} mount" : "Settu inn auðkenni fyrir {mount} tengipunktinn", - "Username" : "Notendanafn", + "Username" : "Notandanafn", "Password" : "Lykilorð", "Credentials saved" : "Auðkenni vistuð", "Credentials saving failed" : "Vistun auðkenna tókst ekki", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 27579c14151..877936417a0 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -103,9 +103,9 @@ OC.L10N.register( "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 geactiveerd 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 geactiveerd 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 uw beheerder om dit te installeren.", + "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.", "No external storage configured" : "Geen externe opslag geconfigureerd", "You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen", "Name" : "Naam", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index 26eb8cfc2b4..c1140d81879 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -101,9 +101,9 @@ "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 geactiveerd 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 geactiveerd 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 uw beheerder om dit te installeren.", + "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.", "No external storage configured" : "Geen externe opslag geconfigureerd", "You can add external storages in the personal settings" : "Je kunt externe opslag toevoegen in persoonlijke instellingen", "Name" : "Naam", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index 24ac44e9aa3..bcdb72d189d 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -1,8 +1,8 @@ OC.L10N.register( "files_external", { - "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requesição falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", - "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", + "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requisição falhou. Verifique se sua chave de aplicativo e segurança estão corretos.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se sua chave de aplicativo e segurança estão corretos.", "Please provide a valid app key and secret." : "Por favor forneça uma chave 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", @@ -15,7 +15,7 @@ OC.L10N.register( "Error configuring OAuth1" : "Erro configurando OAuth1", "Error configuring OAuth2" : "Erro configurando OAuth2", "Generate keys" : "Gerar chaves", - "Error generating key pair" : "Erro ao gerar um par de chaves", + "Error generating key pair" : "Erro ao gerar o par de chaves", "All users. Type to select user or group." : "Todos os usuários. Digite para selecionar usuário ou grupo.", "(group)" : "(grupo)", "Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação Mac NFD (lento)", @@ -23,14 +23,14 @@ OC.L10N.register( "Saved" : "Salvo", "Saving..." : "Salvando...", "Save" : "Salvar", - "Empty response from the server" : "Resposta vazia a partir do servidor", - "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconectar e conectar novamente para ativar este ponto de montagem", + "Empty response from the server" : "Resposta vazia do servidor", + "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconecte e conecte novamente para ativar este ponto de montagem", "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter as informações do servidor remoto: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Não foi possível obter a lista de pontos de montagem externos: {type}", "There was an error with message: " : "Houve um erro com a mensagem:", "External mount error" : "Erro de montagem externa", "external-storage" : "armazenamento-externo", - "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista unidades de pontos de montagem da rede do Windows: resposta vazia a partir do servidor", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista de unidades de pontos de montagem da rede Windows: resposta vazia do servidor", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Clique na(s) linha(s) vermelha(s) para mais informações", "Please enter the credentials for the {mount} mount" : "Por favor, insira as credenciais para montar {mount}", "Username" : "Nome de Usuário", @@ -62,13 +62,13 @@ OC.L10N.register( "Client secret" : "Segredo do cliente", "OpenStack" : "OpenStack", "Tenant name" : "Nome do inquilino", - "Identity endpoint URL" : "Identidade pontofinal URL", + "Identity endpoint URL" : "URL da identidade destino", "Rackspace" : "Espaço em rack", "API key" : "Chave API", "Global credentials" : "Credenciais globais", "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", - "Username and password" : "Nome de Usuário e senha", - "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão", + "Username and password" : "Nome de usuário e senha", + "Log-in credentials, save in session" : "Credenciais de login, guardadas em sessão", "User entered, store in database" : "Usuário adicionado, armazenado no banco de dados", "RSA public key" : "Chave pública RSA", "Public key" : "Chave pública", @@ -86,7 +86,7 @@ OC.L10N.register( "Dropbox" : "Dropbox", "FTP" : "FTP", "Host" : "Host", - "Secure ftps://" : "Seguro ftps://", + "Secure ftps://" : "ftps:// seguro", "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Localização", @@ -101,11 +101,11 @@ OC.L10N.register( "Username as share" : "Nome de usuário como compartilhado", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", - "Request timeout (seconds)" : "Tempo esgotado requerido (segundos)", + "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", "External storages" : "Armazenamentos 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." : "O suporte a cURL no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", - "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. Montagem de %s não é possível. Por favor, psolicite ao seu administrador do sistema instalá-lo.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", + "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 ao administrador do sistema instalá-lo.", + "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 ao administrador do sistema instalá-lo.", + "\"%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 ao administrador do sistema instalá-lo.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index e9e64f3325c..b0acf8586c0 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -1,6 +1,6 @@ { "translations": { - "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requesição falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", - "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se a sua chave de aplicativo e segurança estão corretos.", + "Fetching request tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de requisição falhou. Verifique se sua chave de aplicativo e segurança estão corretos.", + "Fetching access tokens failed. Verify that your app key and secret are correct." : "A solicitação dos tokens de acesso falhou. Verifique se sua chave de aplicativo e segurança estão corretos.", "Please provide a valid app key and secret." : "Por favor forneça uma chave 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", @@ -13,7 +13,7 @@ "Error configuring OAuth1" : "Erro configurando OAuth1", "Error configuring OAuth2" : "Erro configurando OAuth2", "Generate keys" : "Gerar chaves", - "Error generating key pair" : "Erro ao gerar um par de chaves", + "Error generating key pair" : "Erro ao gerar o par de chaves", "All users. Type to select user or group." : "Todos os usuários. Digite para selecionar usuário ou grupo.", "(group)" : "(grupo)", "Compatibility with Mac NFD encoding (slow)" : "Compatibilidade com a codificação Mac NFD (lento)", @@ -21,14 +21,14 @@ "Saved" : "Salvo", "Saving..." : "Salvando...", "Save" : "Salvar", - "Empty response from the server" : "Resposta vazia a partir do servidor", - "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconectar e conectar novamente para ativar este ponto de montagem", + "Empty response from the server" : "Resposta vazia do servidor", + "Couldn't access. Please logout and login to activate this mount point" : "Não foi possível acessar. Por favor, desconecte e conecte novamente para ativar este ponto de montagem", "Couldn't get the information from the remote server: {code} {type}" : "Não foi possível obter as informações do servidor remoto: {code} {type}", "Couldn't get the list of external mount points: {type}" : "Não foi possível obter a lista de pontos de montagem externos: {type}", "There was an error with message: " : "Houve um erro com a mensagem:", "External mount error" : "Erro de montagem externa", "external-storage" : "armazenamento-externo", - "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista unidades de pontos de montagem da rede do Windows: resposta vazia a partir do servidor", + "Couldn't get the list of Windows network drive mount points: empty response from the server" : "Não foi possível obter a lista de unidades de pontos de montagem da rede Windows: resposta vazia do servidor", "Some of the configured external mount points are not connected. Please click on the red row(s) for more information" : "Alguns dos pontos de montagem externos configurados não estão conectados. Clique na(s) linha(s) vermelha(s) para mais informações", "Please enter the credentials for the {mount} mount" : "Por favor, insira as credenciais para montar {mount}", "Username" : "Nome de Usuário", @@ -60,13 +60,13 @@ "Client secret" : "Segredo do cliente", "OpenStack" : "OpenStack", "Tenant name" : "Nome do inquilino", - "Identity endpoint URL" : "Identidade pontofinal URL", + "Identity endpoint URL" : "URL da identidade destino", "Rackspace" : "Espaço em rack", "API key" : "Chave API", "Global credentials" : "Credenciais globais", "Log-in credentials, save in database" : "Credenciais de acesso, salvas no banco de dados", - "Username and password" : "Nome de Usuário e senha", - "Log-in credentials, save in session" : "Credenciais de login, guardados em sessão", + "Username and password" : "Nome de usuário e senha", + "Log-in credentials, save in session" : "Credenciais de login, guardadas em sessão", "User entered, store in database" : "Usuário adicionado, armazenado no banco de dados", "RSA public key" : "Chave pública RSA", "Public key" : "Chave pública", @@ -84,7 +84,7 @@ "Dropbox" : "Dropbox", "FTP" : "FTP", "Host" : "Host", - "Secure ftps://" : "Seguro ftps://", + "Secure ftps://" : "ftps:// seguro", "Google Drive" : "Google Drive", "Local" : "Local", "Location" : "Localização", @@ -99,11 +99,11 @@ "Username as share" : "Nome de usuário como compartilhado", "OpenStack Object Storage" : "Armazenamento de Objetos OpenStack", "Service name" : "Nome do serviço", - "Request timeout (seconds)" : "Tempo esgotado requerido (segundos)", + "Request timeout (seconds)" : "Tempo requerido esgotado (segundos)", "External storages" : "Armazenamentos 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." : "O suporte a cURL no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", - "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. Montagem de %s não é possível. Por favor, psolicite ao seu administrador do sistema instalá-lo.", - "\"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "\"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema instalá-lo.", + "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 ao administrador do sistema instalá-lo.", + "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 ao administrador do sistema instalá-lo.", + "\"%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 ao administrador do sistema instalá-lo.", "No external storage configured" : "Nenhum armazendo externo foi configurado", "You can add external storages in the personal settings" : "Você pode adicionar armazenamentos externos nas configurações pessoais", "Name" : "Nome", diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js index 01eb3cc7808..e6a6996a056 100644 --- a/apps/files_external/l10n/tr.js +++ b/apps/files_external/l10n/tr.js @@ -103,9 +103,9 @@ OC.L10N.register( "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 etkin ya da kurulu değil. %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 etkin ya da kurulu değil. %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 kurulu değil. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", + "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.", "No external storage configured" : "Herhangi bir dış depolama yapılandırılmamış", "You can add external storages in the personal settings" : "Kişisel ayarlar bölümünden dış depolamaları ekleyebilirsiniz", "Name" : "Ad", diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json index cd86370854f..76cffec546e 100644 --- a/apps/files_external/l10n/tr.json +++ b/apps/files_external/l10n/tr.json @@ -101,9 +101,9 @@ "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 etkin ya da kurulu değil. %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 etkin ya da kurulu değil. %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 kurulu değil. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.", + "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.", "No external storage configured" : "Herhangi bir dış depolama yapılandırılmamış", "You can add external storages in the personal settings" : "Kişisel ayarlar bölümünden dış depolamaları ekleyebilirsiniz", "Name" : "Ad", diff --git a/apps/files_external/lib/Controller/StoragesController.php b/apps/files_external/lib/Controller/StoragesController.php index ef7cc8c6e4f..d962848bd78 100644 --- a/apps/files_external/lib/Controller/StoragesController.php +++ b/apps/files_external/lib/Controller/StoragesController.php @@ -143,7 +143,7 @@ abstract class StoragesController extends Controller { */ protected function validate(StorageConfig $storage) { $mountPoint = $storage->getMountPoint(); - if ($mountPoint === '' || $mountPoint === '/') { + if ($mountPoint === '') { return new DataResponse( array( 'message' => (string)$this->l10n->t('Invalid mount point') diff --git a/apps/files_external/lib/Lib/Storage/Swift.php b/apps/files_external/lib/Lib/Storage/Swift.php index 5fec278ef3d..105d1073ae6 100644 --- a/apps/files_external/lib/Lib/Storage/Swift.php +++ b/apps/files_external/lib/Lib/Storage/Swift.php @@ -373,6 +373,10 @@ class Swift extends \OC\Files\Storage\Common { $path = $this->normalizePath($path); switch ($mode) { + case 'a': + case 'ab': + case 'a+': + return false; case 'r': case 'rb': try { @@ -395,12 +399,9 @@ class Swift extends \OC\Files\Storage\Common { } case 'w': case 'wb': - case 'a': - case 'ab': case 'r+': case 'w+': case 'wb+': - case 'a+': case 'x': case 'x+': case 'c': @@ -419,10 +420,6 @@ class Swift extends \OC\Files\Storage\Common { } $source = $this->fopen($path, 'r'); file_put_contents($tmpFile, $source); - // Seek to end if required - if ($mode[0] === 'a') { - fseek($tmpFile, 0, SEEK_END); - } } $handle = fopen($tmpFile, $mode); return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) { diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml index e2a08d951ac..29a137fed0b 100644 --- a/apps/files_sharing/appinfo/info.xml +++ b/apps/files_sharing/appinfo/info.xml @@ -10,7 +10,7 @@ Turning the feature off removes shared files and folders on the server for all s <licence>AGPL</licence> <author>Michael Gapczynski, Bjoern Schiessle</author> <default_enable/> - <version>1.2.0</version> + <version>1.4.0</version> <types> <filesystem/> </types> diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php index ed0d7732b37..917cb7b6639 100644 --- a/apps/files_sharing/appinfo/update.php +++ b/apps/files_sharing/appinfo/update.php @@ -34,3 +34,8 @@ if (version_compare($installedVersion, '0.9.1', '<')) { if (version_compare($installedVersion, '1.1.1', '<')) { $m = new Migration(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()); } + +if (version_compare($installedVersion, '1.4.0', '<')) { + $m = new Migration(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()); + $m->addPasswordColumn(); +} diff --git a/apps/files_sharing/l10n/es_MX.js b/apps/files_sharing/l10n/es_MX.js index 9c287312e8a..a2d60d6f552 100644 --- a/apps/files_sharing/l10n/es_MX.js +++ b/apps/files_sharing/l10n/es_MX.js @@ -1,20 +1,113 @@ OC.L10N.register( "files_sharing", { - "Cancel" : "Cancelar", + "Shared with you" : "Compartido con usted", + "Shared with others" : "Compartido con otros", + "Shared by link" : "Compartido por liga", + "Nothing shared with you yet" : "Nada ha sido compartido aún con usted", + "Files and folders others share with you will show up here" : "Los archivos y carpetas que sean compartidos con usted se mostrarán aquí", + "Nothing shared yet" : "Nada compartido aún", + "Files and folders you share will show up here" : "Los archivos y carpetas que comparta se mostrarán aquí", + "No shared links" : "No hay ligas compartidas", + "Files and folders you share by link will show up here" : "Los archivos y carpetas que comparta por ligas se mostrarán aquí", + "You can upload into this folder" : "Usted puede cargar archivos dentro de esta carpeta", + "No compatible server found at {remote}" : "No se encontró un servidor compatible en {remote}", + "Invalid server URL" : "URL del servidor inválido", + "Failed to add the public link to your Nextcloud" : "Se presentó una falla al agregar la liga pública a su Nextcloud", + "Share" : "Compartir", + "No expiration date set" : "No se ha establecido la fecha de expiración", "Shared by" : "Compartido por", "Sharing" : "Compartiendo", - "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", - "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", + "File shares" : "Archivos compartidos", + "Downloaded via public link" : "Descargado mediante una liga pública", + "Downloaded by {email}" : "Descargado por {email}", + "{file} downloaded via public link" : "{file} descargado mediante una liga pública", + "{email} downloaded {file}" : "{email} descargó {file}", + "Shared with group {group}" : "Compartido con el gupo {group}", + "Removed share for group {group}" : "Se eliminó el elemento compartido del grupo {group}", + "{actor} shared with group {group}" : "{actor} compartió con el grupo {group}", + "{actor} removed share for group {group}" : "{actor} eliminó el elemento compartido del grupo {group}", + "You shared {file} with group {group}" : "Usted ha compartido {file} con el grupo {group}", + "You removed group {group} from {file}" : "Usted eliminó al grupo {group} de {file}", + "{actor} shared {file} with group {group}" : "{actor} compartió {file} con el grupo {group}", + "{actor} removed group {group} from {file}" : "{actor} lo eliminó del grupo {group} de {file}", + "Shared as public link" : "Compartido como una liga pública", + "Removed public link" : "Liga pública eliminada", + "Public link expired" : "La liga pública ha expirado", + "{actor} shared as public link" : "{actor} compartió como una liga pública", + "{actor} removed public link" : "{actor} eliminó la liga pública", + "Public link of {actor} expired" : "La liga pública de {actor} ha expirado", + "You shared {file} as public link" : "Usted ha compartido {file} como una liga pública", + "You removed public link for {file}" : "Usted ha eliminado la liga pública de {file}", + "Public link expired for {file}" : "La liga pública para {file} ha expirado", + "{actor} shared {file} as public link" : "{actor} ha compatido {file} como una liga pública", + "{actor} removed public link for {file}" : "{actor} eliminó la liga pública de {file}", + "Public link of {actor} for {file} expired" : "La liga pública de {actor} para {file} ha expirado", + "{user} accepted the remote share" : "{user} aceptó el elemento compartido remoto", + "{user} declined the remote share" : "{user} declinó el elemento compartido remoto", + "You received a new remote share {file} from {user}" : "Usted ha recibido un nuevo elemento compartido remoto {file} de {user}", + "{user} accepted the remote share of {file}" : "{user} aceptó el elemento compartido remoto de {file}", + "{user} declined the remote share of {file}" : "{user} declinó el elemento compartido remoto de {file}", + "{user} unshared {file} from you" : "{user} ha dejado de compartir {file} con usted", + "Shared with {user}" : "Compartido con {user}", + "Removed share for {user}" : "Eliminó el elemento compartido para {user}", + "{actor} shared with {user}" : "{actor} compartió con {user}", + "{actor} removed share for {user}" : "{actor} eliminó el elemento compartido para {user}", + "Shared by {actor}" : "Compartido por {actor}", + "{actor} removed share" : "{actor} eliminó el elemento compartido", + "You shared {file} with {user}" : "Usted ha compartido {file} con {user}", + "You removed {user} from {file}" : "Usted eliminó a {user} de {file}", + "{actor} shared {file} with {user}" : "{actor} compartió {file} con {user}", + "{actor} removed {user} from {file}" : "{actor} eliminó a {user} de {file}", + "{actor} shared {file} with you" : "{actor} ha compartido {file} con usted", + "{actor} removed you from {file}" : "{actor} lo eliminó de {file}", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un archivo o carpeta comparitdo por correo o por liga pública ha sido <strong>descargado</strong>", + "A file or folder was shared from <strong>another server</strong>" : "Un archivo o carpeta fue compartido desde <strong>otro servidor</strong>", + "A file or folder has been <strong>shared</strong>" : "Un archivo o carpeta ha sido <strong>compartido</strong>", + "Wrong share ID, share doesn't exist" : "ID del elemento compartido equivocado, el elemento compartido no existe", + "could not delete share" : "no fue posible borrar el elemento compartido", + "Could not delete share" : "No fue posible borrar el elemento compartido", + "Please specify a file or folder path" : "Favor de especificar un archivo o ruta de carpeta", + "Wrong path, file/folder doesn't exist" : "La ruta es incorrecta, el correo / carpeta no existe ", + "Could not create share" : "no fue posible crear el elemento compartido", + "invalid permissions" : "permisos inválidos", + "Please specify a valid user" : "Favor de especificar un usuario válido", + "Group sharing is disabled by the administrator" : "Compartir en grupos está deshabilitado por el administrador", + "Please specify a valid group" : "Favor de especificar un grupo valido", + "Public link sharing is disabled by the administrator" : "Compartir ligas públicas está deshabilitado por el administrador", + "Public upload disabled by the administrator" : "Cargas públicas deshabilitadas por el administrador", + "Public upload is only possible for publicly shared folders" : "Las cargas públicas son posibles sólo para carpetas compartidas públicamente", + "Invalid date, date format must be YYYY-MM-DD" : "La fecha es inválida, favor de seguir el formato AAAA-MM-DD", + "Sharing %s failed because the back end does not allow shares from type %s" : "Se presentó una falla al compartir %s, porque el backend no permite elementos compartidos de tipo %s", + "You cannot share to a Circle if the app is not enabled" : "Usted no puede compartir al Círculo si la aplicación no esta habilitada", + "Please specify a valid circle" : "Favor de especificar un círculo válido", + "Unknown share type" : "Tipo de elemento compartido desconocido", + "Not a directory" : "No es una carpeta", + "Could not lock path" : "No fue posible bloquear la ruta", + "Wrong or no update parameter given" : "El parametro de actualización esta erróneo o faltante", + "Can't change permissions for public share links" : "No es posible cambiar los permisos para ligas públicas compartidas", + "Cannot increase permissions" : "No es posible incrementar los permisos", + "%s is publicly shared" : "%s está compartido públicamente", + "Share API is disabled" : "El API para compartir está deshabilitado", + "This share is password-protected" : "Este elemento compartido esta protegido con contraseña", + "The password is wrong. Try again." : "La contraseña es incorrecta. Favor de intentarlo de nuevo.", "Password" : "Contraseña", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", "Name" : "Nombre", - "Sorry, this link doesn’t seem to work anymore." : "Lo siento, este enlace al parecer ya no funciona.", + "Share time" : "Tiempo de compartir", + "Expiration date" : "Fecha de expiración", + "Sorry, this link doesn’t seem to work anymore." : "Lo sentimos, esta liga no parece funcionar más. ", "Reasons might be:" : "Las causas podrían ser:", "the item was removed" : "el elemento fue eliminado", - "the link expired" : "el enlace expiró", - "sharing is disabled" : "compartir está desactivado", - "For more info, please ask the person who sent this link." : "Para mayor información, contacte a la persona que le envió el enlace.", + "the link expired" : "la liga expiró", + "sharing is disabled" : "compartir está deshabilitado", + "For more info, please ask the person who sent this link." : "Para mayores informes, contacte a la persona que le envió esta liga.", + "Add to your Nextcloud" : "Agregar a su Nextcloud", "Download" : "Descargar", - "Direct link" : "Enlace directo" + "Download %s" : "Descargar %s", + "Direct link" : "Liga directa", + "Upload files to %s" : "Cargar archivos a %s", + "Uploading files…" : "Cargando archivos...", + "Uploaded files:" : "Archivos cargados:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/es_MX.json b/apps/files_sharing/l10n/es_MX.json index 26f064e346a..2f5dc13e00d 100644 --- a/apps/files_sharing/l10n/es_MX.json +++ b/apps/files_sharing/l10n/es_MX.json @@ -1,18 +1,111 @@ { "translations": { - "Cancel" : "Cancelar", + "Shared with you" : "Compartido con usted", + "Shared with others" : "Compartido con otros", + "Shared by link" : "Compartido por liga", + "Nothing shared with you yet" : "Nada ha sido compartido aún con usted", + "Files and folders others share with you will show up here" : "Los archivos y carpetas que sean compartidos con usted se mostrarán aquí", + "Nothing shared yet" : "Nada compartido aún", + "Files and folders you share will show up here" : "Los archivos y carpetas que comparta se mostrarán aquí", + "No shared links" : "No hay ligas compartidas", + "Files and folders you share by link will show up here" : "Los archivos y carpetas que comparta por ligas se mostrarán aquí", + "You can upload into this folder" : "Usted puede cargar archivos dentro de esta carpeta", + "No compatible server found at {remote}" : "No se encontró un servidor compatible en {remote}", + "Invalid server URL" : "URL del servidor inválido", + "Failed to add the public link to your Nextcloud" : "Se presentó una falla al agregar la liga pública a su Nextcloud", + "Share" : "Compartir", + "No expiration date set" : "No se ha establecido la fecha de expiración", "Shared by" : "Compartido por", "Sharing" : "Compartiendo", - "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", - "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", + "File shares" : "Archivos compartidos", + "Downloaded via public link" : "Descargado mediante una liga pública", + "Downloaded by {email}" : "Descargado por {email}", + "{file} downloaded via public link" : "{file} descargado mediante una liga pública", + "{email} downloaded {file}" : "{email} descargó {file}", + "Shared with group {group}" : "Compartido con el gupo {group}", + "Removed share for group {group}" : "Se eliminó el elemento compartido del grupo {group}", + "{actor} shared with group {group}" : "{actor} compartió con el grupo {group}", + "{actor} removed share for group {group}" : "{actor} eliminó el elemento compartido del grupo {group}", + "You shared {file} with group {group}" : "Usted ha compartido {file} con el grupo {group}", + "You removed group {group} from {file}" : "Usted eliminó al grupo {group} de {file}", + "{actor} shared {file} with group {group}" : "{actor} compartió {file} con el grupo {group}", + "{actor} removed group {group} from {file}" : "{actor} lo eliminó del grupo {group} de {file}", + "Shared as public link" : "Compartido como una liga pública", + "Removed public link" : "Liga pública eliminada", + "Public link expired" : "La liga pública ha expirado", + "{actor} shared as public link" : "{actor} compartió como una liga pública", + "{actor} removed public link" : "{actor} eliminó la liga pública", + "Public link of {actor} expired" : "La liga pública de {actor} ha expirado", + "You shared {file} as public link" : "Usted ha compartido {file} como una liga pública", + "You removed public link for {file}" : "Usted ha eliminado la liga pública de {file}", + "Public link expired for {file}" : "La liga pública para {file} ha expirado", + "{actor} shared {file} as public link" : "{actor} ha compatido {file} como una liga pública", + "{actor} removed public link for {file}" : "{actor} eliminó la liga pública de {file}", + "Public link of {actor} for {file} expired" : "La liga pública de {actor} para {file} ha expirado", + "{user} accepted the remote share" : "{user} aceptó el elemento compartido remoto", + "{user} declined the remote share" : "{user} declinó el elemento compartido remoto", + "You received a new remote share {file} from {user}" : "Usted ha recibido un nuevo elemento compartido remoto {file} de {user}", + "{user} accepted the remote share of {file}" : "{user} aceptó el elemento compartido remoto de {file}", + "{user} declined the remote share of {file}" : "{user} declinó el elemento compartido remoto de {file}", + "{user} unshared {file} from you" : "{user} ha dejado de compartir {file} con usted", + "Shared with {user}" : "Compartido con {user}", + "Removed share for {user}" : "Eliminó el elemento compartido para {user}", + "{actor} shared with {user}" : "{actor} compartió con {user}", + "{actor} removed share for {user}" : "{actor} eliminó el elemento compartido para {user}", + "Shared by {actor}" : "Compartido por {actor}", + "{actor} removed share" : "{actor} eliminó el elemento compartido", + "You shared {file} with {user}" : "Usted ha compartido {file} con {user}", + "You removed {user} from {file}" : "Usted eliminó a {user} de {file}", + "{actor} shared {file} with {user}" : "{actor} compartió {file} con {user}", + "{actor} removed {user} from {file}" : "{actor} eliminó a {user} de {file}", + "{actor} shared {file} with you" : "{actor} ha compartido {file} con usted", + "{actor} removed you from {file}" : "{actor} lo eliminó de {file}", + "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Un archivo o carpeta comparitdo por correo o por liga pública ha sido <strong>descargado</strong>", + "A file or folder was shared from <strong>another server</strong>" : "Un archivo o carpeta fue compartido desde <strong>otro servidor</strong>", + "A file or folder has been <strong>shared</strong>" : "Un archivo o carpeta ha sido <strong>compartido</strong>", + "Wrong share ID, share doesn't exist" : "ID del elemento compartido equivocado, el elemento compartido no existe", + "could not delete share" : "no fue posible borrar el elemento compartido", + "Could not delete share" : "No fue posible borrar el elemento compartido", + "Please specify a file or folder path" : "Favor de especificar un archivo o ruta de carpeta", + "Wrong path, file/folder doesn't exist" : "La ruta es incorrecta, el correo / carpeta no existe ", + "Could not create share" : "no fue posible crear el elemento compartido", + "invalid permissions" : "permisos inválidos", + "Please specify a valid user" : "Favor de especificar un usuario válido", + "Group sharing is disabled by the administrator" : "Compartir en grupos está deshabilitado por el administrador", + "Please specify a valid group" : "Favor de especificar un grupo valido", + "Public link sharing is disabled by the administrator" : "Compartir ligas públicas está deshabilitado por el administrador", + "Public upload disabled by the administrator" : "Cargas públicas deshabilitadas por el administrador", + "Public upload is only possible for publicly shared folders" : "Las cargas públicas son posibles sólo para carpetas compartidas públicamente", + "Invalid date, date format must be YYYY-MM-DD" : "La fecha es inválida, favor de seguir el formato AAAA-MM-DD", + "Sharing %s failed because the back end does not allow shares from type %s" : "Se presentó una falla al compartir %s, porque el backend no permite elementos compartidos de tipo %s", + "You cannot share to a Circle if the app is not enabled" : "Usted no puede compartir al Círculo si la aplicación no esta habilitada", + "Please specify a valid circle" : "Favor de especificar un círculo válido", + "Unknown share type" : "Tipo de elemento compartido desconocido", + "Not a directory" : "No es una carpeta", + "Could not lock path" : "No fue posible bloquear la ruta", + "Wrong or no update parameter given" : "El parametro de actualización esta erróneo o faltante", + "Can't change permissions for public share links" : "No es posible cambiar los permisos para ligas públicas compartidas", + "Cannot increase permissions" : "No es posible incrementar los permisos", + "%s is publicly shared" : "%s está compartido públicamente", + "Share API is disabled" : "El API para compartir está deshabilitado", + "This share is password-protected" : "Este elemento compartido esta protegido con contraseña", + "The password is wrong. Try again." : "La contraseña es incorrecta. Favor de intentarlo de nuevo.", "Password" : "Contraseña", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", "Name" : "Nombre", - "Sorry, this link doesn’t seem to work anymore." : "Lo siento, este enlace al parecer ya no funciona.", + "Share time" : "Tiempo de compartir", + "Expiration date" : "Fecha de expiración", + "Sorry, this link doesn’t seem to work anymore." : "Lo sentimos, esta liga no parece funcionar más. ", "Reasons might be:" : "Las causas podrían ser:", "the item was removed" : "el elemento fue eliminado", - "the link expired" : "el enlace expiró", - "sharing is disabled" : "compartir está desactivado", - "For more info, please ask the person who sent this link." : "Para mayor información, contacte a la persona que le envió el enlace.", + "the link expired" : "la liga expiró", + "sharing is disabled" : "compartir está deshabilitado", + "For more info, please ask the person who sent this link." : "Para mayores informes, contacte a la persona que le envió esta liga.", + "Add to your Nextcloud" : "Agregar a su Nextcloud", "Download" : "Descargar", - "Direct link" : "Enlace directo" + "Download %s" : "Descargar %s", + "Direct link" : "Liga directa", + "Upload files to %s" : "Cargar archivos a %s", + "Uploading files…" : "Cargando archivos...", + "Uploaded files:" : "Archivos cargados:" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/fi.js b/apps/files_sharing/l10n/fi.js index 19393d8d93a..809c2b76170 100644 --- a/apps/files_sharing/l10n/fi.js +++ b/apps/files_sharing/l10n/fi.js @@ -57,6 +57,7 @@ OC.L10N.register( "{actor} removed share" : "{actor} lopetti jakamisen", "You shared {file} with {user}" : "Jaoit kohteen {file} käyttäjälle {user}", "You removed {user} from {file}" : "Poistit käyttäjän {user} kohteen {file} käyttöoikeudet", + "{actor} shared {file} with {user}" : "{actor} jakoi kohteen {file} käyttäjälle {user}", "{actor} removed {user} from {file}" : "{actor} poisti käyttäjän {user} kohteen {file} käyttöoikeudet", "{actor} shared {file} with you" : "{actor} jakoi kohteen {file} kanssasi", "{actor} removed you from {file}" : "{actor} poisti käyttöoikeutesi kohteeseen {file}", diff --git a/apps/files_sharing/l10n/fi.json b/apps/files_sharing/l10n/fi.json index 195db6370fc..276b09f5a6a 100644 --- a/apps/files_sharing/l10n/fi.json +++ b/apps/files_sharing/l10n/fi.json @@ -55,6 +55,7 @@ "{actor} removed share" : "{actor} lopetti jakamisen", "You shared {file} with {user}" : "Jaoit kohteen {file} käyttäjälle {user}", "You removed {user} from {file}" : "Poistit käyttäjän {user} kohteen {file} käyttöoikeudet", + "{actor} shared {file} with {user}" : "{actor} jakoi kohteen {file} käyttäjälle {user}", "{actor} removed {user} from {file}" : "{actor} poisti käyttäjän {user} kohteen {file} käyttöoikeudet", "{actor} shared {file} with you" : "{actor} jakoi kohteen {file} kanssasi", "{actor} removed you from {file}" : "{actor} poisti käyttöoikeutesi kohteeseen {file}", diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js index 28dac59985a..f846b029615 100644 --- a/apps/files_sharing/l10n/nl.js +++ b/apps/files_sharing/l10n/nl.js @@ -79,8 +79,8 @@ OC.L10N.register( "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen", "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD", "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt", - "You cannot share to a Circle if the app is not enabled" : "Je kunt niets met een cirkel delen als de app aan staat.", - "Please specify a valid circle" : "Geef een geldige circel op", + "You cannot share to a Circle if the app is not enabled" : "Je kunt niets met een Kring delen als de app niet is ingeschakeld.", + "Please specify a valid circle" : "Geef een geldige kring op", "Unknown share type" : "Onbekend type share", "Not a directory" : "Geen directory", "Could not lock path" : "Kon pad niet blokkeren", diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json index 70a8ad4aa9e..4797535e6c7 100644 --- a/apps/files_sharing/l10n/nl.json +++ b/apps/files_sharing/l10n/nl.json @@ -77,8 +77,8 @@ "Public upload is only possible for publicly shared folders" : "Publieke upload is alleen mogelijk voor publiek gedeelde mappen", "Invalid date, date format must be YYYY-MM-DD" : "Ongeldige datum, datumnotatie moet in de vorm YYYY-MM-DD", "Sharing %s failed because the back end does not allow shares from type %s" : "Delen van %s mislukte omdat de backend het delen van type %s niet ondersteunt", - "You cannot share to a Circle if the app is not enabled" : "Je kunt niets met een cirkel delen als de app aan staat.", - "Please specify a valid circle" : "Geef een geldige circel op", + "You cannot share to a Circle if the app is not enabled" : "Je kunt niets met een Kring delen als de app niet is ingeschakeld.", + "Please specify a valid circle" : "Geef een geldige kring op", "Unknown share type" : "Onbekend type share", "Not a directory" : "Geen directory", "Could not lock path" : "Kon pad niet blokkeren", diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js index 92328bf0beb..305ec8388dd 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -4,15 +4,15 @@ OC.L10N.register( "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado por link", - "Nothing shared with you yet" : "Nada compartilhado com você até agora", + "Nothing shared with you yet" : "Nada foi compartilhado com você até agora", "Files and folders others share with you will show up here" : "Arquivos e pastas que outros compartilham com você são mostrados aqui", "Nothing shared yet" : "Nada compartilhado até agora", "Files and folders you share will show up here" : "Arquivos e pastas que você compartilha são mostrados aqui", "No shared links" : "Nenhum link compartilhado", "Files and folders you share by link will show up here" : "Arquivos e pastas que você compartilha com link são mostrados aqui", "You can upload into this folder" : "Você não pode enviar arquivos para esta pasta", - "No compatible server found at {remote}" : "Nenhum servidor compativel encnotrado em {remote}", - "Invalid server URL" : "URL do servidor inválida", + "No compatible server found at {remote}" : "Nenhum servidor compativel encontrado em {remote}", + "Invalid server URL" : "URL inválida do servidor", "Failed to add the public link to your Nextcloud" : "Ocorreu uma falha ao adicionar o link público ao seu Nextcloud", "Share" : "Compartilhamento", "No expiration date set" : "Nenhuma data de expiração definida", @@ -36,19 +36,19 @@ OC.L10N.register( "Public link expired" : "O link público expirou", "{actor} shared as public link" : "{actor} compartilhado como um link publico", "{actor} removed public link" : "{actor} removido link publico", - "Public link of {actor} expired" : "O Link público de {actor} expirou.", + "Public link of {actor} expired" : "O link público de {actor} expirou.", "You shared {file} as public link" : "Voce compartilhou {file} como um link publico", "You removed public link for {file}" : "Voce removeu o link publico para {file}", - "Public link expired for {file}" : "O Link Público para {file} expirou", + "Public link expired for {file}" : "O link público para {file} expirou", "{actor} shared {file} as public link" : "{actor} compartilhado {file} como um link publico", "{actor} removed public link for {file}" : "{actor} removido link publico para {file}", - "Public link of {actor} for {file} expired" : "O Link Público de {actor} para {file} espirou", + "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} espirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", - "{user} declined the remote share of {file}" : "{user} declinou o compartilhamento remoto de {file}", - "{user} unshared {file} from you" : "{user} descompartilhou {file} de voce", + "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", + "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", "Shared with {user}" : "Compartilhado com {user}", "Removed share for {user}" : "Compartilhamento removido para {user}", "{actor} shared with {user}" : "{actor} compartilhado com {user}", @@ -57,17 +57,18 @@ OC.L10N.register( "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Voce compartilhou {arquivo} com {user}", "You removed {user} from {file}" : "Voce removeu {user} de {file}", + "{actor} shared {file} with {user}" : "{actor} compartilhado {file} com {user}", "{actor} removed {user} from {file}" : "{actor} removido {user} de {file}", - "{actor} shared {file} with you" : "{actor} compartilhado {file} com voce", - "{actor} removed you from {file}" : "{actor} removeu voce de {file}", + "{actor} shared {file} with you" : "{actor} compartilhado {file} com você", + "{actor} removed you from {file}" : "{actor} removeu você de {file}", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", "could not delete share" : "não foi possível excluir o compartilhamento", - "Could not delete share" : "Não foi possível eliminar o compartilhamento", + "Could not delete share" : "Não foi possível excluir o compartilhamento", "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho", - "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe", + "Wrong path, file/folder doesn't exist" : "Caminho errado, o arquivo ou pasta não existe", "Could not create share" : "Não foi possível criar o compartilhamento", "invalid permissions" : "permissões inválidas", "Please specify a valid user" : "Por favor especifique um usuário válido", @@ -78,27 +79,29 @@ OC.L10N.register( "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD", "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habiltiado", + "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", - "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido", + "Wrong or no update parameter given" : "O parâmetro de atualização fornecido está errado ou desatualizado", "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos", - "Cannot increase permissions" : "Não pode haver aumento de permissões", + "Cannot increase permissions" : "Não é possível aumentar permissões", "%s is publicly shared" : "%s é um compartilhamento publico", "Share API is disabled" : "O compartilhamento de API está desabilitado.", - "This share is password-protected" : "Este compartilhamento esta protegido por senha", + "This share is password-protected" : "Este compartilhamento é protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Name" : "Nome", - "Share time" : "Data compartilhado", + "Share time" : "Data de compartilhamento", "Expiration date" : "Data de expiração", - "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", + "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", "Reasons might be:" : "As razões podem ser:", "the item was removed" : "o item foi removido", "the link expired" : "o link expirou", "sharing is disabled" : "o compartilhamento está desativado", - "For more info, please ask the person who sent this link." : "Para mais informações, por favor, pergunte a pessoa que enviou este link.", + "For more info, please ask the person who sent this link." : "Para mais informações, por favor, pergunte à pessoa que lhe enviou este link.", "Add to your Nextcloud" : "Adicionar ao seu Nextcloud", "Download" : "Baixar", "Download %s" : "Baixar %s", diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index 58ed59a7a69..cab191c7877 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -2,15 +2,15 @@ "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado por link", - "Nothing shared with you yet" : "Nada compartilhado com você até agora", + "Nothing shared with you yet" : "Nada foi compartilhado com você até agora", "Files and folders others share with you will show up here" : "Arquivos e pastas que outros compartilham com você são mostrados aqui", "Nothing shared yet" : "Nada compartilhado até agora", "Files and folders you share will show up here" : "Arquivos e pastas que você compartilha são mostrados aqui", "No shared links" : "Nenhum link compartilhado", "Files and folders you share by link will show up here" : "Arquivos e pastas que você compartilha com link são mostrados aqui", "You can upload into this folder" : "Você não pode enviar arquivos para esta pasta", - "No compatible server found at {remote}" : "Nenhum servidor compativel encnotrado em {remote}", - "Invalid server URL" : "URL do servidor inválida", + "No compatible server found at {remote}" : "Nenhum servidor compativel encontrado em {remote}", + "Invalid server URL" : "URL inválida do servidor", "Failed to add the public link to your Nextcloud" : "Ocorreu uma falha ao adicionar o link público ao seu Nextcloud", "Share" : "Compartilhamento", "No expiration date set" : "Nenhuma data de expiração definida", @@ -34,19 +34,19 @@ "Public link expired" : "O link público expirou", "{actor} shared as public link" : "{actor} compartilhado como um link publico", "{actor} removed public link" : "{actor} removido link publico", - "Public link of {actor} expired" : "O Link público de {actor} expirou.", + "Public link of {actor} expired" : "O link público de {actor} expirou.", "You shared {file} as public link" : "Voce compartilhou {file} como um link publico", "You removed public link for {file}" : "Voce removeu o link publico para {file}", - "Public link expired for {file}" : "O Link Público para {file} expirou", + "Public link expired for {file}" : "O link público para {file} expirou", "{actor} shared {file} as public link" : "{actor} compartilhado {file} como um link publico", "{actor} removed public link for {file}" : "{actor} removido link publico para {file}", - "Public link of {actor} for {file} expired" : "O Link Público de {actor} para {file} espirou", + "Public link of {actor} for {file} expired" : "O link público de {actor} para {file} espirou", "{user} accepted the remote share" : "{user} aceitou o compartilhamento remoto", "{user} declined the remote share" : "{user} declinou do compartilhamento remoto", "You received a new remote share {file} from {user}" : "Voce recebeu um novo compartilhamento remoto {file} de {user}", "{user} accepted the remote share of {file}" : "{user} aceitou o compartilhamento remoto de {file}", - "{user} declined the remote share of {file}" : "{user} declinou o compartilhamento remoto de {file}", - "{user} unshared {file} from you" : "{user} descompartilhou {file} de voce", + "{user} declined the remote share of {file}" : "{user} declinou do compartilhamento remoto de {file}", + "{user} unshared {file} from you" : "{user} descompartilhou {file} de você", "Shared with {user}" : "Compartilhado com {user}", "Removed share for {user}" : "Compartilhamento removido para {user}", "{actor} shared with {user}" : "{actor} compartilhado com {user}", @@ -55,17 +55,18 @@ "{actor} removed share" : "{actor} compartilhamento removido", "You shared {file} with {user}" : "Voce compartilhou {arquivo} com {user}", "You removed {user} from {file}" : "Voce removeu {user} de {file}", + "{actor} shared {file} with {user}" : "{actor} compartilhado {file} com {user}", "{actor} removed {user} from {file}" : "{actor} removido {user} de {file}", - "{actor} shared {file} with you" : "{actor} compartilhado {file} com voce", - "{actor} removed you from {file}" : "{actor} removeu voce de {file}", + "{actor} shared {file} with you" : "{actor} compartilhado {file} com você", + "{actor} removed you from {file}" : "{actor} removeu você de {file}", "A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhado por email ou por link publico foi <strong>baixado</strong>", "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhado a partir de <strong>outro servidor</strong>", "A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ", "Wrong share ID, share doesn't exist" : "ID de compartilhamento errado, o compartilhamento não existe", "could not delete share" : "não foi possível excluir o compartilhamento", - "Could not delete share" : "Não foi possível eliminar o compartilhamento", + "Could not delete share" : "Não foi possível excluir o compartilhamento", "Please specify a file or folder path" : "Por favor especifique um arquivo ou caminho", - "Wrong path, file/folder doesn't exist" : "Caminho errado, arquivo/pasta não existe", + "Wrong path, file/folder doesn't exist" : "Caminho errado, o arquivo ou pasta não existe", "Could not create share" : "Não foi possível criar o compartilhamento", "invalid permissions" : "permissões inválidas", "Please specify a valid user" : "Por favor especifique um usuário válido", @@ -76,27 +77,29 @@ "Public upload is only possible for publicly shared folders" : "Envio pública só é possível para pastas compartilhadas publicamente", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato de data deve ser YYYY-MM-DD", "Sharing %s failed because the back end does not allow shares from type %s" : "O compartilhando %s falhou porque o backend não permite ações de tipo %s", + "You cannot share to a Circle if the app is not enabled" : "Você não pode compartilhar para um círculo se o aplicativo não está habiltiado", + "Please specify a valid circle" : "Por favor especifique um círculo válido", "Unknown share type" : "Tipo de compartilhamento desconhecido", "Not a directory" : "Não é um diretório", "Could not lock path" : "Não foi possível bloquear o caminho", - "Wrong or no update parameter given" : "Está errado ou nenhum parâmetro de atualização foi fornecido", + "Wrong or no update parameter given" : "O parâmetro de atualização fornecido está errado ou desatualizado", "Can't change permissions for public share links" : "Não é possível alterar permissões para compartilhar links públicos", - "Cannot increase permissions" : "Não pode haver aumento de permissões", + "Cannot increase permissions" : "Não é possível aumentar permissões", "%s is publicly shared" : "%s é um compartilhamento publico", "Share API is disabled" : "O compartilhamento de API está desabilitado.", - "This share is password-protected" : "Este compartilhamento esta protegido por senha", + "This share is password-protected" : "Este compartilhamento é protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Name" : "Nome", - "Share time" : "Data compartilhado", + "Share time" : "Data de compartilhamento", "Expiration date" : "Data de expiração", - "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", + "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", "Reasons might be:" : "As razões podem ser:", "the item was removed" : "o item foi removido", "the link expired" : "o link expirou", "sharing is disabled" : "o compartilhamento está desativado", - "For more info, please ask the person who sent this link." : "Para mais informações, por favor, pergunte a pessoa que enviou este link.", + "For more info, please ask the person who sent this link." : "Para mais informações, por favor, pergunte à pessoa que lhe enviou este link.", "Add to your Nextcloud" : "Adicionar ao seu Nextcloud", "Download" : "Baixar", "Download %s" : "Baixar %s", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index 7370d65f9d7..5065569f27a 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -19,7 +19,7 @@ OC.L10N.register( "Shared by" : "Поделился", "Sharing" : "Общий доступ", "File shares" : "Файловые ресурсы общего доступа", - "Downloaded via public link" : "Скачано по открытой ссылке", + "Downloaded via public link" : "Скачано по общедоступной ссылке", "Downloaded by {email}" : "Скачано {email}", "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке", "{email} downloaded {file}" : "{email} скачал {file}", @@ -74,7 +74,7 @@ OC.L10N.register( "Please specify a valid user" : "Пожалуйста, укажите допустимого пользователя", "Group sharing is disabled by the administrator" : "Общий доступ для групп отключён администратором", "Please specify a valid group" : "Пожалуйста, укажите допустимую группу", - "Public link sharing is disabled by the administrator" : "Публикация через общие ссылки отключена администратором", + "Public link sharing is disabled by the administrator" : "Публикация через общедоступные ссылки отключена администратором", "Public upload disabled by the administrator" : "Загрузка в общедоступную публикацию запрещена администратором", "Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в папки с общим доступом", "Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД", @@ -85,9 +85,9 @@ OC.L10N.register( "Not a directory" : "Это не каталог", "Could not lock path" : "Не удалось заблокировать путь", "Wrong or no update parameter given" : "Параметр для изменения неправилен или не задан", - "Can't change permissions for public share links" : "Невозможно изменить права для публикации через ссылку", + "Can't change permissions for public share links" : "Невозможно изменить права для публикации через общедоступной ссылку", "Cannot increase permissions" : "Нельзя увеличить права", - "%s is publicly shared" : "%s опубликован", + "%s is publicly shared" : "%s опубликован ", "Share API is disabled" : "API общего доступа отключён", "This share is password-protected" : "Общий ресурс защищен паролем", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index 230e4d78b4a..8330a55101d 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -17,7 +17,7 @@ "Shared by" : "Поделился", "Sharing" : "Общий доступ", "File shares" : "Файловые ресурсы общего доступа", - "Downloaded via public link" : "Скачано по открытой ссылке", + "Downloaded via public link" : "Скачано по общедоступной ссылке", "Downloaded by {email}" : "Скачано {email}", "{file} downloaded via public link" : "{file} скачан по общедоступной ссылке", "{email} downloaded {file}" : "{email} скачал {file}", @@ -72,7 +72,7 @@ "Please specify a valid user" : "Пожалуйста, укажите допустимого пользователя", "Group sharing is disabled by the administrator" : "Общий доступ для групп отключён администратором", "Please specify a valid group" : "Пожалуйста, укажите допустимую группу", - "Public link sharing is disabled by the administrator" : "Публикация через общие ссылки отключена администратором", + "Public link sharing is disabled by the administrator" : "Публикация через общедоступные ссылки отключена администратором", "Public upload disabled by the administrator" : "Загрузка в общедоступную публикацию запрещена администратором", "Public upload is only possible for publicly shared folders" : "Общедоступная загрузка возможна только в папки с общим доступом", "Invalid date, date format must be YYYY-MM-DD" : "Неверная дата, формат даты должен быть ГГГГ-ММ-ДД", @@ -83,9 +83,9 @@ "Not a directory" : "Это не каталог", "Could not lock path" : "Не удалось заблокировать путь", "Wrong or no update parameter given" : "Параметр для изменения неправилен или не задан", - "Can't change permissions for public share links" : "Невозможно изменить права для публикации через ссылку", + "Can't change permissions for public share links" : "Невозможно изменить права для публикации через общедоступной ссылку", "Cannot increase permissions" : "Нельзя увеличить права", - "%s is publicly shared" : "%s опубликован", + "%s is publicly shared" : "%s опубликован ", "Share API is disabled" : "API общего доступа отключён", "This share is password-protected" : "Общий ресурс защищен паролем", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", diff --git a/apps/files_sharing/lib/Capabilities.php b/apps/files_sharing/lib/Capabilities.php index bfbd15c1122..22a8a8a0a3d 100644 --- a/apps/files_sharing/lib/Capabilities.php +++ b/apps/files_sharing/lib/Capabilities.php @@ -76,14 +76,22 @@ class Capabilities implements ICapability { $res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes'; $res['user']['send_mail'] = false; + $res['user']['expire_date']['enabled'] = true; + // deprecated in favour of 'group', but we need to keep it for now + // in order to stay compatible with older clients $res['group_sharing'] = $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes') === 'yes'; + + $res['group'] = []; + $res['group']['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes') === 'yes'; + $res['group']['expire_date']['enabled'] = true; } //Federated sharing $res['federation'] = [ 'outgoing' => $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes', - 'incoming' => $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'yes' + 'incoming' => $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'yes', + 'expire_date' => ['enabled' => true] ]; return [ diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php index 78eef6c26bb..bc525b6ef82 100644 --- a/apps/files_sharing/lib/Controller/ShareAPIController.php +++ b/apps/files_sharing/lib/Controller/ShareAPIController.php @@ -163,6 +163,11 @@ class ShareAPIController extends OCSController { $result['file_parent'] = $node->getParent()->getId(); $result['file_target'] = $share->getTarget(); + $expiration = $share->getExpirationDate(); + if ($expiration !== null) { + $result['expiration'] = $expiration->format('Y-m-d 00:00:00'); + } + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { $sharedWith = $this->userManager->get($share->getSharedWith()); $result['share_with'] = $share->getSharedWith(); @@ -179,17 +184,13 @@ class ShareAPIController extends OCSController { $result['token'] = $share->getToken(); $result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]); - $expiration = $share->getExpirationDate(); - if ($expiration !== null) { - $result['expiration'] = $expiration->format('Y-m-d 00:00:00'); - } - } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) { $result['share_with'] = $share->getSharedWith(); $result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'CLOUD'); $result['token'] = $share->getToken(); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) { $result['share_with'] = $share->getSharedWith(); + $result['password'] = $share->getPassword(); $result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'EMAIL'); $result['token'] = $share->getToken(); } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_CIRCLE) { @@ -668,13 +669,14 @@ class ShareAPIController extends OCSController { throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist')); } + if ($permissions === null && $password === null && $publicUpload === null && $expireDate === null) { + throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given')); + } + /* * expirationdate, password and publicUpload only make sense for link shares */ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) { - if ($permissions === null && $password === null && $publicUpload === null && $expireDate === null) { - throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given')); - } $newPermissions = null; if ($publicUpload === 'true') { @@ -740,13 +742,30 @@ class ShareAPIController extends OCSController { } } else { - // For other shares only permissions is valid. - if ($permissions === null) { - throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given')); - } else { + if ($permissions !== null) { $permissions = (int)$permissions; $share->setPermissions($permissions); } + + if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) { + if ($password === '') { + $share->setPassword(null); + } else if ($password !== null) { + $share->setPassword($password); + } + } + + if ($expireDate === '') { + $share->setExpirationDate(null); + } else if ($expireDate !== null) { + try { + $expireDate = $this->parseDate($expireDate); + } catch (\Exception $e) { + throw new OCSBadRequestException($e->getMessage()); + } + $share->setExpirationDate($expireDate); + } + } if ($permissions !== null && $share->getShareOwner() !== $this->currentUser) { diff --git a/apps/files_sharing/lib/Migration.php b/apps/files_sharing/lib/Migration.php index 605a11fd22c..49e275cbe6e 100644 --- a/apps/files_sharing/lib/Migration.php +++ b/apps/files_sharing/lib/Migration.php @@ -123,6 +123,24 @@ class Migration { $this->config->deleteAppValue('core', 'shareapi_allow_public_notification'); } + public function addPasswordColumn() { + $query = $this->connection->getQueryBuilder(); + $query + ->update('share') + ->set('password', 'share_with') + ->where($query->expr()->eq('share_type', $query->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))) + ->andWhere($query->expr()->isNotNull('share_with')); + $query->execute(); + + $clearQuery = $this->connection->getQueryBuilder(); + $clearQuery + ->update('share')->set('share_with', $clearQuery->createNamedParameter(null)) + ->where($clearQuery->expr()->eq('share_type', $clearQuery->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))); + + $clearQuery->execute(); + + } + /** * find the owner of a re-shared file/folder * diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php index 540905a7dc9..046ede1f83e 100644 --- a/apps/files_sharing/tests/ApiTest.php +++ b/apps/files_sharing/tests/ApiTest.php @@ -938,36 +938,6 @@ class ApiTest extends TestCase { /** * @medium - * @depends testCreateShareUserFile - */ - public function testUpdateShareInvalidPermissions() { - $node1 = $this->userFolder->get($this->filename); - $share1 = $this->shareManager->newShare(); - $share1->setNode($node1) - ->setSharedBy(self::TEST_FILES_SHARING_API_USER1) - ->setSharedWith(self::TEST_FILES_SHARING_API_USER2) - ->setShareType(\OCP\Share::SHARE_TYPE_USER) - ->setPermissions(19); - $share1 = $this->shareManager->createShare($share1); - - $ocs = $this->createOCS(self::TEST_FILES_SHARING_API_USER1); - try { - $ocs->updateShare($share1->getId()); - $this->fail(); - } catch (OCSBadRequestException $e) { - - } - $ocs->cleanup(); - - //Permissions should not have changed! - $share1 = $this->shareManager->getShareById('ocinternal:' . $share1->getId()); - $this->assertEquals(19, $share1->getPermissions()); - - $this->shareManager->deleteShare($share1); - } - - /** - * @medium */ function testUpdateShareUpload() { $node1 = $this->userFolder->get($this->folder); diff --git a/apps/files_sharing/tests/CapabilitiesTest.php b/apps/files_sharing/tests/CapabilitiesTest.php index 3d59b1f6f34..663adc1f271 100644 --- a/apps/files_sharing/tests/CapabilitiesTest.php +++ b/apps/files_sharing/tests/CapabilitiesTest.php @@ -25,6 +25,7 @@ namespace OCA\Files_Sharing\Tests; use OCA\Files_Sharing\Capabilities; use OCA\Files_Sharing\Tests\TestCase; +use OCP\App\IAppManager; /** * Class CapabilitiesTest @@ -46,7 +47,7 @@ class CapabilitiesTest extends \Test\TestCase { } /** - * Create a mock config object and insert the values in $map tot the getAppValue + * Create a mock config object and insert the values in $map to the getAppValue * function. Then obtain the capabilities and extract the first few * levels in the array * @@ -54,9 +55,9 @@ class CapabilitiesTest extends \Test\TestCase { * @return string[] */ private function getResults(array $map) { - $stub = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock(); - $stub->method('getAppValue')->will($this->returnValueMap($map)); - $cap = new Capabilities($stub); + $config = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock(); + $config->method('getAppValue')->will($this->returnValueMap($map)); + $cap = new Capabilities($config); $result = $this->getFilesSharingPart($cap->getCapabilities()); return $result; } diff --git a/apps/files_sharing/tests/MigrationTest.php b/apps/files_sharing/tests/MigrationTest.php index 572f64da743..708de1c0eca 100644 --- a/apps/files_sharing/tests/MigrationTest.php +++ b/apps/files_sharing/tests/MigrationTest.php @@ -28,6 +28,7 @@ namespace OCA\Files_Sharing\Tests; use OCA\Files_Sharing\Migration; +use OCP\Share; /** * Class MigrationTest @@ -87,7 +88,7 @@ class MigrationTest extends TestCase { ) ); // shared contact, shouldn't be modified - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_CONTACT) + $query->setParameter('share_type', Share::SHARE_TYPE_CONTACT) ->setParameter('share_with', 'user1') ->setParameter('uid_owner', 'owner1') ->setParameter('uid_initiator', '') @@ -103,7 +104,7 @@ class MigrationTest extends TestCase { $query->execute() ); // shared calendar, shouldn't be modified - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + $query->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user1') ->setParameter('uid_owner', 'owner1') ->setParameter('uid_initiator', '') @@ -119,7 +120,7 @@ class MigrationTest extends TestCase { $query->execute() ); // single user share, shouldn't be modified - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + $query->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user1') ->setParameter('uid_owner', 'owner1') ->setParameter('uid_initiator', '') @@ -135,7 +136,7 @@ class MigrationTest extends TestCase { $query->execute() ); // single group share, shouldn't be modified - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_GROUP) + $query->setParameter('share_type', Share::SHARE_TYPE_GROUP) ->setParameter('share_with', 'group1') ->setParameter('uid_owner', 'owner1') ->setParameter('uid_initiator', '') @@ -168,7 +169,7 @@ class MigrationTest extends TestCase { $query->execute() ); // first user share, shouldn't be modified - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + $query->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user1') ->setParameter('uid_owner', 'owner2') ->setParameter('uid_initiator', '') @@ -185,7 +186,7 @@ class MigrationTest extends TestCase { ); $parent = $query->getLastInsertId(); // first re-share, should be attached to the first user share after migration - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + $query->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user2') ->setParameter('uid_owner', 'user1') ->setParameter('uid_initiator', '') @@ -202,7 +203,7 @@ class MigrationTest extends TestCase { ); $parent = $query->getLastInsertId(); // second re-share, should be attached to the first user share after migration - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + $query->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user3') ->setParameter('uid_owner', 'user2') ->setParameter('uid_initiator', '') @@ -219,7 +220,7 @@ class MigrationTest extends TestCase { ); $parent = $query->getLastInsertId(); // third re-share, should be attached to the first user share after migration - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_REMOTE) + $query->setParameter('share_type', Share::SHARE_TYPE_REMOTE) ->setParameter('share_with', 'user@server.com') ->setParameter('uid_owner', 'user3') ->setParameter('uid_initiator', '') @@ -236,7 +237,7 @@ class MigrationTest extends TestCase { ); // Link reshare should keep its parent - $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_LINK) + $query->setParameter('share_type', Share::SHARE_TYPE_LINK) ->setParameter('share_with', null) ->setParameter('uid_owner', 'user3') ->setParameter('uid_initiator', '') @@ -317,7 +318,7 @@ class MigrationTest extends TestCase { 'stime' => $query->createParameter('stime'), ] ) - ->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER) + ->setParameter('share_type', Share::SHARE_TYPE_USER) ->setParameter('share_with', 'user'.($i+1)) ->setParameter('uid_owner', 'user'.($i)) ->setParameter('uid_initiator', null) @@ -377,4 +378,63 @@ class MigrationTest extends TestCase { $this->config->getAppValue('core', 'shareapi_setting1', null) ); } + + public function testAddPasswordColumn() { + + $shareTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE, Share::SHARE_TYPE_EMAIL, Share::SHARE_TYPE_LINK]; + + foreach ($shareTypes as $shareType) { + + for ($i = 0; $i < 5; $i++) { + $query = $this->connection->getQueryBuilder(); + $query->insert($this->table) + ->values( + [ + 'share_type' => $query->createParameter('share_type'), + 'share_with' => $query->createParameter('share_with'), + 'uid_owner' => $query->createParameter('uid_owner'), + 'uid_initiator' => $query->createParameter('uid_initiator'), + 'parent' => $query->createParameter('parent'), + 'item_type' => $query->createParameter('item_type'), + 'item_source' => $query->createParameter('item_source'), + 'item_target' => $query->createParameter('item_target'), + 'file_source' => $query->createParameter('file_source'), + 'file_target' => $query->createParameter('file_target'), + 'permissions' => $query->createParameter('permissions'), + 'stime' => $query->createParameter('stime'), + ] + ) + ->setParameter('share_type', $shareType) + ->setParameter('share_with', 'shareWith') + ->setParameter('uid_owner', 'user' . ($i)) + ->setParameter('uid_initiator', null) + ->setParameter('parent', 0) + ->setParameter('item_type', 'file') + ->setParameter('item_source', '2') + ->setParameter('item_target', '/2') + ->setParameter('file_source', 2) + ->setParameter('file_target', '/foobar') + ->setParameter('permissions', 31) + ->setParameter('stime', time()); + + $this->assertSame(1, $query->execute()); + } + } + + $this->migration->addPasswordColumn(); + + $query = $this->connection->getQueryBuilder(); + $query->select('*')->from('share'); + $allShares = $query->execute()->fetchAll(); + + foreach ($allShares as $share) { + if ((int)$share['share_type'] === Share::SHARE_TYPE_LINK) { + $this->assertNull( $share['share_with']); + $this->assertSame('shareWith', $share['password']); + } else { + $this->assertSame('shareWith', $share['share_with']); + $this->assertNull($share['password']); + } + } + } } diff --git a/apps/files_trashbin/l10n/es_MX.js b/apps/files_trashbin/l10n/es_MX.js index 109427e9d80..62c1944a81f 100644 --- a/apps/files_trashbin/l10n/es_MX.js +++ b/apps/files_trashbin/l10n/es_MX.js @@ -1,15 +1,21 @@ OC.L10N.register( "files_trashbin", { - "Couldn't delete %s permanently" : "No se puede eliminar %s permanentemente", - "Couldn't restore %s" : "No se puede restaurar %s", - "Deleted files" : "Archivos eliminados", - "Restore" : "Recuperar", - "Delete" : "Eliminar", - "Delete permanently" : "Eliminar permanentemente", + "Couldn't delete %s permanently" : "No fue posible eliminar %s permanentemente", + "Couldn't restore %s" : "No fue posible restaurar %s", + "Deleted files" : "Archivos borrados", + "Restore" : "Restaurar", + "Delete" : "Borrar", + "Delete permanently" : "Borrar permanentemente", "Error" : "Error", - "restored" : "recuperado", + "This operation is forbidden" : "Esta opración está prohibida", + "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio no está disponible, favor de verificar las bitácoras o contacte al administrador", + "restored" : "restaurado", + "No deleted files" : "No hay archivos borrados", + "You will be able to recover deleted files from here" : "Usted podrá recuperar archivos borrados desde aquí", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", + "Select all" : "Seleccionar todo", "Name" : "Nombre", - "Deleted" : "Eliminado" + "Deleted" : "Borrado" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/es_MX.json b/apps/files_trashbin/l10n/es_MX.json index a1bbba28cde..294115a66e4 100644 --- a/apps/files_trashbin/l10n/es_MX.json +++ b/apps/files_trashbin/l10n/es_MX.json @@ -1,13 +1,19 @@ { "translations": { - "Couldn't delete %s permanently" : "No se puede eliminar %s permanentemente", - "Couldn't restore %s" : "No se puede restaurar %s", - "Deleted files" : "Archivos eliminados", - "Restore" : "Recuperar", - "Delete" : "Eliminar", - "Delete permanently" : "Eliminar permanentemente", + "Couldn't delete %s permanently" : "No fue posible eliminar %s permanentemente", + "Couldn't restore %s" : "No fue posible restaurar %s", + "Deleted files" : "Archivos borrados", + "Restore" : "Restaurar", + "Delete" : "Borrar", + "Delete permanently" : "Borrar permanentemente", "Error" : "Error", - "restored" : "recuperado", + "This operation is forbidden" : "Esta opración está prohibida", + "This directory is unavailable, please check the logs or contact the administrator" : "Este directorio no está disponible, favor de verificar las bitácoras o contacte al administrador", + "restored" : "restaurado", + "No deleted files" : "No hay archivos borrados", + "You will be able to recover deleted files from here" : "Usted podrá recuperar archivos borrados desde aquí", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", + "Select all" : "Seleccionar todo", "Name" : "Nombre", - "Deleted" : "Eliminado" + "Deleted" : "Borrado" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/pt_BR.js b/apps/files_trashbin/l10n/pt_BR.js index 806200ea651..105b3f5a480 100644 --- a/apps/files_trashbin/l10n/pt_BR.js +++ b/apps/files_trashbin/l10n/pt_BR.js @@ -3,16 +3,16 @@ OC.L10N.register( { "Couldn't delete %s permanently" : "Não foi possível excluir %s permanentemente", "Couldn't restore %s" : "Não foi possível restaurar %s", - "Deleted files" : "Arquivos apagados", + "Deleted files" : "Arquivos excluídos", "Restore" : "Restaurar", "Delete" : "Excluir", "Delete permanently" : "Excluir permanentemente", "Error" : "Erro", "This operation is forbidden" : "Esta operação é proibida", - "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", + "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível. Por favor verifique os logs ou entre em contato com o administrador", "restored" : "restaurado", "No deleted files" : "Nenhum arquivo excluído", - "You will be able to recover deleted files from here" : "Neste local, você será capaz de recuperar arquivos excluídos", + "You will be able to recover deleted files from here" : "Neste local, você pode recuperar arquivos excluídos", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", "Name" : "Nome", diff --git a/apps/files_trashbin/l10n/pt_BR.json b/apps/files_trashbin/l10n/pt_BR.json index 177a377bdfd..f9cad4f911d 100644 --- a/apps/files_trashbin/l10n/pt_BR.json +++ b/apps/files_trashbin/l10n/pt_BR.json @@ -1,16 +1,16 @@ { "translations": { "Couldn't delete %s permanently" : "Não foi possível excluir %s permanentemente", "Couldn't restore %s" : "Não foi possível restaurar %s", - "Deleted files" : "Arquivos apagados", + "Deleted files" : "Arquivos excluídos", "Restore" : "Restaurar", "Delete" : "Excluir", "Delete permanently" : "Excluir permanentemente", "Error" : "Erro", "This operation is forbidden" : "Esta operação é proibida", - "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível, por favor, verifique os logs ou entre em contato com o administrador", + "This directory is unavailable, please check the logs or contact the administrator" : "Este diretório não está disponível. Por favor verifique os logs ou entre em contato com o administrador", "restored" : "restaurado", "No deleted files" : "Nenhum arquivo excluído", - "You will be able to recover deleted files from here" : "Neste local, você será capaz de recuperar arquivos excluídos", + "You will be able to recover deleted files from here" : "Neste local, você pode recuperar arquivos excluídos", "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Select all" : "Selecionar tudo", "Name" : "Nome", diff --git a/apps/files_trashbin/l10n/sr.js b/apps/files_trashbin/l10n/sr.js index dc3c8b46bc7..0654dc5711f 100644 --- a/apps/files_trashbin/l10n/sr.js +++ b/apps/files_trashbin/l10n/sr.js @@ -9,7 +9,7 @@ OC.L10N.register( "Delete permanently" : "Обриши заувек", "Error" : "Грешка", "This operation is forbidden" : "Ова радња је забрањена", - "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", + "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записнике или контактирајте администратора", "restored" : "враћено", "No deleted files" : "Нема обрисаних фајлова", "You will be able to recover deleted files from here" : "Одавде ћете моћи да повратите обрисане фајлове", diff --git a/apps/files_trashbin/l10n/sr.json b/apps/files_trashbin/l10n/sr.json index c57bbdb83d4..237a384988e 100644 --- a/apps/files_trashbin/l10n/sr.json +++ b/apps/files_trashbin/l10n/sr.json @@ -7,7 +7,7 @@ "Delete permanently" : "Обриши заувек", "Error" : "Грешка", "This operation is forbidden" : "Ова радња је забрањена", - "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записе или контактирајте администратора", + "This directory is unavailable, please check the logs or contact the administrator" : "Овај директоријум није доступан, проверите записнике или контактирајте администратора", "restored" : "враћено", "No deleted files" : "Нема обрисаних фајлова", "You will be able to recover deleted files from here" : "Одавде ћете моћи да повратите обрисане фајлове", diff --git a/apps/files_versions/l10n/ca.js b/apps/files_versions/l10n/ca.js index 6ac0e78e8ba..f6029625bf6 100644 --- a/apps/files_versions/l10n/ca.js +++ b/apps/files_versions/l10n/ca.js @@ -6,6 +6,7 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Ha fallat en retornar {file} a la revisió {timestamp}", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Recupera", + "More versions …" : "Més versións ...", "No versions available" : "No hi ha versions disponibles", "More versions..." : "Més versions..." }, diff --git a/apps/files_versions/l10n/ca.json b/apps/files_versions/l10n/ca.json index f69ded64991..4195f1399e2 100644 --- a/apps/files_versions/l10n/ca.json +++ b/apps/files_versions/l10n/ca.json @@ -4,6 +4,7 @@ "Failed to revert {file} to revision {timestamp}." : "Ha fallat en retornar {file} a la revisió {timestamp}", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Recupera", + "More versions …" : "Més versións ...", "No versions available" : "No hi ha versions disponibles", "More versions..." : "Més versions..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/l10n/es.js b/apps/files_versions/l10n/es.js index 0649334a973..2a35aca3231 100644 --- a/apps/files_versions/l10n/es.js +++ b/apps/files_versions/l10n/es.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "No se ha podido revertir {archivo} a revisión {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Recuperar", + "No earlier versions available" : "No hay versiones previouses disponibles", + "More versions …" : "Más versiones ...", "No versions available" : "No hay versiones disponibles", "More versions..." : "Más versiones..." }, diff --git a/apps/files_versions/l10n/es.json b/apps/files_versions/l10n/es.json index 1141909c7bf..19b2fa5ea3b 100644 --- a/apps/files_versions/l10n/es.json +++ b/apps/files_versions/l10n/es.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "No se ha podido revertir {archivo} a revisión {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Recuperar", + "No earlier versions available" : "No hay versiones previouses disponibles", + "More versions …" : "Más versiones ...", "No versions available" : "No hay versiones disponibles", "More versions..." : "Más versiones..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/l10n/es_MX.js b/apps/files_versions/l10n/es_MX.js index 2af328055b1..8bda31e11d3 100644 --- a/apps/files_versions/l10n/es_MX.js +++ b/apps/files_versions/l10n/es_MX.js @@ -1,7 +1,7 @@ OC.L10N.register( "files_versions", { - "Could not revert: %s" : "No se pudo revertir: %s", + "Could not revert: %s" : "No fue posible revertir: %s", "Versions" : "Versiones", "Failed to revert {file} to revision {timestamp}." : "Falla al revertir {archivo} a revisión {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], diff --git a/apps/files_versions/l10n/es_MX.json b/apps/files_versions/l10n/es_MX.json index 34348cde567..b31be35fcbc 100644 --- a/apps/files_versions/l10n/es_MX.json +++ b/apps/files_versions/l10n/es_MX.json @@ -1,5 +1,5 @@ { "translations": { - "Could not revert: %s" : "No se pudo revertir: %s", + "Could not revert: %s" : "No fue posible revertir: %s", "Versions" : "Versiones", "Failed to revert {file} to revision {timestamp}." : "Falla al revertir {archivo} a revisión {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], diff --git a/apps/files_versions/l10n/fi.js b/apps/files_versions/l10n/fi.js index cd42bef6d3e..b89debb63c1 100644 --- a/apps/files_versions/l10n/fi.js +++ b/apps/files_versions/l10n/fi.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Tiedoston {file} palautus versioon {timestamp} epäonnistui.", "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Restore" : "Palauta", + "No earlier versions available" : "Ei aikaisempia versioita saatavilla", + "More versions …" : "Lisää versioita...", "No versions available" : "Ei versioita saatavilla", "More versions..." : "Lisää versioita..." }, diff --git a/apps/files_versions/l10n/fi.json b/apps/files_versions/l10n/fi.json index 6ae01393eb4..58d3311b77c 100644 --- a/apps/files_versions/l10n/fi.json +++ b/apps/files_versions/l10n/fi.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Tiedoston {file} palautus versioon {timestamp} epäonnistui.", "_%n byte_::_%n bytes_" : ["%n tavu","%n tavua"], "Restore" : "Palauta", + "No earlier versions available" : "Ei aikaisempia versioita saatavilla", + "More versions …" : "Lisää versioita...", "No versions available" : "Ei versioita saatavilla", "More versions..." : "Lisää versioita..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/l10n/hu.js b/apps/files_versions/l10n/hu.js index 1f9b8bbef77..ecf008d08b0 100644 --- a/apps/files_versions/l10n/hu.js +++ b/apps/files_versions/l10n/hu.js @@ -6,6 +6,7 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "{file} fájlt nem sikerült erre visszaállítani: {timestamp}.", "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Restore" : "Visszaállítás", + "No earlier versions available" : "Nincsenek elérhető korábbi verziók", "More versions …" : "További változatok...", "No versions available" : "Nincs elérhető verzió", "More versions..." : "További változatok..." diff --git a/apps/files_versions/l10n/hu.json b/apps/files_versions/l10n/hu.json index 408cd2d1349..dd4042722b4 100644 --- a/apps/files_versions/l10n/hu.json +++ b/apps/files_versions/l10n/hu.json @@ -4,6 +4,7 @@ "Failed to revert {file} to revision {timestamp}." : "{file} fájlt nem sikerült erre visszaállítani: {timestamp}.", "_%n byte_::_%n bytes_" : ["%n bájt","%n bájt"], "Restore" : "Visszaállítás", + "No earlier versions available" : "Nincsenek elérhető korábbi verziók", "More versions …" : "További változatok...", "No versions available" : "Nincs elérhető verzió", "More versions..." : "További változatok..." diff --git a/apps/files_versions/l10n/is.js b/apps/files_versions/l10n/is.js index 0db905fec53..cf26daed813 100644 --- a/apps/files_versions/l10n/is.js +++ b/apps/files_versions/l10n/is.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Mistókst að endurheimta {file} útgáfu {timestamp}.", "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"], "Restore" : "Endurheimta", + "No earlier versions available" : "Engar eldri útgáfur í boði", + "More versions …" : "Fleiri útgáfur ...", "No versions available" : "Engar aðrar útgáfur í boði", "More versions..." : "Fleiri útgáfur..." }, diff --git a/apps/files_versions/l10n/is.json b/apps/files_versions/l10n/is.json index 6b6d813bb42..b630cf52491 100644 --- a/apps/files_versions/l10n/is.json +++ b/apps/files_versions/l10n/is.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Mistókst að endurheimta {file} útgáfu {timestamp}.", "_%n byte_::_%n bytes_" : ["%n bæti","%n bæti"], "Restore" : "Endurheimta", + "No earlier versions available" : "Engar eldri útgáfur í boði", + "More versions …" : "Fleiri útgáfur ...", "No versions available" : "Engar aðrar útgáfur í boði", "More versions..." : "Fleiri útgáfur..." },"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" diff --git a/apps/files_versions/l10n/it.js b/apps/files_versions/l10n/it.js index f38639c5b4a..e7790e1765b 100644 --- a/apps/files_versions/l10n/it.js +++ b/apps/files_versions/l10n/it.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Ripristino di {file} alla revisione {timestamp} non riuscito.", "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Restore" : "Ripristina", + "No earlier versions available" : "Nessuna versione precedente disponibile", + "More versions …" : "Altre versioni...", "No versions available" : "Nessuna versione disponibile", "More versions..." : "Altre versioni..." }, diff --git a/apps/files_versions/l10n/it.json b/apps/files_versions/l10n/it.json index 125938998a4..bda521d3e7c 100644 --- a/apps/files_versions/l10n/it.json +++ b/apps/files_versions/l10n/it.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Ripristino di {file} alla revisione {timestamp} non riuscito.", "_%n byte_::_%n bytes_" : ["%n byte","%n byte"], "Restore" : "Ripristina", + "No earlier versions available" : "Nessuna versione precedente disponibile", + "More versions …" : "Altre versioni...", "No versions available" : "Nessuna versione disponibile", "More versions..." : "Altre versioni..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/l10n/ja.js b/apps/files_versions/l10n/ja.js index 176a1f3f0d1..405c12f1cb7 100644 --- a/apps/files_versions/l10n/ja.js +++ b/apps/files_versions/l10n/ja.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "{file} を {timestamp} のリビジョンに戻すことができません。", "_%n byte_::_%n bytes_" : ["%n バイト"], "Restore" : "復元", + "No earlier versions available" : "以前のバージョンは利用できません", + "More versions …" : "他のバージョン …", "No versions available" : "履歴はありません", "More versions..." : "他のバージョン..." }, diff --git a/apps/files_versions/l10n/ja.json b/apps/files_versions/l10n/ja.json index 46348c4eb22..81f32fd61cf 100644 --- a/apps/files_versions/l10n/ja.json +++ b/apps/files_versions/l10n/ja.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "{file} を {timestamp} のリビジョンに戻すことができません。", "_%n byte_::_%n bytes_" : ["%n バイト"], "Restore" : "復元", + "No earlier versions available" : "以前のバージョンは利用できません", + "More versions …" : "他のバージョン …", "No versions available" : "履歴はありません", "More versions..." : "他のバージョン..." },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files_versions/l10n/nl.js b/apps/files_versions/l10n/nl.js index 4095f26dd17..b20dfe45af5 100644 --- a/apps/files_versions/l10n/nl.js +++ b/apps/files_versions/l10n/nl.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Kon {file} niet terugdraaien naar revisie {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Herstellen", + "No earlier versions available" : "Geen oudere versies beschikbaar", + "More versions …" : "Meer versies...", "No versions available" : "Geen versies beschikbaar", "More versions..." : "Meer versies..." }, diff --git a/apps/files_versions/l10n/nl.json b/apps/files_versions/l10n/nl.json index dbca3ba272c..4b6243f9be2 100644 --- a/apps/files_versions/l10n/nl.json +++ b/apps/files_versions/l10n/nl.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Kon {file} niet terugdraaien naar revisie {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Herstellen", + "No earlier versions available" : "Geen oudere versies beschikbaar", + "More versions …" : "Meer versies...", "No versions available" : "Geen versies beschikbaar", "More versions..." : "Meer versies..." },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_versions/l10n/pt_BR.js b/apps/files_versions/l10n/pt_BR.js index 8d3eaa411ae..08d063a2d2c 100644 --- a/apps/files_versions/l10n/pt_BR.js +++ b/apps/files_versions/l10n/pt_BR.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Falha ao reverter {file} para a revisão {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Restaurar", + "No earlier versions available" : "Não há versões mais novas disponíveis", + "More versions …" : "Mais versões ...", "No versions available" : "Não há versões disponíveis", "More versions..." : "Mais versões..." }, diff --git a/apps/files_versions/l10n/pt_BR.json b/apps/files_versions/l10n/pt_BR.json index 2000ba2fd73..9da5f7efac2 100644 --- a/apps/files_versions/l10n/pt_BR.json +++ b/apps/files_versions/l10n/pt_BR.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Falha ao reverter {file} para a revisão {timestamp}.", "_%n byte_::_%n bytes_" : ["%n byte","%n bytes"], "Restore" : "Restaurar", + "No earlier versions available" : "Não há versões mais novas disponíveis", + "More versions …" : "Mais versões ...", "No versions available" : "Não há versões disponíveis", "More versions..." : "Mais versões..." },"pluralForm" :"nplurals=2; plural=(n > 1);" diff --git a/apps/files_versions/l10n/ru.js b/apps/files_versions/l10n/ru.js index 2b1f0e8bed0..0d128bb0703 100644 --- a/apps/files_versions/l10n/ru.js +++ b/apps/files_versions/l10n/ru.js @@ -6,6 +6,8 @@ OC.L10N.register( "Failed to revert {file} to revision {timestamp}." : "Не удалось откатить {file} к ревизии {timestamp}.", "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байт","%n байт"], "Restore" : "Откатить", + "No earlier versions available" : "Нет более ранних версий…", + "More versions …" : "Ещё версии…", "No versions available" : "Нет доступных версий", "More versions..." : "Ещё версии..." }, diff --git a/apps/files_versions/l10n/ru.json b/apps/files_versions/l10n/ru.json index 2dd932bb62f..d8577d33573 100644 --- a/apps/files_versions/l10n/ru.json +++ b/apps/files_versions/l10n/ru.json @@ -4,6 +4,8 @@ "Failed to revert {file} to revision {timestamp}." : "Не удалось откатить {file} к ревизии {timestamp}.", "_%n byte_::_%n bytes_" : ["%n байт","%n байта","%n байт","%n байт"], "Restore" : "Откатить", + "No earlier versions available" : "Нет более ранних версий…", + "More versions …" : "Ещё версии…", "No versions available" : "Нет доступных версий", "More versions..." : "Ещё версии..." },"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);" diff --git a/apps/files_versions/l10n/zh_CN.js b/apps/files_versions/l10n/zh_CN.js index bc7c43ff1e2..cd3f22b2ba4 100644 --- a/apps/files_versions/l10n/zh_CN.js +++ b/apps/files_versions/l10n/zh_CN.js @@ -1,11 +1,13 @@ OC.L10N.register( "files_versions", { - "Could not revert: %s" : "无法恢复: %s", + "Could not revert: %s" : "无法恢复:%s", "Versions" : "版本", "Failed to revert {file} to revision {timestamp}." : "无法恢复 {file} 到 {timestamp} 的版本。", "_%n byte_::_%n bytes_" : ["%n 比特"], "Restore" : "恢复", + "No earlier versions available" : "无可用的更早的版本", + "More versions …" : "更多版本…", "No versions available" : "没有可用的版本", "More versions..." : "更多版本..." }, diff --git a/apps/files_versions/l10n/zh_CN.json b/apps/files_versions/l10n/zh_CN.json index 5c7482c5e19..865d994e74f 100644 --- a/apps/files_versions/l10n/zh_CN.json +++ b/apps/files_versions/l10n/zh_CN.json @@ -1,9 +1,11 @@ { "translations": { - "Could not revert: %s" : "无法恢复: %s", + "Could not revert: %s" : "无法恢复:%s", "Versions" : "版本", "Failed to revert {file} to revision {timestamp}." : "无法恢复 {file} 到 {timestamp} 的版本。", "_%n byte_::_%n bytes_" : ["%n 比特"], "Restore" : "恢复", + "No earlier versions available" : "无可用的更早的版本", + "More versions …" : "更多版本…", "No versions available" : "没有可用的版本", "More versions..." : "更多版本..." },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/provisioning_api/lib/AppInfo/Application.php b/apps/provisioning_api/lib/AppInfo/Application.php index 2d6a82e2ff9..fd03fd41e16 100644 --- a/apps/provisioning_api/lib/AppInfo/Application.php +++ b/apps/provisioning_api/lib/AppInfo/Application.php @@ -3,8 +3,11 @@ namespace OCA\Provisioning_API\AppInfo; use OC\AppFramework\Utility\SimpleContainer; +use OC\AppFramework\Utility\TimeFactory; +use OC\Settings\Mailer\NewUserMailHelper; use OCA\Provisioning_API\Middleware\ProvisioningApiMiddleware; use OCP\AppFramework\App; +use OCP\Util; class Application extends App { public function __construct(array $urlParams = array()) { @@ -13,6 +16,19 @@ class Application extends App { $container = $this->getContainer(); $server = $container->getServer(); + $container->registerService(NewUserMailHelper::class, function(SimpleContainer $c) use ($server) { + return new NewUserMailHelper( + $server->getThemingDefaults(), + $server->getURLGenerator(), + $server->getL10N('settings'), + $server->getMailer(), + $server->getSecureRandom(), + new TimeFactory(), + $server->getConfig(), + $server->getCrypto(), + Util::getDefaultEmailAddress('no-reply') + ); + }); $container->registerService('ProvisioningApiMiddleware', function(SimpleContainer $c) use ($server) { $user = $server->getUserManager()->get($c['UserId']); $isAdmin = $user !== null ? $server->getGroupManager()->isAdmin($user->getUID()) : false; diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 9155d34276b..9684c7f5656 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -30,6 +30,7 @@ namespace OCA\Provisioning_API\Controller; use OC\Accounts\AccountManager; +use OC\Settings\Mailer\NewUserMailHelper; use \OC_Helper; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\TemplateResponse; @@ -72,6 +73,8 @@ class UsersController extends OCSController { private $defaults; /** @var IFactory */ private $l10nFactory; + /** @var NewUserMailHelper */ + private $newUserMailHelper; /** * @param string $appName @@ -87,6 +90,7 @@ class UsersController extends OCSController { * @param IMailer $mailer * @param \OC_Defaults $defaults * @param IFactory $l10nFactory + * @param NewUserMailHelper $newUserMailHelper */ public function __construct($appName, IRequest $request, @@ -100,7 +104,8 @@ class UsersController extends OCSController { IURLGenerator $urlGenerator, IMailer $mailer, \OC_Defaults $defaults, - IFactory $l10nFactory) { + IFactory $l10nFactory, + NewUserMailHelper $newUserMailHelper) { parent::__construct($appName, $request); $this->userManager = $userManager; @@ -114,6 +119,7 @@ class UsersController extends OCSController { $this->mailer = $mailer; $this->defaults = $defaults; $this->l10nFactory = $l10nFactory; + $this->newUserMailHelper = $newUserMailHelper; } /** @@ -290,12 +296,12 @@ class UsersController extends OCSController { // Find the data $data['id'] = $targetUserObject->getUID(); $data['quota'] = $this->fillStorageInfo($userId); - $data['email'] = $targetUserObject->getEMailAddress(); - $data['displayname'] = $targetUserObject->getDisplayName(); - $data['phone'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_PHONE]['value']; - $data['address'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_ADDRESS]['value']; - $data['webpage'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_WEBSITE]['value']; - $data['twitter'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_TWITTER]['value']; + $data[AccountManager::PROPERTY_EMAIL] = $targetUserObject->getEMailAddress(); + $data[AccountManager::PROPERTY_DISPLAYNAME] = $targetUserObject->getDisplayName(); + $data[AccountManager::PROPERTY_PHONE] = $userAccount[AccountManager::PROPERTY_PHONE]['value']; + $data[AccountManager::PROPERTY_ADDRESS] = $userAccount[AccountManager::PROPERTY_ADDRESS]['value']; + $data[AccountManager::PROPERTY_WEBSITE] = $userAccount[AccountManager::PROPERTY_WEBSITE]['value']; + $data[AccountManager::PROPERTY_TWITTER] = $userAccount[AccountManager::PROPERTY_TWITTER]['value']; $data['groups'] = $gids; return $data; @@ -327,8 +333,13 @@ class UsersController extends OCSController { if($userId === $currentLoggedInUser->getUID()) { // Editing self (display, email) $permittedFields[] = 'display'; - $permittedFields[] = 'email'; + $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME; + $permittedFields[] = AccountManager::PROPERTY_EMAIL; $permittedFields[] = 'password'; + $permittedFields[] = AccountManager::PROPERTY_PHONE; + $permittedFields[] = AccountManager::PROPERTY_ADDRESS; + $permittedFields[] = AccountManager::PROPERTY_WEBSITE; + $permittedFields[] = AccountManager::PROPERTY_TWITTER; // If admin they can edit their own quota if($this->groupManager->isAdmin($currentLoggedInUser->getUID())) { $permittedFields[] = 'quota'; @@ -340,9 +351,14 @@ class UsersController extends OCSController { || $this->groupManager->isAdmin($currentLoggedInUser->getUID())) { // They have permissions over the user $permittedFields[] = 'display'; - $permittedFields[] = 'quota'; + $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME; + $permittedFields[] = AccountManager::PROPERTY_EMAIL; $permittedFields[] = 'password'; - $permittedFields[] = 'email'; + $permittedFields[] = AccountManager::PROPERTY_PHONE; + $permittedFields[] = AccountManager::PROPERTY_ADDRESS; + $permittedFields[] = AccountManager::PROPERTY_WEBSITE; + $permittedFields[] = AccountManager::PROPERTY_TWITTER; + $permittedFields[] = 'quota'; } else { // No rights throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED); @@ -355,6 +371,7 @@ class UsersController extends OCSController { // Process the edit switch($key) { case 'display': + case AccountManager::PROPERTY_DISPLAYNAME: $targetUser->setDisplayName($value); break; case 'quota': @@ -381,13 +398,23 @@ class UsersController extends OCSController { case 'password': $targetUser->setPassword($value); break; - case 'email': + case AccountManager::PROPERTY_EMAIL: if(filter_var($value, FILTER_VALIDATE_EMAIL)) { $targetUser->setEMailAddress($value); } else { throw new OCSException('', 102); } break; + case AccountManager::PROPERTY_PHONE: + case AccountManager::PROPERTY_ADDRESS: + case AccountManager::PROPERTY_WEBSITE: + case AccountManager::PROPERTY_TWITTER: + $userAccount = $this->accountManager->getUser($targetUser); + if ($userAccount[$key]['value'] !== $value) { + $userAccount[$key]['value'] = $value; + $this->accountManager->updateUser($targetUser, $userAccount); + } + break; default: throw new OCSException('', 103); } @@ -786,30 +813,10 @@ class UsersController extends OCSController { $l10n = $this->l10nFactory->get('settings', $lang); - // data for the mail template - $mailData = [ - 'username' => $username, - 'url' => $this->urlGenerator->getAbsoluteURL('/') - ]; - - // FIXME: set users language in email - $mail = new TemplateResponse('settings', 'email.new_user', $mailData, 'blank'); - $mailContent = $mail->render(); - - // FIXME: set users language in email - $mail = new TemplateResponse('settings', 'email.new_user_plain_text', $mailData, 'blank'); - $plainTextMailContent = $mail->render(); - - $subject = $l10n->t('Your %s account was created', [$this->defaults->getName()]); - try { - $message = $this->mailer->createMessage(); - $message->setTo([$email => $username]); - $message->setSubject($subject); - $message->setHtmlBody($mailContent); - $message->setPlainBody($plainTextMailContent); - $message->setFrom([$this->fromMailAddress => $this->defaults->getName()]); - $this->mailer->send($message); + $this->newUserMailHelper->setL10N($l10n); + $emailTemplate = $this->newUserMailHelper->generateTemplate($targetUser, false); + $this->newUserMailHelper->sendMail($targetUser, $emailTemplate); } catch(\Exception $e) { $this->logger->error("Can't send new user mail to $email: " . $e->getMessage(), array('app' => 'settings')); throw new OCSException('Sending email failed', 102); diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php index b5b63319d35..24516840a7a 100644 --- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php +++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php @@ -32,6 +32,8 @@ namespace OCA\Provisioning_API\Tests\Controller; use Exception; use OC\Accounts\AccountManager; use OC\Group\Manager; +use OC\Mail\IEMailTemplate; +use OC\Settings\Mailer\NewUserMailHelper; use OC\SubAdmin; use OCA\Provisioning_API\Controller\UsersController; use OCP\AppFramework\Http\DataResponse; @@ -54,39 +56,30 @@ class UsersControllerTest extends TestCase { /** @var IUserManager|PHPUnit_Framework_MockObject_MockObject */ protected $userManager; - /** @var IConfig|PHPUnit_Framework_MockObject_MockObject */ protected $config; - /** @var Manager|PHPUnit_Framework_MockObject_MockObject */ protected $groupManager; - /** @var IUserSession|PHPUnit_Framework_MockObject_MockObject */ protected $userSession; - /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */ protected $logger; - /** @var UsersController|PHPUnit_Framework_MockObject_MockObject */ protected $api; - /** @var AccountManager|PHPUnit_Framework_MockObject_MockObject */ protected $accountManager; - /** @var IRequest|PHPUnit_Framework_MockObject_MockObject */ protected $request; - - /** @var IURLGenerator | PHPUnit_Framework_MockObject_MockObject */ + /** @var IURLGenerator|PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; - - /** @var IMailer | PHPUnit_Framework_MockObject_MockObject */ + /** @var IMailer|PHPUnit_Framework_MockObject_MockObject */ private $mailer; - - /** @var \OC_Defaults | PHPUnit_Framework_MockObject_MockObject */ + /** @var \OC_Defaults|PHPUnit_Framework_MockObject_MockObject */ private $defaults; - - /** @var IFactory | PHPUnit_Framework_MockObject_MockObject */ + /** @var IFactory|PHPUnit_Framework_MockObject_MockObject */ private $l10nFactory; + /** @var NewUserMailHelper|PHPUnit_Framework_MockObject_MockObject */ + private $newUserMailHelper; protected function setUp() { parent::setUp(); @@ -102,6 +95,7 @@ class UsersControllerTest extends TestCase { $this->mailer = $this->createMock(IMailer::class); $this->defaults = $this->createMock(\OC_Defaults::class); $this->l10nFactory = $this->createMock(IFactory::class); + $this->newUserMailHelper = $this->createMock(NewUserMailHelper::class); $this->api = $this->getMockBuilder(UsersController::class) ->setConstructorArgs([ @@ -117,7 +111,8 @@ class UsersControllerTest extends TestCase { $this->urlGenerator, $this->mailer, $this->defaults, - $this->l10nFactory + $this->l10nFactory, + $this->newUserMailHelper ]) ->setMethods(['fillStorageInfo']) ->getMock(); @@ -734,7 +729,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => ['group0', 'group1', 'group2'] ]; @@ -823,7 +818,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => [] ]; @@ -952,7 +947,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Subadmin User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => [] ]; @@ -2621,7 +2616,8 @@ class UsersControllerTest extends TestCase { $this->urlGenerator, $this->mailer, $this->defaults, - $this->l10nFactory + $this->l10nFactory, + $this->newUserMailHelper ]) ->setMethods(['getUserData']) ->getMock(); @@ -2636,7 +2632,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter' ] ); @@ -2648,7 +2644,7 @@ class UsersControllerTest extends TestCase { 'email' => 'demo@owncloud.org', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'display-name' => 'Demo User' ]; @@ -2684,7 +2680,8 @@ class UsersControllerTest extends TestCase { $this->urlGenerator, $this->mailer, $this->defaults, - $this->l10nFactory + $this->l10nFactory, + $this->newUserMailHelper ]) ->setMethods(['getUserData']) ->getMock(); @@ -2696,7 +2693,7 @@ class UsersControllerTest extends TestCase { 'email' => 'demo@owncloud.org', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'displayname' => 'Demo User' ]; @@ -2884,56 +2881,6 @@ class UsersControllerTest extends TestCase { ->expects($this->once()) ->method('getEmailAddress') ->will($this->returnValue('abc@example.org')); - $message = $this->getMockBuilder('\OC\Mail\Message') - ->disableOriginalConstructor()->getMock(); - $message - ->expects($this->at(0)) - ->method('setTo') - ->with(['abc@example.org' => 'user-id']); - $message - ->expects($this->at(1)) - ->method('setSubject') - ->with('Your account was created'); - $htmlBody = new TemplateResponse( - 'settings', - 'email.new_user', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(2)) - ->method('setHtmlBody') - ->with($htmlBody->render()); - $plainBody = new TemplateResponse( - 'settings', - 'email.new_user_plain_text', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(3)) - ->method('setPlainBody') - ->with($plainBody->render()); - $message - ->expects($this->at(4)) - ->method('setFrom') - ->with(['test@example.org' => null]); - - $this->mailer - ->expects($this->at(0)) - ->method('createMessage') - ->will($this->returnValue($message)); - $this->mailer - ->expects($this->at(1)) - ->method('send') - ->with($message); - $this->config ->expects($this->at(0)) ->method('getUserValue') @@ -2942,11 +2889,6 @@ class UsersControllerTest extends TestCase { $l10n = $this->getMockBuilder(IL10N::class) ->disableOriginalConstructor() ->getMock(); - $l10n - ->expects($this->at(0)) - ->method('t') - ->with('Your %s account was created', [null]) - ->willReturn('Your account was created'); $this->l10nFactory ->expects($this->at(0)) ->method('languageExists') @@ -2957,6 +2899,19 @@ class UsersControllerTest extends TestCase { ->method('get') ->with('settings', 'es') ->willReturn($l10n); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $this->newUserMailHelper + ->expects($this->at(0)) + ->method('setL10N') + ->willReturn($l10n); + $this->newUserMailHelper + ->expects($this->at(1)) + ->method('generateTemplate') + ->willReturn($emailTemplate); + $this->newUserMailHelper + ->expects($this->at(2)) + ->method('sendMail') + ->with($targetUser, $emailTemplate); $this->api->resendWelcomeMessage('UserToGet'); } @@ -2996,56 +2951,6 @@ class UsersControllerTest extends TestCase { ->expects($this->once()) ->method('getEmailAddress') ->will($this->returnValue('abc@example.org')); - $message = $this->getMockBuilder('\OC\Mail\Message') - ->disableOriginalConstructor()->getMock(); - $message - ->expects($this->at(0)) - ->method('setTo') - ->with(['abc@example.org' => 'user-id']); - $message - ->expects($this->at(1)) - ->method('setSubject') - ->with('Your account was created'); - $htmlBody = new TemplateResponse( - 'settings', - 'email.new_user', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(2)) - ->method('setHtmlBody') - ->with($htmlBody->render()); - $plainBody = new TemplateResponse( - 'settings', - 'email.new_user_plain_text', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(3)) - ->method('setPlainBody') - ->with($plainBody->render()); - $message - ->expects($this->at(4)) - ->method('setFrom') - ->with(['test@example.org' => null]); - - $this->mailer - ->expects($this->at(0)) - ->method('createMessage') - ->will($this->returnValue($message)); - $this->mailer - ->expects($this->at(1)) - ->method('send') - ->with($message); - $this->config ->expects($this->at(0)) ->method('getUserValue') @@ -3054,11 +2959,6 @@ class UsersControllerTest extends TestCase { $l10n = $this->getMockBuilder(IL10N::class) ->disableOriginalConstructor() ->getMock(); - $l10n - ->expects($this->at(0)) - ->method('t') - ->with('Your %s account was created', [null]) - ->willReturn('Your account was created'); $this->l10nFactory ->expects($this->at(0)) ->method('languageExists') @@ -3069,6 +2969,19 @@ class UsersControllerTest extends TestCase { ->method('get') ->with('settings', 'en') ->willReturn($l10n); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $this->newUserMailHelper + ->expects($this->at(0)) + ->method('setL10N') + ->willReturn($l10n); + $this->newUserMailHelper + ->expects($this->at(1)) + ->method('generateTemplate') + ->willReturn($emailTemplate); + $this->newUserMailHelper + ->expects($this->at(2)) + ->method('sendMail') + ->with($targetUser, $emailTemplate); $this->api->resendWelcomeMessage('UserToGet'); } @@ -3113,56 +3026,6 @@ class UsersControllerTest extends TestCase { ->expects($this->once()) ->method('getEmailAddress') ->will($this->returnValue('abc@example.org')); - $message = $this->getMockBuilder('\OC\Mail\Message') - ->disableOriginalConstructor()->getMock(); - $message - ->expects($this->at(0)) - ->method('setTo') - ->with(['abc@example.org' => 'user-id']); - $message - ->expects($this->at(1)) - ->method('setSubject') - ->with('Your account was created'); - $htmlBody = new TemplateResponse( - 'settings', - 'email.new_user', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(2)) - ->method('setHtmlBody') - ->with($htmlBody->render()); - $plainBody = new TemplateResponse( - 'settings', - 'email.new_user_plain_text', - [ - 'username' => 'user-id', - 'url' => null, - ], - 'blank' - ); - $message - ->expects($this->at(3)) - ->method('setPlainBody') - ->with($plainBody->render()); - $message - ->expects($this->at(4)) - ->method('setFrom') - ->with(['test@example.org' => null]); - - $this->mailer - ->expects($this->at(0)) - ->method('createMessage') - ->will($this->returnValue($message)); - $this->mailer - ->expects($this->at(1)) - ->method('send') - ->will($this->throwException(new \Exception())); - $this->config ->expects($this->at(0)) ->method('getUserValue') @@ -3171,11 +3034,6 @@ class UsersControllerTest extends TestCase { $l10n = $this->getMockBuilder(IL10N::class) ->disableOriginalConstructor() ->getMock(); - $l10n - ->expects($this->at(0)) - ->method('t') - ->with('Your %s account was created', [null]) - ->willReturn('Your account was created'); $this->l10nFactory ->expects($this->at(0)) ->method('languageExists') @@ -3186,6 +3044,20 @@ class UsersControllerTest extends TestCase { ->method('get') ->with('settings', 'es') ->willReturn($l10n); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $this->newUserMailHelper + ->expects($this->at(0)) + ->method('setL10N') + ->willReturn($l10n); + $this->newUserMailHelper + ->expects($this->at(1)) + ->method('generateTemplate') + ->willReturn($emailTemplate); + $this->newUserMailHelper + ->expects($this->at(2)) + ->method('sendMail') + ->with($targetUser, $emailTemplate) + ->willThrowException(new \Exception()); $this->api->resendWelcomeMessage('UserToGet'); } diff --git a/apps/sharebymail/appinfo/app.php b/apps/sharebymail/appinfo/app.php index 5ef7b6f18cb..c1fd39d2a2f 100644 --- a/apps/sharebymail/appinfo/app.php +++ b/apps/sharebymail/appinfo/app.php @@ -19,6 +19,4 @@ * */ -$settings = new \OCA\ShareByMail\Settings(); - -\OCP\Util::connectHook('\OCP\Config', 'js', $settings, 'announceShareProvider'); +$app = new \OCA\ShareByMail\AppInfo\Application(); diff --git a/apps/sharebymail/appinfo/info.xml b/apps/sharebymail/appinfo/info.xml index 5528f6158d9..ab50ef03694 100644 --- a/apps/sharebymail/appinfo/info.xml +++ b/apps/sharebymail/appinfo/info.xml @@ -5,7 +5,7 @@ <description>Share provider which allows you to share files by mail</description> <licence>AGPL</licence> <author>Bjoern Schiessle</author> - <version>1.1.0</version> + <version>1.2.0</version> <namespace>ShareByMail</namespace> <category>other</category> <dependencies> @@ -17,6 +17,10 @@ <filesystem/> </types> + <settings> + <admin>OCA\ShareByMail\Settings\Admin</admin> + </settings> + <activity> <providers> <provider>OCA\ShareByMail\Activity</provider> diff --git a/apps/sharebymail/js/settings-admin.js b/apps/sharebymail/js/settings-admin.js new file mode 100644 index 00000000000..7b431233032 --- /dev/null +++ b/apps/sharebymail/js/settings-admin.js @@ -0,0 +1,30 @@ +/** + * @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/>. + * + */ +$(function() { + + $('#sendPasswordMail').on('change', function() { + var status = 'no'; + if ($(this).is(':checked')) { + status = 'yes'; + } + OC.AppConfig.setValue('sharebymail', 'sendpasswordmail', status); + }); + +}); diff --git a/apps/sharebymail/l10n/de.js b/apps/sharebymail/l10n/de.js index b1f90520540..4afc8207d31 100644 --- a/apps/sharebymail/l10n/de.js +++ b/apps/sharebymail/l10n/de.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s hat „%s“ mit Dir geteilt", "%s shared »%s« with you on behalf of %s" : "%s hat »%s« im Auftrag von %s mit Dir geteilt", "Failed to create the E-mail" : "Erstellen der E-Mail ist fehlgeschalgen", + "Password to access »%s« shared to you by %s" : "Das Passwort zum Zugriff auf %s wurde durch %s mit dir geteilt.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« im Auftrag von %s mit Dir geteilt.\n\n%s\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« mit Dir geteilt.\n\n%s\n", "Cheers!" : "Noch einen schönen Tag!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hallo,\n\n%s hat %s mit dir geteilt.\nDu solltest bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.\n\nDies ist mit dem folgenden Passwort geschützt: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> im Auftrag von %s mit Dir geteilt.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Dir geteilt.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Dir geteilt.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hallo,<br><br>%s hat <i>%s</i> mit dir geteilt.<br>Du solltest bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.<br><br>Dies ist mit dem folgenden Passwort geschützt: %s<br><br>", + "Share by mail" : "Geteilt über eine E-Mail", + "Send a personalized link to a file or folder by mail." : "Einen personalisierten Link zu einer Datei oder Ordner per E-Mail versenden.", + "Send password by mail" : "Passwort per Mail senden" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/de.json b/apps/sharebymail/l10n/de.json index a962b416c9d..2baab9fe0d9 100644 --- a/apps/sharebymail/l10n/de.json +++ b/apps/sharebymail/l10n/de.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s hat „%s“ mit Dir geteilt", "%s shared »%s« with you on behalf of %s" : "%s hat »%s« im Auftrag von %s mit Dir geteilt", "Failed to create the E-mail" : "Erstellen der E-Mail ist fehlgeschalgen", + "Password to access »%s« shared to you by %s" : "Das Passwort zum Zugriff auf %s wurde durch %s mit dir geteilt.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« im Auftrag von %s mit Dir geteilt.\n\n%s\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« mit Dir geteilt.\n\n%s\n", "Cheers!" : "Noch einen schönen Tag!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hallo,\n\n%s hat %s mit dir geteilt.\nDu solltest bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.\n\nDies ist mit dem folgenden Passwort geschützt: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> im Auftrag von %s mit Dir geteilt.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Dir geteilt.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Dir geteilt.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hallo,<br><br>%s hat <i>%s</i> mit dir geteilt.<br>Du solltest bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.<br><br>Dies ist mit dem folgenden Passwort geschützt: %s<br><br>", + "Share by mail" : "Geteilt über eine E-Mail", + "Send a personalized link to a file or folder by mail." : "Einen personalisierten Link zu einer Datei oder Ordner per E-Mail versenden.", + "Send password by mail" : "Passwort per Mail senden" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/de_DE.js b/apps/sharebymail/l10n/de_DE.js index 8d107a17fb1..e4961360323 100644 --- a/apps/sharebymail/l10n/de_DE.js +++ b/apps/sharebymail/l10n/de_DE.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s hat »%s« mit Ihnen geteilt", "%s shared »%s« with you on behalf of %s" : "%s hat »%s« im Auftrag von %s mit Ihnen geteilt", "Failed to create the E-mail" : "Erstellen der E-Mail fehlgeschlagen", + "Password to access »%s« shared to you by %s" : "Das Passwort zum Zugriff auf %s wurde durch %s mit Ihnen geteilt.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« im Auftrag von %s mit Ihnen geteilt.\n\n%s\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« mit Ihnen geteilt.\n\n%s\n", "Cheers!" : "Einen schönen Tag noch!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hallo,\n\n%s hat %s mit Ihnen geteilt.\nSie sollten bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.\n\nDies ist mit dem folgenden Passwort geschützt: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> im Auftrag von %s mit Ihnen geteilt.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Ihnen geteilt.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Ihnen geteilt.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hallo,<br><br>%s hat <i>%s</i> mit Ihnen geteilt.<br>Sie sollten bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.<br><br>Dies ist mit dem folgenden Passwort geschützt: %s<br><br>", + "Share by mail" : "Geteilt über eine E-Mail", + "Send a personalized link to a file or folder by mail." : "Einen personalisierten Link zu einer Datei oder Ordner per E-Mail versenden.", + "Send password by mail" : "Passwort per Mail senden" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/de_DE.json b/apps/sharebymail/l10n/de_DE.json index 608c04d2f7a..28e4f5566c6 100644 --- a/apps/sharebymail/l10n/de_DE.json +++ b/apps/sharebymail/l10n/de_DE.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s hat »%s« mit Ihnen geteilt", "%s shared »%s« with you on behalf of %s" : "%s hat »%s« im Auftrag von %s mit Ihnen geteilt", "Failed to create the E-mail" : "Erstellen der E-Mail fehlgeschlagen", + "Password to access »%s« shared to you by %s" : "Das Passwort zum Zugriff auf %s wurde durch %s mit Ihnen geteilt.", "Could not find share" : "Freigabe konnte nicht gefunden werden", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« im Auftrag von %s mit Ihnen geteilt.\n\n%s\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hallo,\n\n%s hat »%s« mit Ihnen geteilt.\n\n%s\n", "Cheers!" : "Einen schönen Tag noch!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hallo,\n\n%s hat %s mit Ihnen geteilt.\nSie sollten bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.\n\nDies ist mit dem folgenden Passwort geschützt: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> im Auftrag von %s mit Ihnen geteilt.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Ihnen geteilt.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hallo,<br><br>%s hat <a href=\"%s\">%s</a> mit Ihnen geteilt.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hallo,<br><br>%s hat <i>%s</i> mit Ihnen geteilt.<br>Sie sollten bereits eine separate E-Mail mit einem Zugriffslink erhalten haben.<br><br>Dies ist mit dem folgenden Passwort geschützt: %s<br><br>", + "Share by mail" : "Geteilt über eine E-Mail", + "Send a personalized link to a file or folder by mail." : "Einen personalisierten Link zu einer Datei oder Ordner per E-Mail versenden.", + "Send password by mail" : "Passwort per Mail senden" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/es.js b/apps/sharebymail/l10n/es.js index 3699bc53bd4..6e2a15bba50 100644 --- a/apps/sharebymail/l10n/es.js +++ b/apps/sharebymail/l10n/es.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", "Failed to create the E-mail" : "Falló crear el correo electrónico", + "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", "Could not find share" : "No se pudo encontrar el recurso compartido", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", "Cheers!" : "¡Ánimo!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hola que tal,\n\n%s compartió »%s« contigo.\nDeberías ya haber recibido un mensaje separado con un enlace para acceder a él.\n\nEstá protegido por la siguiente contraseña: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted a nombre de %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hola que tal,<br><br>%s compartió <i>%s</i> contigo.<br>Deberías ya haber recibido un mensaje separado con un enlace para acceder a él.<br><br>Está protegido por la siguiente contraseña: %s<br><br>", + "Share by mail" : "Enviado por correo electrónico", + "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Send password by mail" : "Enviar contraseñas por email" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/es.json b/apps/sharebymail/l10n/es.json index 41d31f57fbd..587497e72d9 100644 --- a/apps/sharebymail/l10n/es.json +++ b/apps/sharebymail/l10n/es.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s compartió »%s« con usted", "%s shared »%s« with you on behalf of %s" : "%s compartió »%s« con usted a nombre de %s", "Failed to create the E-mail" : "Falló crear el correo electrónico", + "Password to access »%s« shared to you by %s" : "Contraseña para acceder »%s« compartido con usted por %s", "Could not find share" : "No se pudo encontrar el recurso compartido", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "¡Hola!,\n\n%s comapartió »%s« con usted a nombre de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s compartió »%s« con usted.\n\n%s\n\n", "Cheers!" : "¡Ánimo!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hola que tal,\n\n%s compartió »%s« contigo.\nDeberías ya haber recibido un mensaje separado con un enlace para acceder a él.\n\nEstá protegido por la siguiente contraseña: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted a nombre de %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola,<br><br>%s compartió <a href=\"%s\">%s</a> con usted.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hola que tal,<br><br>%s compartió <i>%s</i> contigo.<br>Deberías ya haber recibido un mensaje separado con un enlace para acceder a él.<br><br>Está protegido por la siguiente contraseña: %s<br><br>", + "Share by mail" : "Enviado por correo electrónico", + "Send a personalized link to a file or folder by mail." : "Enviar un enlace personalizado a uno de los archivos o carpetas por correo electrónico.", + "Send password by mail" : "Enviar contraseñas por email" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/es_MX.js b/apps/sharebymail/l10n/es_MX.js new file mode 100644 index 00000000000..68240925f4c --- /dev/null +++ b/apps/sharebymail/l10n/es_MX.js @@ -0,0 +1,24 @@ +OC.L10N.register( + "sharebymail", + { + "Shared with %1$s" : "Compartido con %1$s", + "Shared with {email}" : "Compartido con {email}", + "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", + "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "You shared %1$s with %2$s by mail" : "Usted ha compartido %1$s con %2$s por correo", + "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", + "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", + "Failed to send share by E-mail" : "Se presentó una falla al enviar el recurso compartido por correo electrónico", + "%s shared »%s« with you" : "%s ha compartido »%s« con usted", + "%s shared »%s« with you on behalf of %s" : "%s ha compartido »%s« con usted a nombre de %s", + "Failed to create the E-mail" : "Se presentó una falla al crear el correo electrónico", + "Could not find share" : "No fue posible encontrar el elemento compartido", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hola,\n\n%s ha compartido »%s« con usted a nombre de %s.\n\n%s\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s ha compartido »%s« con usted.\n\n%s\n", + "Cheers!" : "¡Saludos!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hola,<br><br>%s ha compartido <a href=\"%s\">%s</a> con usted a nombre de %s.<br><br> ", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola, <br><br>%s ha compartido <a href=\"%s\">%s</a> con usted.<br><br> " +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/es_MX.json b/apps/sharebymail/l10n/es_MX.json new file mode 100644 index 00000000000..b73e92c967f --- /dev/null +++ b/apps/sharebymail/l10n/es_MX.json @@ -0,0 +1,22 @@ +{ "translations": { + "Shared with %1$s" : "Compartido con %1$s", + "Shared with {email}" : "Compartido con {email}", + "Shared with %1$s by %2$s" : "Compartido con %1$s por %2$s", + "Shared with {email} by {actor}" : "Compartido con {email} por {actor}", + "You shared %1$s with %2$s by mail" : "Usted ha compartido %1$s con %2$s por correo", + "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", + "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", + "Failed to send share by E-mail" : "Se presentó una falla al enviar el recurso compartido por correo electrónico", + "%s shared »%s« with you" : "%s ha compartido »%s« con usted", + "%s shared »%s« with you on behalf of %s" : "%s ha compartido »%s« con usted a nombre de %s", + "Failed to create the E-mail" : "Se presentó una falla al crear el correo electrónico", + "Could not find share" : "No fue posible encontrar el elemento compartido", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hola,\n\n%s ha compartido »%s« con usted a nombre de %s.\n\n%s\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hola,\n\n%s ha compartido »%s« con usted.\n\n%s\n", + "Cheers!" : "¡Saludos!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hola,<br><br>%s ha compartido <a href=\"%s\">%s</a> con usted a nombre de %s.<br><br> ", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hola, <br><br>%s ha compartido <a href=\"%s\">%s</a> con usted.<br><br> " +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/sharebymail/l10n/fi.js b/apps/sharebymail/l10n/fi.js index 88d1cc076cc..76ce2b3eed2 100644 --- a/apps/sharebymail/l10n/fi.js +++ b/apps/sharebymail/l10n/fi.js @@ -18,7 +18,12 @@ OC.L10N.register( "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi käyttäjän %s puolesta.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi.\n\n%s\n\n", "Cheers!" : "Kiitos!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi.\nSinulla pitäisi olla erillinen sähköpostiviesti, joka sisältää linkin siihen.\n\nSe on suojattu salasanalla: %s\n\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi käyttäjän %s puolesta.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hei,<br><br>%s jakoi kohteen <i>%s</i> kanssasi.<br>Sinulla pitäisi olla erillinen sähköpostiviesti, joka sisältää linkin siihen.<br><br>Se on suojattu salasanalla: %s<br><br>", + "Share by mail" : "Jaa sähköpostitse", + "Send a personalized link to a file or folder by mail." : "Lähetä personoitu linkki tiedostoon tai kansioon sähköpostitse.", + "Send password by mail" : "Lähetä salasana sähköpostitse" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/fi.json b/apps/sharebymail/l10n/fi.json index fd63221a725..fd113191299 100644 --- a/apps/sharebymail/l10n/fi.json +++ b/apps/sharebymail/l10n/fi.json @@ -16,7 +16,12 @@ "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi käyttäjän %s puolesta.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi.\n\n%s\n\n", "Cheers!" : "Kiitos!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Hei,\n\n%s jakoi kohteen »%s« kanssasi.\nSinulla pitäisi olla erillinen sähköpostiviesti, joka sisältää linkin siihen.\n\nSe on suojattu salasanalla: %s\n\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi käyttäjän %s puolesta.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Hei,<br><br>%s jakoi kohteen <a href=\"%s\">%s</a> kanssasi.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Hei,<br><br>%s jakoi kohteen <i>%s</i> kanssasi.<br>Sinulla pitäisi olla erillinen sähköpostiviesti, joka sisältää linkin siihen.<br><br>Se on suojattu salasanalla: %s<br><br>", + "Share by mail" : "Jaa sähköpostitse", + "Send a personalized link to a file or folder by mail." : "Lähetä personoitu linkki tiedostoon tai kansioon sähköpostitse.", + "Send password by mail" : "Lähetä salasana sähköpostitse" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/fr.js b/apps/sharebymail/l10n/fr.js index 5d8973276b4..54e0aa6662a 100644 --- a/apps/sharebymail/l10n/fr.js +++ b/apps/sharebymail/l10n/fr.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s a partagé «%s» avec vous", "%s shared »%s« with you on behalf of %s" : "%s a partagé «%s» avec vous de la part de %s", "Failed to create the E-mail" : "Erreur lors de la création du mail", + "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s", "Could not find share" : "Impossible de trouver le partage", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous de la part de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous.\n\n%s\n\n", "Cheers!" : "À bientôt !", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n\nIl est protégé avec le mot de passe suivant : %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous de la part de %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Bonjour,<br><br>%s a partagé <i>%s</i> avec vous.<br>Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.<br><br> Il est protégé avec le mot de passe suivant : %s<br><br>", + "Share by mail" : "Partage par email", + "Send a personalized link to a file or folder by mail." : "Envoyer un lien personnalisé vers un fichier ou un dossier par email.", + "Send password by mail" : "Envoyer le mot de passe par email" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/sharebymail/l10n/fr.json b/apps/sharebymail/l10n/fr.json index 00dbfd4e850..7ab94893771 100644 --- a/apps/sharebymail/l10n/fr.json +++ b/apps/sharebymail/l10n/fr.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s a partagé «%s» avec vous", "%s shared »%s« with you on behalf of %s" : "%s a partagé «%s» avec vous de la part de %s", "Failed to create the E-mail" : "Erreur lors de la création du mail", + "Password to access »%s« shared to you by %s" : "Mot de passe pour accèder à «%s» partagé par %s", "Could not find share" : "Impossible de trouver le partage", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous de la part de %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous.\n\n%s\n\n", "Cheers!" : "À bientôt !", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Bonjour,\n\n%s a partagé «%s» avec vous.\nVous avez normalement déjà reçu un autre email avec un lien pour y accéder.\n\nIl est protégé avec le mot de passe suivant : %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous de la part de %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Bonjour,<br><br>%s a partagé <a href=\"%s\">%s</a> avec vous.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Bonjour,<br><br>%s a partagé <i>%s</i> avec vous.<br>Vous avez normalement déjà reçu un autre email avec un lien pour y accéder.<br><br> Il est protégé avec le mot de passe suivant : %s<br><br>", + "Share by mail" : "Partage par email", + "Send a personalized link to a file or folder by mail." : "Envoyer un lien personnalisé vers un fichier ou un dossier par email.", + "Send password by mail" : "Envoyer le mot de passe par email" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/it.js b/apps/sharebymail/l10n/it.js index 6711acbef00..e6bfdf2d02f 100644 --- a/apps/sharebymail/l10n/it.js +++ b/apps/sharebymail/l10n/it.js @@ -19,6 +19,7 @@ OC.L10N.register( "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Ciao,\n\n%s ha condiviso «%s» con te.\n\n%s\n\n", "Cheers!" : "Saluti!", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te per conto di %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te.<br><br>", + "Share by mail" : "Condividi tramite email" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/sharebymail/l10n/it.json b/apps/sharebymail/l10n/it.json index d08dc8f7f2c..00e59d45f44 100644 --- a/apps/sharebymail/l10n/it.json +++ b/apps/sharebymail/l10n/it.json @@ -17,6 +17,7 @@ "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Ciao,\n\n%s ha condiviso «%s» con te.\n\n%s\n\n", "Cheers!" : "Saluti!", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te per conto di %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Ciao, <br><br>%s ha condiviso <a href=\"%s\">%s</a> con te.<br><br>", + "Share by mail" : "Condividi tramite email" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/ja.js b/apps/sharebymail/l10n/ja.js new file mode 100644 index 00000000000..902780730d7 --- /dev/null +++ b/apps/sharebymail/l10n/ja.js @@ -0,0 +1,24 @@ +OC.L10N.register( + "sharebymail", + { + "Shared with %1$s" : "%1$s と共有", + "Shared with {email}" : "{email} と共有", + "Shared with %1$s by %2$s" : "%2$s で %1$s と共有", + "Shared with {email} by {actor}" : "{actor} で {email} と共有 ", + "You shared %1$s with %2$s by mail" : "メールで %2$s と %1$s を共有しました", + "You shared {file} with {email} by mail" : "メールで {email} と {file} を共有しました", + "%3$s shared %1$s with %2$s by mail" : "%3$s がメールで %2$s と %1$s を共有しました", + "{actor} shared {file} with {email} by mail" : "{actor} が {email} と {file} を共有しました", + "Sharing %s failed, this item is already shared with %s" : "%s の共有に失敗しました。 このアイテムはすでに %s と共有しています", + "Failed to send share by E-mail" : "メールで共有の送信に失敗しました", + "%s shared »%s« with you" : "%s があなたと »%s« を共有しました", + "%s shared »%s« with you on behalf of %s" : "%s があなたと »%s« を %s のために共有しました", + "Failed to create the E-mail" : "メールの作成に失敗しました", + "Could not find share" : "共有が見つかりませんでした", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "こんにちは。\n\n%s が »%s« をあなたと %s のために共有しました。\n\n%s\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "こんにちは。\n\n%s が »%s« をあなたと共有しました。\n\n%s\n", + "Cheers!" : "それでは!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "こんにちは。<br><br>%s が <a href=\"%s\">%s</a> をあなたと %s のために共有しました。<br><br>", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "こんにちは。<br><br>%s が <a href=\"%s\">%s</a> をあなたと共有しました。<br><br>" +}, +"nplurals=1; plural=0;"); diff --git a/apps/sharebymail/l10n/ja.json b/apps/sharebymail/l10n/ja.json new file mode 100644 index 00000000000..af492e8c6ce --- /dev/null +++ b/apps/sharebymail/l10n/ja.json @@ -0,0 +1,22 @@ +{ "translations": { + "Shared with %1$s" : "%1$s と共有", + "Shared with {email}" : "{email} と共有", + "Shared with %1$s by %2$s" : "%2$s で %1$s と共有", + "Shared with {email} by {actor}" : "{actor} で {email} と共有 ", + "You shared %1$s with %2$s by mail" : "メールで %2$s と %1$s を共有しました", + "You shared {file} with {email} by mail" : "メールで {email} と {file} を共有しました", + "%3$s shared %1$s with %2$s by mail" : "%3$s がメールで %2$s と %1$s を共有しました", + "{actor} shared {file} with {email} by mail" : "{actor} が {email} と {file} を共有しました", + "Sharing %s failed, this item is already shared with %s" : "%s の共有に失敗しました。 このアイテムはすでに %s と共有しています", + "Failed to send share by E-mail" : "メールで共有の送信に失敗しました", + "%s shared »%s« with you" : "%s があなたと »%s« を共有しました", + "%s shared »%s« with you on behalf of %s" : "%s があなたと »%s« を %s のために共有しました", + "Failed to create the E-mail" : "メールの作成に失敗しました", + "Could not find share" : "共有が見つかりませんでした", + "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "こんにちは。\n\n%s が »%s« をあなたと %s のために共有しました。\n\n%s\n", + "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "こんにちは。\n\n%s が »%s« をあなたと共有しました。\n\n%s\n", + "Cheers!" : "それでは!", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "こんにちは。<br><br>%s が <a href=\"%s\">%s</a> をあなたと %s のために共有しました。<br><br>", + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "こんにちは。<br><br>%s が <a href=\"%s\">%s</a> をあなたと共有しました。<br><br>" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/sharebymail/l10n/pt_BR.js b/apps/sharebymail/l10n/pt_BR.js index 1cc2acfde19..cafe8ffb746 100644 --- a/apps/sharebymail/l10n/pt_BR.js +++ b/apps/sharebymail/l10n/pt_BR.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s compartilhado »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhado »%s« com você em nome de %s", "Failed to create the E-mail" : "Falha ao criar o E-mail", + "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", "Could not find share" : "Não foi possível encontrar o compartilhamento", "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!" : "Felicidades!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Olá,\n%s compartilhou %s com você.\nVocê já deve ter recebido um e-mail separado com um link para acessá-lo.\nÉ protegido com a seguinte senha: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Olá,<br><br>%s compartilhado <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 compartilhado <a href=\"%s\">%s</a> com você.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Olá,<br><br>%s compartilhado <a href=\"%s\">%s</a> com você.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Olá, <br> <br> %s shared <i>%s</ i> com você. <br> Você já deve ter recebido um e-mail separado com um link para acessá-lo. <br><br> Ele é protegido com o seguinte Senha: %s", + "Share by mail" : "Partilhar por correio", + "Send a personalized link to a file or folder by mail." : "Envie um link personalizado para um arquivo ou pasta por e-mail.", + "Send password by mail" : "nviar senha por e-mail" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/sharebymail/l10n/pt_BR.json b/apps/sharebymail/l10n/pt_BR.json index 9a41c61696e..783c0cec8fe 100644 --- a/apps/sharebymail/l10n/pt_BR.json +++ b/apps/sharebymail/l10n/pt_BR.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s compartilhado »%s« com você", "%s shared »%s« with you on behalf of %s" : "%s compartilhado »%s« com você em nome de %s", "Failed to create the E-mail" : "Falha ao criar o E-mail", + "Password to access »%s« shared to you by %s" : "Senha para acessar %s compartilhado com você por %s", "Could not find share" : "Não foi possível encontrar o compartilhamento", "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!" : "Felicidades!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Olá,\n%s compartilhou %s com você.\nVocê já deve ter recebido um e-mail separado com um link para acessá-lo.\nÉ protegido com a seguinte senha: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Olá,<br><br>%s compartilhado <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 compartilhado <a href=\"%s\">%s</a> com você.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Olá,<br><br>%s compartilhado <a href=\"%s\">%s</a> com você.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Olá, <br> <br> %s shared <i>%s</ i> com você. <br> Você já deve ter recebido um e-mail separado com um link para acessá-lo. <br><br> Ele é protegido com o seguinte Senha: %s", + "Share by mail" : "Partilhar por correio", + "Send a personalized link to a file or folder by mail." : "Envie um link personalizado para um arquivo ou pasta por e-mail.", + "Send password by mail" : "nviar senha por e-mail" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/l10n/ru.js b/apps/sharebymail/l10n/ru.js index 2e1a9abe09f..07679c8d2aa 100644 --- a/apps/sharebymail/l10n/ru.js +++ b/apps/sharebymail/l10n/ru.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s поделился »%s« с вами", "%s shared »%s« with you on behalf of %s" : "%s поделился »%s« с вами от имени %s", "Failed to create the E-mail" : "Не удалось создать e-mail", + "Password to access »%s« shared to you by %s" : "Пароль для доступа к »%s«, которым поделился %s", "Could not find share" : "Не удалось найти общий ресурс", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Привет,\n\n%s предоставил вам общий доступ к »%s« от имени %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Привет,\n\n%s предоставил вам общий доступ к »%s«.\n\n%s\n\n", "Cheers!" : "Всего наилучшего!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Привет,\n\n%s поделился »%s«.\nВы уже должны были получить отдельное письмо с сслкой для доступа.\n\nРесурс защищён следующим паролем: %s\n\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a> от имени %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a>.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a>.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Привет,<br><br>%s поделился <i>%s</i>. <br> Вы уже должны были получить отдельное письмо с сслкой для доступа.<br><br>Ресурс защищён следующим паролем: %s<br><br>", + "Share by mail" : "Поделиться по почте", + "Send a personalized link to a file or folder by mail." : "Отправить персональную ссылку на файл или каталог по почте.", + "Send password by mail" : "Отправить пароль почтой" }, "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/sharebymail/l10n/ru.json b/apps/sharebymail/l10n/ru.json index 66009d973dd..c9fce29263a 100644 --- a/apps/sharebymail/l10n/ru.json +++ b/apps/sharebymail/l10n/ru.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s поделился »%s« с вами", "%s shared »%s« with you on behalf of %s" : "%s поделился »%s« с вами от имени %s", "Failed to create the E-mail" : "Не удалось создать e-mail", + "Password to access »%s« shared to you by %s" : "Пароль для доступа к »%s«, которым поделился %s", "Could not find share" : "Не удалось найти общий ресурс", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Привет,\n\n%s предоставил вам общий доступ к »%s« от имени %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Привет,\n\n%s предоставил вам общий доступ к »%s«.\n\n%s\n\n", "Cheers!" : "Всего наилучшего!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Привет,\n\n%s поделился »%s«.\nВы уже должны были получить отдельное письмо с сслкой для доступа.\n\nРесурс защищён следующим паролем: %s\n\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a> от имени %s.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a>.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Привет,<br><br>%s вам предоставил общий доступ к <a href=\"%s\">%s</a>.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Привет,<br><br>%s поделился <i>%s</i>. <br> Вы уже должны были получить отдельное письмо с сслкой для доступа.<br><br>Ресурс защищён следующим паролем: %s<br><br>", + "Share by mail" : "Поделиться по почте", + "Send a personalized link to a file or folder by mail." : "Отправить персональную ссылку на файл или каталог по почте.", + "Send password by mail" : "Отправить пароль почтой" },"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/sharebymail/l10n/tr.js b/apps/sharebymail/l10n/tr.js index 3a9bf810f89..e7c3944ed31 100644 --- a/apps/sharebymail/l10n/tr.js +++ b/apps/sharebymail/l10n/tr.js @@ -14,11 +14,17 @@ OC.L10N.register( "%s shared »%s« with you" : "%s sizinle »%s« ögesini paylaştı", "%s shared »%s« with you on behalf of %s" : "%s sizinle »%s« ögesini %s adına paylaştı", "Failed to create the E-mail" : "E-posta oluşturulamadı", + "Password to access »%s« shared to you by %s" : "»%s« için sizin tarafınızdan %s üzerinden paylaşılan erişim parolası", "Could not find share" : "Paylaşım bulunamadı", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Merhaba,\n\n%s sizinle »%s« ögesini %s adına paylaştı.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Merhaba,\n\n%s sizinle »%s« ögesini paylaştı.\n\n%s\n\n", "Cheers!" : "Hoşça kalın!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Merhaba\n\n%s sizinle »%s« paylaştı.\nErişim bilgilerini içeren başka bir e-posta daha gönderilmiş olmalı.\n\nKoruma parolası: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini %s adına paylaştı.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini paylaştı.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini paylaştı.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Merhaba,<br><br>%s sizinle <i>%s</i> paylaştı.<br>Erişim bilgilerini içeren başka bir e-posta daha gönderilmiş olmalı.<br><br> Koruma parolası: %s<br><br>", + "Share by mail" : "E-posta ile paylaş", + "Send a personalized link to a file or folder by mail." : "Bir dosya ya da klasörün kişiselleştirilmiş bağlantısını e-posta ile gönderin.", + "Send password by mail" : "Parolayı e-posta ile gönder" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/sharebymail/l10n/tr.json b/apps/sharebymail/l10n/tr.json index b6b07c20491..c214174465c 100644 --- a/apps/sharebymail/l10n/tr.json +++ b/apps/sharebymail/l10n/tr.json @@ -12,11 +12,17 @@ "%s shared »%s« with you" : "%s sizinle »%s« ögesini paylaştı", "%s shared »%s« with you on behalf of %s" : "%s sizinle »%s« ögesini %s adına paylaştı", "Failed to create the E-mail" : "E-posta oluşturulamadı", + "Password to access »%s« shared to you by %s" : "»%s« için sizin tarafınızdan %s üzerinden paylaşılan erişim parolası", "Could not find share" : "Paylaşım bulunamadı", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Merhaba,\n\n%s sizinle »%s« ögesini %s adına paylaştı.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Merhaba,\n\n%s sizinle »%s« ögesini paylaştı.\n\n%s\n\n", "Cheers!" : "Hoşça kalın!", + "Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n" : "Merhaba\n\n%s sizinle »%s« paylaştı.\nErişim bilgilerini içeren başka bir e-posta daha gönderilmiş olmalı.\n\nKoruma parolası: %s\n", "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you on behalf of %s.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini %s adına paylaştı.<br><br>", - "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini paylaştı.<br><br>" + "Hey there,<br><br>%s shared <a href=\"%s\">%s</a> with you.<br><br>" : "Merhaba,<br><br>%s sizinle <a href=\"%s\">%s</a> ögesini paylaştı.<br><br>", + "Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>" : "Merhaba,<br><br>%s sizinle <i>%s</i> paylaştı.<br>Erişim bilgilerini içeren başka bir e-posta daha gönderilmiş olmalı.<br><br> Koruma parolası: %s<br><br>", + "Share by mail" : "E-posta ile paylaş", + "Send a personalized link to a file or folder by mail." : "Bir dosya ya da klasörün kişiselleştirilmiş bağlantısını e-posta ile gönderin.", + "Send password by mail" : "Parolayı e-posta ile gönder" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/sharebymail/lib/AppInfo/Application.php b/apps/sharebymail/lib/AppInfo/Application.php new file mode 100644 index 00000000000..98febf9dad7 --- /dev/null +++ b/apps/sharebymail/lib/AppInfo/Application.php @@ -0,0 +1,45 @@ +<?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 OCA\ShareByMail\AppInfo; + + +use OCA\ShareByMail\Settings; +use OCP\AppFramework\App; +use OCP\Util; + +class Application extends App { + + public function __construct(array $urlParams = array()) { + parent::__construct('sharebymail', $urlParams); + + $settings = new Settings(); + + /** register capabilities */ + $container = $this->getContainer(); + $container->registerCapability('OCA\ShareByMail\Capabilities'); + + /** register hooks */ + Util::connectHook('\OCP\Config', 'js', $settings, 'announceShareProvider'); + } + +} diff --git a/apps/sharebymail/lib/Capabilities.php b/apps/sharebymail/lib/Capabilities.php new file mode 100644 index 00000000000..de57cd13211 --- /dev/null +++ b/apps/sharebymail/lib/Capabilities.php @@ -0,0 +1,50 @@ +<?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 OCA\ShareByMail; + + +use OCP\Capabilities\ICapability; + +class Capabilities implements ICapability { + + /** + * Function an app uses to return the capabilities + * + * @return array Array containing the apps capabilities + * @since 8.2.0 + */ + public function getCapabilities() { + return [ + 'files_sharing' => + [ + 'sharebymail' => + [ + 'enabled' => true, + 'upload_files_drop' => ['enabled' => true], + 'password' => ['enabled' => true], + 'expire_date' => ['enabled' => true] + ] + ] + ]; + } +} diff --git a/apps/sharebymail/lib/Settings/Admin.php b/apps/sharebymail/lib/Settings/Admin.php new file mode 100644 index 00000000000..b6e7e5d3b4a --- /dev/null +++ b/apps/sharebymail/lib/Settings/Admin.php @@ -0,0 +1,67 @@ +<?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 OCA\ShareByMail\Settings; + +use OCP\AppFramework\Http\TemplateResponse; +use OCP\Settings\ISettings; + +class Admin implements ISettings { + + /** @var SettingsManager */ + private $settingsManager; + + public function __construct(SettingsManager $settingsManager) { + $this->settingsManager = $settingsManager; + } + + /** + * @return TemplateResponse + */ + public function getForm() { + + $parameters = [ + 'sendPasswordMail' => $this->settingsManager->sendPasswordByMail() + ]; + + return new TemplateResponse('sharebymail', 'settings-admin', $parameters, ''); + } + + /** + * @return string the section ID, e.g. 'sharing' + */ + public function getSection() { + return 'sharing'; + } + + /** + * @return int whether the form should be rather on the top or bottom of + * the admin section. The forms are arranged in ascending order of the + * priority values. It is required to return a value between 0 and 100. + * + * E.g.: 70 + */ + public function getPriority() { + return 40; + } + +} diff --git a/apps/sharebymail/lib/Settings/SettingsManager.php b/apps/sharebymail/lib/Settings/SettingsManager.php new file mode 100644 index 00000000000..205b253f337 --- /dev/null +++ b/apps/sharebymail/lib/Settings/SettingsManager.php @@ -0,0 +1,49 @@ +<?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 OCA\ShareByMail\Settings; + + +use OCP\IConfig; + +class SettingsManager { + + /** @var IConfig */ + private $config; + + private $defaultSetting = 'yes'; + + public function __construct(IConfig $config) { + $this->config = $config; + } + + /** + * should the password for a mail share be send to the recipient + * + * @return bool + */ + public function sendPasswordByMail() { + $sendPasswordByMail = $this->config->getAppValue('sharebymail', 'sendpasswordmail', $this->defaultSetting); + return $sendPasswordByMail === 'yes'; + } + +} diff --git a/apps/sharebymail/lib/ShareByMailProvider.php b/apps/sharebymail/lib/ShareByMailProvider.php index e09ca308f31..332f1c0cf74 100644 --- a/apps/sharebymail/lib/ShareByMailProvider.php +++ b/apps/sharebymail/lib/ShareByMailProvider.php @@ -23,7 +23,9 @@ namespace OCA\ShareByMail; use OC\HintException; use OC\Share20\Exception\InvalidShare; +use OCA\ShareByMail\Settings\SettingsManager; use OCP\Activity\IManager; +use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -75,13 +77,16 @@ class ShareByMailProvider implements IShareProvider { /** @var IManager */ private $activityManager; + /** @var SettingsManager */ + private $settingsManager; + /** * Return the identifier of this provider. * * @return string Containing only [a-zA-Z0-9] */ public function identifier() { - return 'ocShareByMail'; + return 'ocMailShare'; } /** @@ -96,6 +101,7 @@ class ShareByMailProvider implements IShareProvider { * @param IMailer $mailer * @param IURLGenerator $urlGenerator * @param IManager $activityManager + * @param SettingsManager $settingsManager */ public function __construct( IDBConnection $connection, @@ -106,7 +112,8 @@ class ShareByMailProvider implements IShareProvider { ILogger $logger, IMailer $mailer, IURLGenerator $urlGenerator, - IManager $activityManager + IManager $activityManager, + SettingsManager $settingsManager ) { $this->dbConnection = $connection; $this->secureRandom = $secureRandom; @@ -117,6 +124,7 @@ class ShareByMailProvider implements IShareProvider { $this->mailer = $mailer; $this->urlGenerator = $urlGenerator; $this->activityManager = $activityManager; + $this->settingsManager = $settingsManager; } /** @@ -275,10 +283,10 @@ class ShareByMailProvider implements IShareProvider { protected function createMailBody($template, $filename, $link, $owner, $initiator) { $mailBodyTemplate = new Template('sharebymail', $template, ''); - $mailBodyTemplate->assign ('filename', $filename); + $mailBodyTemplate->assign ('filename', \OCP\Util::sanitizeHTML($filename)); $mailBodyTemplate->assign ('link', $link); - $mailBodyTemplate->assign ('owner', $owner); - $mailBodyTemplate->assign ('initiator', $initiator); + $mailBodyTemplate->assign ('owner', \OCP\Util::sanitizeHTML($owner)); + $mailBodyTemplate->assign ('initiator', \OCP\Util::sanitizeHTML($initiator)); $mailBodyTemplate->assign ('onBehalfOf', $initiator !== $owner); $mailBody = $mailBodyTemplate->fetchPage(); @@ -291,6 +299,60 @@ class ShareByMailProvider implements IShareProvider { } /** + * send password to recipient of a mail share + * + * @param string $filename + * @param string $initiator + * @param string $shareWith + */ + protected function sendPassword($filename, $initiator, $shareWith, $password) { + + if ($this->settingsManager->sendPasswordByMail() === false) { + return; + } + + $initiatorUser = $this->userManager->get($initiator); + $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator; + $subject = (string)$this->l->t('Password to access »%s« shared to you by %s', [$filename, $initiatorDisplayName]); + + $message = $this->mailer->createMessage(); + $htmlBody = $this->createMailBodyToSendPassword('mailpassword', $filename, $initiatorDisplayName, $password); + $textBody = $this->createMailBodyToSendPassword('altmailpassword', $filename,$initiatorDisplayName, $password); + $message->setTo([$shareWith]); + $message->setSubject($subject); + $message->setBody($textBody, 'text/plain'); + $message->setHtmlBody($htmlBody); + $this->mailer->send($message); + + } + + /** + * create mail body to send password to recipient + * + * @param string $filename + * @param string $initiator + * @param string $password + * @return string plain text mail + * @throws HintException + */ + protected function createMailBodyToSendPassword($template, $filename, $initiator, $password) { + + $mailBodyTemplate = new Template('sharebymail', $template, ''); + $mailBodyTemplate->assign ('filename', \OCP\Util::sanitizeHTML($filename)); + $mailBodyTemplate->assign ('password', \OCP\Util::sanitizeHTML($password)); + $mailBodyTemplate->assign ('initiator', \OCP\Util::sanitizeHTML($initiator)); + $mailBody = $mailBodyTemplate->fetchPage(); + + if (is_string($mailBody)) { + return $mailBody; + } + + throw new HintException('Failed to create the E-mail', + $this->l->t('Failed to create the E-mail')); + } + + + /** * generate share token * * @return string @@ -368,19 +430,31 @@ class ShareByMailProvider implements IShareProvider { * Update a share * * @param IShare $share + * @param string|null $plainTextPassword * @return IShare The share object */ - public function update(IShare $share) { + public function update(IShare $share, $plainTextPassword = null) { + + $originalShare = $this->getShareById($share->getId()); + + // a real password was given + $validPassword = $plainTextPassword !== null && $plainTextPassword !== ''; + + if($validPassword && $originalShare->getPassword() !== $share->getPassword()) { + $this->sendPassword($share->getNode()->getName(), $share->getSharedBy(), $share->getSharedWith(), $plainTextPassword); + } /* - * We allow updating the permissions of mail shares + * We allow updating the permissions and password of mail shares */ $qb = $this->dbConnection->getQueryBuilder(); - $qb->update('share') - ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) - ->set('permissions', $qb->createNamedParameter($share->getPermissions())) - ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner())) - ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy())) - ->execute(); + $qb->update('share') + ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))) + ->set('permissions', $qb->createNamedParameter($share->getPermissions())) + ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner())) + ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy())) + ->set('password', $qb->createNamedParameter($share->getPassword())) + ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE)) + ->execute(); return $share; } @@ -625,6 +699,7 @@ class ShareByMailProvider implements IShareProvider { $shareTime->setTimestamp((int)$data['stime']); $share->setShareTime($shareTime); $share->setSharedWith($data['share_with']); + $share->setPassword($data['password']); if ($data['uid_initiator'] !== null) { $share->setShareOwner($data['uid_owner']); @@ -638,6 +713,13 @@ class ShareByMailProvider implements IShareProvider { $share->setShareOwner($owner->getUID()); } + if ($data['expiration'] !== null) { + $expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']); + if ($expiration !== false) { + $share->setExpirationDate($expiration); + } + } + $share->setNodeId((int)$data['file_source']); $share->setNodeType($data['item_type']); diff --git a/apps/sharebymail/templates/altmailpassword.php b/apps/sharebymail/templates/altmailpassword.php new file mode 100644 index 00000000000..f6e4c5b4158 --- /dev/null +++ b/apps/sharebymail/templates/altmailpassword.php @@ -0,0 +1,32 @@ +<?php +/** + * @copyright Copyright (c) 2016 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/>. + * + */ + +/** @var OC_Theme $theme */ +/** @var array $_ */ +print_unescaped($l->t("Hey there,\n\n%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n\nIt is protected with the following password: %s\n\n", [$_['initiator'], $_['filename'], $_['password']])); +// TRANSLATORS term at the end of a mail +p($l->t("Cheers!")); +print_unescaped("\n"); +?> + + -- +<?php p($theme->getName() . ' - ' . $theme->getSlogan()); ?> +<?php print_unescaped("\n".$theme->getBaseUrl()); diff --git a/apps/sharebymail/templates/mailpassword.php b/apps/sharebymail/templates/mailpassword.php new file mode 100644 index 00000000000..714a61cecd9 --- /dev/null +++ b/apps/sharebymail/templates/mailpassword.php @@ -0,0 +1,59 @@ +<?php +/** + * @copyright Copyright (c) 2016 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/>. + * + */ + +/** @var OCA\Theming\ThemingDefaults $theme */ +/** @var array $_ */ +?> + +<table cellspacing="0" cellpadding="0" border="0" width="100%"> + <tr><td> + <table cellspacing="0" cellpadding="0" border="0" width="600px"> + <tr> + <td colspan="2" bgcolor="<?php p($theme->getColorPrimary());?>"> + <img src="<?php p(\OC::$server->getURLGenerator()->getAbsoluteURL(image_path('', 'logo-mail.png'))); ?>" alt="<?php p($theme->getName()); ?>"/> + </td> + </tr> + <tr><td colspan="2"> </td></tr> + <tr> + <td width="20px"> </td> + <td style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;"> + <?php + print_unescaped($l->t('Hey there,<br><br>%s shared <i>%s</i> with you.<br>You should have already received a separate mail with a link to access it.<br><br>It is protected with the following password: %s<br><br>', [$_['initiator'], $_['filename'], $_['password']])); + // TRANSLATORS term at the end of a mail + p($l->t('Cheers!')); + ?> + </td> + </tr> + <tr><td colspan="2"> </td></tr> + <tr> + <td width="20px"> </td> + <td style="font-weight:normal; font-size:0.8em; line-height:1.2em; font-family:verdana,'arial',sans;">--<br> + <?php p($theme->getName()); ?> - + <?php p($theme->getSlogan()); ?> + <br><a href="<?php p($theme->getBaseUrl()); ?>"><?php p($theme->getBaseUrl());?></a> + </td> + </tr> + <tr> + <td colspan="2"> </td> + </tr> + </table> + </td></tr> +</table> diff --git a/apps/sharebymail/templates/settings-admin.php b/apps/sharebymail/templates/settings-admin.php new file mode 100644 index 00000000000..c4e41086063 --- /dev/null +++ b/apps/sharebymail/templates/settings-admin.php @@ -0,0 +1,18 @@ +<?php +/** @var array $_ */ +use OCA\Federation\TrustedServers; + +/** @var \OCP\IL10N $l */ +script('sharebymail', 'settings-admin'); +?> +<div id="ncShareByMailSettings" class="section"> + <h2><?php p($l->t('Share by mail')); ?></h2> + <em><?php p($l->t('Send a personalized link to a file or folder by mail.')); ?></em> + + <p> + <input id="sendPasswordMail" type="checkbox" class="checkbox" <?php if($_['sendPasswordMail']) p('checked'); ?> /> + <label for="sendPasswordMail"><?php p($l->t('Send password by mail')); ?></label> + </p> + +</div> + diff --git a/apps/sharebymail/tests/ShareByMailProviderTest.php b/apps/sharebymail/tests/ShareByMailProviderTest.php index 65eded3eb7d..288ebb4bb45 100644 --- a/apps/sharebymail/tests/ShareByMailProviderTest.php +++ b/apps/sharebymail/tests/ShareByMailProviderTest.php @@ -23,7 +23,7 @@ namespace OCA\ShareByMail\Tests; -use OC\HintException; +use OCA\ShareByMail\Settings\SettingsManager; use OCA\ShareByMail\ShareByMailProvider; use OCP\Files\IRootFolder; use OCP\IDBConnection; @@ -33,7 +33,6 @@ use OCP\IURLGenerator; use OCP\IUserManager; use OCP\Mail\IMailer; use OCP\Security\ISecureRandom; -use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IManager; use OCP\Share\IShare; use Test\TestCase; @@ -79,6 +78,9 @@ class ShareByMailProviderTest extends TestCase { /** @var \OCP\Activity\IManager | \PHPUnit_Framework_MockObject_MockObject */ private $activityManager; + /** @var SettingsManager | \PHPUnit_Framework_MockObject_MockObject */ + private $settingsManager; + public function setUp() { parent::setUp(); @@ -98,6 +100,7 @@ class ShareByMailProviderTest extends TestCase { $this->urlGenerator = $this->getMockBuilder('\OCP\IUrlGenerator')->getMock(); $this->share = $this->getMockBuilder('\OCP\Share\IShare')->getMock(); $this->activityManager = $this->getMockBuilder('OCP\Activity\IManager')->getMock(); + $this->settingsManager = $this->getMockBuilder(SettingsManager::class)->disableOriginalConstructor()->getMock(); $this->userManager->expects($this->any())->method('userExists')->willReturn(true); } @@ -121,7 +124,8 @@ class ShareByMailProviderTest extends TestCase { $this->logger, $this->mailer, $this->urlGenerator, - $this->activityManager + $this->activityManager, + $this->settingsManager ] ); @@ -139,7 +143,8 @@ class ShareByMailProviderTest extends TestCase { $this->logger, $this->mailer, $this->urlGenerator, - $this->activityManager + $this->activityManager, + $this->settingsManager ); } @@ -311,7 +316,7 @@ class ShareByMailProviderTest extends TestCase { $this->share->expects($this->once())->method('getPermissions')->willReturn($permissions + 1); $this->share->expects($this->once())->method('getShareOwner')->willReturn($uidOwner); $this->share->expects($this->once())->method('getSharedBy')->willReturn($sharedBy); - $this->share->expects($this->once())->method('getId')->willReturn($id); + $this->share->expects($this->atLeastOnce())->method('getId')->willReturn($id); $this->assertSame($this->share, $instance->update($this->share) diff --git a/apps/systemtags/l10n/es_MX.js b/apps/systemtags/l10n/es_MX.js index e5c543ce18b..b0ab0534c92 100644 --- a/apps/systemtags/l10n/es_MX.js +++ b/apps/systemtags/l10n/es_MX.js @@ -2,7 +2,54 @@ OC.L10N.register( "systemtags", { "Tags" : "Etiquetas", + "Update" : "Actualizar", + "Create" : "Crear", + "Select tag…" : "Seleccionar etiqueta...", + "Tagged files" : "Archivos etiquetados", + "Select tags to filter by" : "Seleccione las etiquetas para el filtro", + "No tags found" : "No se encontraron etiquetas", + "Please select tags to filter by" : "Favor de seleccionar etiquetas para el filtro", + "No files found for the selected tags" : "No se encontraron archivos para las etiquetas seleccionadas", + "Added system tag %1$s" : "Etiqueta del sistema %1$s agregada", + "Added system tag {systemtag}" : "Etiqueta del sistema {systemtag} agregada", + "%1$s added system tag %2$s" : "%1$s agregó la etiqueta del sistema %2$s", + "{actor} added system tag {systemtag}" : "{actor} agregó la etiqueta del sistema {systemtag}", + "Removed system tag %1$s" : "Eliminó la etiqueta del sistema %1$s", + "Removed system tag {systemtag}" : "Eliminó la etiqueta del sistema {systemtag}", + "%1$s removed system tag %2$s" : "%1$s eliminó la etiqueta del sistema %2$s", + "{actor} removed system tag {systemtag}" : "{actor} eliminó la etiqueta del sistema {systemtag}", + "You created system tag %1$s" : "Usted creó la etiqueta del sistema %1$s", + "You created system tag {systemtag}" : "Usted creó la etiqueta del sistema {systemtag}", + "%1$s created system tag %2$s" : "%1$s creo la etiqueta del sistema %2$s", + "{actor} created system tag {systemtag}" : "{actor} creó la etiqueta del sistema {systemtag}", + "You deleted system tag %1$s" : "Usted borró la etiqueta del sistema %1$s", + "You deleted system tag {systemtag}" : "Usted borró la etiqueta del sistema {systemtag}", + "%1$s deleted system tag %2$s" : "%1$s borró la etiqueta del sistema %2$s", + "{actor} deleted system tag {systemtag}" : "{actor} borró la etiqueta del sistema {systemtag}", + "You updated system tag %2$s to %1$s" : "Usted actualizó la etiqueta del sistema %2$s a %1$s", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "Usted actualizó la etiqueta del sistema {oldsystemtag} a {newsystemtag}", + "%1$s updated system tag %3$s to %2$s" : "%1$s actualizó la etiqueta del sistema %3$s a %2$s", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} actualizó la etiqueta del sistema {oldsystemtag} a {newsystemtag}", + "You added system tag %2$s to %1$s" : "Usted agregó la etiqueta del sistema %2$s a %1$s", + "You added system tag {systemtag} to {file}" : "Usted agregó la etiqueta del sistema {systemtag} a {file}", + "%1$s added system tag %3$s to %2$s" : "%1$s agregó la etiqueta del sistema %3$s a %2$s", + "{actor} added system tag {systemtag} to {file}" : "{actor} agregó la etiqueta del sistema {systemtag} a {file}", + "You removed system tag %2$s from %1$s" : "Usted eliminó la etiqueta del sistema %2$s de %1$s", + "You removed system tag {systemtag} from {file}" : "Usted eliminó la etiqueta del sistema {systemtag} de {file}", + "%1$s removed system tag %3$s from %2$s" : "%1$s eliminó la etiqueta del sistema %3$s de %2$s", + "{actor} removed system tag {systemtag} from {file}" : "{actor} eliminó la etiqueta del sistema {systemtag} de {file}", + "%s (restricted)" : "%s (restringido)", + "%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", "Name" : "Nombre", + "Delete" : "Borrar", + "Public" : "Público", + "Restricted" : "Restringido", + "Invisible" : "Invisible", + "Reset" : "Restaurar", + "No files in here" : "No hay archivos aquí", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", "Size" : "Tamaño", "Modified" : "Modificado" }, diff --git a/apps/systemtags/l10n/es_MX.json b/apps/systemtags/l10n/es_MX.json index 5bae74d482d..601cb331a23 100644 --- a/apps/systemtags/l10n/es_MX.json +++ b/apps/systemtags/l10n/es_MX.json @@ -1,6 +1,53 @@ { "translations": { "Tags" : "Etiquetas", + "Update" : "Actualizar", + "Create" : "Crear", + "Select tag…" : "Seleccionar etiqueta...", + "Tagged files" : "Archivos etiquetados", + "Select tags to filter by" : "Seleccione las etiquetas para el filtro", + "No tags found" : "No se encontraron etiquetas", + "Please select tags to filter by" : "Favor de seleccionar etiquetas para el filtro", + "No files found for the selected tags" : "No se encontraron archivos para las etiquetas seleccionadas", + "Added system tag %1$s" : "Etiqueta del sistema %1$s agregada", + "Added system tag {systemtag}" : "Etiqueta del sistema {systemtag} agregada", + "%1$s added system tag %2$s" : "%1$s agregó la etiqueta del sistema %2$s", + "{actor} added system tag {systemtag}" : "{actor} agregó la etiqueta del sistema {systemtag}", + "Removed system tag %1$s" : "Eliminó la etiqueta del sistema %1$s", + "Removed system tag {systemtag}" : "Eliminó la etiqueta del sistema {systemtag}", + "%1$s removed system tag %2$s" : "%1$s eliminó la etiqueta del sistema %2$s", + "{actor} removed system tag {systemtag}" : "{actor} eliminó la etiqueta del sistema {systemtag}", + "You created system tag %1$s" : "Usted creó la etiqueta del sistema %1$s", + "You created system tag {systemtag}" : "Usted creó la etiqueta del sistema {systemtag}", + "%1$s created system tag %2$s" : "%1$s creo la etiqueta del sistema %2$s", + "{actor} created system tag {systemtag}" : "{actor} creó la etiqueta del sistema {systemtag}", + "You deleted system tag %1$s" : "Usted borró la etiqueta del sistema %1$s", + "You deleted system tag {systemtag}" : "Usted borró la etiqueta del sistema {systemtag}", + "%1$s deleted system tag %2$s" : "%1$s borró la etiqueta del sistema %2$s", + "{actor} deleted system tag {systemtag}" : "{actor} borró la etiqueta del sistema {systemtag}", + "You updated system tag %2$s to %1$s" : "Usted actualizó la etiqueta del sistema %2$s a %1$s", + "You updated system tag {oldsystemtag} to {newsystemtag}" : "Usted actualizó la etiqueta del sistema {oldsystemtag} a {newsystemtag}", + "%1$s updated system tag %3$s to %2$s" : "%1$s actualizó la etiqueta del sistema %3$s a %2$s", + "{actor} updated system tag {oldsystemtag} to {newsystemtag}" : "{actor} actualizó la etiqueta del sistema {oldsystemtag} a {newsystemtag}", + "You added system tag %2$s to %1$s" : "Usted agregó la etiqueta del sistema %2$s a %1$s", + "You added system tag {systemtag} to {file}" : "Usted agregó la etiqueta del sistema {systemtag} a {file}", + "%1$s added system tag %3$s to %2$s" : "%1$s agregó la etiqueta del sistema %3$s a %2$s", + "{actor} added system tag {systemtag} to {file}" : "{actor} agregó la etiqueta del sistema {systemtag} a {file}", + "You removed system tag %2$s from %1$s" : "Usted eliminó la etiqueta del sistema %2$s de %1$s", + "You removed system tag {systemtag} from {file}" : "Usted eliminó la etiqueta del sistema {systemtag} de {file}", + "%1$s removed system tag %3$s from %2$s" : "%1$s eliminó la etiqueta del sistema %3$s de %2$s", + "{actor} removed system tag {systemtag} from {file}" : "{actor} eliminó la etiqueta del sistema {systemtag} de {file}", + "%s (restricted)" : "%s (restringido)", + "%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", "Name" : "Nombre", + "Delete" : "Borrar", + "Public" : "Público", + "Restricted" : "Restringido", + "Invisible" : "Invisible", + "Reset" : "Restaurar", + "No files in here" : "No hay archivos aquí", + "No entries found in this folder" : "No se encontraron elementos en esta carpeta", "Size" : "Tamaño", "Modified" : "Modificado" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/theming/l10n/bg.js b/apps/theming/l10n/bg.js new file mode 100644 index 00000000000..a0fd44abeae --- /dev/null +++ b/apps/theming/l10n/bg.js @@ -0,0 +1,27 @@ +OC.L10N.register( + "theming", + { + "Admin" : "Админ", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "The given name is too long" : "Името е прекалено дълго", + "The given web address is too long" : "web адреса е прекалено дълъг", + "The given slogan is too long" : "Избраният лозунг е твърде дълъг", + "The given color is invalid" : "Избраният цвят е невалиден", + "Saved" : "Запазено", + "No file uploaded" : "Няма качен файл", + "Unsupported image type" : "Неподдържан тип изображение", + "You are already using a custom theme" : "Вие вече използвате персонализирана тема", + "Theming" : "Теми", + "Name" : "Име", + "reset to default" : "възстановяване към стандартни", + "Web address" : "Уеб адрес", + "Web address https://…" : "Уеб адрес https://...", + "Slogan" : "Лозунг", + "Color" : "Цвят", + "Logo" : "Лого", + "Upload new logo" : "Качване на ново лого", + "Login image" : "Изображение при вписване", + "Upload new login background" : "Качване на нов фон за входа", + "Log in image" : "Изображение при вписване" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/bg.json b/apps/theming/l10n/bg.json new file mode 100644 index 00000000000..0b842b12b1a --- /dev/null +++ b/apps/theming/l10n/bg.json @@ -0,0 +1,25 @@ +{ "translations": { + "Admin" : "Админ", + "a safe home for all your data" : "безопасен дом за всички ваши данни", + "The given name is too long" : "Името е прекалено дълго", + "The given web address is too long" : "web адреса е прекалено дълъг", + "The given slogan is too long" : "Избраният лозунг е твърде дълъг", + "The given color is invalid" : "Избраният цвят е невалиден", + "Saved" : "Запазено", + "No file uploaded" : "Няма качен файл", + "Unsupported image type" : "Неподдържан тип изображение", + "You are already using a custom theme" : "Вие вече използвате персонализирана тема", + "Theming" : "Теми", + "Name" : "Име", + "reset to default" : "възстановяване към стандартни", + "Web address" : "Уеб адрес", + "Web address https://…" : "Уеб адрес https://...", + "Slogan" : "Лозунг", + "Color" : "Цвят", + "Logo" : "Лого", + "Upload new logo" : "Качване на ново лого", + "Login image" : "Изображение при вписване", + "Upload new login background" : "Качване на нов фон за входа", + "Log in image" : "Изображение при вписване" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/es_MX.js b/apps/theming/l10n/es_MX.js new file mode 100644 index 00000000000..fb1bfca4914 --- /dev/null +++ b/apps/theming/l10n/es_MX.js @@ -0,0 +1,27 @@ +OC.L10N.register( + "theming", + { + "Admin" : "Administración", + "a safe home for all your data" : "un lugar seguro para todos sus datos", + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Saved" : "Guardado", + "No file uploaded" : "No hay archivos cargados", + "Unsupported image type" : "Tipo de imagen no soportado", + "You are already using a custom theme" : "Usted ya se encuentra usando un tema personalizado", + "Theming" : "Tematizar", + "Name" : "Nombre", + "reset to default" : "restaurar a predeterminado", + "Web address" : "Dirección web", + "Web address https://…" : "Dirección web https://...", + "Slogan" : "Lema", + "Color" : "Color", + "Logo" : "Logotipo", + "Upload new logo" : "Cargar nuevo logotipo", + "Login image" : "Imágen de inicio de sesión", + "Upload new login background" : "Cargar nueva imagen de fondo para inicio de sesión", + "Log in image" : "Imagen de inicio de sesión" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/theming/l10n/es_MX.json b/apps/theming/l10n/es_MX.json new file mode 100644 index 00000000000..d2d65f4b0c8 --- /dev/null +++ b/apps/theming/l10n/es_MX.json @@ -0,0 +1,25 @@ +{ "translations": { + "Admin" : "Administración", + "a safe home for all your data" : "un lugar seguro para todos sus datos", + "The given name is too long" : "El nombre dado es demasiado largo", + "The given web address is too long" : "La dirección web dada es demasiado larga", + "The given slogan is too long" : "El lema dado es demasiado largo", + "The given color is invalid" : "El color dado es inválido", + "Saved" : "Guardado", + "No file uploaded" : "No hay archivos cargados", + "Unsupported image type" : "Tipo de imagen no soportado", + "You are already using a custom theme" : "Usted ya se encuentra usando un tema personalizado", + "Theming" : "Tematizar", + "Name" : "Nombre", + "reset to default" : "restaurar a predeterminado", + "Web address" : "Dirección web", + "Web address https://…" : "Dirección web https://...", + "Slogan" : "Lema", + "Color" : "Color", + "Logo" : "Logotipo", + "Upload new logo" : "Cargar nuevo logotipo", + "Login image" : "Imágen de inicio de sesión", + "Upload new login background" : "Cargar nueva imagen de fondo para inicio de sesión", + "Log in image" : "Imagen de inicio de sesión" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/theming/l10n/sk.js b/apps/theming/l10n/sk.js index 5f3693fbad1..f735ce5a409 100644 --- a/apps/theming/l10n/sk.js +++ b/apps/theming/l10n/sk.js @@ -1,7 +1,7 @@ OC.L10N.register( "theming", { - "Admin" : "Administrátor", + "Admin" : "Správca", "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", "The given name is too long" : "Zadané meno je príliš dlhé", "The given web address is too long" : "Zadaná web adresa je príliš dlhá", diff --git a/apps/theming/l10n/sk.json b/apps/theming/l10n/sk.json index c63920d620c..31ab56f00c0 100644 --- a/apps/theming/l10n/sk.json +++ b/apps/theming/l10n/sk.json @@ -1,5 +1,5 @@ { "translations": { - "Admin" : "Administrátor", + "Admin" : "Správca", "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta", "The given name is too long" : "Zadané meno je príliš dlhé", "The given web address is too long" : "Zadaná web adresa je príliš dlhá", diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php index 5a863b1eb22..d4dc56d3ba9 100644 --- a/apps/theming/lib/ThemingDefaults.php +++ b/apps/theming/lib/ThemingDefaults.php @@ -1,6 +1,7 @@ <?php /** * @copyright Copyright (c) 2016 Bjoern Schiessle <bjoern@schiessle.org> + * @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch> * * @license GNU AGPL version 3 or any later version * @@ -19,15 +20,14 @@ * */ - namespace OCA\Theming; +use OCP\Files\IAppData; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IL10N; use OCP\IURLGenerator; -use OCP\Files\IRootFolder; use OCP\Util; class ThemingDefaults extends \OC_Defaults { @@ -38,8 +38,8 @@ class ThemingDefaults extends \OC_Defaults { private $l; /** @var IURLGenerator */ private $urlGenerator; - /** @var IRootFolder */ - private $rootFolder; + /** @var IAppData */ + private $appData; /** @var ICacheFactory */ private $cacheFactory; /** @var string */ @@ -58,21 +58,21 @@ class ThemingDefaults extends \OC_Defaults { * @param IL10N $l * @param IURLGenerator $urlGenerator * @param \OC_Defaults $defaults - * @param IRootFolder $rootFolder + * @param IAppData $appData * @param ICacheFactory $cacheFactory */ public function __construct(IConfig $config, IL10N $l, IURLGenerator $urlGenerator, \OC_Defaults $defaults, - IRootFolder $rootFolder, + IAppData $appData, ICacheFactory $cacheFactory ) { parent::__construct(); $this->config = $config; $this->l = $l; $this->urlGenerator = $urlGenerator; - $this->rootFolder = $rootFolder; + $this->appData = $appData; $this->cacheFactory = $cacheFactory; $this->name = $defaults->getName(); @@ -130,11 +130,19 @@ class ThemingDefaults extends \OC_Defaults { */ public function getLogo() { $logo = $this->config->getAppValue('theming', 'logoMime'); - if(!$logo || !$this->rootFolder->nodeExists('/themedinstancelogo')) { + + $logoExists = true; + try { + $this->appData->getFolder('images')->getFile('logo'); + } catch (\Exception $e) { + $logoExists = false; + } + + if(!$logo || !$logoExists) { return $this->urlGenerator->imagePath('core','logo.svg'); - } else { - return $this->urlGenerator->linkToRoute('theming.Theming.getLogo'); } + + return $this->urlGenerator->linkToRoute('theming.Theming.getLogo'); } /** @@ -144,11 +152,19 @@ class ThemingDefaults extends \OC_Defaults { */ public function getBackground() { $backgroundLogo = $this->config->getAppValue('theming', 'backgroundMime'); - if(!$backgroundLogo || !$this->rootFolder->nodeExists('/themedbackgroundlogo')) { + + $backgroundExists = true; + try { + $this->appData->getFolder('images')->getFile('background'); + } catch (\Exception $e) { + $backgroundExists = false; + } + + if(!$backgroundLogo || !$backgroundExists) { return $this->urlGenerator->imagePath('core','background.jpg'); - } else { - return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground'); } + + return $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground'); } /** @@ -175,6 +191,15 @@ class ThemingDefaults extends \OC_Defaults { } /** + * Gets the current cache buster count + * + * @return string + */ + public function getCacheBusterCounter() { + return $this->config->getAppValue('theming', 'cachebuster', '0'); + } + + /** * Increases the cache buster key */ private function increaseCacheBuster() { diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php index 72ccaa57d77..986b2f34267 100644 --- a/apps/theming/tests/ThemingDefaultsTest.php +++ b/apps/theming/tests/ThemingDefaultsTest.php @@ -24,37 +24,36 @@ namespace OCA\Theming\Tests; use OCA\Theming\ThemingDefaults; +use OCP\Files\IAppData; +use OCP\Files\SimpleFS\ISimpleFolder; use OCP\ICacheFactory; use OCP\IConfig; use OCP\IL10N; use OCP\IURLGenerator; -use OCP\Files\IRootFolder; use Test\TestCase; class ThemingDefaultsTest extends TestCase { - /** @var IConfig */ + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ private $config; - /** @var IL10N */ + /** @var IL10N|\PHPUnit_Framework_MockObject_MockObject */ private $l10n; - /** @var IURLGenerator */ + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ private $urlGenerator; - /** @var \OC_Defaults */ + /** @var \OC_Defaults|\PHPUnit_Framework_MockObject_MockObject */ private $defaults; + /** @var IAppData|\PHPUnit_Framework_MockObject_MockObject */ + private $appData; + /** @var ICacheFactory|\PHPUnit_Framework_MockObject_MockObject */ + private $cacheFactory; /** @var ThemingDefaults */ private $template; - /** @var IRootFolder */ - private $rootFolder; - /** @var ICacheFactory */ - private $cacheFactory; public function setUp() { parent::setUp(); $this->config = $this->getMockBuilder(IConfig::class)->getMock(); $this->l10n = $this->getMockBuilder(IL10N::class)->getMock(); $this->urlGenerator = $this->getMockBuilder(IURLGenerator::class)->getMock(); - $this->rootFolder = $this->getMockBuilder(IRootFolder::class) - ->disableOriginalConstructor() - ->getMock(); + $this->appData = $this->createMock(IAppData::class); $this->cacheFactory = $this->getMockBuilder(ICacheFactory::class)->getMock(); $this->defaults = $this->getMockBuilder(\OC_Defaults::class) ->disableOriginalConstructor() @@ -80,7 +79,7 @@ class ThemingDefaultsTest extends TestCase { $this->l10n, $this->urlGenerator, $this->defaults, - $this->rootFolder, + $this->appData, $this->cacheFactory ); } @@ -386,6 +385,11 @@ class ThemingDefaultsTest extends TestCase { ->method('getAppValue') ->with('theming', 'backgroundMime') ->willReturn(''); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willThrowException(new \Exception()); $expected = $this->urlGenerator->imagePath('core','background.jpg'); $this->assertEquals($expected, $this->template->getBackground()); } @@ -396,6 +400,17 @@ class ThemingDefaultsTest extends TestCase { ->method('getAppValue') ->with('theming', 'backgroundMime') ->willReturn('image/svg+xml'); + $simpleFolder = $this->createMock(ISimpleFolder::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($simpleFolder); + $simpleFolder + ->expects($this->once()) + ->method('getFile') + ->with('background') + ->willReturn(''); $expected = $this->urlGenerator->linkToRoute('theming.Theming.getLoginBackground'); $this->assertEquals($expected, $this->template->getBackground()); } @@ -406,6 +421,11 @@ class ThemingDefaultsTest extends TestCase { ->method('getAppValue') ->with('theming', 'logoMime') ->willReturn(''); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willThrowException(new \Exception()); $expected = $this->urlGenerator->imagePath('core','logo.svg'); $this->assertEquals($expected, $this->template->getLogo()); } @@ -416,6 +436,17 @@ class ThemingDefaultsTest extends TestCase { ->method('getAppValue') ->with('theming', 'logoMime') ->willReturn('image/svg+xml'); + $simpleFolder = $this->createMock(ISimpleFolder::class); + $this->appData + ->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($simpleFolder); + $simpleFolder + ->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willReturn(''); $expected = $this->urlGenerator->linkToRoute('theming.Theming.getLogo'); $this->assertEquals($expected, $this->template->getLogo()); } diff --git a/apps/twofactor_backupcodes/l10n/el.js b/apps/twofactor_backupcodes/l10n/el.js new file mode 100644 index 00000000000..c6d3817011d --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/el.js @@ -0,0 +1,21 @@ +OC.L10N.register( + "twofactor_backupcodes", + { + "Generate backup codes" : "Δημιουργία εφεδρικών κωδικών", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Οι εφεδρικοί κωδικοί έχουν δημιουργηθεί. {{χρησιμοποιούνται}} του {{συνολικού}} κωδικοί έχουν χρησιμοποιηθεί.", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Αυτοί είναι είναι οι εφεδρικοί σας κωδικοί. Παρακαλούμε αποθηκεύστε τους και/ή εκτυπώστε τους καθώς δεν θα είστε σε θέση να τους διαβάσετε ξανά αργότερα.", + "Save backup codes" : "Αποθήκευση εφεδρικών κωδικών", + "Print backup codes" : "Εκτύπωση εφεδρικών κωδικών", + "Regenerate backup codes" : "Δημιουργία εφεδρικών κωδικών", + "If you regenerate backup codes, you automatically invalidate old codes." : "Εάν αναδημιουργήσετε εφεδρικούς κωδικούς, οι παλιοί κωδικοί ακυρώνονται αυτόματα.", + "An error occurred while generating your backup codes" : "Ένα σφάλμα προέκυψε κατά τη δημιουργία των εφεδρικών κωδικών.", + "Nextcloud backup codes" : "Εφεδρικοί κωδικοί Nextcloud", + "Two-factor authentication" : "Έλεγχος πιστοποίησης δύο βημάτων", + "You successfully logged in using two-factor authentication (%1$s)" : "Έχετε συνδεθεί επιτυχώς με τη χρήση ελέγχου ταυτότητας δύο-παραγόντων (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "Μία προσπάθεια σύνδεσης με τη χρήση ελέγχου ταυτότητας δύο-παραγόντων απέτυχε (%1$s)", + "You created two-factor backup codes for your account" : "Μπορείτε να δημιουργήσετε τον παράγοντα διπλού ελέγχου ταυτότητας για το λογαριασμό σας ΤΟΤΡ", + "Backup code" : "Εφεδρικός κωδικός", + "Use backup code" : "Χρησιμοποιήστε έναν εφεδρικό κωδικό", + "Second-factor backup codes" : "Εφεδρικοί κωδικοί δεύτερου-παράγοντα" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/twofactor_backupcodes/l10n/el.json b/apps/twofactor_backupcodes/l10n/el.json new file mode 100644 index 00000000000..ba0f6831a22 --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/el.json @@ -0,0 +1,19 @@ +{ "translations": { + "Generate backup codes" : "Δημιουργία εφεδρικών κωδικών", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Οι εφεδρικοί κωδικοί έχουν δημιουργηθεί. {{χρησιμοποιούνται}} του {{συνολικού}} κωδικοί έχουν χρησιμοποιηθεί.", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Αυτοί είναι είναι οι εφεδρικοί σας κωδικοί. Παρακαλούμε αποθηκεύστε τους και/ή εκτυπώστε τους καθώς δεν θα είστε σε θέση να τους διαβάσετε ξανά αργότερα.", + "Save backup codes" : "Αποθήκευση εφεδρικών κωδικών", + "Print backup codes" : "Εκτύπωση εφεδρικών κωδικών", + "Regenerate backup codes" : "Δημιουργία εφεδρικών κωδικών", + "If you regenerate backup codes, you automatically invalidate old codes." : "Εάν αναδημιουργήσετε εφεδρικούς κωδικούς, οι παλιοί κωδικοί ακυρώνονται αυτόματα.", + "An error occurred while generating your backup codes" : "Ένα σφάλμα προέκυψε κατά τη δημιουργία των εφεδρικών κωδικών.", + "Nextcloud backup codes" : "Εφεδρικοί κωδικοί Nextcloud", + "Two-factor authentication" : "Έλεγχος πιστοποίησης δύο βημάτων", + "You successfully logged in using two-factor authentication (%1$s)" : "Έχετε συνδεθεί επιτυχώς με τη χρήση ελέγχου ταυτότητας δύο-παραγόντων (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "Μία προσπάθεια σύνδεσης με τη χρήση ελέγχου ταυτότητας δύο-παραγόντων απέτυχε (%1$s)", + "You created two-factor backup codes for your account" : "Μπορείτε να δημιουργήσετε τον παράγοντα διπλού ελέγχου ταυτότητας για το λογαριασμό σας ΤΟΤΡ", + "Backup code" : "Εφεδρικός κωδικός", + "Use backup code" : "Χρησιμοποιήστε έναν εφεδρικό κωδικό", + "Second-factor backup codes" : "Εφεδρικοί κωδικοί δεύτερου-παράγοντα" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/l10n/es_MX.js b/apps/twofactor_backupcodes/l10n/es_MX.js new file mode 100644 index 00000000000..8ef88c0cef3 --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/es_MX.js @@ -0,0 +1,21 @@ +OC.L10N.register( + "twofactor_backupcodes", + { + "Generate backup codes" : "Generar códigos de respaldo", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. {{used}} de {{total}} códigos han sido usados.", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Favor de resguardarlos y/o imprimirlos ya que no podrá leerlos otra vez después. ", + "Save backup codes" : "Guardar códigos de respaldo", + "Print backup codes" : "Imprimir códigos de respaldo", + "Regenerate backup codes" : "Regenerar códigos de respaldo", + "If you regenerate backup codes, you automatically invalidate old codes." : "Si usted regenera los códigos de respaldo, automáticamente invalidará los anteriores. ", + "An error occurred while generating your backup codes" : "Se presentó un error al generar sus códigos de respaldo. ", + "Nextcloud backup codes" : "Códigos de respaldo de Nextcloud", + "Two-factor authentication" : "Autenticación de dos factores", + "You successfully logged in using two-factor authentication (%1$s)" : "Usted ha iniciado sesión exitosamente usando autenticación de dos factores (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "Un intento por ingresar usando autenticación de dos factores falló (%1$s)", + "You created two-factor backup codes for your account" : "Usted ha creado códigos de respaldo de dos factores para su cuenta", + "Backup code" : "Código de respaldo", + "Use backup code" : "Use el código de respaldo", + "Second-factor backup codes" : "Códigos de respaldo del segundo factor" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/twofactor_backupcodes/l10n/es_MX.json b/apps/twofactor_backupcodes/l10n/es_MX.json new file mode 100644 index 00000000000..179b29fd060 --- /dev/null +++ b/apps/twofactor_backupcodes/l10n/es_MX.json @@ -0,0 +1,19 @@ +{ "translations": { + "Generate backup codes" : "Generar códigos de respaldo", + "Backup codes have been generated. {{used}} of {{total}} codes have been used." : "Los códigos de respaldo han sido generados. {{used}} de {{total}} códigos han sido usados.", + "These are your backup codes. Please save and/or print them as you will not be able to read the codes again later" : "Estos son sus códigos de respaldo. Favor de resguardarlos y/o imprimirlos ya que no podrá leerlos otra vez después. ", + "Save backup codes" : "Guardar códigos de respaldo", + "Print backup codes" : "Imprimir códigos de respaldo", + "Regenerate backup codes" : "Regenerar códigos de respaldo", + "If you regenerate backup codes, you automatically invalidate old codes." : "Si usted regenera los códigos de respaldo, automáticamente invalidará los anteriores. ", + "An error occurred while generating your backup codes" : "Se presentó un error al generar sus códigos de respaldo. ", + "Nextcloud backup codes" : "Códigos de respaldo de Nextcloud", + "Two-factor authentication" : "Autenticación de dos factores", + "You successfully logged in using two-factor authentication (%1$s)" : "Usted ha iniciado sesión exitosamente usando autenticación de dos factores (%1$s)", + "A login attempt using two-factor authentication failed (%1$s)" : "Un intento por ingresar usando autenticación de dos factores falló (%1$s)", + "You created two-factor backup codes for your account" : "Usted ha creado códigos de respaldo de dos factores para su cuenta", + "Backup code" : "Código de respaldo", + "Use backup code" : "Use el código de respaldo", + "Second-factor backup codes" : "Códigos de respaldo del segundo factor" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/twofactor_backupcodes/l10n/fi.js b/apps/twofactor_backupcodes/l10n/fi.js index 6bcf7f1ad82..866c6831fbe 100644 --- a/apps/twofactor_backupcodes/l10n/fi.js +++ b/apps/twofactor_backupcodes/l10n/fi.js @@ -11,7 +11,7 @@ OC.L10N.register( "An error occurred while generating your backup codes" : "Tapahtui virhe varakoodeja luotaessa", "Nextcloud backup codes" : "Nextcloud-varakoodit", "Two-factor authentication" : "Kaksivaiheinen tunnistautuminen", - "You successfully logged in using two-factor authentication (%1$s)" : "Kirjauduit onnistuneesti sisään käyttäen kaksivaiheista tunnistautumista (%1$s)", + "You successfully logged in using two-factor authentication (%1$s)" : "Kirjauduit onnistuneesti sisään kaksivaiheista tunnistautumista käyttäen (%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "Kirjautumisyritys kaksivaiheista tunnistautumista käyttäen epäonnistui (%1$s)", "You created two-factor backup codes for your account" : "Loit kaksivaiheisen tunnistautumisen varakoodit tilillesi", "Backup code" : "Varakoodi", diff --git a/apps/twofactor_backupcodes/l10n/fi.json b/apps/twofactor_backupcodes/l10n/fi.json index 6aa14e1f790..ae179cca8e3 100644 --- a/apps/twofactor_backupcodes/l10n/fi.json +++ b/apps/twofactor_backupcodes/l10n/fi.json @@ -9,7 +9,7 @@ "An error occurred while generating your backup codes" : "Tapahtui virhe varakoodeja luotaessa", "Nextcloud backup codes" : "Nextcloud-varakoodit", "Two-factor authentication" : "Kaksivaiheinen tunnistautuminen", - "You successfully logged in using two-factor authentication (%1$s)" : "Kirjauduit onnistuneesti sisään käyttäen kaksivaiheista tunnistautumista (%1$s)", + "You successfully logged in using two-factor authentication (%1$s)" : "Kirjauduit onnistuneesti sisään kaksivaiheista tunnistautumista käyttäen (%1$s)", "A login attempt using two-factor authentication failed (%1$s)" : "Kirjautumisyritys kaksivaiheista tunnistautumista käyttäen epäonnistui (%1$s)", "You created two-factor backup codes for your account" : "Loit kaksivaiheisen tunnistautumisen varakoodit tilillesi", "Backup code" : "Varakoodi", diff --git a/apps/updatenotification/l10n/es_MX.js b/apps/updatenotification/l10n/es_MX.js new file mode 100644 index 00000000000..084dd1f1655 --- /dev/null +++ b/apps/updatenotification/l10n/es_MX.js @@ -0,0 +1,25 @@ +OC.L10N.register( + "updatenotification", + { + "Update notifications" : "Actualizar notificaciones", + "Could not start updater, please try the manual update" : "No fue posible iniciar el actualizador, favor de intentar la actualización manual", + "{version} is available. Get more information on how to update." : "{version} no está disponible. Obtenga más información acerca de cómo actualizar. ", + "Channel updated" : "Canal actualizado", + "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no ha podido ser alcanzado desde %d días para verificar actualizaciones. ", + "Please check the nextcloud and server log files for errors." : "Favor de verificar los archivos de bitacoras de nextcloud y del servidor por errores. ", + "Update to %1$s is available." : "La actualización a %1$s está disponible. ", + "Update for %1$s to version %2$s is available." : "La actualización para %1$s a la versión %2$s está disponible.", + "Update for {app} to version %s is available." : "Actualización para {app} a la versión %s está disponible.", + "A new version is available: %s" : "Una nueva versión está disponible: %s", + "Open updater" : "Abrir actualizador", + "Download now" : "Descargar ahora", + "Your version is up to date." : "Su verisón está actualizada.", + "Checked on %s" : "Verificado el %s", + "Update channel:" : "Actualizar el canal:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Siempre puede actualizar a una versión más reciente / canal experimental. Sinembargo nunca podrá desactualizar la versión a un canal más estable. ", + "Notify members of the following groups about available updates:" : "Notificar a los miembros de los siguientes grupos de las actualizaciones disponibles:", + "Only notification for app updates are available." : "Sólo se tienen disponibles notificaciones de actualizaciones de la aplicación.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal de actualización seleccionado hace que las notificaciones dedicadas al servidor sean obsoletas. ", + "The selected update channel does not support updates of the server." : "El canal de actualización seleccionado no soporta actualizaciones del servidor. " +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/es_MX.json b/apps/updatenotification/l10n/es_MX.json new file mode 100644 index 00000000000..dcbfab39f99 --- /dev/null +++ b/apps/updatenotification/l10n/es_MX.json @@ -0,0 +1,23 @@ +{ "translations": { + "Update notifications" : "Actualizar notificaciones", + "Could not start updater, please try the manual update" : "No fue posible iniciar el actualizador, favor de intentar la actualización manual", + "{version} is available. Get more information on how to update." : "{version} no está disponible. Obtenga más información acerca de cómo actualizar. ", + "Channel updated" : "Canal actualizado", + "The update server could not be reached since %d days to check for new updates." : "El servidor de actualización no ha podido ser alcanzado desde %d días para verificar actualizaciones. ", + "Please check the nextcloud and server log files for errors." : "Favor de verificar los archivos de bitacoras de nextcloud y del servidor por errores. ", + "Update to %1$s is available." : "La actualización a %1$s está disponible. ", + "Update for %1$s to version %2$s is available." : "La actualización para %1$s a la versión %2$s está disponible.", + "Update for {app} to version %s is available." : "Actualización para {app} a la versión %s está disponible.", + "A new version is available: %s" : "Una nueva versión está disponible: %s", + "Open updater" : "Abrir actualizador", + "Download now" : "Descargar ahora", + "Your version is up to date." : "Su verisón está actualizada.", + "Checked on %s" : "Verificado el %s", + "Update channel:" : "Actualizar el canal:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Siempre puede actualizar a una versión más reciente / canal experimental. Sinembargo nunca podrá desactualizar la versión a un canal más estable. ", + "Notify members of the following groups about available updates:" : "Notificar a los miembros de los siguientes grupos de las actualizaciones disponibles:", + "Only notification for app updates are available." : "Sólo se tienen disponibles notificaciones de actualizaciones de la aplicación.", + "The selected update channel makes dedicated notifications for the server obsolete." : "El canal de actualización seleccionado hace que las notificaciones dedicadas al servidor sean obsoletas. ", + "The selected update channel does not support updates of the server." : "El canal de actualización seleccionado no soporta actualizaciones del servidor. " +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/updatenotification/l10n/fi.js b/apps/updatenotification/l10n/fi.js new file mode 100644 index 00000000000..6732780cae7 --- /dev/null +++ b/apps/updatenotification/l10n/fi.js @@ -0,0 +1,23 @@ +OC.L10N.register( + "updatenotification", + { + "Update notifications" : "Päivitysilmoitukset", + "Could not start updater, please try the manual update" : "Ei voitu aloittaa päivitystä, kokeile päivittämistä manuaalisesti", + "{version} is available. Get more information on how to update." : "{version} on saatavilla. Tarjolla on lisätietoja päivittämisestä.", + "Channel updated" : "Päivityskanava päivitetty", + "The update server could not be reached since %d days to check for new updates." : "Päivityspalvelinta ei ole tavoitettu %d päivään; uusia päivityksiä ei voida tarkistaa.", + "Please check the nextcloud and server log files for errors." : "Tarkista Nextcloudin ja palvelimen lokitiedostot virheiden varalta.", + "Update to %1$s is available." : "Kohteen %1$s päivitys on saatavilla.", + "Update for %1$s to version %2$s is available." : "Kohteen %1$s päivitys versioon %2$s on saatavilla.", + "Update for {app} to version %s is available." : "Sovelluksen {app} päivitys versioon %s on saatavilla.", + "A new version is available: %s" : "Uusi versio on saatavilla: %s", + "Open updater" : "Avaa päivittäjä", + "Download now" : "Lataa heti", + "Your version is up to date." : "Versiosi on ajan tasalla.", + "Checked on %s" : "Tarkistettu %s", + "Update channel:" : "Päivityskanava:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Voit aina päivittää uudempaan versioon tai kokeellisen jakelukanavan versioon. Et voi kuitenkaan palata aiempaan, vakaan julkaisukanavan versioon.", + "Notify members of the following groups about available updates:" : "Ilmoita seuraavien ryhmien jäsenille saatavilla olevista päivityksistä:", + "Only notification for app updates are available." : "Sovelluspäivityksiin on saatavilla vain huomautuksia." +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/fi.json b/apps/updatenotification/l10n/fi.json new file mode 100644 index 00000000000..1e3de0c098b --- /dev/null +++ b/apps/updatenotification/l10n/fi.json @@ -0,0 +1,21 @@ +{ "translations": { + "Update notifications" : "Päivitysilmoitukset", + "Could not start updater, please try the manual update" : "Ei voitu aloittaa päivitystä, kokeile päivittämistä manuaalisesti", + "{version} is available. Get more information on how to update." : "{version} on saatavilla. Tarjolla on lisätietoja päivittämisestä.", + "Channel updated" : "Päivityskanava päivitetty", + "The update server could not be reached since %d days to check for new updates." : "Päivityspalvelinta ei ole tavoitettu %d päivään; uusia päivityksiä ei voida tarkistaa.", + "Please check the nextcloud and server log files for errors." : "Tarkista Nextcloudin ja palvelimen lokitiedostot virheiden varalta.", + "Update to %1$s is available." : "Kohteen %1$s päivitys on saatavilla.", + "Update for %1$s to version %2$s is available." : "Kohteen %1$s päivitys versioon %2$s on saatavilla.", + "Update for {app} to version %s is available." : "Sovelluksen {app} päivitys versioon %s on saatavilla.", + "A new version is available: %s" : "Uusi versio on saatavilla: %s", + "Open updater" : "Avaa päivittäjä", + "Download now" : "Lataa heti", + "Your version is up to date." : "Versiosi on ajan tasalla.", + "Checked on %s" : "Tarkistettu %s", + "Update channel:" : "Päivityskanava:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Voit aina päivittää uudempaan versioon tai kokeellisen jakelukanavan versioon. Et voi kuitenkaan palata aiempaan, vakaan julkaisukanavan versioon.", + "Notify members of the following groups about available updates:" : "Ilmoita seuraavien ryhmien jäsenille saatavilla olevista päivityksistä:", + "Only notification for app updates are available." : "Sovelluspäivityksiin on saatavilla vain huomautuksia." +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/updatenotification/l10n/ja.js b/apps/updatenotification/l10n/ja.js index 2f55b714507..967b81ec21f 100644 --- a/apps/updatenotification/l10n/ja.js +++ b/apps/updatenotification/l10n/ja.js @@ -5,6 +5,8 @@ OC.L10N.register( "Could not start updater, please try the manual update" : "アップデータを起動できませんでした。手動アップデートをお試しください", "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Channel updated" : "チャンネルが更新されました", + "The update server could not be reached since %d days to check for new updates." : "%d日以降、新しい更新をチェックする更新サーバーにアクセスできませんでした。", + "Please check the nextcloud and server log files for errors." : "Nextcloudとサーバーログファイルでエラーがないか確認してください。", "Update to %1$s is available." : "%1$s への更新が利用可能です。", "Update for %1$s to version %2$s is available." : "%1$s に対するバージョン %2$s へアップデートが利用可能です。", "Update for {app} to version %s is available." : " {app} に対するバージョン %s へアップデートが利用可能です。", diff --git a/apps/updatenotification/l10n/ja.json b/apps/updatenotification/l10n/ja.json index 25f9244798b..8ef6d433db3 100644 --- a/apps/updatenotification/l10n/ja.json +++ b/apps/updatenotification/l10n/ja.json @@ -3,6 +3,8 @@ "Could not start updater, please try the manual update" : "アップデータを起動できませんでした。手動アップデートをお試しください", "{version} is available. Get more information on how to update." : "{version} が利用可能です。アップデート方法について詳細情報を確認してください。", "Channel updated" : "チャンネルが更新されました", + "The update server could not be reached since %d days to check for new updates." : "%d日以降、新しい更新をチェックする更新サーバーにアクセスできませんでした。", + "Please check the nextcloud and server log files for errors." : "Nextcloudとサーバーログファイルでエラーがないか確認してください。", "Update to %1$s is available." : "%1$s への更新が利用可能です。", "Update for %1$s to version %2$s is available." : "%1$s に対するバージョン %2$s へアップデートが利用可能です。", "Update for {app} to version %s is available." : " {app} に対するバージョン %s へアップデートが利用可能です。", diff --git a/apps/updatenotification/l10n/pt_BR.js b/apps/updatenotification/l10n/pt_BR.js index 116f5d92e05..efaffb633cc 100644 --- a/apps/updatenotification/l10n/pt_BR.js +++ b/apps/updatenotification/l10n/pt_BR.js @@ -5,6 +5,8 @@ OC.L10N.register( "Could not start updater, please try the manual update" : "Não foi possível iniciar o atualizador, tente a atualização manual", "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informações sobre como atualizar.", "Channel updated" : "Canal atualizado", + "The update server could not be reached since %d days to check for new updates." : "O servidor de atualização não foi alcançado já há %d dias para verificar por novas atualizações.", + "Please check the nextcloud and server log files for errors." : "Por favor verifique os logs do servidor e do Nextcloud por erros.", "Update to %1$s is available." : "Atualização para %1$s está disponível.", "Update for %1$s to version %2$s is available." : "Atualização de %1$s para versão %2$s está disponível.", "Update for {app} to version %s is available." : "Atualização do {app} para a versão %s está disponível.", diff --git a/apps/updatenotification/l10n/pt_BR.json b/apps/updatenotification/l10n/pt_BR.json index 24953399ece..5a675c0b6e3 100644 --- a/apps/updatenotification/l10n/pt_BR.json +++ b/apps/updatenotification/l10n/pt_BR.json @@ -3,6 +3,8 @@ "Could not start updater, please try the manual update" : "Não foi possível iniciar o atualizador, tente a atualização manual", "{version} is available. Get more information on how to update." : "{version} está disponível. Obtenha mais informações sobre como atualizar.", "Channel updated" : "Canal atualizado", + "The update server could not be reached since %d days to check for new updates." : "O servidor de atualização não foi alcançado já há %d dias para verificar por novas atualizações.", + "Please check the nextcloud and server log files for errors." : "Por favor verifique os logs do servidor e do Nextcloud por erros.", "Update to %1$s is available." : "Atualização para %1$s está disponível.", "Update for %1$s to version %2$s is available." : "Atualização de %1$s para versão %2$s está disponível.", "Update for {app} to version %s is available." : "Atualização do {app} para a versão %s está disponível.", diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index 9b24679831f..76905615bfa 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", "Special Attributes" : "Spezielle Eigenschaften", "Quota Field" : "Kontingent Feld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird das Standard-Kontingent des Benutzers verwendet. Andernfall trage ein LDAP/AD-Attribut ein.", "Quota Default" : "Standard Kontingent", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standard-Kontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfall trage ein LDAP/AD-Attribut ein.", "Internal Username" : "Interner Benutzername", diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index ebd8dd335e2..fedd3be08e8 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", "Special Attributes" : "Spezielle Eigenschaften", "Quota Field" : "Kontingent Feld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird das Standard-Kontingent des Benutzers verwendet. Andernfall trage ein LDAP/AD-Attribut ein.", "Quota Default" : "Standard Kontingent", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standard-Kontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfall trage ein LDAP/AD-Attribut ein.", "Internal Username" : "Interner Benutzername", diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js index 2fecec1e16f..7f5a7633727 100644 --- a/apps/user_ldap/l10n/de_DE.js +++ b/apps/user_ldap/l10n/de_DE.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", "Special Attributes" : "Spezielle Eigenschaften", "Quota Field" : "Kontingent-Feld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird das Standard-Kontingent des Benutzers verwendet. Andernfall trage ein LDAP/AD-Attribut ein.", "Quota Default" : "Standard-Kontingent", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standard-Kontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", "Internal Username" : "Interner Benutzername", diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json index 2a5182054d3..7ae3293e12a 100644 --- a/apps/user_ldap/l10n/de_DE.json +++ b/apps/user_ldap/l10n/de_DE.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)", "Special Attributes" : "Spezielle Eigenschaften", "Quota Field" : "Kontingent-Feld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird das Standard-Kontingent des Benutzers verwendet. Andernfall trage ein LDAP/AD-Attribut ein.", "Quota Default" : "Standard-Kontingent", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Standard-Kontingent ignorieren für Benutzer von LDAP, die kein Kontingent festgelegt haben.", "Email Field" : "E-Mail-Feld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "E-Mail-Adresse des Benutzers aus seinem LDAP-Attribut generieren. Für Standard-Verhalten leer lassen.", "User Home Folder Naming Rule" : "Benennungsregel für das Home-Verzeichnis des Benutzers", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ohne Eingabe wird der Benutzername (Standard) verwendet. Anderenfalls tragen Sie bitte ein LDAP/AD-Attribut ein.", "Internal Username" : "Interner Benutzername", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index bac5a78ae88..d5150aed137 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", "Quota Default" : "Cuota por defecto", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobre escribir la cuota predeterminada para usuarios LDAP que no tienen una cuota configurada en el campo Cuota.", "Email Field" : "E-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Configurar el correo electrónico del usuario desde atributo LDAP. Déjelo vacío para comportamiento predeterminado.", "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Vacío para el nombre de usuario (por defecto). En otro caso, especifique un atributo LDAP/AD.", "Internal Username" : "Nombre de usuario interno", diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index 55fc0ba08ef..dbb07c62b72 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", "Special Attributes" : "Atributos especiales", "Quota Field" : "Cuota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deje vacío para la couta predeterminada del usuario. De otra manera, específique un atributo LDAP/AD.", "Quota Default" : "Cuota por defecto", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Sobre escribir la cuota predeterminada para usuarios LDAP que no tienen una cuota configurada en el campo Cuota.", "Email Field" : "E-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Configurar el correo electrónico del usuario desde atributo LDAP. Déjelo vacío para comportamiento predeterminado.", "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Vacío para el nombre de usuario (por defecto). En otro caso, especifique un atributo LDAP/AD.", "Internal Username" : "Nombre de usuario interno", diff --git a/apps/user_ldap/l10n/es_MX.js b/apps/user_ldap/l10n/es_MX.js index 0b7eb8085b9..bfd7c61bbc8 100644 --- a/apps/user_ldap/l10n/es_MX.js +++ b/apps/user_ldap/l10n/es_MX.js @@ -1,90 +1,170 @@ OC.L10N.register( "user_ldap", { - "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.", - "Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor", - "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión puede establecerse!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló el Enlace. Por favor, compruebe la configuración del servidor y las credenciales.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuración no es válida. Por favor, busque en el log para más detalles.", - "No action specified" : "No se ha especificado la acción", - "No configuration specified" : "No se ha especificado la configuración", - "No data specified" : "No se han especificado los datos", - " Could not set configuration %s" : "No se pudo establecer la configuración %s", + "Failed to clear the mappings." : "Se presentó una falla al borrar los mapeos.", + "Failed to delete the server configuration" : "Se presentó una falla al borrar la configuración del servidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración es inválida: No se permite hacer una vinculación anónima . ", + "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión pudo ser establecida!", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló la Vinculación. Favor de verificar los ajustes del servidor y las credenciales.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuración es inválida. Favor de consultar las bitácoras para más detalles.", + "No action specified" : "No se ha especificado una acción", + "No configuration specified" : "No se ha especificado una configuración", + "No data specified" : "No se han especificado datos", + " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Action does not exist" : "La acción no existe", + "The Base DN appears to be wrong" : "El DN Base parece estar incorrecto", + "Testing configuration…" : "Probando configuracion... ", "Configuration incorrect" : "Configuración Incorrecta", "Configuration incomplete" : "Configuración incompleta", - "Configuration OK" : "Configuración OK", + "Configuration OK" : "Configuración correcta", "Select groups" : "Seleccionar grupos", - "Select object classes" : "Seleccionar la clase de objeto", + "Select object classes" : "Seleccionar las clases de objeto", + "Please check the credentials, they seem to be wrong." : "Favor de verificar sus credenciales, al parecer están equivocadas.", + "Please specify the port, it could not be auto-detected." : "No fue posible auto-detectar el puerto, favor de especificarlo.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "No fue posible auto detectar el DN Base, favor de verificar las credenciales, servidor y puerto.", + "Could not detect Base DN, please enter it manually." : "No fue posible detectar el DN Base, favor de ingresarlo manualmente.", + "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Favor de verificar. ", + "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", + " entries available within the provided Base DN" : "elementos disponibles dentro del DN Base proporcionado", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Favor de verificar la DN Base, así como los ajustes de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente desea eliminar la configuración actual del servidor?", - "Confirm Deletion" : "Confirmar eliminación", + "Confirm Deletion" : "Confirmar el borrado", + "Mappings cleared successfully!" : "¡Los mapeos se borraron exitosamente!", + "Error while clearing the mappings." : "Se presentó un error al borrar los mapeos. ", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "La vinculación anónima no está permitida. Favor de proporcionar un Usuario DN y una Contaseña.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Error de Operaciones LDAP. Las vinculaciones anónimas pueden no estar permitidas. ", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Se presentó una falla en el guardado. Favor de verificar que la base de datos esté operando. Recargue antes de continuar. ", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar la modalidad habilitará las consultas automaticas de LDAP. Dependiendo del tamaño de su LDAP esto puede tomar algun tiempo. ¿Aún desea cambiar la modalidad?", + "Mode switch" : "Cambio de modo", "Select attributes" : "Seleccionar atributos", - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], - "Could not find the desired feature" : "No se puede encontrar la función deseada.", - "Invalid Host" : "Host inválido", - "Users" : "Usuarios", - "Groups" : "Grupos", - "Test Configuration" : "Configuración de prueba", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "El usuario no fue encontrado. Favor de verficiar los atributos de inicio de sesión y su nombre de usuario. Filtrado efectivo (para copiar y pegar a la validación de línea de comandos): </br>", + "User found and settings verified." : "Usuario encontrado y ajustes verificados. ", + "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "Ajustes verficados, pero más de un usuario fue encontrado. Sólo el primero será capaz de iniciar sesión. Considere un filtro más refinado.", + "An unspecified error occurred. Please check the settings and the log." : "Se presentó un error no especificado. Favor de verificar los ajustes y la bitácroa. ", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Favor de verificar. ", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, favor de verificar el servidor, puerto y credenciales. ", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "El id %u del marcador de posición esta faltando. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", + "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", + "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: ", + "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"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "No fue posible detectar el atributo nombre a desplegar del usuario. Favor de especificarlo usted mismo en los ajustes avanzados de LDAP.", + "Could not find the desired feature" : "No fue posible encontrar la función deseada.", + "Invalid Host" : "Servidor inválido", + "Test Configuration" : "Probar configuración", "Help" : "Ayuda", - "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica que grupos LDAP tendrán acceso a %s.", + "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen con los sigueintes criterios están disponibles en %s:", + "Only these object classes:" : "Sólo estas clases de objetos:", + "Only from these groups:" : "Sólo desde estos grupos:", + "Search groups" : "Buscar grupos", + "Available groups" : "Grupos disponibles", + "Selected groups" : "Grupos seleccionados", + "Edit LDAP Query" : "Editar consulta a LDAP", + "LDAP Filter:" : "Filtro de LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", + "Verify settings and count groups" : "Verificar ajustes y contar grupos", + "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP / AD Username:" : "Nombre de usuario LDAP / AD", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Permite iniciar sesión contra el nombre de usuario LDAP / AD, que es el uid o el samaccountname y será detectado. ", + "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite iniciar sesión contra el atributo correo electrónico. Mail y mailPrimaryAddress serán permitidos.", "Other Attributes:" : "Otros atributos:", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta identificar. %%uid remplazará al nombre de usuario en el proceso de identificación. Por ejemplo: \"uid=%%uid\"", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar al intentar ingresar. %% uid remplaza al nombre de usuario al intentar ingresar. Por ejemplo: \"uid=%%uid\"", + "Test Loginname" : "Probar nombre de usuario", + "Verify settings" : "Verificar ajustes", + "1. Server" : "1. Servidor", + "%s. Server:" : "%s. Servidor:", + "Add a new and blank configuration" : "Agregar una configuración nueva y en blanco", + "Copy current configuration into new directory binding" : "Copiar la configuración actual a un nuevo directorio de vinculación", + "Delete the current configuration" : "Borrar la configuración actual", "Host" : "Servidor", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Puede omitir el protocolo, excepto si requiere SSL. En ese caso, empiece con ldaps://", "Port" : "Puerto", - "User DN" : "DN usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuario cliente con el que se hará la asociación, p.ej. uid=agente,dc=ejemplo,dc=com. Para acceso anónimo, deje DN y contraseña vacíos.", + "Detect Port" : "Detectar Puerto", + "User DN" : "DN del usuario", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del cliente del usuario con el que se vinculará, ejem. uid=agente,dc=ejemplo,dc=com. Para tener un acceso anónimo, mantenga el DN y la contraseña vacíos.", "Password" : "Contraseña", - "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje DN y contraseña vacíos.", + "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje la contraseña y DN vacíos.", "One Base DN per line" : "Un DN Base por línea", - "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.", + "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN Base para usuarios y grupos en la pestaña Avanzado", + "Detect Base DN" : "Detectar DN Base", + "Test Base DN" : "Probar el DN Base", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita solicitudes automaticas de LDAP. Es mejor para ambientes más grandes pero requiere mayor conocimiento de LDAP. ", + "Manually enter LDAP filters (recommended for large directories)" : "Ingresar los filtros LDAP manualmente (recomendado para directorios grandes)", + "Listing and searching for users is constrained by these criteria:" : "Los enlistados y las busquedas para los usuarios están acotados por estos criterios:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las clases de objetos más comunes para usuarios son organizationalPerson, person, user, and inetOrgPerson. Si no está seguro de cuál clase de objeto selecciónar, favor de consultar su directorio admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica cuáles usuarios LDAP tendrán acceso a la instancia %s.", + "Verify settings and count users" : "Verificar ajustes y contar ususarios", + "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", + "LDAP" : "LDAP", + "Server" : "Servidor", + "Users" : "Usuarios", + "Login Attributes" : "Atriburos de Inicio de Sesión", + "Groups" : "Grupos", + "Expert" : "Experto", "Advanced" : "Avanzado", - "<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>Advertencia:</b> Las apps user_ldap y user_webdavauth son incompatibles. Puede que experimente un comportamiento inesperado. Pregunte al su administrador de sistemas para desactivar uno de ellos.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> El módulo LDAP de PHP no está instalado, el sistema no funcionará. Por favor consulte al administrador del sistema para instalarlo.", - "Connection Settings" : "Configuración de conexión", - "Configuration Active" : "Configuracion activa", - "When unchecked, this configuration will be skipped." : "Cuando deseleccione, esta configuracion sera omitida.", + "<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>Advertencia:</b> Las aplicaciones user_ldap y user_webdavauth son incompatibles. Usted puede expermientar comportamientos inesperados. Favor de solicitar a su administrador del sistema deshabilitar alguno de ellos.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> El módulo LDAP de PHP no está instalado, el backend no funcionará. Favor de solicitar su instalación a su administrador del sistema.", + "Connection Settings" : "Ajustes de la conexión", + "Configuration Active" : "Configuracion Activa", + "When unchecked, this configuration will be skipped." : "Cuando no esté seleccionada, esta configuración será omitida.", "Backup (Replica) Host" : "Servidor de copia de seguridad (Replica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Dar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor principal LDAP / AD.", - "Backup (Replica) Port" : "Puerto para copias de seguridad (Replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Favor de proporcionar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor LDAP / AD principal.", + "Backup (Replica) Port" : "Puerto para copias de seguridad (Réplica)", "Disable Main Server" : "Deshabilitar servidor principal", - "Only connect to the replica server." : "Conectar sólo con el servidor de réplica.", + "Only connect to the replica server." : "Sólo contectarse al servidor de réplica.", "Turn off SSL certificate validation." : "Apagar la validación por certificado SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No se recomienda, ¡utilízalo únicamente para pruebas! Si la conexión únicamente funciona con esta opción, importa el certificado SSL del servidor LDAP en tu servidor %s.", - "Cache Time-To-Live" : "Cache TTL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "¡No se recomienda, úselo únicamente para pruebas! Si la conexión sólo funciona con esta opción, importe el certificado SSL del servidor LDAP a su servidor %s.", + "Cache Time-To-Live" : "Tiempo de vida del caché", "in seconds. A change empties the cache." : "en segundos. Un cambio vacía la caché.", - "Directory Settings" : "Configuración de directorio", - "User Display Name Field" : "Campo de nombre de usuario a mostrar", - "The LDAP attribute to use to generate the user's display name." : "El campo LDAP a usar para generar el nombre para mostrar del usuario.", - "Base User Tree" : "Árbol base de usuario", + "Directory Settings" : "Ajustes del directorio", + "User Display Name Field" : "Campo de nombre del usuario a desplegar", + "The LDAP attribute to use to generate the user's display name." : "El atributo LDAP a usar para generar el nombre del usuario a desplegar.", + "2nd User Display Name Field" : "2do Campo de Nombre a Desplegar del Usuario", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP puede ser agregado al nombre a despelegar entre corchetes. Ejemplos de resultados »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Árbol de Usuario Base", "One User Base DN per line" : "Un DN Base de Usuario por línea", - "User Search Attributes" : "Atributos de la busqueda de usuario", - "Optional; one attribute per line" : "Opcional; un atributo por linea", - "Group Display Name Field" : "Campo de nombre de grupo a mostrar", + "User Search Attributes" : "Atributos de búsqueda de usuario", + "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El campo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", "One Group Base DN per line" : "Un DN Base de Grupo por línea", - "Group Search Attributes" : "Atributos de busqueda de grupo", + "Group Search Attributes" : "Atributos de Búsqueda de Grupo", "Group-Member association" : "Asociación Grupo-Miembro", - "Special Attributes" : "Atributos especiales", - "Quota Field" : "Cuota", - "Quota Default" : "Cuota por defecto", - "in bytes" : "en bytes", - "Email Field" : "E-mail", - "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Vacío para el nombre de usuario (por defecto). En otro caso, especifique un atributo LDAP/AD.", + "Dynamic Group Member URL" : "URL de Miembro de Grupo Dinámico ", + "Nested Groups" : "Grupos Anidados", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se enciende, los grupos que contengan grupos están soportados. (Sólo funciona si el atributo de miembro de grupo contiene los DNs). ", + "Paging chunksize" : "Tamaño del chunk de paginación", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "El tamaño de chunk usado para las búsquedas con paginación de LDAP puede regresar resuldados volumniosos tales como enumeraciones de usuarios o grupos. (Establecerlo a 0 deshabilita las busquedas con paginación en estos casos). ", + "Enable LDAP password changes per user" : "Habilitar cambio de contraseñas en LDAP por el usuario", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permitir que los usuarios LDAP puedan cambiar su contraseña y permitir a los Super Administradortes y Administradores de grupo cambiar la contraseña de sus usuarios LDAP. Únicamente funciona si configuración de las poiíticas de control de acceso en el servidor LDAP está alineada. Como las contraseñas son enviadas en texto plano al servidor LDAP, se debe usar encripción en el transporte y del mismo modo se debe configurar el uso de funciones de resumen en el servidor LDAP", + "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", + "Special Attributes" : "Atributos Especiales", + "Quota Field" : "Campo de cuota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Dejar en blanco para usar la cuota predeterminada del usuario. En caso contrario, favor de especificar el atributo LDAP / AD.", + "Quota Default" : "Cuota predeterminada", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Anular la cuota predeterminada para usuarios LDAP que no tienen una cuota establecida en el Campo Cuota. ", + "Email Field" : "Campo de correo electrónico", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Dejelo vacío para el comportamiento predeterminado. ", + "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Dejar vacío para el nombre de usuario (predeterminado). En otro caso, especifique un atributo LDAP/AD.", "Internal Username" : "Nombre de usuario interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "El nombre de usuario interno será creado de forma predeterminada desde el atributo UUID. Esto asegura que el nombre de usuario es único y los caracteres no necesitan ser convertidos. En el nombre de usuario interno sólo se pueden usar estos caracteres: [ a-zA-Z0-9_.@- ]. El resto de caracteres son sustituidos por su correspondiente en ASCII o simplemente omitidos. En caso de duplicidades, se añadirá o incrementará un número. El nombre de usuario interno es usado para identificar un usuario. Es también el nombre predeterminado para la carpeta personal del usuario en ownCloud. También es parte de URLs remotas, por ejemplo, para todos los servicios *DAV. Con esta configuración el comportamiento predeterminado puede ser cambiado. Para conseguir un comportamiento similar a como era antes de ownCloud 5, introduzca el campo del nombre para mostrar del usuario en la siguiente caja. Déjelo vacío para el comportamiento predeterminado. Los cambios solo tendrán efecto en los usuarios LDAP mapeados (añadidos) recientemente.", - "Internal Username Attribute:" : "Atributo Nombre de usuario Interno:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. ", + "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Sobrescribir la detección UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID es autodetectado. Este atributo es usado para identificar indudablemente usuarios y grupos LDAP. Además, el nombre de usuario interno será creado en base al UUID, si no ha sido especificado otro comportamiento arriba. Puedes sobrescribir la configuración y pasar un atributo de tu elección. Debes asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Déjalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", - "UUID Attribute for Users:" : "Atributo UUID para usuarios:", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID se detecta automáticamente. Este atributo se usa para identificar, sin ninguna duda, a usuarios y grupos LDAP. Adicionalmente, el nombre de usuario interno se creará con base en el UUID, si no ha sido especificado otro comportamiento en la parte de arriba. Puede anular el ajuste y proporcionar el atributo que desee. Debe asegurarse de que el atributo que desee sea accesible por los usuarios y grupos y que sea único. Mantengalo vacío para el comportamiento predeterminado . Los cambios surtirán efecto sólo en los usuarios y grupos mapeados (agregados) nuevos a LDAP.", + "UUID Attribute for Users:" : "Atributo UUID para Usuarios:", "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", - "Username-LDAP User Mapping" : "Asignación del Nombre de usuario de un usuario LDAP", - "Clear Username-LDAP User Mapping" : "Borrar la asignación de los Nombres de usuario de los usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Borrar la asignación de los Nombres de grupo de los grupos de LDAP" + "Username-LDAP User Mapping" : "Mapeo del Nombre del usuario al Usuario LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuario son usados para almacenar y asignar (meta) datos. Para poder identificar y reconocer con precisión a los usuarios, cada usuario LDAP contará con un Nombre de usuario interno. Esto requiere un mapeo del Nombre de usuario al usuario LDAP. El nombre de usuario creado se mapea al UUID del usuario LDAP. Adicionalmente el DN se guarda en caché para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, las modficaciones serán encontradas. El Nombre del usuario interno se usa en todos lados. Limpiar los mapeos dejará sobras en todos lados. ¡Limpiar los mapeos no es senible a la configuración, afecta a todas las configuraciones LDAP! Nunca borre las configuraciones en el ambiente de producción, sólo hágalo en los ambientes de pruebas o de experimentación. ", + "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Nombres de usuario a los Usuarios LDAP", + "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP", + "in bytes" : "en bytes" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/es_MX.json b/apps/user_ldap/l10n/es_MX.json index d458644b137..029cbd7397e 100644 --- a/apps/user_ldap/l10n/es_MX.json +++ b/apps/user_ldap/l10n/es_MX.json @@ -1,88 +1,168 @@ { "translations": { - "Failed to clear the mappings." : "Ocurrió un fallo al borrar las asignaciones.", - "Failed to delete the server configuration" : "No se pudo borrar la configuración del servidor", - "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión puede establecerse!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló el Enlace. Por favor, compruebe la configuración del servidor y las credenciales.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuración no es válida. Por favor, busque en el log para más detalles.", - "No action specified" : "No se ha especificado la acción", - "No configuration specified" : "No se ha especificado la configuración", - "No data specified" : "No se han especificado los datos", - " Could not set configuration %s" : "No se pudo establecer la configuración %s", + "Failed to clear the mappings." : "Se presentó una falla al borrar los mapeos.", + "Failed to delete the server configuration" : "Se presentó una falla al borrar la configuración del servidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración es inválida: No se permite hacer una vinculación anónima . ", + "The configuration is valid and the connection could be established!" : "¡La configuración es válida y la conexión pudo ser establecida!", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración es válida, pero falló la Vinculación. Favor de verificar los ajustes del servidor y las credenciales.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuración es inválida. Favor de consultar las bitácoras para más detalles.", + "No action specified" : "No se ha especificado una acción", + "No configuration specified" : "No se ha especificado una configuración", + "No data specified" : "No se han especificado datos", + " Could not set configuration %s" : "No fue posible establecer la configuración %s", + "Action does not exist" : "La acción no existe", + "The Base DN appears to be wrong" : "El DN Base parece estar incorrecto", + "Testing configuration…" : "Probando configuracion... ", "Configuration incorrect" : "Configuración Incorrecta", "Configuration incomplete" : "Configuración incompleta", - "Configuration OK" : "Configuración OK", + "Configuration OK" : "Configuración correcta", "Select groups" : "Seleccionar grupos", - "Select object classes" : "Seleccionar la clase de objeto", + "Select object classes" : "Seleccionar las clases de objeto", + "Please check the credentials, they seem to be wrong." : "Favor de verificar sus credenciales, al parecer están equivocadas.", + "Please specify the port, it could not be auto-detected." : "No fue posible auto-detectar el puerto, favor de especificarlo.", + "Base DN could not be auto-detected, please revise credentials, host and port." : "No fue posible auto detectar el DN Base, favor de verificar las credenciales, servidor y puerto.", + "Could not detect Base DN, please enter it manually." : "No fue posible detectar el DN Base, favor de ingresarlo manualmente.", + "{nthServer}. Server" : "{nthServer}. Servidor", + "No object found in the given Base DN. Please revise." : "No fue posible encontrar ningún objeto en el DN Base dado. Favor de verificar. ", + "More than 1,000 directory entries available." : "Se encuentran disponibles más de 1,000 elementos de directoiros. ", + " entries available within the provided Base DN" : "elementos disponibles dentro del DN Base proporcionado", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Se presentó un error. Favor de verificar la DN Base, así como los ajustes de la conexión y las credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Realmente desea eliminar la configuración actual del servidor?", - "Confirm Deletion" : "Confirmar eliminación", + "Confirm Deletion" : "Confirmar el borrado", + "Mappings cleared successfully!" : "¡Los mapeos se borraron exitosamente!", + "Error while clearing the mappings." : "Se presentó un error al borrar los mapeos. ", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "La vinculación anónima no está permitida. Favor de proporcionar un Usuario DN y una Contaseña.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Error de Operaciones LDAP. Las vinculaciones anónimas pueden no estar permitidas. ", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Se presentó una falla en el guardado. Favor de verificar que la base de datos esté operando. Recargue antes de continuar. ", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar la modalidad habilitará las consultas automaticas de LDAP. Dependiendo del tamaño de su LDAP esto puede tomar algun tiempo. ¿Aún desea cambiar la modalidad?", + "Mode switch" : "Cambio de modo", "Select attributes" : "Seleccionar atributos", - "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], - "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], - "Could not find the desired feature" : "No se puede encontrar la función deseada.", - "Invalid Host" : "Host inválido", - "Users" : "Usuarios", - "Groups" : "Grupos", - "Test Configuration" : "Configuración de prueba", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "El usuario no fue encontrado. Favor de verficiar los atributos de inicio de sesión y su nombre de usuario. Filtrado efectivo (para copiar y pegar a la validación de línea de comandos): </br>", + "User found and settings verified." : "Usuario encontrado y ajustes verificados. ", + "Settings verified, but more than one user found. Only the first will be able to login. Consider a more narrow filter." : "Ajustes verficados, pero más de un usuario fue encontrado. Sólo el primero será capaz de iniciar sesión. Considere un filtro más refinado.", + "An unspecified error occurred. Please check the settings and the log." : "Se presentó un error no especificado. Favor de verificar los ajustes y la bitácroa. ", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtro de la búsqueda es inválido, posiblemente debido a temas de sintaxis como un número diferente de corchetes abiertos y cerrados. Favor de verificar. ", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Se presentó una falla con la conexión al servidor LDAP / AD, favor de verificar el servidor, puerto y credenciales. ", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "El id %u del marcador de posición esta faltando. Será reemplazado con el nombre de usuario al consultar LDAP / AD.", + "Please provide a login name to test against" : "Favor de proporcionar un nombre de usuario contra el cual probar", + "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: ", + "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"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "No fue posible detectar el atributo nombre a desplegar del usuario. Favor de especificarlo usted mismo en los ajustes avanzados de LDAP.", + "Could not find the desired feature" : "No fue posible encontrar la función deseada.", + "Invalid Host" : "Servidor inválido", + "Test Configuration" : "Probar configuración", "Help" : "Ayuda", - "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica que grupos LDAP tendrán acceso a %s.", + "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen con los sigueintes criterios están disponibles en %s:", + "Only these object classes:" : "Sólo estas clases de objetos:", + "Only from these groups:" : "Sólo desde estos grupos:", + "Search groups" : "Buscar grupos", + "Available groups" : "Grupos disponibles", + "Selected groups" : "Grupos seleccionados", + "Edit LDAP Query" : "Editar consulta a LDAP", + "LDAP Filter:" : "Filtro de LDAP:", + "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtro especifica cuales grupos LDAP tendrán acceso a la instancia %s.", + "Verify settings and count groups" : "Verificar ajustes y contar grupos", + "When logging in, %s will find the user based on the following attributes:" : "Al iniciar sesion, %s encontrará al usuario con base en los siguientes atributos:", + "LDAP / AD Username:" : "Nombre de usuario LDAP / AD", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Permite iniciar sesión contra el nombre de usuario LDAP / AD, que es el uid o el samaccountname y será detectado. ", + "LDAP / AD Email Address:" : "Dirección de correo electrónico LDAP / AD", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Permite iniciar sesión contra el atributo correo electrónico. Mail y mailPrimaryAddress serán permitidos.", "Other Attributes:" : "Otros atributos:", - "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar cuando se intenta identificar. %%uid remplazará al nombre de usuario en el proceso de identificación. Por ejemplo: \"uid=%%uid\"", + "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define el filtro a aplicar al intentar ingresar. %% uid remplaza al nombre de usuario al intentar ingresar. Por ejemplo: \"uid=%%uid\"", + "Test Loginname" : "Probar nombre de usuario", + "Verify settings" : "Verificar ajustes", + "1. Server" : "1. Servidor", + "%s. Server:" : "%s. Servidor:", + "Add a new and blank configuration" : "Agregar una configuración nueva y en blanco", + "Copy current configuration into new directory binding" : "Copiar la configuración actual a un nuevo directorio de vinculación", + "Delete the current configuration" : "Borrar la configuración actual", "Host" : "Servidor", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Puede omitir el protocolo, excepto si requiere SSL. En ese caso, empiece con ldaps://", "Port" : "Puerto", - "User DN" : "DN usuario", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuario cliente con el que se hará la asociación, p.ej. uid=agente,dc=ejemplo,dc=com. Para acceso anónimo, deje DN y contraseña vacíos.", + "Detect Port" : "Detectar Puerto", + "User DN" : "DN del usuario", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del cliente del usuario con el que se vinculará, ejem. uid=agente,dc=ejemplo,dc=com. Para tener un acceso anónimo, mantenga el DN y la contraseña vacíos.", "Password" : "Contraseña", - "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje DN y contraseña vacíos.", + "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje la contraseña y DN vacíos.", "One Base DN per line" : "Un DN Base por línea", - "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado", - "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.", + "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN Base para usuarios y grupos en la pestaña Avanzado", + "Detect Base DN" : "Detectar DN Base", + "Test Base DN" : "Probar el DN Base", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita solicitudes automaticas de LDAP. Es mejor para ambientes más grandes pero requiere mayor conocimiento de LDAP. ", + "Manually enter LDAP filters (recommended for large directories)" : "Ingresar los filtros LDAP manualmente (recomendado para directorios grandes)", + "Listing and searching for users is constrained by these criteria:" : "Los enlistados y las busquedas para los usuarios están acotados por estos criterios:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Las clases de objetos más comunes para usuarios son organizationalPerson, person, user, and inetOrgPerson. Si no está seguro de cuál clase de objeto selecciónar, favor de consultar su directorio admin.", + "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica cuáles usuarios LDAP tendrán acceso a la instancia %s.", + "Verify settings and count users" : "Verificar ajustes y contar ususarios", + "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", + "LDAP" : "LDAP", + "Server" : "Servidor", + "Users" : "Usuarios", + "Login Attributes" : "Atriburos de Inicio de Sesión", + "Groups" : "Grupos", + "Expert" : "Experto", "Advanced" : "Avanzado", - "<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>Advertencia:</b> Las apps user_ldap y user_webdavauth son incompatibles. Puede que experimente un comportamiento inesperado. Pregunte al su administrador de sistemas para desactivar uno de ellos.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> El módulo LDAP de PHP no está instalado, el sistema no funcionará. Por favor consulte al administrador del sistema para instalarlo.", - "Connection Settings" : "Configuración de conexión", - "Configuration Active" : "Configuracion activa", - "When unchecked, this configuration will be skipped." : "Cuando deseleccione, esta configuracion sera omitida.", + "<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>Advertencia:</b> Las aplicaciones user_ldap y user_webdavauth son incompatibles. Usted puede expermientar comportamientos inesperados. Favor de solicitar a su administrador del sistema deshabilitar alguno de ellos.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Advertencia:</b> El módulo LDAP de PHP no está instalado, el backend no funcionará. Favor de solicitar su instalación a su administrador del sistema.", + "Connection Settings" : "Ajustes de la conexión", + "Configuration Active" : "Configuracion Activa", + "When unchecked, this configuration will be skipped." : "Cuando no esté seleccionada, esta configuración será omitida.", "Backup (Replica) Host" : "Servidor de copia de seguridad (Replica)", - "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Dar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor principal LDAP / AD.", - "Backup (Replica) Port" : "Puerto para copias de seguridad (Replica)", + "Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Favor de proporcionar un servidor de copia de seguridad opcional. Debe ser una réplica del servidor LDAP / AD principal.", + "Backup (Replica) Port" : "Puerto para copias de seguridad (Réplica)", "Disable Main Server" : "Deshabilitar servidor principal", - "Only connect to the replica server." : "Conectar sólo con el servidor de réplica.", + "Only connect to the replica server." : "Sólo contectarse al servidor de réplica.", "Turn off SSL certificate validation." : "Apagar la validación por certificado SSL.", - "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "No se recomienda, ¡utilízalo únicamente para pruebas! Si la conexión únicamente funciona con esta opción, importa el certificado SSL del servidor LDAP en tu servidor %s.", - "Cache Time-To-Live" : "Cache TTL", + "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "¡No se recomienda, úselo únicamente para pruebas! Si la conexión sólo funciona con esta opción, importe el certificado SSL del servidor LDAP a su servidor %s.", + "Cache Time-To-Live" : "Tiempo de vida del caché", "in seconds. A change empties the cache." : "en segundos. Un cambio vacía la caché.", - "Directory Settings" : "Configuración de directorio", - "User Display Name Field" : "Campo de nombre de usuario a mostrar", - "The LDAP attribute to use to generate the user's display name." : "El campo LDAP a usar para generar el nombre para mostrar del usuario.", - "Base User Tree" : "Árbol base de usuario", + "Directory Settings" : "Ajustes del directorio", + "User Display Name Field" : "Campo de nombre del usuario a desplegar", + "The LDAP attribute to use to generate the user's display name." : "El atributo LDAP a usar para generar el nombre del usuario a desplegar.", + "2nd User Display Name Field" : "2do Campo de Nombre a Desplegar del Usuario", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP puede ser agregado al nombre a despelegar entre corchetes. Ejemplos de resultados »John Doe (john.doe@example.org)«.", + "Base User Tree" : "Árbol de Usuario Base", "One User Base DN per line" : "Un DN Base de Usuario por línea", - "User Search Attributes" : "Atributos de la busqueda de usuario", - "Optional; one attribute per line" : "Opcional; un atributo por linea", - "Group Display Name Field" : "Campo de nombre de grupo a mostrar", + "User Search Attributes" : "Atributos de búsqueda de usuario", + "Optional; one attribute per line" : "Opcional; un atributo por línea", + "Group Display Name Field" : "Campo de Nombre de Grupo a Desplegar", "The LDAP attribute to use to generate the groups's display name." : "El campo LDAP a usar para generar el nombre para mostrar del grupo.", "Base Group Tree" : "Árbol base de grupo", "One Group Base DN per line" : "Un DN Base de Grupo por línea", - "Group Search Attributes" : "Atributos de busqueda de grupo", + "Group Search Attributes" : "Atributos de Búsqueda de Grupo", "Group-Member association" : "Asociación Grupo-Miembro", - "Special Attributes" : "Atributos especiales", - "Quota Field" : "Cuota", - "Quota Default" : "Cuota por defecto", - "in bytes" : "en bytes", - "Email Field" : "E-mail", - "User Home Folder Naming Rule" : "Regla para la carpeta Home de usuario", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Vacío para el nombre de usuario (por defecto). En otro caso, especifique un atributo LDAP/AD.", + "Dynamic Group Member URL" : "URL de Miembro de Grupo Dinámico ", + "Nested Groups" : "Grupos Anidados", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se enciende, los grupos que contengan grupos están soportados. (Sólo funciona si el atributo de miembro de grupo contiene los DNs). ", + "Paging chunksize" : "Tamaño del chunk de paginación", + "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "El tamaño de chunk usado para las búsquedas con paginación de LDAP puede regresar resuldados volumniosos tales como enumeraciones de usuarios o grupos. (Establecerlo a 0 deshabilita las busquedas con paginación en estos casos). ", + "Enable LDAP password changes per user" : "Habilitar cambio de contraseñas en LDAP por el usuario", + "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Permitir que los usuarios LDAP puedan cambiar su contraseña y permitir a los Super Administradortes y Administradores de grupo cambiar la contraseña de sus usuarios LDAP. Únicamente funciona si configuración de las poiíticas de control de acceso en el servidor LDAP está alineada. Como las contraseñas son enviadas en texto plano al servidor LDAP, se debe usar encripción en el transporte y del mismo modo se debe configurar el uso de funciones de resumen en el servidor LDAP", + "(New password is sent as plain text to LDAP)" : "(La nueva contraseña se envía como texto plano a LDAP)", + "Special Attributes" : "Atributos Especiales", + "Quota Field" : "Campo de cuota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Dejar en blanco para usar la cuota predeterminada del usuario. En caso contrario, favor de especificar el atributo LDAP / AD.", + "Quota Default" : "Cuota predeterminada", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Anular la cuota predeterminada para usuarios LDAP que no tienen una cuota establecida en el Campo Cuota. ", + "Email Field" : "Campo de correo electrónico", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Establecer el correo electrónico del usuario con base en el atributo LDAP. Dejelo vacío para el comportamiento predeterminado. ", + "User Home Folder Naming Rule" : "Regla de Nomenclatura para la Carpeta Inicio del Usuario", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Dejar vacío para el nombre de usuario (predeterminado). En otro caso, especifique un atributo LDAP/AD.", "Internal Username" : "Nombre de usuario interno", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "El nombre de usuario interno será creado de forma predeterminada desde el atributo UUID. Esto asegura que el nombre de usuario es único y los caracteres no necesitan ser convertidos. En el nombre de usuario interno sólo se pueden usar estos caracteres: [ a-zA-Z0-9_.@- ]. El resto de caracteres son sustituidos por su correspondiente en ASCII o simplemente omitidos. En caso de duplicidades, se añadirá o incrementará un número. El nombre de usuario interno es usado para identificar un usuario. Es también el nombre predeterminado para la carpeta personal del usuario en ownCloud. También es parte de URLs remotas, por ejemplo, para todos los servicios *DAV. Con esta configuración el comportamiento predeterminado puede ser cambiado. Para conseguir un comportamiento similar a como era antes de ownCloud 5, introduzca el campo del nombre para mostrar del usuario en la siguiente caja. Déjelo vacío para el comportamiento predeterminado. Los cambios solo tendrán efecto en los usuarios LDAP mapeados (añadidos) recientemente.", - "Internal Username Attribute:" : "Atributo Nombre de usuario Interno:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Por defecto, el nombre de usuario interno se creará con base en el atributo UUID. Esto asegura que el nombre de usuario sea único y que los caracteres no tengan que ser convertidos. El nombre de usuario intenro tiene la restricción de que sólo los siguienes caracteres están permitidos: [ a-zA-Z0-9_.@- ]. El resto de los caracteres son reemplazados con su correspondencia ASCII o simplemente se omiten. En caso de colisiones, se agregará/ incrementará un numero. El nombre de usuario interno se usa para identificar a un usuario internamente. Adicionalmente es el nombre predeterminado para la carpeta de inicio. También es parte de las URLs remotas, por ejemplo, para todos los servicios *DAV. Con este ajuste se puede anular el comportamiento predeterminado. Mantengalo vacío para mantener el comportamiento predeterminado. Los cambios surtiran efecto sólo en los usuarios mapeados (agregados) nuevos a LDAP. ", + "Internal Username Attribute:" : "Atributo de nombre de usuario Interno:", "Override UUID detection" : "Sobrescribir la detección UUID", - "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID es autodetectado. Este atributo es usado para identificar indudablemente usuarios y grupos LDAP. Además, el nombre de usuario interno será creado en base al UUID, si no ha sido especificado otro comportamiento arriba. Puedes sobrescribir la configuración y pasar un atributo de tu elección. Debes asegurarte de que el atributo de tu elección sea accesible por los usuarios y grupos y ser único. Déjalo en blanco para usar el comportamiento por defecto. Los cambios tendrán efecto solo en los usuarios y grupos de LDAP mapeados (añadidos) recientemente.", - "UUID Attribute for Users:" : "Atributo UUID para usuarios:", + "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Por defecto, el atributo UUID se detecta automáticamente. Este atributo se usa para identificar, sin ninguna duda, a usuarios y grupos LDAP. Adicionalmente, el nombre de usuario interno se creará con base en el UUID, si no ha sido especificado otro comportamiento en la parte de arriba. Puede anular el ajuste y proporcionar el atributo que desee. Debe asegurarse de que el atributo que desee sea accesible por los usuarios y grupos y que sea único. Mantengalo vacío para el comportamiento predeterminado . Los cambios surtirán efecto sólo en los usuarios y grupos mapeados (agregados) nuevos a LDAP.", + "UUID Attribute for Users:" : "Atributo UUID para Usuarios:", "UUID Attribute for Groups:" : "Atributo UUID para Grupos:", - "Username-LDAP User Mapping" : "Asignación del Nombre de usuario de un usuario LDAP", - "Clear Username-LDAP User Mapping" : "Borrar la asignación de los Nombres de usuario de los usuarios LDAP", - "Clear Groupname-LDAP Group Mapping" : "Borrar la asignación de los Nombres de grupo de los grupos de LDAP" + "Username-LDAP User Mapping" : "Mapeo del Nombre del usuario al Usuario LDAP", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have an internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "Los nombres de usuario son usados para almacenar y asignar (meta) datos. Para poder identificar y reconocer con precisión a los usuarios, cada usuario LDAP contará con un Nombre de usuario interno. Esto requiere un mapeo del Nombre de usuario al usuario LDAP. El nombre de usuario creado se mapea al UUID del usuario LDAP. Adicionalmente el DN se guarda en caché para reducir las interacciones con LDAP, pero no se usa para identificación. Si el DN cambia, las modficaciones serán encontradas. El Nombre del usuario interno se usa en todos lados. Limpiar los mapeos dejará sobras en todos lados. ¡Limpiar los mapeos no es senible a la configuración, afecta a todas las configuraciones LDAP! Nunca borre las configuraciones en el ambiente de producción, sólo hágalo en los ambientes de pruebas o de experimentación. ", + "Clear Username-LDAP User Mapping" : "Borrar el mapeo de los Nombres de usuario a los Usuarios LDAP", + "Clear Groupname-LDAP Group Mapping" : "Borrar el mapeo de los Nombres de grupo a los grupos de LDAP", + "in bytes" : "en bytes" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js index ca4599bb746..a6b99481bac 100644 --- a/apps/user_ldap/l10n/fr.js +++ b/apps/user_ldap/l10n/fr.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Le nouveau mot de passe a été envoyé en tant que texte brut par LDAP)", "Special Attributes" : "Attributs spéciaux", "Quota Field" : "Champ du quota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laissez vide pour appliquer le quota par défaut de l'utilisateur. Sinon, spécifiez un attribut LDAP / AD.", "Quota Default" : "Quota par défaut", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Remplacez le quota par défaut des utilisateurs LDAP qui ne disposent pas d'un quota dans le champ Quota.", "Email Field" : "Champ Email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Définissez le courrier électronique de l'utilisateur à partir de leur attribut LDAP. Laissez le champ vide pour appliquer le comportement par défaut.", "User Home Folder Naming Rule" : "Règle de nommage du répertoire utilisateur", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide pour user name (défaut). Vous pouvez aussi spécifier un attribut LDAP / AD.", "Internal Username" : "Nom d'utilisateur interne", diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json index 686e2cb2f10..76bd8597b50 100644 --- a/apps/user_ldap/l10n/fr.json +++ b/apps/user_ldap/l10n/fr.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Le nouveau mot de passe a été envoyé en tant que texte brut par LDAP)", "Special Attributes" : "Attributs spéciaux", "Quota Field" : "Champ du quota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laissez vide pour appliquer le quota par défaut de l'utilisateur. Sinon, spécifiez un attribut LDAP / AD.", "Quota Default" : "Quota par défaut", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Remplacez le quota par défaut des utilisateurs LDAP qui ne disposent pas d'un quota dans le champ Quota.", "Email Field" : "Champ Email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Définissez le courrier électronique de l'utilisateur à partir de leur attribut LDAP. Laissez le champ vide pour appliquer le comportement par défaut.", "User Home Folder Naming Rule" : "Règle de nommage du répertoire utilisateur", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide pour user name (défaut). Vous pouvez aussi spécifier un attribut LDAP / AD.", "Internal Username" : "Nom d'utilisateur interne", diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js index bc75a76dec7..92a5e7b0d9a 100644 --- a/apps/user_ldap/l10n/ja.js +++ b/apps/user_ldap/l10n/ja.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(新しいパスワードは平文テキストで LDAP に送信されます)", "Special Attributes" : "特殊属性", "Quota Field" : "クォータ属性", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "ユーザーのデフォルトのクォータを空のままにしてください。 もしくは、LDAP/ADの属性を指定してください。", "Quota Default" : "クォータのデフォルト", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "クォータフィールドでクォータが設定されていないLDAPユーザのデフォルトクォータを上書きします。", "Email Field" : "メール属性", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "LDAP属性からユーザーのメールを設定します。 デフォルト動作では空のままにします。", "User Home Folder Naming Rule" : "ユーザーのホームフォルダー命名規則", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "ユーザー名を空のままにしてください(デフォルト)。もしくは、LDAPもしくはADの属性を指定してください。", "Internal Username" : "内部ユーザー名", diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json index 2110a0d1738..196e90be766 100644 --- a/apps/user_ldap/l10n/ja.json +++ b/apps/user_ldap/l10n/ja.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(新しいパスワードは平文テキストで LDAP に送信されます)", "Special Attributes" : "特殊属性", "Quota Field" : "クォータ属性", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "ユーザーのデフォルトのクォータを空のままにしてください。 もしくは、LDAP/ADの属性を指定してください。", "Quota Default" : "クォータのデフォルト", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "クォータフィールドでクォータが設定されていないLDAPユーザのデフォルトクォータを上書きします。", "Email Field" : "メール属性", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "LDAP属性からユーザーのメールを設定します。 デフォルト動作では空のままにします。", "User Home Folder Naming Rule" : "ユーザーのホームフォルダー命名規則", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "ユーザー名を空のままにしてください(デフォルト)。もしくは、LDAPもしくはADの属性を指定してください。", "Internal Username" : "内部ユーザー名", diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js index 46ab2130235..609103adf21 100644 --- a/apps/user_ldap/l10n/nl.js +++ b/apps/user_ldap/l10n/nl.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Nieuw wachtwoord is als leesbare tekst verstuurd naar LDAP)", "Special Attributes" : "Speciale attributen", "Quota Field" : "Quota veld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor het standaard gebruikersquotum. Of specificeer een LDAP/AD attribuut.", "Quota Default" : "Quota standaard", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Overschrijf de standaardquota voor LDAP gebruikers waarvoor geen qutum hoeft de worden ingevuld in het Quotum veld.", "Email Field" : "E-mailveld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Stel het e-mailadres van de gebruiker op het LDAP attribuut. Vul niets in voor de standaardwijze.", "User Home Folder Naming Rule" : "Gebruikers Home map naamgevingsregel", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor de gebruikersnaam (standaard). Of specificeer een LDAP/AD attribuut.", "Internal Username" : "Interne gebruikersnaam", diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json index 54d7929fab0..8548d0713cb 100644 --- a/apps/user_ldap/l10n/nl.json +++ b/apps/user_ldap/l10n/nl.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Nieuw wachtwoord is als leesbare tekst verstuurd naar LDAP)", "Special Attributes" : "Speciale attributen", "Quota Field" : "Quota veld", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor het standaard gebruikersquotum. Of specificeer een LDAP/AD attribuut.", "Quota Default" : "Quota standaard", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Overschrijf de standaardquota voor LDAP gebruikers waarvoor geen qutum hoeft de worden ingevuld in het Quotum veld.", "Email Field" : "E-mailveld", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Stel het e-mailadres van de gebruiker op het LDAP attribuut. Vul niets in voor de standaardwijze.", "User Home Folder Naming Rule" : "Gebruikers Home map naamgevingsregel", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laat leeg voor de gebruikersnaam (standaard). Of specificeer een LDAP/AD attribuut.", "Internal Username" : "Interne gebruikersnaam", diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js index 45a4df5bed5..e3405374c48 100644 --- a/apps/user_ldap/l10n/pl.js +++ b/apps/user_ldap/l10n/pl.js @@ -147,9 +147,12 @@ OC.L10N.register( "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Pozwól użytkownikom LDAP-a na zmianę swoich haseł i pozwól Super Administratorom i Grupom Administratorów na zmianę haseł swoim użytkownikom LDAP-a. Działa tylko wtedy, kiedy polisy kontroli dostępu są prawidłowo skonfigurowane na serwerze LDAP. Jako że do serwera LDAP hasła są wysyłane czystym tekstem, na serwerze LDAP należy skonfigurować protokoł szyfrowania oraz haszowanie haseł.", "(New password is sent as plain text to LDAP)" : "(Nowe hasło jest wysyłane do LDAP-a czystym tekstem)", "Special Attributes" : "Specjalne atrybuty", - "Quota Field" : "Pole przydziału", - "Quota Default" : "Przydział domyślny", - "Email Field" : "Pole email", + "Quota Field" : "Pole limitu przestrzeni", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Zostaw puste dla domyślnego limitu przestrzeni dla użytkowników lub określ atrybut LDAP/AD.", + "Quota Default" : "Domyślny limit przestrzeni", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nadpisz domyślny limit przestrzeni dla użytkowników LDAP-a, którzy nie mają go ustawionego w \"Polu limitu prestrzeni\".", + "Email Field" : "Pole e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Ustaw adres e-mail użytkowników z ich atrybutu LDAP. Zostaw puste dla domyślnego zachowania.", "User Home Folder Naming Rule" : "Reguły nazewnictwa folderu domowego użytkownika", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Pozostaw puste dla user name (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.", "Internal Username" : "Wewnętrzna nazwa użytkownika", diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json index d084ae79d0b..d9c5dab01b9 100644 --- a/apps/user_ldap/l10n/pl.json +++ b/apps/user_ldap/l10n/pl.json @@ -145,9 +145,12 @@ "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "Pozwól użytkownikom LDAP-a na zmianę swoich haseł i pozwól Super Administratorom i Grupom Administratorów na zmianę haseł swoim użytkownikom LDAP-a. Działa tylko wtedy, kiedy polisy kontroli dostępu są prawidłowo skonfigurowane na serwerze LDAP. Jako że do serwera LDAP hasła są wysyłane czystym tekstem, na serwerze LDAP należy skonfigurować protokoł szyfrowania oraz haszowanie haseł.", "(New password is sent as plain text to LDAP)" : "(Nowe hasło jest wysyłane do LDAP-a czystym tekstem)", "Special Attributes" : "Specjalne atrybuty", - "Quota Field" : "Pole przydziału", - "Quota Default" : "Przydział domyślny", - "Email Field" : "Pole email", + "Quota Field" : "Pole limitu przestrzeni", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Zostaw puste dla domyślnego limitu przestrzeni dla użytkowników lub określ atrybut LDAP/AD.", + "Quota Default" : "Domyślny limit przestrzeni", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Nadpisz domyślny limit przestrzeni dla użytkowników LDAP-a, którzy nie mają go ustawionego w \"Polu limitu prestrzeni\".", + "Email Field" : "Pole e-mail", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Ustaw adres e-mail użytkowników z ich atrybutu LDAP. Zostaw puste dla domyślnego zachowania.", "User Home Folder Naming Rule" : "Reguły nazewnictwa folderu domowego użytkownika", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Pozostaw puste dla user name (domyślnie). W przeciwnym razie podaj atrybut LDAP/AD.", "Internal Username" : "Wewnętrzna nazwa użytkownika", diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 7396a1c7495..b6b18a302d8 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Nova senha é enviada como texto puro para LDAP)", "Special Attributes" : "Atributos Especiais", "Quota Field" : "Campo de Cota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Quota.", "Email Field" : "Campo de Email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra para Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index e567d6fbdd5..ea819064b37 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Nova senha é enviada como texto puro para LDAP)", "Special Attributes" : "Atributos Especiais", "Quota Field" : "Campo de Cota", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para a cota padrão do usuário. Caso contrário, especifique um atributo LDAP/AD", "Quota Default" : "Cota Padrão", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Substituir a cota padrão para usuários LDAP que não têm um conjunto de cotas no Campo Quota.", "Email Field" : "Campo de Email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Defina o email do usuário de seu atributo LDAP. Deixe vazio para o comportamento padrão.", "User Home Folder Naming Rule" : "Regra para Nome da Pasta Pessoal do Usuário", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Deixe vazio para nome de usuário (padrão). Caso contrário, especifique um atributo LDAP/AD.", "Internal Username" : "Nome de usuário interno", diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js index 3b47288f834..9d295a1d0b1 100644 --- a/apps/user_ldap/l10n/ru.js +++ b/apps/user_ldap/l10n/ru.js @@ -148,8 +148,11 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Новый пароль отправлен в LDAP простым текстом)", "Special Attributes" : "Специальные атрибуты", "Quota Field" : "Поле квоты", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования квоты по умолчанию. Иначе укажите атрибут LDAP/AD.", "Quota Default" : "Квота по умолчанию", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Переопределить стандартную квоту для пользователей LDAP, у которых не указано значение в поле «Квота».", "Email Field" : "Поле адреса email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Устанавливать адрес email пользователя из атрибута LDAP. Оставьте поле пустым для поведения по умолчанию.", "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию). Иначе укажите атрибут LDAP/AD.", "Internal Username" : "Внутреннее имя пользователя", diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json index 956b983a1b3..b0352ba3d67 100644 --- a/apps/user_ldap/l10n/ru.json +++ b/apps/user_ldap/l10n/ru.json @@ -146,8 +146,11 @@ "(New password is sent as plain text to LDAP)" : "(Новый пароль отправлен в LDAP простым текстом)", "Special Attributes" : "Специальные атрибуты", "Quota Field" : "Поле квоты", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования квоты по умолчанию. Иначе укажите атрибут LDAP/AD.", "Quota Default" : "Квота по умолчанию", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Переопределить стандартную квоту для пользователей LDAP, у которых не указано значение в поле «Квота».", "Email Field" : "Поле адреса email", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Устанавливать адрес email пользователя из атрибута LDAP. Оставьте поле пустым для поведения по умолчанию.", "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию). Иначе укажите атрибут LDAP/AD.", "Internal Username" : "Внутреннее имя пользователя", diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 07c4fa0838e..25ca5dd3fa0 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -109,7 +109,7 @@ OC.L10N.register( "Expert" : "Uzman", "Advanced" : "Gelişmiş", "<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>Uyarı:</b> user_ldap ve user_webdavauth uygulamaları uyumlu değil. Beklenmedik bir davranışla karşılaşabilirsiniz. Lütfen ikisinden birini devre dışı bırakmak için sistem yöneticinizle görüşün.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulu değil, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.", "Connection Settings" : "Bağlantı Ayarları", "Configuration Active" : "Yapılandırma Etkin", "When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.", @@ -148,10 +148,13 @@ OC.L10N.register( "(New password is sent as plain text to LDAP)" : "(Yeni parola LDAP üzerine düz metin olarak gönderildi)", "Special Attributes" : "Özel Öznitelikler", "Quota Field" : "Kota Alanı", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Kullanıcının varsayılan kotasının kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "Quota Default" : "Varsayılan Kota", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Kota Alanına bir kota değeri yazılmamış olan LDAP kullanıcıları için kullanılacak varsayılan kota değerini yazın.", "Email Field" : "E-posta Alanı", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Kullanıcı varsayılan e-posta adresinin kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan). Ya da bir LDAP/AD özniteliği belirtin.", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.", "Internal Username" : "İç Kullanıcı Adı", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler.", "Internal Username Attribute:" : "İç Kullanıcı Adı Özniteliği:", diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index 864cb0ed8a2..0e7cc764814 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -107,7 +107,7 @@ "Expert" : "Uzman", "Advanced" : "Gelişmiş", "<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>Uyarı:</b> user_ldap ve user_webdavauth uygulamaları uyumlu değil. Beklenmedik bir davranışla karşılaşabilirsiniz. Lütfen ikisinden birini devre dışı bırakmak için sistem yöneticinizle görüşün.", - "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulu değil, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.", + "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.", "Connection Settings" : "Bağlantı Ayarları", "Configuration Active" : "Yapılandırma Etkin", "When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.", @@ -146,10 +146,13 @@ "(New password is sent as plain text to LDAP)" : "(Yeni parola LDAP üzerine düz metin olarak gönderildi)", "Special Attributes" : "Özel Öznitelikler", "Quota Field" : "Kota Alanı", + "Leave empty for user's default quota. Otherwise, specify an LDAP/AD attribute." : "Kullanıcının varsayılan kotasının kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "Quota Default" : "Varsayılan Kota", + "Override default quota for LDAP users who do not have a quota set in the Quota Field." : "Kota Alanına bir kota değeri yazılmamış olan LDAP kullanıcıları için kullanılacak varsayılan kota değerini yazın.", "Email Field" : "E-posta Alanı", + "Set the user's email from their LDAP attribute. Leave it empty for default behaviour." : "Kullanıcı varsayılan e-posta adresinin kullanılması için boş bırakın ya da bir LDAP/AD özniteliği belirtin.", "User Home Folder Naming Rule" : "Kullanıcı Ana Klasörünü Adlandırma Kuralı", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan). Ya da bir LDAP/AD özniteliği belirtin.", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Kullanıcı adının kullanılması için boş bırakın (varsayılan) ya da bir LDAP/AD özniteliği belirtin.", "Internal Username" : "İç Kullanıcı Adı", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Varsayılan olarak, iç kullanıcı adı UUID özniteliğinden oluşturulur. Böylece kullanıcı adının eşsiz olması ve dönüştürülmesi gereken karakterler içermediğinden emin olunur. İç kullanıcı adında kısıtlaması yalnız şu karakterleri kullanılabilir: [ a-zA-Z0-9_.@- ]. Diğer karakterler ASCII karşılıklarına dönüştürülür ya da yok sayılır. Çakışmalarda ada bir sayı eklenir. İç kullanıcı adı bir kullanıcıyı içsel olarak belirlemeye yarar. Aynı zamanda kullanıcı ana klasörünün varsayılan adı olarak da kullanılır. İnternet adreslerinin, örneğin *DAV servislerinin bir parçasıdır. Bu seçenek ile varsayılan davranış değiştirilebilir. Varsayılan davranışı kullanmak için boş bırakın. Değişiklikler yalnız yeni eşleştirilecek (eklenecek) LDAP kullanıcılarını etkiler.", "Internal Username Attribute:" : "İç Kullanıcı Adı Özniteliği:", diff --git a/apps/user_ldap/lib/User/User.php b/apps/user_ldap/lib/User/User.php index e29b10616ca..5d4af1fd09c 100644 --- a/apps/user_ldap/lib/User/User.php +++ b/apps/user_ldap/lib/User/User.php @@ -169,6 +169,10 @@ class User { $attr = strtolower($this->connection->ldapQuotaAttribute); if(isset($ldapEntry[$attr])) { $this->updateQuota($ldapEntry[$attr][0]); + } else { + if ($this->connection->ldapQuotaDefault !== '') { + $this->updateQuota(); + } } unset($attr); @@ -455,6 +459,20 @@ class User { } /** + * Overall process goes as follow: + * 1. fetch the quota from LDAP and check if it's parseable with the "verifyQuotaValue" function + * 2. if the value can't be fetched, is empty or not parseable, use the default LDAP quota + * 3. if the default LDAP quota can't be parsed, use the ownCloud's default quota (use 'default') + * 4. check if the target user exists and set the quota for the user. + * + * In order to improve performance and prevent an unwanted extra LDAP call, the $valueFromLDAP + * parameter can be passed with the value of the attribute. This value will be considered as the + * quota for the user coming from the LDAP server (step 1 of the process) It can be useful to + * fetch all the user's attributes in one call and use the fetched values in this function. + * The expected value for that parameter is a string describing the quota for the user. Valid + * values are 'none' (unlimited), 'default' (the ownCloud's default quota), '1234' (quota in + * bytes), '1234 MB' (quota in MB - check the \OC_Helper::computerFileSize method for more info) + * * fetches the quota from LDAP and stores it as ownCloud user value * @param string $valueFromLDAP the quota attribute's value can be passed, * to save the readAttribute request @@ -464,23 +482,51 @@ class User { if($this->wasRefreshed('quota')) { return; } - //can be null - $quotaDefault = $this->connection->ldapQuotaDefault; - $quota = $quotaDefault !== '' ? $quotaDefault : null; - $quota = !is_null($valueFromLDAP) ? $valueFromLDAP : $quota; + $quota = false; if(is_null($valueFromLDAP)) { $quotaAttribute = $this->connection->ldapQuotaAttribute; if ($quotaAttribute !== '') { $aQuota = $this->access->readAttribute($this->dn, $quotaAttribute); if($aQuota && (count($aQuota) > 0)) { - $quota = $aQuota[0]; + if ($this->verifyQuotaValue($aQuota[0])) { + $quota = $aQuota[0]; + } else { + $this->log->log('not suitable LDAP quota found for user ' . $this->uid . ': [' . $aQuota[0] . ']', \OCP\Util::WARN); + } } } + } else { + if ($this->verifyQuotaValue($valueFromLDAP)) { + $quota = $valueFromLDAP; + } else { + $this->log->log('not suitable LDAP quota found for user ' . $this->uid . ': [' . $valueFromLDAP . ']', \OCP\Util::WARN); + } } - if(!is_null($quota)) { - $this->userManager->get($this->uid)->setQuota($quota); + + if ($quota === false) { + // quota not found using the LDAP attribute (or not parseable). Try the default quota + $defaultQuota = $this->connection->ldapQuotaDefault; + if ($this->verifyQuotaValue($defaultQuota)) { + $quota = $defaultQuota; + } } + + $targetUser = $this->userManager->get($this->uid); + if ($targetUser) { + if($quota !== false) { + $targetUser->setQuota($quota); + } else { + $this->log->log('not suitable default quota found for user ' . $this->uid . ': [' . $defaultQuota . ']', \OCP\Util::WARN); + $targetUser->setQuota('default'); + } + } else { + $this->log->log('trying to set a quota for user ' . $this->uid . ' but the user is missing', \OCP\Util::ERROR); + } + } + + private function verifyQuotaValue($quotaValue) { + return $quotaValue === 'none' || $quotaValue === 'default' || \OC_Helper::computerFileSize($quotaValue) !== false; } /** diff --git a/apps/user_ldap/tests/User/UserTest.php b/apps/user_ldap/tests/User/UserTest.php index c261a2abaa2..6961e39d9f0 100644 --- a/apps/user_ldap/tests/User/UserTest.php +++ b/apps/user_ldap/tests/User/UserTest.php @@ -211,15 +211,17 @@ class UserTest extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('23 GB')); + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + /* Having a quota defined, the ldapQuotaDefault won't be used $connection->expects($this->at(1)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('23 GB')); + */ - $connection->expects($this->exactly(2)) + $connection->expects($this->exactly(1)) ->method('__get'); $access->expects($this->once()) @@ -247,7 +249,7 @@ class UserTest extends \Test\TestCase { $user->updateQuota(); } - public function testUpdateQuotaDefaultProvided() { + public function testUpdateQuotaToDefaultAllProvided() { list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = $this->getTestInstances(); @@ -256,14 +258,94 @@ class UserTest extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('25 GB')); + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); - $connection->expects($this->at(1)) + $connection->expects($this->exactly(1)) + ->method('__get'); + + $access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + $this->equalTo('myquota')) + ->will($this->returnValue(array('default'))); + + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('default'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota(); + } + + public function testUpdateQuotaToNoneAllProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->at(0)) ->method('__get') ->with($this->equalTo('ldapQuotaAttribute')) ->will($this->returnValue('myquota')); + $connection->expects($this->exactly(1)) + ->method('__get'); + + $access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + $this->equalTo('myquota')) + ->will($this->returnValue(array('none'))); + + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('none'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota(); + } + + public function testUpdateQuotaDefaultProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->at(0)) + ->method('__get') + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + + $connection->expects($this->at(1)) + ->method('__get') + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('25 GB')); + $connection->expects($this->exactly(2)) ->method('__get'); @@ -301,15 +383,17 @@ class UserTest extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('')); + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + /* Having a quota set this won't be used $connection->expects($this->at(1)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('')); + */ - $connection->expects($this->exactly(2)) + $connection->expects($this->exactly(1)) ->method('__get'); $access->expects($this->once()) @@ -346,13 +430,13 @@ class UserTest extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue('')); + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); $connection->expects($this->at(1)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) - ->will($this->returnValue('myquota')); + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('')); $connection->expects($this->exactly(2)) ->method('__get'); @@ -363,6 +447,16 @@ class UserTest extends \Test\TestCase { $this->equalTo('myquota')) ->will($this->returnValue(false)); + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('default'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + $config->expects($this->never()) ->method('setUserValue'); @@ -384,17 +478,28 @@ class UserTest extends \Test\TestCase { $connection->expects($this->at(0)) ->method('__get') - ->with($this->equalTo('ldapQuotaDefault')) + ->with($this->equalTo('ldapQuotaAttribute')) ->will($this->returnValue('')); $connection->expects($this->at(1)) ->method('__get') - ->with($this->equalTo('ldapQuotaAttribute')) + ->with($this->equalTo('ldapQuotaDefault')) ->will($this->returnValue('')); $connection->expects($this->exactly(2)) ->method('__get'); + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('default'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $access->expects($this->never()) ->method('readAttribute'); @@ -419,23 +524,206 @@ class UserTest extends \Test\TestCase { $readQuota = '19 GB'; + $connection->expects($this->never()) + ->method('__get') + ->with($this->equalTo('ldapQuotaDefault')); + + $access->expects($this->never()) + ->method('readAttribute'); + + $user = $this->createMock(IUser::class); + $user->expects($this->once()) + ->method('setQuota') + ->with($readQuota); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota($readQuota); + } + + /** + * Unparseable quota will fallback to use the LDAP default + */ + public function testUpdateWrongQuotaAllProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->at(0)) + ->method('__get') + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + + $connection->expects($this->at(1)) + ->method('__get') + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('23 GB')); + + $connection->expects($this->exactly(2)) + ->method('__get'); + + $access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + $this->equalTo('myquota')) + ->will($this->returnValue(array('42 GBwos'))); + + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('23 GB'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota(); + } + + /** + * No user quota and wrong default will set 'default' as quota + */ + public function testUpdateWrongDefaultQuotaProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->at(0)) + ->method('__get') + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + + $connection->expects($this->at(1)) + ->method('__get') + ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('23 GBwowowo')); + + $connection->expects($this->exactly(2)) + ->method('__get'); + + $access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + $this->equalTo('myquota')) + ->will($this->returnValue(false)); + + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('default'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota(); + } + + /** + * Wrong user quota and wrong default will set 'default' as quota + */ + public function testUpdateWrongQuotaAndDefaultAllProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + $connection->expects($this->at(0)) ->method('__get') + ->with($this->equalTo('ldapQuotaAttribute')) + ->will($this->returnValue('myquota')); + + $connection->expects($this->at(1)) + ->method('__get') ->with($this->equalTo('ldapQuotaDefault')) + ->will($this->returnValue('23 GBwowowo')); + + $connection->expects($this->exactly(2)) + ->method('__get'); + + $access->expects($this->once()) + ->method('readAttribute') + ->with($this->equalTo('uid=alice,dc=foo,dc=bar'), + $this->equalTo('myquota')) + ->will($this->returnValue(array('23 flush'))); + + $user = $this->createMock('\OCP\IUser'); + $user->expects($this->once()) + ->method('setQuota') + ->with('default'); + + $userMgr->expects($this->once()) + ->method('get') + ->with('alice') + ->will($this->returnValue($user)); + + $uid = 'alice'; + $dn = 'uid=alice,dc=foo,dc=bar'; + + $user = new User( + $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); + + $user->updateQuota(); + } + + /** + * No quota attribute set and wrong default will set 'default' as quota + */ + public function testUpdateWrongDefaultQuotaNotProvided() { + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc, $userMgr) = + $this->getTestInstances(); + + list($access, $connection) = + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); + + $connection->expects($this->at(0)) + ->method('__get') + ->with($this->equalTo('ldapQuotaAttribute')) ->will($this->returnValue('')); - $connection->expects($this->once(1)) + $connection->expects($this->at(1)) ->method('__get') ->with($this->equalTo('ldapQuotaDefault')) - ->will($this->returnValue(null)); + ->will($this->returnValue('23 GBwowowo')); + + $connection->expects($this->exactly(2)) + ->method('__get'); $access->expects($this->never()) ->method('readAttribute'); - $user = $this->createMock(IUser::class); + $user = $this->createMock('\OCP\IUser'); $user->expects($this->once()) ->method('setQuota') - ->with($readQuota); + ->with('default'); $userMgr->expects($this->once()) ->method('get') @@ -448,7 +736,7 @@ class UserTest extends \Test\TestCase { $user = new User( $uid, $dn, $access, $config, $filesys, $image, $log, $avaMgr, $userMgr); - $user->updateQuota($readQuota); + $user->updateQuota(); } //the testUpdateAvatar series also implicitely tests getAvatarImage diff --git a/apps/workflowengine/l10n/es_MX.js b/apps/workflowengine/l10n/es_MX.js index 93337ee293a..6ceb418f649 100644 --- a/apps/workflowengine/l10n/es_MX.js +++ b/apps/workflowengine/l10n/es_MX.js @@ -14,6 +14,10 @@ OC.L10N.register( "less or equals" : "menor o igual", "greater or equals" : "mayor o igual", "greater" : "mayor", + "File system tag" : "Etiqueta del sistema de archivos", + "is tagged with" : "está etiquetado con", + "is not tagged with" : "no está etiquetado con", + "Select tag…" : "Seleccionar etiqueta...", "Request remote address" : "Solicitar dirección remota", "matches IPv4" : "coincide con IPv4", "does not match IPv4" : "no coincide con IPv4", @@ -27,26 +31,33 @@ OC.L10N.register( "Select timezone…" : "Seleccionar zona horaria...", "Request URL" : "Solicitar URL", "Predefined URLs" : "URLs predefinidos", + "Files WebDAV" : "Archivos WebDAV", "Request user agent" : "Solicitar agente de usuario", "Sync clients" : "Sincronizar clientes", "Android client" : "Cliente Android", "iOS client" : "Cliente iOS", "Desktop client" : "Cliente de escritorio", + "User group membership" : "Membresia al grupo de usuarios", "is member of" : "es miembro de", "is not member of" : "no es miembro de", "The given operator is invalid" : "El operador indicado es inválido", "The given regular expression is invalid" : "La expresión regular indicada es inválida", "The given file size is invalid" : "El tamaño de archivo indicado es inválido", + "The given tag id is invalid" : "El id de la etiqueta es inválido", "The given IP range is invalid" : "El rango de IP's es inválido", "The given IP range is not valid for IPv4" : "El rango de IPs dado no es válido para IPv4", "The given IP range is not valid for IPv6" : "El rango de IPs dado no es válido para IPv6", + "The given time span is invalid" : "El espacio de tiempo dado es inválido", "The given start time is invalid" : "El tiempo inicial dado no es válido", "The given end time is invalid" : "El tiempo final dado no es válido", "The given group does not exist" : "El grupo dado no existe", - "Check %s is invalid or does not exist" : "La operación %s es inválida o no existe", + "Check %s is invalid or does not exist" : "La validación %s es inválida o no existe", "Operation #%s does not exist" : "La operación #%s no existe", "Operation %s does not exist" : "La operación %s no existe", "Operation %s is invalid" : "La operación %s es inválida", + "Check %s does not exist" : "La validación %s no existe", + "Check %s is invalid" : "La validación %s no es inválida", + "Check #%s does not exist" : "La validación #%s no existe", "Workflow" : "Flujo de trabajo", "Open documentation" : "Abrir documentación", "Add rule group" : "Agregar regla de grupo", diff --git a/apps/workflowengine/l10n/es_MX.json b/apps/workflowengine/l10n/es_MX.json index 410a5e49207..a141be5f6e3 100644 --- a/apps/workflowengine/l10n/es_MX.json +++ b/apps/workflowengine/l10n/es_MX.json @@ -12,6 +12,10 @@ "less or equals" : "menor o igual", "greater or equals" : "mayor o igual", "greater" : "mayor", + "File system tag" : "Etiqueta del sistema de archivos", + "is tagged with" : "está etiquetado con", + "is not tagged with" : "no está etiquetado con", + "Select tag…" : "Seleccionar etiqueta...", "Request remote address" : "Solicitar dirección remota", "matches IPv4" : "coincide con IPv4", "does not match IPv4" : "no coincide con IPv4", @@ -25,26 +29,33 @@ "Select timezone…" : "Seleccionar zona horaria...", "Request URL" : "Solicitar URL", "Predefined URLs" : "URLs predefinidos", + "Files WebDAV" : "Archivos WebDAV", "Request user agent" : "Solicitar agente de usuario", "Sync clients" : "Sincronizar clientes", "Android client" : "Cliente Android", "iOS client" : "Cliente iOS", "Desktop client" : "Cliente de escritorio", + "User group membership" : "Membresia al grupo de usuarios", "is member of" : "es miembro de", "is not member of" : "no es miembro de", "The given operator is invalid" : "El operador indicado es inválido", "The given regular expression is invalid" : "La expresión regular indicada es inválida", "The given file size is invalid" : "El tamaño de archivo indicado es inválido", + "The given tag id is invalid" : "El id de la etiqueta es inválido", "The given IP range is invalid" : "El rango de IP's es inválido", "The given IP range is not valid for IPv4" : "El rango de IPs dado no es válido para IPv4", "The given IP range is not valid for IPv6" : "El rango de IPs dado no es válido para IPv6", + "The given time span is invalid" : "El espacio de tiempo dado es inválido", "The given start time is invalid" : "El tiempo inicial dado no es válido", "The given end time is invalid" : "El tiempo final dado no es válido", "The given group does not exist" : "El grupo dado no existe", - "Check %s is invalid or does not exist" : "La operación %s es inválida o no existe", + "Check %s is invalid or does not exist" : "La validación %s es inválida o no existe", "Operation #%s does not exist" : "La operación #%s no existe", "Operation %s does not exist" : "La operación %s no existe", "Operation %s is invalid" : "La operación %s es inválida", + "Check %s does not exist" : "La validación %s no existe", + "Check %s is invalid" : "La validación %s no es inválida", + "Check #%s does not exist" : "La validación #%s no existe", "Workflow" : "Flujo de trabajo", "Open documentation" : "Abrir documentación", "Add rule group" : "Agregar regla de grupo", diff --git a/apps/workflowengine/lib/Check/FileSystemTags.php b/apps/workflowengine/lib/Check/FileSystemTags.php index e9b5a945967..4a2b87fd53e 100644 --- a/apps/workflowengine/lib/Check/FileSystemTags.php +++ b/apps/workflowengine/lib/Check/FileSystemTags.php @@ -23,6 +23,7 @@ namespace OCA\WorkflowEngine\Check; use OCP\Files\Cache\ICache; +use OCP\Files\IHomeStorage; use OCP\Files\Storage\IStorage; use OCP\IL10N; use OCP\SystemTag\ISystemTagManager; @@ -108,7 +109,7 @@ class FileSystemTags implements ICheck { */ protected function getSystemTags() { $cache = $this->storage->getCache(); - $fileIds = $this->getFileIds($cache, $this->path); + $fileIds = $this->getFileIds($cache, $this->path, !$this->storage->instanceOfStorage(IHomeStorage::class)); $systemTags = []; foreach ($fileIds as $i => $fileId) { @@ -135,17 +136,19 @@ class FileSystemTags implements ICheck { * Get the file ids of the given path and its parents * @param ICache $cache * @param string $path + * @param bool $isExternalStorage * @return int[] */ - protected function getFileIds(ICache $cache, $path) { + protected function getFileIds(ICache $cache, $path, $isExternalStorage) { $cacheId = $cache->getNumericStorageId(); if (isset($this->fileIds[$cacheId][$path])) { return $this->fileIds[$cacheId][$path]; } - if ($path !== dirname($path)) { - $parentIds = $this->getFileIds($cache, dirname($path)); - } else { + $parentIds = []; + if ($path !== $this->dirname($path)) { + $parentIds = $this->getFileIds($cache, $this->dirname($path), $isExternalStorage); + } else if (!$isExternalStorage) { return []; } @@ -158,4 +161,9 @@ class FileSystemTags implements ICheck { return $parentIds; } + + protected function dirname($path) { + $dir = dirname($path); + return $dir === '.' ? '' : $dir; + } } |