mirror of
https://github.com/nextcloud/server.git
synced 2026-04-22 14:50:17 -04:00
Merge branch 'master' into patch-1
This commit is contained in:
commit
1396f76b73
781 changed files with 10203 additions and 6663 deletions
2
3rdparty
2
3rdparty
|
|
@ -1 +1 @@
|
|||
Subproject commit 99ab30df290ed5b610aec5d9b9f8dad4778a7709
|
||||
Subproject commit d93b7897adea5f63ba096a9a49b7c3f8167788df
|
||||
|
|
@ -10,7 +10,7 @@
|
|||
<name>WebDAV</name>
|
||||
<summary>WebDAV endpoint</summary>
|
||||
<description>WebDAV endpoint</description>
|
||||
<version>1.34.0</version>
|
||||
<version>1.34.1</version>
|
||||
<licence>agpl</licence>
|
||||
<author>owncloud.org</author>
|
||||
<namespace>DAV</namespace>
|
||||
|
|
|
|||
|
|
@ -216,6 +216,8 @@ return array(
|
|||
'OCA\\DAV\\Connector\\Sabre\\Node' => $baseDir . '/../lib/Connector/Sabre/Node.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => $baseDir . '/../lib/Connector/Sabre/ObjectTree.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\Principal' => $baseDir . '/../lib/Connector/Sabre/Principal.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropFindMonitorPlugin' => $baseDir . '/../lib/Connector/Sabre/PropFindMonitorPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropFindPreloadNotifyPlugin' => $baseDir . '/../lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => $baseDir . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PublicAuth' => $baseDir . '/../lib/Connector/Sabre/PublicAuth.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => $baseDir . '/../lib/Connector/Sabre/QuotaPlugin.php',
|
||||
|
|
@ -353,6 +355,7 @@ return array(
|
|||
'OCA\\DAV\\Migration\\Version1029Date20231004091403' => $baseDir . '/../lib/Migration/Version1029Date20231004091403.php',
|
||||
'OCA\\DAV\\Migration\\Version1030Date20240205103243' => $baseDir . '/../lib/Migration/Version1030Date20240205103243.php',
|
||||
'OCA\\DAV\\Migration\\Version1031Date20240610134258' => $baseDir . '/../lib/Migration/Version1031Date20240610134258.php',
|
||||
'OCA\\DAV\\Migration\\Version1034Date20250813093701' => $baseDir . '/../lib/Migration/Version1034Date20250813093701.php',
|
||||
'OCA\\DAV\\Model\\ExampleEvent' => $baseDir . '/../lib/Model/ExampleEvent.php',
|
||||
'OCA\\DAV\\Paginate\\LimitedCopyIterator' => $baseDir . '/../lib/Paginate/LimitedCopyIterator.php',
|
||||
'OCA\\DAV\\Paginate\\PaginateCache' => $baseDir . '/../lib/Paginate/PaginateCache.php',
|
||||
|
|
|
|||
|
|
@ -231,6 +231,8 @@ class ComposerStaticInitDAV
|
|||
'OCA\\DAV\\Connector\\Sabre\\Node' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Node.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\ObjectTree' => __DIR__ . '/..' . '/../lib/Connector/Sabre/ObjectTree.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\Principal' => __DIR__ . '/..' . '/../lib/Connector/Sabre/Principal.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropFindMonitorPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropFindMonitorPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropFindPreloadNotifyPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PropfindCompressionPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PropfindCompressionPlugin.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\PublicAuth' => __DIR__ . '/..' . '/../lib/Connector/Sabre/PublicAuth.php',
|
||||
'OCA\\DAV\\Connector\\Sabre\\QuotaPlugin' => __DIR__ . '/..' . '/../lib/Connector/Sabre/QuotaPlugin.php',
|
||||
|
|
@ -368,6 +370,7 @@ class ComposerStaticInitDAV
|
|||
'OCA\\DAV\\Migration\\Version1029Date20231004091403' => __DIR__ . '/..' . '/../lib/Migration/Version1029Date20231004091403.php',
|
||||
'OCA\\DAV\\Migration\\Version1030Date20240205103243' => __DIR__ . '/..' . '/../lib/Migration/Version1030Date20240205103243.php',
|
||||
'OCA\\DAV\\Migration\\Version1031Date20240610134258' => __DIR__ . '/..' . '/../lib/Migration/Version1031Date20240610134258.php',
|
||||
'OCA\\DAV\\Migration\\Version1034Date20250813093701' => __DIR__ . '/..' . '/../lib/Migration/Version1034Date20250813093701.php',
|
||||
'OCA\\DAV\\Model\\ExampleEvent' => __DIR__ . '/..' . '/../lib/Model/ExampleEvent.php',
|
||||
'OCA\\DAV\\Paginate\\LimitedCopyIterator' => __DIR__ . '/..' . '/../lib/Paginate/LimitedCopyIterator.php',
|
||||
'OCA\\DAV\\Paginate\\PaginateCache' => __DIR__ . '/..' . '/../lib/Paginate/PaginateCache.php',
|
||||
|
|
|
|||
|
|
@ -79,6 +79,9 @@ OC.L10N.register(
|
|||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "W przeszłości dnia %1$s między %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za minutę dnia %1$s między %2$s - %3$s","Za %n minuty dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za godzinę dnia %1$s między %2$s - %3$s","Za %n godziny dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
|
||||
|
|
@ -87,18 +90,38 @@ OC.L10N.register(
|
|||
"Every Day for the entire day" : "Codziennie przez cały dzień",
|
||||
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
|
||||
"Every Day between %1$s - %2$s" : "Codziennie między %1$s – %2$s",
|
||||
"Every Day between %1$s - %2$s until %3$s" : "Codziennie między %1$s - %2$s do %3$s",
|
||||
"Every %1$d Days for the entire day" : "Co %1$d dni przez cały dzień",
|
||||
"Every %1$d Days for the entire day until %2$s" : "Co %1$d dni przez cały dzień aż do %2$s",
|
||||
"Every %1$d Days between %2$s - %3$s" : "Co %1$d dni pomiędzy %2$s - %3$s",
|
||||
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
|
||||
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
|
||||
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
|
||||
"Every Week on %1$s for the entire day until %2$s" : "Co tydzień w %1$s przez cały dzień do %2$s",
|
||||
"Every Week on %1$s between %2$s - %3$s" : "Co tydzień w %1$s między %2$s - %3$s",
|
||||
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Co tydzień w %1$s między %2$s - %3$s do %4$s",
|
||||
"Every %1$d Weeks on %2$s for the entire day" : "Co %1$d tygodni w %2$s przez cały dzień",
|
||||
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Co %1$d tygodnie w %2$s przez cały dzień do %3$s",
|
||||
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s",
|
||||
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s do %5$s",
|
||||
"Every Month on the %1$s for the entire day" : "Co miesiąc dnia %1$s przez cały dzień",
|
||||
"Every Month on the %1$s for the entire day until %2$s" : "Co miesiąc dnia %1$s przez cały dzień do %2$s",
|
||||
"Every Month on the %1$s between %2$s - %3$s" : "Co miesiąc dnia %1$s między %2$s - %3$s",
|
||||
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Co miesiąc dnia %1$s między %2$s - %3$s do %4$s",
|
||||
"Every %1$d Months on the %2$s for the entire day" : "Co %1$d miesiący dnia %2$s przez cały dzień",
|
||||
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Co %1$d miesięcy dnia %2$s przez cały dzień do %3$s",
|
||||
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Co %1$d miesięcy dnia %2$s między %3$s - %4$s",
|
||||
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
|
||||
"Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
|
||||
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
|
||||
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
|
||||
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
|
||||
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
|
||||
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Co %1$d lat w %2$s dnia %3$s przez cały dzień do %4$s",
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s",
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s do %6$s",
|
||||
"On specific dates for the entire day until %1$s" : "W określonych datach przez cały dzień do %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "W określonych datach między %1$s - %2$s do %3$s",
|
||||
"In the past on %1$s" : "W przeszłości dnia %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
|
||||
|
|
@ -108,6 +131,18 @@ OC.L10N.register(
|
|||
"_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
|
||||
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
|
||||
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s","Za %n godziny dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Jutro dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s","Za %n miesiące dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Za rok dnia %1$s, następnie dnia %2$s","Za %n lata dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s"],
|
||||
"In the past on %1$s then on %2$s and %3$s" : "W przeszłości dnia %1$s, następnie dnia %2$s i %3$s",
|
||||
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Za minutę dnia %1$s, następnie dnia %2$s i %3$s","Za %n minuty dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s i %3$s","Za %%ngodziny dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Jutro, dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesiące dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Za rok dnia %1$s, następnie dnia %2$s i %3$s","Za %n lata dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
|
||||
"Cancelled: %1$s" : "Anulowane: %1$s",
|
||||
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
|
||||
|
|
|
|||
|
|
@ -77,6 +77,9 @@
|
|||
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za tydzień, dnia %1$s, przez cały dzień","Za %n tygodnie, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień","Za %n tygodni, dnia %1$s, przez cały dzień"],
|
||||
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["W ciągu miesiąca, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień","W ciągu %n miesięcy, dnia %1$s przez cały dzień"],
|
||||
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za rok dnia %1$s przez cały dzień","Za %n lata dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień","Za %n lat dnia %1$s przez cały dzień"],
|
||||
"In the past on %1$s between %2$s - %3$s" : "W przeszłości dnia %1$s między %2$s - %3$s",
|
||||
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za minutę dnia %1$s między %2$s - %3$s","Za %n minuty dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s","Za %n minut dnia %1$s między %2$s - %3$s"],
|
||||
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za godzinę dnia %1$s między %2$s - %3$s","Za %n godziny dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s","Za %n godzin dnia %1$s między %2$s - %3$s"],
|
||||
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za dzień, dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s","Za %n dni dnia %1$s między %2$s - %3$s"],
|
||||
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za tydzień dnia %1$s między %2$s - %3$s","Za %n tygodnie dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s","Za %n tygodni dnia %1$s między %2$s - %3$s"],
|
||||
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za miesiąc dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s","Za %n miesięcy dnia %1$s między %2$s - %3$s"],
|
||||
|
|
@ -85,18 +88,38 @@
|
|||
"Every Day for the entire day" : "Codziennie przez cały dzień",
|
||||
"Every Day for the entire day until %1$s" : "Codziennie przez cały dzień do %1$s",
|
||||
"Every Day between %1$s - %2$s" : "Codziennie między %1$s – %2$s",
|
||||
"Every Day between %1$s - %2$s until %3$s" : "Codziennie między %1$s - %2$s do %3$s",
|
||||
"Every %1$d Days for the entire day" : "Co %1$d dni przez cały dzień",
|
||||
"Every %1$d Days for the entire day until %2$s" : "Co %1$d dni przez cały dzień aż do %2$s",
|
||||
"Every %1$d Days between %2$s - %3$s" : "Co %1$d dni pomiędzy %2$s - %3$s",
|
||||
"Every %1$d Days between %2$s - %3$s until %4$s" : "Co %1$d dni, pomiędzy %2$s - %3$s aż do %4$s",
|
||||
"Could not generate event recurrence statement" : "Nie można wygenerować zestawienia powtórzeń zdarzenia",
|
||||
"Every Week on %1$s for the entire day" : "Każdego tygodnia w %1$s przez cały dzień",
|
||||
"Every Week on %1$s for the entire day until %2$s" : "Co tydzień w %1$s przez cały dzień do %2$s",
|
||||
"Every Week on %1$s between %2$s - %3$s" : "Co tydzień w %1$s między %2$s - %3$s",
|
||||
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Co tydzień w %1$s między %2$s - %3$s do %4$s",
|
||||
"Every %1$d Weeks on %2$s for the entire day" : "Co %1$d tygodni w %2$s przez cały dzień",
|
||||
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Co %1$d tygodnie w %2$s przez cały dzień do %3$s",
|
||||
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s",
|
||||
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Co %1$d tygodnie w %2$s między %3$s - %4$s do %5$s",
|
||||
"Every Month on the %1$s for the entire day" : "Co miesiąc dnia %1$s przez cały dzień",
|
||||
"Every Month on the %1$s for the entire day until %2$s" : "Co miesiąc dnia %1$s przez cały dzień do %2$s",
|
||||
"Every Month on the %1$s between %2$s - %3$s" : "Co miesiąc dnia %1$s między %2$s - %3$s",
|
||||
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "Co miesiąc dnia %1$s między %2$s - %3$s do %4$s",
|
||||
"Every %1$d Months on the %2$s for the entire day" : "Co %1$d miesiący dnia %2$s przez cały dzień",
|
||||
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Co %1$d miesięcy dnia %2$s przez cały dzień do %3$s",
|
||||
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Co %1$d miesięcy dnia %2$s między %3$s - %4$s",
|
||||
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Każdego %1$d miesiąca dnia %2$s między %3$s - %4$s do %5$s",
|
||||
"Every Year in %1$s on the %2$s for the entire day" : "Co rok w %1$s dnia %2$s przez cały dzień",
|
||||
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Co rok w %1$s dnia %2$s przez cały dzień do %3$s",
|
||||
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s",
|
||||
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Co roku za %1$s dnia %2$s między %3$s - %4$s do %5$s",
|
||||
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Co %1$d lat dnia %2$s o %3$s przez cały dzień",
|
||||
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Co %1$d lat w %2$s dnia %3$s przez cały dzień do %4$s",
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s",
|
||||
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Co %1$d lat w %2$s dnia %3$s między %4$s - %5$s do %6$s",
|
||||
"On specific dates for the entire day until %1$s" : "W określonych datach przez cały dzień do %1$s",
|
||||
"On specific dates between %1$s - %2$s until %3$s" : "W określonych datach między %1$s - %2$s do %3$s",
|
||||
"In the past on %1$s" : "W przeszłości dnia %1$s",
|
||||
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["Za minutę dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s","Za %n minut dnia %1$s"],
|
||||
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["Za godzinę dnia %1$s","Za %n godziny dnia %1$s","Za %n godzin dnia %1$s","Za %n godzin dnia %1$s"],
|
||||
|
|
@ -106,6 +129,18 @@
|
|||
"_In a year on %1$s_::_In %n years on %1$s_" : ["Za rok dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s","Za %n lat dnia %1$s"],
|
||||
"In the past on %1$s then on %2$s" : "W przeszłości dnia %1$s, a następnie %2$s",
|
||||
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["Za minutę dnia %1$s, a następnie %2$s","Za %n minuty dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s","Za %n minut dnia %1$s, a następnie %2$s"],
|
||||
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s","Za %n godziny dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s","Za %n godzin dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["Jutro dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s","Za %n dni dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s","Za %n tygodni dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s","Za %n miesiące dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s"],
|
||||
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["Za rok dnia %1$s, następnie dnia %2$s","Za %n lata dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s","Za %n lat dnia %1$s, następnie dnia %2$s"],
|
||||
"In the past on %1$s then on %2$s and %3$s" : "W przeszłości dnia %1$s, następnie dnia %2$s i %3$s",
|
||||
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["Za minutę dnia %1$s, następnie dnia %2$s i %3$s","Za %n minuty dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s","Za %n minut dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["Za godzinę dnia %1$s, następnie dnia %2$s i %3$s","Za %%ngodziny dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s","Za %n godzin dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["Jutro, dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s","Za %n dni dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["Za tydzień dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodnie dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s","Za %n tygodni dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["Za miesiąc dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesiące dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s","Za %n miesięcy dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["Za rok dnia %1$s, następnie dnia %2$s i %3$s","Za %n lata dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s","Za %n lat dnia %1$s, następnie dnia %2$s i %3$s"],
|
||||
"Could not generate next recurrence statement" : "Nie można wygenerować następnej instrukcji powtarzania",
|
||||
"Cancelled: %1$s" : "Anulowane: %1$s",
|
||||
"\"%1$s\" has been canceled" : "\"%1$s\" zostało anulowane",
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IRestorable, IShareable
|
|||
|
||||
public function __construct(
|
||||
BackendInterface $caldavBackend,
|
||||
$calendarInfo,
|
||||
array $calendarInfo,
|
||||
IL10N $l10n,
|
||||
private IConfig $config,
|
||||
private LoggerInterface $logger,
|
||||
|
|
@ -60,6 +60,10 @@ class Calendar extends \Sabre\CalDAV\Calendar implements IRestorable, IShareable
|
|||
$this->l10n = $l10n;
|
||||
}
|
||||
|
||||
public function getUri(): string {
|
||||
return $this->calendarInfo['uri'];
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @throws Forbidden
|
||||
|
|
|
|||
|
|
@ -36,9 +36,14 @@ class CalendarProvider implements ICalendarProvider {
|
|||
});
|
||||
}
|
||||
|
||||
$additionalProperties = $this->getAdditionalPropertiesForCalendars($calendarInfos);
|
||||
$iCalendars = [];
|
||||
foreach ($calendarInfos as $calendarInfo) {
|
||||
$calendarInfo = array_merge($calendarInfo, $this->getAdditionalProperties($calendarInfo['principaluri'], $calendarInfo['uri']));
|
||||
$user = str_replace('principals/users/', '', $calendarInfo['principaluri']);
|
||||
$path = 'calendars/' . $user . '/' . $calendarInfo['uri'];
|
||||
|
||||
$calendarInfo = array_merge($calendarInfo, $additionalProperties[$path] ?? []);
|
||||
|
||||
$calendar = new Calendar($this->calDavBackend, $calendarInfo, $this->l10n, $this->config, $this->logger);
|
||||
$iCalendars[] = new CalendarImpl(
|
||||
$calendar,
|
||||
|
|
@ -49,16 +54,34 @@ class CalendarProvider implements ICalendarProvider {
|
|||
return $iCalendars;
|
||||
}
|
||||
|
||||
public function getAdditionalProperties(string $principalUri, string $calendarUri): array {
|
||||
$user = str_replace('principals/users/', '', $principalUri);
|
||||
$path = 'calendars/' . $user . '/' . $calendarUri;
|
||||
/**
|
||||
* @param array{
|
||||
* principaluri: string,
|
||||
* uri: string,
|
||||
* }[] $uris
|
||||
* @return array<string, array<string, string|bool>>
|
||||
*/
|
||||
private function getAdditionalPropertiesForCalendars(array $uris): array {
|
||||
$calendars = [];
|
||||
foreach ($uris as $uri) {
|
||||
/** @var string $user */
|
||||
$user = str_replace('principals/users/', '', $uri['principaluri']);
|
||||
if (!array_key_exists($user, $calendars)) {
|
||||
$calendars[$user] = [];
|
||||
}
|
||||
$calendars[$user][] = 'calendars/' . $user . '/' . $uri['uri'];
|
||||
}
|
||||
|
||||
$properties = $this->propertyMapper->findPropertiesByPath($user, $path);
|
||||
$properties = $this->propertyMapper->findPropertiesByPathsAndUsers($calendars);
|
||||
|
||||
$list = [];
|
||||
foreach ($properties as $property) {
|
||||
if ($property instanceof Property) {
|
||||
$list[$property->getPropertyname()] = match ($property->getPropertyname()) {
|
||||
if (!isset($list[$property->getPropertypath()])) {
|
||||
$list[$property->getPropertypath()] = [];
|
||||
}
|
||||
|
||||
$list[$property->getPropertypath()][$property->getPropertyname()] = match ($property->getPropertyname()) {
|
||||
'{http://owncloud.org/ns}calendar-enabled' => (bool)$property->getPropertyvalue(),
|
||||
default => $property->getPropertyvalue()
|
||||
};
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ use OCA\DAV\Connector\Sabre\DavAclPlugin;
|
|||
use OCA\DAV\Connector\Sabre\ExceptionLoggerPlugin;
|
||||
use OCA\DAV\Connector\Sabre\LockPlugin;
|
||||
use OCA\DAV\Connector\Sabre\MaintenancePlugin;
|
||||
use OCA\DAV\Connector\Sabre\PropFindPreloadNotifyPlugin;
|
||||
use OCA\DAV\Events\SabrePluginAuthInitEvent;
|
||||
use OCA\DAV\RootCollection;
|
||||
use OCA\Theming\ThemingDefaults;
|
||||
|
|
@ -96,6 +97,9 @@ class EmbeddedCalDavServer {
|
|||
$this->server->addPlugin(Server::get(\OCA\DAV\CalDAV\Schedule\IMipPlugin::class));
|
||||
}
|
||||
|
||||
// collection preload plugin
|
||||
$this->server->addPlugin(new PropFindPreloadNotifyPlugin());
|
||||
|
||||
// wait with registering these until auth is handled and the filesystem is setup
|
||||
$this->server->on('beforeMethod:*', function () use ($root): void {
|
||||
// register plugins from apps
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ namespace OCA\DAV\Connector\Sabre;
|
|||
|
||||
use OCP\Comments\ICommentsManager;
|
||||
use OCP\IUserSession;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
|
|
@ -21,6 +22,7 @@ class CommentPropertiesPlugin extends ServerPlugin {
|
|||
|
||||
protected ?Server $server = null;
|
||||
private array $cachedUnreadCount = [];
|
||||
private array $cachedDirectories = [];
|
||||
|
||||
public function __construct(
|
||||
private ICommentsManager $commentsManager,
|
||||
|
|
@ -41,6 +43,8 @@ class CommentPropertiesPlugin extends ServerPlugin {
|
|||
*/
|
||||
public function initialize(\Sabre\DAV\Server $server) {
|
||||
$this->server = $server;
|
||||
|
||||
$this->server->on('preloadCollection', $this->preloadCollection(...));
|
||||
$this->server->on('propFind', [$this, 'handleGetProperties']);
|
||||
}
|
||||
|
||||
|
|
@ -69,6 +73,21 @@ class CommentPropertiesPlugin extends ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
private function preloadCollection(PropFind $propFind, ICollection $collection):
|
||||
void {
|
||||
if (!($collection instanceof Directory)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$collectionPath = $collection->getPath();
|
||||
if (!isset($this->cachedDirectories[$collectionPath]) && $propFind->getStatus(
|
||||
self::PROPERTY_NAME_UNREAD
|
||||
) !== null) {
|
||||
$this->cacheDirectory($collection);
|
||||
$this->cachedDirectories[$collectionPath] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tags and favorites properties to the response,
|
||||
* if requested.
|
||||
|
|
@ -85,14 +104,6 @@ class CommentPropertiesPlugin extends ServerPlugin {
|
|||
return;
|
||||
}
|
||||
|
||||
// need prefetch ?
|
||||
if ($node instanceof Directory
|
||||
&& $propFind->getDepth() !== 0
|
||||
&& !is_null($propFind->getStatus(self::PROPERTY_NAME_UNREAD))
|
||||
) {
|
||||
$this->cacheDirectory($node);
|
||||
}
|
||||
|
||||
$propFind->handle(self::PROPERTY_NAME_COUNT, function () use ($node): int {
|
||||
return $this->commentsManager->getNumberOfCommentsForObject('files', (string)$node->getId());
|
||||
});
|
||||
|
|
|
|||
82
apps/dav/lib/Connector/Sabre/PropFindMonitorPlugin.php
Normal file
82
apps/dav/lib/Connector/Sabre/PropFindMonitorPlugin.php
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use Sabre\DAV\Server as SabreServer;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
use Sabre\HTTP\ResponseInterface;
|
||||
|
||||
/**
|
||||
* This plugin runs after requests and logs an error if a plugin is detected
|
||||
* to be doing too many SQL requests.
|
||||
*/
|
||||
class PropFindMonitorPlugin extends ServerPlugin {
|
||||
|
||||
/**
|
||||
* A Plugin can scan up to this amount of nodes without an error being
|
||||
* reported.
|
||||
*/
|
||||
public const THRESHOLD_NODES = 50;
|
||||
|
||||
/**
|
||||
* A plugin can use up to this amount of queries per node.
|
||||
*/
|
||||
public const THRESHOLD_QUERY_FACTOR = 1;
|
||||
|
||||
private SabreServer $server;
|
||||
|
||||
public function initialize(SabreServer $server): void {
|
||||
$this->server = $server;
|
||||
$this->server->on('afterResponse', [$this, 'afterResponse']);
|
||||
}
|
||||
|
||||
public function afterResponse(
|
||||
RequestInterface $request,
|
||||
ResponseInterface $response): void {
|
||||
if (!$this->server instanceof Server) {
|
||||
return;
|
||||
}
|
||||
|
||||
$pluginQueries = $this->server->getPluginQueries();
|
||||
if (empty($pluginQueries)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$logger = $this->server->getLogger();
|
||||
foreach ($pluginQueries as $eventName => $eventQueries) {
|
||||
$maxDepth = max(0, ...array_keys($eventQueries));
|
||||
// entries at the top are usually not interesting
|
||||
unset($eventQueries[$maxDepth]);
|
||||
foreach ($eventQueries as $depth => $propFinds) {
|
||||
foreach ($propFinds as $pluginName => $propFind) {
|
||||
[
|
||||
'queries' => $queries,
|
||||
'nodes' => $nodes
|
||||
] = $propFind;
|
||||
if ($queries === 0 || $nodes > $queries || $nodes < self::THRESHOLD_NODES
|
||||
|| $queries < $nodes * self::THRESHOLD_QUERY_FACTOR) {
|
||||
continue;
|
||||
}
|
||||
$logger->error(
|
||||
'{name}:{event} scanned {scans} nodes with {count} queries in depth {depth}/{maxDepth}. This is bad for performance, please report to the plugin developer!',
|
||||
[
|
||||
'name' => $pluginName,
|
||||
'scans' => $nodes,
|
||||
'count' => $queries,
|
||||
'depth' => $depth,
|
||||
'maxDepth' => $maxDepth,
|
||||
'event' => $eventName,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
55
apps/dav/lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php
Normal file
55
apps/dav/lib/Connector/Sabre/PropFindPreloadNotifyPlugin.php
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types = 1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\INode;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\ServerPlugin;
|
||||
|
||||
/**
|
||||
* This plugin asks other plugins to preload data for a collection, so that
|
||||
* subsequent PROPFIND handlers for children do not query the DB on a per-node
|
||||
* basis.
|
||||
*/
|
||||
class PropFindPreloadNotifyPlugin extends ServerPlugin {
|
||||
|
||||
private Server $server;
|
||||
|
||||
public function initialize(Server $server): void {
|
||||
$this->server = $server;
|
||||
$this->server->on('propFind', [$this, 'collectionPreloadNotifier' ], 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses the server instance to emit a `preloadCollection` event to signal
|
||||
* to interested plugins that a collection can be preloaded.
|
||||
*
|
||||
* NOTE: this can be emitted several times, so ideally every plugin
|
||||
* should cache what they need and check if a cache exists before
|
||||
* re-fetching.
|
||||
*/
|
||||
public function collectionPreloadNotifier(PropFind $propFind, INode $node): bool {
|
||||
if (!$this->shouldPreload($propFind, $node)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $this->server->emit('preloadCollection', [$propFind, $node]);
|
||||
}
|
||||
|
||||
private function shouldPreload(
|
||||
PropFind $propFind,
|
||||
INode $node,
|
||||
): bool {
|
||||
$depth = $propFind->getDepth();
|
||||
return $node instanceof ICollection
|
||||
&& ($depth === Server::DEPTH_INFINITY || $depth > 0);
|
||||
}
|
||||
}
|
||||
|
|
@ -7,7 +7,11 @@
|
|||
*/
|
||||
namespace OCA\DAV\Connector\Sabre;
|
||||
|
||||
use OC\DB\Connection;
|
||||
use Override;
|
||||
use Sabre\DAV\Exception;
|
||||
use Sabre\DAV\INode;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Version;
|
||||
use TypeError;
|
||||
|
||||
|
|
@ -21,6 +25,15 @@ use TypeError;
|
|||
class Server extends \Sabre\DAV\Server {
|
||||
/** @var CachingTree $tree */
|
||||
|
||||
/**
|
||||
* Tracks queries done by plugins.
|
||||
* @var array<string, array<int, array<string, array{nodes:int,
|
||||
* queries:int}>>> The keys represent: event name, depth and plugin name
|
||||
*/
|
||||
private array $pluginQueries = [];
|
||||
|
||||
public bool $debugEnabled = false;
|
||||
|
||||
/**
|
||||
* @see \Sabre\DAV\Server
|
||||
*/
|
||||
|
|
@ -30,6 +43,106 @@ class Server extends \Sabre\DAV\Server {
|
|||
$this->enablePropfindDepthInfinity = true;
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function once(
|
||||
string $eventName,
|
||||
callable $callBack,
|
||||
int $priority = 100,
|
||||
): void {
|
||||
$this->debugEnabled ? $this->monitorPropfindQueries(
|
||||
parent::once(...),
|
||||
...\func_get_args(),
|
||||
) : parent::once(...\func_get_args());
|
||||
}
|
||||
|
||||
#[Override]
|
||||
public function on(
|
||||
string $eventName,
|
||||
callable $callBack,
|
||||
int $priority = 100,
|
||||
): void {
|
||||
$this->debugEnabled ? $this->monitorPropfindQueries(
|
||||
parent::on(...),
|
||||
...\func_get_args(),
|
||||
) : parent::on(...\func_get_args());
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps the handler $callBack into a query-monitoring function and calls
|
||||
* $parentFn to register it.
|
||||
*/
|
||||
private function monitorPropfindQueries(
|
||||
callable $parentFn,
|
||||
string $eventName,
|
||||
callable $callBack,
|
||||
int $priority = 100,
|
||||
): void {
|
||||
$pluginName = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3)[2]['class'] ?? 'unknown';
|
||||
// The NotifyPlugin needs to be excluded as it emits the
|
||||
// `preloadCollection` event, which causes many plugins run queries.
|
||||
/** @psalm-suppress TypeDoesNotContainType */
|
||||
if ($pluginName === PropFindPreloadNotifyPlugin::class || ($eventName !== 'propFind'
|
||||
&& $eventName !== 'preloadCollection')) {
|
||||
$parentFn($eventName, $callBack, $priority);
|
||||
return;
|
||||
}
|
||||
|
||||
$callback = $this->getMonitoredCallback($callBack, $pluginName, $eventName);
|
||||
|
||||
$parentFn($eventName, $callback, $priority);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a callable that wraps $callBack with code that monitors and
|
||||
* records queries per plugin.
|
||||
*/
|
||||
private function getMonitoredCallback(
|
||||
callable $callBack,
|
||||
string $pluginName,
|
||||
string $eventName,
|
||||
): callable {
|
||||
return function (PropFind $propFind, INode $node) use (
|
||||
$callBack,
|
||||
$pluginName,
|
||||
$eventName,
|
||||
): bool {
|
||||
$connection = \OCP\Server::get(Connection::class);
|
||||
$queriesBefore = $connection->getStats()['executed'];
|
||||
$result = $callBack($propFind, $node);
|
||||
$queriesAfter = $connection->getStats()['executed'];
|
||||
$this->trackPluginQueries(
|
||||
$pluginName,
|
||||
$eventName,
|
||||
$queriesAfter - $queriesBefore,
|
||||
$propFind->getDepth()
|
||||
);
|
||||
|
||||
// many callbacks don't care about returning a bool
|
||||
return $result ?? true;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Tracks the queries executed by a specific plugin.
|
||||
*/
|
||||
private function trackPluginQueries(
|
||||
string $pluginName,
|
||||
string $eventName,
|
||||
int $queriesExecuted,
|
||||
int $depth,
|
||||
): void {
|
||||
// report only nodes which cause queries to the DB
|
||||
if ($queriesExecuted === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->pluginQueries[$eventName][$depth][$pluginName]['nodes']
|
||||
= ($this->pluginQueries[$eventName][$depth][$pluginName]['nodes'] ?? 0) + 1;
|
||||
|
||||
$this->pluginQueries[$eventName][$depth][$pluginName]['queries']
|
||||
= ($this->pluginQueries[$eventName][$depth][$pluginName]['queries'] ?? 0) + $queriesExecuted;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return void
|
||||
|
|
@ -115,4 +228,13 @@ class Server extends \Sabre\DAV\Server {
|
|||
$this->sapi->sendResponse($this->httpResponse);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns queries executed by registered plugins.
|
||||
* @return array<string, array<int, array<string, array{nodes:int,
|
||||
* queries:int}>>> The keys represent: event name, depth and plugin name
|
||||
*/
|
||||
public function getPluginQueries(): array {
|
||||
return $this->pluginQueries;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ use OCA\DAV\CalDAV\DefaultCalendarValidator;
|
|||
use OCA\DAV\CalDAV\Proxy\ProxyMapper;
|
||||
use OCA\DAV\DAV\CustomPropertiesBackend;
|
||||
use OCA\DAV\DAV\ViewOnlyPlugin;
|
||||
use OCA\DAV\Db\PropertyMapper;
|
||||
use OCA\DAV\Files\BrowserErrorPagePlugin;
|
||||
use OCA\DAV\Files\Sharing\RootCollection;
|
||||
use OCA\DAV\Upload\CleanupService;
|
||||
|
|
@ -68,6 +69,7 @@ class ServerFactory {
|
|||
Plugin $authPlugin,
|
||||
callable $viewCallBack,
|
||||
): Server {
|
||||
$debugEnabled = $this->config->getSystemValue('debug', false);
|
||||
// Fire up server
|
||||
if ($isPublicShare) {
|
||||
$rootCollection = new SimpleCollection('root');
|
||||
|
|
@ -89,6 +91,12 @@ class ServerFactory {
|
|||
));
|
||||
$server->addPlugin(new AnonymousOptionsPlugin());
|
||||
$server->addPlugin($authPlugin);
|
||||
if ($debugEnabled) {
|
||||
$server->debugEnabled = $debugEnabled;
|
||||
$server->addPlugin(new PropFindMonitorPlugin());
|
||||
}
|
||||
|
||||
$server->addPlugin(new PropFindPreloadNotifyPlugin());
|
||||
// FIXME: The following line is a workaround for legacy components relying on being able to send a GET to /
|
||||
$server->addPlugin(new DummyGetResponsePlugin());
|
||||
$server->addPlugin(new ExceptionLoggerPlugin('webdav', $this->logger));
|
||||
|
|
@ -117,7 +125,8 @@ class ServerFactory {
|
|||
}
|
||||
|
||||
// wait with registering these until auth is handled and the filesystem is setup
|
||||
$server->on('beforeMethod:*', function () use ($server, $tree, $viewCallBack, $isPublicShare, $rootCollection): void {
|
||||
$server->on('beforeMethod:*', function () use ($server, $tree,
|
||||
$viewCallBack, $isPublicShare, $rootCollection, $debugEnabled): void {
|
||||
// ensure the skeleton is copied
|
||||
$userFolder = \OC::$server->getUserFolder();
|
||||
|
||||
|
|
@ -181,7 +190,7 @@ class ServerFactory {
|
|||
\OCP\Server::get(IFilenameValidator::class),
|
||||
\OCP\Server::get(IAccountManager::class),
|
||||
false,
|
||||
!$this->config->getSystemValue('debug', false)
|
||||
!$debugEnabled
|
||||
)
|
||||
);
|
||||
$server->addPlugin(new QuotaPlugin($view));
|
||||
|
|
@ -220,6 +229,7 @@ class ServerFactory {
|
|||
$tree,
|
||||
$this->databaseConnection,
|
||||
$this->userSession->getUser(),
|
||||
\OCP\Server::get(PropertyMapper::class),
|
||||
\OCP\Server::get(DefaultCalendarValidator::class),
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ use OCP\Files\NotFoundException;
|
|||
use OCP\IUserSession;
|
||||
use OCP\Share\IManager;
|
||||
use OCP\Share\IShare;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Sabre\DAV\Tree;
|
||||
|
|
@ -38,7 +39,14 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
|
||||
/** @var IShare[][] */
|
||||
private array $cachedShares = [];
|
||||
/** @var string[] */
|
||||
|
||||
/**
|
||||
* Tracks which folders have been cached.
|
||||
* When a folder is cached, it will appear with its path as key and true
|
||||
* as value.
|
||||
*
|
||||
* @var bool[]
|
||||
*/
|
||||
private array $cachedFolders = [];
|
||||
|
||||
public function __construct(
|
||||
|
|
@ -67,6 +75,7 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
$server->protectedProperties[] = self::SHAREES_PROPERTYNAME;
|
||||
|
||||
$this->server = $server;
|
||||
$this->server->on('preloadCollection', $this->preloadCollection(...));
|
||||
$this->server->on('propFind', [$this, 'handleGetProperties']);
|
||||
}
|
||||
|
||||
|
|
@ -89,28 +98,28 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
];
|
||||
|
||||
foreach ($requestedShareTypes as $requestedShareType) {
|
||||
$result = array_merge($result, $this->shareManager->getSharesBy(
|
||||
$result[] = $this->shareManager->getSharesBy(
|
||||
$this->userId,
|
||||
$requestedShareType,
|
||||
$node,
|
||||
false,
|
||||
-1
|
||||
));
|
||||
);
|
||||
|
||||
// Also check for shares where the user is the recipient
|
||||
try {
|
||||
$result = array_merge($result, $this->shareManager->getSharedWith(
|
||||
$result[] = $this->shareManager->getSharedWith(
|
||||
$this->userId,
|
||||
$requestedShareType,
|
||||
$node,
|
||||
-1
|
||||
));
|
||||
);
|
||||
} catch (BackendError $e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
return array_merge(...$result);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -141,7 +150,7 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
|
||||
// if we already cached the folder containing this file
|
||||
// then we already know there are no shares here.
|
||||
if (array_search($parentPath, $this->cachedFolders) === false) {
|
||||
if (!isset($this->cachedFolders[$parentPath])) {
|
||||
try {
|
||||
$node = $sabreNode->getNode();
|
||||
} catch (NotFoundException $e) {
|
||||
|
|
@ -156,6 +165,27 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
return [];
|
||||
}
|
||||
|
||||
private function preloadCollection(PropFind $propFind, ICollection $collection): void {
|
||||
if (!$collection instanceof Directory
|
||||
|| isset($this->cachedFolders[$collection->getPath()])
|
||||
|| (
|
||||
$propFind->getStatus(self::SHARETYPES_PROPERTYNAME) === null
|
||||
&& $propFind->getStatus(self::SHAREES_PROPERTYNAME) === null
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If the node is a directory and we are requesting share types or sharees
|
||||
// then we get all the shares in the folder and cache them.
|
||||
// This is more performant than iterating each files afterwards.
|
||||
$folderNode = $collection->getNode();
|
||||
$this->cachedFolders[$collection->getPath()] = true;
|
||||
foreach ($this->getSharesFolder($folderNode) as $id => $shares) {
|
||||
$this->cachedShares[$id] = $shares;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds shares to propfind response
|
||||
*
|
||||
|
|
@ -170,24 +200,6 @@ class SharesPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
return;
|
||||
}
|
||||
|
||||
// If the node is a directory and we are requesting share types or sharees
|
||||
// then we get all the shares in the folder and cache them.
|
||||
// This is more performant than iterating each files afterwards.
|
||||
if ($sabreNode instanceof Directory
|
||||
&& $propFind->getDepth() !== 0
|
||||
&& (
|
||||
!is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME))
|
||||
|| !is_null($propFind->getStatus(self::SHAREES_PROPERTYNAME))
|
||||
)
|
||||
) {
|
||||
$folderNode = $sabreNode->getNode();
|
||||
$this->cachedFolders[] = $sabreNode->getPath();
|
||||
$childShares = $this->getSharesFolder($folderNode);
|
||||
foreach ($childShares as $id => $shares) {
|
||||
$this->cachedShares[$id] = $shares;
|
||||
}
|
||||
}
|
||||
|
||||
$propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode): ShareTypeList {
|
||||
$shares = $this->getShares($sabreNode);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ use OCP\EventDispatcher\IEventDispatcher;
|
|||
use OCP\ITagManager;
|
||||
use OCP\ITags;
|
||||
use OCP\IUserSession;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\PropPatch;
|
||||
|
||||
|
|
@ -61,6 +62,7 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
* @var array
|
||||
*/
|
||||
private $cachedTags;
|
||||
private array $cachedDirectories;
|
||||
|
||||
/**
|
||||
* @param \Sabre\DAV\Tree $tree tree
|
||||
|
|
@ -92,6 +94,7 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
$server->xml->elementMap[self::TAGS_PROPERTYNAME] = TagList::class;
|
||||
|
||||
$this->server = $server;
|
||||
$this->server->on('preloadCollection', $this->preloadCollection(...));
|
||||
$this->server->on('propFind', [$this, 'handleGetProperties']);
|
||||
$this->server->on('propPatch', [$this, 'handleUpdateProperties']);
|
||||
$this->server->on('preloadProperties', [$this, 'handlePreloadProperties']);
|
||||
|
|
@ -194,6 +197,29 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
private function preloadCollection(PropFind $propFind, ICollection $collection):
|
||||
void {
|
||||
if (!($collection instanceof Node)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// need prefetch ?
|
||||
if ($collection instanceof Directory
|
||||
&& !isset($this->cachedDirectories[$collection->getPath()])
|
||||
&& (!is_null($propFind->getStatus(self::TAGS_PROPERTYNAME))
|
||||
|| !is_null($propFind->getStatus(self::FAVORITE_PROPERTYNAME))
|
||||
)) {
|
||||
// note: pre-fetching only supported for depth <= 1
|
||||
$folderContent = $collection->getChildren();
|
||||
$fileIds = [(int)$collection->getId()];
|
||||
foreach ($folderContent as $info) {
|
||||
$fileIds[] = (int)$info->getId();
|
||||
}
|
||||
$this->prefetchTagsForFileIds($fileIds);
|
||||
$this->cachedDirectories[$collection->getPath()] = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds tags and favorites properties to the response,
|
||||
* if requested.
|
||||
|
|
@ -210,21 +236,6 @@ class TagsPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
return;
|
||||
}
|
||||
|
||||
// need prefetch ?
|
||||
if ($node instanceof Directory
|
||||
&& $propFind->getDepth() !== 0
|
||||
&& (!is_null($propFind->getStatus(self::TAGS_PROPERTYNAME))
|
||||
|| !is_null($propFind->getStatus(self::FAVORITE_PROPERTYNAME))
|
||||
)) {
|
||||
// note: pre-fetching only supported for depth <= 1
|
||||
$folderContent = $node->getChildren();
|
||||
$fileIds = [(int)$node->getId()];
|
||||
foreach ($folderContent as $info) {
|
||||
$fileIds[] = (int)$info->getId();
|
||||
}
|
||||
$this->prefetchTagsForFileIds($fileIds);
|
||||
}
|
||||
|
||||
$isFav = null;
|
||||
|
||||
$propFind->handle(self::TAGS_PROPERTYNAME, function () use (&$isFav, $node) {
|
||||
|
|
|
|||
|
|
@ -67,15 +67,16 @@ class ZipFolderPlugin extends ServerPlugin {
|
|||
// Remove the root path from the filename to make it relative to the requested folder
|
||||
$filename = str_replace($rootPath, '', $node->getPath());
|
||||
|
||||
$mtime = $node->getMTime();
|
||||
if ($node instanceof NcFile) {
|
||||
$resource = $node->fopen('rb');
|
||||
if ($resource === false) {
|
||||
$this->logger->info('Cannot read file for zip stream', ['filePath' => $node->getPath()]);
|
||||
throw new \Sabre\DAV\Exception\ServiceUnavailable('Requested file can currently not be accessed.');
|
||||
}
|
||||
$streamer->addFileFromStream($resource, $filename, $node->getSize(), $node->getMTime());
|
||||
$streamer->addFileFromStream($resource, $filename, $node->getSize(), $mtime);
|
||||
} elseif ($node instanceof NcFolder) {
|
||||
$streamer->addEmptyDir($filename);
|
||||
$streamer->addEmptyDir($filename, $mtime);
|
||||
$content = $node->getDirectoryListing();
|
||||
foreach ($content as $subNode) {
|
||||
$this->streamNode($streamer, $subNode, $rootPath);
|
||||
|
|
|
|||
|
|
@ -9,13 +9,20 @@
|
|||
namespace OCA\DAV\DAV;
|
||||
|
||||
use Exception;
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCA\DAV\CalDAV\Calendar;
|
||||
use OCA\DAV\CalDAV\CalendarHome;
|
||||
use OCA\DAV\CalDAV\CalendarObject;
|
||||
use OCA\DAV\CalDAV\DefaultCalendarValidator;
|
||||
use OCA\DAV\CalDAV\Integration\ExternalCalendar;
|
||||
use OCA\DAV\CalDAV\Outbox;
|
||||
use OCA\DAV\CalDAV\Trashbin\TrashbinHome;
|
||||
use OCA\DAV\Connector\Sabre\Directory;
|
||||
use OCA\DAV\Connector\Sabre\FilesPlugin;
|
||||
use OCA\DAV\Db\PropertyMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
use Sabre\CalDAV\Schedule\Inbox;
|
||||
use Sabre\DAV\Exception as DavException;
|
||||
use Sabre\DAV\PropertyStorage\Backend\BackendInterface;
|
||||
use Sabre\DAV\PropFind;
|
||||
|
|
@ -66,38 +73,16 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
'{DAV:}getetag',
|
||||
'{DAV:}quota-used-bytes',
|
||||
'{DAV:}quota-available-bytes',
|
||||
'{http://owncloud.org/ns}permissions',
|
||||
'{http://owncloud.org/ns}downloadURL',
|
||||
'{http://owncloud.org/ns}dDC',
|
||||
'{http://owncloud.org/ns}size',
|
||||
'{http://nextcloud.org/ns}is-encrypted',
|
||||
];
|
||||
|
||||
// Currently, returning null from any propfind handler would still trigger the backend,
|
||||
// so we add all known Nextcloud custom properties in here to avoid that
|
||||
|
||||
// text app
|
||||
'{http://nextcloud.org/ns}rich-workspace',
|
||||
'{http://nextcloud.org/ns}rich-workspace-file',
|
||||
// groupfolders
|
||||
'{http://nextcloud.org/ns}acl-enabled',
|
||||
'{http://nextcloud.org/ns}acl-can-manage',
|
||||
'{http://nextcloud.org/ns}acl-list',
|
||||
'{http://nextcloud.org/ns}inherited-acl-list',
|
||||
'{http://nextcloud.org/ns}group-folder-id',
|
||||
// files_lock
|
||||
'{http://nextcloud.org/ns}lock',
|
||||
'{http://nextcloud.org/ns}lock-owner-type',
|
||||
'{http://nextcloud.org/ns}lock-owner',
|
||||
'{http://nextcloud.org/ns}lock-owner-displayname',
|
||||
'{http://nextcloud.org/ns}lock-owner-editor',
|
||||
'{http://nextcloud.org/ns}lock-time',
|
||||
'{http://nextcloud.org/ns}lock-timeout',
|
||||
'{http://nextcloud.org/ns}lock-token',
|
||||
// photos
|
||||
'{http://nextcloud.org/ns}realpath',
|
||||
'{http://nextcloud.org/ns}nbItems',
|
||||
'{http://nextcloud.org/ns}face-detections',
|
||||
'{http://nextcloud.org/ns}face-preview-image',
|
||||
/**
|
||||
* Allowed properties for the oc/nc namespace, all other properties in the namespace are ignored
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
private const ALLOWED_NC_PROPERTIES = [
|
||||
'{http://owncloud.org/ns}calendar-enabled',
|
||||
'{http://owncloud.org/ns}enabled',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
@ -119,11 +104,17 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
];
|
||||
|
||||
/**
|
||||
* Properties cache
|
||||
*
|
||||
* @var array
|
||||
* Map of well-known property names to default values
|
||||
*/
|
||||
private $userCache = [];
|
||||
private const PROPERTY_DEFAULT_VALUES = [
|
||||
'{http://owncloud.org/ns}calendar-enabled' => '1',
|
||||
];
|
||||
|
||||
/**
|
||||
* Properties cache
|
||||
*/
|
||||
private array $userCache = [];
|
||||
private array $publishedCache = [];
|
||||
private XmlService $xmlService;
|
||||
|
||||
/**
|
||||
|
|
@ -136,6 +127,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
private Tree $tree,
|
||||
private IDBConnection $connection,
|
||||
private IUser $user,
|
||||
private PropertyMapper $propertyMapper,
|
||||
private DefaultCalendarValidator $defaultCalendarValidator,
|
||||
) {
|
||||
$this->xmlService = new XmlService();
|
||||
|
|
@ -155,14 +147,9 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
public function propFind($path, PropFind $propFind) {
|
||||
$requestedProps = $propFind->get404Properties();
|
||||
|
||||
// these might appear
|
||||
$requestedProps = array_diff(
|
||||
$requestedProps,
|
||||
self::IGNORED_PROPERTIES,
|
||||
);
|
||||
$requestedProps = array_filter(
|
||||
$requestedProps,
|
||||
fn ($prop) => !str_starts_with($prop, FilesPlugin::FILE_METADATA_PREFIX),
|
||||
$this->isPropertyAllowed(...),
|
||||
);
|
||||
|
||||
// substr of calendars/ => path is inside the CalDAV component
|
||||
|
|
@ -224,6 +211,18 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
$this->cacheDirectory($path, $node);
|
||||
}
|
||||
|
||||
if ($node instanceof CalendarHome && $propFind->getDepth() !== 0) {
|
||||
$backend = $node->getCalDAVBackend();
|
||||
if ($backend instanceof CalDavBackend) {
|
||||
$this->cacheCalendars($node, $requestedProps);
|
||||
}
|
||||
}
|
||||
|
||||
if ($node instanceof CalendarObject) {
|
||||
// No custom properties supported on individual events
|
||||
return;
|
||||
}
|
||||
|
||||
// First fetch the published properties (set by another user), then get the ones set by
|
||||
// the current user. If both are set then the latter as priority.
|
||||
foreach ($this->getPublishedProperties($path, $requestedProps) as $propName => $propValue) {
|
||||
|
|
@ -244,6 +243,16 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
}
|
||||
}
|
||||
|
||||
private function isPropertyAllowed(string $property): bool {
|
||||
if (in_array($property, self::IGNORED_PROPERTIES)) {
|
||||
return false;
|
||||
}
|
||||
if (str_starts_with($property, '{http://owncloud.org/ns}') || str_starts_with($property, '{http://nextcloud.org/ns}')) {
|
||||
return in_array($property, self::ALLOWED_NC_PROPERTIES);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates properties for a path
|
||||
*
|
||||
|
|
@ -328,6 +337,10 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
return [];
|
||||
}
|
||||
|
||||
if (isset($this->publishedCache[$path])) {
|
||||
return $this->publishedCache[$path];
|
||||
}
|
||||
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$qb->select('*')
|
||||
->from(self::TABLE_NAME)
|
||||
|
|
@ -338,6 +351,7 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
$props[$row['propertyname']] = $this->decodeValueFromDatabase($row['propertyvalue'], $row['valuetype']);
|
||||
}
|
||||
$result->closeCursor();
|
||||
$this->publishedCache[$path] = $props;
|
||||
return $props;
|
||||
}
|
||||
|
||||
|
|
@ -376,6 +390,62 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
$this->userCache = array_merge($this->userCache, $propsByPath);
|
||||
}
|
||||
|
||||
private function cacheCalendars(CalendarHome $node, array $requestedProperties): void {
|
||||
$calendars = $node->getChildren();
|
||||
|
||||
$users = [];
|
||||
foreach ($calendars as $calendar) {
|
||||
if ($calendar instanceof Calendar) {
|
||||
$user = str_replace('principals/users/', '', $calendar->getPrincipalURI());
|
||||
if (!isset($users[$user])) {
|
||||
$users[$user] = ['calendars/' . $user];
|
||||
}
|
||||
$users[$user][] = 'calendars/' . $user . '/' . $calendar->getUri();
|
||||
} elseif ($calendar instanceof Inbox || $calendar instanceof Outbox || $calendar instanceof TrashbinHome || $calendar instanceof ExternalCalendar) {
|
||||
if ($calendar->getOwner()) {
|
||||
$user = str_replace('principals/users/', '', $calendar->getOwner());
|
||||
if (!isset($users[$user])) {
|
||||
$users[$user] = ['calendars/' . $user];
|
||||
}
|
||||
$users[$user][] = 'calendars/' . $user . '/' . $calendar->getName();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// user properties
|
||||
$properties = $this->propertyMapper->findPropertiesByPathsAndUsers($users);
|
||||
|
||||
$propsByPath = [];
|
||||
foreach ($users as $paths) {
|
||||
foreach ($paths as $path) {
|
||||
$propsByPath[$path] = [];
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($properties as $property) {
|
||||
$propsByPath[$property->getPropertypath()][$property->getPropertyname()] = $this->decodeValueFromDatabase($property->getPropertyvalue(), $property->getValuetype());
|
||||
}
|
||||
$this->userCache = array_merge($this->userCache, $propsByPath);
|
||||
|
||||
// published properties
|
||||
$allowedProps = array_intersect(self::PUBLISHED_READ_ONLY_PROPERTIES, $requestedProperties);
|
||||
if (empty($allowedProps)) {
|
||||
return;
|
||||
}
|
||||
$paths = [];
|
||||
foreach ($users as $nestedPaths) {
|
||||
$paths = array_merge($paths, $nestedPaths);
|
||||
}
|
||||
$paths = array_unique($paths);
|
||||
|
||||
$propsByPath = array_fill_keys(array_values($paths), []);
|
||||
$properties = $this->propertyMapper->findPropertiesByPaths($paths, $allowedProps);
|
||||
foreach ($properties as $property) {
|
||||
$propsByPath[$property->getPropertypath()][$property->getPropertyname()] = $this->decodeValueFromDatabase($property->getPropertyvalue(), $property->getValuetype());
|
||||
}
|
||||
$this->publishedCache = array_merge($this->publishedCache, $propsByPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of properties for the given path and current user
|
||||
*
|
||||
|
|
@ -422,6 +492,14 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
return $props;
|
||||
}
|
||||
|
||||
private function isPropertyDefaultValue(string $name, mixed $value): bool {
|
||||
if (!isset(self::PROPERTY_DEFAULT_VALUES[$name])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return self::PROPERTY_DEFAULT_VALUES[$name] === $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws Exception
|
||||
*/
|
||||
|
|
@ -438,8 +516,8 @@ class CustomPropertiesBackend implements BackendInterface {
|
|||
'propertyName' => $propertyName,
|
||||
];
|
||||
|
||||
// If it was null, we need to delete the property
|
||||
if (is_null($propertyValue)) {
|
||||
// If it was null or set to the default value, we need to delete the property
|
||||
if (is_null($propertyValue) || $this->isPropertyDefaultValue($propertyName, $propertyValue)) {
|
||||
if (array_key_exists($propertyName, $existing)) {
|
||||
$deleteQuery = $deleteQuery ?? $this->createDeleteQuery();
|
||||
$deleteQuery
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ use OCP\AppFramework\Http;
|
|||
use OCP\IConfig;
|
||||
use OCP\IRequest;
|
||||
use Sabre\DAV\Exception\NotFound;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\INode;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
|
|
@ -89,6 +90,7 @@ class Plugin extends ServerPlugin {
|
|||
$this->server->xml->elementMap['{' . Plugin::NS_OWNCLOUD . '}invite'] = Invite::class;
|
||||
|
||||
$this->server->on('method:POST', [$this, 'httpPost']);
|
||||
$this->server->on('preloadCollection', $this->preloadCollection(...));
|
||||
$this->server->on('propFind', [$this, 'propFind']);
|
||||
}
|
||||
|
||||
|
|
@ -168,6 +170,24 @@ class Plugin extends ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
private function preloadCollection(PropFind $propFind, ICollection $collection): void {
|
||||
if (!$collection instanceof CalendarHome || $propFind->getDepth() !== 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
$backend = $collection->getCalDAVBackend();
|
||||
if (!$backend instanceof CalDavBackend) {
|
||||
return;
|
||||
}
|
||||
|
||||
$calendars = $collection->getChildren();
|
||||
$calendars = array_filter($calendars, static fn (INode $node) => $node instanceof IShareable);
|
||||
/** @var int[] $resourceIds */
|
||||
$resourceIds = array_map(
|
||||
static fn (IShareable $node) => $node->getResourceId(), $calendars);
|
||||
$backend->preloadShares($resourceIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is triggered when properties are requested for a certain
|
||||
* node.
|
||||
|
|
@ -179,20 +199,6 @@ class Plugin extends ServerPlugin {
|
|||
* @return void
|
||||
*/
|
||||
public function propFind(PropFind $propFind, INode $node) {
|
||||
if ($node instanceof CalendarHome && $propFind->getDepth() === 1) {
|
||||
$backend = $node->getCalDAVBackend();
|
||||
if ($backend instanceof CalDavBackend) {
|
||||
$calendars = $node->getChildren();
|
||||
$calendars = array_filter($calendars, function (INode $node) {
|
||||
return $node instanceof IShareable;
|
||||
});
|
||||
/** @var int[] $resourceIds */
|
||||
$resourceIds = array_map(function (IShareable $node) {
|
||||
return $node->getResourceId();
|
||||
}, $calendars);
|
||||
$backend->preloadShares($resourceIds);
|
||||
}
|
||||
}
|
||||
if ($node instanceof IShareable) {
|
||||
$propFind->handle('{' . Plugin::NS_OWNCLOUD . '}invite', function () use ($node) {
|
||||
return new Invite(
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ use OCP\AppFramework\Db\Entity;
|
|||
* @method string getPropertypath()
|
||||
* @method string getPropertyname()
|
||||
* @method string getPropertyvalue()
|
||||
* @method int getValuetype()
|
||||
*/
|
||||
class Property extends Entity {
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ declare(strict_types=1);
|
|||
namespace OCA\DAV\Db;
|
||||
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
|
||||
/**
|
||||
|
|
@ -39,17 +40,43 @@ class PropertyMapper extends QBMapper {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param array<string, string[]> $calendars
|
||||
* @return Property[]
|
||||
* @throws \OCP\DB\Exception
|
||||
*/
|
||||
public function findPropertiesByPath(string $userId, string $path): array {
|
||||
public function findPropertiesByPathsAndUsers(array $calendars): array {
|
||||
$selectQb = $this->db->getQueryBuilder();
|
||||
$selectQb->select('*')
|
||||
->from(self::TABLE_NAME)
|
||||
->where(
|
||||
$selectQb->expr()->eq('userid', $selectQb->createNamedParameter($userId)),
|
||||
$selectQb->expr()->eq('propertypath', $selectQb->createNamedParameter($path)),
|
||||
->from(self::TABLE_NAME);
|
||||
|
||||
foreach ($calendars as $user => $paths) {
|
||||
$selectQb->orWhere(
|
||||
$selectQb->expr()->andX(
|
||||
$selectQb->expr()->eq('userid', $selectQb->createNamedParameter($user)),
|
||||
$selectQb->expr()->in('propertypath', $selectQb->createNamedParameter($paths, IQueryBuilder::PARAM_STR_ARRAY)),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return $this->findEntities($selectQb);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $calendars
|
||||
* @param string[] $allowedProperties
|
||||
* @return Property[]
|
||||
* @throws \OCP\DB\Exception
|
||||
*/
|
||||
public function findPropertiesByPaths(array $calendars, array $allowedProperties = []): array {
|
||||
$selectQb = $this->db->getQueryBuilder();
|
||||
$selectQb->select('*')
|
||||
->from(self::TABLE_NAME)
|
||||
->where($selectQb->expr()->in('propertypath', $selectQb->createNamedParameter($calendars, IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
|
||||
if ($allowedProperties) {
|
||||
$selectQb->andWhere($selectQb->expr()->in('propertyname', $selectQb->createNamedParameter($allowedProperties, IQueryBuilder::PARAM_STR_ARRAY)));
|
||||
}
|
||||
|
||||
return $this->findEntities($selectQb);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
53
apps/dav/lib/Migration/Version1034Date20250813093701.php
Normal file
53
apps/dav/lib/Migration/Version1034Date20250813093701.php
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use Closure;
|
||||
use OCP\DB\ISchemaWrapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\SimpleMigrationStep;
|
||||
use Override;
|
||||
|
||||
class Version1034Date20250813093701 extends SimpleMigrationStep {
|
||||
public function __construct(
|
||||
private IDBConnection $db,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param IOutput $output
|
||||
* @param Closure(): ISchemaWrapper $schemaClosure
|
||||
* @param array $options
|
||||
*/
|
||||
#[Override]
|
||||
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->delete('properties')
|
||||
->where($qb->expr()->eq(
|
||||
'propertyname',
|
||||
$qb->createNamedParameter(
|
||||
'{http://owncloud.org/ns}calendar-enabled',
|
||||
IQueryBuilder::PARAM_STR,
|
||||
),
|
||||
IQueryBuilder::PARAM_STR,
|
||||
))
|
||||
->andWhere($qb->expr()->eq(
|
||||
'propertyvalue',
|
||||
$qb->createNamedParameter(
|
||||
'1',
|
||||
IQueryBuilder::PARAM_STR,
|
||||
),
|
||||
IQueryBuilder::PARAM_STR,
|
||||
))
|
||||
->executeStatement();
|
||||
}
|
||||
}
|
||||
|
|
@ -45,6 +45,8 @@ use OCA\DAV\Connector\Sabre\FilesReportPlugin;
|
|||
use OCA\DAV\Connector\Sabre\LockPlugin;
|
||||
use OCA\DAV\Connector\Sabre\MaintenancePlugin;
|
||||
use OCA\DAV\Connector\Sabre\PropfindCompressionPlugin;
|
||||
use OCA\DAV\Connector\Sabre\PropFindMonitorPlugin;
|
||||
use OCA\DAV\Connector\Sabre\PropFindPreloadNotifyPlugin;
|
||||
use OCA\DAV\Connector\Sabre\QuotaPlugin;
|
||||
use OCA\DAV\Connector\Sabre\RequestIdHeaderPlugin;
|
||||
use OCA\DAV\Connector\Sabre\SharesPlugin;
|
||||
|
|
@ -53,6 +55,7 @@ use OCA\DAV\Connector\Sabre\ZipFolderPlugin;
|
|||
use OCA\DAV\DAV\CustomPropertiesBackend;
|
||||
use OCA\DAV\DAV\PublicAuth;
|
||||
use OCA\DAV\DAV\ViewOnlyPlugin;
|
||||
use OCA\DAV\Db\PropertyMapper;
|
||||
use OCA\DAV\Events\SabrePluginAddEvent;
|
||||
use OCA\DAV\Events\SabrePluginAuthInitEvent;
|
||||
use OCA\DAV\Files\BrowserErrorPagePlugin;
|
||||
|
|
@ -108,6 +111,7 @@ class Server {
|
|||
private IRequest $request,
|
||||
private string $baseUri,
|
||||
) {
|
||||
$debugEnabled = \OCP\Server::get(IConfig::class)->getSystemValue('debug', false);
|
||||
$this->profiler = \OCP\Server::get(IProfiler::class);
|
||||
if ($this->profiler->isEnabled()) {
|
||||
/** @var IEventLogger $eventLogger */
|
||||
|
|
@ -120,6 +124,7 @@ class Server {
|
|||
|
||||
$root = new RootCollection();
|
||||
$this->server = new \OCA\DAV\Connector\Sabre\Server(new CachingTree($root));
|
||||
$this->server->setLogger($logger);
|
||||
|
||||
// Add maintenance plugin
|
||||
$this->server->addPlugin(new MaintenancePlugin(\OCP\Server::get(IConfig::class), \OC::$server->getL10N('dav')));
|
||||
|
|
@ -167,7 +172,9 @@ class Server {
|
|||
$authPlugin->addBackend($authBackend);
|
||||
|
||||
// debugging
|
||||
if (\OCP\Server::get(IConfig::class)->getSystemValue('debug', false)) {
|
||||
if ($debugEnabled) {
|
||||
$this->server->debugEnabled = true;
|
||||
$this->server->addPlugin(new PropFindMonitorPlugin());
|
||||
$this->server->addPlugin(new \Sabre\DAV\Browser\Plugin());
|
||||
} else {
|
||||
$this->server->addPlugin(new DummyGetResponsePlugin());
|
||||
|
|
@ -232,6 +239,7 @@ class Server {
|
|||
\OCP\Server::get(IUserSession::class)
|
||||
));
|
||||
|
||||
// performance improvement plugins
|
||||
$this->server->addPlugin(new CopyEtagHeaderPlugin());
|
||||
$this->server->addPlugin(new RequestIdHeaderPlugin(\OCP\Server::get(IRequest::class)));
|
||||
$this->server->addPlugin(new UploadAutoMkcolPlugin());
|
||||
|
|
@ -243,6 +251,7 @@ class Server {
|
|||
$eventDispatcher,
|
||||
));
|
||||
$this->server->addPlugin(\OCP\Server::get(PaginatePlugin::class));
|
||||
$this->server->addPlugin(new PropFindPreloadNotifyPlugin());
|
||||
|
||||
// allow setup of additional plugins
|
||||
$eventDispatcher->dispatch('OCA\DAV\Connector\Sabre::addPlugin', $event);
|
||||
|
|
@ -301,6 +310,7 @@ class Server {
|
|||
$this->server->tree,
|
||||
\OCP\Server::get(IDBConnection::class),
|
||||
\OCP\Server::get(IUserSession::class)->getUser(),
|
||||
\OCP\Server::get(PropertyMapper::class),
|
||||
\OCP\Server::get(DefaultCalendarValidator::class),
|
||||
)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ use Sabre\DAV\Exception\BadRequest;
|
|||
use Sabre\DAV\Exception\Conflict;
|
||||
use Sabre\DAV\Exception\Forbidden;
|
||||
use Sabre\DAV\Exception\UnsupportedMediaType;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\PropPatch;
|
||||
use Sabre\HTTP\RequestInterface;
|
||||
|
|
@ -94,6 +95,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
|
||||
$server->protectedProperties[] = self::ID_PROPERTYNAME;
|
||||
|
||||
$server->on('preloadCollection', $this->preloadCollection(...));
|
||||
$server->on('propFind', [$this, 'handleGetProperties']);
|
||||
$server->on('propPatch', [$this, 'handleUpdateProperties']);
|
||||
$server->on('method:POST', [$this, 'httpPost']);
|
||||
|
|
@ -199,6 +201,40 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
}
|
||||
}
|
||||
|
||||
private function preloadCollection(
|
||||
PropFind $propFind,
|
||||
ICollection $collection,
|
||||
): void {
|
||||
if (!$collection instanceof Node) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($collection instanceof Directory
|
||||
&& !isset($this->cachedTagMappings[$collection->getId()])
|
||||
&& $propFind->getStatus(
|
||||
self::SYSTEM_TAGS_PROPERTYNAME
|
||||
) !== null) {
|
||||
$fileIds = [$collection->getId()];
|
||||
|
||||
// note: pre-fetching only supported for depth <= 1
|
||||
$folderContent = $collection->getChildren();
|
||||
foreach ($folderContent as $info) {
|
||||
if ($info instanceof Node) {
|
||||
$fileIds[] = $info->getId();
|
||||
}
|
||||
}
|
||||
|
||||
$tags = $this->tagMapper->getTagIdsForObjects($fileIds, 'files');
|
||||
|
||||
$this->cachedTagMappings += $tags;
|
||||
$emptyFileIds = array_diff($fileIds, array_keys($tags));
|
||||
|
||||
// also cache the ones that were not found
|
||||
foreach ($emptyFileIds as $fileId) {
|
||||
$this->cachedTagMappings[$fileId] = [];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves system tag properties
|
||||
|
|
@ -297,29 +333,6 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
|
|||
}
|
||||
|
||||
private function propfindForFile(PropFind $propFind, Node $node): void {
|
||||
if ($node instanceof Directory
|
||||
&& $propFind->getDepth() !== 0
|
||||
&& !is_null($propFind->getStatus(self::SYSTEM_TAGS_PROPERTYNAME))) {
|
||||
$fileIds = [$node->getId()];
|
||||
|
||||
// note: pre-fetching only supported for depth <= 1
|
||||
$folderContent = $node->getChildren();
|
||||
foreach ($folderContent as $info) {
|
||||
if ($info instanceof Node) {
|
||||
$fileIds[] = $info->getId();
|
||||
}
|
||||
}
|
||||
|
||||
$tags = $this->tagMapper->getTagIdsForObjects($fileIds, 'files');
|
||||
|
||||
$this->cachedTagMappings = $this->cachedTagMappings + $tags;
|
||||
$emptyFileIds = array_diff($fileIds, array_keys($tags));
|
||||
|
||||
// also cache the ones that were not found
|
||||
foreach ($emptyFileIds as $fileId) {
|
||||
$this->cachedTagMappings[$fileId] = [];
|
||||
}
|
||||
}
|
||||
|
||||
$propFind->handle(self::SYSTEM_TAGS_PROPERTYNAME, function () use ($node) {
|
||||
$user = $this->userSession->getUser();
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ use OCA\DAV\CalDAV\DefaultCalendarValidator;
|
|||
use OCA\DAV\Connector\Sabre\Directory;
|
||||
use OCA\DAV\Connector\Sabre\File;
|
||||
use OCA\DAV\DAV\CustomPropertiesBackend;
|
||||
use OCA\DAV\Db\PropertyMapper;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
use OCP\Server;
|
||||
|
|
@ -52,6 +53,7 @@ class CustomPropertiesBackendTest extends \Test\TestCase {
|
|||
$this->tree,
|
||||
Server::get(IDBConnection::class),
|
||||
$this->user,
|
||||
Server::get(PropertyMapper::class),
|
||||
$this->defaultCalendarValidator,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,133 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace unit\Connector\Sabre;
|
||||
|
||||
use OCA\DAV\Connector\Sabre\PropFindMonitorPlugin;
|
||||
use OCA\DAV\Connector\Sabre\Server;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Sabre\HTTP\Request;
|
||||
use Sabre\HTTP\Response;
|
||||
use Test\TestCase;
|
||||
|
||||
class PropFindMonitorPluginTest extends TestCase {
|
||||
|
||||
private PropFindMonitorPlugin $plugin;
|
||||
private Server&MockObject $server;
|
||||
private LoggerInterface&MockObject $logger;
|
||||
private Request&MockObject $request;
|
||||
private Response&MockObject $response;
|
||||
|
||||
public static function dataTest(): array {
|
||||
$minQueriesTrigger = PropFindMonitorPlugin::THRESHOLD_QUERY_FACTOR
|
||||
* PropFindMonitorPlugin::THRESHOLD_NODES;
|
||||
return [
|
||||
'No queries logged' => [[], 0],
|
||||
'Plugins with queries in less than threshold nodes should not be logged' => [
|
||||
[
|
||||
'propFind' => [
|
||||
[
|
||||
'PluginName' => [
|
||||
'queries' => 100,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES - 1]
|
||||
],
|
||||
[],
|
||||
]
|
||||
],
|
||||
0
|
||||
],
|
||||
'Plugins with query-to-node ratio less than threshold should not be logged' => [
|
||||
[
|
||||
'propFind' => [
|
||||
[
|
||||
'PluginName' => [
|
||||
'queries' => $minQueriesTrigger - 1,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES ],
|
||||
],
|
||||
[],
|
||||
]
|
||||
],
|
||||
0
|
||||
],
|
||||
'Plugins with more nodes scanned than queries executed should not be logged' => [
|
||||
[
|
||||
'propFind' => [
|
||||
[
|
||||
'PluginName' => [
|
||||
'queries' => $minQueriesTrigger,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES * 2],
|
||||
],
|
||||
[],]
|
||||
],
|
||||
0
|
||||
],
|
||||
'Plugins with queries only in highest depth level should not be logged' => [
|
||||
[
|
||||
'propFind' => [
|
||||
[
|
||||
'PluginName' => [
|
||||
'queries' => $minQueriesTrigger,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES - 1
|
||||
]
|
||||
],
|
||||
[
|
||||
'PluginName' => [
|
||||
'queries' => $minQueriesTrigger * 2,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES
|
||||
]
|
||||
],
|
||||
]
|
||||
],
|
||||
0
|
||||
],
|
||||
'Plugins with too many queries should be logged' => [
|
||||
[
|
||||
'propFind' => [
|
||||
[
|
||||
'FirstPlugin' => [
|
||||
'queries' => $minQueriesTrigger,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES,
|
||||
],
|
||||
'SecondPlugin' => [
|
||||
'queries' => $minQueriesTrigger,
|
||||
'nodes' => PropFindMonitorPlugin::THRESHOLD_NODES,
|
||||
]
|
||||
],
|
||||
[],
|
||||
]
|
||||
],
|
||||
2
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider dataTest
|
||||
*/
|
||||
public function test(array $queries, $expectedLogCalls): void {
|
||||
$this->plugin->initialize($this->server);
|
||||
$this->server->expects($this->once())->method('getPluginQueries')
|
||||
->willReturn($queries);
|
||||
|
||||
$this->server->expects(empty($queries) ? $this->never() : $this->once())
|
||||
->method('getLogger')
|
||||
->willReturn($this->logger);
|
||||
|
||||
$this->logger->expects($this->exactly($expectedLogCalls))->method('error');
|
||||
$this->plugin->afterResponse($this->request, $this->response);
|
||||
}
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
|
||||
$this->plugin = new PropFindMonitorPlugin();
|
||||
$this->server = $this->createMock(Server::class);
|
||||
$this->logger = $this->createMock(LoggerInterface::class);
|
||||
$this->request = $this->createMock(Request::class);
|
||||
$this->response = $this->createMock(Response::class);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,92 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
namespace OCA\DAV\Tests\unit\Connector\Sabre;
|
||||
|
||||
use OCA\DAV\Connector\Sabre\PropFindPreloadNotifyPlugin;
|
||||
use PHPUnit\Framework\Attributes\DataProvider;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Sabre\DAV\ICollection;
|
||||
use Sabre\DAV\IFile;
|
||||
use Sabre\DAV\PropFind;
|
||||
use Sabre\DAV\Server;
|
||||
use Test\TestCase;
|
||||
|
||||
class PropFindPreloadNotifyPluginTest extends TestCase {
|
||||
|
||||
private Server&MockObject $server;
|
||||
private PropFindPreloadNotifyPlugin $plugin;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
|
||||
$this->server = $this->createMock(Server::class);
|
||||
$this->plugin = new PropFindPreloadNotifyPlugin();
|
||||
}
|
||||
|
||||
public function testInitialize(): void {
|
||||
$this->server
|
||||
->expects(self::once())
|
||||
->method('on')
|
||||
->with('propFind',
|
||||
$this->anything(), 1);
|
||||
$this->plugin->initialize($this->server);
|
||||
}
|
||||
|
||||
public static function dataTestCollectionPreloadNotifier(): array {
|
||||
return [
|
||||
'When node is not a collection, should not emit' => [
|
||||
IFile::class,
|
||||
1,
|
||||
false,
|
||||
true
|
||||
],
|
||||
'When node is a collection but depth is zero, should not emit' => [
|
||||
ICollection::class,
|
||||
0,
|
||||
false,
|
||||
true
|
||||
],
|
||||
'When node is a collection, and depth > 0, should emit' => [
|
||||
ICollection::class,
|
||||
1,
|
||||
true,
|
||||
true
|
||||
],
|
||||
'When node is a collection, and depth is infinite, should emit'
|
||||
=> [
|
||||
ICollection::class,
|
||||
Server::DEPTH_INFINITY,
|
||||
true,
|
||||
true
|
||||
],
|
||||
'When called called handler returns false, it should be returned'
|
||||
=> [
|
||||
ICollection::class,
|
||||
1,
|
||||
true,
|
||||
false
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
#[DataProvider(methodName: 'dataTestCollectionPreloadNotifier')]
|
||||
public function testCollectionPreloadNotifier(string $nodeType, int $depth, bool $shouldEmit, bool $emitReturns):
|
||||
void {
|
||||
$this->plugin->initialize($this->server);
|
||||
$propFind = $this->createMock(PropFind::class);
|
||||
$propFind->expects(self::any())->method('getDepth')->willReturn($depth);
|
||||
$node = $this->createMock($nodeType);
|
||||
|
||||
$expectation = $shouldEmit ? self::once() : self::never();
|
||||
$this->server->expects($expectation)->method('emit')->with('preloadCollection',
|
||||
[$propFind, $node])->willReturn($emitReturns);
|
||||
$return = $this->plugin->collectionPreloadNotifier($propFind, $node);
|
||||
$this->assertEquals($emitReturns, $return);
|
||||
}
|
||||
}
|
||||
|
|
@ -223,6 +223,7 @@ class SharesPluginTest extends \Test\TestCase {
|
|||
0
|
||||
);
|
||||
|
||||
$this->server->emit('preloadCollection', [$propFindRoot, $sabreNode]);
|
||||
$this->plugin->handleGetProperties(
|
||||
$propFindRoot,
|
||||
$sabreNode
|
||||
|
|
|
|||
|
|
@ -147,6 +147,8 @@ class TagsPluginTest extends \Test\TestCase {
|
|||
0
|
||||
);
|
||||
|
||||
$this->server->emit('preloadCollection', [$propFindRoot, $node]);
|
||||
|
||||
$this->plugin->handleGetProperties(
|
||||
$propFindRoot,
|
||||
$node
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ namespace OCA\DAV\Tests\unit\DAV;
|
|||
use OCA\DAV\CalDAV\Calendar;
|
||||
use OCA\DAV\CalDAV\DefaultCalendarValidator;
|
||||
use OCA\DAV\DAV\CustomPropertiesBackend;
|
||||
use OCA\DAV\Db\PropertyMapper;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IUser;
|
||||
|
|
@ -36,6 +37,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
|||
private IUser&MockObject $user;
|
||||
private DefaultCalendarValidator&MockObject $defaultCalendarValidator;
|
||||
private CustomPropertiesBackend $backend;
|
||||
private PropertyMapper $propertyMapper;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
|
|
@ -49,6 +51,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
|||
->with()
|
||||
->willReturn('dummy_user_42');
|
||||
$this->dbConnection = \OCP\Server::get(IDBConnection::class);
|
||||
$this->propertyMapper = \OCP\Server::get(PropertyMapper::class);
|
||||
$this->defaultCalendarValidator = $this->createMock(DefaultCalendarValidator::class);
|
||||
|
||||
$this->backend = new CustomPropertiesBackend(
|
||||
|
|
@ -56,6 +59,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
|||
$this->tree,
|
||||
$this->dbConnection,
|
||||
$this->user,
|
||||
$this->propertyMapper,
|
||||
$this->defaultCalendarValidator,
|
||||
);
|
||||
}
|
||||
|
|
@ -129,6 +133,7 @@ class CustomPropertiesBackendTest extends TestCase {
|
|||
$this->tree,
|
||||
$db,
|
||||
$this->user,
|
||||
$this->propertyMapper,
|
||||
$this->defaultCalendarValidator,
|
||||
);
|
||||
|
||||
|
|
|
|||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "شارك معي عبر #مُعرّف سحابة نكست كلاود الاتحادية، أنظُر {url} ",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "شارك معي عبر #مُعرّف سحابة نكست كلاود الاتحادية",
|
||||
"Share with me via Nextcloud" : "شاركه معي عبر النكست كلاود",
|
||||
"Cloud ID copied to the clipboard" : "تمّ نسخ مُعرِّف السحابة إلى الحافظة",
|
||||
"Copy to clipboard" : "نسخ الرابط",
|
||||
"Copy" : "إنسَخ",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "الحافظة غير متوفرة. رجاءً، قم بنسخ مُعرِّف السحابة يدوياً.",
|
||||
"Copied!" : "تمَّ النسخ!",
|
||||
"Federated Cloud" : "السحابة الاتحادية",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "مُشاركة بعيدة remote",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "هل ترغب في إضافة مُشاركة بعيدة remote ـ {name} من {owner}@{remote}؟",
|
||||
"Remote share password" : "كلمة مرور المشاركة البعيدة remote",
|
||||
"Incoming share could not be processed" : "لا يمكن معالجة المشاركة الواردة"
|
||||
"Incoming share could not be processed" : "لا يمكن معالجة المشاركة الواردة",
|
||||
"Cloud ID copied to the clipboard" : "تمّ نسخ مُعرِّف السحابة إلى الحافظة",
|
||||
"Copy to clipboard" : "نسخ الرابط"
|
||||
},
|
||||
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "شارك معي عبر #مُعرّف سحابة نكست كلاود الاتحادية، أنظُر {url} ",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "شارك معي عبر #مُعرّف سحابة نكست كلاود الاتحادية",
|
||||
"Share with me via Nextcloud" : "شاركه معي عبر النكست كلاود",
|
||||
"Cloud ID copied to the clipboard" : "تمّ نسخ مُعرِّف السحابة إلى الحافظة",
|
||||
"Copy to clipboard" : "نسخ الرابط",
|
||||
"Copy" : "إنسَخ",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "الحافظة غير متوفرة. رجاءً، قم بنسخ مُعرِّف السحابة يدوياً.",
|
||||
"Copied!" : "تمَّ النسخ!",
|
||||
"Federated Cloud" : "السحابة الاتحادية",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "مُشاركة بعيدة remote",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "هل ترغب في إضافة مُشاركة بعيدة remote ـ {name} من {owner}@{remote}؟",
|
||||
"Remote share password" : "كلمة مرور المشاركة البعيدة remote",
|
||||
"Incoming share could not be processed" : "لا يمكن معالجة المشاركة الواردة"
|
||||
"Incoming share could not be processed" : "لا يمكن معالجة المشاركة الواردة",
|
||||
"Cloud ID copied to the clipboard" : "تمّ نسخ مُعرِّف السحابة إلى الحافظة",
|
||||
"Copy to clipboard" : "نسخ الرابط"
|
||||
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"
|
||||
}
|
||||
|
|
@ -34,8 +34,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Compartir conmigo pente la mio ID de nube federada de #Nextcloud, mira {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo pente la mio ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo per Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "La ID de la nube copióse nel cartafueyu",
|
||||
"Copy to clipboard" : "Copiar nel cartafueyu",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copióse!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pues compartir conteníu con cualesquier persona qu'use un sirvidor de Nextcloud o otros sirvidores y servicios compatibles con Open Cloud Mesh (OCM). Namás indica la ID de na nube federada nel cuadru de diálogu d'usu compartíu. Aseméyase a persona@nube.exemplu.com",
|
||||
|
|
@ -49,6 +48,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Amestar un elementu compartíu remotu",
|
||||
"Remote share" : "Compartición remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Quies amestar la compartición remota «{name}» de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña de la compartición remota"
|
||||
"Remote share password" : "Contraseña de la compartición remota",
|
||||
"Cloud ID copied to the clipboard" : "La ID de la nube copióse nel cartafueyu",
|
||||
"Copy to clipboard" : "Copiar nel cartafueyu"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -32,8 +32,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Compartir conmigo pente la mio ID de nube federada de #Nextcloud, mira {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo pente la mio ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo per Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "La ID de la nube copióse nel cartafueyu",
|
||||
"Copy to clipboard" : "Copiar nel cartafueyu",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copióse!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Pues compartir conteníu con cualesquier persona qu'use un sirvidor de Nextcloud o otros sirvidores y servicios compatibles con Open Cloud Mesh (OCM). Namás indica la ID de na nube federada nel cuadru de diálogu d'usu compartíu. Aseméyase a persona@nube.exemplu.com",
|
||||
|
|
@ -47,6 +46,8 @@
|
|||
"Add remote share" : "Amestar un elementu compartíu remotu",
|
||||
"Remote share" : "Compartición remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Quies amestar la compartición remota «{name}» de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña de la compartición remota"
|
||||
"Remote share password" : "Contraseña de la compartición remota",
|
||||
"Cloud ID copied to the clipboard" : "La ID de la nube copióse nel cartafueyu",
|
||||
"Copy to clipboard" : "Copiar nel cartafueyu"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -26,8 +26,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете с мен чрез моя #Nextcloud Federated Cloud ID, вижте {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Споделете с мен, чрез моя #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Споделете с мен, чрез Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud идентификатора е копиран в клипборда",
|
||||
"Copy to clipboard" : "Копиране в клипборда",
|
||||
"Copy" : "Копие",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Федериран облак",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделяте с всеки, който използва сървър Nextcloud или други сървъри и услуги, съвместими с Open Cloud Mesh (OCM)! Просто поставете техния идентификатор за Федериран облак в диалоговия прозорец за споделяне. Изглежда като person@cloud.example.com",
|
||||
|
|
@ -40,6 +39,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Добави отдалечено споделяне",
|
||||
"Remote share" : "Отдалечено споделяне",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Искате ли да добавите отдалечено споделяне {name} от {owner}@{remote}?",
|
||||
"Remote share password" : "Парола за отдалечено споделяне"
|
||||
"Remote share password" : "Парола за отдалечено споделяне",
|
||||
"Cloud ID copied to the clipboard" : "Cloud идентификатора е копиран в клипборда",
|
||||
"Copy to clipboard" : "Копиране в клипборда"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -24,8 +24,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете с мен чрез моя #Nextcloud Federated Cloud ID, вижте {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Споделете с мен, чрез моя #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Споделете с мен, чрез Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud идентификатора е копиран в клипборда",
|
||||
"Copy to clipboard" : "Копиране в клипборда",
|
||||
"Copy" : "Копие",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Федериран облак",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделяте с всеки, който използва сървър Nextcloud или други сървъри и услуги, съвместими с Open Cloud Mesh (OCM)! Просто поставете техния идентификатор за Федериран облак в диалоговия прозорец за споделяне. Изглежда като person@cloud.example.com",
|
||||
|
|
@ -38,6 +37,8 @@
|
|||
"Add remote share" : "Добави отдалечено споделяне",
|
||||
"Remote share" : "Отдалечено споделяне",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Искате ли да добавите отдалечено споделяне {name} от {owner}@{remote}?",
|
||||
"Remote share password" : "Парола за отдалечено споделяне"
|
||||
"Remote share password" : "Парола за отдалечено споделяне",
|
||||
"Cloud ID copied to the clipboard" : "Cloud идентификатора е копиран в клипборда",
|
||||
"Copy to clipboard" : "Копиране в клипборда"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -37,8 +37,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparteix contingut amb mi amb el meu ID del núvol federat del #Nextcloud, consulta {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparteix contingut amb mi amb el meu ID del núvol federat del #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparteix contingut amb mi a través del Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "S'ha copiat l'ID del núvol al porta-retalls",
|
||||
"Copy to clipboard" : "Copia-ho al porta-retalls",
|
||||
"Copy" : "Còpia",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Porta-retalls no disponible. Copieu l'identificador del núvol manualment.",
|
||||
"Copied!" : "S'ha copiat!",
|
||||
"Federated Cloud" : "Núvol federat",
|
||||
|
|
@ -56,6 +55,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Element compartit remot",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir l'element compartit remot {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contrasenya de l'element compartit remot",
|
||||
"Incoming share could not be processed" : "No s'ha pogut processar la compartició entrant"
|
||||
"Incoming share could not be processed" : "No s'ha pogut processar la compartició entrant",
|
||||
"Cloud ID copied to the clipboard" : "S'ha copiat l'ID del núvol al porta-retalls",
|
||||
"Copy to clipboard" : "Copia-ho al porta-retalls"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -35,8 +35,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparteix contingut amb mi amb el meu ID del núvol federat del #Nextcloud, consulta {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparteix contingut amb mi amb el meu ID del núvol federat del #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparteix contingut amb mi a través del Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "S'ha copiat l'ID del núvol al porta-retalls",
|
||||
"Copy to clipboard" : "Copia-ho al porta-retalls",
|
||||
"Copy" : "Còpia",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Porta-retalls no disponible. Copieu l'identificador del núvol manualment.",
|
||||
"Copied!" : "S'ha copiat!",
|
||||
"Federated Cloud" : "Núvol federat",
|
||||
|
|
@ -54,6 +53,8 @@
|
|||
"Remote share" : "Element compartit remot",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir l'element compartit remot {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contrasenya de l'element compartit remot",
|
||||
"Incoming share could not be processed" : "No s'ha pogut processar la compartició entrant"
|
||||
"Incoming share could not be processed" : "No s'ha pogut processar la compartició entrant",
|
||||
"Cloud ID copied to the clipboard" : "S'ha copiat l'ID del núvol al porta-retalls",
|
||||
"Copy to clipboard" : "Copia-ho al porta-retalls"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Sdílejte se mnou prostřednictvím mého #Nextcloud identifikátoru v rámci federovaného cloudu – více na {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Sdílejte se mnou pomocí mého #Nextcloud identifikátoru v rámci federovaného cloudu",
|
||||
"Share with me via Nextcloud" : "Sdílet se mnou přes Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloudový identifikátor zkopírován do schránky",
|
||||
"Copy to clipboard" : "Zkopírovat do schránky",
|
||||
"Copy" : "Zkopírovat",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schránka není k dispozici. Zkopírujte cloudový identifikátor ručně.",
|
||||
"Copied!" : "Zkopírováno",
|
||||
"Federated Cloud" : "Federovaný cloud",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Vzdálené sdílení",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené sdílení {name} od {owner}@{remote}?",
|
||||
"Remote share password" : "Heslo ke vzdálenému sdílení",
|
||||
"Incoming share could not be processed" : "Příchozí sdílení se nepodařilo zpracovat"
|
||||
"Incoming share could not be processed" : "Příchozí sdílení se nepodařilo zpracovat",
|
||||
"Cloud ID copied to the clipboard" : "Cloudový identifikátor zkopírován do schránky",
|
||||
"Copy to clipboard" : "Zkopírovat do schránky"
|
||||
},
|
||||
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Sdílejte se mnou prostřednictvím mého #Nextcloud identifikátoru v rámci federovaného cloudu – více na {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Sdílejte se mnou pomocí mého #Nextcloud identifikátoru v rámci federovaného cloudu",
|
||||
"Share with me via Nextcloud" : "Sdílet se mnou přes Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloudový identifikátor zkopírován do schránky",
|
||||
"Copy to clipboard" : "Zkopírovat do schránky",
|
||||
"Copy" : "Zkopírovat",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schránka není k dispozici. Zkopírujte cloudový identifikátor ručně.",
|
||||
"Copied!" : "Zkopírováno",
|
||||
"Federated Cloud" : "Federovaný cloud",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "Vzdálené sdílení",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené sdílení {name} od {owner}@{remote}?",
|
||||
"Remote share password" : "Heslo ke vzdálenému sdílení",
|
||||
"Incoming share could not be processed" : "Příchozí sdílení se nepodařilo zpracovat"
|
||||
"Incoming share could not be processed" : "Příchozí sdílení se nepodařilo zpracovat",
|
||||
"Cloud ID copied to the clipboard" : "Cloudový identifikátor zkopírován do schránky",
|
||||
"Copy to clipboard" : "Zkopírovat do schránky"
|
||||
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med mig gennem min #Nextcloud Sammenkoblings Cloud ID, se {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med mig gennem min #Nextcloud sammenkoblings Cloud ID",
|
||||
"Share with me via Nextcloud" : "Del med mig gennem Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
|
||||
"Copy to clipboard" : "Kopier til udklipsholder",
|
||||
"Copy" : "Kopiér",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Udklipsholder ikke tilgængelig. Kopier venligst Cloud ID'et manuelt.",
|
||||
"Copied!" : "Kopieret!",
|
||||
"Federated Cloud" : "Sammenkoblet Cloud",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Eksterne drev",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du at tilføje det eksterne drev {name} fra {owner}@{remote}?",
|
||||
"Remote share password" : "Fjerndrev adgangskode",
|
||||
"Incoming share could not be processed" : "Indgående deling kunne ikke behandles"
|
||||
"Incoming share could not be processed" : "Indgående deling kunne ikke behandles",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
|
||||
"Copy to clipboard" : "Kopier til udklipsholder"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med mig gennem min #Nextcloud Sammenkoblings Cloud ID, se {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med mig gennem min #Nextcloud sammenkoblings Cloud ID",
|
||||
"Share with me via Nextcloud" : "Del med mig gennem Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
|
||||
"Copy to clipboard" : "Kopier til udklipsholder",
|
||||
"Copy" : "Kopiér",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Udklipsholder ikke tilgængelig. Kopier venligst Cloud ID'et manuelt.",
|
||||
"Copied!" : "Kopieret!",
|
||||
"Federated Cloud" : "Sammenkoblet Cloud",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "Eksterne drev",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du at tilføje det eksterne drev {name} fra {owner}@{remote}?",
|
||||
"Remote share password" : "Fjerndrev adgangskode",
|
||||
"Incoming share could not be processed" : "Indgående deling kunne ikke behandles"
|
||||
"Incoming share could not be processed" : "Indgående deling kunne ikke behandles",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID er kopieret til udklipsholderen.",
|
||||
"Copy to clipboard" : "Kopier til udklipsholder"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Teile mit mir über Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren",
|
||||
"Cloud ID copied" : "Cloud-ID kopiert",
|
||||
"Copy" : "Kopieren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Externe Freigabe",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soll die externe Freigabe {name} von {owner}@{remote} hinzugefügt werden?",
|
||||
"Remote share password" : "Passwort für die externe Freigabe",
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden"
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Teile mit mir über meine #Nextcloud Federated-Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Teile mit mir über Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren",
|
||||
"Cloud ID copied" : "Cloud-ID kopiert",
|
||||
"Copy" : "Kopieren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Externe Freigabe",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soll die externe Freigabe {name} von {owner}@{remote} hinzugefügt werden?",
|
||||
"Remote share password" : "Passwort für die externe Freigabe",
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden"
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Teilen Sie mit mir über Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID wurde in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren",
|
||||
"Cloud ID copied" : "Cloud-ID kopiert",
|
||||
"Copy" : "Kopieren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Externe Freigabe",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchten Sie die externe Freigabe {name} von {owner}@{remote} hinzufügen?",
|
||||
"Remote share password" : "Passwort für die externe Freigabe",
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden"
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID wurde in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID, siehe {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Teilen Sie mit mir über meine #Nextcloud Federated-Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Teilen Sie mit mir über Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID wurde in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren",
|
||||
"Cloud ID copied" : "Cloud-ID kopiert",
|
||||
"Copy" : "Kopieren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Zwischenablage nicht verfügbar. Bitte die Cloud-ID manuell kopieren.",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Externe Freigabe",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchten Sie die externe Freigabe {name} von {owner}@{remote} hinzufügen?",
|
||||
"Remote share password" : "Passwort für die externe Freigabe",
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden"
|
||||
"Incoming share could not be processed" : "Eingehende Freigabe konnte nicht verarbeitet werden",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID wurde in die Zwischenablage kopiert",
|
||||
"Copy to clipboard" : "In die Zwischenablage kopieren"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -22,7 +22,7 @@ OC.L10N.register(
|
|||
"Provide federated file sharing across servers" : "Παρέχει κοινής χρήσης αρχεία μεταξύ διακομιστών",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #Nextcloud Federated Cloud ID μου",
|
||||
"Share with me via Nextcloud" : "Διαμοιραστείτε με εμένα μέσω του Nextcloud",
|
||||
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
|
||||
"Copy" : "Αντιγραφή",
|
||||
"Copied!" : "Αντιγράφτηκε!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Μπορείτε να διαμοιράζεστε με οποιονδήποτε χρησιμοποιεί Nextcloud ή άλλο συμβατό διακομιστή και υπηρεσιών Open Cloud Mesh (OCM)! Απλά προσθέστε το Federated Cloud ID στο πλαίσιο διαλόγου διαμοιρασμού. Θα μοιάζει με person@cloud.example.com",
|
||||
|
|
@ -35,6 +35,7 @@ OC.L10N.register(
|
|||
"Add remote share" : "Προσθήκη απομακρυσμένου κοινόχρηστου φακέλου",
|
||||
"Remote share" : "Απομακρυσμένος κοινόχρηστος φάκελος",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Θέλετε να προσθέσουμε τον απομακρυσμένο κοινόχρηστο φάκελο {name} από {owner}@{remote}?",
|
||||
"Remote share password" : "Συνθηματικό απομακρυσμένου κοινόχρηστου φακέλου"
|
||||
"Remote share password" : "Συνθηματικό απομακρυσμένου κοινόχρηστου φακέλου",
|
||||
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"Provide federated file sharing across servers" : "Παρέχει κοινής χρήσης αρχεία μεταξύ διακομιστών",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Διαμοιρασμός με εμένα μέσω του #Nextcloud Federated Cloud ID μου",
|
||||
"Share with me via Nextcloud" : "Διαμοιραστείτε με εμένα μέσω του Nextcloud",
|
||||
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο",
|
||||
"Copy" : "Αντιγραφή",
|
||||
"Copied!" : "Αντιγράφτηκε!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Μπορείτε να διαμοιράζεστε με οποιονδήποτε χρησιμοποιεί Nextcloud ή άλλο συμβατό διακομιστή και υπηρεσιών Open Cloud Mesh (OCM)! Απλά προσθέστε το Federated Cloud ID στο πλαίσιο διαλόγου διαμοιρασμού. Θα μοιάζει με person@cloud.example.com",
|
||||
|
|
@ -33,6 +33,7 @@
|
|||
"Add remote share" : "Προσθήκη απομακρυσμένου κοινόχρηστου φακέλου",
|
||||
"Remote share" : "Απομακρυσμένος κοινόχρηστος φάκελος",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Θέλετε να προσθέσουμε τον απομακρυσμένο κοινόχρηστο φάκελο {name} από {owner}@{remote}?",
|
||||
"Remote share password" : "Συνθηματικό απομακρυσμένου κοινόχρηστου φακέλου"
|
||||
"Remote share password" : "Συνθηματικό απομακρυσμένου κοινόχρηστου φακέλου",
|
||||
"Copy to clipboard" : "Αντιγραφή στο πρόχειρο"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Share with me through my #Nextcloud Federated Cloud ID, see {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Share with me through my #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Share with me via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard",
|
||||
"Cloud ID copied" : "Cloud ID copied",
|
||||
"Copy" : "Copy",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Remote share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?",
|
||||
"Remote share password" : "Remote share password",
|
||||
"Incoming share could not be processed" : "Incoming share could not be processed"
|
||||
"Incoming share could not be processed" : "Incoming share could not be processed",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Share with me through my #Nextcloud Federated Cloud ID, see {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Share with me through my #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Share with me via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard",
|
||||
"Cloud ID copied" : "Cloud ID copied",
|
||||
"Copy" : "Copy",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Clipboard not available. Please copy the cloud ID manually.",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Remote share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?",
|
||||
"Remote share password" : "Remote share password",
|
||||
"Incoming share could not be processed" : "Incoming share could not be processed"
|
||||
"Incoming share could not be processed" : "Incoming share could not be processed",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi ID de Nube Federada #Nextcloud, ve {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Cloud ID copied" : "ID de Nube copiado",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Recurso compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Deseas añadir el recurso compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del compartido remoto",
|
||||
"Incoming share could not be processed" : "Elemento compartido entrante no pudo ser procesado"
|
||||
"Incoming share could not be processed" : "Elemento compartido entrante no pudo ser procesado",
|
||||
"Cloud ID copied to the clipboard" : "ID de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi ID de Nube Federada #Nextcloud, ve {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartirlo conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartirlo conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Cloud ID copied" : "ID de Nube copiado",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Portapapeles no disponible. Por favor, copia el ID de nube manualmente.",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Recurso compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Deseas añadir el recurso compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del compartido remoto",
|
||||
"Incoming share could not be processed" : "Elemento compartido entrante no pudo ser procesado"
|
||||
"Incoming share could not be processed" : "Elemento compartido entrante no pudo ser procesado",
|
||||
"Cloud ID copied to the clipboard" : "ID de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -25,8 +25,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi ID de Nube Federada de #Nextcloud, consulta {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puedes compartir con cualquier persona que utilice un servidor Nextcloud u otros servidores y servicios compatibles con Open Cloud Mesh (OCM)! Simplemente ingresa su ID de Nube Federada en el diálogo de compartición. Se ve como person@cloud.example.com",
|
||||
|
|
@ -39,6 +38,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Agregar elemento compartido remoto",
|
||||
"Remote share" : "Elemento compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto"
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi ID de Nube Federada de #Nextcloud, consulta {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puedes compartir con cualquier persona que utilice un servidor Nextcloud u otros servidores y servicios compatibles con Open Cloud Mesh (OCM)! Simplemente ingresa su ID de Nube Federada en el diálogo de compartición. Se ve como person@cloud.example.com",
|
||||
|
|
@ -37,6 +36,8 @@
|
|||
"Add remote share" : "Agregar elemento compartido remoto",
|
||||
"Remote share" : "Elemento compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto"
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -34,8 +34,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi identificador de nube federada de #Nextcloud, vea {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Identificador de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor Nextcloud u otros servidores y servicios compatibles con Open Cloud Mesh (OCM)!. Sólo ponga el identificador de nube federada en el diálogo de compartir. Tiene la forma: persona@nube.ejemplo.com",
|
||||
|
|
@ -48,6 +47,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Agregar elemento compartido remoto",
|
||||
"Remote share" : "Elemento compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto"
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto",
|
||||
"Cloud ID copied to the clipboard" : "Identificador de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -32,8 +32,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparte conmigo a través de mi identificador de nube federada de #Nextcloud, vea {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartir conmigo a través de mi ID de Nube Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartir conmigo vía Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Identificador de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles",
|
||||
"Copy" : "Copiar",
|
||||
"Copied!" : "¡Copiado!",
|
||||
"Federated Cloud" : "Nube Federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "¡Puede compartir con cualquier persona que use un servidor Nextcloud u otros servidores y servicios compatibles con Open Cloud Mesh (OCM)!. Sólo ponga el identificador de nube federada en el diálogo de compartir. Tiene la forma: persona@nube.ejemplo.com",
|
||||
|
|
@ -46,6 +45,8 @@
|
|||
"Add remote share" : "Agregar elemento compartido remoto",
|
||||
"Remote share" : "Elemento compartido remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea agregar el elemento compartido remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto"
|
||||
"Remote share password" : "Contraseña del elemento compartido remoto",
|
||||
"Cloud ID copied to the clipboard" : "Identificador de nube copiado al portapapeles",
|
||||
"Copy to clipboard" : "Copiar al portapapeles"
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves, vaata {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves",
|
||||
"Share with me via Nextcloud" : "Jaga minuga Nextcloudi vahendusel",
|
||||
"Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
|
||||
"Copy to clipboard" : "Kopeeri lõikelauale",
|
||||
"Copy" : "Kopeeri",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
|
||||
"Copied!" : "Kopeeritud!",
|
||||
"Federated Cloud" : "Liitpilv",
|
||||
|
|
@ -67,6 +66,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Kaugjagamine",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?",
|
||||
"Remote share password" : "Kaugjagamise salasõna",
|
||||
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda"
|
||||
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda",
|
||||
"Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
|
||||
"Copy to clipboard" : "Kopeeri lõikelauale"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves, vaata {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Jaga minuga minu #Nextcloudi kasutajatunnuse abil liitpilves",
|
||||
"Share with me via Nextcloud" : "Jaga minuga Nextcloudi vahendusel",
|
||||
"Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
|
||||
"Copy to clipboard" : "Kopeeri lõikelauale",
|
||||
"Copy" : "Kopeeri",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Lõikelaud pole saadaval. Palun kopeeri kasutajatunnus liitpilves käsitsi.",
|
||||
"Copied!" : "Kopeeritud!",
|
||||
"Federated Cloud" : "Liitpilv",
|
||||
|
|
@ -65,6 +64,8 @@
|
|||
"Remote share" : "Kaugjagamine",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisada kaugjagamise {name} asukohast {owner}@{remote}?",
|
||||
"Remote share password" : "Kaugjagamise salasõna",
|
||||
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda"
|
||||
"Incoming share could not be processed" : "Sissetulevat kausta ei saanud töödelda",
|
||||
"Cloud ID copied to the clipboard" : "Kasutajatunnus liitpilves on kopeeritud lõikelauale",
|
||||
"Copy to clipboard" : "Kopeeri lõikelauale"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -36,8 +36,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Partekatu nirekin, nire federatutako #Nextcloud hodei IDa erabiliz, ikus {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Partekatu nirekin, nire federatutako #Nextcloud hodei IDa erabiliz",
|
||||
"Share with me via Nextcloud" : "Partekatu nirekin Nextcloud bidez",
|
||||
"Cloud ID copied to the clipboard" : "Hodei IDa arbelean kopiatu da",
|
||||
"Copy to clipboard" : "Kopiatu arbelera",
|
||||
"Copy" : "Kopiatu",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
|
||||
"Copied!" : "Kopiatuta!",
|
||||
"Federated Cloud" : "Hodei Federatua",
|
||||
|
|
@ -55,6 +54,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Urruneko partekatzea",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}(r)en {name} urruneko partekatzea gehitu nahi duzu?",
|
||||
"Remote share password" : "Urruneko partekatzearen pasahitza",
|
||||
"Incoming share could not be processed" : "Sarrerako partekatzea ezin izan da prozesatu"
|
||||
"Incoming share could not be processed" : "Sarrerako partekatzea ezin izan da prozesatu",
|
||||
"Cloud ID copied to the clipboard" : "Hodei IDa arbelean kopiatu da",
|
||||
"Copy to clipboard" : "Kopiatu arbelera"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -34,8 +34,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Partekatu nirekin, nire federatutako #Nextcloud hodei IDa erabiliz, ikus {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Partekatu nirekin, nire federatutako #Nextcloud hodei IDa erabiliz",
|
||||
"Share with me via Nextcloud" : "Partekatu nirekin Nextcloud bidez",
|
||||
"Cloud ID copied to the clipboard" : "Hodei IDa arbelean kopiatu da",
|
||||
"Copy to clipboard" : "Kopiatu arbelera",
|
||||
"Copy" : "Kopiatu",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Arbela ez dago eskuragarri, mesedez kopiatu hodei IDa eskuz.",
|
||||
"Copied!" : "Kopiatuta!",
|
||||
"Federated Cloud" : "Hodei Federatua",
|
||||
|
|
@ -53,6 +52,8 @@
|
|||
"Remote share" : "Urruneko partekatzea",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}(r)en {name} urruneko partekatzea gehitu nahi duzu?",
|
||||
"Remote share password" : "Urruneko partekatzearen pasahitza",
|
||||
"Incoming share could not be processed" : "Sarrerako partekatzea ezin izan da prozesatu"
|
||||
"Incoming share could not be processed" : "Sarrerako partekatzea ezin izan da prozesatu",
|
||||
"Cloud ID copied to the clipboard" : "Hodei IDa arbelean kopiatu da",
|
||||
"Copy to clipboard" : "Kopiatu arbelera"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -26,8 +26,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، به {url} مراجعه کنید",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید",
|
||||
"Share with me via Nextcloud" : "همرسانی با من روی نسکتکلود",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
|
||||
"Copy to clipboard" : "رونوشت به تختهگیره",
|
||||
"Copy" : "کپی",
|
||||
"Copied!" : "رونوشت شد!",
|
||||
"Federated Cloud" : "ابر خودگردان",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "میتوانید با هر کسی که از سرور Nextcloud یا سایر سرورها و سرویسهای سازگار با Open Cloud Mesh (OCM) استفاده میکند، اشتراکگذاری کنید! فقط شناسه ابری فدرال آنها را در گفتگوی اشتراک گذاری قرار دهید. به نظر می رسد person@cloud.example.com",
|
||||
|
|
@ -40,6 +39,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "افزودن همرسانی دوردست",
|
||||
"Remote share" : "همرسانی دوردست",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "میخواهید همرسانی دوردست {name} را از {owner}@{remote} بیفزایید؟",
|
||||
"Remote share password" : "گذرواژهٔ همرسانی دوردست"
|
||||
"Remote share password" : "گذرواژهٔ همرسانی دوردست",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
|
||||
"Copy to clipboard" : "رونوشت به تختهگیره"
|
||||
},
|
||||
"nplurals=2; plural=(n > 1);");
|
||||
|
|
|
|||
|
|
@ -24,8 +24,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید، به {url} مراجعه کنید",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "از طریق شناسه ابری فدرال #Nextcloud با من به اشتراک بگذارید",
|
||||
"Share with me via Nextcloud" : "همرسانی با من روی نسکتکلود",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
|
||||
"Copy to clipboard" : "رونوشت به تختهگیره",
|
||||
"Copy" : "کپی",
|
||||
"Copied!" : "رونوشت شد!",
|
||||
"Federated Cloud" : "ابر خودگردان",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "میتوانید با هر کسی که از سرور Nextcloud یا سایر سرورها و سرویسهای سازگار با Open Cloud Mesh (OCM) استفاده میکند، اشتراکگذاری کنید! فقط شناسه ابری فدرال آنها را در گفتگوی اشتراک گذاری قرار دهید. به نظر می رسد person@cloud.example.com",
|
||||
|
|
@ -38,6 +37,8 @@
|
|||
"Add remote share" : "افزودن همرسانی دوردست",
|
||||
"Remote share" : "همرسانی دوردست",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "میخواهید همرسانی دوردست {name} را از {owner}@{remote} بیفزایید؟",
|
||||
"Remote share password" : "گذرواژهٔ همرسانی دوردست"
|
||||
"Remote share password" : "گذرواژهٔ همرسانی دوردست",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID در کلیپ بورد کپی شد",
|
||||
"Copy to clipboard" : "رونوشت به تختهگیره"
|
||||
},"pluralForm" :"nplurals=2; plural=(n > 1);"
|
||||
}
|
||||
|
|
@ -22,7 +22,7 @@ OC.L10N.register(
|
|||
"Provide federated file sharing across servers" : "Mahdollistaa federoidun tiedostojaon palvelinten välillä",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Jaa kanssani käyttäen #Nextcloud ja federoitua pilvitunnistetta",
|
||||
"Share with me via Nextcloud" : "Jaa kanssani Nextcloudin kautta",
|
||||
"Copy to clipboard" : "Kopioi leikepöydälle",
|
||||
"Copy" : "Kopioi",
|
||||
"Copied!" : "Kopioitu!",
|
||||
"Federated Cloud" : "Federoitu pilvi",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Voit jakaa kenelle tahansa, joka käyttää Nextcloud-palvelinta tai muuta Open Cloud Mesh (OCM) -yhteensopivaa palvelinta tai palvelua! Kirjoita heidän federoidun pilven tunniste jaon kohteeksi. Se on muodossa henkilö@cloud.example.com",
|
||||
|
|
@ -36,6 +36,7 @@ OC.L10N.register(
|
|||
"Add remote share" : "Lisää etäjako",
|
||||
"Remote share" : "Etäjako",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?",
|
||||
"Remote share password" : "Etäjaon salasana"
|
||||
"Remote share password" : "Etäjaon salasana",
|
||||
"Copy to clipboard" : "Kopioi leikepöydälle"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
"Provide federated file sharing across servers" : "Mahdollistaa federoidun tiedostojaon palvelinten välillä",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Jaa kanssani käyttäen #Nextcloud ja federoitua pilvitunnistetta",
|
||||
"Share with me via Nextcloud" : "Jaa kanssani Nextcloudin kautta",
|
||||
"Copy to clipboard" : "Kopioi leikepöydälle",
|
||||
"Copy" : "Kopioi",
|
||||
"Copied!" : "Kopioitu!",
|
||||
"Federated Cloud" : "Federoitu pilvi",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Voit jakaa kenelle tahansa, joka käyttää Nextcloud-palvelinta tai muuta Open Cloud Mesh (OCM) -yhteensopivaa palvelinta tai palvelua! Kirjoita heidän federoidun pilven tunniste jaon kohteeksi. Se on muodossa henkilö@cloud.example.com",
|
||||
|
|
@ -34,6 +34,7 @@
|
|||
"Add remote share" : "Lisää etäjako",
|
||||
"Remote share" : "Etäjako",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?",
|
||||
"Remote share password" : "Etäjaon salasana"
|
||||
"Remote share password" : "Etäjaon salasana",
|
||||
"Copy to clipboard" : "Kopioi leikepöydälle"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Partagez avec moi grâce à mon ID de Cloud Fédéré #Nextcloud, voir {url}.",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Partagez avec moi grâce à mon ID de Cloud Fédéré #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Partagez avec moi via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Cloud Fédéré copié dans le presse-papiers",
|
||||
"Copy to clipboard" : "Copier dans le presse-papiers",
|
||||
"Copy" : "Copier",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
|
||||
"Copied!" : "Copié !",
|
||||
"Federated Cloud" : "Cloud Fédéré",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Partage distant",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} depuis {owner}@{remote} ?",
|
||||
"Remote share password" : "Mot de passe du partage distant",
|
||||
"Incoming share could not be processed" : "Le partage entrant n'a pas pu être traité"
|
||||
"Incoming share could not be processed" : "Le partage entrant n'a pas pu être traité",
|
||||
"Cloud ID copied to the clipboard" : "ID de Cloud Fédéré copié dans le presse-papiers",
|
||||
"Copy to clipboard" : "Copier dans le presse-papiers"
|
||||
},
|
||||
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Partagez avec moi grâce à mon ID de Cloud Fédéré #Nextcloud, voir {url}.",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Partagez avec moi grâce à mon ID de Cloud Fédéré #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Partagez avec moi via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Cloud Fédéré copié dans le presse-papiers",
|
||||
"Copy to clipboard" : "Copier dans le presse-papiers",
|
||||
"Copy" : "Copier",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Presse-papiers non disponible. Veuillez copier l'ID cloud manuellement.",
|
||||
"Copied!" : "Copié !",
|
||||
"Federated Cloud" : "Cloud Fédéré",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "Partage distant",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} depuis {owner}@{remote} ?",
|
||||
"Remote share password" : "Mot de passe du partage distant",
|
||||
"Incoming share could not be processed" : "Le partage entrant n'a pas pu être traité"
|
||||
"Incoming share could not be processed" : "Le partage entrant n'a pas pu être traité",
|
||||
"Cloud ID copied to the clipboard" : "ID de Cloud Fédéré copié dans le presse-papiers",
|
||||
"Copy to clipboard" : "Copier dans le presse-papiers"
|
||||
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Roinn liom trí m'aitheantas scamall #Nextcloud Federated Cloud, féach {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Roinn liom trí m'aitheantas scamall #Nextcloud Federated Cloud",
|
||||
"Share with me via Nextcloud" : "Roinn liom trí Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cóipeáladh Cloud ID chuig an ngearrthaisce",
|
||||
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
|
||||
"Copy" : "Cóipeáil",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
|
||||
"Copied!" : "Cóipeáladh!",
|
||||
"Federated Cloud" : "Scamall Cónaidhme",
|
||||
|
|
@ -67,6 +66,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Comhroinnt iargúlta",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ar mhaith leat an sciar cianda {name} ó {owner}@{remote} a chur leis?",
|
||||
"Remote share password" : "Pasfhocal comhroinnte cianda",
|
||||
"Incoming share could not be processed" : "Níorbh fhéidir an sciar isteach a phróiseáil"
|
||||
"Incoming share could not be processed" : "Níorbh fhéidir an sciar isteach a phróiseáil",
|
||||
"Cloud ID copied to the clipboard" : "Cóipeáladh Cloud ID chuig an ngearrthaisce",
|
||||
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce"
|
||||
},
|
||||
"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Roinn liom trí m'aitheantas scamall #Nextcloud Federated Cloud, féach {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Roinn liom trí m'aitheantas scamall #Nextcloud Federated Cloud",
|
||||
"Share with me via Nextcloud" : "Roinn liom trí Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cóipeáladh Cloud ID chuig an ngearrthaisce",
|
||||
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce",
|
||||
"Copy" : "Cóipeáil",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Níl an gearrthaisce ar fáil. Cóipeáil an t-aitheantas néil de láimh.",
|
||||
"Copied!" : "Cóipeáladh!",
|
||||
"Federated Cloud" : "Scamall Cónaidhme",
|
||||
|
|
@ -65,6 +64,8 @@
|
|||
"Remote share" : "Comhroinnt iargúlta",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ar mhaith leat an sciar cianda {name} ó {owner}@{remote} a chur leis?",
|
||||
"Remote share password" : "Pasfhocal comhroinnte cianda",
|
||||
"Incoming share could not be processed" : "Níorbh fhéidir an sciar isteach a phróiseáil"
|
||||
"Incoming share could not be processed" : "Níorbh fhéidir an sciar isteach a phróiseáil",
|
||||
"Cloud ID copied to the clipboard" : "Cóipeáladh Cloud ID chuig an ngearrthaisce",
|
||||
"Copy to clipboard" : "Cóipeáil chuig an ngearrthaisce"
|
||||
},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
|
||||
}
|
||||
|
|
@ -36,8 +36,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "O identificador de nube (Cloud ID) (foi copiado no portapapeis",
|
||||
"Copy to clipboard" : "Copiar no portapapeis.",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
|
|
@ -55,6 +54,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Compartición remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Quere engadir a compartición remota {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contrasinal da compartición remota",
|
||||
"Incoming share could not be processed" : "Non foi posíbel procesar a compartición entrante"
|
||||
"Incoming share could not be processed" : "Non foi posíbel procesar a compartición entrante",
|
||||
"Cloud ID copied to the clipboard" : "O identificador de nube (Cloud ID) (foi copiado no portapapeis",
|
||||
"Copy to clipboard" : "Copiar no portapapeis."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -34,8 +34,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud, vexa {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Comparta comigo a través do meu ID de nube federada de #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Comparte comigo a través de Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "O identificador de nube (Cloud ID) (foi copiado no portapapeis",
|
||||
"Copy to clipboard" : "Copiar no portapapeis.",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "O portapapeis non está dispoñíbel. Copie o ID da nube manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nube federada",
|
||||
|
|
@ -53,6 +52,8 @@
|
|||
"Remote share" : "Compartición remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Quere engadir a compartición remota {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Contrasinal da compartición remota",
|
||||
"Incoming share could not be processed" : "Non foi posíbel procesar a compartición entrante"
|
||||
"Incoming share could not be processed" : "Non foi posíbel procesar a compartición entrante",
|
||||
"Cloud ID copied to the clipboard" : "O identificador de nube (Cloud ID) (foi copiado no portapapeis",
|
||||
"Copy to clipboard" : "Copiar no portapapeis."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@ OC.L10N.register(
|
|||
"Provide federated file sharing across servers" : "Omogućite udruženo dijeljenje datoteka između poslužitelja",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda",
|
||||
"Share with me via Nextcloud" : "Dijelite sa mnom putem Nextclouda",
|
||||
"Copy to clipboard" : "Kopiraj u međuspremnik",
|
||||
"Copy" : "Kopirajte",
|
||||
"Copied!" : "Kopirano!",
|
||||
"Federated Cloud" : "Udruženi oblak",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com",
|
||||
|
|
@ -35,6 +35,7 @@ OC.L10N.register(
|
|||
"Add remote share" : "Dodaj udaljeno dijeljenje",
|
||||
"Remote share" : "Udaljeno dijeljenje",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni udjel {name} od {owner} u {remote}?",
|
||||
"Remote share password" : "Zaporka za udaljeno dijeljenje"
|
||||
"Remote share password" : "Zaporka za udaljeno dijeljenje",
|
||||
"Copy to clipboard" : "Kopiraj u međuspremnik"
|
||||
},
|
||||
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
"Provide federated file sharing across servers" : "Omogućite udruženo dijeljenje datoteka između poslužitelja",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda",
|
||||
"Share with me via Nextcloud" : "Dijelite sa mnom putem Nextclouda",
|
||||
"Copy to clipboard" : "Kopiraj u međuspremnik",
|
||||
"Copy" : "Kopirajte",
|
||||
"Copied!" : "Kopirano!",
|
||||
"Federated Cloud" : "Udruženi oblak",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com",
|
||||
|
|
@ -33,6 +33,7 @@
|
|||
"Add remote share" : "Dodaj udaljeno dijeljenje",
|
||||
"Remote share" : "Udaljeno dijeljenje",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni udjel {name} od {owner} u {remote}?",
|
||||
"Remote share password" : "Zaporka za udaljeno dijeljenje"
|
||||
"Remote share password" : "Zaporka za udaljeno dijeljenje",
|
||||
"Copy to clipboard" : "Kopiraj u međuspremnik"
|
||||
},"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;"
|
||||
}
|
||||
|
|
@ -36,8 +36,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Ossza meg velem a #Nextcloud föderált felhőazonosítóm segítségével, lásd {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem a #Nextcloud föderált felhőazonosítóm segítségével ",
|
||||
"Share with me via Nextcloud" : "Ossza meg velem a Nextcloudon keresztül",
|
||||
"Cloud ID copied to the clipboard" : "Felhőazonosító a vágólapra másolva",
|
||||
"Copy to clipboard" : "Másolás a vágólapra",
|
||||
"Copy" : "Másolás",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "A vágólap nem érhető el. Másolja át a felhőazonosítót kézileg.",
|
||||
"Copied!" : "Másolva!",
|
||||
"Federated Cloud" : "Föderált felhő",
|
||||
|
|
@ -55,6 +54,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Távoli megosztás",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Hozzáadja a(z) {name} távoli megosztást innen: {owner}@{remote}?",
|
||||
"Remote share password" : "Jelszó a távoli megosztáshoz",
|
||||
"Incoming share could not be processed" : "A bejövő megosztás nem dolgozható fel"
|
||||
"Incoming share could not be processed" : "A bejövő megosztás nem dolgozható fel",
|
||||
"Cloud ID copied to the clipboard" : "Felhőazonosító a vágólapra másolva",
|
||||
"Copy to clipboard" : "Másolás a vágólapra"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -34,8 +34,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Ossza meg velem a #Nextcloud föderált felhőazonosítóm segítségével, lásd {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Ossza meg velem a #Nextcloud föderált felhőazonosítóm segítségével ",
|
||||
"Share with me via Nextcloud" : "Ossza meg velem a Nextcloudon keresztül",
|
||||
"Cloud ID copied to the clipboard" : "Felhőazonosító a vágólapra másolva",
|
||||
"Copy to clipboard" : "Másolás a vágólapra",
|
||||
"Copy" : "Másolás",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "A vágólap nem érhető el. Másolja át a felhőazonosítót kézileg.",
|
||||
"Copied!" : "Másolva!",
|
||||
"Federated Cloud" : "Föderált felhő",
|
||||
|
|
@ -53,6 +52,8 @@
|
|||
"Remote share" : "Távoli megosztás",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Hozzáadja a(z) {name} távoli megosztást innen: {owner}@{remote}?",
|
||||
"Remote share password" : "Jelszó a távoli megosztáshoz",
|
||||
"Incoming share could not be processed" : "A bejövő megosztás nem dolgozható fel"
|
||||
"Incoming share could not be processed" : "A bejövő megosztás nem dolgozható fel",
|
||||
"Cloud ID copied to the clipboard" : "Felhőazonosító a vágólapra másolva",
|
||||
"Copy to clipboard" : "Másolás a vágólapra"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -36,8 +36,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #Nextcloud Federated Cloud ID, sjá {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Deila með mér í gegnum Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Skýjasambandsauðkenni afritað á klippispjald",
|
||||
"Copy to clipboard" : "Afrita á klippispjald",
|
||||
"Copy" : "Afrita",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Klippispjald er ekki tiltækt. Afritaðu skýjasambandsauðkennið handvirkt.",
|
||||
"Copied!" : "Afritað!",
|
||||
"Federated Cloud" : "Skýjasamband (federated)",
|
||||
|
|
@ -55,6 +54,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Fjartengd sameign",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Viltu bæta við fjartengdri sameign {name} frá {owner}@{remote}?",
|
||||
"Remote share password" : "Lykilorð fjartengdrar sameignar",
|
||||
"Incoming share could not be processed" : "Ekki var hægt að vinna með innkomandi sameign"
|
||||
"Incoming share could not be processed" : "Ekki var hægt að vinna með innkomandi sameign",
|
||||
"Cloud ID copied to the clipboard" : "Skýjasambandsauðkenni afritað á klippispjald",
|
||||
"Copy to clipboard" : "Afrita á klippispjald"
|
||||
},
|
||||
"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);");
|
||||
|
|
|
|||
|
|
@ -34,8 +34,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #Nextcloud Federated Cloud ID, sjá {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Deila með mér í gegnum víðværa skýjasambandsauðkennið mitt #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Deila með mér í gegnum Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Skýjasambandsauðkenni afritað á klippispjald",
|
||||
"Copy to clipboard" : "Afrita á klippispjald",
|
||||
"Copy" : "Afrita",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Klippispjald er ekki tiltækt. Afritaðu skýjasambandsauðkennið handvirkt.",
|
||||
"Copied!" : "Afritað!",
|
||||
"Federated Cloud" : "Skýjasamband (federated)",
|
||||
|
|
@ -53,6 +52,8 @@
|
|||
"Remote share" : "Fjartengd sameign",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Viltu bæta við fjartengdri sameign {name} frá {owner}@{remote}?",
|
||||
"Remote share password" : "Lykilorð fjartengdrar sameignar",
|
||||
"Incoming share could not be processed" : "Ekki var hægt að vinna með innkomandi sameign"
|
||||
"Incoming share could not be processed" : "Ekki var hægt að vinna með innkomandi sameign",
|
||||
"Cloud ID copied to the clipboard" : "Skýjasambandsauðkenni afritað á klippispjald",
|
||||
"Copy to clipboard" : "Afrita á klippispjald"
|
||||
},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"
|
||||
}
|
||||
|
|
@ -29,6 +29,8 @@ OC.L10N.register(
|
|||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Se abilitata, l'input di ricerca durante la creazione delle condivisioni verrà inviato a un sistema esterno che fornisce una rubrica pubblica e globale.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Serve a recuperare l'ID cloud federato per semplificare la condivisione federata.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Inoltre, gli indirizzi email degli utenti potrebbero essere inviati a tale sistema per verificarli.",
|
||||
"Disable querying" : "Disabilita le query",
|
||||
"Enable querying" : "Abilita query",
|
||||
"Unable to update federated files sharing config" : "Impossibile aggiornare la configurazione della condivisione federata dei file",
|
||||
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Regola come le persone possono condividere tra i server. Ciò include anche le condivisioni tra persone in questo server se usano la condivisione federata.",
|
||||
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Consenti alle persone su questo server di inviare condivisioni ad altri server (questa opzione consente anche l'accesso WebDAV alle condivisioni pubbliche)",
|
||||
|
|
@ -42,8 +44,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Condividi con me attraverso il mio ID di cloud federato #Nextcloud, vedi {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Condividi con me tramite Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID di cloud copiato negli appunti",
|
||||
"Copy to clipboard" : "Copia negli appunti",
|
||||
"Cloud ID copied" : "ID cloud copiato",
|
||||
"Copy" : "Copia",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Appunti non disponibili. Copia manualmente l'ID cloud.",
|
||||
"Copied!" : "Copiato!",
|
||||
"Federated Cloud" : "Cloud federata",
|
||||
|
|
@ -61,6 +63,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Condivisione remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Vuoi aggiungere la condivisione remota {name} da {owner}@{remote}?",
|
||||
"Remote share password" : "Password della condivisione remota",
|
||||
"Incoming share could not be processed" : "Non è stato possibile elaborare la condivisione in entrata"
|
||||
"Incoming share could not be processed" : "Non è stato possibile elaborare la condivisione in entrata",
|
||||
"Cloud ID copied to the clipboard" : "ID di cloud copiato negli appunti",
|
||||
"Copy to clipboard" : "Copia negli appunti"
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Se abilitata, l'input di ricerca durante la creazione delle condivisioni verrà inviato a un sistema esterno che fornisce una rubrica pubblica e globale.",
|
||||
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Serve a recuperare l'ID cloud federato per semplificare la condivisione federata.",
|
||||
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Inoltre, gli indirizzi email degli utenti potrebbero essere inviati a tale sistema per verificarli.",
|
||||
"Disable querying" : "Disabilita le query",
|
||||
"Enable querying" : "Abilita query",
|
||||
"Unable to update federated files sharing config" : "Impossibile aggiornare la configurazione della condivisione federata dei file",
|
||||
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Regola come le persone possono condividere tra i server. Ciò include anche le condivisioni tra persone in questo server se usano la condivisione federata.",
|
||||
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Consenti alle persone su questo server di inviare condivisioni ad altri server (questa opzione consente anche l'accesso WebDAV alle condivisioni pubbliche)",
|
||||
|
|
@ -40,8 +42,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Condividi con me attraverso il mio ID di cloud federato #Nextcloud, vedi {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Condividi con me attraverso il mio ID di cloud federata #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Condividi con me tramite Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID di cloud copiato negli appunti",
|
||||
"Copy to clipboard" : "Copia negli appunti",
|
||||
"Cloud ID copied" : "ID cloud copiato",
|
||||
"Copy" : "Copia",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Appunti non disponibili. Copia manualmente l'ID cloud.",
|
||||
"Copied!" : "Copiato!",
|
||||
"Federated Cloud" : "Cloud federata",
|
||||
|
|
@ -59,6 +61,8 @@
|
|||
"Remote share" : "Condivisione remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Vuoi aggiungere la condivisione remota {name} da {owner}@{remote}?",
|
||||
"Remote share password" : "Password della condivisione remota",
|
||||
"Incoming share could not be processed" : "Non è stato possibile elaborare la condivisione in entrata"
|
||||
"Incoming share could not be processed" : "Non è stato possibile elaborare la condivisione in entrata",
|
||||
"Cloud ID copied to the clipboard" : "ID di cloud copiato negli appunti",
|
||||
"Copy to clipboard" : "Copia negli appunti"
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "私の #Nextcloud Federated Cloud ID を通して共有してください、 {url} を参照してください。",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
|
||||
"Share with me via Nextcloud" : "Nextcloud 経由で共有",
|
||||
"Cloud ID copied to the clipboard" : "クリップボードにクラウドIDをコピーしました",
|
||||
"Copy to clipboard" : "クリップボードにコピー",
|
||||
"Copy" : "コピー",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "クリップボードが使用できません。手動でクラウドIDをコピーしてください。",
|
||||
"Copied!" : "コピーしました!",
|
||||
"Federated Cloud" : "クラウド共有",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "リモート共有",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} からのリモート共有 {name} を追加してもよろしいですか?",
|
||||
"Remote share password" : "リモート共有のパスワード",
|
||||
"Incoming share could not be processed" : "受信した共有を処理できませんでした"
|
||||
"Incoming share could not be processed" : "受信した共有を処理できませんでした",
|
||||
"Cloud ID copied to the clipboard" : "クリップボードにクラウドIDをコピーしました",
|
||||
"Copy to clipboard" : "クリップボードにコピー"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "私の #Nextcloud Federated Cloud ID を通して共有してください、 {url} を参照してください。",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "#Nextcloud の「クラウド共有ID」で私と共有できます。",
|
||||
"Share with me via Nextcloud" : "Nextcloud 経由で共有",
|
||||
"Cloud ID copied to the clipboard" : "クリップボードにクラウドIDをコピーしました",
|
||||
"Copy to clipboard" : "クリップボードにコピー",
|
||||
"Copy" : "コピー",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "クリップボードが使用できません。手動でクラウドIDをコピーしてください。",
|
||||
"Copied!" : "コピーしました!",
|
||||
"Federated Cloud" : "クラウド共有",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "リモート共有",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} からのリモート共有 {name} を追加してもよろしいですか?",
|
||||
"Remote share password" : "リモート共有のパスワード",
|
||||
"Incoming share could not be processed" : "受信した共有を処理できませんでした"
|
||||
"Incoming share could not be processed" : "受信した共有を処理できませんでした",
|
||||
"Cloud ID copied to the clipboard" : "クリップボードにクラウドIDをコピーしました",
|
||||
"Copy to clipboard" : "クリップボードにコピー"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
|
|
@ -25,8 +25,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Share with me through my #Nextcloud Federated Cloud ID, see {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Share with me through my #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Share with me via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard",
|
||||
"Copy" : "Copy",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
|
||||
|
|
@ -39,6 +38,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Add remote share",
|
||||
"Remote share" : "Remote share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?",
|
||||
"Remote share password" : "Remote share password"
|
||||
"Remote share password" : "Remote share password",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard"
|
||||
},
|
||||
"nplurals=2; plural=(n!=1);");
|
||||
|
|
|
|||
|
|
@ -23,8 +23,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Share with me through my #Nextcloud Federated Cloud ID, see {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Share with me through my #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Share with me via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard",
|
||||
"Copy" : "Copy",
|
||||
"Copied!" : "Copied!",
|
||||
"Federated Cloud" : "Federated Cloud",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com",
|
||||
|
|
@ -37,6 +36,8 @@
|
|||
"Add remote share" : "Add remote share",
|
||||
"Remote share" : "Remote share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?",
|
||||
"Remote share password" : "Remote share password"
|
||||
"Remote share password" : "Remote share password",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID copied to the clipboard",
|
||||
"Copy to clipboard" : "Copy to clipboard"
|
||||
},"pluralForm" :"nplurals=2; plural=(n!=1);"
|
||||
}
|
||||
|
|
@ -27,8 +27,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "내 #Nextcloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "내 #Nextcloud 연합 클라우드 ID를 통해서 공유됨",
|
||||
"Share with me via Nextcloud" : "Nextcloud로 나와 공유하기",
|
||||
"Cloud ID copied to the clipboard" : "클라우드 ID가 클립보드에 복사됨",
|
||||
"Copy to clipboard" : "클립보드로 복사",
|
||||
"Copy" : "복사",
|
||||
"Copied!" : "복사 성공!",
|
||||
"Federated Cloud" : "연합 클라우드",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Nextcloud 서버나 다른 Open Cloud Mesh(OCM) 호환 서버 및 서비스 사용자와 공유할 수 있습니다! 공유 대화 상자에 연합 클라우드 ID를 입력하십시오. person@cloud.example.com 형식입니다",
|
||||
|
|
@ -41,6 +40,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "원격 공유 추가",
|
||||
"Remote share" : "원격 공유",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}의 원격 공유 {name}을(를) 추가하시겠습니까?",
|
||||
"Remote share password" : "원격 공유 암호"
|
||||
"Remote share password" : "원격 공유 암호",
|
||||
"Cloud ID copied to the clipboard" : "클라우드 ID가 클립보드에 복사됨",
|
||||
"Copy to clipboard" : "클립보드로 복사"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
|
|
|||
|
|
@ -25,8 +25,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "내 #Nextcloud 연합 클라우드 ID를 통해서 공유됨, 더 알아보기: {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "내 #Nextcloud 연합 클라우드 ID를 통해서 공유됨",
|
||||
"Share with me via Nextcloud" : "Nextcloud로 나와 공유하기",
|
||||
"Cloud ID copied to the clipboard" : "클라우드 ID가 클립보드에 복사됨",
|
||||
"Copy to clipboard" : "클립보드로 복사",
|
||||
"Copy" : "복사",
|
||||
"Copied!" : "복사 성공!",
|
||||
"Federated Cloud" : "연합 클라우드",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Nextcloud 서버나 다른 Open Cloud Mesh(OCM) 호환 서버 및 서비스 사용자와 공유할 수 있습니다! 공유 대화 상자에 연합 클라우드 ID를 입력하십시오. person@cloud.example.com 형식입니다",
|
||||
|
|
@ -39,6 +38,8 @@
|
|||
"Add remote share" : "원격 공유 추가",
|
||||
"Remote share" : "원격 공유",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote}의 원격 공유 {name}을(를) 추가하시겠습니까?",
|
||||
"Remote share password" : "원격 공유 암호"
|
||||
"Remote share password" : "원격 공유 암호",
|
||||
"Cloud ID copied to the clipboard" : "클라우드 ID가 클립보드에 복사됨",
|
||||
"Copy to clipboard" : "클립보드로 복사"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
|
|
@ -26,8 +26,6 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете со мене преку мојот Федерален Cloud ID, види {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Споделете со мене преку мојот Федерален Cloud ID",
|
||||
"Share with me via Nextcloud" : "Сподели со мене",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд",
|
||||
"Copy to clipboard" : "Копирај во клипборд",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Федерален клауд",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделувате со секој што користи Nextcloud сервер или друг вид на Open Cloud Mesh (OCM) компатибилен сервер или сервис! Само внесете го федералниот ID во полето за споделување. Треба да изгледа korisnik@cloud.primer.com",
|
||||
|
|
@ -40,6 +38,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Додади далечинско споделување",
|
||||
"Remote share" : "Далечинско споделување",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Дали сакате да додадете далечинско споделување на {name} од {owner}@{remote}?",
|
||||
"Remote share password" : "Лозинка за далечинско споделување"
|
||||
"Remote share password" : "Лозинка за далечинско споделување",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд",
|
||||
"Copy to clipboard" : "Копирај во клипборд"
|
||||
},
|
||||
"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
|
||||
|
|
|
|||
|
|
@ -24,8 +24,6 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Споделете со мене преку мојот Федерален Cloud ID, види {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Споделете со мене преку мојот Федерален Cloud ID",
|
||||
"Share with me via Nextcloud" : "Сподели со мене",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд",
|
||||
"Copy to clipboard" : "Копирај во клипборд",
|
||||
"Copied!" : "Копирано!",
|
||||
"Federated Cloud" : "Федерален клауд",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Можете да споделувате со секој што користи Nextcloud сервер или друг вид на Open Cloud Mesh (OCM) компатибилен сервер или сервис! Само внесете го федералниот ID во полето за споделување. Треба да изгледа korisnik@cloud.primer.com",
|
||||
|
|
@ -38,6 +36,8 @@
|
|||
"Add remote share" : "Додади далечинско споделување",
|
||||
"Remote share" : "Далечинско споделување",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Дали сакате да додадете далечинско споделување на {name} од {owner}@{remote}?",
|
||||
"Remote share password" : "Лозинка за далечинско споделување"
|
||||
"Remote share password" : "Лозинка за далечинско споделување",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID е копиран во клипборд",
|
||||
"Copy to clipboard" : "Копирај во клипборд"
|
||||
},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
|
||||
}
|
||||
|
|
@ -34,8 +34,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med meg gjennom min #Nextcloud ID for sammenknyttet sky, se {url}.",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky",
|
||||
"Share with me via Nextcloud" : "Del med meg via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Sky-ID kopiert til utklippstavlen",
|
||||
"Copy to clipboard" : "Kopiert til utklippstavlen",
|
||||
"Copy" : "Kopi",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Sammenknyttet sky",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker en Nextcloud-server eller andre Open Cloud Mesh (OCM)-kompatible servere og tjenester! Bare legg inn deres ID for sammenknyttet sky i delingsdialogen. Det ser ut som person@cloud.example.com.",
|
||||
|
|
@ -49,6 +48,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Legg til ekstern ressurs",
|
||||
"Remote share" : "Ekstern ressurs",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du å legge til ekstern ressurs {name} fra {owner}@{remote}?",
|
||||
"Remote share password" : "Passord for ekstern ressurs"
|
||||
"Remote share password" : "Passord for ekstern ressurs",
|
||||
"Cloud ID copied to the clipboard" : "Sky-ID kopiert til utklippstavlen",
|
||||
"Copy to clipboard" : "Kopiert til utklippstavlen"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -32,8 +32,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Del med meg gjennom min #Nextcloud ID for sammenknyttet sky, se {url}.",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Del med meg gjennom min #Nextcloud-ID for sammenknyttet sky",
|
||||
"Share with me via Nextcloud" : "Del med meg via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Sky-ID kopiert til utklippstavlen",
|
||||
"Copy to clipboard" : "Kopiert til utklippstavlen",
|
||||
"Copy" : "Kopi",
|
||||
"Copied!" : "Kopiert!",
|
||||
"Federated Cloud" : "Sammenknyttet sky",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Du kan dele med alle som bruker en Nextcloud-server eller andre Open Cloud Mesh (OCM)-kompatible servere og tjenester! Bare legg inn deres ID for sammenknyttet sky i delingsdialogen. Det ser ut som person@cloud.example.com.",
|
||||
|
|
@ -47,6 +46,8 @@
|
|||
"Add remote share" : "Legg til ekstern ressurs",
|
||||
"Remote share" : "Ekstern ressurs",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du å legge til ekstern ressurs {name} fra {owner}@{remote}?",
|
||||
"Remote share password" : "Passord for ekstern ressurs"
|
||||
"Remote share password" : "Passord for ekstern ressurs",
|
||||
"Cloud ID copied to the clipboard" : "Sky-ID kopiert til utklippstavlen",
|
||||
"Copy to clipboard" : "Kopiert til utklippstavlen"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -26,8 +26,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Deel met mij via mijn #Nextcloud Federated Cloud-ID, zie {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Deel met mij via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID gekopieerd naar het klembord",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord",
|
||||
"Copy" : "Kopiëren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Klembord niet beschikbaar. Kopieer de cloud-ID handmatig.",
|
||||
"Copied!" : "Gekopieerd!",
|
||||
"Federated Cloud" : "Gefedereerde Cloud",
|
||||
|
|
@ -43,6 +42,8 @@ OC.L10N.register(
|
|||
"Add remote share" : "Toevoegen externe share",
|
||||
"Remote share" : "Externe share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Wil je de externe share {name} van {owner}@{remote} toevoegen?",
|
||||
"Remote share password" : "Wachtwoord externe share"
|
||||
"Remote share password" : "Wachtwoord externe share",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID gekopieerd naar het klembord",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -24,8 +24,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Deel met mij via mijn #Nextcloud Federated Cloud-ID, zie {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Deel met mij via mijn #Nextcloud gefedereerde Cloud-ID",
|
||||
"Share with me via Nextcloud" : "Deel met mij via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID gekopieerd naar het klembord",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord",
|
||||
"Copy" : "Kopiëren",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Klembord niet beschikbaar. Kopieer de cloud-ID handmatig.",
|
||||
"Copied!" : "Gekopieerd!",
|
||||
"Federated Cloud" : "Gefedereerde Cloud",
|
||||
|
|
@ -41,6 +40,8 @@
|
|||
"Add remote share" : "Toevoegen externe share",
|
||||
"Remote share" : "Externe share",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Wil je de externe share {name} van {owner}@{remote} toevoegen?",
|
||||
"Remote share password" : "Wachtwoord externe share"
|
||||
"Remote share password" : "Wachtwoord externe share",
|
||||
"Cloud ID copied to the clipboard" : "Cloud-ID gekopieerd naar het klembord",
|
||||
"Copy to clipboard" : "Kopiëren naar het klembord"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej, zobacz {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej",
|
||||
"Share with me via Nextcloud" : "Udostępnij mi za pomocą Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID chmury skopiowany do schowka",
|
||||
"Copy to clipboard" : "Kopiuj do schowka",
|
||||
"Cloud ID copied" : "Identyfikator Chmury skopiowany",
|
||||
"Copy" : "Skopiuj",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
|
||||
"Copied!" : "Skopiowano!",
|
||||
"Federated Cloud" : "Chmura Federacyjna",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Zdalne udostępnienie",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać zdalne udostępnienie {name} od {owner}@{remote}?",
|
||||
"Remote share password" : "Hasło zdalnego udostępnienia",
|
||||
"Incoming share could not be processed" : "Nie można przetworzyć przychodzącego udostępnienia"
|
||||
"Incoming share could not be processed" : "Nie można przetworzyć przychodzącego udostępnienia",
|
||||
"Cloud ID copied to the clipboard" : "ID chmury skopiowany do schowka",
|
||||
"Copy to clipboard" : "Kopiuj do schowka"
|
||||
},
|
||||
"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej, zobacz {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Udostępnij mi poprzez mój ID #Nextcloud Chmury Federacyjnej",
|
||||
"Share with me via Nextcloud" : "Udostępnij mi za pomocą Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID chmury skopiowany do schowka",
|
||||
"Copy to clipboard" : "Kopiuj do schowka",
|
||||
"Cloud ID copied" : "Identyfikator Chmury skopiowany",
|
||||
"Copy" : "Skopiuj",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schowek niedostępny. Skopiuj identyfikator chmury ręcznie.",
|
||||
"Copied!" : "Skopiowano!",
|
||||
"Federated Cloud" : "Chmura Federacyjna",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Zdalne udostępnienie",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać zdalne udostępnienie {name} od {owner}@{remote}?",
|
||||
"Remote share password" : "Hasło zdalnego udostępnienia",
|
||||
"Incoming share could not be processed" : "Nie można przetworzyć przychodzącego udostępnienia"
|
||||
"Incoming share could not be processed" : "Nie można przetworzyć przychodzącego udostępnienia",
|
||||
"Cloud ID copied to the clipboard" : "ID chmury skopiowany do schowka",
|
||||
"Copy to clipboard" : "Kopiuj do schowka"
|
||||
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"
|
||||
}
|
||||
|
|
@ -47,8 +47,8 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Compartilhe comigo por meio do meu ID de Nuvem Federada #Nextcloud, consulte {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartilhe comigo via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nuvem copiado para a área de transferência",
|
||||
"Copy to clipboard" : "Copiar para área de transferência",
|
||||
"Cloud ID copied" : "ID da nuvem copiada",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Área de transferência indisponível. Copie o ID de Nuvem manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nuvem Federada",
|
||||
|
|
@ -67,6 +67,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Compartilhamento remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar o compartilhamento remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Senha do compartilhamento remoto",
|
||||
"Incoming share could not be processed" : "O compartilhamento recebido não pôde ser processado"
|
||||
"Incoming share could not be processed" : "O compartilhamento recebido não pôde ser processado",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nuvem copiado para a área de transferência",
|
||||
"Copy to clipboard" : "Copiar para área de transferência"
|
||||
},
|
||||
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,8 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Compartilhe comigo por meio do meu ID de Nuvem Federada #Nextcloud, consulte {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Compartilhe comigo através do meu ID de Nuvem Federada #Nextcloud",
|
||||
"Share with me via Nextcloud" : "Compartilhe comigo via Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nuvem copiado para a área de transferência",
|
||||
"Copy to clipboard" : "Copiar para área de transferência",
|
||||
"Cloud ID copied" : "ID da nuvem copiada",
|
||||
"Copy" : "Copiar",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Área de transferência indisponível. Copie o ID de Nuvem manualmente.",
|
||||
"Copied!" : "Copiado!",
|
||||
"Federated Cloud" : "Nuvem Federada",
|
||||
|
|
@ -65,6 +65,8 @@
|
|||
"Remote share" : "Compartilhamento remoto",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar o compartilhamento remoto {name} de {owner}@{remote}?",
|
||||
"Remote share password" : "Senha do compartilhamento remoto",
|
||||
"Incoming share could not be processed" : "O compartilhamento recebido não pôde ser processado"
|
||||
"Incoming share could not be processed" : "O compartilhamento recebido não pôde ser processado",
|
||||
"Cloud ID copied to the clipboard" : "ID de Nuvem copiado para a área de transferência",
|
||||
"Copy to clipboard" : "Copiar para área de transferência"
|
||||
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Поделитесь со мной через мой #Nextcloud Federated Cloud ID, см. {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
|
||||
"Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Идентификатор облака скопирован в буфер обмена",
|
||||
"Copy to clipboard" : "Копировать в буфер",
|
||||
"Copy" : "Копировать",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Буфер обмена недоступен. Пожалуйста, скопируйте cloud ID вручную.",
|
||||
"Copied!" : "Скопировано!",
|
||||
"Federated Cloud" : "Федерация облачных хранилищ",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Общий ресурс другого сервера",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Вы хотите добавить удалённый общий каталог {name} из {owner}@{remote}?",
|
||||
"Remote share password" : "Пароль общего ресурса другого сервера",
|
||||
"Incoming share could not be processed" : "Не удалось обработать входящий общий доступ"
|
||||
"Incoming share could not be processed" : "Не удалось обработать входящий общий доступ",
|
||||
"Cloud ID copied to the clipboard" : "Идентификатор облака скопирован в буфер обмена",
|
||||
"Copy to clipboard" : "Копировать в буфер"
|
||||
},
|
||||
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Поделитесь со мной через мой #Nextcloud Federated Cloud ID, см. {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Поделитесь со мной через мой #Nextcloud ID в федерации облачных хранилищ",
|
||||
"Share with me via Nextcloud" : "Поделитесь со мной через Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Идентификатор облака скопирован в буфер обмена",
|
||||
"Copy to clipboard" : "Копировать в буфер",
|
||||
"Copy" : "Копировать",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Буфер обмена недоступен. Пожалуйста, скопируйте cloud ID вручную.",
|
||||
"Copied!" : "Скопировано!",
|
||||
"Federated Cloud" : "Федерация облачных хранилищ",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "Общий ресурс другого сервера",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Вы хотите добавить удалённый общий каталог {name} из {owner}@{remote}?",
|
||||
"Remote share password" : "Пароль общего ресурса другого сервера",
|
||||
"Incoming share could not be processed" : "Не удалось обработать входящий общий доступ"
|
||||
"Incoming share could not be processed" : "Не удалось обработать входящий общий доступ",
|
||||
"Cloud ID copied to the clipboard" : "Идентификатор облака скопирован в буфер обмена",
|
||||
"Copy to clipboard" : "Копировать в буфер"
|
||||
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
|
||||
}
|
||||
|
|
@ -23,7 +23,7 @@ OC.L10N.register(
|
|||
"Provide federated file sharing across servers" : "Frunit una cumpartzidura de archìvios federados intre serbidores",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Cumpartzi cun megus tràmite s'ID meu de nue virtuale federada #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Cumpartzi cun megus tràmite Nextcloud",
|
||||
"Copy to clipboard" : "Còpia in is punta de billete",
|
||||
"Copy" : "Còpia",
|
||||
"Copied!" : "Copiadu!",
|
||||
"Federated Cloud" : "Nue virtuale federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Podes cumpartzire con chie si siat mpreet su serbidore Nextcloud o àteros serbidores Open Cloud Mesh (OCM) cumpatìbiles. Ti bastat de nche insertare s'ID issoro de sa nue virtuale federada in sa bentana de cumpartzidura. Assimìgiat a persone@nue.esempru.com ",
|
||||
|
|
@ -37,6 +37,7 @@ OC.L10N.register(
|
|||
"Add remote share" : "Agiunghe cumpartzidura remota",
|
||||
"Remote share" : "Cumpartzidura remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Nche cheres agiùnghere sa cumpartzidura remota {name} dae {owner}@{remote}?",
|
||||
"Remote share password" : "Cumpartzidura remota crae"
|
||||
"Remote share password" : "Cumpartzidura remota crae",
|
||||
"Copy to clipboard" : "Còpia in is punta de billete"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
"Provide federated file sharing across servers" : "Frunit una cumpartzidura de archìvios federados intre serbidores",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Cumpartzi cun megus tràmite s'ID meu de nue virtuale federada #Nextcloud Federated Cloud ID",
|
||||
"Share with me via Nextcloud" : "Cumpartzi cun megus tràmite Nextcloud",
|
||||
"Copy to clipboard" : "Còpia in is punta de billete",
|
||||
"Copy" : "Còpia",
|
||||
"Copied!" : "Copiadu!",
|
||||
"Federated Cloud" : "Nue virtuale federada",
|
||||
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Podes cumpartzire con chie si siat mpreet su serbidore Nextcloud o àteros serbidores Open Cloud Mesh (OCM) cumpatìbiles. Ti bastat de nche insertare s'ID issoro de sa nue virtuale federada in sa bentana de cumpartzidura. Assimìgiat a persone@nue.esempru.com ",
|
||||
|
|
@ -35,6 +35,7 @@
|
|||
"Add remote share" : "Agiunghe cumpartzidura remota",
|
||||
"Remote share" : "Cumpartzidura remota",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Nche cheres agiùnghere sa cumpartzidura remota {name} dae {owner}@{remote}?",
|
||||
"Remote share password" : "Cumpartzidura remota crae"
|
||||
"Remote share password" : "Cumpartzidura remota crae",
|
||||
"Copy to clipboard" : "Còpia in is punta de billete"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
|
|
@ -47,8 +47,7 @@ OC.L10N.register(
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Zdieľajte so mnou prostredníctvom môjho #identifikátora združeného cloudu Nextcloud, pozrite {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #identifikátora združeného cloudu Nextcloud",
|
||||
"Share with me via Nextcloud" : "Sprístupnené cez Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID bol skopírovaný do schránky",
|
||||
"Copy to clipboard" : "Skopírovať do schránky",
|
||||
"Copy" : "Kopírovať",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schránka nie je prístupná. Prosím skopírujte cloud ID manuálne.",
|
||||
"Copied!" : "Skopírované!",
|
||||
"Federated Cloud" : "Federovaný cloud",
|
||||
|
|
@ -66,6 +65,8 @@ OC.L10N.register(
|
|||
"Remote share" : "Vzdialené úložisko",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete pridať vzdialené úložisko {name} patriace používateľovi {owner}@{remote}?",
|
||||
"Remote share password" : "Heslo k vzdialenému úložisku",
|
||||
"Incoming share could not be processed" : "Prichádzajúce zdieľanie sa nepodarilo spracovať"
|
||||
"Incoming share could not be processed" : "Prichádzajúce zdieľanie sa nepodarilo spracovať",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID bol skopírovaný do schránky",
|
||||
"Copy to clipboard" : "Skopírovať do schránky"
|
||||
},
|
||||
"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);");
|
||||
|
|
|
|||
|
|
@ -45,8 +45,7 @@
|
|||
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Zdieľajte so mnou prostredníctvom môjho #identifikátora združeného cloudu Nextcloud, pozrite {url}",
|
||||
"Share with me through my #Nextcloud Federated Cloud ID" : "Sprístupnite mi obsah prostredníctvom môjho #identifikátora združeného cloudu Nextcloud",
|
||||
"Share with me via Nextcloud" : "Sprístupnené cez Nextcloud",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID bol skopírovaný do schránky",
|
||||
"Copy to clipboard" : "Skopírovať do schránky",
|
||||
"Copy" : "Kopírovať",
|
||||
"Clipboard not available. Please copy the cloud ID manually." : "Schránka nie je prístupná. Prosím skopírujte cloud ID manuálne.",
|
||||
"Copied!" : "Skopírované!",
|
||||
"Federated Cloud" : "Federovaný cloud",
|
||||
|
|
@ -64,6 +63,8 @@
|
|||
"Remote share" : "Vzdialené úložisko",
|
||||
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete pridať vzdialené úložisko {name} patriace používateľovi {owner}@{remote}?",
|
||||
"Remote share password" : "Heslo k vzdialenému úložisku",
|
||||
"Incoming share could not be processed" : "Prichádzajúce zdieľanie sa nepodarilo spracovať"
|
||||
"Incoming share could not be processed" : "Prichádzajúce zdieľanie sa nepodarilo spracovať",
|
||||
"Cloud ID copied to the clipboard" : "Cloud ID bol skopírovaný do schránky",
|
||||
"Copy to clipboard" : "Skopírovať do schránky"
|
||||
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue