aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/autoloader.php163
-rw-r--r--lib/base.php38
-rw-r--r--lib/composer/composer/autoload_classmap.php5
-rw-r--r--lib/composer/composer/autoload_static.php5
-rw-r--r--lib/l10n/fa.js391
-rw-r--r--lib/l10n/fa.json391
-rw-r--r--lib/l10n/fi.js1
-rw-r--r--lib/l10n/fi.json1
-rw-r--r--lib/l10n/ga.js1
-rw-r--r--lib/l10n/ga.json1
-rw-r--r--lib/l10n/ru.js5
-rw-r--r--lib/l10n/ru.json5
-rw-r--r--lib/l10n/tr.js30
-rw-r--r--lib/l10n/tr.json30
-rw-r--r--lib/l10n/uk.js2
-rw-r--r--lib/l10n/uk.json2
-rw-r--r--lib/private/App/AppManager.php21
-rw-r--r--lib/private/App/AppStore/AppNotFoundException.php13
-rw-r--r--lib/private/AppConfig.php9
-rw-r--r--lib/private/AppFramework/Bootstrap/Coordinator.php12
-rw-r--r--lib/private/AppFramework/Services/AppConfig.php4
-rw-r--r--lib/private/Files/Node/Folder.php8
-rw-r--r--lib/private/Files/Node/LazyFolder.php4
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php6
-rw-r--r--lib/private/Installer.php9
-rw-r--r--lib/private/Notification/Manager.php4
-rw-r--r--lib/private/PreviewManager.php16
-rw-r--r--lib/private/Route/CachingRouter.php100
-rw-r--r--lib/private/Route/Route.php10
-rw-r--r--lib/private/Route/Router.php46
-rw-r--r--lib/private/Server.php4
-rw-r--r--lib/private/TemplateLayout.php2
-rw-r--r--lib/private/URLGenerator.php6
-rw-r--r--lib/private/legacy/OC_App.php2
-rw-r--r--lib/public/App/IAppManager.php2
-rw-r--r--lib/public/AppFramework/Http/Attribute/RequestHeader.php24
-rw-r--r--lib/public/Files/Folder.php11
-rw-r--r--lib/public/IAppConfig.php2
-rw-r--r--lib/public/IPreview.php4
-rw-r--r--lib/public/Route/IRoute.php4
40 files changed, 906 insertions, 488 deletions
diff --git a/lib/autoloader.php b/lib/autoloader.php
deleted file mode 100644
index 2a95f5944a3..00000000000
--- a/lib/autoloader.php
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-
-declare(strict_types=1);
-/**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2013-2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-namespace OC;
-
-use OCP\App\AppPathNotFoundException;
-use OCP\App\IAppManager;
-use OCP\AutoloadNotAllowedException;
-use OCP\ICache;
-use Psr\Log\LoggerInterface;
-
-class Autoloader {
- /** @var bool */
- private $useGlobalClassPath = true;
- /** @var array */
- private $validRoots = [];
-
- /**
- * Optional low-latency memory cache for class to path mapping.
- */
- protected ?ICache $memoryCache = null;
-
- /**
- * Autoloader constructor.
- *
- * @param string[] $validRoots
- */
- public function __construct(array $validRoots) {
- foreach ($validRoots as $root) {
- $this->validRoots[$root] = true;
- }
- }
-
- /**
- * Add a path to the list of valid php roots for auto loading
- *
- * @param string $root
- */
- public function addValidRoot(string $root): void {
- $root = stream_resolve_include_path($root);
- $this->validRoots[$root] = true;
- }
-
- /**
- * disable the usage of the global classpath \OC::$CLASSPATH
- */
- public function disableGlobalClassPath(): void {
- $this->useGlobalClassPath = false;
- }
-
- /**
- * enable the usage of the global classpath \OC::$CLASSPATH
- */
- public function enableGlobalClassPath(): void {
- $this->useGlobalClassPath = true;
- }
-
- /**
- * get the possible paths for a class
- *
- * @param string $class
- * @return array an array of possible paths
- */
- public function findClass(string $class): array {
- $class = trim($class, '\\');
-
- $paths = [];
- if ($this->useGlobalClassPath && array_key_exists($class, \OC::$CLASSPATH)) {
- $paths[] = \OC::$CLASSPATH[$class];
- /**
- * @TODO: Remove this when necessary
- * Remove "apps/" from inclusion path for smooth migration to multi app dir
- */
- if (strpos(\OC::$CLASSPATH[$class], 'apps/') === 0) {
- \OCP\Server::get(LoggerInterface::class)->debug('include path for class "' . $class . '" starts with "apps/"', ['app' => 'core']);
- $paths[] = str_replace('apps/', '', \OC::$CLASSPATH[$class]);
- }
- } elseif (strpos($class, 'OC_') === 0) {
- $paths[] = \OC::$SERVERROOT . '/lib/private/legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php');
- } elseif (strpos($class, 'OCA\\') === 0) {
- [, $app, $rest] = explode('\\', $class, 3);
- $app = strtolower($app);
- try {
- $appPath = \OCP\Server::get(IAppManager::class)->getAppPath($app);
- if (stream_resolve_include_path($appPath)) {
- $paths[] = $appPath . '/' . strtolower(str_replace('\\', '/', $rest) . '.php');
- // If not found in the root of the app directory, insert '/lib' after app id and try again.
- $paths[] = $appPath . '/lib/' . strtolower(str_replace('\\', '/', $rest) . '.php');
- }
- } catch (AppPathNotFoundException) {
- // App not found, ignore
- }
- }
- return $paths;
- }
-
- /**
- * @param string $fullPath
- * @return bool
- * @throws AutoloadNotAllowedException
- */
- protected function isValidPath(string $fullPath): bool {
- foreach ($this->validRoots as $root => $true) {
- if (substr($fullPath, 0, strlen($root) + 1) === $root . '/') {
- return true;
- }
- }
- throw new AutoloadNotAllowedException($fullPath);
- }
-
- /**
- * Load the specified class
- *
- * @param string $class
- * @return bool
- * @throws AutoloadNotAllowedException
- */
- public function load(string $class): bool {
- if (class_exists($class, false)) {
- return false;
- }
-
- $pathsToRequire = null;
- if ($this->memoryCache) {
- $pathsToRequire = $this->memoryCache->get($class);
- }
-
- if (!is_array($pathsToRequire)) {
- // No cache or cache miss
- $pathsToRequire = [];
- foreach ($this->findClass($class) as $path) {
- $fullPath = stream_resolve_include_path($path);
- if ($fullPath && $this->isValidPath($fullPath)) {
- $pathsToRequire[] = $fullPath;
- }
- }
-
- if ($this->memoryCache) {
- $this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec
- }
- }
-
- foreach ($pathsToRequire as $fullPath) {
- require_once $fullPath;
- }
-
- return false;
- }
-
- /**
- * Sets the optional low-latency cache for class to path mapping.
- *
- * @param ICache $memoryCache Instance of memory cache.
- */
- public function setMemoryCache(?ICache $memoryCache = null): void {
- $this->memoryCache = $memoryCache;
- }
-}
diff --git a/lib/base.php b/lib/base.php
index 75f5cfee3e8..2b08137aff2 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -40,10 +40,6 @@ require_once 'public/Constants.php';
*/
class OC {
/**
- * Associative array for autoloading. classname => filename
- */
- public static array $CLASSPATH = [];
- /**
* The installation path for Nextcloud on the server (e.g. /srv/http/nextcloud)
*/
public static string $SERVERROOT = '';
@@ -73,8 +69,6 @@ class OC {
*/
public static bool $CLI = false;
- public static \OC\Autoloader $loader;
-
public static \Composer\Autoload\ClassLoader $composerAutoloader;
public static \OC\Server $server;
@@ -597,12 +591,6 @@ class OC {
// register autoloader
$loaderStart = microtime(true);
- require_once __DIR__ . '/autoloader.php';
- self::$loader = new \OC\Autoloader([
- OC::$SERVERROOT . '/lib/private/legacy',
- ]);
- spl_autoload_register([self::$loader, 'load']);
- $loaderEnd = microtime(true);
self::$CLI = (php_sapi_name() == 'cli');
@@ -628,6 +616,7 @@ class OC {
print($e->getMessage());
exit();
}
+ $loaderEnd = microtime(true);
// setup the basic server
self::$server = new \OC\Server(\OC::$WEBROOT, self::$config);
@@ -656,9 +645,6 @@ class OC {
error_reporting(E_ALL);
}
- $systemConfig = Server::get(\OC\SystemConfig::class);
- self::registerAutoloaderCache($systemConfig);
-
// initialize intl fallback if necessary
OC_Util::isSetLocaleWorking();
@@ -692,6 +678,7 @@ class OC {
throw new \OCP\HintException('The PHP SimpleXML/PHP-XML extension is not installed.', 'Install the extension or make sure it is enabled.');
}
+ $systemConfig = Server::get(\OC\SystemConfig::class);
$appManager = Server::get(\OCP\App\IAppManager::class);
if ($systemConfig->getValue('installed', false)) {
$appManager->loadApps(['session']);
@@ -784,8 +771,8 @@ class OC {
// Make sure that the application class is not loaded before the database is setup
if ($systemConfig->getValue('installed', false)) {
$appManager->loadApp('settings');
- /* Build core application to make sure that listeners are registered */
- Server::get(\OC\Core\Application::class);
+ /* Run core application registration */
+ $bootstrapCoordinator->runLazyRegistration('core');
}
//make sure temporary files are cleaned up
@@ -975,23 +962,6 @@ class OC {
}
}
- protected static function registerAutoloaderCache(\OC\SystemConfig $systemConfig): void {
- // The class loader takes an optional low-latency cache, which MUST be
- // namespaced. The instanceid is used for namespacing, but might be
- // unavailable at this point. Furthermore, it might not be possible to
- // generate an instanceid via \OC_Util::getInstanceId() because the
- // config file may not be writable. As such, we only register a class
- // loader cache if instanceid is available without trying to create one.
- $instanceId = $systemConfig->getValue('instanceid', null);
- if ($instanceId) {
- try {
- $memcacheFactory = Server::get(\OCP\ICacheFactory::class);
- self::$loader->setMemoryCache($memcacheFactory->createLocal('Autoloader'));
- } catch (\Exception $ex) {
- }
- }
- }
-
/**
* Handle the request
*/
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 9f4321129af..36f64d970c3 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -1049,6 +1049,7 @@ return array(
'OC\\AppScriptDependency' => $baseDir . '/lib/private/AppScriptDependency.php',
'OC\\AppScriptSort' => $baseDir . '/lib/private/AppScriptSort.php',
'OC\\App\\AppManager' => $baseDir . '/lib/private/App/AppManager.php',
+ 'OC\\App\\AppStore\\AppNotFoundException' => $baseDir . '/lib/private/App/AppStore/AppNotFoundException.php',
'OC\\App\\AppStore\\Bundles\\Bundle' => $baseDir . '/lib/private/App/AppStore/Bundles/Bundle.php',
'OC\\App\\AppStore\\Bundles\\BundleFetcher' => $baseDir . '/lib/private/App/AppStore/Bundles/BundleFetcher.php',
'OC\\App\\AppStore\\Bundles\\EducationBundle' => $baseDir . '/lib/private/App/AppStore/Bundles/EducationBundle.php',
@@ -1202,7 +1203,7 @@ return array(
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
- 'OC\\Core\\Application' => $baseDir . '/core/Application.php',
+ 'OC\\Core\\AppInfo\\Application' => $baseDir . '/core/AppInfo/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => $baseDir . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
'OC\\Core\\BackgroundJobs\\CheckForUserCertificates' => $baseDir . '/core/BackgroundJobs/CheckForUserCertificates.php',
'OC\\Core\\BackgroundJobs\\CleanupLoginFlowV2' => $baseDir . '/core/BackgroundJobs/CleanupLoginFlowV2.php',
@@ -1385,6 +1386,8 @@ return array(
'OC\\Core\\Exception\\LoginFlowV2ClientForbiddenException' => $baseDir . '/core/Exception/LoginFlowV2ClientForbiddenException.php',
'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => $baseDir . '/core/Exception/LoginFlowV2NotFoundException.php',
'OC\\Core\\Exception\\ResetPasswordException' => $baseDir . '/core/Exception/ResetPasswordException.php',
+ 'OC\\Core\\Listener\\AddMissingIndicesListener' => $baseDir . '/core/Listener/AddMissingIndicesListener.php',
+ 'OC\\Core\\Listener\\AddMissingPrimaryKeyListener' => $baseDir . '/core/Listener/AddMissingPrimaryKeyListener.php',
'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => $baseDir . '/core/Listener/BeforeMessageLoggedEventListener.php',
'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => $baseDir . '/core/Listener/BeforeTemplateRenderedListener.php',
'OC\\Core\\Listener\\FeedBackHandler' => $baseDir . '/core/Listener/FeedBackHandler.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 26e0a34275d..327366ca889 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -1090,6 +1090,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\AppScriptDependency' => __DIR__ . '/../../..' . '/lib/private/AppScriptDependency.php',
'OC\\AppScriptSort' => __DIR__ . '/../../..' . '/lib/private/AppScriptSort.php',
'OC\\App\\AppManager' => __DIR__ . '/../../..' . '/lib/private/App/AppManager.php',
+ 'OC\\App\\AppStore\\AppNotFoundException' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/AppNotFoundException.php',
'OC\\App\\AppStore\\Bundles\\Bundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/Bundle.php',
'OC\\App\\AppStore\\Bundles\\BundleFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/BundleFetcher.php',
'OC\\App\\AppStore\\Bundles\\EducationBundle' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Bundles/EducationBundle.php',
@@ -1243,7 +1244,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
- 'OC\\Core\\Application' => __DIR__ . '/../../..' . '/core/Application.php',
+ 'OC\\Core\\AppInfo\\Application' => __DIR__ . '/../../..' . '/core/AppInfo/Application.php',
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
'OC\\Core\\BackgroundJobs\\CheckForUserCertificates' => __DIR__ . '/../../..' . '/core/BackgroundJobs/CheckForUserCertificates.php',
'OC\\Core\\BackgroundJobs\\CleanupLoginFlowV2' => __DIR__ . '/../../..' . '/core/BackgroundJobs/CleanupLoginFlowV2.php',
@@ -1426,6 +1427,8 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Core\\Exception\\LoginFlowV2ClientForbiddenException' => __DIR__ . '/../../..' . '/core/Exception/LoginFlowV2ClientForbiddenException.php',
'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => __DIR__ . '/../../..' . '/core/Exception/LoginFlowV2NotFoundException.php',
'OC\\Core\\Exception\\ResetPasswordException' => __DIR__ . '/../../..' . '/core/Exception/ResetPasswordException.php',
+ 'OC\\Core\\Listener\\AddMissingIndicesListener' => __DIR__ . '/../../..' . '/core/Listener/AddMissingIndicesListener.php',
+ 'OC\\Core\\Listener\\AddMissingPrimaryKeyListener' => __DIR__ . '/../../..' . '/core/Listener/AddMissingPrimaryKeyListener.php',
'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeMessageLoggedEventListener.php',
'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeTemplateRenderedListener.php',
'OC\\Core\\Listener\\FeedBackHandler' => __DIR__ . '/../../..' . '/core/Listener/FeedBackHandler.php',
diff --git a/lib/l10n/fa.js b/lib/l10n/fa.js
index bc5fb7333ea..da77202e434 100644
--- a/lib/l10n/fa.js
+++ b/lib/l10n/fa.js
@@ -2,26 +2,28 @@ OC.L10N.register(
"lib",
{
"Cannot write into \"config\" directory!" : "نمیتوانید داخل دایرکتوری \"config\" تغییراتی ایجاد کنید",
- "This can usually be fixed by giving the web server write access to the config directory." : "This can usually be fixed by giving the web server write access to the config directory.",
- "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it.",
+ "This can usually be fixed by giving the web server write access to the config directory." : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری پیکربندی قابل رفع است.",
+ "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "اما، اگر ترجیح می‌دهید فایل config.php فقط خواندنی باشد، گزینه \"config_is_read_only\" را در آن به true تنظیم کنید.",
"See %s" : "مشاهده %s",
- "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory.",
+ "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "برنامه %1$s موجود نیست یا نسخه‌ای ناسازگار با این سرور دارد. لطفاً دایرکتوری برنامه‌ها را بررسی کنید.",
"Sample configuration detected" : "فایل پیکربندی نمونه پیدا شد",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "تشخیص داده شده است که پیکربندی نمونه کپی شده است. این می تواند نصب شما را خراب کند و پشتیبانی نمی شود. لطفاً قبل از انجام تغییرات در config.php ، اسناد را بخوانید",
- "The page could not be found on the server." : "The page could not be found on the server.",
- "%s email verification" : "%s email verification",
- "Email verification" : "Email verification",
- "Click the following button to confirm your email." : "Click the following button to confirm your email.",
- "Click the following link to confirm your email." : "Click the following link to confirm your email.",
- "Confirm your email" : "Confirm your email",
+ "The page could not be found on the server." : "صفحه در سرور یافت نشد.",
+ "%s email verification" : "تأیید ایمیل %s",
+ "Email verification" : "تأیید ایمیل",
+ "Click the following button to confirm your email." : "برای تأیید ایمیل خود روی دکمه زیر کلیک کنید.",
+ "Click the following link to confirm your email." : "برای تأیید ایمیل خود روی لینک زیر کلیک کنید.",
+ "Confirm your email" : "ایمیل خود را تأیید کنید",
"Other activities" : "سایر فعالیت ها",
- "%1$s and %2$s" : "%1$sو%2$s",
- "%1$s, %2$s and %3$s" : "%1$s،%2$sو%3$s",
- "%1$s, %2$s, %3$s and %4$s" : "%1$s،%2$s،%3$sو%4$s",
- "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s،%2$s،%3$s،%4$sو%5$s",
+ "%1$s and %2$s" : "%1$s و %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s، %2$s و %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s، %2$s، %3$s و %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s، %2$s، %3$s، %4$s و %5$s",
+ "Education bundle" : "بسته آموزشی",
"Enterprise bundle" : "بستهٔ سازمانی",
"Groupware bundle" : "بستهٔ کار گروهی",
"Hub bundle" : "بستهٔ هسته‌ای",
+ "Public sector bundle" : "بسته بخش عمومی",
"Social sharing bundle" : "بستهٔ هم‌رسانی اجتماعی",
"PHP %s or higher is required." : "PHP نسخه‌ی %s یا بالاتر نیاز است.",
"PHP with a version lower than %s is required." : "نیاز به نگارش پایین‌تر از %s پی‌اچ‌پی.",
@@ -35,26 +37,34 @@ OC.L10N.register(
"The following platforms are supported: %s" : "بن‌سازه‌های زیر پشتیبانی می‌شوند: %s",
"Server version %s or higher is required." : "نیاز به کارساز با نگارش %s یا بالاتر.",
"Server version %s or lower is required." : "نیاز به کارساز با نگارش %s یا پایین‌تر.",
- "Wiping of device %s has started" : "پاک کردن دستگاه%s شروع شده است",
- "Wiping of device »%s« has started" : "پاک کردن دستگاه%s شروع شده است",
- "»%s« started remote wipe" : "%sپاک کردن از راه دور",
- "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "دستگاه یا برنامه%s فرآیند پاک کردن از راه دور را آغاز کرده است. پس از اتمام مراحل ، ایمیل دیگری دریافت خواهید کرد",
- "Wiping of device %s has finished" : "پاک کردن دستگاه %sبه پایان رسیده است",
- "Wiping of device »%s« has finished" : "پاک کردن دستگاه %sبه پایان رسیده است",
- "»%s« finished remote wipe" : "%sپاک کردن از راه دور",
- "Device or application »%s« has finished the remote wipe process." : "دستگاه یا برنامه %sفرآیند پاک کردن از راه دور را به پایان رسانده است.",
+ "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "حساب وارد شده باید یک مدیر، یک مدیر فرعی یا دارای حق دسترسی ویژه برای دسترسی به این تنظیم باشد",
+ "Your current IP address doesn't allow you to perform admin actions" : "آدرس IP فعلی شما اجازه انجام اقدامات مدیریتی را به شما نمی‌دهد",
+ "Logged in account must be an admin or sub admin" : "حساب وارد شده باید یک مدیر یا مدیر فرعی باشد",
+ "Logged in account must be an admin" : "حساب وارد شده باید یک مدیر باشد",
+ "Wiping of device %s has started" : "پاک کردن دستگاه %s آغاز شد",
+ "Wiping of device »%s« has started" : "پاک کردن دستگاه «%s» آغاز شد",
+ "»%s« started remote wipe" : "«%s» پاک کردن از راه دور را آغاز کرد",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "دستگاه یا برنامه «%s» فرآیند پاک کردن از راه دور را آغاز کرده است. پس از اتمام مراحل، ایمیل دیگری دریافت خواهید کرد.",
+ "Wiping of device %s has finished" : "پاک کردن دستگاه %s به پایان رسید",
+ "Wiping of device »%s« has finished" : "پاک کردن دستگاه «%s» به پایان رسید",
+ "»%s« finished remote wipe" : "«%s» پاک کردن از راه دور را به پایان رساند",
+ "Device or application »%s« has finished the remote wipe process." : "دستگاه یا برنامه «%s» فرآیند پاک کردن از راه دور را به پایان رسانده است.",
"Remote wipe started" : "پاک کردن از راه دور شروع شد",
- "A remote wipe was started on device %s" : "پاک کردن از راه دور روی دستگاه شروع شد%s",
+ "A remote wipe was started on device %s" : "پاک کردن از راه دور روی دستگاه %s شروع شد",
"Remote wipe finished" : "پاک کردن از راه دور به پایان رسید",
- "The remote wipe on %s has finished" : "پاک کردن از راه دور روی%s کار تمام شد",
+ "The remote wipe on %s has finished" : "پاک کردن از راه دور روی %s کار تمام شد",
"Authentication" : "احراز هویت",
"Unknown filetype" : "نوع فایل ناشناخته",
"Invalid image" : "عکس نامعتبر",
"Avatar image is not square" : "تصویر آواتار مربع نیست",
"Files" : "پوشه‌ها",
"View profile" : "مشاهدهٔ نمایه",
- "_%nh_::_%nh_" : ["%nh","%nh"],
- "Local time: %s" : "Local time: %s",
+ "same time" : "همزمان",
+ "_%nh_::_%nh_" : ["%n ساعت","%n ساعت"],
+ "_%nm_::_%nm_" : ["%n دقیقه","%n دقیقه"],
+ "%s ahead" : "%s جلوتر",
+ "%s behind" : "%s عقب‌تر",
+ "Local time: %s" : "زمان محلی: %s",
"today" : "امروز",
"tomorrow" : "فردا",
"yesterday" : "دیروز",
@@ -75,16 +85,37 @@ OC.L10N.register(
"in a few seconds" : "در چند ثانیه",
"seconds ago" : "ثانیه‌ها پیش",
"Empty file" : "پروندهٔ خالی",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ماژول با شناسه:%s وجود ندارد. لطفاً آن را در تنظیمات برنامه خود فعال کنید یا با سرپرست خود تماس بگیرید",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ماژول با شناسه: %s وجود ندارد. لطفاً آن را در تنظیمات برنامه خود فعال کنید یا با سرپرست خود تماس بگیرید.",
+ "No file conversion providers available" : "ارائه‌دهنده تبدیل فایل در دسترس نیست",
+ "File is too large to convert" : "فایل برای تبدیل خیلی بزرگ است",
+ "Destination does not match conversion extension" : "مقصد با پسوند تبدیل مطابقت ندارد",
+ "Could not convert file" : "فایل قابل تبدیل نبود",
+ "Destination does not exist" : "مقصد وجود ندارد",
+ "Destination is not creatable" : "مقصد قابل ایجاد نیست",
"Dot files are not allowed" : "پرونده‌های نقطه‌دار مجاز نیستند",
- "%1$s (renamed)" : "%1$s (renamed)",
- "renamed file" : "renamed file",
- "Filenames must not end with \"%1$s\"." : "Filenames must not end with \"%1$s\".",
+ "%1$s (renamed)" : "%1$s (تغییر نام داده شد)",
+ "renamed file" : "فایل تغییر نام داده شد",
+ "\"%1$s\" is a forbidden file or folder name." : "«%1$s» یک نام فایل یا پوشه ممنوع است.",
+ "\"%1$s\" is a forbidden prefix for file or folder names." : "«%1$s» یک پیشوند ممنوع برای نام فایل یا پوشه است.",
+ "\"%1$s\" is not allowed inside a file or folder name." : "«%1$s» در نام فایل یا پوشه مجاز نیست.",
+ "\"%1$s\" is a forbidden file type." : "«%1$s» یک نوع فایل ممنوع است.",
+ "Filenames must not end with \"%1$s\"." : "نام فایل‌ها نباید با «%1$s» به پایان برسند.",
+ "Invalid parent path" : "مسیر والد نامعتبر",
"File already exists" : "پرونده از پیش موجود است",
"Invalid path" : "مسیر نامعتبر",
"Failed to create file from template" : "شکست در ایجاد پرونده از قالب",
"Templates" : "قالب‌ها",
+ "Storage %s cannot be moved" : "حافظه %s قابل جابجایی نیست",
+ "Moving a share (%s) into a shared folder is not allowed" : "انتقال یک اشتراک (%s) به یک پوشه مشترک مجاز نیست",
+ "Moving a storage (%s) into a shared folder is not allowed" : "انتقال یک حافظه (%s) به یک پوشه مشترک مجاز نیست",
+ "Moving a share (%s) into another share (%s) is not allowed" : "انتقال یک اشتراک (%s) به اشتراک دیگر (%s) مجاز نیست",
+ "Moving a share (%s) into another storage (%s) is not allowed" : "انتقال یک اشتراک (%s) به حافظه دیگر (%s) مجاز نیست",
+ "Moving a storage (%s) into a share (%s) is not allowed" : "انتقال یک حافظه (%s) به یک اشتراک (%s) مجاز نیست",
+ "Moving a storage (%s) into another storage (%s) is not allowed" : "انتقال یک حافظه (%s) به حافظه دیگر (%s) مجاز نیست",
+ "Path contains invalid segments" : "مسیر شامل بخش‌های نامعتبر است",
+ "Filename is a reserved word" : "نام فایل یک کلمه رزرو شده است",
"Filename contains at least one invalid character" : "نام فایل حداقل دارای یک کاراکتر نامعتبر است",
+ "Filename is too long" : "نام فایل بیش از حد طولانی است",
"Empty filename is not allowed" : "نام فایل نمی‌تواند خالی باشد",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "کارهٔ «%s» به دلیل ناتوانی در خواندن پروندهٔ appinfo نمی‌تواند نصب شود.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "کارهٔ «%s» به دلیل سازگار نبودن با این نگارش از کارساز نمی‌تواند نصب شود.",
@@ -100,8 +131,8 @@ OC.L10N.register(
"Accounts" : "حساب‌ها",
"Email" : "رایانامه",
"Mail %s" : "نامه به %s",
- "Fediverse" : "Fediverse",
- "View %s on the fediverse" : "View %s on the fediverse",
+ "Fediverse" : "فدیورس",
+ "View %s on the fediverse" : "مشاهده %s در فدیورس",
"Phone" : "تلفن",
"Call %s" : "تماس با %s",
"Twitter" : "توییتر",
@@ -111,35 +142,87 @@ OC.L10N.register(
"Address" : "نشانی",
"Profile picture" : "تصویر نمایه",
"About" : "درباره",
- "Display name" : "Display name",
+ "Display name" : "نام نمایشی",
"Headline" : "عنوان",
"Organisation" : "سازمان",
"Role" : "نقش",
+ "Pronouns" : "ضمایر",
+ "Unknown account" : "حساب ناشناخته",
"Additional settings" : "تنظیمات اضافی",
+ "Enter the database Login and name for %s" : "نام کاربری و نام پایگاه داده را برای %s وارد کنید",
+ "Enter the database Login for %s" : "نام کاربری پایگاه داده را برای %s وارد کنید",
"Enter the database name for %s" : "ورود نام پایگاه داده برای %s",
"You cannot use dots in the database name %s" : "نمی‌توانید در در نام پایگاه دادهٔ %s از نقطه استفاده کنید",
+ "MySQL Login and/or password not valid" : "نام کاربری و/یا رمز عبور MySQL نامعتبر است",
"You need to enter details of an existing account." : "لازم است جزییات یک حساب موحود را وارد کنید.",
"Oracle connection could not be established" : "ارتباط اراکل نمیتواند برقرار باشد.",
+ "Oracle Login and/or password not valid" : "نام کاربری و/یا رمز عبور Oracle نامعتبر است",
+ "PostgreSQL Login and/or password not valid" : "نام کاربری و/یا رمز عبور PostgreSQL نامعتبر است",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk!" : "Mac OS X پشتیبانی نمی‌شود و %s روی این پلتفرم به درستی کار نخواهد کرد. با مسئولیت خودتان از آن استفاده کنید!",
"For the best results, please consider using a GNU/Linux server instead." : "برای بهترین نتیجه، استفاده از یک کارساز گنو/لینوکسی را در نظر داشته باشید.",
- "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "به نظر می رسد%s که این نمونه در یک محیط PHP 32 بیتی در حال اجرا است و open_baseir در php.ini پیکربندی شده است. این مسئله به پرونده هایی با بیش از 4 گیگ منجر می شود و بسیار دلسرد می شود",
- "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "لطفاً تنظیمات open_baseir را درون php.ini خود حذف کنید یا به PHP 64 بیتی تغییر دهید.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "به نظر می رسد %s که این نمونه در یک محیط PHP 32 بیتی در حال اجرا است و open_basedir در php.ini پیکربندی شده است. این مسئله به پرونده هایی با بیش از 4 گیگ منجر می شود و بسیار دلسرد می شود.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "لطفاً تنظیمات open_basedir را درون php.ini خود حذف کنید یا به PHP 64 بیتی تغییر دهید.",
+ "Set an admin Login." : "یک نام کاربری برای مدیر تنظیم کنید.",
"Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.",
- "Cannot create or write into the data directory %s" : "Cannot create or write into the data directory %s",
- "Sharing backend %s must implement the interface OCP\\Share_Backend" : "به اشتراک گذاشتن باطن باید رابط OCP \\ Share_Backend %sرا پیاده سازی کند",
- "Sharing backend %s not found" : "به اشتراک گذاشتن باطن%s یافت نشد",
- "Sharing backend for %s not found" : "به اشتراک گذاشتن باطن برای%s یافت نشد",
+ "Cannot create or write into the data directory %s" : "نمی‌توان در دایرکتوری داده %s ایجاد یا نوشت",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "بک‌اند اشتراک‌گذاری %s باید رابط OCP\\Share_Backend را پیاده‌سازی کند",
+ "Sharing backend %s not found" : "بک‌اند اشتراک‌گذاری %s یافت نشد",
+ "Sharing backend for %s not found" : "بک‌اند اشتراک‌گذاری برای %s یافت نشد",
+ "%1$s shared %2$s with you" : "%1$s %2$s را با شما به اشتراک گذاشت",
+ "Open %s" : "باز کردن %s",
"%1$s via %2$s" : "%1$s از طریق %2$s",
+ "%1$s shared %2$s with you and wants to add:" : "%1$s %2$s را با شما به اشتراک گذاشت و می‌خواهد اضافه کند:",
+ "%1$s shared %2$s with you and wants to add" : "%1$s %2$s را با شما به اشتراک گذاشت و می‌خواهد اضافه کند",
+ "%s added a note to a file shared with you" : "%s یک یادداشت به فایلی که با شما به اشتراک گذاشته شده است اضافه کرد",
+ "Passwords are enforced for link and mail shares" : "رمزهای عبور برای اشتراک‌گذاری لینک و ایمیل اجباری هستند",
+ "Share recipient is not a valid user" : "گیرنده اشتراک یک کاربر معتبر نیست",
+ "Share recipient is not a valid group" : "گیرنده اشتراک یک گروه معتبر نیست",
+ "Share recipient should be empty" : "گیرنده اشتراک باید خالی باشد",
+ "Share recipient should not be empty" : "گیرنده اشتراک نباید خالی باشد",
+ "Share recipient is not a valid circle" : "گیرنده اشتراک یک دایره معتبر نیست",
"Unknown share type" : "نوع اشتراک ناشناخته",
- "You are not allowed to share %s" : "شما مجاز به اشتراک گذاری نیستید%s",
- "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
- "Files cannot be shared with delete permissions" : "Files cannot be shared with delete permissions",
- "Files cannot be shared with create permissions" : "Files cannot be shared with create permissions",
+ "Share initiator must be set" : "شروع‌کننده اشتراک باید تنظیم شود",
+ "Cannot share with yourself" : "نمی‌توانید با خودتان به اشتراک بگذارید",
+ "Shared path must be set" : "مسیر مشترک باید تنظیم شود",
+ "Shared path must be either a file or a folder" : "مسیر مشترک باید یک فایل یا یک پوشه باشد",
+ "You cannot share your root folder" : "نمی‌توانید پوشه ریشه خود را به اشتراک بگذارید",
+ "You are not allowed to share %s" : "شما مجاز به اشتراک گذاری %s نیستید",
+ "Valid permissions are required for sharing" : "مجوزهای معتبر برای اشتراک‌گذاری لازم است",
+ "File shares cannot have create or delete permissions" : "اشتراک‌گذاری فایل‌ها نمی‌تواند مجوزهای ایجاد یا حذف داشته باشد",
+ "Cannot increase permissions of %s" : "نمی‌توان مجوزهای %s را افزایش داد",
+ "Shares need at least read permissions" : "اشتراک‌گذاری‌ها حداقل به مجوزهای خواندن نیاز دارند",
+ "Files cannot be shared with delete permissions" : "فایل‌ها را نمی‌توان با مجوزهای حذف به اشتراک گذاشت",
+ "Files cannot be shared with create permissions" : "فایل‌ها را نمی‌توان با مجوزهای ایجاد به اشتراک گذاشت",
"Expiration date is in the past" : "تاریخ انقضا در گذشته است",
- "_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["Cannot set expiration date more than %n day in the future","Cannot set expiration date more than %n days in the future"],
- "Sharing is only allowed with group members" : "Sharing is only allowed with group members",
+ "Expiration date is enforced" : "تاریخ انقضا اجباری است",
+ "_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["نمی‌توان تاریخ انقضا را بیش از %n روز در آینده تنظیم کرد","نمی‌توان تاریخ انقضا را بیش از %n روز در آینده تنظیم کرد"],
+ "Sharing is only allowed with group members" : "اشتراک‌گذاری فقط با اعضای گروه مجاز است",
+ "Sharing %s failed, because this item is already shared with the account %s" : "اشتراک‌گذاری %s ناموفق بود، زیرا این مورد قبلاً با حساب %s به اشتراک گذاشته شده است",
+ "Group sharing is now allowed" : "اشتراک‌گذاری گروهی اکنون مجاز است",
+ "Sharing is only allowed within your own groups" : "اشتراک‌گذاری فقط در گروه‌های خودتان مجاز است",
+ "Path is already shared with this group" : "این مسیر قبلاً با این گروه به اشتراک گذاشته شده است",
+ "Link sharing is not allowed" : "اشتراک‌گذاری لینک مجاز نیست",
+ "Public upload is not allowed" : "بارگذاری عمومی مجاز نیست",
+ "You cannot share a folder that contains other shares" : "نمی‌توانید پوشه‌ای را به اشتراک بگذارید که حاوی اشتراک‌های دیگر است",
+ "Sharing is disabled" : "اشتراک‌گذاری غیرفعال است",
+ "Sharing is disabled for you" : "اشتراک‌گذاری برای شما غیرفعال است",
+ "Cannot share with the share owner" : "نمی‌توان با صاحب اشتراک به اشتراک گذاشت",
+ "Share does not have a full ID" : "اشتراک شناسه کامل ندارد",
+ "Cannot change share type" : "نمی‌توان نوع اشتراک را تغییر داد",
+ "Can only update recipient on user shares" : "فقط می‌توان گیرنده را در اشتراک‌های کاربر به‌روزرسانی کرد",
+ "Cannot enable sending the password by Talk with an empty password" : "نمی‌توان ارسال رمز عبور از طریق Talk را با رمز عبور خالی فعال کرد",
+ "Cannot enable sending the password by Talk without setting a new password" : "نمی‌توان ارسال رمز عبور از طریق Talk را بدون تنظیم رمز عبور جدید فعال کرد",
+ "Cannot disable sending the password by Talk without setting a new password" : "نمی‌توان ارسال رمز عبور از طریق Talk را بدون تنظیم رمز عبور جدید غیرفعال کرد",
+ "Share provider does not support accepting" : "ارائه‌دهنده اشتراک از پذیرش پشتیبانی نمی‌کند",
+ "Cannot change target of link share" : "نمی‌توان مقصد اشتراک لینک را تغییر داد",
+ "Invalid share recipient" : "گیرنده اشتراک نامعتبر است",
+ "Group \"%s\" does not exist" : "گروه «%s» وجود ندارد",
"The requested share does not exist anymore" : "سهم درخواست شده دیگر وجود ندارد",
- "The user was not created because the user limit has been reached. Check your notifications to learn more." : "The user was not created because the user limit has been reached. Check your notifications to learn more.",
+ "The requested share comes from a disabled user" : "اشتراک درخواستی از یک کاربر غیرفعال است",
+ "The user was not created because the user limit has been reached. Check your notifications to learn more." : "کاربر ایجاد نشد زیرا محدودیت کاربر به پایان رسیده است. برای اطلاعات بیشتر اعلان‌های خود را بررسی کنید.",
"Could not find category \"%s\"" : "دسته بندی %s یافت نشد",
+ "Input text" : "متن ورودی",
+ "The input text" : "متن ورودی",
"Sunday" : "یک‌شنبه",
"Monday" : "دوشنبه",
"Tuesday" : "سه‌شنبه",
@@ -186,6 +269,15 @@ OC.L10N.register(
"Nov." : "نو.",
"Dec." : "دس.",
"A valid password must be provided" : "رمز عبور صحیح باید وارد شود",
+ "The Login is already being used" : "نام کاربری قبلاً استفاده شده است",
+ "Could not create account" : "حساب کاربری ایجاد نشد",
+ "Only the following characters are allowed in an Login: \"a-z\", \"A-Z\", \"0-9\", spaces and \"_.@-'\"" : "فقط کاراکترهای زیر در نام کاربری مجاز هستند: \"a-z\", \"A-Z\", \"0-9\", فاصله و \"_.@-'\"",
+ "A valid Login must be provided" : "یک نام کاربری معتبر باید ارائه شود",
+ "Login contains whitespace at the beginning or at the end" : "نام کاربری حاوی فاصله در ابتدا یا انتها است",
+ "Login must not consist of dots only" : "نام کاربری نباید فقط از نقطه تشکیل شده باشد",
+ "Username is too long" : "نام کاربری بیش از حد طولانی است",
+ "Login is invalid because files already exist for this user" : "نام کاربری نامعتبر است زیرا فایل‌ها برای این کاربر از قبل وجود دارند",
+ "Account disabled" : "حساب کاربری غیرفعال است",
"Login canceled by app" : "ورود به دست کاره لغو شد",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "کارهٔ «%1$s» نمی‌تواند نصب شود؛ چرا که وابستگی زیر تأمین نشده: %2$s",
"a safe home for all your data" : "خانه‌ای امن برای تمامی داده‌هایتان",
@@ -193,60 +285,173 @@ OC.L10N.register(
"Authentication error" : "خطا در اعتبار سنجی",
"Token expired. Please reload page." : "Token منقضی شده است. لطفا دوباره صفحه را بارگذاری نمایید.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "هیچ درایور پایگاه داده (sqlite ، mysql یا postgresql) نصب نشده است.",
- "Cannot write into \"config\" directory." : "Cannot write into \"config\" directory.",
- "This can usually be fixed by giving the web server write access to the config directory. See %s" : "This can usually be fixed by giving the web server write access to the config directory. See %s",
- "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "یا اگر ترجیح می دهید پرونده config.php را فقط بخوانید ، گزینه \"config_is_read_only\" را در آن تنظیم کنید. دیدن%s",
- "Cannot write into \"apps\" directory." : "Cannot write into \"apps\" directory.",
- "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file.",
- "Cannot create \"data\" directory." : "Cannot create \"data\" directory.",
- "This can usually be fixed by giving the web server write access to the root directory. See %s" : "This can usually be fixed by giving the web server write access to the root directory. See %s",
- "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "Permissions can usually be fixed by giving the web server write access to the root directory. See %s.",
- "Your data directory is not writable." : "Your data directory is not writable.",
- "Setting locale to %s failed." : "Setting locale to %s failed.",
- "Please install one of these locales on your system and restart your web server." : "Please install one of these locales on your system and restart your web server.",
+ "Cannot write into \"config\" directory." : "نمی‌توان در دایرکتوری «config» نوشت.",
+ "This can usually be fixed by giving the web server write access to the config directory. See %s" : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری پیکربندی قابل رفع است. مشاهده %s",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "یا اگر ترجیح می‌دهید فایل config.php فقط خواندنی باشد، گزینه \"config_is_read_only\" را در آن به true تنظیم کنید. مشاهده %s",
+ "Cannot write into \"apps\" directory." : "نمی‌توان در دایرکتوری «apps» نوشت.",
+ "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری برنامه‌ها یا غیرفعال کردن فروشگاه برنامه در فایل پیکربندی قابل رفع است.",
+ "Cannot create \"data\" directory." : "نمی‌توان دایرکتوری «data» را ایجاد کرد.",
+ "This can usually be fixed by giving the web server write access to the root directory. See %s" : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری ریشه قابل رفع است. مشاهده %s",
+ "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "مجوزها معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری ریشه قابل رفع هستند. مشاهده %s.",
+ "Your data directory is not writable." : "دایرکتوری داده شما قابل نوشتن نیست.",
+ "Setting locale to %s failed." : "تنظیم محلی به %s ناموفق بود.",
+ "Please install one of these locales on your system and restart your web server." : "لطفاً یکی از این محلی‌ها را روی سیستم خود نصب کرده و وب‌سرور خود را مجدداً راه‌اندازی کنید.",
"PHP module %s not installed." : "ماژول PHP %s نصب نشده است.",
"Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.",
- "PHP setting \"%s\" is not set to \"%s\"." : "تنظیمات PHP%s تنظیم نشده است%s",
+ "PHP setting \"%s\" is not set to \"%s\"." : "تنظیمات PHP «%s» روی «%s» تنظیم نشده است.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "تنظیم این تنظیمات در php.ini باعث می شود Nextcloud دوباره اجرا شود",
- "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>.",
- "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini.",
- "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ظاهراً برای خنثی کردن بلوک های اسناد درون خطی تنظیم شده است. این کار چندین برنامه اصلی را غیرقابل دسترسی خواهد کرد.",
- "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "این احتمالاً توسط حافظه پنهان / کش مانند Zend OPcache یا eAccelerator ایجاد شده است.",
- "PHP modules have been installed, but they are still listed as missing?" : "ماژول های پی اچ پی نصب شده اند ، اما هنوز هم به عنوان مفقود شده ذکر شده اند؟",
- "Please ask your server administrator to restart the web server." : "لطفاً از سرور سرور خود بخواهید که وب سرور را مجدداً راه اندازی کند.",
- "The required %s config variable is not configured in the config.php file." : "The required %s config variable is not configured in the config.php file.",
- "Please ask your server administrator to check the Nextcloud configuration." : "Please ask your server administrator to check the Nextcloud configuration.",
- "Your data directory must be an absolute path." : "Your data directory must be an absolute path.",
- "Check the value of \"datadirectory\" in your configuration." : "Check the value of \"datadirectory\" in your configuration.",
- "Your data directory is invalid." : "Your data directory is invalid.",
- "Action \"%s\" not supported or implemented." : "عملی%s پشتیبانی یا اجرا نشده است.",
- "Authentication failed, wrong token or provider ID given" : "تأیید اعتبار انجام نشد ، نشانه اشتباه یا شناسه ارائه دهنده داده شد",
- "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "پارامترهای موجود برای تکمیل درخواست. پارامترهای موجود نیست%s",
- "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "شناسه%1$s قبلاً توسط ارائه دهنده فدراسیون ابر استفاده شده است%2$s",
- "Cloud Federation Provider with ID: \"%s\" does not exist." : "ارائه دهنده فدراسیون Cloud با شناسه:%s وجود ندارد.",
- "Could not obtain lock type %d on \"%s\"." : "نمی توان نوع%d قفل را به دست آورد%s",
- "Storage unauthorized. %s" : "ذخیره سازی غیر مجاز.%s",
- "Storage incomplete configuration. %s" : "پیکربندی ناقص ذخیره سازی.%s<br>",
- "Storage connection error. %s" : "خطای اتصال ذخیره سازی%s",
- "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
- "Storage connection timeout. %s" : "مدت زمان اتصال ذخیره سازی%s",
- "Confirmation" : "Confirmation",
- "Prompt" : "Prompt",
- "Chat" : "Chat",
- "Generates a possible headline for a text." : "Generates a possible headline for a text.",
+ "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code> به جای مقدار مورد انتظار <code>0</code> روی <code>%s</code> تنظیم شده است.",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "برای رفع این مشکل، <code>mbstring.func_overload</code> را در php.ini خود روی <code>0</code> تنظیم کنید.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ظاهراً برای حذف بلوک‌های مستندات درون‌خطی تنظیم شده است. این کار چندین برنامه اصلی را غیرقابل دسترس خواهد کرد.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "این احتمالاً توسط حافظه پنهان/شتاب‌دهنده‌ای مانند Zend OPcache یا eAccelerator ایجاد شده است.",
+ "PHP modules have been installed, but they are still listed as missing?" : "ماژول‌های PHP نصب شده‌اند، اما همچنان به عنوان گم‌شده لیست شده‌اند؟",
+ "Please ask your server administrator to restart the web server." : "لطفاً از مدیر سرور خود بخواهید که وب‌سرور را مجدداً راه‌اندازی کند.",
+ "The required %s config variable is not configured in the config.php file." : "متغیر پیکربندی مورد نیاز %s در فایل config.php پیکربندی نشده است.",
+ "Please ask your server administrator to check the Nextcloud configuration." : "لطفاً از مدیر سرور خود بخواهید پیکربندی Nextcloud را بررسی کند.",
+ "Your data directory is readable by other people." : "دایرکتوری داده شما برای دیگران قابل خواندن است.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other people." : "لطفاً مجوزها را به 0770 تغییر دهید تا دایرکتوری توسط افراد دیگر قابل فهرست شدن نباشد.",
+ "Your data directory must be an absolute path." : "دایرکتوری داده شما باید یک مسیر مطلق باشد.",
+ "Check the value of \"datadirectory\" in your configuration." : "مقدار \"datadirectory\" را در پیکربندی خود بررسی کنید.",
+ "Your data directory is invalid." : "دایرکتوری داده شما نامعتبر است.",
+ "Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "اطمینان حاصل کنید که فایلی به نام «%1$s» در ریشه دایرکتوری داده وجود دارد. این فایل باید حاوی: «%2$s» باشد",
+ "Action \"%s\" not supported or implemented." : "عملیات «%s» پشتیبانی یا اجرا نشده است.",
+ "Authentication failed, wrong token or provider ID given" : "تأیید اعتبار انجام نشد، نشانه اشتباه یا شناسه ارائه دهنده داده شد",
+ "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "پارامترهای مورد نیاز برای تکمیل درخواست وجود ندارند. پارامترهای از دست رفته: «%s»",
+ "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "شناسه «%1$s» قبلاً توسط ارائه‌دهنده فدراسیون ابری «%2$s» استفاده شده است",
+ "Cloud Federation Provider with ID: \"%s\" does not exist." : "ارائه‌دهنده فدراسیون ابری با شناسه: «%s» وجود ندارد.",
+ "Could not obtain lock type %d on \"%s\"." : "نمی‌توان قفل از نوع %d را روی «%s» به دست آورد.",
+ "Storage unauthorized. %s" : "دسترسی به حافظه غیرمجاز است. %s",
+ "Storage incomplete configuration. %s" : "پیکربندی حافظه ناقص است. %s",
+ "Storage connection error. %s" : "خطای اتصال حافظه. %s",
+ "Storage is temporarily not available" : "حافظه به طور موقت در دسترس نیست",
+ "Storage connection timeout. %s" : "مهلت اتصال حافظه به پایان رسید. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "برای اجرای این بررسی، باید مطمئن شوید که وب‌سرور شما می‌تواند به خودش متصل شود. بنابراین باید بتواند حداقل یکی از `trusted_domains` یا `overwrite.cli.url` خود را حل و به آن متصل شود. این خطا ممکن است نتیجه عدم تطابق DNS سمت سرور یا قانون فایروال خروجی باشد.",
+ "Transcribe audio" : "رونوشت صوتی",
+ "Transcribe the things said in an audio" : "رونوشت چیزهای گفته شده در یک فایل صوتی",
+ "Audio input" : "ورودی صوتی",
+ "The audio to transcribe" : "فایل صوتی برای رونوشت",
+ "Transcription" : "رونوشت",
+ "The transcribed text" : "متن رونوشت شده",
+ "Chat with an agent" : "چت با یک عامل",
+ "Chat message" : "پیام چت",
+ "A chat message to send to the agent." : "یک پیام چت برای ارسال به عامل.",
+ "Confirmation" : "تأیید",
+ "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "آیا اقدامات قبلاً درخواست شده را تأیید کنید: 0 برای رد و 1 برای تأیید.",
+ "Conversation token" : "توکن مکالمه",
+ "A token representing the conversation." : "یک توکن نماینده مکالمه.",
+ "Generated response" : "پاسخ تولید شده",
+ "The response from the chat model." : "پاسخ از مدل چت.",
+ "The new conversation token" : "توکن مکالمه جدید",
+ "Send this along with the next interaction." : "این را همراه با تعامل بعدی ارسال کنید.",
+ "Requested actions by the agent" : "اقدامات درخواستی توسط عامل",
+ "Actions that the agent would like to carry out in JSON format." : "اقدامات که عامل مایل به انجام آنها در قالب JSON است.",
+ "Context write" : "نوشتن متنی",
+ "Writes text in a given style based on the provided source material." : "متن را با سبکی مشخص بر اساس محتوای منبع ارائه شده می‌نویسد.",
+ "Writing style" : "سبک نگارش",
+ "Demonstrate a writing style that you would like to immitate" : "یک سبک نگارش را که می‌خواهید تقلید کنید، نشان دهید",
+ "Source material" : "محتوای منبع",
+ "The content that would like to be rewritten in the new writing style" : "محتوایی که می‌خواهید با سبک نگارش جدید بازنویسی شود",
+ "Generated text" : "متن تولید شده",
+ "The generated text with content from the source material in the given style" : "متن تولید شده با محتوای منبع در سبک مشخص شده",
+ "Emoji generator" : "تولیدکننده اموجی",
+ "Takes text and generates a representative emoji for it." : "متن را دریافت کرده و یک اموجی مناسب برای آن تولید می‌کند.",
+ "The text to generate an emoji for" : "متنی که می‌خواهید برای آن اموجی تولید شود",
+ "Generated emoji" : "اموجی تولید شده",
+ "The generated emoji based on the input text" : "اموجی تولید شده بر اساس متن ورودی",
+ "Generate image" : "تولید تصویر",
+ "Generate an image from a text prompt" : "تولید تصویر از یک متن ورودی",
+ "Prompt" : "درخواست",
+ "Describe the image you want to generate" : "تصویری که می‌خواهید تولید شود را توصیف کنید",
+ "Number of images" : "تعداد تصاویر",
+ "How many images to generate" : "چه تعداد تصویر تولید شود",
+ "Output images" : "تصاویر خروجی",
+ "The generated images" : "تصاویر تولید شده",
+ "Generate speech" : "تولید گفتار",
+ "Generate speech from a transcript" : "تولید گفتار از یک رونوشت",
+ "Write transcript that you want the assistant to generate speech from" : "رونوشتی را بنویسید که می‌خواهید دستیار از آن گفتار تولید کند",
+ "Output speech" : "گفتار خروجی",
+ "The generated speech" : "گفتار تولید شده",
+ "Free text to text prompt" : "درخواست متن به متن آزاد",
+ "Runs an arbitrary prompt through a language model that returns a reply" : "یک درخواست دلخواه را از طریق یک مدل زبانی اجرا می‌کند که پاسخی را برمی‌گرداند",
+ "Describe a task that you want the assistant to do or ask a question" : "وظیفه‌ای که می‌خواهید دستیار انجام دهد را توصیف کنید یا سؤالی بپرسید",
+ "Generated reply" : "پاسخ تولید شده",
+ "The generated text from the assistant" : "متن تولید شده توسط دستیار",
+ "Change Tone" : "تغییر لحن",
+ "Change the tone of a piece of text." : "لحن یک قطعه متن را تغییر دهید.",
+ "Write a text that you want the assistant to rewrite in another tone." : "متنی را بنویسید که می‌خواهید دستیار آن را با لحن دیگری بازنویسی کند.",
+ "Desired tone" : "لحن مورد نظر",
+ "In which tone should your text be rewritten?" : "متن شما با چه لحنی بازنویسی شود؟",
+ "The rewritten text in the desired tone, written by the assistant:" : "متن بازنویسی شده با لحن مورد نظر، نوشته شده توسط دستیار:",
+ "Chat" : "چت",
+ "Chat with the assistant" : "چت با دستیار",
+ "System prompt" : "درخواست سیستمی",
+ "Define rules and assumptions that the assistant should follow during the conversation." : "قوانین و فرضیاتی را که دستیار باید در طول مکالمه رعایت کند، تعریف کنید.",
+ "Chat history" : "تاریخچه چت",
+ "The history of chat messages before the current message, starting with a message by the user" : "تاریخچه پیام‌های چت قبل از پیام فعلی، با شروع از یک پیام توسط کاربر",
+ "Response message" : "پیام پاسخ",
+ "The generated response as part of the conversation" : "پاسخ تولید شده به عنوان بخشی از مکالمه",
+ "Chat with tools" : "چت با ابزارها",
+ "Chat with the language model with tool calling support." : "چت با مدل زبانی با پشتیبانی از فراخوانی ابزار.",
+ "Tool message" : "پیام ابزار",
+ "The result of tool calls in the last interaction" : "نتیجه فراخوانی ابزارها در تعامل قبلی",
+ "Available tools" : "ابزارهای موجود",
+ "The available tools in JSON format" : "ابزارهای موجود در قالب JSON",
+ "The response from the chat model" : "پاسخ از مدل چت",
+ "Tool calls" : "فراخوانی ابزار",
+ "Tools call instructions from the model in JSON format" : "دستورالعمل‌های فراخوانی ابزار از مدل در قالب JSON",
+ "Formalize text" : "رسمی کردن متن",
+ "Takes a text and makes it sound more formal" : "یک متن را دریافت کرده و آن را رسمی‌تر می‌کند",
+ "Write a text that you want the assistant to formalize" : "متنی را بنویسید که می‌خواهید دستیار آن را رسمی کند",
+ "Formalized text" : "متن رسمی شده",
+ "The formalized text" : "متن رسمی شده",
+ "Generate a headline" : "تولید یک عنوان",
+ "Generates a possible headline for a text." : "یک عنوان احتمالی برای یک متن تولید می‌کند.",
+ "Original text" : "متن اصلی",
+ "The original text to generate a headline for" : "متن اصلی برای تولید عنوان",
+ "The generated headline" : "عنوان تولید شده",
+ "Proofread" : "ویرایش",
+ "Proofreads a text and lists corrections" : "یک متن را ویرایش کرده و اصلاحات را لیست می‌کند",
"Text" : "متن",
- "Summarize" : "Summarize",
+ "The text to proofread" : "متن برای ویرایش",
+ "Corrections" : "اصلاحات",
+ "The corrections that should be made in your text" : "اصلاحاتی که باید در متن شما انجام شود",
+ "Reformulate text" : "بازنویسی متن",
+ "Takes a text and reformulates it" : "یک متن را دریافت کرده و آن را بازنویسی می‌کند",
+ "Write a text that you want the assistant to reformulate" : "متنی را بنویسید که می‌خواهید دستیار آن را بازنویسی کند",
+ "Reformulated text" : "متن بازنویسی شده",
+ "The reformulated text, written by the assistant" : "متن بازنویسی شده، نوشته شده توسط دستیار",
+ "Simplify text" : "ساده‌سازی متن",
+ "Takes a text and simplifies it" : "یک متن را دریافت کرده و آن را ساده می‌کند",
+ "Write a text that you want the assistant to simplify" : "متنی را بنویسید که می‌خواهید دستیار آن را ساده کند",
+ "Simplified text" : "متن ساده شده",
+ "The simplified text" : "متن ساده شده",
+ "Summarize" : "خلاصه‌سازی",
+ "Summarizes a text" : "یک متن را خلاصه‌سازی می‌کند",
+ "The original text to summarize" : "متن اصلی برای خلاصه‌سازی",
"Summary" : "چکیده",
- "Extract topics" : "Extract topics",
+ "The generated summary" : "خلاصه تولید شده",
+ "Extract topics" : "استخراج موضوعات",
+ "Extracts topics from a text and outputs them separated by commas" : "موضوعات را از یک متن استخراج کرده و با کاما جدا شده خروجی می‌دهد",
+ "The original text to extract topics from" : "متن اصلی برای استخراج موضوعات",
+ "Topics" : "موضوعات",
+ "The list of extracted topics" : "لیست موضوعات استخراج شده",
"Translate" : "ترجمه",
- "Target language" : "Target language",
- "Result" : "شروع به اسکنیک",
- "Free prompt" : "Free prompt",
- "Runs an arbitrary prompt through the language model." : "Runs an arbitrary prompt through the language model.",
- "Generate headline" : "Generate headline",
- "Summarizes text by reducing its length without losing key information." : "Summarizes text by reducing its length without losing key information.",
- "Extracts topics from a text and outputs them separated by commas." : "Extracts topics from a text and outputs them separated by commas.",
+ "Translate text from one language to another" : "ترجمه متن از یک زبان به زبان دیگر",
+ "Origin text" : "متن مبدأ",
+ "The text to translate" : "متن برای ترجمه",
+ "Origin language" : "زبان مبدأ",
+ "The language of the origin text" : "زبان متن مبدأ",
+ "Target language" : "زبان مقصد",
+ "The desired language to translate the origin text in" : "زبان مورد نظر برای ترجمه متن مبدأ",
+ "Result" : "نتیجه",
+ "The translated text" : "متن ترجمه شده",
+ "Free prompt" : "درخواست آزاد",
+ "Runs an arbitrary prompt through the language model." : "یک درخواست دلخواه را از طریق مدل زبانی اجرا می‌کند.",
+ "Generate headline" : "تولید عنوان",
+ "Summarizes text by reducing its length without losing key information." : "متن را با کاهش طول آن و بدون از دست دادن اطلاعات کلیدی، خلاصه‌سازی می‌کند.",
+ "Extracts topics from a text and outputs them separated by commas." : "موضوعات را از یک متن استخراج کرده و با کاما جدا شده خروجی می‌دهد.",
"File is currently busy, please try again later" : "فایل در حال حاضر مشغول است، لطفا مجددا تلاش کنید",
- "Cannot download file" : "نمی‌توان پرونده را بارگرفت"
+ "Cannot download file" : "نمی‌توان پرونده را بارگرفت",
+ "Login is too long" : "نام کاربری بیش از حد طولانی است"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/fa.json b/lib/l10n/fa.json
index d8d6d9fb166..7fda24b1e51 100644
--- a/lib/l10n/fa.json
+++ b/lib/l10n/fa.json
@@ -1,25 +1,27 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "نمیتوانید داخل دایرکتوری \"config\" تغییراتی ایجاد کنید",
- "This can usually be fixed by giving the web server write access to the config directory." : "This can usually be fixed by giving the web server write access to the config directory.",
- "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it.",
+ "This can usually be fixed by giving the web server write access to the config directory." : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری پیکربندی قابل رفع است.",
+ "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "اما، اگر ترجیح می‌دهید فایل config.php فقط خواندنی باشد، گزینه \"config_is_read_only\" را در آن به true تنظیم کنید.",
"See %s" : "مشاهده %s",
- "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory.",
+ "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "برنامه %1$s موجود نیست یا نسخه‌ای ناسازگار با این سرور دارد. لطفاً دایرکتوری برنامه‌ها را بررسی کنید.",
"Sample configuration detected" : "فایل پیکربندی نمونه پیدا شد",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "تشخیص داده شده است که پیکربندی نمونه کپی شده است. این می تواند نصب شما را خراب کند و پشتیبانی نمی شود. لطفاً قبل از انجام تغییرات در config.php ، اسناد را بخوانید",
- "The page could not be found on the server." : "The page could not be found on the server.",
- "%s email verification" : "%s email verification",
- "Email verification" : "Email verification",
- "Click the following button to confirm your email." : "Click the following button to confirm your email.",
- "Click the following link to confirm your email." : "Click the following link to confirm your email.",
- "Confirm your email" : "Confirm your email",
+ "The page could not be found on the server." : "صفحه در سرور یافت نشد.",
+ "%s email verification" : "تأیید ایمیل %s",
+ "Email verification" : "تأیید ایمیل",
+ "Click the following button to confirm your email." : "برای تأیید ایمیل خود روی دکمه زیر کلیک کنید.",
+ "Click the following link to confirm your email." : "برای تأیید ایمیل خود روی لینک زیر کلیک کنید.",
+ "Confirm your email" : "ایمیل خود را تأیید کنید",
"Other activities" : "سایر فعالیت ها",
- "%1$s and %2$s" : "%1$sو%2$s",
- "%1$s, %2$s and %3$s" : "%1$s،%2$sو%3$s",
- "%1$s, %2$s, %3$s and %4$s" : "%1$s،%2$s،%3$sو%4$s",
- "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s،%2$s،%3$s،%4$sو%5$s",
+ "%1$s and %2$s" : "%1$s و %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s، %2$s و %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s، %2$s، %3$s و %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s، %2$s، %3$s، %4$s و %5$s",
+ "Education bundle" : "بسته آموزشی",
"Enterprise bundle" : "بستهٔ سازمانی",
"Groupware bundle" : "بستهٔ کار گروهی",
"Hub bundle" : "بستهٔ هسته‌ای",
+ "Public sector bundle" : "بسته بخش عمومی",
"Social sharing bundle" : "بستهٔ هم‌رسانی اجتماعی",
"PHP %s or higher is required." : "PHP نسخه‌ی %s یا بالاتر نیاز است.",
"PHP with a version lower than %s is required." : "نیاز به نگارش پایین‌تر از %s پی‌اچ‌پی.",
@@ -33,26 +35,34 @@
"The following platforms are supported: %s" : "بن‌سازه‌های زیر پشتیبانی می‌شوند: %s",
"Server version %s or higher is required." : "نیاز به کارساز با نگارش %s یا بالاتر.",
"Server version %s or lower is required." : "نیاز به کارساز با نگارش %s یا پایین‌تر.",
- "Wiping of device %s has started" : "پاک کردن دستگاه%s شروع شده است",
- "Wiping of device »%s« has started" : "پاک کردن دستگاه%s شروع شده است",
- "»%s« started remote wipe" : "%sپاک کردن از راه دور",
- "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "دستگاه یا برنامه%s فرآیند پاک کردن از راه دور را آغاز کرده است. پس از اتمام مراحل ، ایمیل دیگری دریافت خواهید کرد",
- "Wiping of device %s has finished" : "پاک کردن دستگاه %sبه پایان رسیده است",
- "Wiping of device »%s« has finished" : "پاک کردن دستگاه %sبه پایان رسیده است",
- "»%s« finished remote wipe" : "%sپاک کردن از راه دور",
- "Device or application »%s« has finished the remote wipe process." : "دستگاه یا برنامه %sفرآیند پاک کردن از راه دور را به پایان رسانده است.",
+ "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "حساب وارد شده باید یک مدیر، یک مدیر فرعی یا دارای حق دسترسی ویژه برای دسترسی به این تنظیم باشد",
+ "Your current IP address doesn't allow you to perform admin actions" : "آدرس IP فعلی شما اجازه انجام اقدامات مدیریتی را به شما نمی‌دهد",
+ "Logged in account must be an admin or sub admin" : "حساب وارد شده باید یک مدیر یا مدیر فرعی باشد",
+ "Logged in account must be an admin" : "حساب وارد شده باید یک مدیر باشد",
+ "Wiping of device %s has started" : "پاک کردن دستگاه %s آغاز شد",
+ "Wiping of device »%s« has started" : "پاک کردن دستگاه «%s» آغاز شد",
+ "»%s« started remote wipe" : "«%s» پاک کردن از راه دور را آغاز کرد",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "دستگاه یا برنامه «%s» فرآیند پاک کردن از راه دور را آغاز کرده است. پس از اتمام مراحل، ایمیل دیگری دریافت خواهید کرد.",
+ "Wiping of device %s has finished" : "پاک کردن دستگاه %s به پایان رسید",
+ "Wiping of device »%s« has finished" : "پاک کردن دستگاه «%s» به پایان رسید",
+ "»%s« finished remote wipe" : "«%s» پاک کردن از راه دور را به پایان رساند",
+ "Device or application »%s« has finished the remote wipe process." : "دستگاه یا برنامه «%s» فرآیند پاک کردن از راه دور را به پایان رسانده است.",
"Remote wipe started" : "پاک کردن از راه دور شروع شد",
- "A remote wipe was started on device %s" : "پاک کردن از راه دور روی دستگاه شروع شد%s",
+ "A remote wipe was started on device %s" : "پاک کردن از راه دور روی دستگاه %s شروع شد",
"Remote wipe finished" : "پاک کردن از راه دور به پایان رسید",
- "The remote wipe on %s has finished" : "پاک کردن از راه دور روی%s کار تمام شد",
+ "The remote wipe on %s has finished" : "پاک کردن از راه دور روی %s کار تمام شد",
"Authentication" : "احراز هویت",
"Unknown filetype" : "نوع فایل ناشناخته",
"Invalid image" : "عکس نامعتبر",
"Avatar image is not square" : "تصویر آواتار مربع نیست",
"Files" : "پوشه‌ها",
"View profile" : "مشاهدهٔ نمایه",
- "_%nh_::_%nh_" : ["%nh","%nh"],
- "Local time: %s" : "Local time: %s",
+ "same time" : "همزمان",
+ "_%nh_::_%nh_" : ["%n ساعت","%n ساعت"],
+ "_%nm_::_%nm_" : ["%n دقیقه","%n دقیقه"],
+ "%s ahead" : "%s جلوتر",
+ "%s behind" : "%s عقب‌تر",
+ "Local time: %s" : "زمان محلی: %s",
"today" : "امروز",
"tomorrow" : "فردا",
"yesterday" : "دیروز",
@@ -73,16 +83,37 @@
"in a few seconds" : "در چند ثانیه",
"seconds ago" : "ثانیه‌ها پیش",
"Empty file" : "پروندهٔ خالی",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ماژول با شناسه:%s وجود ندارد. لطفاً آن را در تنظیمات برنامه خود فعال کنید یا با سرپرست خود تماس بگیرید",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ماژول با شناسه: %s وجود ندارد. لطفاً آن را در تنظیمات برنامه خود فعال کنید یا با سرپرست خود تماس بگیرید.",
+ "No file conversion providers available" : "ارائه‌دهنده تبدیل فایل در دسترس نیست",
+ "File is too large to convert" : "فایل برای تبدیل خیلی بزرگ است",
+ "Destination does not match conversion extension" : "مقصد با پسوند تبدیل مطابقت ندارد",
+ "Could not convert file" : "فایل قابل تبدیل نبود",
+ "Destination does not exist" : "مقصد وجود ندارد",
+ "Destination is not creatable" : "مقصد قابل ایجاد نیست",
"Dot files are not allowed" : "پرونده‌های نقطه‌دار مجاز نیستند",
- "%1$s (renamed)" : "%1$s (renamed)",
- "renamed file" : "renamed file",
- "Filenames must not end with \"%1$s\"." : "Filenames must not end with \"%1$s\".",
+ "%1$s (renamed)" : "%1$s (تغییر نام داده شد)",
+ "renamed file" : "فایل تغییر نام داده شد",
+ "\"%1$s\" is a forbidden file or folder name." : "«%1$s» یک نام فایل یا پوشه ممنوع است.",
+ "\"%1$s\" is a forbidden prefix for file or folder names." : "«%1$s» یک پیشوند ممنوع برای نام فایل یا پوشه است.",
+ "\"%1$s\" is not allowed inside a file or folder name." : "«%1$s» در نام فایل یا پوشه مجاز نیست.",
+ "\"%1$s\" is a forbidden file type." : "«%1$s» یک نوع فایل ممنوع است.",
+ "Filenames must not end with \"%1$s\"." : "نام فایل‌ها نباید با «%1$s» به پایان برسند.",
+ "Invalid parent path" : "مسیر والد نامعتبر",
"File already exists" : "پرونده از پیش موجود است",
"Invalid path" : "مسیر نامعتبر",
"Failed to create file from template" : "شکست در ایجاد پرونده از قالب",
"Templates" : "قالب‌ها",
+ "Storage %s cannot be moved" : "حافظه %s قابل جابجایی نیست",
+ "Moving a share (%s) into a shared folder is not allowed" : "انتقال یک اشتراک (%s) به یک پوشه مشترک مجاز نیست",
+ "Moving a storage (%s) into a shared folder is not allowed" : "انتقال یک حافظه (%s) به یک پوشه مشترک مجاز نیست",
+ "Moving a share (%s) into another share (%s) is not allowed" : "انتقال یک اشتراک (%s) به اشتراک دیگر (%s) مجاز نیست",
+ "Moving a share (%s) into another storage (%s) is not allowed" : "انتقال یک اشتراک (%s) به حافظه دیگر (%s) مجاز نیست",
+ "Moving a storage (%s) into a share (%s) is not allowed" : "انتقال یک حافظه (%s) به یک اشتراک (%s) مجاز نیست",
+ "Moving a storage (%s) into another storage (%s) is not allowed" : "انتقال یک حافظه (%s) به حافظه دیگر (%s) مجاز نیست",
+ "Path contains invalid segments" : "مسیر شامل بخش‌های نامعتبر است",
+ "Filename is a reserved word" : "نام فایل یک کلمه رزرو شده است",
"Filename contains at least one invalid character" : "نام فایل حداقل دارای یک کاراکتر نامعتبر است",
+ "Filename is too long" : "نام فایل بیش از حد طولانی است",
"Empty filename is not allowed" : "نام فایل نمی‌تواند خالی باشد",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "کارهٔ «%s» به دلیل ناتوانی در خواندن پروندهٔ appinfo نمی‌تواند نصب شود.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "کارهٔ «%s» به دلیل سازگار نبودن با این نگارش از کارساز نمی‌تواند نصب شود.",
@@ -98,8 +129,8 @@
"Accounts" : "حساب‌ها",
"Email" : "رایانامه",
"Mail %s" : "نامه به %s",
- "Fediverse" : "Fediverse",
- "View %s on the fediverse" : "View %s on the fediverse",
+ "Fediverse" : "فدیورس",
+ "View %s on the fediverse" : "مشاهده %s در فدیورس",
"Phone" : "تلفن",
"Call %s" : "تماس با %s",
"Twitter" : "توییتر",
@@ -109,35 +140,87 @@
"Address" : "نشانی",
"Profile picture" : "تصویر نمایه",
"About" : "درباره",
- "Display name" : "Display name",
+ "Display name" : "نام نمایشی",
"Headline" : "عنوان",
"Organisation" : "سازمان",
"Role" : "نقش",
+ "Pronouns" : "ضمایر",
+ "Unknown account" : "حساب ناشناخته",
"Additional settings" : "تنظیمات اضافی",
+ "Enter the database Login and name for %s" : "نام کاربری و نام پایگاه داده را برای %s وارد کنید",
+ "Enter the database Login for %s" : "نام کاربری پایگاه داده را برای %s وارد کنید",
"Enter the database name for %s" : "ورود نام پایگاه داده برای %s",
"You cannot use dots in the database name %s" : "نمی‌توانید در در نام پایگاه دادهٔ %s از نقطه استفاده کنید",
+ "MySQL Login and/or password not valid" : "نام کاربری و/یا رمز عبور MySQL نامعتبر است",
"You need to enter details of an existing account." : "لازم است جزییات یک حساب موحود را وارد کنید.",
"Oracle connection could not be established" : "ارتباط اراکل نمیتواند برقرار باشد.",
+ "Oracle Login and/or password not valid" : "نام کاربری و/یا رمز عبور Oracle نامعتبر است",
+ "PostgreSQL Login and/or password not valid" : "نام کاربری و/یا رمز عبور PostgreSQL نامعتبر است",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk!" : "Mac OS X پشتیبانی نمی‌شود و %s روی این پلتفرم به درستی کار نخواهد کرد. با مسئولیت خودتان از آن استفاده کنید!",
"For the best results, please consider using a GNU/Linux server instead." : "برای بهترین نتیجه، استفاده از یک کارساز گنو/لینوکسی را در نظر داشته باشید.",
- "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "به نظر می رسد%s که این نمونه در یک محیط PHP 32 بیتی در حال اجرا است و open_baseir در php.ini پیکربندی شده است. این مسئله به پرونده هایی با بیش از 4 گیگ منجر می شود و بسیار دلسرد می شود",
- "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "لطفاً تنظیمات open_baseir را درون php.ini خود حذف کنید یا به PHP 64 بیتی تغییر دهید.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "به نظر می رسد %s که این نمونه در یک محیط PHP 32 بیتی در حال اجرا است و open_basedir در php.ini پیکربندی شده است. این مسئله به پرونده هایی با بیش از 4 گیگ منجر می شود و بسیار دلسرد می شود.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "لطفاً تنظیمات open_basedir را درون php.ini خود حذف کنید یا به PHP 64 بیتی تغییر دهید.",
+ "Set an admin Login." : "یک نام کاربری برای مدیر تنظیم کنید.",
"Set an admin password." : "یک رمزعبور برای مدیر تنظیم نمایید.",
- "Cannot create or write into the data directory %s" : "Cannot create or write into the data directory %s",
- "Sharing backend %s must implement the interface OCP\\Share_Backend" : "به اشتراک گذاشتن باطن باید رابط OCP \\ Share_Backend %sرا پیاده سازی کند",
- "Sharing backend %s not found" : "به اشتراک گذاشتن باطن%s یافت نشد",
- "Sharing backend for %s not found" : "به اشتراک گذاشتن باطن برای%s یافت نشد",
+ "Cannot create or write into the data directory %s" : "نمی‌توان در دایرکتوری داده %s ایجاد یا نوشت",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "بک‌اند اشتراک‌گذاری %s باید رابط OCP\\Share_Backend را پیاده‌سازی کند",
+ "Sharing backend %s not found" : "بک‌اند اشتراک‌گذاری %s یافت نشد",
+ "Sharing backend for %s not found" : "بک‌اند اشتراک‌گذاری برای %s یافت نشد",
+ "%1$s shared %2$s with you" : "%1$s %2$s را با شما به اشتراک گذاشت",
+ "Open %s" : "باز کردن %s",
"%1$s via %2$s" : "%1$s از طریق %2$s",
+ "%1$s shared %2$s with you and wants to add:" : "%1$s %2$s را با شما به اشتراک گذاشت و می‌خواهد اضافه کند:",
+ "%1$s shared %2$s with you and wants to add" : "%1$s %2$s را با شما به اشتراک گذاشت و می‌خواهد اضافه کند",
+ "%s added a note to a file shared with you" : "%s یک یادداشت به فایلی که با شما به اشتراک گذاشته شده است اضافه کرد",
+ "Passwords are enforced for link and mail shares" : "رمزهای عبور برای اشتراک‌گذاری لینک و ایمیل اجباری هستند",
+ "Share recipient is not a valid user" : "گیرنده اشتراک یک کاربر معتبر نیست",
+ "Share recipient is not a valid group" : "گیرنده اشتراک یک گروه معتبر نیست",
+ "Share recipient should be empty" : "گیرنده اشتراک باید خالی باشد",
+ "Share recipient should not be empty" : "گیرنده اشتراک نباید خالی باشد",
+ "Share recipient is not a valid circle" : "گیرنده اشتراک یک دایره معتبر نیست",
"Unknown share type" : "نوع اشتراک ناشناخته",
- "You are not allowed to share %s" : "شما مجاز به اشتراک گذاری نیستید%s",
- "Cannot increase permissions of %s" : "Cannot increase permissions of %s",
- "Files cannot be shared with delete permissions" : "Files cannot be shared with delete permissions",
- "Files cannot be shared with create permissions" : "Files cannot be shared with create permissions",
+ "Share initiator must be set" : "شروع‌کننده اشتراک باید تنظیم شود",
+ "Cannot share with yourself" : "نمی‌توانید با خودتان به اشتراک بگذارید",
+ "Shared path must be set" : "مسیر مشترک باید تنظیم شود",
+ "Shared path must be either a file or a folder" : "مسیر مشترک باید یک فایل یا یک پوشه باشد",
+ "You cannot share your root folder" : "نمی‌توانید پوشه ریشه خود را به اشتراک بگذارید",
+ "You are not allowed to share %s" : "شما مجاز به اشتراک گذاری %s نیستید",
+ "Valid permissions are required for sharing" : "مجوزهای معتبر برای اشتراک‌گذاری لازم است",
+ "File shares cannot have create or delete permissions" : "اشتراک‌گذاری فایل‌ها نمی‌تواند مجوزهای ایجاد یا حذف داشته باشد",
+ "Cannot increase permissions of %s" : "نمی‌توان مجوزهای %s را افزایش داد",
+ "Shares need at least read permissions" : "اشتراک‌گذاری‌ها حداقل به مجوزهای خواندن نیاز دارند",
+ "Files cannot be shared with delete permissions" : "فایل‌ها را نمی‌توان با مجوزهای حذف به اشتراک گذاشت",
+ "Files cannot be shared with create permissions" : "فایل‌ها را نمی‌توان با مجوزهای ایجاد به اشتراک گذاشت",
"Expiration date is in the past" : "تاریخ انقضا در گذشته است",
- "_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["Cannot set expiration date more than %n day in the future","Cannot set expiration date more than %n days in the future"],
- "Sharing is only allowed with group members" : "Sharing is only allowed with group members",
+ "Expiration date is enforced" : "تاریخ انقضا اجباری است",
+ "_Cannot set expiration date more than %n day in the future_::_Cannot set expiration date more than %n days in the future_" : ["نمی‌توان تاریخ انقضا را بیش از %n روز در آینده تنظیم کرد","نمی‌توان تاریخ انقضا را بیش از %n روز در آینده تنظیم کرد"],
+ "Sharing is only allowed with group members" : "اشتراک‌گذاری فقط با اعضای گروه مجاز است",
+ "Sharing %s failed, because this item is already shared with the account %s" : "اشتراک‌گذاری %s ناموفق بود، زیرا این مورد قبلاً با حساب %s به اشتراک گذاشته شده است",
+ "Group sharing is now allowed" : "اشتراک‌گذاری گروهی اکنون مجاز است",
+ "Sharing is only allowed within your own groups" : "اشتراک‌گذاری فقط در گروه‌های خودتان مجاز است",
+ "Path is already shared with this group" : "این مسیر قبلاً با این گروه به اشتراک گذاشته شده است",
+ "Link sharing is not allowed" : "اشتراک‌گذاری لینک مجاز نیست",
+ "Public upload is not allowed" : "بارگذاری عمومی مجاز نیست",
+ "You cannot share a folder that contains other shares" : "نمی‌توانید پوشه‌ای را به اشتراک بگذارید که حاوی اشتراک‌های دیگر است",
+ "Sharing is disabled" : "اشتراک‌گذاری غیرفعال است",
+ "Sharing is disabled for you" : "اشتراک‌گذاری برای شما غیرفعال است",
+ "Cannot share with the share owner" : "نمی‌توان با صاحب اشتراک به اشتراک گذاشت",
+ "Share does not have a full ID" : "اشتراک شناسه کامل ندارد",
+ "Cannot change share type" : "نمی‌توان نوع اشتراک را تغییر داد",
+ "Can only update recipient on user shares" : "فقط می‌توان گیرنده را در اشتراک‌های کاربر به‌روزرسانی کرد",
+ "Cannot enable sending the password by Talk with an empty password" : "نمی‌توان ارسال رمز عبور از طریق Talk را با رمز عبور خالی فعال کرد",
+ "Cannot enable sending the password by Talk without setting a new password" : "نمی‌توان ارسال رمز عبور از طریق Talk را بدون تنظیم رمز عبور جدید فعال کرد",
+ "Cannot disable sending the password by Talk without setting a new password" : "نمی‌توان ارسال رمز عبور از طریق Talk را بدون تنظیم رمز عبور جدید غیرفعال کرد",
+ "Share provider does not support accepting" : "ارائه‌دهنده اشتراک از پذیرش پشتیبانی نمی‌کند",
+ "Cannot change target of link share" : "نمی‌توان مقصد اشتراک لینک را تغییر داد",
+ "Invalid share recipient" : "گیرنده اشتراک نامعتبر است",
+ "Group \"%s\" does not exist" : "گروه «%s» وجود ندارد",
"The requested share does not exist anymore" : "سهم درخواست شده دیگر وجود ندارد",
- "The user was not created because the user limit has been reached. Check your notifications to learn more." : "The user was not created because the user limit has been reached. Check your notifications to learn more.",
+ "The requested share comes from a disabled user" : "اشتراک درخواستی از یک کاربر غیرفعال است",
+ "The user was not created because the user limit has been reached. Check your notifications to learn more." : "کاربر ایجاد نشد زیرا محدودیت کاربر به پایان رسیده است. برای اطلاعات بیشتر اعلان‌های خود را بررسی کنید.",
"Could not find category \"%s\"" : "دسته بندی %s یافت نشد",
+ "Input text" : "متن ورودی",
+ "The input text" : "متن ورودی",
"Sunday" : "یک‌شنبه",
"Monday" : "دوشنبه",
"Tuesday" : "سه‌شنبه",
@@ -184,6 +267,15 @@
"Nov." : "نو.",
"Dec." : "دس.",
"A valid password must be provided" : "رمز عبور صحیح باید وارد شود",
+ "The Login is already being used" : "نام کاربری قبلاً استفاده شده است",
+ "Could not create account" : "حساب کاربری ایجاد نشد",
+ "Only the following characters are allowed in an Login: \"a-z\", \"A-Z\", \"0-9\", spaces and \"_.@-'\"" : "فقط کاراکترهای زیر در نام کاربری مجاز هستند: \"a-z\", \"A-Z\", \"0-9\", فاصله و \"_.@-'\"",
+ "A valid Login must be provided" : "یک نام کاربری معتبر باید ارائه شود",
+ "Login contains whitespace at the beginning or at the end" : "نام کاربری حاوی فاصله در ابتدا یا انتها است",
+ "Login must not consist of dots only" : "نام کاربری نباید فقط از نقطه تشکیل شده باشد",
+ "Username is too long" : "نام کاربری بیش از حد طولانی است",
+ "Login is invalid because files already exist for this user" : "نام کاربری نامعتبر است زیرا فایل‌ها برای این کاربر از قبل وجود دارند",
+ "Account disabled" : "حساب کاربری غیرفعال است",
"Login canceled by app" : "ورود به دست کاره لغو شد",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "کارهٔ «%1$s» نمی‌تواند نصب شود؛ چرا که وابستگی زیر تأمین نشده: %2$s",
"a safe home for all your data" : "خانه‌ای امن برای تمامی داده‌هایتان",
@@ -191,60 +283,173 @@
"Authentication error" : "خطا در اعتبار سنجی",
"Token expired. Please reload page." : "Token منقضی شده است. لطفا دوباره صفحه را بارگذاری نمایید.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "هیچ درایور پایگاه داده (sqlite ، mysql یا postgresql) نصب نشده است.",
- "Cannot write into \"config\" directory." : "Cannot write into \"config\" directory.",
- "This can usually be fixed by giving the web server write access to the config directory. See %s" : "This can usually be fixed by giving the web server write access to the config directory. See %s",
- "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "یا اگر ترجیح می دهید پرونده config.php را فقط بخوانید ، گزینه \"config_is_read_only\" را در آن تنظیم کنید. دیدن%s",
- "Cannot write into \"apps\" directory." : "Cannot write into \"apps\" directory.",
- "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file.",
- "Cannot create \"data\" directory." : "Cannot create \"data\" directory.",
- "This can usually be fixed by giving the web server write access to the root directory. See %s" : "This can usually be fixed by giving the web server write access to the root directory. See %s",
- "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "Permissions can usually be fixed by giving the web server write access to the root directory. See %s.",
- "Your data directory is not writable." : "Your data directory is not writable.",
- "Setting locale to %s failed." : "Setting locale to %s failed.",
- "Please install one of these locales on your system and restart your web server." : "Please install one of these locales on your system and restart your web server.",
+ "Cannot write into \"config\" directory." : "نمی‌توان در دایرکتوری «config» نوشت.",
+ "This can usually be fixed by giving the web server write access to the config directory. See %s" : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری پیکربندی قابل رفع است. مشاهده %s",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "یا اگر ترجیح می‌دهید فایل config.php فقط خواندنی باشد، گزینه \"config_is_read_only\" را در آن به true تنظیم کنید. مشاهده %s",
+ "Cannot write into \"apps\" directory." : "نمی‌توان در دایرکتوری «apps» نوشت.",
+ "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری برنامه‌ها یا غیرفعال کردن فروشگاه برنامه در فایل پیکربندی قابل رفع است.",
+ "Cannot create \"data\" directory." : "نمی‌توان دایرکتوری «data» را ایجاد کرد.",
+ "This can usually be fixed by giving the web server write access to the root directory. See %s" : "این مشکل معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری ریشه قابل رفع است. مشاهده %s",
+ "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "مجوزها معمولاً با دادن دسترسی نوشتن به وب‌سرور در دایرکتوری ریشه قابل رفع هستند. مشاهده %s.",
+ "Your data directory is not writable." : "دایرکتوری داده شما قابل نوشتن نیست.",
+ "Setting locale to %s failed." : "تنظیم محلی به %s ناموفق بود.",
+ "Please install one of these locales on your system and restart your web server." : "لطفاً یکی از این محلی‌ها را روی سیستم خود نصب کرده و وب‌سرور خود را مجدداً راه‌اندازی کنید.",
"PHP module %s not installed." : "ماژول PHP %s نصب نشده است.",
"Please ask your server administrator to install the module." : "لطفا از مدیر سیستم بخواهید تا ماژول را نصب کند.",
- "PHP setting \"%s\" is not set to \"%s\"." : "تنظیمات PHP%s تنظیم نشده است%s",
+ "PHP setting \"%s\" is not set to \"%s\"." : "تنظیمات PHP «%s» روی «%s» تنظیم نشده است.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "تنظیم این تنظیمات در php.ini باعث می شود Nextcloud دوباره اجرا شود",
- "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>.",
- "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini.",
- "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ظاهراً برای خنثی کردن بلوک های اسناد درون خطی تنظیم شده است. این کار چندین برنامه اصلی را غیرقابل دسترسی خواهد کرد.",
- "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "این احتمالاً توسط حافظه پنهان / کش مانند Zend OPcache یا eAccelerator ایجاد شده است.",
- "PHP modules have been installed, but they are still listed as missing?" : "ماژول های پی اچ پی نصب شده اند ، اما هنوز هم به عنوان مفقود شده ذکر شده اند؟",
- "Please ask your server administrator to restart the web server." : "لطفاً از سرور سرور خود بخواهید که وب سرور را مجدداً راه اندازی کند.",
- "The required %s config variable is not configured in the config.php file." : "The required %s config variable is not configured in the config.php file.",
- "Please ask your server administrator to check the Nextcloud configuration." : "Please ask your server administrator to check the Nextcloud configuration.",
- "Your data directory must be an absolute path." : "Your data directory must be an absolute path.",
- "Check the value of \"datadirectory\" in your configuration." : "Check the value of \"datadirectory\" in your configuration.",
- "Your data directory is invalid." : "Your data directory is invalid.",
- "Action \"%s\" not supported or implemented." : "عملی%s پشتیبانی یا اجرا نشده است.",
- "Authentication failed, wrong token or provider ID given" : "تأیید اعتبار انجام نشد ، نشانه اشتباه یا شناسه ارائه دهنده داده شد",
- "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "پارامترهای موجود برای تکمیل درخواست. پارامترهای موجود نیست%s",
- "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "شناسه%1$s قبلاً توسط ارائه دهنده فدراسیون ابر استفاده شده است%2$s",
- "Cloud Federation Provider with ID: \"%s\" does not exist." : "ارائه دهنده فدراسیون Cloud با شناسه:%s وجود ندارد.",
- "Could not obtain lock type %d on \"%s\"." : "نمی توان نوع%d قفل را به دست آورد%s",
- "Storage unauthorized. %s" : "ذخیره سازی غیر مجاز.%s",
- "Storage incomplete configuration. %s" : "پیکربندی ناقص ذخیره سازی.%s<br>",
- "Storage connection error. %s" : "خطای اتصال ذخیره سازی%s",
- "Storage is temporarily not available" : "ذخیره سازی به طور موقت در دسترس نیست",
- "Storage connection timeout. %s" : "مدت زمان اتصال ذخیره سازی%s",
- "Confirmation" : "Confirmation",
- "Prompt" : "Prompt",
- "Chat" : "Chat",
- "Generates a possible headline for a text." : "Generates a possible headline for a text.",
+ "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code> به جای مقدار مورد انتظار <code>0</code> روی <code>%s</code> تنظیم شده است.",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "برای رفع این مشکل، <code>mbstring.func_overload</code> را در php.ini خود روی <code>0</code> تنظیم کنید.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ظاهراً برای حذف بلوک‌های مستندات درون‌خطی تنظیم شده است. این کار چندین برنامه اصلی را غیرقابل دسترس خواهد کرد.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "این احتمالاً توسط حافظه پنهان/شتاب‌دهنده‌ای مانند Zend OPcache یا eAccelerator ایجاد شده است.",
+ "PHP modules have been installed, but they are still listed as missing?" : "ماژول‌های PHP نصب شده‌اند، اما همچنان به عنوان گم‌شده لیست شده‌اند؟",
+ "Please ask your server administrator to restart the web server." : "لطفاً از مدیر سرور خود بخواهید که وب‌سرور را مجدداً راه‌اندازی کند.",
+ "The required %s config variable is not configured in the config.php file." : "متغیر پیکربندی مورد نیاز %s در فایل config.php پیکربندی نشده است.",
+ "Please ask your server administrator to check the Nextcloud configuration." : "لطفاً از مدیر سرور خود بخواهید پیکربندی Nextcloud را بررسی کند.",
+ "Your data directory is readable by other people." : "دایرکتوری داده شما برای دیگران قابل خواندن است.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other people." : "لطفاً مجوزها را به 0770 تغییر دهید تا دایرکتوری توسط افراد دیگر قابل فهرست شدن نباشد.",
+ "Your data directory must be an absolute path." : "دایرکتوری داده شما باید یک مسیر مطلق باشد.",
+ "Check the value of \"datadirectory\" in your configuration." : "مقدار \"datadirectory\" را در پیکربندی خود بررسی کنید.",
+ "Your data directory is invalid." : "دایرکتوری داده شما نامعتبر است.",
+ "Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "اطمینان حاصل کنید که فایلی به نام «%1$s» در ریشه دایرکتوری داده وجود دارد. این فایل باید حاوی: «%2$s» باشد",
+ "Action \"%s\" not supported or implemented." : "عملیات «%s» پشتیبانی یا اجرا نشده است.",
+ "Authentication failed, wrong token or provider ID given" : "تأیید اعتبار انجام نشد، نشانه اشتباه یا شناسه ارائه دهنده داده شد",
+ "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "پارامترهای مورد نیاز برای تکمیل درخواست وجود ندارند. پارامترهای از دست رفته: «%s»",
+ "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "شناسه «%1$s» قبلاً توسط ارائه‌دهنده فدراسیون ابری «%2$s» استفاده شده است",
+ "Cloud Federation Provider with ID: \"%s\" does not exist." : "ارائه‌دهنده فدراسیون ابری با شناسه: «%s» وجود ندارد.",
+ "Could not obtain lock type %d on \"%s\"." : "نمی‌توان قفل از نوع %d را روی «%s» به دست آورد.",
+ "Storage unauthorized. %s" : "دسترسی به حافظه غیرمجاز است. %s",
+ "Storage incomplete configuration. %s" : "پیکربندی حافظه ناقص است. %s",
+ "Storage connection error. %s" : "خطای اتصال حافظه. %s",
+ "Storage is temporarily not available" : "حافظه به طور موقت در دسترس نیست",
+ "Storage connection timeout. %s" : "مهلت اتصال حافظه به پایان رسید. %s",
+ "To allow this check to run you have to make sure that your Web server can connect to itself. Therefore it must be able to resolve and connect to at least one of its `trusted_domains` or the `overwrite.cli.url`. This failure may be the result of a server-side DNS mismatch or outbound firewall rule." : "برای اجرای این بررسی، باید مطمئن شوید که وب‌سرور شما می‌تواند به خودش متصل شود. بنابراین باید بتواند حداقل یکی از `trusted_domains` یا `overwrite.cli.url` خود را حل و به آن متصل شود. این خطا ممکن است نتیجه عدم تطابق DNS سمت سرور یا قانون فایروال خروجی باشد.",
+ "Transcribe audio" : "رونوشت صوتی",
+ "Transcribe the things said in an audio" : "رونوشت چیزهای گفته شده در یک فایل صوتی",
+ "Audio input" : "ورودی صوتی",
+ "The audio to transcribe" : "فایل صوتی برای رونوشت",
+ "Transcription" : "رونوشت",
+ "The transcribed text" : "متن رونوشت شده",
+ "Chat with an agent" : "چت با یک عامل",
+ "Chat message" : "پیام چت",
+ "A chat message to send to the agent." : "یک پیام چت برای ارسال به عامل.",
+ "Confirmation" : "تأیید",
+ "Whether to confirm previously requested actions: 0 for denial and 1 for confirmation." : "آیا اقدامات قبلاً درخواست شده را تأیید کنید: 0 برای رد و 1 برای تأیید.",
+ "Conversation token" : "توکن مکالمه",
+ "A token representing the conversation." : "یک توکن نماینده مکالمه.",
+ "Generated response" : "پاسخ تولید شده",
+ "The response from the chat model." : "پاسخ از مدل چت.",
+ "The new conversation token" : "توکن مکالمه جدید",
+ "Send this along with the next interaction." : "این را همراه با تعامل بعدی ارسال کنید.",
+ "Requested actions by the agent" : "اقدامات درخواستی توسط عامل",
+ "Actions that the agent would like to carry out in JSON format." : "اقدامات که عامل مایل به انجام آنها در قالب JSON است.",
+ "Context write" : "نوشتن متنی",
+ "Writes text in a given style based on the provided source material." : "متن را با سبکی مشخص بر اساس محتوای منبع ارائه شده می‌نویسد.",
+ "Writing style" : "سبک نگارش",
+ "Demonstrate a writing style that you would like to immitate" : "یک سبک نگارش را که می‌خواهید تقلید کنید، نشان دهید",
+ "Source material" : "محتوای منبع",
+ "The content that would like to be rewritten in the new writing style" : "محتوایی که می‌خواهید با سبک نگارش جدید بازنویسی شود",
+ "Generated text" : "متن تولید شده",
+ "The generated text with content from the source material in the given style" : "متن تولید شده با محتوای منبع در سبک مشخص شده",
+ "Emoji generator" : "تولیدکننده اموجی",
+ "Takes text and generates a representative emoji for it." : "متن را دریافت کرده و یک اموجی مناسب برای آن تولید می‌کند.",
+ "The text to generate an emoji for" : "متنی که می‌خواهید برای آن اموجی تولید شود",
+ "Generated emoji" : "اموجی تولید شده",
+ "The generated emoji based on the input text" : "اموجی تولید شده بر اساس متن ورودی",
+ "Generate image" : "تولید تصویر",
+ "Generate an image from a text prompt" : "تولید تصویر از یک متن ورودی",
+ "Prompt" : "درخواست",
+ "Describe the image you want to generate" : "تصویری که می‌خواهید تولید شود را توصیف کنید",
+ "Number of images" : "تعداد تصاویر",
+ "How many images to generate" : "چه تعداد تصویر تولید شود",
+ "Output images" : "تصاویر خروجی",
+ "The generated images" : "تصاویر تولید شده",
+ "Generate speech" : "تولید گفتار",
+ "Generate speech from a transcript" : "تولید گفتار از یک رونوشت",
+ "Write transcript that you want the assistant to generate speech from" : "رونوشتی را بنویسید که می‌خواهید دستیار از آن گفتار تولید کند",
+ "Output speech" : "گفتار خروجی",
+ "The generated speech" : "گفتار تولید شده",
+ "Free text to text prompt" : "درخواست متن به متن آزاد",
+ "Runs an arbitrary prompt through a language model that returns a reply" : "یک درخواست دلخواه را از طریق یک مدل زبانی اجرا می‌کند که پاسخی را برمی‌گرداند",
+ "Describe a task that you want the assistant to do or ask a question" : "وظیفه‌ای که می‌خواهید دستیار انجام دهد را توصیف کنید یا سؤالی بپرسید",
+ "Generated reply" : "پاسخ تولید شده",
+ "The generated text from the assistant" : "متن تولید شده توسط دستیار",
+ "Change Tone" : "تغییر لحن",
+ "Change the tone of a piece of text." : "لحن یک قطعه متن را تغییر دهید.",
+ "Write a text that you want the assistant to rewrite in another tone." : "متنی را بنویسید که می‌خواهید دستیار آن را با لحن دیگری بازنویسی کند.",
+ "Desired tone" : "لحن مورد نظر",
+ "In which tone should your text be rewritten?" : "متن شما با چه لحنی بازنویسی شود؟",
+ "The rewritten text in the desired tone, written by the assistant:" : "متن بازنویسی شده با لحن مورد نظر، نوشته شده توسط دستیار:",
+ "Chat" : "چت",
+ "Chat with the assistant" : "چت با دستیار",
+ "System prompt" : "درخواست سیستمی",
+ "Define rules and assumptions that the assistant should follow during the conversation." : "قوانین و فرضیاتی را که دستیار باید در طول مکالمه رعایت کند، تعریف کنید.",
+ "Chat history" : "تاریخچه چت",
+ "The history of chat messages before the current message, starting with a message by the user" : "تاریخچه پیام‌های چت قبل از پیام فعلی، با شروع از یک پیام توسط کاربر",
+ "Response message" : "پیام پاسخ",
+ "The generated response as part of the conversation" : "پاسخ تولید شده به عنوان بخشی از مکالمه",
+ "Chat with tools" : "چت با ابزارها",
+ "Chat with the language model with tool calling support." : "چت با مدل زبانی با پشتیبانی از فراخوانی ابزار.",
+ "Tool message" : "پیام ابزار",
+ "The result of tool calls in the last interaction" : "نتیجه فراخوانی ابزارها در تعامل قبلی",
+ "Available tools" : "ابزارهای موجود",
+ "The available tools in JSON format" : "ابزارهای موجود در قالب JSON",
+ "The response from the chat model" : "پاسخ از مدل چت",
+ "Tool calls" : "فراخوانی ابزار",
+ "Tools call instructions from the model in JSON format" : "دستورالعمل‌های فراخوانی ابزار از مدل در قالب JSON",
+ "Formalize text" : "رسمی کردن متن",
+ "Takes a text and makes it sound more formal" : "یک متن را دریافت کرده و آن را رسمی‌تر می‌کند",
+ "Write a text that you want the assistant to formalize" : "متنی را بنویسید که می‌خواهید دستیار آن را رسمی کند",
+ "Formalized text" : "متن رسمی شده",
+ "The formalized text" : "متن رسمی شده",
+ "Generate a headline" : "تولید یک عنوان",
+ "Generates a possible headline for a text." : "یک عنوان احتمالی برای یک متن تولید می‌کند.",
+ "Original text" : "متن اصلی",
+ "The original text to generate a headline for" : "متن اصلی برای تولید عنوان",
+ "The generated headline" : "عنوان تولید شده",
+ "Proofread" : "ویرایش",
+ "Proofreads a text and lists corrections" : "یک متن را ویرایش کرده و اصلاحات را لیست می‌کند",
"Text" : "متن",
- "Summarize" : "Summarize",
+ "The text to proofread" : "متن برای ویرایش",
+ "Corrections" : "اصلاحات",
+ "The corrections that should be made in your text" : "اصلاحاتی که باید در متن شما انجام شود",
+ "Reformulate text" : "بازنویسی متن",
+ "Takes a text and reformulates it" : "یک متن را دریافت کرده و آن را بازنویسی می‌کند",
+ "Write a text that you want the assistant to reformulate" : "متنی را بنویسید که می‌خواهید دستیار آن را بازنویسی کند",
+ "Reformulated text" : "متن بازنویسی شده",
+ "The reformulated text, written by the assistant" : "متن بازنویسی شده، نوشته شده توسط دستیار",
+ "Simplify text" : "ساده‌سازی متن",
+ "Takes a text and simplifies it" : "یک متن را دریافت کرده و آن را ساده می‌کند",
+ "Write a text that you want the assistant to simplify" : "متنی را بنویسید که می‌خواهید دستیار آن را ساده کند",
+ "Simplified text" : "متن ساده شده",
+ "The simplified text" : "متن ساده شده",
+ "Summarize" : "خلاصه‌سازی",
+ "Summarizes a text" : "یک متن را خلاصه‌سازی می‌کند",
+ "The original text to summarize" : "متن اصلی برای خلاصه‌سازی",
"Summary" : "چکیده",
- "Extract topics" : "Extract topics",
+ "The generated summary" : "خلاصه تولید شده",
+ "Extract topics" : "استخراج موضوعات",
+ "Extracts topics from a text and outputs them separated by commas" : "موضوعات را از یک متن استخراج کرده و با کاما جدا شده خروجی می‌دهد",
+ "The original text to extract topics from" : "متن اصلی برای استخراج موضوعات",
+ "Topics" : "موضوعات",
+ "The list of extracted topics" : "لیست موضوعات استخراج شده",
"Translate" : "ترجمه",
- "Target language" : "Target language",
- "Result" : "شروع به اسکنیک",
- "Free prompt" : "Free prompt",
- "Runs an arbitrary prompt through the language model." : "Runs an arbitrary prompt through the language model.",
- "Generate headline" : "Generate headline",
- "Summarizes text by reducing its length without losing key information." : "Summarizes text by reducing its length without losing key information.",
- "Extracts topics from a text and outputs them separated by commas." : "Extracts topics from a text and outputs them separated by commas.",
+ "Translate text from one language to another" : "ترجمه متن از یک زبان به زبان دیگر",
+ "Origin text" : "متن مبدأ",
+ "The text to translate" : "متن برای ترجمه",
+ "Origin language" : "زبان مبدأ",
+ "The language of the origin text" : "زبان متن مبدأ",
+ "Target language" : "زبان مقصد",
+ "The desired language to translate the origin text in" : "زبان مورد نظر برای ترجمه متن مبدأ",
+ "Result" : "نتیجه",
+ "The translated text" : "متن ترجمه شده",
+ "Free prompt" : "درخواست آزاد",
+ "Runs an arbitrary prompt through the language model." : "یک درخواست دلخواه را از طریق مدل زبانی اجرا می‌کند.",
+ "Generate headline" : "تولید عنوان",
+ "Summarizes text by reducing its length without losing key information." : "متن را با کاهش طول آن و بدون از دست دادن اطلاعات کلیدی، خلاصه‌سازی می‌کند.",
+ "Extracts topics from a text and outputs them separated by commas." : "موضوعات را از یک متن استخراج کرده و با کاما جدا شده خروجی می‌دهد.",
"File is currently busy, please try again later" : "فایل در حال حاضر مشغول است، لطفا مجددا تلاش کنید",
- "Cannot download file" : "نمی‌توان پرونده را بارگرفت"
+ "Cannot download file" : "نمی‌توان پرونده را بارگرفت",
+ "Login is too long" : "نام کاربری بیش از حد طولانی است"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js
index 593c9c3465d..fdabc59a9e1 100644
--- a/lib/l10n/fi.js
+++ b/lib/l10n/fi.js
@@ -67,6 +67,7 @@ OC.L10N.register(
"seconds ago" : "sekunteja sitten",
"Empty file" : "Tyhjä tiedosto",
"Dot files are not allowed" : "Pistetiedostot eivät ole sallittuja",
+ "%1$s (renamed)" : "%1$s (nimetty uudelleen)",
"File already exists" : "Tiedosto on jo olemassa",
"Invalid path" : "Virheellinen polku",
"Failed to create file from template" : "Tiedoston luominen mallipohjasta epäonnistui",
diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json
index e938dc41405..a2b35c13827 100644
--- a/lib/l10n/fi.json
+++ b/lib/l10n/fi.json
@@ -65,6 +65,7 @@
"seconds ago" : "sekunteja sitten",
"Empty file" : "Tyhjä tiedosto",
"Dot files are not allowed" : "Pistetiedostot eivät ole sallittuja",
+ "%1$s (renamed)" : "%1$s (nimetty uudelleen)",
"File already exists" : "Tiedosto on jo olemassa",
"Invalid path" : "Virheellinen polku",
"Failed to create file from template" : "Tiedoston luominen mallipohjasta epäonnistui",
diff --git a/lib/l10n/ga.js b/lib/l10n/ga.js
index a2d3355d7b1..481a89b9f06 100644
--- a/lib/l10n/ga.js
+++ b/lib/l10n/ga.js
@@ -275,6 +275,7 @@ OC.L10N.register(
"A valid Login must be provided" : "Ní mór Logáil Isteach bailí a sholáthar",
"Login contains whitespace at the beginning or at the end" : "Tá spás bán sa logáil isteach ag an tús nó ag an deireadh",
"Login must not consist of dots only" : "Níor cheart go gcuimseodh logáil isteach poncanna amháin",
+ "Username is too long" : "Tá an t-ainm úsáideora rófhada",
"Login is invalid because files already exist for this user" : "Tá logáil isteach neamhbhailí toisc go bhfuil comhaid ann cheana don úsáideoir seo",
"Account disabled" : "Díchumasaíodh an cuntas",
"Login canceled by app" : "Cealaíodh logáil isteach ag an aip",
diff --git a/lib/l10n/ga.json b/lib/l10n/ga.json
index 82357708353..669754526c2 100644
--- a/lib/l10n/ga.json
+++ b/lib/l10n/ga.json
@@ -273,6 +273,7 @@
"A valid Login must be provided" : "Ní mór Logáil Isteach bailí a sholáthar",
"Login contains whitespace at the beginning or at the end" : "Tá spás bán sa logáil isteach ag an tús nó ag an deireadh",
"Login must not consist of dots only" : "Níor cheart go gcuimseodh logáil isteach poncanna amháin",
+ "Username is too long" : "Tá an t-ainm úsáideora rófhada",
"Login is invalid because files already exist for this user" : "Tá logáil isteach neamhbhailí toisc go bhfuil comhaid ann cheana don úsáideoir seo",
"Account disabled" : "Díchumasaíodh an cuntas",
"Login canceled by app" : "Cealaíodh logáil isteach ag an aip",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 1fa28c281be..4cd51ae9b80 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -325,6 +325,11 @@ OC.L10N.register(
"Describe a task that you want the assistant to do or ask a question" : "Опишите задачу, которую вы хотите поручить ассистенту, или задайте вопрос",
"Generated reply" : "Сгенерированный ответ",
"The generated text from the assistant" : "Сгенерированный текст от помощника",
+ "Change Tone" : "Сменить тон",
+ "Write a text that you want the assistant to rewrite in another tone." : "Напишите текст, чтобы ассистент переписал его в другом тоне.",
+ "Desired tone" : "Желаемый тон",
+ "In which tone should your text be rewritten?" : "В каком тоне следует переписать ваш текст?",
+ "The rewritten text in the desired tone, written by the assistant:" : "Переписанный текст в нужном тоне, написанный ассистентом:",
"Chat" : "Разговор",
"Chat with the assistant" : "Пообщайтесь с ассистентом",
"System prompt" : "Системная подсказка",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index 3266d0f6088..4842de706a2 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -323,6 +323,11 @@
"Describe a task that you want the assistant to do or ask a question" : "Опишите задачу, которую вы хотите поручить ассистенту, или задайте вопрос",
"Generated reply" : "Сгенерированный ответ",
"The generated text from the assistant" : "Сгенерированный текст от помощника",
+ "Change Tone" : "Сменить тон",
+ "Write a text that you want the assistant to rewrite in another tone." : "Напишите текст, чтобы ассистент переписал его в другом тоне.",
+ "Desired tone" : "Желаемый тон",
+ "In which tone should your text be rewritten?" : "В каком тоне следует переписать ваш текст?",
+ "The rewritten text in the desired tone, written by the assistant:" : "Переписанный текст в нужном тоне, написанный ассистентом:",
"Chat" : "Разговор",
"Chat with the assistant" : "Пообщайтесь с ассистентом",
"System prompt" : "Системная подсказка",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index 05ea0d25177..17fb3a949f2 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -85,7 +85,7 @@ OC.L10N.register(
"in a few seconds" : "bir kaç saniye içinde",
"seconds ago" : "saniyeler önce",
"Empty file" : "Dosya boş",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kimlikli modül bulunamadı. Lütfen uygulamalarınız içinden modülü kullanıma alın ya da BT yöneticiniz ile görüşün.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kimlikli modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da BT yöneticiniz ile görüşün.",
"No file conversion providers available" : "Kullanılabilecek bir dosya dönüştürücü hizmeti sağlayıcı yok",
"File is too large to convert" : "Dosya dönüştürülmek için çok büyük",
"Destination does not match conversion extension" : "Hedef dönüştürme eklentisiyle eşleşmiyor",
@@ -147,10 +147,10 @@ OC.L10N.register(
"Pronouns" : "Hitaplar",
"Unknown account" : "Hesap bilinmiyor",
"Additional settings" : "Ek ayarlar",
- "Enter the database Login and name for %s" : "%s için veri tabanı adını ve kullanıcı adını yazın",
- "Enter the database Login for %s" : "%s için veri tabanı kullanıcı adını yazın",
- "Enter the database name for %s" : "%s için veri tabanı adını yazın",
- "You cannot use dots in the database name %s" : "%s veri tabanı adında nokta kullanamazsınız",
+ "Enter the database Login and name for %s" : "%s için veritabanı adını ve kullanıcı adını yazın",
+ "Enter the database Login for %s" : "%s için veritabanı kullanıcı adını yazın",
+ "Enter the database name for %s" : "%s için veritabanı adını yazın",
+ "You cannot use dots in the database name %s" : "%s veritabanı adında nokta kullanamazsınız",
"MySQL Login and/or password not valid" : "MySQL kullanıcı adı ve/veya parolası geçersiz",
"You need to enter details of an existing account." : "Var olan bir hesabın bilgilerini yazmalısınız.",
"Oracle connection could not be established" : "Oracle ile bağlantı kurulamadı",
@@ -202,21 +202,21 @@ OC.L10N.register(
"Link sharing is not allowed" : "Bağlantı paylaşımına izin verilmiyor",
"Public upload is not allowed" : "Herkese açık yüklemeye izin verilmiyor",
"You cannot share a folder that contains other shares" : "Başka paylaşımların bulunduğu bir klasörü paylaşamazsınız",
- "Sharing is disabled" : "Paylaşım kullanımdan kaldırılmış",
- "Sharing is disabled for you" : "Paylaşım sizin için kullanımdan kaldırılmış",
+ "Sharing is disabled" : "Paylaşım devre dışı bırakılmış",
+ "Sharing is disabled for you" : "Paylaşım sizin için devre dışı bırakılmış",
"Cannot share with the share owner" : "Paylaşımı sahibi ile paylaşamazsınız",
"Share does not have a full ID" : "Paylaşımın tam kimliği yok",
"Cannot change share type" : "Paylaşım türü değiştirilemez",
"Can only update recipient on user shares" : "Yalnızca kullanıcı paylaşımlarındaki alıcıyı güncelleyebilir",
- "Cannot enable sending the password by Talk with an empty password" : "Boş bir parola ile Sohbet uygulaması ile parola gönderme özelliği kullanıma alınamaz",
- "Cannot enable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme özelliği kullanıma alınamaz",
- "Cannot disable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme kullanımdan kaldırılamaz",
+ "Cannot enable sending the password by Talk with an empty password" : "Boş bir parola ile Talk uygulaması ile parola gönderme özelliği etkinleştirilemez",
+ "Cannot enable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Talk uygulaması ile parola gönderme özelliği etkinleştirilemez",
+ "Cannot disable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme devre dışı bırakılamaz",
"Share provider does not support accepting" : "Paylaşım hizmeti sağlayıcısı kabul etmeyi desteklemiyor",
"Cannot change target of link share" : "Bağlantı paylaşımının hedefi değiştirilemedi",
"Invalid share recipient" : "Paylaşım alıcısı geçersiz",
"Group \"%s\" does not exist" : "\"%s\" grubu bulunamadı",
"The requested share does not exist anymore" : "Erişilmek istenilen paylaşım artık yok",
- "The requested share comes from a disabled user" : "Erişilmek istenilen paylaşım kullanımdan kaldırılmış bir kullanıcıdan geliyor",
+ "The requested share comes from a disabled user" : "Erişilmek istenilen paylaşım devre dışı bırakılmış bir kullanıcıdan geliyor",
"The user was not created because the user limit has been reached. Check your notifications to learn more." : "Kullanıcı sayısı sınırına ulaşıldığından kullanıcı eklenemedi. Ayrıntılı bilgi almak için bildirimlerinize bakın.",
"Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı",
"Input text" : "Giriş metni",
@@ -274,19 +274,19 @@ OC.L10N.register(
"Login contains whitespace at the beginning or at the end" : "Kullanıcı adının başında ya da sonunda boşluk var",
"Login must not consist of dots only" : "Kullanıcı adı yalnızca noktalardan oluşamaz",
"Login is invalid because files already exist for this user" : "Kullanıcı adı geçersiz, bu kullanıcı için zaten bazı dosyalar var",
- "Account disabled" : "Hesap kullanımdan kaldırılmış",
+ "Account disabled" : "Hesap devre dışı bırakılmış",
"Login canceled by app" : "Oturum açma uygulama tarafından iptal edildi",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" uygulaması, şu gereklilikler sağlanmadığı için kurulamıyor: %2$s",
"a safe home for all your data" : "verileriniz için güvenli bir barınak",
- "Application is not enabled" : "Uygulama kullanıma alınmamış",
+ "Application is not enabled" : "Uygulama etkin değil",
"Authentication error" : "Kimlik doğrulama sorunu",
"Token expired. Please reload page." : "Kodun geçerlilik süresi dolmuş. Lütfen sayfayı yenileyin.",
- "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veri tabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veritabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.",
"Cannot write into \"config\" directory." : "\"config\" klasörüne yazılamadı.",
"This can usually be fixed by giving the web server write access to the config directory. See %s" : "Bu sorun genellikle, site sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Ya da config.php dosyasının salt okunur olarak kalmasını istiyorsanız içindeki \"config_is_read_only\" seçeneğini true olarak ayarlayın. %s bölümüne bakabilirsiniz",
"Cannot write into \"apps\" directory." : "\"apps\" klasörüne yazılamadı.",
- "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Bu sorun genellikle, site sunucusuna apps klasörüne yazma izni verilerek ya da yapılandırma dosyasından uygulama mağazası kullanımdan kaldırılarak çözülebilir.",
+ "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Bu sorun genellikle, site sunucusuna apps klasörüne yazma izni verilerek ya da yapılandırma dosyasından uygulama mağazası devre dışı bırakılarak çözülebilir.",
"Cannot create \"data\" directory." : "\"data\" klasörü oluşturulamadı",
"This can usually be fixed by giving the web server write access to the root directory. See %s" : "Bu sorun genellikle, site sunucusuna kök klasöre yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "İzinler genellikle, site sunucusuna kök klasöre yazma izni verilerek düzeltilebilir. %s bölümüne bakın.",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 9b8aa8cfeac..a548f3300cb 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -83,7 +83,7 @@
"in a few seconds" : "bir kaç saniye içinde",
"seconds ago" : "saniyeler önce",
"Empty file" : "Dosya boş",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kimlikli modül bulunamadı. Lütfen uygulamalarınız içinden modülü kullanıma alın ya da BT yöneticiniz ile görüşün.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kimlikli modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da BT yöneticiniz ile görüşün.",
"No file conversion providers available" : "Kullanılabilecek bir dosya dönüştürücü hizmeti sağlayıcı yok",
"File is too large to convert" : "Dosya dönüştürülmek için çok büyük",
"Destination does not match conversion extension" : "Hedef dönüştürme eklentisiyle eşleşmiyor",
@@ -145,10 +145,10 @@
"Pronouns" : "Hitaplar",
"Unknown account" : "Hesap bilinmiyor",
"Additional settings" : "Ek ayarlar",
- "Enter the database Login and name for %s" : "%s için veri tabanı adını ve kullanıcı adını yazın",
- "Enter the database Login for %s" : "%s için veri tabanı kullanıcı adını yazın",
- "Enter the database name for %s" : "%s için veri tabanı adını yazın",
- "You cannot use dots in the database name %s" : "%s veri tabanı adında nokta kullanamazsınız",
+ "Enter the database Login and name for %s" : "%s için veritabanı adını ve kullanıcı adını yazın",
+ "Enter the database Login for %s" : "%s için veritabanı kullanıcı adını yazın",
+ "Enter the database name for %s" : "%s için veritabanı adını yazın",
+ "You cannot use dots in the database name %s" : "%s veritabanı adında nokta kullanamazsınız",
"MySQL Login and/or password not valid" : "MySQL kullanıcı adı ve/veya parolası geçersiz",
"You need to enter details of an existing account." : "Var olan bir hesabın bilgilerini yazmalısınız.",
"Oracle connection could not be established" : "Oracle ile bağlantı kurulamadı",
@@ -200,21 +200,21 @@
"Link sharing is not allowed" : "Bağlantı paylaşımına izin verilmiyor",
"Public upload is not allowed" : "Herkese açık yüklemeye izin verilmiyor",
"You cannot share a folder that contains other shares" : "Başka paylaşımların bulunduğu bir klasörü paylaşamazsınız",
- "Sharing is disabled" : "Paylaşım kullanımdan kaldırılmış",
- "Sharing is disabled for you" : "Paylaşım sizin için kullanımdan kaldırılmış",
+ "Sharing is disabled" : "Paylaşım devre dışı bırakılmış",
+ "Sharing is disabled for you" : "Paylaşım sizin için devre dışı bırakılmış",
"Cannot share with the share owner" : "Paylaşımı sahibi ile paylaşamazsınız",
"Share does not have a full ID" : "Paylaşımın tam kimliği yok",
"Cannot change share type" : "Paylaşım türü değiştirilemez",
"Can only update recipient on user shares" : "Yalnızca kullanıcı paylaşımlarındaki alıcıyı güncelleyebilir",
- "Cannot enable sending the password by Talk with an empty password" : "Boş bir parola ile Sohbet uygulaması ile parola gönderme özelliği kullanıma alınamaz",
- "Cannot enable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme özelliği kullanıma alınamaz",
- "Cannot disable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme kullanımdan kaldırılamaz",
+ "Cannot enable sending the password by Talk with an empty password" : "Boş bir parola ile Talk uygulaması ile parola gönderme özelliği etkinleştirilemez",
+ "Cannot enable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Talk uygulaması ile parola gönderme özelliği etkinleştirilemez",
+ "Cannot disable sending the password by Talk without setting a new password" : "Yeni bir parola ayarlanmadan Sohbet uygulaması ile parola gönderme devre dışı bırakılamaz",
"Share provider does not support accepting" : "Paylaşım hizmeti sağlayıcısı kabul etmeyi desteklemiyor",
"Cannot change target of link share" : "Bağlantı paylaşımının hedefi değiştirilemedi",
"Invalid share recipient" : "Paylaşım alıcısı geçersiz",
"Group \"%s\" does not exist" : "\"%s\" grubu bulunamadı",
"The requested share does not exist anymore" : "Erişilmek istenilen paylaşım artık yok",
- "The requested share comes from a disabled user" : "Erişilmek istenilen paylaşım kullanımdan kaldırılmış bir kullanıcıdan geliyor",
+ "The requested share comes from a disabled user" : "Erişilmek istenilen paylaşım devre dışı bırakılmış bir kullanıcıdan geliyor",
"The user was not created because the user limit has been reached. Check your notifications to learn more." : "Kullanıcı sayısı sınırına ulaşıldığından kullanıcı eklenemedi. Ayrıntılı bilgi almak için bildirimlerinize bakın.",
"Could not find category \"%s\"" : "\"%s\" kategorisi bulunamadı",
"Input text" : "Giriş metni",
@@ -272,19 +272,19 @@
"Login contains whitespace at the beginning or at the end" : "Kullanıcı adının başında ya da sonunda boşluk var",
"Login must not consist of dots only" : "Kullanıcı adı yalnızca noktalardan oluşamaz",
"Login is invalid because files already exist for this user" : "Kullanıcı adı geçersiz, bu kullanıcı için zaten bazı dosyalar var",
- "Account disabled" : "Hesap kullanımdan kaldırılmış",
+ "Account disabled" : "Hesap devre dışı bırakılmış",
"Login canceled by app" : "Oturum açma uygulama tarafından iptal edildi",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" uygulaması, şu gereklilikler sağlanmadığı için kurulamıyor: %2$s",
"a safe home for all your data" : "verileriniz için güvenli bir barınak",
- "Application is not enabled" : "Uygulama kullanıma alınmamış",
+ "Application is not enabled" : "Uygulama etkin değil",
"Authentication error" : "Kimlik doğrulama sorunu",
"Token expired. Please reload page." : "Kodun geçerlilik süresi dolmuş. Lütfen sayfayı yenileyin.",
- "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veri tabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Herhangi bir veritabanı sürücüsü (sqlite, mysql ya da postgresql) kurulmamış.",
"Cannot write into \"config\" directory." : "\"config\" klasörüne yazılamadı.",
"This can usually be fixed by giving the web server write access to the config directory. See %s" : "Bu sorun genellikle, site sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Ya da config.php dosyasının salt okunur olarak kalmasını istiyorsanız içindeki \"config_is_read_only\" seçeneğini true olarak ayarlayın. %s bölümüne bakabilirsiniz",
"Cannot write into \"apps\" directory." : "\"apps\" klasörüne yazılamadı.",
- "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Bu sorun genellikle, site sunucusuna apps klasörüne yazma izni verilerek ya da yapılandırma dosyasından uygulama mağazası kullanımdan kaldırılarak çözülebilir.",
+ "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Bu sorun genellikle, site sunucusuna apps klasörüne yazma izni verilerek ya da yapılandırma dosyasından uygulama mağazası devre dışı bırakılarak çözülebilir.",
"Cannot create \"data\" directory." : "\"data\" klasörü oluşturulamadı",
"This can usually be fixed by giving the web server write access to the root directory. See %s" : "Bu sorun genellikle, site sunucusuna kök klasöre yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : "İzinler genellikle, site sunucusuna kök klasöre yazma izni verilerek düzeltilebilir. %s bölümüne bakın.",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index bce5040826f..d511d276c9e 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -93,6 +93,8 @@ OC.L10N.register(
"Destination does not exist" : "Призначення відсутнє",
"Destination is not creatable" : "Неможливо створити призначення",
"Dot files are not allowed" : "Файли які починаються з крапки не допустимі",
+ "%1$s (renamed)" : "%1$s (перейменовано)",
+ "renamed file" : "перейменовано файл",
"\"%1$s\" is a forbidden file or folder name." : "\"%1$s\" є недозволеним ім'ям файлів або каталогів.",
"\"%1$s\" is a forbidden prefix for file or folder names." : "\"%1$s\" є недозволеним префіксом у іменах файлів або каталоів.",
"\"%1$s\" is not allowed inside a file or folder name." : "\"%1$s\" не дозволено всередині імени файлів або каталогів.",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 1f6870816f2..c21e23f71f3 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -91,6 +91,8 @@
"Destination does not exist" : "Призначення відсутнє",
"Destination is not creatable" : "Неможливо створити призначення",
"Dot files are not allowed" : "Файли які починаються з крапки не допустимі",
+ "%1$s (renamed)" : "%1$s (перейменовано)",
+ "renamed file" : "перейменовано файл",
"\"%1$s\" is a forbidden file or folder name." : "\"%1$s\" є недозволеним ім'ям файлів або каталогів.",
"\"%1$s\" is a forbidden prefix for file or folder names." : "\"%1$s\" є недозволеним префіксом у іменах файлів або каталоів.",
"\"%1$s\" is not allowed inside a file or folder name." : "\"%1$s\" не дозволено всередині імени файлів або каталогів.",
diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php
index f6494fa946d..4223d09e3dc 100644
--- a/lib/private/App/AppManager.php
+++ b/lib/private/App/AppManager.php
@@ -18,6 +18,7 @@ use OCP\Collaboration\AutoComplete\IManager as IAutoCompleteManager;
use OCP\Collaboration\Collaborators\ISearch as ICollaboratorSearch;
use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
+use OCP\IAppConfig;
use OCP\ICacheFactory;
use OCP\IConfig;
use OCP\IGroup;
@@ -134,7 +135,8 @@ class AppManager implements IAppManager {
*/
private function getEnabledAppsValues(): array {
if (!$this->enabledAppsCache) {
- $values = $this->getAppConfig()->getValues(false, 'enabled');
+ /** @var array<string,string> */
+ $values = $this->getAppConfig()->searchValues('enabled', false, IAppConfig::VALUE_STRING);
$alwaysEnabledApps = $this->getAlwaysEnabledApps();
foreach ($alwaysEnabledApps as $appId) {
@@ -545,11 +547,16 @@ class AppManager implements IAppManager {
* @param string $appId
* @param bool $forceEnable
* @throws AppPathNotFoundException
+ * @throws \InvalidArgumentException if the application is not installed yet
*/
public function enableApp(string $appId, bool $forceEnable = false): void {
// Check if app exists
$this->getAppPath($appId);
+ if ($this->config->getAppValue($appId, 'installed_version', '') === '') {
+ throw new \InvalidArgumentException("$appId is not installed, cannot be enabled.");
+ }
+
if ($forceEnable) {
$this->overwriteNextcloudRequirement($appId);
}
@@ -596,6 +603,10 @@ class AppManager implements IAppManager {
throw new \InvalidArgumentException("$appId can't be enabled for groups.");
}
+ if ($this->config->getAppValue($appId, 'installed_version', '') === '') {
+ throw new \InvalidArgumentException("$appId is not installed, cannot be enabled.");
+ }
+
if ($forceEnable) {
$this->overwriteNextcloudRequirement($appId);
}
@@ -775,8 +786,8 @@ class AppManager implements IAppManager {
*
* @return array<string, string>
*/
- public function getAppInstalledVersions(): array {
- return $this->getAppConfig()->getAppInstalledVersions();
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array {
+ return $this->getAppConfig()->getAppInstalledVersions($onlyEnabled);
}
/**
@@ -812,6 +823,10 @@ class AppManager implements IAppManager {
}
private function isAlwaysEnabled(string $appId): bool {
+ if ($appId === 'core') {
+ return true;
+ }
+
$alwaysEnabled = $this->getAlwaysEnabledApps();
return in_array($appId, $alwaysEnabled, true);
}
diff --git a/lib/private/App/AppStore/AppNotFoundException.php b/lib/private/App/AppStore/AppNotFoundException.php
new file mode 100644
index 00000000000..79ceebb4423
--- /dev/null
+++ b/lib/private/App/AppStore/AppNotFoundException.php
@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OC\App\AppStore;
+
+class AppNotFoundException extends \Exception {
+}
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index a8a6f689ffa..adbfc58978b 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -1670,11 +1670,18 @@ class AppConfig implements IAppConfig {
*
* @return array<string, string>
*/
- public function getAppInstalledVersions(): array {
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array {
if ($this->appVersionsCache === null) {
/** @var array<string, string> */
$this->appVersionsCache = $this->searchValues('installed_version', false, IAppConfig::VALUE_STRING);
}
+ if ($onlyEnabled) {
+ return array_filter(
+ $this->appVersionsCache,
+ fn (string $app): bool => $this->getValueString($app, 'enabled', 'no') !== 'no',
+ ARRAY_FILTER_USE_KEY
+ );
+ }
return $this->appVersionsCache;
}
}
diff --git a/lib/private/AppFramework/Bootstrap/Coordinator.php b/lib/private/AppFramework/Bootstrap/Coordinator.php
index 4e613703dec..190244051d3 100644
--- a/lib/private/AppFramework/Bootstrap/Coordinator.php
+++ b/lib/private/AppFramework/Bootstrap/Coordinator.php
@@ -20,6 +20,7 @@ use OCP\Dashboard\IManager;
use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IServerContainer;
+use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;
use Throwable;
use function class_exists;
@@ -69,19 +70,24 @@ class Coordinator {
*/
try {
$path = $this->appManager->getAppPath($appId);
+ OC_App::registerAutoloading($appId, $path);
} catch (AppPathNotFoundException) {
// Ignore
continue;
}
- OC_App::registerAutoloading($appId, $path);
$this->eventLogger->end("bootstrap:register_app:$appId:autoloader");
/*
* Next we check if there is an application class, and it implements
* the \OCP\AppFramework\Bootstrap\IBootstrap interface
*/
- $appNameSpace = App::buildAppNamespace($appId);
+ if ($appId === 'core') {
+ $appNameSpace = 'OC\\Core';
+ } else {
+ $appNameSpace = App::buildAppNamespace($appId);
+ }
$applicationClassName = $appNameSpace . '\\AppInfo\\Application';
+
try {
if (class_exists($applicationClassName) && is_a($applicationClassName, IBootstrap::class, true)) {
$this->eventLogger->start("bootstrap:register_app:$appId:application", "Load `Application` instance for $appId");
@@ -89,7 +95,7 @@ class Coordinator {
/** @var IBootstrap&App $application */
$application = $this->serverContainer->query($applicationClassName);
$apps[$appId] = $application;
- } catch (QueryException $e) {
+ } catch (ContainerExceptionInterface $e) {
// Weird, but ok
$this->eventLogger->end("bootstrap:register_app:$appId");
continue;
diff --git a/lib/private/AppFramework/Services/AppConfig.php b/lib/private/AppFramework/Services/AppConfig.php
index 77c5ea4de0c..04d97738483 100644
--- a/lib/private/AppFramework/Services/AppConfig.php
+++ b/lib/private/AppFramework/Services/AppConfig.php
@@ -343,7 +343,7 @@ class AppConfig implements IAppConfig {
*
* @return array<string, string>
*/
- public function getAppInstalledVersions(): array {
- return $this->appConfig->getAppInstalledVersions();
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array {
+ return $this->appConfig->getAppInstalledVersions($onlyEnabled);
}
}
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index 16365948031..c41838fd6b0 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -460,4 +460,12 @@ class Folder extends Node implements \OCP\Files\Folder {
return $this->search($query);
}
+
+ public function verifyPath($fileName, $readonly = false): void {
+ $this->view->verifyPath(
+ $this->getPath(),
+ $fileName,
+ $readonly,
+ );
+ }
}
diff --git a/lib/private/Files/Node/LazyFolder.php b/lib/private/Files/Node/LazyFolder.php
index 5879748d951..37b1efa0fad 100644
--- a/lib/private/Files/Node/LazyFolder.php
+++ b/lib/private/Files/Node/LazyFolder.php
@@ -561,4 +561,8 @@ class LazyFolder implements Folder {
public function getMetadata(): array {
return $this->data['metadata'] ?? $this->__call(__FUNCTION__, func_get_args());
}
+
+ public function verifyPath($fileName, $readonly = false): void {
+ $this->__call(__FUNCTION__, func_get_args());
+ }
}
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index ebe87399ab4..36b1a7a1c95 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -67,7 +67,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
$this->logger = \OCP\Server::get(LoggerInterface::class);
}
- public function mkdir(string $path, bool $force = false): bool {
+ public function mkdir(string $path, bool $force = false, array $metadata = []): bool {
$path = $this->normalizePath($path);
if (!$force && $this->file_exists($path)) {
$this->logger->warning("Tried to create an object store folder that already exists: $path");
@@ -77,7 +77,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
$mTime = time();
$data = [
'mimetype' => 'httpd/unix-directory',
- 'size' => 0,
+ 'size' => $metadata['size'] ?? 0,
'mtime' => $mTime,
'storage_mtime' => $mTime,
'permissions' => \OCP\Constants::PERMISSION_ALL,
@@ -709,7 +709,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common implements IChunkedFil
if ($cache->inCache($to)) {
$cache->remove($to);
}
- $this->mkdir($to);
+ $this->mkdir($to, false, ['size' => $sourceEntry->getSize()]);
foreach ($sourceCache->getFolderContentsById($sourceEntry->getId()) as $child) {
$this->copyInner($sourceCache, $child, $to . '/' . $child->getName());
diff --git a/lib/private/Installer.php b/lib/private/Installer.php
index f32b0e5919a..3bbef3252f4 100644
--- a/lib/private/Installer.php
+++ b/lib/private/Installer.php
@@ -10,6 +10,7 @@ declare(strict_types=1);
namespace OC;
use Doctrine\DBAL\Exception\TableExistsException;
+use OC\App\AppStore\AppNotFoundException;
use OC\App\AppStore\Bundles\Bundle;
use OC\App\AppStore\Fetcher\AppFetcher;
use OC\AppFramework\Bootstrap\Coordinator;
@@ -174,6 +175,7 @@ class Installer {
* @param string $appId
* @param bool [$allowUnstable]
*
+ * @throws AppNotFoundException If the app is not found on the appstore
* @throws \Exception If the installation was not successful
*/
public function downloadApp(string $appId, bool $allowUnstable = false): void {
@@ -341,6 +343,9 @@ class Installer {
// otherwise we just copy the outer directory
$this->copyRecursive($extractDir, $baseDir);
Files::rmdirr($extractDir);
+ if (function_exists('opcache_reset')) {
+ opcache_reset();
+ }
return;
}
// Signature does not match
@@ -353,9 +358,9 @@ class Installer {
}
}
- throw new \Exception(
+ throw new AppNotFoundException(
sprintf(
- 'Could not download app %s',
+ 'Could not download app %s, it was not found on the appstore',
$appId
)
);
diff --git a/lib/private/Notification/Manager.php b/lib/private/Notification/Manager.php
index b75e52deacb..8c457db8beb 100644
--- a/lib/private/Notification/Manager.php
+++ b/lib/private/Notification/Manager.php
@@ -217,7 +217,9 @@ class Manager implements IManager {
* @since 8.2.0
*/
public function hasNotifiers(): bool {
- return !empty($this->notifiers) || !empty($this->notifierClasses);
+ return !empty($this->notifiers)
+ || !empty($this->notifierClasses)
+ || (!$this->parsedRegistrationContext && !empty($this->coordinator->getRegistrationContext()->getNotifierServices()));
}
/**
diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php
index fa62a7b0257..0bb0280406c 100644
--- a/lib/private/PreviewManager.php
+++ b/lib/private/PreviewManager.php
@@ -154,7 +154,7 @@ class PreviewManager implements IPreview {
$mimeType = null,
bool $cacheResult = true,
): ISimpleFile {
- $this->throwIfPreviewsDisabled($file);
+ $this->throwIfPreviewsDisabled($file, $mimeType);
$previewConcurrency = $this->getGenerator()->getNumConcurrentPreviews('preview_concurrency_all');
$sem = Generator::guardWithSemaphore(Generator::SEMAPHORE_ID_ALL, $previewConcurrency);
try {
@@ -178,7 +178,7 @@ class PreviewManager implements IPreview {
* @since 19.0.0
*/
public function generatePreviews(File $file, array $specifications, $mimeType = null) {
- $this->throwIfPreviewsDisabled($file);
+ $this->throwIfPreviewsDisabled($file, $mimeType);
return $this->getGenerator()->generatePreviews($file, $specifications, $mimeType);
}
@@ -213,13 +213,15 @@ class PreviewManager implements IPreview {
/**
* Check if a preview can be generated for a file
*/
- public function isAvailable(\OCP\Files\FileInfo $file): bool {
+ public function isAvailable(\OCP\Files\FileInfo $file, ?string $mimeType = null): bool {
if (!$this->enablePreviews) {
return false;
}
+ $fileMimeType = $mimeType ?? $file->getMimeType();
+
$this->registerCoreProviders();
- if (!$this->isMimeSupported($file->getMimetype())) {
+ if (!$this->isMimeSupported($fileMimeType)) {
return false;
}
@@ -229,7 +231,7 @@ class PreviewManager implements IPreview {
}
foreach ($this->providers as $supportedMimeType => $providers) {
- if (preg_match($supportedMimeType, $file->getMimetype())) {
+ if (preg_match($supportedMimeType, $fileMimeType)) {
foreach ($providers as $providerClosure) {
$provider = $this->helper->getProvider($providerClosure);
if (!($provider instanceof IProviderV2)) {
@@ -455,8 +457,8 @@ class PreviewManager implements IPreview {
/**
* @throws NotFoundException if preview generation is disabled
*/
- private function throwIfPreviewsDisabled(File $file): void {
- if (!$this->isAvailable($file)) {
+ private function throwIfPreviewsDisabled(File $file, ?string $mimeType = null): void {
+ if (!$this->isAvailable($file, $mimeType)) {
throw new NotFoundException('Previews disabled');
}
}
diff --git a/lib/private/Route/CachingRouter.php b/lib/private/Route/CachingRouter.php
index 7dd26827d3c..dbd5ef02603 100644
--- a/lib/private/Route/CachingRouter.php
+++ b/lib/private/Route/CachingRouter.php
@@ -15,10 +15,16 @@ use OCP\IConfig;
use OCP\IRequest;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use Symfony\Component\Routing\Matcher\CompiledUrlMatcher;
+use Symfony\Component\Routing\Matcher\Dumper\CompiledUrlMatcherDumper;
+use Symfony\Component\Routing\RouteCollection;
class CachingRouter extends Router {
protected ICache $cache;
+ protected array $legacyCreatedRoutes = [];
+
public function __construct(
ICacheFactory $cacheFactory,
LoggerInterface $logger,
@@ -54,4 +60,98 @@ class CachingRouter extends Router {
return $url;
}
}
+
+ private function serializeRouteCollection(RouteCollection $collection): array {
+ $dumper = new CompiledUrlMatcherDumper($collection);
+ return $dumper->getCompiledRoutes();
+ }
+
+ /**
+ * Find the route matching $url
+ *
+ * @param string $url The url to find
+ * @throws \Exception
+ * @return array
+ */
+ public function findMatchingRoute(string $url): array {
+ $this->eventLogger->start('cacheroute:match', 'Match route');
+ $key = $this->context->getHost() . '#' . $this->context->getBaseUrl() . '#rootCollection';
+ $cachedRoutes = $this->cache->get($key);
+ if (!$cachedRoutes) {
+ parent::loadRoutes();
+ $cachedRoutes = $this->serializeRouteCollection($this->root);
+ $this->cache->set($key, $cachedRoutes, 3600);
+ }
+ $matcher = new CompiledUrlMatcher($cachedRoutes, $this->context);
+ $this->eventLogger->start('cacheroute:url:match', 'Symfony URL match call');
+ try {
+ $parameters = $matcher->match($url);
+ } catch (ResourceNotFoundException $e) {
+ if (!str_ends_with($url, '/')) {
+ // We allow links to apps/files? for backwards compatibility reasons
+ // However, since Symfony does not allow empty route names, the route
+ // we need to match is '/', so we need to append the '/' here.
+ try {
+ $parameters = $matcher->match($url . '/');
+ } catch (ResourceNotFoundException $newException) {
+ // If we still didn't match a route, we throw the original exception
+ throw $e;
+ }
+ } else {
+ throw $e;
+ }
+ }
+ $this->eventLogger->end('cacheroute:url:match');
+
+ $this->eventLogger->end('cacheroute:match');
+ return $parameters;
+ }
+
+ /**
+ * @param array{action:mixed, ...} $parameters
+ */
+ protected function callLegacyActionRoute(array $parameters): void {
+ /*
+ * Closures cannot be serialized to cache, so for legacy routes calling an action we have to include the routes.php file again
+ */
+ $app = $parameters['app'];
+ $this->useCollection($app);
+ parent::requireRouteFile($parameters['route-file'], $app);
+ $collection = $this->getCollection($app);
+ $parameters['action'] = $collection->get($parameters['_route'])?->getDefault('action');
+ parent::callLegacyActionRoute($parameters);
+ }
+
+ /**
+ * Create a \OC\Route\Route.
+ * Deprecated
+ *
+ * @param string $name Name of the route to create.
+ * @param string $pattern The pattern to match
+ * @param array $defaults An array of default parameter values
+ * @param array $requirements An array of requirements for parameters (regexes)
+ */
+ public function create($name, $pattern, array $defaults = [], array $requirements = []): Route {
+ $this->legacyCreatedRoutes[] = $name;
+ return parent::create($name, $pattern, $defaults, $requirements);
+ }
+
+ /**
+ * Require a routes.php file
+ */
+ protected function requireRouteFile(string $file, string $appName): void {
+ $this->legacyCreatedRoutes = [];
+ parent::requireRouteFile($file, $appName);
+ foreach ($this->legacyCreatedRoutes as $routeName) {
+ $route = $this->collection?->get($routeName);
+ if ($route === null) {
+ /* Should never happen */
+ throw new \Exception("Could not find route $routeName");
+ }
+ if ($route->hasDefault('action')) {
+ $route->setDefault('route-file', $file);
+ $route->setDefault('app', $appName);
+ }
+ }
+ }
}
diff --git a/lib/private/Route/Route.php b/lib/private/Route/Route.php
index ab5a1f6b59a..08231649e76 100644
--- a/lib/private/Route/Route.php
+++ b/lib/private/Route/Route.php
@@ -124,15 +124,9 @@ class Route extends SymfonyRoute implements IRoute {
* The action to execute when this route matches, includes a file like
* it is called directly
* @param string $file
- * @return void
*/
public function actionInclude($file) {
- $function = function ($param) use ($file) {
- unset($param['_route']);
- $_GET = array_merge($_GET, $param);
- unset($param);
- require_once "$file";
- } ;
- $this->action($function);
+ $this->setDefault('file', $file);
+ return $this;
}
}
diff --git a/lib/private/Route/Router.php b/lib/private/Route/Router.php
index 376852a1b6e..02f371e808a 100644
--- a/lib/private/Route/Router.php
+++ b/lib/private/Route/Router.php
@@ -82,7 +82,7 @@ class Router implements IRouter {
public function getRoutingFiles() {
if ($this->routingFiles === null) {
$this->routingFiles = [];
- foreach (\OC_APP::getEnabledApps() as $app) {
+ foreach ($this->appManager->getEnabledApps() as $app) {
try {
$appPath = $this->appManager->getAppPath($app);
$file = $appPath . '/appinfo/routes.php';
@@ -117,7 +117,7 @@ class Router implements IRouter {
$routingFiles = $this->getRoutingFiles();
$this->eventLogger->start('route:load:attributes', 'Loading Routes from attributes');
- foreach (\OC_App::getEnabledApps() as $enabledApp) {
+ foreach ($this->appManager->getEnabledApps() as $enabledApp) {
$this->loadAttributeRoutes($enabledApp);
}
$this->eventLogger->end('route:load:attributes');
@@ -312,17 +312,11 @@ class Router implements IRouter {
$application = $this->getApplicationClass($caller[0]);
\OC\AppFramework\App::main($caller[1], $caller[2], $application->getContainer(), $parameters);
} elseif (isset($parameters['action'])) {
- $action = $parameters['action'];
- if (!is_callable($action)) {
- throw new \Exception('not a callable action');
- }
- unset($parameters['action']);
- unset($parameters['caller']);
- $this->eventLogger->start('route:run:call', 'Run callable route');
- call_user_func($action, $parameters);
- $this->eventLogger->end('route:run:call');
+ $this->logger->warning('Deprecated action route used', ['parameters' => $parameters]);
+ $this->callLegacyActionRoute($parameters);
} elseif (isset($parameters['file'])) {
- include $parameters['file'];
+ $this->logger->debug('Deprecated file route used', ['parameters' => $parameters]);
+ $this->includeLegacyFileRoute($parameters);
} else {
throw new \Exception('no action available');
}
@@ -330,6 +324,32 @@ class Router implements IRouter {
}
/**
+ * @param array{file:mixed, ...} $parameters
+ */
+ protected function includeLegacyFileRoute(array $parameters): void {
+ $param = $parameters;
+ unset($param['_route']);
+ $_GET = array_merge($_GET, $param);
+ unset($param);
+ require_once $parameters['file'];
+ }
+
+ /**
+ * @param array{action:mixed, ...} $parameters
+ */
+ protected function callLegacyActionRoute(array $parameters): void {
+ $action = $parameters['action'];
+ if (!is_callable($action)) {
+ throw new \Exception('not a callable action');
+ }
+ unset($parameters['action']);
+ unset($parameters['caller']);
+ $this->eventLogger->start('route:run:call', 'Run callable route');
+ call_user_func($action, $parameters);
+ $this->eventLogger->end('route:run:call');
+ }
+
+ /**
* Get the url generator
*
* @return \Symfony\Component\Routing\Generator\UrlGenerator
@@ -492,7 +512,7 @@ class Router implements IRouter {
* @param string $file the route file location to include
* @param string $appName
*/
- private function requireRouteFile($file, $appName) {
+ protected function requireRouteFile(string $file, string $appName): void {
$this->setupRoutes(include $file, $appName);
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index bf07ee355ea..83eb95cd671 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -605,7 +605,7 @@ class Server extends ServerContainer implements IServerContainer {
$prefixClosure = function () use ($logQuery, $serverVersion): ?string {
if (!$logQuery) {
try {
- $v = \OCP\Server::get(IAppConfig::class)->getAppInstalledVersions();
+ $v = \OCP\Server::get(IAppConfig::class)->getAppInstalledVersions(true);
} catch (\Doctrine\DBAL\Exception $e) {
// Database service probably unavailable
// Probably related to https://github.com/nextcloud/server/issues/37424
@@ -620,7 +620,7 @@ class Server extends ServerContainer implements IServerContainer {
];
}
$v['core'] = implode(',', $serverVersion->getVersion());
- $version = implode(',', $v);
+ $version = implode(',', array_keys($v)) . implode(',', $v);
$instanceId = \OC_Util::getInstanceId();
$path = \OC::$SERVERROOT;
return md5($instanceId . '-' . $version . '-' . $path);
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index caffbfceefa..cfc387d2164 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -201,7 +201,7 @@ class TemplateLayout {
if ($this->config->getSystemValueBool('installed', false)) {
if (empty(self::$versionHash)) {
- $v = $this->appManager->getAppInstalledVersions();
+ $v = $this->appManager->getAppInstalledVersions(true);
$v['core'] = implode('.', $this->serverVersion->getVersion());
self::$versionHash = substr(md5(implode(',', $v)), 0, 8);
}
diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php
index c78ecac0903..1a2978b84d7 100644
--- a/lib/private/URLGenerator.php
+++ b/lib/private/URLGenerator.php
@@ -189,14 +189,14 @@ class URLGenerator implements IURLGenerator {
$basename = substr(basename($file), 0, -4);
try {
- $appPath = $this->getAppManager()->getAppPath($appName);
- } catch (AppPathNotFoundException $e) {
if ($appName === 'core' || $appName === '') {
$appName = 'core';
$appPath = false;
} else {
- throw new RuntimeException('image not found: image: ' . $file . ' webroot: ' . \OC::$WEBROOT . ' serverroot: ' . \OC::$SERVERROOT);
+ $appPath = $this->getAppManager()->getAppPath($appName);
}
+ } catch (AppPathNotFoundException $e) {
+ throw new RuntimeException('image not found: image: ' . $file . ' webroot: ' . \OC::$WEBROOT . ' serverroot: ' . \OC::$SERVERROOT);
}
// Check if the app is in the app folder
diff --git a/lib/private/legacy/OC_App.php b/lib/private/legacy/OC_App.php
index abac0d2635e..4f0fff8884e 100644
--- a/lib/private/legacy/OC_App.php
+++ b/lib/private/legacy/OC_App.php
@@ -316,6 +316,8 @@ class OC_App {
$appId = self::cleanAppId($appId);
if ($appId === '') {
return false;
+ } elseif ($appId === 'core') {
+ return __DIR__ . '/../../../core';
}
if (($dir = self::findAppInDirectories($appId, $refreshAppPath)) != false) {
diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php
index 67ef2d796be..6eae870216f 100644
--- a/lib/public/App/IAppManager.php
+++ b/lib/public/App/IAppManager.php
@@ -57,7 +57,7 @@ interface IAppManager {
* @return array<string, string>
* @since 32.0.0
*/
- public function getAppInstalledVersions(): array;
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array;
/**
* Returns the app icon or null if none is found
diff --git a/lib/public/AppFramework/Http/Attribute/RequestHeader.php b/lib/public/AppFramework/Http/Attribute/RequestHeader.php
index c9327eec4c0..1d0fbbfa0c3 100644
--- a/lib/public/AppFramework/Http/Attribute/RequestHeader.php
+++ b/lib/public/AppFramework/Http/Attribute/RequestHeader.php
@@ -21,30 +21,14 @@ use Attribute;
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class RequestHeader {
/**
- * @param string $name The name of the request header
- * @param string $description The description of the request header
+ * @param lowercase-string $name The name of the request header
+ * @param non-empty-string $description The description of the request header
+ * @param bool $indirect Allow indirect usage of the header for example in a middleware. Enabling this turns off the check which ensures that the header must be referenced in the controller method.
*/
public function __construct(
protected string $name,
protected string $description,
+ protected bool $indirect = false,
) {
}
-
- /**
- * @return string The name of the request header.
- *
- * @since 32.0.0
- */
- public function getName(): string {
- return $this->name;
- }
-
- /**
- * @return string The description of the request header.
- *
- * @since 32.0.0
- */
- public function getDescription(): string {
- return $this->description;
- }
}
diff --git a/lib/public/Files/Folder.php b/lib/public/Files/Folder.php
index 3128a17c10c..a35d2d78bc9 100644
--- a/lib/public/Files/Folder.php
+++ b/lib/public/Files/Folder.php
@@ -199,4 +199,15 @@ interface Folder extends Node {
* @since 9.1.0
*/
public function getRecent($limit, $offset = 0);
+
+ /**
+ * Verify if the given path is valid and allowed from this folder.
+ *
+ * @param string $path the path from this folder
+ * @param string $fileName
+ * @param bool $readonly Check only if the path is allowed for read-only access
+ * @throws InvalidPathException
+ * @since 32.0.0
+ */
+ public function verifyPath($fileName, $readonly = false): void;
}
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index f4210793476..fcc528fe11f 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -514,5 +514,5 @@ interface IAppConfig {
* @return array<string, string>
* @since 32.0.0
*/
- public function getAppInstalledVersions(): array;
+ public function getAppInstalledVersions(bool $onlyEnabled = false): array;
}
diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php
index 5a2bcde69f1..3c9eadd4577 100644
--- a/lib/public/IPreview.php
+++ b/lib/public/IPreview.php
@@ -92,10 +92,12 @@ interface IPreview {
* Check if a preview can be generated for a file
*
* @param \OCP\Files\FileInfo $file
+ * @param string|null $mimeType To force a given mimetype for the file
* @return bool
* @since 8.0.0
+ * @since 32.0.0 - isAvailable($mimeType) added the $mimeType argument to the signature
*/
- public function isAvailable(\OCP\Files\FileInfo $file);
+ public function isAvailable(\OCP\Files\FileInfo $file, ?string $mimeType = null);
/**
* Generates previews of a file
diff --git a/lib/public/Route/IRoute.php b/lib/public/Route/IRoute.php
index fffd4b9c1a1..7dba6225aff 100644
--- a/lib/public/Route/IRoute.php
+++ b/lib/public/Route/IRoute.php
@@ -34,8 +34,9 @@ interface IRoute {
* it is called directly
*
* @param string $file
- * @return void
+ * @return $this
* @since 7.0.0
+ * @deprecated 32.0.0 Use a proper controller instead
*/
public function actionInclude($file);
@@ -70,6 +71,7 @@ interface IRoute {
* This function is called with $class set to a callable or
* to the class with $function
* @since 7.0.0
+ * @deprecated 32.0.0 Use a proper controller instead
*/
public function action($class, $function = null);