diff options
61 files changed, 681 insertions, 201 deletions
diff --git a/.jshintrc b/.jshintrc index 0b055afde3d..19ce0606297 100644 --- a/.jshintrc +++ b/.jshintrc @@ -28,7 +28,10 @@ "_": true, "OC": true, "OCA": true, + "OCP": true, "t": true, - "n": true + "n": true, + "escapeHTML": true, + "Promise": true } } diff --git a/apps/comments/css/autocomplete.scss b/apps/comments/css/autocomplete.scss index 10e56f15420..41695e08301 100644 --- a/apps/comments/css/autocomplete.scss +++ b/apps/comments/css/autocomplete.scss @@ -12,7 +12,7 @@ background: $color-main-background; color: $color-main-text; border: 1px solid $color-border; - border-radius: 3px; + border-radius: $border-radius; box-shadow: 0 0 5px $color-box-shadow; min-width: 120px; z-index: 11110 !important; diff --git a/apps/dav/appinfo/v1/caldav.php b/apps/dav/appinfo/v1/caldav.php index a103f82a420..53f167bea36 100644 --- a/apps/dav/appinfo/v1/caldav.php +++ b/apps/dav/appinfo/v1/caldav.php @@ -87,9 +87,8 @@ $server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); $server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin()); if ($sendInvitations) { - $server->addPlugin(new \OCA\DAV\CalDAV\Schedule\IMipPlugin( \OC::$server->getMailer(), \OC::$server->getLogger(), new \OC\AppFramework\Utility\TimeFactory())); + $server->addPlugin(\OC::$server->query(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class)); } - $server->addPlugin(new ExceptionLoggerPlugin('caldav', \OC::$server->getLogger())); // And off we go! diff --git a/apps/dav/l10n/nl.js b/apps/dav/l10n/nl.js index 094e621c926..26908ebb3fc 100644 --- a/apps/dav/l10n/nl.js +++ b/apps/dav/l10n/nl.js @@ -46,6 +46,7 @@ OC.L10N.register( "Remote Address: %s" : "Extern adres: %s", "Request ID: %s" : "Aanvraag-ID: %s", "CalDAV server" : "CalDAV server", - "Send invitations to attendees" : "Verzend uitnodigingen naar deelnemers" + "Send invitations to attendees" : "Verzend uitnodigingen naar deelnemers", + "Please make sure to properly set up the email settings above." : "Zorg ervoor dat je de bovenstaande e-mailinstellingen correct instelt." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/dav/l10n/nl.json b/apps/dav/l10n/nl.json index f38a938cd2d..7b55c63d626 100644 --- a/apps/dav/l10n/nl.json +++ b/apps/dav/l10n/nl.json @@ -44,6 +44,7 @@ "Remote Address: %s" : "Extern adres: %s", "Request ID: %s" : "Aanvraag-ID: %s", "CalDAV server" : "CalDAV server", - "Send invitations to attendees" : "Verzend uitnodigingen naar deelnemers" + "Send invitations to attendees" : "Verzend uitnodigingen naar deelnemers", + "Please make sure to properly set up the email settings above." : "Zorg ervoor dat je de bovenstaande e-mailinstellingen correct instelt." },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php index 8e1d7e2563d..889b0851336 100644 --- a/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php +++ b/apps/dav/lib/CalDAV/Schedule/IMipPlugin.php @@ -24,14 +24,22 @@ namespace OCA\DAV\CalDAV\Schedule; use OCP\AppFramework\Utility\ITimeFactory; +use OCP\IConfig; +use OCP\IL10N; use OCP\ILogger; +use OCP\IURLGenerator; +use OCP\L10N\IFactory as L10NFactory; +use OCP\Mail\IEMailTemplate; use OCP\Mail\IMailer; +use Sabre\CalDAV\Schedule\IMipPlugin as SabreIMipPlugin; +use Sabre\DAV\Xml\Element\Prop; use Sabre\VObject\Component\VCalendar; +use Sabre\VObject\Component\VEvent; use Sabre\VObject\DateTimeParser; -use Sabre\VObject\ITip; -use Sabre\CalDAV\Schedule\IMipPlugin as SabreIMipPlugin; +use Sabre\VObject\ITip\Message; +use Sabre\VObject\Parameter; +use Sabre\VObject\Property; use Sabre\VObject\Recur\EventIterator; - /** * iMIP handler. * @@ -48,6 +56,12 @@ use Sabre\VObject\Recur\EventIterator; */ class IMipPlugin extends SabreIMipPlugin { + /** @var string */ + private $userId; + + /** @var IConfig */ + private $config; + /** @var IMailer */ private $mailer; @@ -57,29 +71,45 @@ class IMipPlugin extends SabreIMipPlugin { /** @var ITimeFactory */ private $timeFactory; + /** @var L10NFactory */ + private $l10nFactory; + + /** @var IURLGenerator */ + private $urlGenerator; + const MAX_DATE = '2038-01-01'; + const METHOD_REQUEST = 'request'; + const METHOD_REPLY = 'reply'; + const METHOD_CANCEL = 'cancel'; + /** - * Creates the email handler. - * + * @param IConfig $config * @param IMailer $mailer * @param ILogger $logger * @param ITimeFactory $timeFactory + * @param L10NFactory $l10nFactory + * @param IUrlGenerator $urlGenerator + * @param string $userId */ - function __construct(IMailer $mailer, ILogger $logger, ITimeFactory $timeFactory) { + public function __construct(IConfig $config, IMailer $mailer, ILogger $logger, ITimeFactory $timeFactory, L10NFactory $l10nFactory, IURLGenerator $urlGenerator, $userId) { parent::__construct(''); + $this->userId = $userId; + $this->config = $config; $this->mailer = $mailer; $this->logger = $logger; $this->timeFactory = $timeFactory; + $this->l10nFactory = $l10nFactory; + $this->urlGenerator = $urlGenerator; } /** * Event handler for the 'schedule' event. * - * @param ITip\Message $iTipMessage + * @param Message $iTipMessage * @return void */ - function schedule(ITip\Message $iTipMessage) { + public function schedule(Message $iTipMessage) { // Not sending any emails if the system considers the update // insignificant. @@ -105,40 +135,100 @@ class IMipPlugin extends SabreIMipPlugin { return; } + // Strip off mailto: $sender = substr($iTipMessage->sender, 7); $recipient = substr($iTipMessage->recipient, 7); - $senderName = ($iTipMessage->senderName) ? $iTipMessage->senderName : null; - $recipientName = ($iTipMessage->recipientName) ? $iTipMessage->recipientName : null; + $senderName = $iTipMessage->senderName ?: null; + $recipientName = $iTipMessage->recipientName ?: null; - $subject = 'SabreDAV iTIP message'; - switch (strtoupper($iTipMessage->method)) { - case 'REPLY' : - $subject = 'Re: ' . $summary; - break; - case 'REQUEST' : - $subject = $summary; + /** @var VEvent $vevent */ + $vevent = $iTipMessage->message->VEVENT; + + $attendee = $this->getCurrentAttendee($iTipMessage); + $defaultLang = $this->config->getUserValue($this->userId, 'core', 'lang', $this->l10nFactory->findLanguage()); + $lang = $this->getAttendeeLangOrDefault($defaultLang, $attendee); + $l10n = $this->l10nFactory->get('dav', $lang); + + $meetingAttendeeName = $recipientName ?: $recipient; + $meetingInviteeName = $senderName ?: $sender; + + $meetingTitle = $vevent->SUMMARY; + $meetingDescription = $vevent->DESCRIPTION; + + $start = $vevent->DTSTART; + if (isset($vevent->DTEND)) { + $end = $vevent->DTEND; + } elseif (isset($vevent->DURATION)) { + $isFloating = $vevent->DTSTART->isFloating(); + $end = clone $vevent->DTSTART; + $endDateTime = $end->getDateTime(); + $endDateTime = $endDateTime->add(DateTimeParser::parse($vevent->DURATION->getValue())); + $end->setDateTime($endDateTime, $isFloating); + } elseif (!$vevent->DTSTART->hasTime()) { + $isFloating = $vevent->DTSTART->isFloating(); + $end = clone $vevent->DTSTART; + $endDateTime = $end->getDateTime(); + $endDateTime = $endDateTime->modify('+1 day'); + $end->setDateTime($endDateTime, $isFloating); + } else { + $end = clone $vevent->DTSTART; + } + + $meetingWhen = $this->generateWhenString($l10n, $start, $end); + + $meetingUrl = $vevent->URL; + $meetingLocation = $vevent->LOCATION; + + $defaultVal = '--'; + + $method = self::METHOD_REQUEST; + switch (strtolower($iTipMessage->method)) { + case self::METHOD_REPLY: + $method = self::METHOD_REPLY; break; - case 'CANCEL' : - $subject = 'Cancelled: ' . $summary; + case self::METHOD_CANCEL: + $method = self::METHOD_CANCEL; break; } - $contentType = 'text/calendar; charset=UTF-8; method=' . $iTipMessage->method; + $data = array( + 'attendee_name' => (string)$meetingAttendeeName ?: $defaultVal, + 'invitee_name' => (string)$meetingInviteeName ?: $defaultVal, + 'meeting_title' => (string)$meetingTitle ?: $defaultVal, + 'meeting_description' => (string)$meetingDescription ?: $defaultVal, + 'meeting_url' => (string)$meetingUrl ?: $defaultVal, + ); + + $message = $this->mailer->createMessage() + ->setReplyTo([$sender => $senderName]) + ->setTo([$recipient => $recipientName]); + + $template = $this->mailer->createEMailTemplate('dav.calendarInvite.' . $method, $data); + $template->addHeader(); - $message = $this->mailer->createMessage(); + $this->addSubjectAndHeading($template, $l10n, $method, $summary, + $meetingAttendeeName, $meetingInviteeName); + $this->addBulletList($template, $l10n, $meetingWhen, $meetingLocation, + $meetingDescription, $meetingUrl); + + $template->addFooter(); + $message->useTemplate($template); + + $attachment = $this->mailer->createAttachment( + $iTipMessage->message->serialize(), + 'event.ics',// TODO(leon): Make file name unique, e.g. add event id + 'text/calendar; method=' . $iTipMessage->method + ); + $message->attach($attachment); - $message->setReplyTo([$sender => $senderName]) - ->setTo([$recipient => $recipientName]) - ->setSubject($subject) - ->setBody($iTipMessage->message->serialize(), $contentType); try { $failed = $this->mailer->send($message); + $iTipMessage->scheduleStatus = '1.1; Scheduling message is sent via iMip'; if ($failed) { $this->logger->error('Unable to deliver message to {failed}', ['app' => 'dav', 'failed' => implode(', ', $failed)]); $iTipMessage->scheduleStatus = '5.0; EMail delivery failed'; } - $iTipMessage->scheduleStatus = '1.1; Scheduling message is sent via iMip'; } catch(\Exception $ex) { $this->logger->logException($ex, ['app' => 'dav']); $iTipMessage->scheduleStatus = '5.0; EMail delivery failed'; @@ -151,6 +241,7 @@ class IMipPlugin extends SabreIMipPlugin { * @return bool */ private function isEventInThePast(VCalendar $vObject) { + /** @var VEvent $component */ $component = $vObject->VEVENT; $firstOccurrence = $component->DTSTART->getDateTime()->getTimeStamp(); @@ -159,15 +250,17 @@ class IMipPlugin extends SabreIMipPlugin { if (isset($component->DTEND)) { $lastOccurrence = $component->DTEND->getDateTime()->getTimeStamp(); } elseif (isset($component->DURATION)) { + /** @var \DateTime $endDate */ $endDate = clone $component->DTSTART->getDateTime(); // $component->DTEND->getDateTime() returns DateTimeImmutable $endDate = $endDate->add(DateTimeParser::parse($component->DURATION->getValue())); - $lastOccurrence = $endDate->getTimeStamp(); + $lastOccurrence = $endDate->getTimestamp(); } elseif (!$component->DTSTART->hasTime()) { + /** @var \DateTime $endDate */ $endDate = clone $component->DTSTART->getDateTime(); // $component->DTSTART->getDateTime() returns DateTimeImmutable $endDate = $endDate->modify('+1 day'); - $lastOccurrence = $endDate->getTimeStamp(); + $lastOccurrence = $endDate->getTimestamp(); } else { $lastOccurrence = $firstOccurrence; } @@ -190,4 +283,176 @@ class IMipPlugin extends SabreIMipPlugin { $currentTime = $this->timeFactory->getTime(); return $lastOccurrence < $currentTime; } + + + /** + * @param Message $iTipMessage + * @return null|Property + */ + private function getCurrentAttendee(Message $iTipMessage) { + /** @var VEvent $vevent */ + $vevent = $iTipMessage->message->VEVENT; + $attendees = $vevent->select('ATTENDEE'); + foreach ($attendees as $attendee) { + /** @var Property $attendee */ + if (strcasecmp($attendee->getValue(), $iTipMessage->recipient) === 0) { + return $attendee; + } + } + return null; + } + + /** + * @param string $default + * @param Property|null $attendee + * @return string + */ + private function getAttendeeLangOrDefault($default, Property $attendee = null) { + if ($attendee !== null) { + $lang = $attendee->offsetGet('LANGUAGE'); + if ($lang instanceof Parameter) { + return $lang->getValue(); + } + } + return $default; + } + + /** + * @param IL10N $l10n + * @param Property $dtstart + * @param Property $dtend + */ + private function generateWhenString(IL10N $l10n, Property $dtstart, Property $dtend) { + $isAllDay = $dtstart instanceof Property\ICalendar\Date; + + /** @var Property\ICalendar\Date | Property\ICalendar\DateTime $dtstart */ + /** @var Property\ICalendar\Date | Property\ICalendar\DateTime $dtend */ + /** @var \DateTimeImmutable $dtstartDt */ + $dtstartDt = $dtstart->getDateTime(); + /** @var \DateTimeImmutable $dtendDt */ + $dtendDt = $dtend->getDateTime(); + + $diff = $dtstartDt->diff($dtendDt); + + $dtstartDt = new \DateTime($dtstartDt->format(\DateTime::ATOM)); + $dtendDt = new \DateTime($dtendDt->format(\DateTime::ATOM)); + + if ($isAllDay) { + // One day event + if ($diff->days === 1) { + return $l10n->l('date', $dtstartDt, ['width' => 'medium']); + } + + //event that spans over multiple days + $localeStart = $l10n->l('date', $dtstartDt, ['width' => 'medium']); + $localeEnd = $l10n->l('date', $dtendDt, ['width' => 'medium']); + + return $localeStart . ' - ' . $localeEnd; + } + + /** @var Property\ICalendar\DateTime $dtstart */ + /** @var Property\ICalendar\DateTime $dtend */ + $isFloating = $dtstart->isFloating(); + $startTimezone = $endTimezone = null; + if (!$isFloating) { + $prop = $dtstart->offsetGet('TZID'); + if ($prop instanceof Parameter) { + $startTimezone = $prop->getValue(); + } + + $prop = $dtend->offsetGet('TZID'); + if ($prop instanceof Parameter) { + $endTimezone = $prop->getValue(); + } + } + + $localeStart = $l10n->l('datetime', $dtstartDt, ['width' => 'medium']); + + // always show full date with timezone if timezones are different + if ($startTimezone !== $endTimezone) { + $localeEnd = $l10n->l('datetime', $dtendDt, ['width' => 'medium']); + + return $localeStart . ' (' . $startTimezone . ') - ' . + $localeEnd . ' (' . $endTimezone . ')'; + } + + // show only end time if date is the same + if ($this->isDayEqual($dtstartDt, $dtendDt)) { + $localeEnd = $l10n->l('time', $dtendDt, ['width' => 'medium']); + } else { + $localeEnd = $l10n->l('datetime', $dtendDt, ['width' => 'medium']); + } + + return $localeStart . ' - ' . $localeEnd . ' (' . $startTimezone . ')'; + } + + /** + * @param \DateTime $dtStart + * @param \DateTime $dtEnd + * @return bool + */ + private function isDayEqual(\DateTime $dtStart, \DateTime $dtEnd) { + return $dtStart->format('Y-m-d') === $dtEnd->format('Y-m-d'); + } + + /** + * @param IEMailTemplate $template + * @param IL10N $l10n + * @param string $method + * @param string $summary + * @param string $attendeeName + * @param string $inviteeName + */ + private function addSubjectAndHeading(IEMailTemplate $template, IL10N $l10n, + $method, $summary, $attendeeName, $inviteeName) { + if ($method === self::METHOD_CANCEL) { + $template->setSubject('Cancelled: ' . $summary); + $template->addHeading($l10n->t('Invitation canceled'), $l10n->t('Hello %s,', [$attendeeName])); + $template->addBodyText($l10n->t('The meeting »%s« with %s was canceled.', [$summary, $inviteeName])); + } else if ($method === self::METHOD_REPLY) { + $template->setSubject('Re: ' . $summary); + $template->addHeading($l10n->t('Invitation updated'), $l10n->t('Hello %s,', [$attendeeName])); + $template->addBodyText($l10n->t('The meeting »%s« with %s was updated.', [$summary, $inviteeName])); + } else { + $template->setSubject('Invitation: ' . $summary); + $template->addHeading($l10n->t('%s invited you to »%s«', [$inviteeName, $summary]), $l10n->t('Hello %s,', [$attendeeName])); + } + + } + + /** + * @param IEMailTemplate $template + * @param IL10N $l10n + * @param string $time + * @param string $location + * @param string $description + * @param string $url + */ + private function addBulletList(IEMailTemplate $template, IL10N $l10n, $time, $location, $description, $url) { + $template->addBodyListItem($time, $l10n->t('When:'), + $this->getAbsoluteImagePath('filetypes/text-calendar.svg')); + + if ($location) { + $template->addBodyListItem($location, $l10n->t('Where:'), + $this->getAbsoluteImagePath('filetypes/location.svg')); + } + if ($description) { + $template->addBodyListItem((string)$description, $l10n->t('Description:'), + $this->getAbsoluteImagePath('filetypes/text.svg')); + } + if ($url) { + $template->addBodyListItem((string)$url, $l10n->t('Link:'), + $this->getAbsoluteImagePath('filetypes/link.svg')); + } + } + + /** + * @param string $path + * @return string + */ + private function getAbsoluteImagePath($path) { + return $this->urlGenerator->getAbsoluteURL( + $this->urlGenerator->imagePath('core', $path) + ); + } } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index 719e4974755..dfe55959a90 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -77,6 +77,7 @@ class Server { $dispatcher = \OC::$server->getEventDispatcher(); $timezone = new TimeFactory(); $sendInvitations = \OC::$server->getConfig()->getAppValue('dav', 'sendInvitations', 'yes') === 'yes'; + $l10nFactory = \OC::$server->getL10NFactory(); $root = new RootCollection(); $this->server = new \OCA\DAV\Connector\Sabre\Server(new CachingTree($root)); @@ -139,7 +140,7 @@ class Server { $this->server->addPlugin(new \Sabre\CalDAV\ICSExportPlugin()); $this->server->addPlugin(new \OCA\DAV\CalDAV\Schedule\Plugin()); if ($sendInvitations) { - $this->server->addPlugin(new IMipPlugin($mailer, $logger, $timezone)); + $this->server->addPlugin(\OC::$server->query(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class)); } $this->server->addPlugin(new \Sabre\CalDAV\Subscriptions\Plugin()); $this->server->addPlugin(new \Sabre\CalDAV\Notifications\Plugin()); diff --git a/apps/dav/tests/unit/CalDAV/Schedule/IMipPluginTest.php b/apps/dav/tests/unit/CalDAV/Schedule/IMipPluginTest.php index 894617781b5..664e33dfd08 100644 --- a/apps/dav/tests/unit/CalDAV/Schedule/IMipPluginTest.php +++ b/apps/dav/tests/unit/CalDAV/Schedule/IMipPluginTest.php @@ -28,7 +28,15 @@ namespace OCA\DAV\Tests\unit\CalDAV\Schedule; use OC\Mail\Mailer; use OCA\DAV\CalDAV\Schedule\IMipPlugin; use OCP\AppFramework\Utility\ITimeFactory; +use OCP\IConfig; +use OCP\IL10N; use OCP\ILogger; +use OCP\IURLGenerator; +use OCP\L10N\IFactory; +use OCP\Mail\IAttachment; +use OCP\Mail\IEMailTemplate; +use OCP\Mail\IMailer; +use OCP\Mail\IMessage; use Sabre\VObject\Component\VCalendar; use Sabre\VObject\ITip\Message; use Test\TestCase; @@ -36,17 +44,31 @@ use Test\TestCase; class IMipPluginTest extends TestCase { public function testDelivery() { - $mailMessage = new \OC\Mail\Message(new \Swift_Message()); + $mailMessage = $this->createMock(IMessage::class); + $mailMessage->method('setReplyTo')->willReturn($mailMessage); + $mailMessage->method('setTo')->willReturn($mailMessage); /** @var Mailer | \PHPUnit_Framework_MockObject_MockObject $mailer */ - $mailer = $this->getMockBuilder(Mailer::class)->disableOriginalConstructor()->getMock(); + $mailer = $this->getMockBuilder(IMailer::class)->disableOriginalConstructor()->getMock(); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $emailAttachment = $this->createMock(IAttachment::class); + $mailer->method('createEMailTemplate')->willReturn($emailTemplate); $mailer->method('createMessage')->willReturn($mailMessage); + $mailer->method('createAttachment')->willReturn($emailAttachment); $mailer->expects($this->once())->method('send'); /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject $logger */ $logger = $this->getMockBuilder(ILogger::class)->disableOriginalConstructor()->getMock(); $timeFactory = $this->getMockBuilder(ITimeFactory::class)->disableOriginalConstructor()->getMock(); $timeFactory->method('getTime')->willReturn(1); + /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject $config */ + $config = $this->createMock(IConfig::class); + $l10n = $this->createMock(IL10N::class); + /** @var IFactory | \PHPUnit_Framework_MockObject_MockObject $l10nFactory */ + $l10nFactory = $this->createMock(IFactory::class); + $l10nFactory->method('get')->willReturn($l10n); + /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject $urlGenerator */ + $urlGenerator = $this->createMock(IURLGenerator::class); - $plugin = new IMipPlugin($mailer, $logger, $timeFactory); + $plugin = new IMipPlugin($config, $mailer, $logger, $timeFactory, $l10nFactory, $urlGenerator, 'user123'); $message = new Message(); $message->method = 'REQUEST'; $message->message = new VCalendar(); @@ -59,26 +81,46 @@ class IMipPluginTest extends TestCase { $message->sender = 'mailto:gandalf@wiz.ard'; $message->recipient = 'mailto:frodo@hobb.it'; + $emailTemplate->expects($this->once()) + ->method('setSubject') + ->with('Invitation: Fellowship meeting'); + $mailMessage->expects($this->once()) + ->method('setTo') + ->with(['frodo@hobb.it' => null]); + $mailMessage->expects($this->once()) + ->method('setReplyTo') + ->with(['gandalf@wiz.ard' => null]); + $plugin->schedule($message); $this->assertEquals('1.1', $message->getScheduleStatus()); - $this->assertEquals('Fellowship meeting', $mailMessage->getSubject()); - $this->assertEquals(['frodo@hobb.it' => null], $mailMessage->getTo()); - $this->assertEquals(['gandalf@wiz.ard' => null], $mailMessage->getReplyTo()); - $this->assertEquals('text/calendar; charset=UTF-8; method=REQUEST', $mailMessage->getSwiftMessage()->getContentType()); } public function testFailedDelivery() { - $mailMessage = new \OC\Mail\Message(new \Swift_Message()); + $mailMessage = $this->createMock(IMessage::class); + $mailMessage->method('setReplyTo')->willReturn($mailMessage); + $mailMessage->method('setTo')->willReturn($mailMessage); /** @var Mailer | \PHPUnit_Framework_MockObject_MockObject $mailer */ - $mailer = $this->getMockBuilder(Mailer::class)->disableOriginalConstructor()->getMock(); + $mailer = $this->getMockBuilder(IMailer::class)->disableOriginalConstructor()->getMock(); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $emailAttachment = $this->createMock(IAttachment::class); + $mailer->method('createEMailTemplate')->willReturn($emailTemplate); $mailer->method('createMessage')->willReturn($mailMessage); + $mailer->method('createAttachment')->willReturn($emailAttachment); $mailer->method('send')->willThrowException(new \Exception()); /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject $logger */ $logger = $this->getMockBuilder(ILogger::class)->disableOriginalConstructor()->getMock(); $timeFactory = $this->getMockBuilder(ITimeFactory::class)->disableOriginalConstructor()->getMock(); $timeFactory->method('getTime')->willReturn(1); + /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject $config */ + $config = $this->createMock(IConfig::class); + $l10n = $this->createMock(IL10N::class); + /** @var IFactory | \PHPUnit_Framework_MockObject_MockObject $l10nFactory */ + $l10nFactory = $this->createMock(IFactory::class); + $l10nFactory->method('get')->willReturn($l10n); + /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject $urlGenerator */ + $urlGenerator = $this->createMock(IURLGenerator::class); - $plugin = new IMipPlugin($mailer, $logger, $timeFactory); + $plugin = new IMipPlugin($config, $mailer, $logger, $timeFactory, $l10nFactory, $urlGenerator, 'user123'); $message = new Message(); $message->method = 'REQUEST'; $message->message = new VCalendar(); @@ -91,22 +133,34 @@ class IMipPluginTest extends TestCase { $message->sender = 'mailto:gandalf@wiz.ard'; $message->recipient = 'mailto:frodo@hobb.it'; + $emailTemplate->expects($this->once()) + ->method('setSubject') + ->with('Invitation: Fellowship meeting'); + $mailMessage->expects($this->once()) + ->method('setTo') + ->with(['frodo@hobb.it' => null]); + $mailMessage->expects($this->once()) + ->method('setReplyTo') + ->with(['gandalf@wiz.ard' => null]); + $plugin->schedule($message); $this->assertEquals('5.0', $message->getScheduleStatus()); - $this->assertEquals('Fellowship meeting', $mailMessage->getSubject()); - $this->assertEquals(['frodo@hobb.it' => null], $mailMessage->getTo()); - $this->assertEquals(['gandalf@wiz.ard' => null], $mailMessage->getReplyTo()); - $this->assertEquals('text/calendar; charset=UTF-8; method=REQUEST', $mailMessage->getSwiftMessage()->getContentType()); } /** * @dataProvider dataNoMessageSendForPastEvents */ public function testNoMessageSendForPastEvents($veventParams, $expectsMail) { - $mailMessage = new \OC\Mail\Message(new \Swift_Message()); + $mailMessage = $this->createMock(IMessage::class); + $mailMessage->method('setReplyTo')->willReturn($mailMessage); + $mailMessage->method('setTo')->willReturn($mailMessage); /** @var Mailer | \PHPUnit_Framework_MockObject_MockObject $mailer */ - $mailer = $this->getMockBuilder(Mailer::class)->disableOriginalConstructor()->getMock(); + $mailer = $this->getMockBuilder(IMailer::class)->disableOriginalConstructor()->getMock(); + $emailTemplate = $this->createMock(IEMailTemplate::class); + $emailAttachment = $this->createMock(IAttachment::class); + $mailer->method('createEMailTemplate')->willReturn($emailTemplate); $mailer->method('createMessage')->willReturn($mailMessage); + $mailer->method('createAttachment')->willReturn($emailAttachment); if ($expectsMail) { $mailer->expects($this->once())->method('send'); } else { @@ -116,8 +170,16 @@ class IMipPluginTest extends TestCase { $logger = $this->getMockBuilder(ILogger::class)->disableOriginalConstructor()->getMock(); $timeFactory = $this->getMockBuilder(ITimeFactory::class)->disableOriginalConstructor()->getMock(); $timeFactory->method('getTime')->willReturn(1496912528); + /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject $config */ + $config = $this->createMock(IConfig::class); + $l10n = $this->createMock(IL10N::class); + /** @var IFactory | \PHPUnit_Framework_MockObject_MockObject $l10nFactory */ + $l10nFactory = $this->createMock(IFactory::class); + $l10nFactory->method('get')->willReturn($l10n); + /** @var IURLGenerator | \PHPUnit_Framework_MockObject_MockObject $urlGenerator */ + $urlGenerator = $this->createMock(IURLGenerator::class); - $plugin = new IMipPlugin($mailer, $logger, $timeFactory); + $plugin = new IMipPlugin($config, $mailer, $logger, $timeFactory, $l10nFactory, $urlGenerator, 'user123'); $message = new Message(); $message->method = 'REQUEST'; $message->message = new VCalendar(); diff --git a/apps/encryption/l10n/sr.js b/apps/encryption/l10n/sr.js index f41cc4ffeb6..ac03e3cc744 100644 --- a/apps/encryption/l10n/sr.js +++ b/apps/encryption/l10n/sr.js @@ -17,28 +17,28 @@ OC.L10N.register( "Recovery Key disabled" : "Кључ за опоравак искључен", "Recovery Key enabled" : "Кључ за опоравак укључен", "Could not enable the recovery key, please try again or contact your administrator" : "Не могу да укључим кључ за опоравак. Покушајте поново или контактирајте администратора", - "Could not update the private key password." : "Не могу да ажурирам лозинку тајног кључа.", + "Could not update the private key password." : "Не могу да ажурирам лозинку личног кључа.", "The old password was not correct, please try again." : "Стара лозинка није исправна. Покушајте поново.", "The current log-in password was not correct, please try again." : "Тренутна лозинка за пријаву није исправна. Покушајте поново.", "Private key password successfully updated." : "Лозинка личног кључа је успешно ажурирана.", - "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" : "Морате да пребаците старе шифрарске кључеве (оунКлауд <= 8.0) у нови. Укључите „оунКлауд подразумевани шифрарски модул“ и покрените 'occ encryption:migrate'", - "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Неисправан тајни кључ за апликацију шифровања. Ажурирајте Ваш тајни кључ у личним подешавањима да вратите назад приступ шифрованим фајловима.", - "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Апликација за шифровање је укључена, али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", - "Please enable server side encryption in the admin settings in order to use the encryption module." : "Укључите шифровање на страни сервера и администраторским подешавањима да бисте користили модул за шифровање.", + "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" : "Морате да пребаците старе шифрарске кључеве (оунКлауд <= 8.0) у нове. Покрените 'occ encryption:migrate' или контактирајте администратора.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Неисправан лични кључ за шифровање. Ажурирајте лозинку личног кључа у поставкама да повратите приступ шифрованим фајловима.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", + "Please enable server side encryption in the admin settings in order to use the encryption module." : "Укључите шифровање на страни сервера у администраторским поставкама да бисте користили модул за шифровање.", "Encryption app is enabled and ready" : "Апликација за шифровање је укључена и спремна", "Bad Signature" : "Лош потпис", "Missing Signature" : "Недостаје потпис", - "one-time password for server-side-encryption" : "једнокрана лозинка за шифровање на серверској страни", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника фајла да га поново подели са Вама.", - "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да читам фајл. Вероватно је дељен. Питајте власника да га поново подели са Вама.", - "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" : "Поштовање,\n\nадминистратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком '%s'.\n\nУлогујте се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним подешавањима и ажурирајте Вашу лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и Вашу тренутно лозинку за пријављивање.\n", + "one-time password for server-side-encryption" : "једнократна лозинка за шифровање на страни сервера", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника да га поново подели.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да читам фајл. Вероватно је дељен. Питајте власника да га поново подели.", + "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" : "Поштовање,\n\nадминистратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком „%s“.\n\nПријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање уношењем ове лозинке у поље „стара лозинка за пријаву“ и своју тренутну лозинку за пријављивање.\n", "The share will expire on %s." : "Дељење истиче %s.", - "Cheers!" : "Поздрав!", - "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>" : "Поштовање,<br><br>администратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком <strong>%s</strong>.<br><br>Улогујте се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним подешавањима и ажурирајте Вашу лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и Вашу тренутно лозинку за пријављивање.<br><br>", + "Cheers!" : "Здраво!", + "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>" : "Поштовање,<br><br>администратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком <strong>%s</strong>.<br><br>Пријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и своју тренутну лозинку за пријављивање.<br><br>", "Default encryption module" : "Подразумевани модул за шифровање", - "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена, али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", - "Encrypt the home storage" : "Шифрујте Ваше главно складиште", - "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Укључивањем ове опције ћете шифровати све фајлове на главном складишту, а у супротном ће само фајловим на спољашњем складишту бити шифровани", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", + "Encrypt the home storage" : "Шифровање главног складишта", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Укључивање ове опције ће шифровати све фајлове на главном складишту. У супротном ће само фајлови на спољашњем складишту бити шифровани", "Enable recovery key" : "Омогући кључ за опоравак", "Disable recovery key" : "Онемогући кључ за опоравак", "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." : "Кључ за опоравак је додатни шифрарски кључ који се користи за шифровање фајлова. Он омогућава опоравак корисничких фајлова ако корисник заборави своју лозинку.", @@ -58,8 +58,8 @@ OC.L10N.register( "Update Private Key Password" : "Ажурирај лозинку личног кључа", "Enable password recovery:" : "Укључи опоравак лозинке:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Укључивање ове опције омогућиће поновно добијање приступа вашим шифрованим фајловима у случају губитка лозинке", - "Enabled" : "Укључено", - "Disabled" : "Искључено", + "Enabled" : "укључено", + "Disabled" : "искључено", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација шифровања је укључена али ваши кључеви нису иницијализовани. Одјавите се и поново се пријавите." }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/encryption/l10n/sr.json b/apps/encryption/l10n/sr.json index 316dd670947..eec6b6e158f 100644 --- a/apps/encryption/l10n/sr.json +++ b/apps/encryption/l10n/sr.json @@ -15,28 +15,28 @@ "Recovery Key disabled" : "Кључ за опоравак искључен", "Recovery Key enabled" : "Кључ за опоравак укључен", "Could not enable the recovery key, please try again or contact your administrator" : "Не могу да укључим кључ за опоравак. Покушајте поново или контактирајте администратора", - "Could not update the private key password." : "Не могу да ажурирам лозинку тајног кључа.", + "Could not update the private key password." : "Не могу да ажурирам лозинку личног кључа.", "The old password was not correct, please try again." : "Стара лозинка није исправна. Покушајте поново.", "The current log-in password was not correct, please try again." : "Тренутна лозинка за пријаву није исправна. Покушајте поново.", "Private key password successfully updated." : "Лозинка личног кључа је успешно ажурирана.", - "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" : "Морате да пребаците старе шифрарске кључеве (оунКлауд <= 8.0) у нови. Укључите „оунКлауд подразумевани шифрарски модул“ и покрените 'occ encryption:migrate'", - "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Неисправан тајни кључ за апликацију шифровања. Ажурирајте Ваш тајни кључ у личним подешавањима да вратите назад приступ шифрованим фајловима.", - "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Апликација за шифровање је укључена, али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", - "Please enable server side encryption in the admin settings in order to use the encryption module." : "Укључите шифровање на страни сервера и администраторским подешавањима да бисте користили модул за шифровање.", + "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" : "Морате да пребаците старе шифрарске кључеве (оунКлауд <= 8.0) у нове. Покрените 'occ encryption:migrate' или контактирајте администратора.", + "Invalid private key for encryption app. Please update your private key password in your personal settings to recover access to your encrypted files." : "Неисправан лични кључ за шифровање. Ажурирајте лозинку личног кључа у поставкама да повратите приступ шифрованим фајловима.", + "Encryption App is enabled, but your keys are not initialized. Please log-out and log-in again." : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", + "Please enable server side encryption in the admin settings in order to use the encryption module." : "Укључите шифровање на страни сервера у администраторским поставкама да бисте користили модул за шифровање.", "Encryption app is enabled and ready" : "Апликација за шифровање је укључена и спремна", "Bad Signature" : "Лош потпис", "Missing Signature" : "Недостаје потпис", - "one-time password for server-side-encryption" : "једнокрана лозинка за шифровање на серверској страни", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника фајла да га поново подели са Вама.", - "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да читам фајл. Вероватно је дељен. Питајте власника да га поново подели са Вама.", - "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" : "Поштовање,\n\nадминистратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком '%s'.\n\nУлогујте се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним подешавањима и ажурирајте Вашу лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и Вашу тренутно лозинку за пријављивање.\n", + "one-time password for server-side-encryption" : "једнократна лозинка за шифровање на страни сервера", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да дешифрујем фајл. Вероватно је то дељен фајл. Затражите од власника да га поново подели.", + "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу да читам фајл. Вероватно је дељен. Питајте власника да га поново подели.", + "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" : "Поштовање,\n\nадминистратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком „%s“.\n\nПријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање уношењем ове лозинке у поље „стара лозинка за пријаву“ и своју тренутну лозинку за пријављивање.\n", "The share will expire on %s." : "Дељење истиче %s.", - "Cheers!" : "Поздрав!", - "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>" : "Поштовање,<br><br>администратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком <strong>%s</strong>.<br><br>Улогујте се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним подешавањима и ажурирајте Вашу лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и Вашу тренутно лозинку за пријављивање.<br><br>", + "Cheers!" : "Здраво!", + "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>" : "Поштовање,<br><br>администратор је укључио шифровање на серверској страни. Ваши фајлови су шифровани лозинком <strong>%s</strong>.<br><br>Пријавите се на веб сучеље, идите на одељак 'основни модул за шифровање' у личним поставкама и ажурирајте своју лозинку за шифровање тако што унесете ову лозинку у поље 'стара лозинка за пријаву' и своју тренутну лозинку за пријављивање.<br><br>", "Default encryption module" : "Подразумевани модул за шифровање", - "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена, али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", - "Encrypt the home storage" : "Шифрујте Ваше главно складиште", - "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Укључивањем ове опције ћете шифровати све фајлове на главном складишту, а у супротном ће само фајловим на спољашњем складишту бити шифровани", + "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација за шифровање је укључена али кључеви још нису иницијализовани. Одјавите се и поново се пријавите.", + "Encrypt the home storage" : "Шифровање главног складишта", + "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Укључивање ове опције ће шифровати све фајлове на главном складишту. У супротном ће само фајлови на спољашњем складишту бити шифровани", "Enable recovery key" : "Омогући кључ за опоравак", "Disable recovery key" : "Онемогући кључ за опоравак", "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." : "Кључ за опоравак је додатни шифрарски кључ који се користи за шифровање фајлова. Он омогућава опоравак корисничких фајлова ако корисник заборави своју лозинку.", @@ -56,8 +56,8 @@ "Update Private Key Password" : "Ажурирај лозинку личног кључа", "Enable password recovery:" : "Укључи опоравак лозинке:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Укључивање ове опције омогућиће поновно добијање приступа вашим шифрованим фајловима у случају губитка лозинке", - "Enabled" : "Укључено", - "Disabled" : "Искључено", + "Enabled" : "укључено", + "Disabled" : "искључено", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Апликација шифровања је укључена али ваши кључеви нису иницијализовани. Одјавите се и поново се пријавите." },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/css/files.scss b/apps/files/css/files.scss index ef73f0800cb..a3beac152ce 100644 --- a/apps/files/css/files.scss +++ b/apps/files/css/files.scss @@ -752,7 +752,7 @@ table.dragshadow td.size { .quota-container { height: 5px; - border-radius: 3px; + border-radius: $border-radius; div { height: 100%; diff --git a/apps/files/js/files.js b/apps/files/js/files.js index cdc2e27a612..e34d7fe2550 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -96,7 +96,7 @@ */ isFileNameValid: function (name) { var trimmedName = name.trim(); - if (trimmedName === '.' || trimmedName === '..') + if (trimmedName === '.' || trimmedName === '..') { throw t('files', '"{name}" is an invalid file name.', {name: name}); } else if (trimmedName.length === 0) { diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 9574a557cd3..ee0e05e70fd 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -77,6 +77,7 @@ OC.L10N.register( "Favorite" : "Favoris", "New folder" : "Nouveau dossier", "Upload file" : "Téléverser un fichier", + "Not favorited" : "Non marqué comme favori", "Remove from favorites" : "Retirer des favoris", "Add to favorites" : "Ajouter aux favoris", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 21074489eec..990624b07f6 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -75,6 +75,7 @@ "Favorite" : "Favoris", "New folder" : "Nouveau dossier", "Upload file" : "Téléverser un fichier", + "Not favorited" : "Non marqué comme favori", "Remove from favorites" : "Retirer des favoris", "Add to favorites" : "Ajouter aux favoris", "An error occurred while trying to update the tags" : "Une erreur est survenue lors de la mise à jour des étiquettes", diff --git a/apps/sharebymail/l10n/el.js b/apps/sharebymail/l10n/el.js index 952d5245546..1cca5b74fb9 100644 --- a/apps/sharebymail/l10n/el.js +++ b/apps/sharebymail/l10n/el.js @@ -18,6 +18,7 @@ OC.L10N.register( "Password to access {file} was sent to you" : "Σας έχει αποσταλεί στο συνθηματικό για πρόσβαση {file}", "Sharing %s failed, this item is already shared with %s" : "Διαμοιρασμός %s απέτυχε, αυτό το αντικείμενο είναι ήδη διαμοιρασμένο με %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Δεν μπορούμε να σας στείλουμε αυτοδημιουργημένο συνθηματικό. Παρακαλούμε βάλτε μία έγκυρη διεύθυνση email στις προσωπικές σας ρυθμίσεις και προσπαθήστε ξανά.", + "Failed to send share by email" : "Αποτυχία αποστολής συνδέσμου διαμοιρασμού μέσω Ηλ.ταχυδρομείου", "%s shared »%s« with you" : "%s διαμοιρασμένα »%s« με σένα", "%s shared »%s« with you." : "%s διαμοιράστηκε »%s« με εσάς.", "Click the button below to open it." : "Κάντε κλικ στο παρακάτω κουμπί για να το ανοίξετε.", @@ -34,6 +35,7 @@ OC.L10N.register( "You can choose a different password at any time in the share dialog." : "Μπορείτε να διαλέξετε ένα διαφορετικό συνθηματικό οποιαδήποτε στιγμή στον διάλογο διαμοιρασμού.", "Could not find share" : "Αδυναμία εύρεσης κοινόχρηστου", "Share by mail" : "Διαμοιρασμός με ηλεκτρονική αλληλογραφία", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Να επιτρέπεται οι χρήστες να στέλνουν εξατομικευμένο σύνδεσμο σε ένα αρχείο ή φάκελο μέσω mail.", "Send password by mail" : "Αποστολή συνθηματικου με ηλεκτρονική αλληλογραφία", "Enforce password protection" : "Επιβάλετε προστασία συνθηματικού", "Failed to send share by E-mail" : "Αποτυχία αποστολής συνδέσμου διαμοιρασμού μέσω Ηλ.ταχυδρομείου", diff --git a/apps/sharebymail/l10n/el.json b/apps/sharebymail/l10n/el.json index f8d942c000f..432e4ca129a 100644 --- a/apps/sharebymail/l10n/el.json +++ b/apps/sharebymail/l10n/el.json @@ -16,6 +16,7 @@ "Password to access {file} was sent to you" : "Σας έχει αποσταλεί στο συνθηματικό για πρόσβαση {file}", "Sharing %s failed, this item is already shared with %s" : "Διαμοιρασμός %s απέτυχε, αυτό το αντικείμενο είναι ήδη διαμοιρασμένο με %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Δεν μπορούμε να σας στείλουμε αυτοδημιουργημένο συνθηματικό. Παρακαλούμε βάλτε μία έγκυρη διεύθυνση email στις προσωπικές σας ρυθμίσεις και προσπαθήστε ξανά.", + "Failed to send share by email" : "Αποτυχία αποστολής συνδέσμου διαμοιρασμού μέσω Ηλ.ταχυδρομείου", "%s shared »%s« with you" : "%s διαμοιρασμένα »%s« με σένα", "%s shared »%s« with you." : "%s διαμοιράστηκε »%s« με εσάς.", "Click the button below to open it." : "Κάντε κλικ στο παρακάτω κουμπί για να το ανοίξετε.", @@ -32,6 +33,7 @@ "You can choose a different password at any time in the share dialog." : "Μπορείτε να διαλέξετε ένα διαφορετικό συνθηματικό οποιαδήποτε στιγμή στον διάλογο διαμοιρασμού.", "Could not find share" : "Αδυναμία εύρεσης κοινόχρηστου", "Share by mail" : "Διαμοιρασμός με ηλεκτρονική αλληλογραφία", + "Allows users to share a personalized link to a file or folder by putting in an email address." : "Να επιτρέπεται οι χρήστες να στέλνουν εξατομικευμένο σύνδεσμο σε ένα αρχείο ή φάκελο μέσω mail.", "Send password by mail" : "Αποστολή συνθηματικου με ηλεκτρονική αλληλογραφία", "Enforce password protection" : "Επιβάλετε προστασία συνθηματικού", "Failed to send share by E-mail" : "Αποτυχία αποστολής συνδέσμου διαμοιρασμού μέσω Ηλ.ταχυδρομείου", diff --git a/autotest.sh b/autotest.sh index 307af64edb7..e7300363c3a 100755 --- a/autotest.sh +++ b/autotest.sh @@ -13,11 +13,10 @@ # @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu # -#$EXECUTOR_NUMBER is set by Jenkins and allows us to run autotest in parallel -DATABASENAME=oc_autotest$EXECUTOR_NUMBER -DATABASEUSER=oc_autotest$EXECUTOR_NUMBER +DATABASENAME=oc_autotest +DATABASEUSER=oc_autotest DATABASEHOST=localhost -ADMINLOGIN=admin$EXECUTOR_NUMBER +ADMINLOGIN=admin BASEDIR=$PWD PRIMARY_STORAGE_CONFIGS="local swift" diff --git a/core/css/apps.scss b/core/css/apps.scss index 159982e0bf1..06a105971bb 100644 --- a/core/css/apps.scss +++ b/core/css/apps.scss @@ -58,7 +58,7 @@ kbd { padding: 4px 10px; border: 1px solid #ccc; box-shadow: 0 1px 0 rgba(0, 0, 0, .2); - border-radius: 3px; + border-radius: $border-radius; display: inline-block; white-space: nowrap; } @@ -767,7 +767,7 @@ kbd { position: absolute; background-color: $color-main-background; color: $color-main-text; - border-radius: 3px; + border-radius: $border-radius; z-index: 110; margin: 5px; margin-top: -5px; diff --git a/core/css/header.scss b/core/css/header.scss index 1e5e2846723..364347fde81 100644 --- a/core/css/header.scss +++ b/core/css/header.scss @@ -206,7 +206,8 @@ nav { } #navigation, -.ui-datepicker { +.ui-datepicker, +.ui-timepicker.ui-widget { position: relative; left: -100%; width: 160px; @@ -223,7 +224,7 @@ nav { position: absolute; pointer-events: none; border-color: rgba(0, 0, 0, 0); - border-bottom-color: rgba(255, 255, 255, .97); + border-bottom-color: $color-main-background; border-width: 9px; margin-left: -9px; } @@ -481,7 +482,7 @@ nav { background-color: rgba($color-main-background, .97); white-space: nowrap; border: none; - border-radius: 3px; + border-radius: $border-radius; border-top-left-radius: 0; border-top-right-radius: 0; margin-top: 0; diff --git a/core/css/inputs.scss b/core/css/inputs.scss index 5143ec518ed..20e8cbf08e0 100644 --- a/core/css/inputs.scss +++ b/core/css/inputs.scss @@ -45,7 +45,7 @@ div[contenteditable=true], color: nc-lighten($color-main-text, 33%); border: 1px solid nc-darken($color-main-background, 14%); outline: none; - border-radius: 3px; + border-radius: $border-radius; cursor: text; &:not(:disabled):not(.primary) { &:hover, @@ -372,7 +372,7 @@ input { background: $color-main-background; color: nc-lighten($color-main-text, 33%); box-sizing: content-box; - border-radius: 3px; + border-radius: $border-radius; border: 1px solid nc-darken($color-main-background, 14%); margin: 0; padding: 2px 0; @@ -417,7 +417,7 @@ input { background: $color-main-background; color: nc-lighten($color-main-text, 33%); box-sizing: content-box; - border-radius: 3px; + border-radius: $border-radius; border: 1px solid nc-darken($color-main-background, 14%); margin: 0; padding: 2px 0; @@ -465,7 +465,7 @@ progress { padding: 0; border: 0 none; background-color: nc-darken($color-main-background, 10%); - border-radius: 3px; + border-radius: $border-radius; flex-basis: 100%; height: 5px; overflow: hidden; @@ -481,12 +481,12 @@ progress { background: transparent; } &::-moz-progress-bar { - border-radius: 3px; + border-radius: $border-radius; background: $color-primary; transition: 250ms all ease-in-out; } &::-webkit-progress-value { - border-radius: 3px; + border-radius: $border-radius; background: $color-primary; transition: 250ms all ease-in-out; } diff --git a/core/css/jquery.ocdialog.scss b/core/css/jquery.ocdialog.scss index 414443a5d3c..fa2d9772658 100644 --- a/core/css/jquery.ocdialog.scss +++ b/core/css/jquery.ocdialog.scss @@ -1,7 +1,7 @@ .oc-dialog { background: $color-main-background; color: nc-darken($color-main-text, 20%); - border-radius: 3px; + border-radius: $border-radius; box-shadow: 0 0 7px $color-box-shadow; padding: 15px; z-index: 10000; diff --git a/core/css/styles.scss b/core/css/styles.scss index d74840fe444..e5e0145cddb 100644 --- a/core/css/styles.scss +++ b/core/css/styles.scss @@ -166,7 +166,7 @@ body { ::-webkit-scrollbar-thumb { background: nc-darken($color-main-background, 14%); - border-radius: 3px; + border-radius: $border-radius; } /* Searchbox */ @@ -181,7 +181,7 @@ body { background: transparent url('../img/actions/search-white.svg?v=1') no-repeat 6px center; color: $color-primary-text; border: 0; - border-radius: 3px; + border-radius: $border-radius; margin-top: 3px; width: 0; cursor: pointer; @@ -648,7 +648,7 @@ label.infield { background-color: rgba($color-main-text, 0.3); color: $color-primary-text; text-align: left; - border-radius: 3px; + border-radius: $border-radius; cursor: default; } .update { @@ -675,7 +675,7 @@ label.infield { margin-top: 8px; padding: 5px; background: rgba($color-error, .15); - border-radius: 3px; + border-radius: $border-radius; } .warning { @@ -991,7 +991,7 @@ code { margin-top: 10px; padding: 4px 8px; width: auto; - border-radius: 3px; + border-radius: $border-radius; border: none; .ui-state-default, @@ -1070,6 +1070,75 @@ code { background: $color-main-background; } + +/* ---- jQuery UI timepicker ---- */ +.ui-widget.ui-timepicker { + margin-top: 10px !important; + width: auto !important; + border-radius: $border-radius; + + .ui-widget-content { + border: none !important; + } + + .ui-state-default, + .ui-widget-content .ui-state-default, + .ui-widget-header .ui-state-default { + border: 1px solid transparent; + background: inherit; + } + .ui-widget-header { + padding: 7px; + font-size: 13px; + border: none; + background-color: $color-main-background; + color: $color-main-text; + + .ui-timepicker-title { + line-height: 1; + font-weight: 300; + } + } + .ui-timepicker-table { + th { + font-weight: normal; + color: nc-lighten($color-main-text, 33%); + opacity: .8; + } + tr:hover { + background-color: inherit; + } + td { + > * { + border-radius: 50%; + text-align: center; + font-weight: normal; + color: $color-main-text; + padding: 8px 7px; + font-size: .9em; + line-height: 12px; + } + + &.ui-timepicker-hour-cell a.ui-state-active, + &.ui-timepicker-minute-cell a.ui-state-active, + .ui-state-hover, + .ui-state-focus { + background-color: $color-primary; + color: $color-primary-text; + font-weight: bold; + } + + &.ui-timepicker-minutes:not(.ui-state-hover) { + color: nc-lighten($color-main-text, 33%); + } + + &.ui-timepicker-hours { + border-right: 1px solid $color-border; + } + } + } +} + /* ---- DIALOGS ---- */ #oc-dialog-filepicker-content { diff --git a/core/css/tooltip.scss b/core/css/tooltip.scss index 05ff4b5d0f9..e9982b580ca 100644 --- a/core/css/tooltip.scss +++ b/core/css/tooltip.scss @@ -117,7 +117,7 @@ color: $color-main-text; box-shadow: 0 1px 10px $color-box-shadow; text-align: center; - border-radius: 3px; + border-radius: $border-radius; } .tooltip-arrow { diff --git a/core/css/variables.scss b/core/css/variables.scss index 26fd11a07d7..86a348c24f7 100644 --- a/core/css/variables.scss +++ b/core/css/variables.scss @@ -22,3 +22,4 @@ $color-loading: #969696; $color-loading-dark: #bbbbbb; $color-box-shadow: rgba(nc-darken($color-main-background, 30%), 0.75); $color-border: nc-darken($color-main-background, 8%); +$border-radius: 3px; diff --git a/core/js/js.js b/core/js/js.js index c02ef5c7920..1f84b40a35a 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1512,7 +1512,7 @@ function initCore() { var resizeMenu = function() { var appList = $('#appmenu li'); - var headerWidth = $('.header-left').width() - $('#nextcloud').width() + var headerWidth = $('.header-left').width() - $('#nextcloud').width(); var usePercentualAppMenuLimit = 0.33; var minAppsDesktop = 8; var availableWidth = headerWidth - $(appList).width(); diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index dd13cba8e2b..9848fb46ffc 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -256,10 +256,10 @@ describe('Core base tests', function() { describe('filePath', function() { beforeEach(function() { OC.webroot = 'http://localhost'; - OC.appswebroots['files'] = OC.webroot + '/apps3/files'; + OC.appswebroots.files = OC.webroot + '/apps3/files'; }); afterEach(function() { - delete OC.appswebroots['files']; + delete OC.appswebroots.files; }); it('Uses a direct link for css and images,' , function() { diff --git a/core/js/tests/specs/files/clientSpec.js b/core/js/tests/specs/files/clientSpec.js index f75998029a9..d66c209bca5 100644 --- a/core/js/tests/specs/files/clientSpec.js +++ b/core/js/tests/specs/files/clientSpec.js @@ -448,7 +448,7 @@ describe('OC.Files.Client tests', function() { expect(info.id).toEqual(11); // file entry - var info = response[1]; + info = response[1]; expect(info instanceof OC.Files.FileInfo).toEqual(true); expect(info.id).toEqual(51); diff --git a/core/js/tests/specs/jquery.avatarSpec.js b/core/js/tests/specs/jquery.avatarSpec.js index d7305736690..b9351d2a8a0 100644 --- a/core/js/tests/specs/jquery.avatarSpec.js +++ b/core/js/tests/specs/jquery.avatarSpec.js @@ -11,7 +11,7 @@ describe('jquery.avatar tests', function() { var $div; - var devicePixelRatio + var devicePixelRatio; beforeEach(function() { $('#testArea').append($('<div id="avatardiv">')); @@ -24,7 +24,7 @@ describe('jquery.avatar tests', function() { afterEach(function() { $div.remove(); - window.devicePixelRatio = devicePixelRatio + window.devicePixelRatio = devicePixelRatio; }); describe('size', function() { diff --git a/core/js/tests/specs/mimeTypeSpec.js b/core/js/tests/specs/mimeTypeSpec.js index 182941de1a9..8ad0300a0a7 100644 --- a/core/js/tests/specs/mimeTypeSpec.js +++ b/core/js/tests/specs/mimeTypeSpec.js @@ -26,17 +26,17 @@ describe('MimeType tests', function() { beforeEach(function() { _files = OC.MimeTypeList.files; _aliases = OC.MimeTypeList.aliases; - _theme = OC.MimeTypeList.themes['abc']; + _theme = OC.MimeTypeList.themes.abc; OC.MimeTypeList.files = ['folder', 'folder-shared', 'folder-external', 'foo-bar', 'foo', 'file']; OC.MimeTypeList.aliases = {'app/foobar': 'foo/bar'}; - OC.MimeTypeList.themes['abc'] = ['folder']; + OC.MimeTypeList.themes.abc = ['folder']; }); afterEach(function() { OC.MimeTypeList.files = _files; OC.MimeTypeList.aliases = _aliases; - OC.MimeTypeList.themes['abc'] = _theme; + OC.MimeTypeList.themes.abc = _theme; }); describe('_getFile', function() { @@ -109,9 +109,9 @@ describe('MimeType tests', function() { var res = OC.MimeType.getIconUrl('dir'); expect(Object.keys(OC.MimeType._mimeTypeIcons).length).toEqual(1); - expect(OC.MimeType._mimeTypeIcons['dir']).toEqual(res); + expect(OC.MimeType._mimeTypeIcons.dir).toEqual(res); - var res = OC.MimeType.getIconUrl('dir-shared'); + res = OC.MimeType.getIconUrl('dir-shared'); expect(Object.keys(OC.MimeType._mimeTypeIcons).length).toEqual(2); expect(OC.MimeType._mimeTypeIcons['dir-shared']).toEqual(res); }); diff --git a/core/js/tests/specs/sharedialoglinkshareview.js b/core/js/tests/specs/sharedialoglinkshareview.js index 811919b5603..12f5e762cee 100644 --- a/core/js/tests/specs/sharedialoglinkshareview.js +++ b/core/js/tests/specs/sharedialoglinkshareview.js @@ -48,7 +48,6 @@ describe('OC.Share.ShareDialogLinkShareView', function () { configModel = new OC.Share.ShareConfigModel({ enforcePasswordForPublicLink: false, isResharingAllowed: true, - enforcePasswordForPublicLink: false, isDefaultExpireDateEnabled: false, isDefaultExpireDateEnforced: false, defaultExpireDate: 7 diff --git a/core/js/tests/specs/sharedialogshareelistview.js b/core/js/tests/specs/sharedialogshareelistview.js index bcc596a1386..d256abcbffe 100644 --- a/core/js/tests/specs/sharedialogshareelistview.js +++ b/core/js/tests/specs/sharedialogshareelistview.js @@ -59,7 +59,6 @@ describe('OC.Share.ShareDialogShareeListView', function () { configModel = new OC.Share.ShareConfigModel({ enforcePasswordForPublicLink: false, isResharingAllowed: true, - enforcePasswordForPublicLink: false, isDefaultExpireDateEnabled: false, isDefaultExpireDateEnforced: false, defaultExpireDate: 7 diff --git a/core/js/tests/specs/sharedialogviewSpec.js b/core/js/tests/specs/sharedialogviewSpec.js index 95349bc4875..c6d5793623c 100644 --- a/core/js/tests/specs/sharedialogviewSpec.js +++ b/core/js/tests/specs/sharedialogviewSpec.js @@ -67,7 +67,6 @@ describe('OC.Share.ShareDialogView', function() { configModel = new OC.Share.ShareConfigModel({ enforcePasswordForPublicLink: false, isResharingAllowed: true, - enforcePasswordForPublicLink: false, isDefaultExpireDateEnabled: false, isDefaultExpireDateEnforced: false, defaultExpireDate: 7 diff --git a/core/l10n/de.js b/core/l10n/de.js index 96d6dd878a0..2f84324ce4e 100644 --- a/core/l10n/de.js +++ b/core/l10n/de.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "Shared" : "Geteilt", + "Shared with" : "Geteilt mit", + "Shared by" : "Geteilt von", "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen", "Set expiration date" : "Setze ein Ablaufdatum", diff --git a/core/l10n/de.json b/core/l10n/de.json index 3066596959a..a55fe4d5cf7 100644 --- a/core/l10n/de.json +++ b/core/l10n/de.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security\" HTTP-Header ist nicht auf mindestens \"{seconds}\" Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Du greifst auf diese Site über HTTP zu. Wir raten dringend dazu, deinen Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "Shared" : "Geteilt", + "Shared with" : "Geteilt mit", + "Shared by" : "Geteilt von", "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen", "Set expiration date" : "Setze ein Ablaufdatum", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 91bb5a23e45..5fcf1322690 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens \"{seconds}“ Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sie greifen auf diese Site über HTTP zu. Wir raten dringend dazu, Ihren Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "Shared" : "Geteilt", + "Shared with" : "Geteilt mit", + "Shared by" : "Geteilt von", "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen", "Set expiration date" : "Ein Ablaufdatum setzen", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index 09700b7bfa2..d3d521a84d4 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "Der \"Strict-Transport-Security“-HTTP-Header ist nicht auf mindestens \"{seconds}“ Sekunden eingestellt. Für mehr Sicherheit wird das Aktivieren von HSTS empfohlen, wie es in unseren <a href=\"{docUrl}\" rel=\"noreferrer\">Sicherheitshinweisen</a> erläutert ist.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sie greifen auf diese Site über HTTP zu. Wir raten dringend dazu, Ihren Server so zu konfigurieren, dass er stattdessen nur HTTPS akzeptiert, wie es in unseren <a href=\"{docUrl}\">Sicherheitshinweisen</a> beschrieben ist.", "Shared" : "Geteilt", + "Shared with" : "Geteilt mit", + "Shared by" : "Geteilt von", "Error setting expiration date" : "Fehler beim Setzen des Ablaufdatums", "The public link will expire no later than {days} days after it is created" : "Der öffentliche Link wird spätestens {days} Tage nach seiner Erstellung ablaufen", "Set expiration date" : "Ein Ablaufdatum setzen", diff --git a/core/l10n/en_GB.js b/core/l10n/en_GB.js index 8b9312e4284..7d236551b7c 100644 --- a/core/l10n/en_GB.js +++ b/core/l10n/en_GB.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>.", "Shared" : "Shared", + "Shared with" : "Shared with", + "Shared by" : "Shared by", "Error setting expiration date" : "Error setting expiration date", "The public link will expire no later than {days} days after it is created" : "The public link will expire no later than {days} days after it is created", "Set expiration date" : "Set expiration date", @@ -275,6 +277,7 @@ OC.L10N.register( "Alternative Logins" : "Alternative Logins", "Account access" : "Account access", "You are about to grant %s access to your %s account." : "You are about to grant %s access to your %s account.", + "Grant access" : "Grant access", "App token" : "App token", "Alternative login using app token" : "Alternative login using app token", "Redirecting …" : "Redirecting …", diff --git a/core/l10n/en_GB.json b/core/l10n/en_GB.json index 66bbbc67fe3..df3ea44e215 100644 --- a/core/l10n/en_GB.json +++ b/core/l10n/en_GB.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>.", "Shared" : "Shared", + "Shared with" : "Shared with", + "Shared by" : "Shared by", "Error setting expiration date" : "Error setting expiration date", "The public link will expire no later than {days} days after it is created" : "The public link will expire no later than {days} days after it is created", "Set expiration date" : "Set expiration date", @@ -273,6 +275,7 @@ "Alternative Logins" : "Alternative Logins", "Account access" : "Account access", "You are about to grant %s access to your %s account." : "You are about to grant %s access to your %s account.", + "Grant access" : "Grant access", "App token" : "App token", "Alternative login using app token" : "Alternative login using app token", "Redirecting …" : "Redirecting …", diff --git a/core/l10n/es.js b/core/l10n/es.js index cdf89bcd198..1eed97ee9cc 100644 --- a/core/l10n/es.js +++ b/core/l10n/es.js @@ -11,7 +11,7 @@ OC.L10N.register( "Invalid image" : "La imagen no es válida", "An error occurred. Please contact your admin." : "Ha ocurrido un error. Póngase en contacto con su administrador.", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", - "No crop data provided" : "No se proporcionó datos del recorte", + "No crop data provided" : "No se han proporcionado datos del recorte", "No valid crop data provided" : "Recorte inválido", "Crop is not square" : "El recorte no es cuadrado", "State token does not match" : "El token dado no coincide", @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{seconds}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como se describe en <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.", "Shared" : "Compartido", + "Shared with" : "Compartido con", + "Shared by" : "Compartido por", "Error setting expiration date" : "Error estableciendo fecha de caducidad", "The public link will expire no later than {days} days after it is created" : "El vínculo público no expirará antes de {days} desde que se creó", "Set expiration date" : "Establecer fecha de caducidad", @@ -193,7 +195,7 @@ OC.L10N.register( "Collaborative tags" : "Etiquetas colaborativas", "No tags found" : "No se encontraron etiquetas", "unknown text" : "texto desconocido", - "Hello world!" : "¡Hola mundo!", + "Hello world!" : "¡Hola, mundo!", "sunny" : "soleado", "Hello {name}, the weather is {weather}" : "Hola {name}, el día es {weather}", "Hello {name}" : "Hola {name}", @@ -263,7 +265,7 @@ OC.L10N.register( "Search" : "Buscar", "Reset search" : "Resetear búsqueda", "Confirm your password" : "Confirme su contraseña", - "Server side authentication failed!" : "La autenticación a fallado en el servidor.", + "Server side authentication failed!" : "La autenticación ha fallado en el servidor.", "Please contact your administrator." : "Por favor, contacte con el administrador.", "An internal error occurred." : "Ha habido un error interno.", "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", @@ -275,6 +277,7 @@ OC.L10N.register( "Alternative Logins" : "Inicios de sesión alternativos", "Account access" : "Acceso a la cuenta", "You are about to grant %s access to your %s account." : "Estás a punto de conceder a %s acceso a tu cuenta de %s", + "Grant access" : "Conceder acceso", "App token" : "Token de app", "Alternative login using app token" : "Login alternativo usando token de app", "Redirecting …" : "Redireccionando...", diff --git a/core/l10n/es.json b/core/l10n/es.json index 9c3837dbb54..de665e11a60 100644 --- a/core/l10n/es.json +++ b/core/l10n/es.json @@ -9,7 +9,7 @@ "Invalid image" : "La imagen no es válida", "An error occurred. Please contact your admin." : "Ha ocurrido un error. Póngase en contacto con su administrador.", "No temporary profile picture available, try again" : "No hay disponible una imagen temporal de perfil, pruebe de nuevo", - "No crop data provided" : "No se proporcionó datos del recorte", + "No crop data provided" : "No se han proporcionado datos del recorte", "No valid crop data provided" : "Recorte inválido", "Crop is not square" : "El recorte no es cuadrado", "State token does not match" : "El token dado no coincide", @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "La cabecera HTTP \"Strict-Transport-Security\" no está configurada en al menos \"{seconds}\" segundos. Para una mejor seguridad recomendamos que habilite HSTS como se describe en <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Está ingresando a este sitio de internet vía HTTP. Le sugerimos enérgicamente que configure su servidor que utilice HTTPS como se describe en nuestros <a href=\"{docUrl}\">consejos de seguridad</a>.", "Shared" : "Compartido", + "Shared with" : "Compartido con", + "Shared by" : "Compartido por", "Error setting expiration date" : "Error estableciendo fecha de caducidad", "The public link will expire no later than {days} days after it is created" : "El vínculo público no expirará antes de {days} desde que se creó", "Set expiration date" : "Establecer fecha de caducidad", @@ -191,7 +193,7 @@ "Collaborative tags" : "Etiquetas colaborativas", "No tags found" : "No se encontraron etiquetas", "unknown text" : "texto desconocido", - "Hello world!" : "¡Hola mundo!", + "Hello world!" : "¡Hola, mundo!", "sunny" : "soleado", "Hello {name}, the weather is {weather}" : "Hola {name}, el día es {weather}", "Hello {name}" : "Hola {name}", @@ -261,7 +263,7 @@ "Search" : "Buscar", "Reset search" : "Resetear búsqueda", "Confirm your password" : "Confirme su contraseña", - "Server side authentication failed!" : "La autenticación a fallado en el servidor.", + "Server side authentication failed!" : "La autenticación ha fallado en el servidor.", "Please contact your administrator." : "Por favor, contacte con el administrador.", "An internal error occurred." : "Ha habido un error interno.", "Please try again or contact your administrator." : "Por favor reintente nuevamente o contáctese con su administrador.", @@ -273,6 +275,7 @@ "Alternative Logins" : "Inicios de sesión alternativos", "Account access" : "Acceso a la cuenta", "You are about to grant %s access to your %s account." : "Estás a punto de conceder a %s acceso a tu cuenta de %s", + "Grant access" : "Conceder acceso", "App token" : "Token de app", "Alternative login using app token" : "Login alternativo usando token de app", "Redirecting …" : "Redireccionando...", diff --git a/core/l10n/fr.js b/core/l10n/fr.js index d7201277c25..a59aae8fe14 100644 --- a/core/l10n/fr.js +++ b/core/l10n/fr.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée à au moins \"{seconds}\" secondes. Pour renforcer la sécurité nous recommandons d'activer HSTS comme décrit dans nos <a href=\"{docUrl}\" rel=\"noreferrer\">conseils de sécurisation</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Vous accédez à ce site via HTTP. Nous vous recommandons fortement de configurer votre serveur pour forcer l'utilisation de HTTPS, comme expliqué dans nos <a href=\"{docUrl}\">conseils de sécurisation</a>.", "Shared" : "Partagé", + "Shared with" : "Partagé avec", + "Shared by" : "Partagé par", "Error setting expiration date" : "Erreur lors de la configuration de la date d'expiration", "The public link will expire no later than {days} days after it is created" : "Ce lien public expirera dans {days} jours après sa création.", "Set expiration date" : "Spécifier une date d'expiration", diff --git a/core/l10n/fr.json b/core/l10n/fr.json index b4da3c2da5b..853552f65d7 100644 --- a/core/l10n/fr.json +++ b/core/l10n/fr.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configurée à au moins \"{seconds}\" secondes. Pour renforcer la sécurité nous recommandons d'activer HSTS comme décrit dans nos <a href=\"{docUrl}\" rel=\"noreferrer\">conseils de sécurisation</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Vous accédez à ce site via HTTP. Nous vous recommandons fortement de configurer votre serveur pour forcer l'utilisation de HTTPS, comme expliqué dans nos <a href=\"{docUrl}\">conseils de sécurisation</a>.", "Shared" : "Partagé", + "Shared with" : "Partagé avec", + "Shared by" : "Partagé par", "Error setting expiration date" : "Erreur lors de la configuration de la date d'expiration", "The public link will expire no later than {days} days after it is created" : "Ce lien public expirera dans {days} jours après sa création.", "Set expiration date" : "Spécifier une date d'expiration", diff --git a/core/l10n/it.js b/core/l10n/it.js index 638c0415369..e269447c17c 100644 --- a/core/l10n/it.js +++ b/core/l10n/it.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore di almeno \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\" rel=\"noreferrer\">consigli sulla sicurezza</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sei connesso a questo sito tramite HTTP. Ti suggeriamo vivamente di configurare il tuo server per richiedere invece l'utilizzo del protocollo HTTPS, come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", "Shared" : "Condiviso", + "Shared with" : "Condiviso con", + "Shared by" : "Condiviso da", "Error setting expiration date" : "Errore durante l'impostazione della data di scadenza", "The public link will expire no later than {days} days after it is created" : "Il collegamento pubblico scadrà non più tardi di {days} giorni dopo la sua creazione", "Set expiration date" : "Imposta data di scadenza", diff --git a/core/l10n/it.json b/core/l10n/it.json index d9e13359da0..e768770df5a 100644 --- a/core/l10n/it.json +++ b/core/l10n/it.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "L'intestazione HTTP \"Strict-Transport-Security\" non è configurata con un valore di almeno \"{seconds}\" secondi. Per migliorare la sicurezza, consigliamo di abilitare HSTS come descritto nei nostri <a href=\"{docUrl}\" rel=\"noreferrer\">consigli sulla sicurezza</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Sei connesso a questo sito tramite HTTP. Ti suggeriamo vivamente di configurare il tuo server per richiedere invece l'utilizzo del protocollo HTTPS, come descritto nei nostri <a href=\"{docUrl}\">consigli sulla sicurezza</a>.", "Shared" : "Condiviso", + "Shared with" : "Condiviso con", + "Shared by" : "Condiviso da", "Error setting expiration date" : "Errore durante l'impostazione della data di scadenza", "The public link will expire no later than {days} days after it is created" : "Il collegamento pubblico scadrà non più tardi di {days} giorni dopo la sua creazione", "Set expiration date" : "Imposta data di scadenza", diff --git a/core/l10n/nl.js b/core/l10n/nl.js index e2a084664ee..1eb7149701d 100644 --- a/core/l10n/nl.js +++ b/core/l10n/nl.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd met minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze<a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Je bent met deze site verbonden over HTTP. We adviseren je dringend om je server zo te configureren dat HTTPS wordt vereist, zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", "Shared" : "Gedeeld", + "Shared with" : "Gedeeld met", + "Shared by" : "Gedeeld door", "Error setting expiration date" : "Fout tijdens het instellen van de vervaldatum", "The public link will expire no later than {days} days after it is created" : "De openbare link vervalt niet eerder dan {days} dagen na het aanmaken", "Set expiration date" : "Stel vervaldatum in", @@ -275,6 +277,7 @@ OC.L10N.register( "Alternative Logins" : "Alternatieve inlogs", "Account access" : "Account toegang", "You are about to grant %s access to your %s account." : "Je staat op het punt om %s toegang te verlenen to je %s account.", + "Grant access" : "Verleen toegang", "App token" : "App token", "Alternative login using app token" : "Alternatieve login doormiddel van app token", "Redirecting …" : "Omleiding ...", diff --git a/core/l10n/nl.json b/core/l10n/nl.json index fc1be0e1de9..7f494b23ecd 100644 --- a/core/l10n/nl.json +++ b/core/l10n/nl.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "De \"Strict-Transport-Security\" HTTP header is niet geconfigureerd met minimaal \"{seconds}\" seconden. Voor verbeterde beveiliging adviseren we HSTS in te schakelen zoals beschreven in onze<a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Je bent met deze site verbonden over HTTP. We adviseren je dringend om je server zo te configureren dat HTTPS wordt vereist, zoals beschreven in onze <a href=\"{docUrl}\">security tips</a>.", "Shared" : "Gedeeld", + "Shared with" : "Gedeeld met", + "Shared by" : "Gedeeld door", "Error setting expiration date" : "Fout tijdens het instellen van de vervaldatum", "The public link will expire no later than {days} days after it is created" : "De openbare link vervalt niet eerder dan {days} dagen na het aanmaken", "Set expiration date" : "Stel vervaldatum in", @@ -273,6 +275,7 @@ "Alternative Logins" : "Alternatieve inlogs", "Account access" : "Account toegang", "You are about to grant %s access to your %s account." : "Je staat op het punt om %s toegang te verlenen to je %s account.", + "Grant access" : "Verleen toegang", "App token" : "App token", "Alternative login using app token" : "Alternatieve login doormiddel van app token", "Redirecting …" : "Omleiding ...", diff --git a/core/l10n/pt_BR.js b/core/l10n/pt_BR.js index f5869233b7f..a65779148f4 100644 --- a/core/l10n/pt_BR.js +++ b/core/l10n/pt_BR.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{segundos}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nossas <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Você está acessando este site via HTTP. Sugerimos fortemente que você configure o servidor para exigir o uso de HTTPS como descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "Shared" : "Compartilhado", + "Shared with" : "Compartilhado com", + "Shared by" : "Compartilhado por", "Error setting expiration date" : "Erro ao definir data de expiração", "The public link will expire no later than {days} days after it is created" : "O link público irá expirar não antes de {days} depois de criado", "Set expiration date" : "Definir data de expiração", diff --git a/core/l10n/pt_BR.json b/core/l10n/pt_BR.json index 74ddcf617a9..99aab4785c5 100644 --- a/core/l10n/pt_BR.json +++ b/core/l10n/pt_BR.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "O cabeçalho HTTP \"Strict-Transport-Security\" não está configurado para pelo menos \"{segundos}\" segundos. Para maior segurança recomendamos a ativação HSTS como descrito em nossas <a href=\"{docUrl}\" rel=\"noreferrer\">dicas de segurança</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Você está acessando este site via HTTP. Sugerimos fortemente que você configure o servidor para exigir o uso de HTTPS como descrito em nossas <a href=\"{docUrl}\">dicas de segurança</a>.", "Shared" : "Compartilhado", + "Shared with" : "Compartilhado com", + "Shared by" : "Compartilhado por", "Error setting expiration date" : "Erro ao definir data de expiração", "The public link will expire no later than {days} days after it is created" : "O link público irá expirar não antes de {days} depois de criado", "Set expiration date" : "Definir data de expiração", diff --git a/core/l10n/sr.js b/core/l10n/sr.js index 8025d76179b..26ebd7156ee 100644 --- a/core/l10n/sr.js +++ b/core/l10n/sr.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\" HTTP заглавље није подешено да буде бар \"{seconds}\" секунди. За додатну сигурност, предлажемо да омогућите HSTS као што је описано у нашим <a href=\"{docUrl}\" rel=\"noreferrer\">сигурносним саветима</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Приступате овом сајту преко HTTP-а. Препоручујемо да подесите Ваш сервер да захтева HTTPS као што је описано у нашим <a href=\"{docUrl}\">безбедоносним саветима</a>.", "Shared" : "Дељено", + "Shared with" : "Дељено са", + "Shared by" : "Поделио", "Error setting expiration date" : "Грешка при постављању датума истека", "The public link will expire no later than {days} days after it is created" : "Јавна веза ће престати да важи {days} дана након стварања", "Set expiration date" : "Постави датум истека", @@ -275,6 +277,7 @@ OC.L10N.register( "Alternative Logins" : "Алтернативне пријаве", "Account access" : "Приступ налогу", "You are about to grant %s access to your %s account." : "Управо ћете одобрити %s приступ Вашем %s налогу.", + "Grant access" : "Одобри приступ", "App token" : "Апликативни жетон", "Alternative login using app token" : "Алтернативна пријава коришћењем апликативног жетона", "Redirecting …" : "Преусмеравање ...", diff --git a/core/l10n/sr.json b/core/l10n/sr.json index 4bcf9ace0b3..fe1912ac9ed 100644 --- a/core/l10n/sr.json +++ b/core/l10n/sr.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\" HTTP заглавље није подешено да буде бар \"{seconds}\" секунди. За додатну сигурност, предлажемо да омогућите HSTS као што је описано у нашим <a href=\"{docUrl}\" rel=\"noreferrer\">сигурносним саветима</a>.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Приступате овом сајту преко HTTP-а. Препоручујемо да подесите Ваш сервер да захтева HTTPS као што је описано у нашим <a href=\"{docUrl}\">безбедоносним саветима</a>.", "Shared" : "Дељено", + "Shared with" : "Дељено са", + "Shared by" : "Поделио", "Error setting expiration date" : "Грешка при постављању датума истека", "The public link will expire no later than {days} days after it is created" : "Јавна веза ће престати да важи {days} дана након стварања", "Set expiration date" : "Постави датум истека", @@ -273,6 +275,7 @@ "Alternative Logins" : "Алтернативне пријаве", "Account access" : "Приступ налогу", "You are about to grant %s access to your %s account." : "Управо ћете одобрити %s приступ Вашем %s налогу.", + "Grant access" : "Одобри приступ", "App token" : "Апликативни жетон", "Alternative login using app token" : "Алтернативна пријава коришћењем апликативног жетона", "Redirecting …" : "Преусмеравање ...", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index 400d1a1a472..735157af374 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -125,6 +125,8 @@ OC.L10N.register( "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\" HTTP üst bilgisi en azından\"{seconds}\" saniyedir yapılandırılmamış. Gelişmiş güvenlik sağlamak için <a href=\"{docUrl}\" rel=\"noreferrer\">güvenlik ipuçlarında</a> anlatıldığı şekilde HSTS özelliğinin etkinleştirilmesi önerilir.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Bu siteye HTTP üzerinde erişiyorsunuz. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarında</a> anlatıldığı şekilde HTTPS kullanımını zorlayacak şekilde yapılandırmanız önemle önerilir.", "Shared" : "Paylaşılmış", + "Shared with" : "Paylaşılanlar", + "Shared by" : "Paylaşan", "Error setting expiration date" : "Son kullanma tarihi ayarlanırken sorun çıktı", "The public link will expire no later than {days} days after it is created" : "Herkese açık bağlantı, oluşturulduktan {days} gün sonra kullanımdan kaldırılacak", "Set expiration date" : "Son kullanma tarihini ayarla", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 59e4de92e62..6f8d59c11ec 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -123,6 +123,8 @@ "The \"Strict-Transport-Security\" HTTP header is not configured to at least \"{seconds}\" seconds. For enhanced security we recommend enabling HSTS as described in our <a href=\"{docUrl}\" rel=\"noreferrer\">security tips</a>." : "\"Strict-Transport-Security\" HTTP üst bilgisi en azından\"{seconds}\" saniyedir yapılandırılmamış. Gelişmiş güvenlik sağlamak için <a href=\"{docUrl}\" rel=\"noreferrer\">güvenlik ipuçlarında</a> anlatıldığı şekilde HSTS özelliğinin etkinleştirilmesi önerilir.", "You are accessing this site via HTTP. We strongly suggest you configure your server to require using HTTPS instead as described in our <a href=\"{docUrl}\">security tips</a>." : "Bu siteye HTTP üzerinde erişiyorsunuz. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarında</a> anlatıldığı şekilde HTTPS kullanımını zorlayacak şekilde yapılandırmanız önemle önerilir.", "Shared" : "Paylaşılmış", + "Shared with" : "Paylaşılanlar", + "Shared by" : "Paylaşan", "Error setting expiration date" : "Son kullanma tarihi ayarlanırken sorun çıktı", "The public link will expire no later than {days} days after it is created" : "Herkese açık bağlantı, oluşturulduktan {days} gün sonra kullanımdan kaldırılacak", "Set expiration date" : "Son kullanma tarihini ayarla", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index 5a50a527131..3854b8d0090 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -2,11 +2,11 @@ OC.L10N.register( "lib", { "Cannot write into \"config\" directory!" : "No se puede escribir en la carpeta \"config\"", - "This can usually be fixed by giving the webserver write access to the config directory" : "Esto podría ser solucionado dándole al servidor permisos de escritura del directorio de configuración", + "This can usually be fixed by giving the webserver write access to the config directory" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración", "See %s" : "Ver %s", - "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Esto podría ser solucionado dándole al servidor permisos de escritura del directorio de configuración. Ver %s", + "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración. Ver %s", "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Los archivos de la aplicación %$1s no fueron reemplazados correctamente. Asegúrese que es una versión compatible con el servidor.", - "Sample configuration detected" : "Ejemplo de configuración detectado", + "Sample configuration detected" : "Configuración de ejemplo detectada", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Se ha detectado que el ejemplo de configuración ha sido copiado. Esto podría afectar a su instalación, por lo que no tiene soporte. Lea la documentación antes de hacer cambios en config.php", "%1$s and %2$s" : "%1$s y %2$s", "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", @@ -55,8 +55,8 @@ OC.L10N.register( "File name is too long" : "El nombre del archivo es demasiado largo", "Dot files are not allowed" : "Los archivos Dot no están permitidos", "Empty filename is not allowed" : "No se puede dejar el nombre en blanco.", - "App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.", - "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión del servidor.", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "No se puede instalar la app \"%s\" debido a que no se puede leer la información de la app.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "No se puede instalar la aplicación \"%s\" porque no es compatible con esta versión del servidor.", "This is an automatically sent email, please do not reply." : "Este es un correo enviado automáticamente, por favor no responda.", "Help" : "Ayuda", "Apps" : "Aplicaciones", @@ -65,7 +65,7 @@ OC.L10N.register( "Users" : "Usuarios", "APCu" : "APCu", "Redis" : "Redis", - "Basic settings" : "Ajustes Basicos", + "Basic settings" : "Ajustes básicos", "Sharing" : "Compartir", "Security" : "Seguridad", "Encryption" : "Cifrado", @@ -87,14 +87,14 @@ OC.L10N.register( "PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos", "You need to enter details of an existing account." : "Necesita ingresar detalles de una cuenta existente.", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ", - "For the best results, please consider using a GNU/Linux server instead." : "Para resultados óptimos, considere utilizar un servidor GNU/Linux.", + "For the best results, please consider using a GNU/Linux server instead." : "Para obtener los mejores resultados, considera utilizar un servidor GNU/Linux.", "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Parece que esta instancia %s está funcionando en un entorno PHP de 32-bits y el open_basedir se ha configurado en php.ini. Esto acarreará problemas con arhivos de tamaño superior a 4GB y resulta totalmente desaconsejado.", "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, quite el ajuste de open_basedir —dentro de su php.ini— o pásese a PHP de 64 bits.", "Set an admin username." : "Configurar un nombre de usuario del administrador", "Set an admin password." : "Configurar la contraseña del administrador.", "Can't create or write into the data directory %s" : "No es posible crear o escribir en el directorio de datos %s", "Given database host is invalid and must not contain the port: %s" : "El servidor de la base de datos dado es inválido y no debe contener el puerto: %s", - "Invalid Federated Cloud ID" : "ID Nube federada inválida", + "Invalid Federated Cloud ID" : "ID de Nube federada inválida", "Sharing %s failed, because the backend does not allow shares from type %i" : "No se pudo compartir %s porque el repositorio no permite recursos compartidos del tipo %i", "Sharing %s failed, because the file does not exist" : "No se pudo compartir %s porque el archivo no existe", "You are not allowed to share %s" : "Usted no está autorizado para compartir %s", @@ -108,8 +108,8 @@ OC.L10N.register( "You need to provide a password to create a public link, only protected links are allowed" : "Es necesario definir una contraseña para crear un enlace publico. Solo los enlaces protegidos están permitidos", "Sharing %s failed, because sharing with links is not allowed" : "Se falló al compartir %s, ya que no está permitida la compartición con enlaces", "Not allowed to create a federated share with the same user" : "No se permite crear un recurso compartido federado con el mismo usuario", - "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor.", - "Share type %s is not valid for %s" : "Compartir tipo %s no es válido para %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallo al compartir %s. No se ha podido encontrar %s, quizás haya un problema de conexión con el servidor.", + "Share type %s is not valid for %s" : "El tipo de recurso compartido %s no es válido para %s", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar más tarde de %s de ser compartidos", "Cannot set expiration date. Expiration date is in the past" : "No se puede fijar la fecha de caducidad. La fecha de caducidad está en el pasado.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend", @@ -153,18 +153,18 @@ OC.L10N.register( "Th" : "Ju", "Fr" : "Vi", "Sa" : "Sa", - "January" : "Enero", - "February" : "Febrero", - "March" : "Marzo", - "April" : "Abril", - "May" : "Mayo", - "June" : "Junio", - "July" : "Julio", - "August" : "Agosto", - "September" : "Septiembre", - "October" : "Octubre", - "November" : "Noviembre", - "December" : "Diciembre", + "January" : "enero", + "February" : "febrero", + "March" : "marzo", + "April" : "abril", + "May" : "mayo", + "June" : "junio", + "July" : "julio", + "August" : "agosto", + "September" : "septiembre", + "October" : "octubre", + "November" : "noviembre", + "December" : "diciembre", "Jan." : "Ene.", "Feb." : "Feb.", "Mar." : "Mar.", @@ -186,11 +186,11 @@ OC.L10N.register( "Could not create user" : "No se ha podido crear el usuario", "User disabled" : "Usuario deshabilitado", "Login canceled by app" : "Login cancelado por la app", - "No app name specified" : "No se ha especificado nombre de la aplicación", - "App '%s' could not be installed!" : "¡No se pudo instalar la app '%s'!", + "No app name specified" : "No se ha especificado el nombre de la app", + "App '%s' could not be installed!" : "¡No se ha podido instalar la app '%s'!", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", "a safe home for all your data" : "un hogar seguro para todos tus datos", - "File is currently busy, please try again later" : "Archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde", + "File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde", "Can't read file" : "No se puede leer archivo", "Application is not enabled" : "La aplicación no está habilitada", "Authentication error" : "Error de autenticación", @@ -200,7 +200,7 @@ OC.L10N.register( "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Habitualmente, esto puede arreglarse dando al servidor web acceso de escritura al directorio de apps o desactivando la tienda de apps en el archivo de configuración. Véase %s", - "Cannot create \"data\" directory" : "No es posible crear el directorio \"data\"", + "Cannot create \"data\" directory" : "No se puede crear el directorio \"data\"", "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Habitualmente, esto puede arreglarse dando al servidor web acceso de escritura al directorio raíz. Véase %s", "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Habitualmente, los permisos pueden arreglarse dando al servidor web acceso de escritura al directorio raíz. Véase %s", "Setting locale to %s failed" : "Falló la activación del idioma %s ", @@ -219,11 +219,11 @@ OC.L10N.register( "Please ask your server administrator to restart the web server." : "Consulte al administrador de su servidor para reiniciar el servidor web.", "PostgreSQL >= 9 required" : "PostgreSQL 9 o superior requerido.", "Please upgrade your database version" : "Actualice su versión de base de datos.", - "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor cambie los permisos a 0770 para que el directorio no se pueda mostrar para otros usuarios.", - "Your data directory is readable by other users" : "Su directorio data es leible por otros usuarios", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, cambia los permisos a 0770 para que el directorio no se pueda mostrar a otros usuarios.", + "Your data directory is readable by other users" : "Tu directorio de datos puede ser leído por otros usuarios", "Your data directory must be an absolute path" : "Su directorio data debe ser una ruta absoluta", "Check the value of \"datadirectory\" in your configuration" : "Compruebe el valor de \"datadirectory\" en su configuración.", - "Your data directory is invalid" : "Su directorio de datos es inválido", + "Your data directory is invalid" : "Tu directorio de datos es inválido", "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Asegúrate de que existe un archivo llamado \".ocdata\" en la raíz del directorio de datos.", "Could not obtain lock type %d on \"%s\"." : "No se pudo realizar el bloqueo %d en \"%s\".", "Storage unauthorized. %s" : "Almacenamiento no autorizado. %s", @@ -232,7 +232,7 @@ OC.L10N.register( "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Esto puede solucionarse fácilmente %sotorgándole permisos de escritura al directorio de configuración%s.", - "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Módulo con id: %s no existe. Por favor habilítelo en los ajustes de sus aplicaciones o contáctese con su administrador.", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "El módulo con id: %s no existe. Por favor habilítelo en los ajustes de sus aplicaciones o contáctese con su administrador.", "Server settings" : "Configuración del servidor", "DB Error: \"%s\"" : "Error BD: \"%s\"", "Offending command was: \"%s\"" : "Comando infractor: \"%s\"", @@ -248,9 +248,9 @@ OC.L10N.register( "Personal" : "Personal", "Admin" : "Administración", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto puede solucionarse fácilmente %sdándole permisos de escritura al servidor en el directorio%s de apps o deshabilitando la tienda de apps en el archivo de configuración.", - "Cannot create \"data\" directory (%s)" : "No puedo crear del directorio \"data\" (%s)", + "Cannot create \"data\" directory (%s)" : "No se puede crear el directorio \"data\" (%s)", "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Normalmente esto se puede solucionar <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dándole al servidor web permisos de escritura en todo el directorio o el directorio 'root'</a>", - "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Los permisos normalmente puede solucionarse %sdándole al servidor permisos de escritura del directorio raíz%s.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Los permisos normalmente pueden arreglarse %sdándole al servidor permisos de escritura del directorio raíz%s.", "Data directory (%s) is readable by other users" : "El directorio de datos (%s) se puede leer por otros usuarios.", "Data directory (%s) must be an absolute path" : "El directorio de datos (%s) debe ser una ruta absoluta", "Data directory (%s) is invalid" : "El directorio de datos (%s) no es válido", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index c8ec965fcfe..bf00e20c329 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -1,10 +1,10 @@ { "translations": { "Cannot write into \"config\" directory!" : "No se puede escribir en la carpeta \"config\"", - "This can usually be fixed by giving the webserver write access to the config directory" : "Esto podría ser solucionado dándole al servidor permisos de escritura del directorio de configuración", + "This can usually be fixed by giving the webserver write access to the config directory" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración", "See %s" : "Ver %s", - "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Esto podría ser solucionado dándole al servidor permisos de escritura del directorio de configuración. Ver %s", + "This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración. Ver %s", "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Los archivos de la aplicación %$1s no fueron reemplazados correctamente. Asegúrese que es una versión compatible con el servidor.", - "Sample configuration detected" : "Ejemplo de configuración detectado", + "Sample configuration detected" : "Configuración de ejemplo detectada", "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Se ha detectado que el ejemplo de configuración ha sido copiado. Esto podría afectar a su instalación, por lo que no tiene soporte. Lea la documentación antes de hacer cambios en config.php", "%1$s and %2$s" : "%1$s y %2$s", "%1$s, %2$s and %3$s" : "%1$s, %2$s y %3$s", @@ -53,8 +53,8 @@ "File name is too long" : "El nombre del archivo es demasiado largo", "Dot files are not allowed" : "Los archivos Dot no están permitidos", "Empty filename is not allowed" : "No se puede dejar el nombre en blanco.", - "App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.", - "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión del servidor.", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "No se puede instalar la app \"%s\" debido a que no se puede leer la información de la app.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "No se puede instalar la aplicación \"%s\" porque no es compatible con esta versión del servidor.", "This is an automatically sent email, please do not reply." : "Este es un correo enviado automáticamente, por favor no responda.", "Help" : "Ayuda", "Apps" : "Aplicaciones", @@ -63,7 +63,7 @@ "Users" : "Usuarios", "APCu" : "APCu", "Redis" : "Redis", - "Basic settings" : "Ajustes Basicos", + "Basic settings" : "Ajustes básicos", "Sharing" : "Compartir", "Security" : "Seguridad", "Encryption" : "Cifrado", @@ -85,14 +85,14 @@ "PostgreSQL username and/or password not valid" : "Usuario y/o contraseña de PostgreSQL no válidos", "You need to enter details of an existing account." : "Necesita ingresar detalles de una cuenta existente.", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X no está soportado y %s no funcionará bien en esta plataforma. ¡Úsela bajo su propio riesgo! ", - "For the best results, please consider using a GNU/Linux server instead." : "Para resultados óptimos, considere utilizar un servidor GNU/Linux.", + "For the best results, please consider using a GNU/Linux server instead." : "Para obtener los mejores resultados, considera utilizar un servidor GNU/Linux.", "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Parece que esta instancia %s está funcionando en un entorno PHP de 32-bits y el open_basedir se ha configurado en php.ini. Esto acarreará problemas con arhivos de tamaño superior a 4GB y resulta totalmente desaconsejado.", "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, quite el ajuste de open_basedir —dentro de su php.ini— o pásese a PHP de 64 bits.", "Set an admin username." : "Configurar un nombre de usuario del administrador", "Set an admin password." : "Configurar la contraseña del administrador.", "Can't create or write into the data directory %s" : "No es posible crear o escribir en el directorio de datos %s", "Given database host is invalid and must not contain the port: %s" : "El servidor de la base de datos dado es inválido y no debe contener el puerto: %s", - "Invalid Federated Cloud ID" : "ID Nube federada inválida", + "Invalid Federated Cloud ID" : "ID de Nube federada inválida", "Sharing %s failed, because the backend does not allow shares from type %i" : "No se pudo compartir %s porque el repositorio no permite recursos compartidos del tipo %i", "Sharing %s failed, because the file does not exist" : "No se pudo compartir %s porque el archivo no existe", "You are not allowed to share %s" : "Usted no está autorizado para compartir %s", @@ -106,8 +106,8 @@ "You need to provide a password to create a public link, only protected links are allowed" : "Es necesario definir una contraseña para crear un enlace publico. Solo los enlaces protegidos están permitidos", "Sharing %s failed, because sharing with links is not allowed" : "Se falló al compartir %s, ya que no está permitida la compartición con enlaces", "Not allowed to create a federated share with the same user" : "No se permite crear un recurso compartido federado con el mismo usuario", - "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Se falló al compartir %s. No se pudo hallar %s, quizás haya un problema de conexión con el servidor.", - "Share type %s is not valid for %s" : "Compartir tipo %s no es válido para %s", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Fallo al compartir %s. No se ha podido encontrar %s, quizás haya un problema de conexión con el servidor.", + "Share type %s is not valid for %s" : "El tipo de recurso compartido %s no es válido para %s", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "No se puede fijar fecha de caducidad. Los archivos compartidos no pueden caducar más tarde de %s de ser compartidos", "Cannot set expiration date. Expiration date is in the past" : "No se puede fijar la fecha de caducidad. La fecha de caducidad está en el pasado.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartido %s debe implementar la interfaz OCP\\Share_Backend", @@ -151,18 +151,18 @@ "Th" : "Ju", "Fr" : "Vi", "Sa" : "Sa", - "January" : "Enero", - "February" : "Febrero", - "March" : "Marzo", - "April" : "Abril", - "May" : "Mayo", - "June" : "Junio", - "July" : "Julio", - "August" : "Agosto", - "September" : "Septiembre", - "October" : "Octubre", - "November" : "Noviembre", - "December" : "Diciembre", + "January" : "enero", + "February" : "febrero", + "March" : "marzo", + "April" : "abril", + "May" : "mayo", + "June" : "junio", + "July" : "julio", + "August" : "agosto", + "September" : "septiembre", + "October" : "octubre", + "November" : "noviembre", + "December" : "diciembre", "Jan." : "Ene.", "Feb." : "Feb.", "Mar." : "Mar.", @@ -184,11 +184,11 @@ "Could not create user" : "No se ha podido crear el usuario", "User disabled" : "Usuario deshabilitado", "Login canceled by app" : "Login cancelado por la app", - "No app name specified" : "No se ha especificado nombre de la aplicación", - "App '%s' could not be installed!" : "¡No se pudo instalar la app '%s'!", + "No app name specified" : "No se ha especificado el nombre de la app", + "App '%s' could not be installed!" : "¡No se ha podido instalar la app '%s'!", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "La app \"%s\" no puede instalarse porque las siguientes dependencias no están cumplimentadas: %s", "a safe home for all your data" : "un hogar seguro para todos tus datos", - "File is currently busy, please try again later" : "Archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde", + "File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde", "Can't read file" : "No se puede leer archivo", "Application is not enabled" : "La aplicación no está habilitada", "Authentication error" : "Error de autenticación", @@ -198,7 +198,7 @@ "Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración", "Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"", "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Habitualmente, esto puede arreglarse dando al servidor web acceso de escritura al directorio de apps o desactivando la tienda de apps en el archivo de configuración. Véase %s", - "Cannot create \"data\" directory" : "No es posible crear el directorio \"data\"", + "Cannot create \"data\" directory" : "No se puede crear el directorio \"data\"", "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Habitualmente, esto puede arreglarse dando al servidor web acceso de escritura al directorio raíz. Véase %s", "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Habitualmente, los permisos pueden arreglarse dando al servidor web acceso de escritura al directorio raíz. Véase %s", "Setting locale to %s failed" : "Falló la activación del idioma %s ", @@ -217,11 +217,11 @@ "Please ask your server administrator to restart the web server." : "Consulte al administrador de su servidor para reiniciar el servidor web.", "PostgreSQL >= 9 required" : "PostgreSQL 9 o superior requerido.", "Please upgrade your database version" : "Actualice su versión de base de datos.", - "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor cambie los permisos a 0770 para que el directorio no se pueda mostrar para otros usuarios.", - "Your data directory is readable by other users" : "Su directorio data es leible por otros usuarios", + "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, cambia los permisos a 0770 para que el directorio no se pueda mostrar a otros usuarios.", + "Your data directory is readable by other users" : "Tu directorio de datos puede ser leído por otros usuarios", "Your data directory must be an absolute path" : "Su directorio data debe ser una ruta absoluta", "Check the value of \"datadirectory\" in your configuration" : "Compruebe el valor de \"datadirectory\" en su configuración.", - "Your data directory is invalid" : "Su directorio de datos es inválido", + "Your data directory is invalid" : "Tu directorio de datos es inválido", "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Asegúrate de que existe un archivo llamado \".ocdata\" en la raíz del directorio de datos.", "Could not obtain lock type %d on \"%s\"." : "No se pudo realizar el bloqueo %d en \"%s\".", "Storage unauthorized. %s" : "Almacenamiento no autorizado. %s", @@ -230,7 +230,7 @@ "Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente", "Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s", "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Esto puede solucionarse fácilmente %sotorgándole permisos de escritura al directorio de configuración%s.", - "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Módulo con id: %s no existe. Por favor habilítelo en los ajustes de sus aplicaciones o contáctese con su administrador.", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "El módulo con id: %s no existe. Por favor habilítelo en los ajustes de sus aplicaciones o contáctese con su administrador.", "Server settings" : "Configuración del servidor", "DB Error: \"%s\"" : "Error BD: \"%s\"", "Offending command was: \"%s\"" : "Comando infractor: \"%s\"", @@ -246,9 +246,9 @@ "Personal" : "Personal", "Admin" : "Administración", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto puede solucionarse fácilmente %sdándole permisos de escritura al servidor en el directorio%s de apps o deshabilitando la tienda de apps en el archivo de configuración.", - "Cannot create \"data\" directory (%s)" : "No puedo crear del directorio \"data\" (%s)", + "Cannot create \"data\" directory (%s)" : "No se puede crear el directorio \"data\" (%s)", "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Normalmente esto se puede solucionar <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">dándole al servidor web permisos de escritura en todo el directorio o el directorio 'root'</a>", - "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Los permisos normalmente puede solucionarse %sdándole al servidor permisos de escritura del directorio raíz%s.", + "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Los permisos normalmente pueden arreglarse %sdándole al servidor permisos de escritura del directorio raíz%s.", "Data directory (%s) is readable by other users" : "El directorio de datos (%s) se puede leer por otros usuarios.", "Data directory (%s) must be an absolute path" : "El directorio de datos (%s) debe ser una ruta absoluta", "Data directory (%s) is invalid" : "El directorio de datos (%s) no es válido", diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js index fdb80d90c3c..6cac8d6837e 100644 --- a/lib/l10n/nl.js +++ b/lib/l10n/nl.js @@ -31,14 +31,23 @@ OC.L10N.register( "Invalid image" : "Ongeldige afbeelding", "Avatar image is not square" : "Avatar afbeelding is niet vierkant", "today" : "vandaag", + "tomorrow" : "morgen", "yesterday" : "gisteren", + "_in %n day_::_in %n days_" : ["over %n dag","over %n dagen"], "_%n day ago_::_%n days ago_" : ["%n dag geleden","%n dagen geleden"], + "next month" : "volgende maand", "last month" : "vorige maand", + "_in %n month_::_in %n months_" : ["over %n maand","over %n maanden"], "_%n month ago_::_%n months ago_" : ["%n maand geleden","%n maanden geleden"], + "next year" : "volgend jaar", "last year" : "vorig jaar", + "_in %n year_::_in %n years_" : ["over %n jaar","over %n jaar"], "_%n year ago_::_%n years ago_" : ["%n jaar geleden","%n jaren geleden"], + "_in %n hour_::_in %n hours_" : ["over %n uur","over %n uur"], "_%n hour ago_::_%n hours ago_" : ["%n uur geleden","%n uren geleden"], + "_in %n minute_::_in %n minutes_" : ["over %n minuut","over %n minuten"], "_%n minute ago_::_%n minutes ago_" : ["%n minuut geleden","%n minuten geleden"], + "in a few seconds" : "over een paar seconden", "seconds ago" : "seconden geleden", "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Module met ID: %s bestaat niet. Schakel die in binnen de app-instellingen of neem contact op met je beheerder.", "File name is a reserved word" : "Bestandsnaam is een gereserveerd woord", @@ -84,6 +93,7 @@ OC.L10N.register( "Set an admin username." : "Stel de gebruikersnaam van de beheerder in.", "Set an admin password." : "Stel een beheerders wachtwoord in.", "Can't create or write into the data directory %s" : "Kan niets creëren of wegschrijven in de datadirectory %s", + "Given database host is invalid and must not contain the port: %s" : "Opgegeven database host is ongeldig en mag niet de volgende poort bevatten: %s", "Invalid Federated Cloud ID" : "Ongeldige gefedereerde Cloud ID", "Sharing %s failed, because the backend does not allow shares from type %i" : "Delen van %s is mislukt, omdat de share-backend het niet toestaat om type %i te delen", "Sharing %s failed, because the file does not exist" : "Delen van %s is mislukt, omdat het bestand niet bestaat", diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json index a29b43d8596..a22366d8345 100644 --- a/lib/l10n/nl.json +++ b/lib/l10n/nl.json @@ -29,14 +29,23 @@ "Invalid image" : "Ongeldige afbeelding", "Avatar image is not square" : "Avatar afbeelding is niet vierkant", "today" : "vandaag", + "tomorrow" : "morgen", "yesterday" : "gisteren", + "_in %n day_::_in %n days_" : ["over %n dag","over %n dagen"], "_%n day ago_::_%n days ago_" : ["%n dag geleden","%n dagen geleden"], + "next month" : "volgende maand", "last month" : "vorige maand", + "_in %n month_::_in %n months_" : ["over %n maand","over %n maanden"], "_%n month ago_::_%n months ago_" : ["%n maand geleden","%n maanden geleden"], + "next year" : "volgend jaar", "last year" : "vorig jaar", + "_in %n year_::_in %n years_" : ["over %n jaar","over %n jaar"], "_%n year ago_::_%n years ago_" : ["%n jaar geleden","%n jaren geleden"], + "_in %n hour_::_in %n hours_" : ["over %n uur","over %n uur"], "_%n hour ago_::_%n hours ago_" : ["%n uur geleden","%n uren geleden"], + "_in %n minute_::_in %n minutes_" : ["over %n minuut","over %n minuten"], "_%n minute ago_::_%n minutes ago_" : ["%n minuut geleden","%n minuten geleden"], + "in a few seconds" : "over een paar seconden", "seconds ago" : "seconden geleden", "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Module met ID: %s bestaat niet. Schakel die in binnen de app-instellingen of neem contact op met je beheerder.", "File name is a reserved word" : "Bestandsnaam is een gereserveerd woord", @@ -82,6 +91,7 @@ "Set an admin username." : "Stel de gebruikersnaam van de beheerder in.", "Set an admin password." : "Stel een beheerders wachtwoord in.", "Can't create or write into the data directory %s" : "Kan niets creëren of wegschrijven in de datadirectory %s", + "Given database host is invalid and must not contain the port: %s" : "Opgegeven database host is ongeldig en mag niet de volgende poort bevatten: %s", "Invalid Federated Cloud ID" : "Ongeldige gefedereerde Cloud ID", "Sharing %s failed, because the backend does not allow shares from type %i" : "Delen van %s is mislukt, omdat de share-backend het niet toestaat om type %i te delen", "Sharing %s failed, because the file does not exist" : "Delen van %s is mislukt, omdat het bestand niet bestaat", diff --git a/lib/private/L10N/L10N.php b/lib/private/L10N/L10N.php index 620c99dd1ec..19db04a7cd4 100644 --- a/lib/private/L10N/L10N.php +++ b/lib/private/L10N/L10N.php @@ -169,6 +169,8 @@ class L10N implements IL10N { return (string) Calendar::formatDatetime($value, $width, $locale); case 'time': return (string) Calendar::formatTime($value, $width, $locale); + case 'weekdayName': + return (string) Calendar::getWeekdayName($value, $width, $locale); default: return false; } diff --git a/settings/css/settings.scss b/settings/css/settings.scss index a610b7d2df5..a5d7eab6a30 100644 --- a/settings/css/settings.scss +++ b/settings/css/settings.scss @@ -85,7 +85,7 @@ input { transform: translate(-50%, -50%); background: #fff; color: #333; - border-radius: 3px; + border-radius: $border-radius; box-shadow: 0 0 7px #888; padding: 15px; .jcrop-holder { @@ -716,7 +716,7 @@ span.version { color: #555; background-color: transparent; border: 1px solid #555; - border-radius: 3px; + border-radius: $border-radius; padding: 3px 6px; } a { @@ -1103,7 +1103,7 @@ table.grid td.date { span { &.success { background: #37ce02; - border-radius: 3px; + border-radius: $border-radius; } &.error { background: #ce3702; diff --git a/settings/l10n/es.js b/settings/l10n/es.js index d36e8e97335..a1f35d0bb7b 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -14,7 +14,7 @@ OC.L10N.register( "Your apps" : "Tus apps", "Updates" : "Actualizaciones", "Enabled apps" : "Apps habilitadas", - "Disabled apps" : "Apps inhabilitadas", + "Disabled apps" : "Apps deshabilitadas", "App bundles" : "Lotes de apps", "Wrong password" : "Contraseña incorrecta", "Saved" : "Guardado", @@ -34,10 +34,10 @@ OC.L10N.register( "Unable to delete group." : "No se pudo eliminar el grupo.", "Invalid SMTP password." : "Contraseña SMTP inválida", "Email setting test" : "Prueba de configuración de correo", - "Well done, %s!" : "Bien hecho, %s!", + "Well done, %s!" : "¡Bien hecho, %s!", "If you received this email, the email configuration seems to be correct." : "Si recibe este correo, la configuración de correo parece ser correcta.", "Email could not be sent. Check your mail server log" : "No se ha podido enviar el correo. Comprueba el registro del servidor de correo", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocurrió un problema al enviar el mensaje de correo electrónico. Revise su configuración. (Error: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ha ocurrido un problema al enviar el mensaje de correo electrónico. Revisa tu configuración. (Error: %s)", "You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.", "Invalid mail address" : "Dirección de correo inválida", "No valid group selected" : "No se ha seleccionado un grupo válido", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 0a9ac45667c..9b6a508c5d4 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -12,7 +12,7 @@ "Your apps" : "Tus apps", "Updates" : "Actualizaciones", "Enabled apps" : "Apps habilitadas", - "Disabled apps" : "Apps inhabilitadas", + "Disabled apps" : "Apps deshabilitadas", "App bundles" : "Lotes de apps", "Wrong password" : "Contraseña incorrecta", "Saved" : "Guardado", @@ -32,10 +32,10 @@ "Unable to delete group." : "No se pudo eliminar el grupo.", "Invalid SMTP password." : "Contraseña SMTP inválida", "Email setting test" : "Prueba de configuración de correo", - "Well done, %s!" : "Bien hecho, %s!", + "Well done, %s!" : "¡Bien hecho, %s!", "If you received this email, the email configuration seems to be correct." : "Si recibe este correo, la configuración de correo parece ser correcta.", "Email could not be sent. Check your mail server log" : "No se ha podido enviar el correo. Comprueba el registro del servidor de correo", - "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ocurrió un problema al enviar el mensaje de correo electrónico. Revise su configuración. (Error: %s)", + "A problem occurred while sending the email. Please revise your settings. (Error: %s)" : "Ha ocurrido un problema al enviar el mensaje de correo electrónico. Revisa tu configuración. (Error: %s)", "You need to set your user email before being able to send test emails." : "Tiene que configurar su dirección de correo electrónico antes de poder enviar mensajes de prueba.", "Invalid mail address" : "Dirección de correo inválida", "No valid group selected" : "No se ha seleccionado un grupo válido", diff --git a/tests/lib/L10N/L10nTest.php b/tests/lib/L10N/L10nTest.php index 6d662efee23..703aa9e227c 100644 --- a/tests/lib/L10N/L10nTest.php +++ b/tests/lib/L10N/L10nTest.php @@ -164,4 +164,9 @@ class L10nTest extends TestCase { $l = \OC::$server->getL10N('lib', 'de'); $this->assertEquals('de', $l->getLanguageCode()); } + + public function testWeekdayName() { + $l = \OC::$server->getL10N('lib', 'de'); + $this->assertEquals('Mo.', $l->l('weekdayName', new \DateTime('2017-11-6'), ['width' => 'abbreviated'])); + } } |