summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/dav/l10n/uk.js1
-rw-r--r--apps/dav/l10n/uk.json1
-rw-r--r--apps/dav/lib/CalDAV/WebcalCaching/Connection.php145
-rw-r--r--apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php2
-rw-r--r--apps/dav/lib/CardDAV/SyncService.php46
-rw-r--r--apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php27
-rw-r--r--apps/dav/tests/unit/CardDAV/SyncServiceTest.php55
-rw-r--r--apps/files/l10n/ar.js2
-rw-r--r--apps/files/l10n/ar.json2
-rw-r--r--apps/files/l10n/de_DE.js2
-rw-r--r--apps/files/l10n/de_DE.json2
-rw-r--r--apps/files/l10n/gl.js2
-rw-r--r--apps/files/l10n/gl.json2
-rw-r--r--apps/files/l10n/sv.js2
-rw-r--r--apps/files/l10n/sv.json2
-rw-r--r--apps/files/l10n/zh_TW.js2
-rw-r--r--apps/files/l10n/zh_TW.json2
-rw-r--r--apps/files/src/views/FileReferencePickerElement.vue23
-rw-r--r--apps/provisioning_api/l10n/ar.js1
-rw-r--r--apps/provisioning_api/l10n/ar.json1
-rw-r--r--apps/provisioning_api/l10n/de_DE.js1
-rw-r--r--apps/provisioning_api/l10n/de_DE.json1
-rw-r--r--apps/provisioning_api/l10n/gl.js1
-rw-r--r--apps/provisioning_api/l10n/gl.json1
-rw-r--r--apps/provisioning_api/l10n/zh_TW.js1
-rw-r--r--apps/provisioning_api/l10n/zh_TW.json1
-rw-r--r--apps/settings/l10n/gl.js2
-rw-r--r--apps/settings/l10n/gl.json2
-rw-r--r--apps/settings/l10n/uk.js3
-rw-r--r--apps/settings/l10n/uk.json3
-rw-r--r--apps/settings/templates/settings/personal/development.notice.php14
-rw-r--r--apps/theming/lib/Service/BackgroundService.php4
-rw-r--r--apps/updatenotification/l10n/gl.js2
-rw-r--r--apps/updatenotification/l10n/gl.json2
-rw-r--r--apps/user_ldap/l10n/gl.js4
-rw-r--r--apps/user_ldap/l10n/gl.json4
36 files changed, 222 insertions, 146 deletions
diff --git a/apps/dav/l10n/uk.js b/apps/dav/l10n/uk.js
index 5749f898e59..e7dc8cd620e 100644
--- a/apps/dav/l10n/uk.js
+++ b/apps/dav/l10n/uk.js
@@ -143,6 +143,7 @@ OC.L10N.register(
"Accounts" : "Облікові записи",
"System address book which holds all accounts" : "Системна адресна книга, в якій містяться всі облікові записи",
"File is not updatable: %1$s" : "Файл не оновлюється: %1$s",
+ "Failed to get storage for file" : "Не вдалося отримати дані про сховище для файлу",
"Could not write to final file, canceled by hook" : "Не вдалося записати в остаточний файл, скасовано перехопленням",
"Could not write file contents" : "Не вдалося записати вміст файлу",
"_%n byte_::_%n bytes_" : ["%n байт","%n байтів","%n байтів","%n байтів"],
diff --git a/apps/dav/l10n/uk.json b/apps/dav/l10n/uk.json
index 0789c4c2a81..38b3fac301c 100644
--- a/apps/dav/l10n/uk.json
+++ b/apps/dav/l10n/uk.json
@@ -141,6 +141,7 @@
"Accounts" : "Облікові записи",
"System address book which holds all accounts" : "Системна адресна книга, в якій містяться всі облікові записи",
"File is not updatable: %1$s" : "Файл не оновлюється: %1$s",
+ "Failed to get storage for file" : "Не вдалося отримати дані про сховище для файлу",
"Could not write to final file, canceled by hook" : "Не вдалося записати в остаточний файл, скасовано перехопленням",
"Could not write file contents" : "Не вдалося записати вміст файлу",
"_%n byte_::_%n bytes_" : ["%n байт","%n байтів","%n байтів","%n байтів"],
diff --git a/apps/dav/lib/CalDAV/WebcalCaching/Connection.php b/apps/dav/lib/CalDAV/WebcalCaching/Connection.php
index 9d626f2db6d..3c975505539 100644
--- a/apps/dav/lib/CalDAV/WebcalCaching/Connection.php
+++ b/apps/dav/lib/CalDAV/WebcalCaching/Connection.php
@@ -9,15 +9,11 @@ declare(strict_types=1);
namespace OCA\DAV\CalDAV\WebcalCaching;
use Exception;
-use GuzzleHttp\HandlerStack;
-use GuzzleHttp\Middleware;
+use GuzzleHttp\RequestOptions;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\LocalServerException;
use OCP\IAppConfig;
-use Psr\Http\Message\RequestInterface;
-use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
-use Sabre\DAV\Xml\Property\Href;
use Sabre\VObject\Reader;
class Connection {
@@ -29,107 +25,82 @@ class Connection {
/**
* gets webcal feed from remote server
*/
- public function queryWebcalFeed(array $subscription, array &$mutations): ?string {
- $client = $this->clientService->newClient();
-
- $didBreak301Chain = false;
- $latestLocation = null;
-
- $handlerStack = HandlerStack::create();
- $handlerStack->push(Middleware::mapRequest(function (RequestInterface $request) {
- return $request
- ->withHeader('Accept', 'text/calendar, application/calendar+json, application/calendar+xml')
- ->withHeader('User-Agent', 'Nextcloud Webcal Service');
- }));
- $handlerStack->push(Middleware::mapResponse(function (ResponseInterface $response) use (&$didBreak301Chain, &$latestLocation) {
- if (!$didBreak301Chain) {
- if ($response->getStatusCode() !== 301) {
- $didBreak301Chain = true;
- } else {
- $latestLocation = $response->getHeader('Location');
- }
- }
- return $response;
- }));
-
- $allowLocalAccess = $this->config->getValueString('dav', 'webcalAllowLocalAccess', 'no');
+ public function queryWebcalFeed(array $subscription): ?string {
$subscriptionId = $subscription['id'];
$url = $this->cleanURL($subscription['source']);
if ($url === null) {
return null;
}
- try {
- $params = [
- 'allow_redirects' => [
- 'redirects' => 10
- ],
- 'handler' => $handlerStack,
- 'nextcloud' => [
- 'allow_local_address' => $allowLocalAccess === 'yes',
- ]
- ];
-
- $user = parse_url($subscription['source'], PHP_URL_USER);
- $pass = parse_url($subscription['source'], PHP_URL_PASS);
- if ($user !== null && $pass !== null) {
- $params['auth'] = [$user, $pass];
- }
+ $allowLocalAccess = $this->config->getValueString('dav', 'webcalAllowLocalAccess', 'no');
+
+ $params = [
+ 'nextcloud' => [
+ 'allow_local_address' => $allowLocalAccess === 'yes',
+ ],
+ RequestOptions::HEADERS => [
+ 'User-Agent' => 'Nextcloud Webcal Service',
+ 'Accept' => 'text/calendar, application/calendar+json, application/calendar+xml',
+ ],
+ ];
+
+ $user = parse_url($subscription['source'], PHP_URL_USER);
+ $pass = parse_url($subscription['source'], PHP_URL_PASS);
+ if ($user !== null && $pass !== null) {
+ $params[RequestOptions::AUTH] = [$user, $pass];
+ }
+ try {
+ $client = $this->clientService->newClient();
$response = $client->get($url, $params);
- $body = $response->getBody();
-
- if ($latestLocation !== null) {
- $mutations['{http://calendarserver.org/ns/}source'] = new Href($latestLocation);
- }
-
- $contentType = $response->getHeader('Content-Type');
- $contentType = explode(';', $contentType, 2)[0];
- switch ($contentType) {
- case 'application/calendar+json':
- try {
- $jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING);
- } catch (Exception $ex) {
- // In case of a parsing error return null
- $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
- return null;
- }
- return $jCalendar->serialize();
-
- case 'application/calendar+xml':
- try {
- $xCalendar = Reader::readXML($body);
- } catch (Exception $ex) {
- // In case of a parsing error return null
- $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
- return null;
- }
- return $xCalendar->serialize();
-
- case 'text/calendar':
- default:
- try {
- $vCalendar = Reader::read($body);
- } catch (Exception $ex) {
- // In case of a parsing error return null
- $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
- return null;
- }
- return $vCalendar->serialize();
- }
} catch (LocalServerException $ex) {
$this->logger->warning("Subscription $subscriptionId was not refreshed because it violates local access rules", [
'exception' => $ex,
]);
-
return null;
} catch (Exception $ex) {
$this->logger->warning("Subscription $subscriptionId could not be refreshed due to a network error", [
'exception' => $ex,
]);
-
return null;
}
+
+ $body = $response->getBody();
+
+ $contentType = $response->getHeader('Content-Type');
+ $contentType = explode(';', $contentType, 2)[0];
+ switch ($contentType) {
+ case 'application/calendar+json':
+ try {
+ $jCalendar = Reader::readJson($body, Reader::OPTION_FORGIVING);
+ } catch (Exception $ex) {
+ // In case of a parsing error return null
+ $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
+ return null;
+ }
+ return $jCalendar->serialize();
+
+ case 'application/calendar+xml':
+ try {
+ $xCalendar = Reader::readXML($body);
+ } catch (Exception $ex) {
+ // In case of a parsing error return null
+ $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
+ return null;
+ }
+ return $xCalendar->serialize();
+
+ case 'text/calendar':
+ default:
+ try {
+ $vCalendar = Reader::read($body);
+ } catch (Exception $ex) {
+ // In case of a parsing error return null
+ $this->logger->warning("Subscription $subscriptionId could not be parsed", ['exception' => $ex]);
+ return null;
+ }
+ return $vCalendar->serialize();
+ }
}
/**
diff --git a/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php b/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php
index 102571c8ef9..8ab3ecc202a 100644
--- a/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php
+++ b/apps/dav/lib/CalDAV/WebcalCaching/RefreshWebcalService.php
@@ -55,7 +55,7 @@ class RefreshWebcalService {
}
- $webcalData = $this->connection->queryWebcalFeed($subscription, $mutations);
+ $webcalData = $this->connection->queryWebcalFeed($subscription);
if (!$webcalData) {
return;
}
diff --git a/apps/dav/lib/CardDAV/SyncService.php b/apps/dav/lib/CardDAV/SyncService.php
index 56cbe5255f4..356903b3f69 100644
--- a/apps/dav/lib/CardDAV/SyncService.php
+++ b/apps/dav/lib/CardDAV/SyncService.php
@@ -108,25 +108,54 @@ class SyncService {
}, $this->dbConnection);
}
+ private function prepareUri(string $host, string $path): string {
+ /*
+ * The trailing slash is important for merging the uris together.
+ *
+ * $host is stored in oc_trusted_servers.url and usually without a trailing slash.
+ *
+ * Example for a report request
+ *
+ * $host = 'https://server.internal/cloud'
+ * $path = 'remote.php/dav/addressbooks/system/system/system'
+ *
+ * Without the trailing slash, the webroot is missing:
+ * https://server.internal/remote.php/dav/addressbooks/system/system/system
+ *
+ * Example for a download request
+ *
+ * $host = 'https://server.internal/cloud'
+ * $path = '/cloud/remote.php/dav/addressbooks/system/system/system/Database:alice.vcf'
+ *
+ * The response from the remote usually contains the webroot already and must be normalized to:
+ * https://server.internal/cloud/remote.php/dav/addressbooks/system/system/system/Database:alice.vcf
+ */
+ $host = rtrim($host, '/') . '/';
+
+ $uri = \GuzzleHttp\Psr7\UriResolver::resolve(
+ \GuzzleHttp\Psr7\Utils::uriFor($host),
+ \GuzzleHttp\Psr7\Utils::uriFor($path)
+ );
+
+ return (string)$uri;
+ }
+
/**
* @throws ClientExceptionInterface
*/
protected function requestSyncReport(string $url, string $userName, string $addressBookUrl, string $sharedSecret, ?string $syncToken): array {
$client = $this->clientService->newClient();
-
- // the trailing slash is important for merging base_uri and uri
- $url = rtrim($url, '/') . '/';
+ $uri = $this->prepareUri($url, $addressBookUrl);
$options = [
'auth' => [$userName, $sharedSecret],
- 'base_uri' => $url,
'body' => $this->buildSyncCollectionRequestBody($syncToken),
'headers' => ['Content-Type' => 'application/xml']
];
$response = $client->request(
'REPORT',
- $addressBookUrl,
+ $uri,
$options
);
@@ -138,17 +167,14 @@ class SyncService {
protected function download(string $url, string $userName, string $sharedSecret, string $resourcePath): string {
$client = $this->clientService->newClient();
-
- // the trailing slash is important for merging base_uri and uri
- $url = rtrim($url, '/') . '/';
+ $uri = $this->prepareUri($url, $resourcePath);
$options = [
'auth' => [$userName, $sharedSecret],
- 'base_uri' => $url,
];
$response = $client->get(
- $resourcePath,
+ $uri,
$options
);
diff --git a/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php b/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php
index 20f61120af7..7ec4722e905 100644
--- a/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php
+++ b/apps/dav/tests/unit/CalDAV/WebcalCaching/ConnectionTest.php
@@ -7,7 +7,6 @@ declare(strict_types=1);
*/
namespace OCA\DAV\Tests\unit\CalDAV\WebcalCaching;
-use GuzzleHttp\HandlerStack;
use OCA\DAV\CalDAV\WebcalCaching\Connection;
use OCP\Http\Client\IClient;
use OCP\Http\Client\IClientService;
@@ -48,7 +47,6 @@ class ConnectionTest extends TestCase {
'source' => $source,
'lastmodified' => 0,
];
- $mutation = [];
$client = $this->createMock(IClient::class);
$this->clientService->expects(self::once())
@@ -69,7 +67,7 @@ class ConnectionTest extends TestCase {
->method('warning')
->with("Subscription 42 was not refreshed because it violates local access rules", ['exception' => $localServerException]);
- $this->connection->queryWebcalFeed($subscription, $mutation);
+ $this->connection->queryWebcalFeed($subscription);
}
public function testInvalidUrl(): void {
@@ -83,22 +81,14 @@ class ConnectionTest extends TestCase {
'source' => '!@#$',
'lastmodified' => 0,
];
- $mutation = [];
$client = $this->createMock(IClient::class);
- $this->clientService->expects(self::once())
- ->method('newClient')
- ->with()
- ->willReturn($client);
- $this->config->expects(self::once())
- ->method('getValueString')
- ->with('dav', 'webcalAllowLocalAccess', 'no')
- ->willReturn('no');
-
+ $this->config->expects(self::never())
+ ->method('getValueString');
$client->expects(self::never())
->method('get');
- $this->connection->queryWebcalFeed($subscription, $mutation);
+ $this->connection->queryWebcalFeed($subscription);
}
@@ -120,7 +110,6 @@ class ConnectionTest extends TestCase {
'source' => $url,
'lastmodified' => 0,
];
- $mutation = [];
$this->clientService->expects($this->once())
->method('newClient')
@@ -134,9 +123,7 @@ class ConnectionTest extends TestCase {
$client->expects($this->once())
->method('get')
- ->with('https://foo.bar/bla2', $this->callback(function ($obj) {
- return $obj['allow_redirects']['redirects'] === 10 && $obj['handler'] instanceof HandlerStack;
- }))
+ ->with('https://foo.bar/bla2')
->willReturn($response);
$response->expects($this->once())
@@ -148,9 +135,9 @@ class ConnectionTest extends TestCase {
->with('Content-Type')
->willReturn($contentType);
- $this->connection->queryWebcalFeed($subscription, $mutation);
-
+ $this->connection->queryWebcalFeed($subscription);
}
+
public static function runLocalURLDataProvider(): array {
return [
['localhost/foo.bar'],
diff --git a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php
index 570c55eab05..db99f73306d 100644
--- a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php
+++ b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php
@@ -426,4 +426,59 @@ END:VCARD';
[]
);
}
+
+ /**
+ * @dataProvider providerUseAbsoluteUriReport
+ */
+ public function testUseAbsoluteUriReport(string $host, string $expected): void {
+ $body = '<?xml version="1.0"?>
+<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:card="urn:ietf:params:xml:ns:carddav" xmlns:oc="http://owncloud.org/ns">
+ <d:sync-token>http://sabre.io/ns/sync/1</d:sync-token>
+</d:multistatus>';
+
+ $requestResponse = new Response(new PsrResponse(
+ 207,
+ ['Content-Type' => 'application/xml; charset=utf-8', 'Content-Length' => strlen($body)],
+ $body
+ ));
+
+ $this->client
+ ->method('request')
+ ->with(
+ 'REPORT',
+ $this->callback(function ($uri) use ($expected) {
+ $this->assertEquals($expected, $uri);
+ return true;
+ }),
+ $this->callback(function ($options) {
+ $this->assertIsArray($options);
+ return true;
+ }),
+ )
+ ->willReturn($requestResponse);
+
+ $this->service->syncRemoteAddressBook(
+ $host,
+ 'system',
+ 'remote.php/dav/addressbooks/system/system/system',
+ '1234567890',
+ null,
+ '1',
+ 'principals/system/system',
+ []
+ );
+ }
+
+ public function providerUseAbsoluteUriReport(): array {
+ return [
+ ['https://server.internal', 'https://server.internal/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal/', 'https://server.internal/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal/nextcloud', 'https://server.internal/nextcloud/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal/nextcloud/', 'https://server.internal/nextcloud/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal:8080', 'https://server.internal:8080/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal:8080/', 'https://server.internal:8080/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal:8080/nextcloud', 'https://server.internal:8080/nextcloud/remote.php/dav/addressbooks/system/system/system'],
+ ['https://server.internal:8080/nextcloud/', 'https://server.internal:8080/nextcloud/remote.php/dav/addressbooks/system/system/system'],
+ ];
+ }
}
diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js
index 44d3881facd..00bf3990ad6 100644
--- a/apps/files/l10n/ar.js
+++ b/apps/files/l10n/ar.js
@@ -208,6 +208,8 @@ OC.L10N.register(
"Edit online" : "التحرير عبر الإنترنت",
"Failed to redirect to client" : "فشل في التحويل الى العميل",
"Edit locally" : "تعديل محليًا",
+ "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
"(copy)" : "(نسخ)",
"(copy %n)" : "(نسخ %n)",
diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json
index 01b6551b3c3..5f8169ca16a 100644
--- a/apps/files/l10n/ar.json
+++ b/apps/files/l10n/ar.json
@@ -206,6 +206,8 @@
"Edit online" : "التحرير عبر الإنترنت",
"Failed to redirect to client" : "فشل في التحويل الى العميل",
"Edit locally" : "تعديل محليًا",
+ "Moving \"{source}\" to \"{destination}\" …" : "نقل \"{source}\" إلى \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "نسخ \"{source}\" إلى \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "لا يمكنك نقل ملف/مجلد إلى نفسه أو إلى مجلد فرعي منه",
"(copy)" : "(نسخ)",
"(copy %n)" : "(نسخ %n)",
diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js
index 0a9b27e4db2..ca6a0fead8c 100644
--- a/apps/files/l10n/de_DE.js
+++ b/apps/files/l10n/de_DE.js
@@ -208,6 +208,8 @@ OC.L10N.register(
"Edit online" : "Online bearbeiten",
"Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
"Edit locally" : "Lokal bearbeiten",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden",
"(copy)" : "(kopieren)",
"(copy %n)" : "(%n kopieren)",
diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json
index 4aa5f8be958..d8dcc83f4a1 100644
--- a/apps/files/l10n/de_DE.json
+++ b/apps/files/l10n/de_DE.json
@@ -206,6 +206,8 @@
"Edit online" : "Online bearbeiten",
"Failed to redirect to client" : "Umleitung zum Client fehlgeschlagen",
"Edit locally" : "Lokal bearbeiten",
+ "Moving \"{source}\" to \"{destination}\" …" : "Verschiebe \"{source}\" nach \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopiere \"{source}\" nach \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Eine Datei oder ein Ordner kann nicht auf sich selbst oder in einen Unterordner von sich selbst verschoben werden",
"(copy)" : "(kopieren)",
"(copy %n)" : "(%n kopieren)",
diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js
index 575a17d6f8f..2727bf2963b 100644
--- a/apps/files/l10n/gl.js
+++ b/apps/files/l10n/gl.js
@@ -208,6 +208,8 @@ OC.L10N.register(
"Edit online" : "Editar en liña",
"Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente",
"Edit locally" : "Editar localmente",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo",
"(copy)" : "(copiar)",
"(copy %n)" : "(copiar %n)",
diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json
index df60f6bb780..69a0d6e0f42 100644
--- a/apps/files/l10n/gl.json
+++ b/apps/files/l10n/gl.json
@@ -206,6 +206,8 @@
"Edit online" : "Editar en liña",
"Failed to redirect to client" : "Produciuse un fallo ao redirixir ao cliente",
"Edit locally" : "Editar localmente",
+ "Moving \"{source}\" to \"{destination}\" …" : "Movendo «{source}» a «{destination}»…",
+ "Copying \"{source}\" to \"{destination}\" …" : "Copiando «{source}» en «{destination}»…",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Non é posíbel mover un ficheiro/cartafol sobre si mesmo ou a un subcartafol de si mesmo",
"(copy)" : "(copiar)",
"(copy %n)" : "(copiar %n)",
diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js
index db227259556..026e1be5b79 100644
--- a/apps/files/l10n/sv.js
+++ b/apps/files/l10n/sv.js
@@ -208,6 +208,8 @@ OC.L10N.register(
"Edit online" : "Redigera online",
"Failed to redirect to client" : "Det gick inte att omdirigera till klienten",
"Edit locally" : "Redigera lokalt",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv",
"(copy)" : "(kopia)",
"(copy %n)" : "(kopia %n)",
diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json
index 0ef589fe42c..5a43d40182a 100644
--- a/apps/files/l10n/sv.json
+++ b/apps/files/l10n/sv.json
@@ -206,6 +206,8 @@
"Edit online" : "Redigera online",
"Failed to redirect to client" : "Det gick inte att omdirigera till klienten",
"Edit locally" : "Redigera lokalt",
+ "Moving \"{source}\" to \"{destination}\" …" : "Flyttar \"{source}\" till \"{destination}\" …",
+ "Copying \"{source}\" to \"{destination}\" …" : "Kopierar \"{source}\" till \"{destination}\" …",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "Du kan inte flytta en fil/mapp till sig själv eller till en undermapp till sig själv",
"(copy)" : "(kopia)",
"(copy %n)" : "(kopia %n)",
diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js
index 21dbeeb3835..b35cb3540b1 100644
--- a/apps/files/l10n/zh_TW.js
+++ b/apps/files/l10n/zh_TW.js
@@ -208,6 +208,8 @@ OC.L10N.register(
"Edit online" : "線上編輯",
"Failed to redirect to client" : "重新導向到客戶端失敗",
"Edit locally" : "本機編輯",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
"(copy)" : "(副本)",
"(copy %n)" : "(副本 %n)",
diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json
index d514c290ab5..b8840a1da86 100644
--- a/apps/files/l10n/zh_TW.json
+++ b/apps/files/l10n/zh_TW.json
@@ -206,6 +206,8 @@
"Edit online" : "線上編輯",
"Failed to redirect to client" : "重新導向到客戶端失敗",
"Edit locally" : "本機編輯",
+ "Moving \"{source}\" to \"{destination}\" …" : "正在移動「{source}」至「{destination}」……",
+ "Copying \"{source}\" to \"{destination}\" …" : "正在複製「{source}」至「{destination}」……",
"You cannot move a file/folder onto itself or into a subfolder of itself" : "您無法將檔案/資料夾移動到其自身或子資料夾中",
"(copy)" : "(副本)",
"(copy %n)" : "(副本 %n)",
diff --git a/apps/files/src/views/FileReferencePickerElement.vue b/apps/files/src/views/FileReferencePickerElement.vue
index c2a502ee1a8..b4d4bc54f14 100644
--- a/apps/files/src/views/FileReferencePickerElement.vue
+++ b/apps/files/src/views/FileReferencePickerElement.vue
@@ -39,7 +39,7 @@ export default defineComponent({
},
filepickerOptions() {
return {
- allowPickDirectory: false,
+ allowPickDirectory: true,
buttons: this.buttonFactory,
container: `#${this.containerId}`,
multiselect: false,
@@ -53,18 +53,17 @@ export default defineComponent({
buttonFactory(selected: NcNode[]): IFilePickerButton[] {
const buttons = [] as IFilePickerButton[]
if (selected.length === 0) {
- buttons.push({
- label: t('files', 'Choose file'),
- type: 'tertiary' as never,
- callback: this.onClose,
- })
- } else {
- buttons.push({
- label: t('files', 'Choose {file}', { file: selected[0].basename }),
- type: 'primary',
- callback: this.onClose,
- })
+ return []
+ }
+ const node = selected.at(0)
+ if (node.path === '/') {
+ return [] // Do not allow selecting the users root folder
}
+ buttons.push({
+ label: t('files', 'Choose {file}', { file: node.displayname }),
+ type: 'primary',
+ callback: this.onClose,
+ })
return buttons
},
diff --git a/apps/provisioning_api/l10n/ar.js b/apps/provisioning_api/l10n/ar.js
index 25918280b70..aeac14a24e2 100644
--- a/apps/provisioning_api/l10n/ar.js
+++ b/apps/provisioning_api/l10n/ar.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Cannot create sub-admins for admin group" : "تعذّر إنشاء مشرفين فرعيين لمجموعة المشرفين",
"No permissions to promote sub-admins" : "أذونات غير كافية لترقية مشرفين فرعيين",
"Invalid password value" : "قيمة غير صحيحة لكلمة المرور",
+ "An email address is required, to send a password link to the user." : "عنوان الإيميل مطلوب لإرسال رابط كلمة المرور للمستخدِم",
"Required email address was not provided" : "عنوان الإيميل المطلوب لم يتم توفيره",
"Invalid quota value: %1$s" : "قيمة غير صحيحة للحصة: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "قيمة غير صحيحة للحصة. %1$s تزيد عن الحد الأقصى للحصة",
diff --git a/apps/provisioning_api/l10n/ar.json b/apps/provisioning_api/l10n/ar.json
index f72b7b5eb76..b297ea4700b 100644
--- a/apps/provisioning_api/l10n/ar.json
+++ b/apps/provisioning_api/l10n/ar.json
@@ -9,6 +9,7 @@
"Cannot create sub-admins for admin group" : "تعذّر إنشاء مشرفين فرعيين لمجموعة المشرفين",
"No permissions to promote sub-admins" : "أذونات غير كافية لترقية مشرفين فرعيين",
"Invalid password value" : "قيمة غير صحيحة لكلمة المرور",
+ "An email address is required, to send a password link to the user." : "عنوان الإيميل مطلوب لإرسال رابط كلمة المرور للمستخدِم",
"Required email address was not provided" : "عنوان الإيميل المطلوب لم يتم توفيره",
"Invalid quota value: %1$s" : "قيمة غير صحيحة للحصة: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "قيمة غير صحيحة للحصة. %1$s تزيد عن الحد الأقصى للحصة",
diff --git a/apps/provisioning_api/l10n/de_DE.js b/apps/provisioning_api/l10n/de_DE.js
index c815f1d8a01..18c5c76237e 100644
--- a/apps/provisioning_api/l10n/de_DE.js
+++ b/apps/provisioning_api/l10n/de_DE.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Cannot create sub-admins for admin group" : "Kann keine Unter-Administratoren für die Administrations-Gruppe erstellen",
"No permissions to promote sub-admins" : "Keine Berechtigungen, um Unter-Administratoren zu ernennen",
"Invalid password value" : "Ungültiger Passwort-Wert",
+ "An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
diff --git a/apps/provisioning_api/l10n/de_DE.json b/apps/provisioning_api/l10n/de_DE.json
index 46091c0a224..61fd2140872 100644
--- a/apps/provisioning_api/l10n/de_DE.json
+++ b/apps/provisioning_api/l10n/de_DE.json
@@ -9,6 +9,7 @@
"Cannot create sub-admins for admin group" : "Kann keine Unter-Administratoren für die Administrations-Gruppe erstellen",
"No permissions to promote sub-admins" : "Keine Berechtigungen, um Unter-Administratoren zu ernennen",
"Invalid password value" : "Ungültiger Passwort-Wert",
+ "An email address is required, to send a password link to the user." : "Um dem Benutzer einen Passwortlink zu senden, ist eine E-Mail-Adresse erforderlich.",
"Required email address was not provided" : "Erforderliche E-Mail-Adresse wurde nicht angegeben",
"Invalid quota value: %1$s" : "Ungültiger Wert für Speicherkontigent: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "Ungültiger Wert für Speicherkontigent. %1$s überschreitet das maximale Kontigent",
diff --git a/apps/provisioning_api/l10n/gl.js b/apps/provisioning_api/l10n/gl.js
index 70d07a3ff4a..1aab97c2938 100644
--- a/apps/provisioning_api/l10n/gl.js
+++ b/apps/provisioning_api/l10n/gl.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Cannot create sub-admins for admin group" : "Non é posibel crear postos de subadministración para o grupo de administración",
"No permissions to promote sub-admins" : "Non ten permisos para promover a subadministración",
"Invalid password value" : "O valor do contrasinal non é correcto",
+ "An email address is required, to send a password link to the user." : "Precisase dun enderezo de correo-e para enviar unha ligazón de contrasinal ao usuario.",
"Required email address was not provided" : "Precisase dun enderezo de correo-e mais non foi fornecido",
"Invalid quota value: %1$s" : "Valor de cota incorrecto: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "O valor da cota é incorrecto. %1$s excede a cota máxima",
diff --git a/apps/provisioning_api/l10n/gl.json b/apps/provisioning_api/l10n/gl.json
index bace58eb2a1..a93ffc011a0 100644
--- a/apps/provisioning_api/l10n/gl.json
+++ b/apps/provisioning_api/l10n/gl.json
@@ -9,6 +9,7 @@
"Cannot create sub-admins for admin group" : "Non é posibel crear postos de subadministración para o grupo de administración",
"No permissions to promote sub-admins" : "Non ten permisos para promover a subadministración",
"Invalid password value" : "O valor do contrasinal non é correcto",
+ "An email address is required, to send a password link to the user." : "Precisase dun enderezo de correo-e para enviar unha ligazón de contrasinal ao usuario.",
"Required email address was not provided" : "Precisase dun enderezo de correo-e mais non foi fornecido",
"Invalid quota value: %1$s" : "Valor de cota incorrecto: %1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "O valor da cota é incorrecto. %1$s excede a cota máxima",
diff --git a/apps/provisioning_api/l10n/zh_TW.js b/apps/provisioning_api/l10n/zh_TW.js
index be22077e12a..89e250d6d54 100644
--- a/apps/provisioning_api/l10n/zh_TW.js
+++ b/apps/provisioning_api/l10n/zh_TW.js
@@ -11,6 +11,7 @@ OC.L10N.register(
"Cannot create sub-admins for admin group" : "無法為管理員群組建立子管理員",
"No permissions to promote sub-admins" : "沒有新增子管理員的權限",
"Invalid password value" : "無效的密碼值",
+ "An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。",
"Required email address was not provided" : "未提供必要的電子郵件地址",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
diff --git a/apps/provisioning_api/l10n/zh_TW.json b/apps/provisioning_api/l10n/zh_TW.json
index e599a1a8c6f..341d42dd448 100644
--- a/apps/provisioning_api/l10n/zh_TW.json
+++ b/apps/provisioning_api/l10n/zh_TW.json
@@ -9,6 +9,7 @@
"Cannot create sub-admins for admin group" : "無法為管理員群組建立子管理員",
"No permissions to promote sub-admins" : "沒有新增子管理員的權限",
"Invalid password value" : "無效的密碼值",
+ "An email address is required, to send a password link to the user." : "電子郵件地址必填,用來寄送密碼連結給使用者。",
"Required email address was not provided" : "未提供必要的電子郵件地址",
"Invalid quota value: %1$s" : "無效的空間限額值:%1$s",
"Invalid quota value. %1$s is exceeding the maximum quota" : "無效的空間限額值。%1$s 超過了最大空間限額",
diff --git a/apps/settings/l10n/gl.js b/apps/settings/l10n/gl.js
index af7b2473a2f..027f82eaeef 100644
--- a/apps/settings/l10n/gl.js
+++ b/apps/settings/l10n/gl.js
@@ -583,7 +583,7 @@ OC.L10N.register(
"she/her" : "ela — she/her",
"he/him" : "el — he/him",
"they/them" : "ele — they/them",
- "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p.ex. ${pronounsExample}",
+ "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p. ex. ${pronounsExample}",
"Your role" : "O seu cargo",
"Your X (formerly Twitter) handle" : "O seu identificador en X (anteriormente Twitter).",
"Your website" : "O seu sitio web",
diff --git a/apps/settings/l10n/gl.json b/apps/settings/l10n/gl.json
index 2a5ebee1eea..cf836b1b3ee 100644
--- a/apps/settings/l10n/gl.json
+++ b/apps/settings/l10n/gl.json
@@ -581,7 +581,7 @@
"she/her" : "ela — she/her",
"he/him" : "el — he/him",
"they/them" : "ele — they/them",
- "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p.ex. ${pronounsExample}",
+ "Your pronouns. E.g. ${pronounsExample}" : "Os seus pronomes. p. ex. ${pronounsExample}",
"Your role" : "O seu cargo",
"Your X (formerly Twitter) handle" : "O seu identificador en X (anteriormente Twitter).",
"Your website" : "O seu sitio web",
diff --git a/apps/settings/l10n/uk.js b/apps/settings/l10n/uk.js
index 83fa8ac4cc3..1ba1fbac96d 100644
--- a/apps/settings/l10n/uk.js
+++ b/apps/settings/l10n/uk.js
@@ -59,7 +59,9 @@ OC.L10N.register(
"No Login supplied" : "Не надано ім'я облікового запису",
"Unable to change password. Password too long." : "Неможливо змінити пароль. Пароль задовгий.",
"Authentication error" : "Помилка авторизації",
+ "Please provide an admin recovery password; otherwise, all account data will be lost." : "Надайте пароль відновлення адміністратора. В іншому випадку всі облікові дані буде втрачено.",
"Wrong admin recovery password. Please check the password and try again." : "Хибний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.",
+ "Backend does not support password change, but the encryption of the account key was updated." : "Бекенд не підтримує зміну паролю, проте шифрування ключа облікового запису було оновлено.",
"Administrator documentation" : "Документація адміністратора",
"User documentation" : "Користувацька документація",
"Nextcloud help overview" : "Допомога у користуванні Nextcloud",
@@ -102,6 +104,7 @@ OC.L10N.register(
"Set your password" : "Встановіть свій пароль",
"Go to %s" : "Перейти до %s",
"Install Client" : "Встановити Клієнт",
+ "Logged in account must be a subadmin" : "Користувач, який увійшов, має бути субадміністратором",
"Apps" : "Застосунки",
"Personal" : "Особисте",
"Administration" : "Адміністрування",
diff --git a/apps/settings/l10n/uk.json b/apps/settings/l10n/uk.json
index 063eff3d85e..7facb07e6d0 100644
--- a/apps/settings/l10n/uk.json
+++ b/apps/settings/l10n/uk.json
@@ -57,7 +57,9 @@
"No Login supplied" : "Не надано ім'я облікового запису",
"Unable to change password. Password too long." : "Неможливо змінити пароль. Пароль задовгий.",
"Authentication error" : "Помилка авторизації",
+ "Please provide an admin recovery password; otherwise, all account data will be lost." : "Надайте пароль відновлення адміністратора. В іншому випадку всі облікові дані буде втрачено.",
"Wrong admin recovery password. Please check the password and try again." : "Хибний пароль відновлення адміністратора. Будь ласка, перевірте пароль та спробуйте ще раз.",
+ "Backend does not support password change, but the encryption of the account key was updated." : "Бекенд не підтримує зміну паролю, проте шифрування ключа облікового запису було оновлено.",
"Administrator documentation" : "Документація адміністратора",
"User documentation" : "Користувацька документація",
"Nextcloud help overview" : "Допомога у користуванні Nextcloud",
@@ -100,6 +102,7 @@
"Set your password" : "Встановіть свій пароль",
"Go to %s" : "Перейти до %s",
"Install Client" : "Встановити Клієнт",
+ "Logged in account must be a subadmin" : "Користувач, який увійшов, має бути субадміністратором",
"Apps" : "Застосунки",
"Personal" : "Особисте",
"Administration" : "Адміністрування",
diff --git a/apps/settings/templates/settings/personal/development.notice.php b/apps/settings/templates/settings/personal/development.notice.php
index a758daa16d5..e0f66863efa 100644
--- a/apps/settings/templates/settings/personal/development.notice.php
+++ b/apps/settings/templates/settings/personal/development.notice.php
@@ -30,43 +30,43 @@
<?php print_unescaped(str_replace(
[
'{facebookimage}',
- '{twitterimage}',
+ '{ximage}',
'{mastodonimage}',
'{rssimage}',
'{mailimage}',
'{facebookopen}',
- '{twitteropen}',
+ '{xopen}',
'{mastodonopen}',
'{rssopen}',
'{newsletteropen}',
'{linkclose}',
'{facebooktext}',
- '{twittertext}',
+ '{xtext}',
'{mastodontext}',
'{rsstext}',
'{mailtext}',
],
[
'<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m7 5c0-1.1 0.9-2 2-2h1.5v2h-1c-0.27 0-0.5 0.23-0.5 0.5v1h1.5v2h-1.5v4.5h-2v-4.5h-1.5v-2h1.5z" fill="var(--color-main-background)"/></svg>',
- '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m9.784 4c-1.0945 0-1.982 0.89-1.982 1.982 0 0.167 0.026 0.336 0.06 0.474h-0.153c-1.361-0.077-2.577-0.56-3.445-1.512-0.19-0.204-0.368-0.422-0.518-0.654-0.294 0.509-0.325 1.1-0.19 1.648 0.123 0.41 0.34 0.776 0.64 1.05l0.15 0.1364-0.19-0.041c-0.245-0.068-0.49-0.15-0.722-0.245 0.027 0.49 0.218 0.94 0.517 1.294 0.286 0.34 0.667 0.6 1.103 0.722-0.31 0.032-0.6165 0.0236-0.926 0.0135 0.3132 0.763 1.035 1.322 1.8927 1.3897-0.79 0.585-1.77 0.912-2.82 0.912 0.7762 0.477 1.661 0.777 2.628 0.831h0.627c2.982-0.163 5.338-2.63 5.34-5.6526v-0.286c0.11-0.095 0.218-0.19 0.327-0.3 0.259-0.2316 0.49-0.504 0.681-0.79-0.313 0.204-0.681 0.3133-1.09 0.313h-0.014c0.366-0.2453 0.653-0.613 0.8-1.035-0.41 0.212-0.802 0.3433-1.23 0.425-0.46-0.4-0.83-0.675-1.486-0.675z" fill="var(--color-main-background)"/></svg>',
+ '<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m 3.384891,2.6 c -0.3882,0 -0.61495,0.4362184 -0.39375,0.7558594 L 6.5841098,8.4900156 2.9770785,12.707422 C 2.7436785,12.979821 2.9370285,13.4 3.2958285,13.4 H 3.694266 c 0.176,0 0.3430313,-0.07714 0.4570313,-0.210938 L 7.294266,9.5065156 9.6602817,12.887891 C 9.8762817,13.208984 10.25229,13.4 10.743485,13.4 h 1.900391 c 0.3882,0 0.61575,-0.436688 0.39375,-0.754688 L 9.2466097,7.2195156 12.682547,3.1941408 C 12.881744,2.9601408 12.715528,2.6 12.407473,2.6 h -0.506566 c -0.175,0 -0.34186,0.076453 -0.45586,0.2197656 L 8.5405785,6.2058438 6.3790317,3.1132812 C 6.1568442,2.7913687 5.6965004,2.6 5.3958285,2.6 Z" fill="var(--color-main-background)"/></svg>',
'<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m13.183 9.2819c-0.1566 0.80567-1.4026 1.6874-2.8336 1.8583-0.74623 0.08903-1.4809 0.17088-2.2644 0.13494-1.2813-0.05872-2.2923-0.30582-2.2923-0.30582 0 0.12473 0.0077 0.24349 0.02307 0.35456 0.16657 1.2645 1.2538 1.3402 2.2837 1.3755 1.0395 0.03557 1.9651-0.25629 1.9651-0.25629l0.0427 0.93975s-0.72709 0.39044-2.0223 0.46224c-0.71423 0.03926-1.6011-0.01798-2.634-0.29136-2.2402-0.59294-2.6255-2.9809-2.6844-5.4039-0.01797-0.7194-0.00687-1.3977-0.00687-1.9651 0-2.4776 1.6233-3.2038 1.6233-3.2038 0.81852-0.37591 2.223-0.53399 3.6832-0.54593h0.035867c1.4601 0.011937 2.8656 0.17002 3.6841 0.54593 0 0 1.6233 0.72623 1.6233 3.2038 0 0 0.02036 1.828-0.22639 3.0971" fill="var(--color-main-background)" stroke-width=".049227"/><path d="m11.494 6.377v3h-1.1885v-2.9118c0-0.6138-0.25826-0.92535-0.77484-0.92535-0.57116 0-0.85742 0.36957-0.85742 1.1004v1.5938h-1.1815v-1.5938c0-0.73078-0.28632-1.1004-0.85748-1.1004-0.51658 0-0.77484 0.31155-0.77484 0.92535v2.9118h-1.1885v-3c0-0.61313 0.15611-1.1004 0.46969-1.4608 0.32336-0.36047 0.74684-0.54525 1.2725-0.54525 0.6082 0 1.0688 0.23377 1.3733 0.70137l0.29604 0.49627 0.2961-0.49627c0.30447-0.4676 0.76505-0.70137 1.3733-0.70137 0.52563 0 0.9491 0.18479 1.2725 0.54525 0.31352 0.36047 0.46963 0.84769 0.46963 1.4608" fill="var(--color-text-maxcontrast)" stroke-width=".049227"/></svg>',
'<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m4.5 3.5v1.7c3.563 0 6.3 2.735 6.3 6.3h1.7c0-4.4-3.58-8-8-8zm0 2.5v1.7c2.326 0 3.774 1.468 3.8 3.8h1.7c0-3-2.492-5.5-5.5-5.5zm1.25 3c-0.69 0-1.25 0.56-1.25 1.25s0.56 1.25 1.25 1.25 1.25-0.56 1.25-1.25-0.56-1.25-1.25-1.25z" fill="var(--color-main-background)"/></svg>',
'<svg aria-hidden="true" width="50" height="50" version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><circle cx="8" cy="8" r="8" fill="var(--color-text-maxcontrast)"/><path d="m3.556 4.875c-0.306 0-0.556 0.248-0.556 0.555v5.14c0 0.31 0.25 0.555 0.556 0.555h8.89c0.304 0 0.554-0.245 0.554-0.555v-5.14c0-0.307-0.25-0.555-0.556-0.555zm0.47 0.643 3.8 3.8h0.33l3.82-3.8 0.38 0.38-2.274 2.31 1.82 1.753-0.38 0.38-1.753-1.753-1.267 1.285h-0.8l-1.368-1.283-1.754 1.77-0.38-0.4 1.734-1.76-2.292-2.3z" fill="var(--color-main-background)"/></svg>',
'<a target="_blank" aria-label="{facebooktext}" rel="noreferrer noopener" href="https://www.facebook.com/Nextclouders/">',
- '<a target="_blank" aria-label="{twittertext}" rel="noreferrer noopener" href="https://twitter.com/nextclouders">',
+ '<a target="_blank" aria-label="{xtext}" rel="noreferrer noopener" href="https://x.com/nextclouders">',
'<a target="_blank" aria-label="{mastodontext}" rel="noreferrer noopener" href="https://mastodon.xyz/@nextcloud">',
'<a target="_blank" aria-label="{rsstext}" rel="noreferrer noopener" href="https://nextcloud.com/blog/">',
'<a target="_blank" aria-label="{mailtext}" rel="noreferrer noopener" href="https://newsletter.nextcloud.com/?p=subscribe&amp;id=1">',
'</a>',
$l->t('Like our Facebook page'),
- $l->t('Follow us on Twitter'),
+ $l->t('Follow us on X'),
$l->t('Follow us on Mastodon'),
$l->t('Check out our blog'),
$l->t('Subscribe to our newsletter'),
],
'{facebookopen}{facebookimage}{linkclose}
- {twitteropen}{twitterimage}{linkclose}
+ {xopen}{ximage}{linkclose}
{mastodonopen}{mastodonimage}{linkclose}
{rssopen}{rssimage}{linkclose}
{newsletteropen}{mailimage}{linkclose}'
diff --git a/apps/theming/lib/Service/BackgroundService.php b/apps/theming/lib/Service/BackgroundService.php
index 6cb2b4abeb9..8ed8478de71 100644
--- a/apps/theming/lib/Service/BackgroundService.php
+++ b/apps/theming/lib/Service/BackgroundService.php
@@ -18,6 +18,7 @@ use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
+use OCP\IAppConfig;
use OCP\IConfig;
use OCP\Lock\LockedException;
use OCP\PreConditionNotMetException;
@@ -200,6 +201,7 @@ class BackgroundService {
public function __construct(
private IRootFolder $rootFolder,
private IAppData $appData,
+ private IAppConfig $appConfig,
private IConfig $config,
private ?string $userId,
) {
@@ -328,7 +330,7 @@ class BackgroundService {
if ($handle && $image->loadFromFileHandle($handle) !== false) {
$meanColor = $this->calculateMeanColor($image);
if ($meanColor !== false) {
- $this->config->setAppValue(Application::APP_ID, 'background_color', $meanColor);
+ $this->appConfig->setValueString(Application::APP_ID, 'background_color', $meanColor);
return $meanColor;
}
}
diff --git a/apps/updatenotification/l10n/gl.js b/apps/updatenotification/l10n/gl.js
index 2cc48070b58..1641488c0a3 100644
--- a/apps/updatenotification/l10n/gl.js
+++ b/apps/updatenotification/l10n/gl.js
@@ -32,7 +32,7 @@ OC.L10N.register(
"Your version is up to date." : "A súa versión está actualizada.",
"A non-default update server is in use to be checked for updates:" : "Está en uso un servidor de actualizacións que non é o predeterminado para comprobar as actualizacións:",
"Update channel" : "Canle de actualización:",
- "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p.ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.",
+ "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p. ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.",
"Current update channel:" : "Canle de actualización actual:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Sempre poderá actualizar á versión más recente, mais nunca poderá reverter a unha canle máis estábel.",
"Notify members of the following groups about available updates:" : "Notificar aos membros dos seguintes grupos sobre actualizacións dispoñíbeis:",
diff --git a/apps/updatenotification/l10n/gl.json b/apps/updatenotification/l10n/gl.json
index b3f94ec2a5e..74dac9e33a3 100644
--- a/apps/updatenotification/l10n/gl.json
+++ b/apps/updatenotification/l10n/gl.json
@@ -30,7 +30,7 @@
"Your version is up to date." : "A súa versión está actualizada.",
"A non-default update server is in use to be checked for updates:" : "Está en uso un servidor de actualizacións que non é o predeterminado para comprobar as actualizacións:",
"Update channel" : "Canle de actualización:",
- "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p.ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.",
+ "Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Cambiar a canle de actualización tamén afecta á páxina de xestión de aplicacións. p. ex. após cambiar á canle beta, ofreceranse actualizacións da aplicación beta na páxina de xestión de aplicacións.",
"Current update channel:" : "Canle de actualización actual:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Sempre poderá actualizar á versión más recente, mais nunca poderá reverter a unha canle máis estábel.",
"Notify members of the following groups about available updates:" : "Notificar aos membros dos seguintes grupos sobre actualizacións dispoñíbeis:",
diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js
index 535d81da209..1762815e36b 100644
--- a/apps/user_ldap/l10n/gl.js
+++ b/apps/user_ldap/l10n/gl.js
@@ -110,7 +110,7 @@ OC.L10N.register(
"Port" : "Porto",
"Detect Port" : "Detectar o porto",
"User DN" : "DN do usuario",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
"Password" : "Contrasinal",
"For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
"Save Credentials" : "Gardar as credenciais",
@@ -158,7 +158,7 @@ OC.L10N.register(
"User Display Name Field" : "Campo de nome de usuario para amosar",
"The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.",
"2nd User Display Name Field" : "2.º campo de nome de usuario para amosar",
- "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemplo.org)».",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@exemplo.org)».",
"Base User Tree" : "Base da árbore de usuarios",
"One User Base DN per line" : "Un DN base de usuario por liña",
"User Search Attributes" : "Atributos de busca do usuario",
diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json
index 1c233d7707b..e29dd2926d3 100644
--- a/apps/user_ldap/l10n/gl.json
+++ b/apps/user_ldap/l10n/gl.json
@@ -108,7 +108,7 @@
"Port" : "Porto",
"Detect Port" : "Detectar o porto",
"User DN" : "DN do usuario",
- "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que hai que estabelecer unha conexión, p.ex uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
+ "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "O DN do cliente do usuario co que realizará o vínculo, p. ex. uid=axente, dc=exemplo, dc=com. Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
"Password" : "Contrasinal",
"For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.",
"Save Credentials" : "Gardar as credenciais",
@@ -156,7 +156,7 @@
"User Display Name Field" : "Campo de nome de usuario para amosar",
"The LDAP attribute to use to generate the user's display name." : "O atributo LDAP a empregar para xerar o nome de usuario para amosar.",
"2nd User Display Name Field" : "2.º campo de nome de usuario para amosar",
- "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p.ex. «Xan Carallás (xan.carallas@exemplo.org)».",
+ "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributo LDAP para ser engadido no nome para amosar entre parénteses. Resulta en p. ex. «Xan Carallás (xan.carallas@exemplo.org)».",
"Base User Tree" : "Base da árbore de usuarios",
"One User Base DN per line" : "Un DN base de usuario por liña",
"User Search Attributes" : "Atributos de busca do usuario",