summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/base.php18
-rw-r--r--lib/composer/composer/autoload_classmap.php6
-rw-r--r--lib/composer/composer/autoload_static.php6
-rw-r--r--lib/l10n/cs_CZ.js32
-rw-r--r--lib/l10n/cs_CZ.json32
-rw-r--r--lib/l10n/de.js32
-rw-r--r--lib/l10n/de.json32
-rw-r--r--lib/l10n/de_DE.js32
-rw-r--r--lib/l10n/de_DE.json32
-rw-r--r--lib/l10n/es.js32
-rw-r--r--lib/l10n/es.json32
-rw-r--r--lib/l10n/fr.js32
-rw-r--r--lib/l10n/fr.json32
-rw-r--r--lib/l10n/hu_HU.js32
-rw-r--r--lib/l10n/hu_HU.json32
-rw-r--r--lib/l10n/id.js32
-rw-r--r--lib/l10n/id.json32
-rw-r--r--lib/l10n/it.js79
-rw-r--r--lib/l10n/it.json79
-rw-r--r--lib/l10n/ja.js44
-rw-r--r--lib/l10n/ja.json44
-rw-r--r--lib/l10n/nb_NO.js78
-rw-r--r--lib/l10n/nb_NO.json78
-rw-r--r--lib/l10n/nl.js69
-rw-r--r--lib/l10n/nl.json69
-rw-r--r--lib/l10n/pl.js26
-rw-r--r--lib/l10n/pl.json26
-rw-r--r--lib/l10n/ru.js83
-rw-r--r--lib/l10n/ru.json83
-rw-r--r--lib/l10n/zh_TW.js32
-rw-r--r--lib/l10n/zh_TW.json32
-rw-r--r--lib/private/App/AppStore/Fetcher/AppFetcher.php56
-rw-r--r--lib/private/App/AppStore/Fetcher/CategoryFetcher.php45
-rw-r--r--lib/private/App/AppStore/Fetcher/Fetcher.php92
-rw-r--r--lib/private/App/AppStore/Version/Version.php52
-rw-r--r--lib/private/App/AppStore/Version/VersionParser.php83
-rw-r--r--lib/private/App/CodeChecker/DeprecationCheck.php7
-rw-r--r--lib/private/App/DependencyAnalyzer.php9
-rw-r--r--lib/private/AppFramework/Core/API.php13
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php1
-rw-r--r--lib/private/Archive/Archive.php21
-rw-r--r--lib/private/Authentication/Token/DefaultToken.php7
-rw-r--r--lib/private/Authentication/Token/DefaultTokenMapper.php17
-rw-r--r--lib/private/Authentication/Token/DefaultTokenProvider.php41
-rw-r--r--lib/private/Authentication/Token/IProvider.php13
-rw-r--r--lib/private/Authentication/Token/IToken.php2
-rw-r--r--lib/private/Authentication/TwoFactorAuth/Manager.php19
-rw-r--r--lib/private/DB/Connection.php6
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php39
-rw-r--r--lib/private/Files/Mount/ObjectHomeMountProvider.php3
-rw-r--r--lib/private/Files/ObjectStore/Mapper.php8
-rw-r--r--lib/private/Installer.php526
-rw-r--r--lib/private/Notification/Notification.php67
-rw-r--r--lib/private/OCSClient.php351
-rw-r--r--lib/private/Security/CSRF/CsrfToken.php6
-rw-r--r--lib/private/Security/CSRF/TokenStorage/SessionStorage.php7
-rw-r--r--lib/private/Server.php43
-rw-r--r--lib/private/Settings/Admin/Sharing.php2
-rw-r--r--lib/private/Setup/MySQL.php24
-rw-r--r--lib/private/Share/Constants.php4
-rw-r--r--lib/private/Share20/DefaultShareProvider.php45
-rw-r--r--lib/private/Share20/Manager.php56
-rw-r--r--lib/private/Share20/ProviderFactory.php44
-rw-r--r--lib/private/Updater.php18
-rw-r--r--lib/private/User/Session.php81
-rw-r--r--lib/private/legacy/app.php245
-rw-r--r--lib/private/legacy/user.php5
-rw-r--r--lib/private/legacy/util.php1
-rw-r--r--lib/public/BackgroundJob.php92
-rw-r--r--lib/public/IRequest.php2
-rw-r--r--lib/public/Notification/INotification.php21
-rw-r--r--lib/public/Share/IManager.php20
-rw-r--r--lib/public/Share/IProviderFactory.php6
-rw-r--r--lib/public/Share/IShareProvider.php12
74 files changed, 1974 insertions, 1538 deletions
diff --git a/lib/base.php b/lib/base.php
index e7bedb69596..909a62040ee 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -377,6 +377,7 @@ class OC {
\OCP\Util::addScript('update');
\OCP\Util::addStyle('update');
+ /** @var \OCP\App\IAppManager $appManager */
$appManager = \OC::$server->getAppManager();
$tmpl = new OC_Template('', 'update.admin', 'guest');
@@ -385,8 +386,17 @@ class OC {
// get third party apps
$ocVersion = \OCP\Util::getVersion();
+ $incompatibleApps = $appManager->getIncompatibleApps($ocVersion);
+ foreach ($incompatibleApps as $appInfo) {
+ if ($appManager->isShipped($appInfo['id'])) {
+ $l = \OC::$server->getL10N('core');
+ $hint = $l->t('The files of the app "%$1s" (%$2s) were not replaced correctly.', [$appInfo['name'], $appInfo['id']]);
+ throw new \OC\HintException('The files of the app "' . $appInfo['name'] . '" (' . $appInfo['id'] . ') were not replaced correctly.', $hint);
+ }
+ }
+
$tmpl->assign('appsToUpgrade', $appManager->getAppsNeedingUpgrade($ocVersion));
- $tmpl->assign('incompatibleAppsList', $appManager->getIncompatibleApps($ocVersion));
+ $tmpl->assign('incompatibleAppsList', $incompatibleApps);
$tmpl->assign('productName', 'Nextcloud'); // for now
$tmpl->assign('oldTheme', $oldTheme);
$tmpl->printPage();
@@ -1035,6 +1045,12 @@ class OC {
if ($userSession->tryTokenLogin($request)) {
return true;
}
+ if (isset($_COOKIE['nc_username'])
+ && isset($_COOKIE['nc_token'])
+ && isset($_COOKIE['nc_session_id'])
+ && $userSession->loginWithCookie($_COOKIE['nc_username'], $_COOKIE['nc_token'], $_COOKIE['nc_session_id'])) {
+ return true;
+ }
if ($userSession->tryBasicAuthLogin($request, \OC::$server->getBruteForceThrottler())) {
return true;
}
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 532a6f39848..ddd531868d4 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -279,6 +279,11 @@ return array(
'OC\\AppFramework\\Utility\\TimeFactory' => $baseDir . '/lib/private/AppFramework/Utility/TimeFactory.php',
'OC\\AppHelper' => $baseDir . '/lib/private/AppHelper.php',
'OC\\App\\AppManager' => $baseDir . '/lib/private/App/AppManager.php',
+ 'OC\\App\\AppStore\\Fetcher\\AppFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/AppFetcher.php',
+ 'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php',
+ 'OC\\App\\AppStore\\Fetcher\\Fetcher' => $baseDir . '/lib/private/App/AppStore/Fetcher/Fetcher.php',
+ 'OC\\App\\AppStore\\Version\\Version' => $baseDir . '/lib/private/App/AppStore/Version/Version.php',
+ 'OC\\App\\AppStore\\Version\\VersionParser' => $baseDir . '/lib/private/App/AppStore/Version/VersionParser.php',
'OC\\App\\CodeChecker\\AbstractCheck' => $baseDir . '/lib/private/App/CodeChecker/AbstractCheck.php',
'OC\\App\\CodeChecker\\CodeChecker' => $baseDir . '/lib/private/App/CodeChecker/CodeChecker.php',
'OC\\App\\CodeChecker\\DeprecationCheck' => $baseDir . '/lib/private/App/CodeChecker/DeprecationCheck.php',
@@ -602,7 +607,6 @@ return array(
'OC\\Notification\\Action' => $baseDir . '/lib/private/Notification/Action.php',
'OC\\Notification\\Manager' => $baseDir . '/lib/private/Notification/Manager.php',
'OC\\Notification\\Notification' => $baseDir . '/lib/private/Notification/Notification.php',
- 'OC\\OCSClient' => $baseDir . '/lib/private/OCSClient.php',
'OC\\OCS\\CoreCapabilities' => $baseDir . '/lib/private/OCS/CoreCapabilities.php',
'OC\\OCS\\Exception' => $baseDir . '/lib/private/OCS/Exception.php',
'OC\\OCS\\Person' => $baseDir . '/lib/private/OCS/Person.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index c0a3e9b50c6..99a3c3d540e 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -309,6 +309,11 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\AppFramework\\Utility\\TimeFactory' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Utility/TimeFactory.php',
'OC\\AppHelper' => __DIR__ . '/../../..' . '/lib/private/AppHelper.php',
'OC\\App\\AppManager' => __DIR__ . '/../../..' . '/lib/private/App/AppManager.php',
+ 'OC\\App\\AppStore\\Fetcher\\AppFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/AppFetcher.php',
+ 'OC\\App\\AppStore\\Fetcher\\CategoryFetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/CategoryFetcher.php',
+ 'OC\\App\\AppStore\\Fetcher\\Fetcher' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Fetcher/Fetcher.php',
+ 'OC\\App\\AppStore\\Version\\Version' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Version/Version.php',
+ 'OC\\App\\AppStore\\Version\\VersionParser' => __DIR__ . '/../../..' . '/lib/private/App/AppStore/Version/VersionParser.php',
'OC\\App\\CodeChecker\\AbstractCheck' => __DIR__ . '/../../..' . '/lib/private/App/CodeChecker/AbstractCheck.php',
'OC\\App\\CodeChecker\\CodeChecker' => __DIR__ . '/../../..' . '/lib/private/App/CodeChecker/CodeChecker.php',
'OC\\App\\CodeChecker\\DeprecationCheck' => __DIR__ . '/../../..' . '/lib/private/App/CodeChecker/DeprecationCheck.php',
@@ -632,7 +637,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Notification\\Action' => __DIR__ . '/../../..' . '/lib/private/Notification/Action.php',
'OC\\Notification\\Manager' => __DIR__ . '/../../..' . '/lib/private/Notification/Manager.php',
'OC\\Notification\\Notification' => __DIR__ . '/../../..' . '/lib/private/Notification/Notification.php',
- 'OC\\OCSClient' => __DIR__ . '/../../..' . '/lib/private/OCSClient.php',
'OC\\OCS\\CoreCapabilities' => __DIR__ . '/../../..' . '/lib/private/OCS/CoreCapabilities.php',
'OC\\OCS\\Exception' => __DIR__ . '/../../..' . '/lib/private/OCS/Exception.php',
'OC\\OCS\\Person' => __DIR__ . '/../../..' . '/lib/private/OCS/Person.php',
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index e62da4187cc..97a57585936 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -38,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Jméno souboru je rezervované slovo",
"File name contains at least one invalid character" : "Jméno souboru obsahuje nejméně jeden neplatný znak",
"File name is too long" : "Jméno souboru je moc dlouhé",
- "App directory already exists" : "Adresář aplikace již existuje",
- "Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit adresář aplikace. Opravte práva souborů. %s",
- "Archive does not contain a directory named %s" : "Archiv neobsahuje adresář pojmenovaný %s",
- "No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
- "No href specified when installing app from http" : "Nebyl zadán odkaz pro instalaci aplikace z HTTP",
- "No path specified when installing app from local file" : "Nebyla zadána cesta pro instalaci aplikace z místního souboru",
- "Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
- "Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
- "App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
- "App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
- "App can't be installed because it is not compatible with this version of the server" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikace nemůže být nainstalována, protože obsahuje značku\n<shipped>\n\ntrue\n</shipped>\n\ncož není povoleno pro nedodávané aplikace",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml nesouhlasí s verzí oznámenou z úložiště aplikací.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Nastavení serveru",
@@ -173,7 +158,6 @@ OC.L10N.register(
"Personal" : "Osobní",
"Users" : "Uživatelé",
"Admin" : "Administrace",
- "Recommended" : "Doporučené",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikace \"%s\" nemůže být nainstalována protože soubor appinfo nelze přečíst.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
"No app name specified" : "Nebyl zadan název aplikace",
@@ -221,6 +205,22 @@ OC.L10N.register(
"Storage connection error. %s" : "Chyba připojení úložiště. %s",
"Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
"Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s",
+ "App directory already exists" : "Adresář aplikace již existuje",
+ "Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit adresář aplikace. Opravte práva souborů. %s",
+ "Archive does not contain a directory named %s" : "Archiv neobsahuje adresář pojmenovaný %s",
+ "No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
+ "No href specified when installing app from http" : "Nebyl zadán odkaz pro instalaci aplikace z HTTP",
+ "No path specified when installing app from local file" : "Nebyla zadána cesta pro instalaci aplikace z místního souboru",
+ "Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
+ "Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
+ "App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
+ "App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikace nemůže být nainstalována, protože obsahuje značku\n<shipped>\n\ntrue\n</shipped>\n\ncož není povoleno pro nedodávané aplikace",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml nesouhlasí s verzí oznámenou z úložiště aplikací.",
+ "Recommended" : "Doporučené",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.",
"Storage not available" : "Úložiště není dostupné",
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index 934416f8857..f352a8db458 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -36,21 +36,6 @@
"File name is a reserved word" : "Jméno souboru je rezervované slovo",
"File name contains at least one invalid character" : "Jméno souboru obsahuje nejméně jeden neplatný znak",
"File name is too long" : "Jméno souboru je moc dlouhé",
- "App directory already exists" : "Adresář aplikace již existuje",
- "Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit adresář aplikace. Opravte práva souborů. %s",
- "Archive does not contain a directory named %s" : "Archiv neobsahuje adresář pojmenovaný %s",
- "No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
- "No href specified when installing app from http" : "Nebyl zadán odkaz pro instalaci aplikace z HTTP",
- "No path specified when installing app from local file" : "Nebyla zadána cesta pro instalaci aplikace z místního souboru",
- "Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
- "Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
- "App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
- "App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
- "App can't be installed because it is not compatible with this version of the server" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikace nemůže být nainstalována, protože obsahuje značku\n<shipped>\n\ntrue\n</shipped>\n\ncož není povoleno pro nedodávané aplikace",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml nesouhlasí s verzí oznámenou z úložiště aplikací.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Nastavení serveru",
@@ -171,7 +156,6 @@
"Personal" : "Osobní",
"Users" : "Uživatelé",
"Admin" : "Administrace",
- "Recommended" : "Doporučené",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikace \"%s\" nemůže být nainstalována protože soubor appinfo nelze přečíst.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
"No app name specified" : "Nebyl zadan název aplikace",
@@ -219,6 +203,22 @@
"Storage connection error. %s" : "Chyba připojení úložiště. %s",
"Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
"Storage connection timeout. %s" : "Vypršení připojení k úložišti. %s",
+ "App directory already exists" : "Adresář aplikace již existuje",
+ "Can't create app folder. Please fix permissions. %s" : "Nelze vytvořit adresář aplikace. Opravte práva souborů. %s",
+ "Archive does not contain a directory named %s" : "Archiv neobsahuje adresář pojmenovaný %s",
+ "No source specified when installing app" : "Nebyl zadán zdroj při instalaci aplikace",
+ "No href specified when installing app from http" : "Nebyl zadán odkaz pro instalaci aplikace z HTTP",
+ "No path specified when installing app from local file" : "Nebyla zadána cesta pro instalaci aplikace z místního souboru",
+ "Archives of type %s are not supported" : "Archivy typu %s nejsou podporovány",
+ "Failed to open archive when installing app" : "Chyba při otevírání archivu během instalace aplikace",
+ "App does not provide an info.xml file" : "Aplikace neposkytuje soubor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikaci nelze nainstalovat, soubor appinfo nelze číst.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Podpis nelze ověřit. Kontaktujte prosím vývojáře aplikace a zkontrolujte obrazovku administrace.",
+ "App can't be installed because of not allowed code in the App" : "Aplikace nemůže být nainstalována, protože obsahuje nepovolený kód",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí serveru.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikace nemůže být nainstalována, protože obsahuje značku\n<shipped>\n\ntrue\n</shipped>\n\ncož není povoleno pro nedodávané aplikace",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml nesouhlasí s verzí oznámenou z úložiště aplikací.",
+ "Recommended" : "Doporučené",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.",
"Storage not available" : "Úložiště není dostupné",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index bdad0a145f5..8f6047acb47 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -38,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
"File name is too long" : "Dateiname ist zu lang",
- "App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
- "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
- "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
- "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
- "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben",
- "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
- "Archives of type %s are not supported" : "Archive vom Typ %s werden nicht unterstützt",
- "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
- "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Die Signatur konnte nicht überprüft werden. Bitte kontaktiere die App-Entwickler und überprüfe deinen Admin-Bildschirm.",
- "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
- "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie die <shipped>true</shipped>-Bezeichnung enthält, die bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Diese App kann nicht installiert werden, da die Version in info.xml nicht die gleiche Version wie die aus dem App Store ist.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Servereinstellungen",
@@ -173,7 +158,6 @@ OC.L10N.register(
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Admin" : "Administration",
- "Recommended" : "Empfohlen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Die Anwendung \"%s\" kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
"No app name specified" : "Es wurde kein App-Name angegeben",
@@ -221,6 +205,22 @@ OC.L10N.register(
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
+ "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
+ "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
+ "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
+ "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben",
+ "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
+ "Archives of type %s are not supported" : "Archive vom Typ %s werden nicht unterstützt",
+ "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
+ "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Die Signatur konnte nicht überprüft werden. Bitte kontaktiere die App-Entwickler und überprüfe deinen Admin-Bildschirm.",
+ "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
+ "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie die <shipped>true</shipped>-Bezeichnung enthält, die bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Diese App kann nicht installiert werden, da die Version in info.xml nicht die gleiche Version wie die aus dem App Store ist.",
+ "Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.",
"Storage not available" : "Speicher nicht verfügbar",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index 3855f531d6e..30bbe1e9b3b 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -36,21 +36,6 @@
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
"File name is too long" : "Dateiname ist zu lang",
- "App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
- "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
- "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
- "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
- "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben",
- "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
- "Archives of type %s are not supported" : "Archive vom Typ %s werden nicht unterstützt",
- "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
- "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Die Signatur konnte nicht überprüft werden. Bitte kontaktiere die App-Entwickler und überprüfe deinen Admin-Bildschirm.",
- "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
- "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie die <shipped>true</shipped>-Bezeichnung enthält, die bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Diese App kann nicht installiert werden, da die Version in info.xml nicht die gleiche Version wie die aus dem App Store ist.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Servereinstellungen",
@@ -171,7 +156,6 @@
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Admin" : "Administration",
- "Recommended" : "Empfohlen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Die Anwendung \"%s\" kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
"No app name specified" : "Es wurde kein App-Name angegeben",
@@ -219,6 +203,22 @@
"Storage connection error. %s" : "Verbindungsfehler zum Speicherplatz. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
+ "App directory already exists" : "Das Applikationsverzeichnis existiert bereits",
+ "Can't create app folder. Please fix permissions. %s" : "Es kann kein Applikationsordner erstellt werden. Bitte passe die Berechtigungen an. %s",
+ "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
+ "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
+ "No href specified when installing app from http" : "Für die Installation der Applikation über http wurde keine Quelle (href) angegeben",
+ "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
+ "Archives of type %s are not supported" : "Archive vom Typ %s werden nicht unterstützt",
+ "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
+ "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Die Signatur konnte nicht überprüft werden. Bitte kontaktiere die App-Entwickler und überprüfe deinen Admin-Bildschirm.",
+ "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
+ "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie die <shipped>true</shipped>-Bezeichnung enthält, die bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Diese App kann nicht installiert werden, da die Version in info.xml nicht die gleiche Version wie die aus dem App Store ist.",
+ "Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.",
"Storage not available" : "Speicher nicht verfügbar",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 435dfe883df..1fd8fdc18ce 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -38,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
"File name is too long" : "Dateiname ist zu lang",
- "App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
- "Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
- "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
- "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
- "No href specified when installing app from http" : "Der Link (href) wurde nicht angegeben um die Applikation per http zu installieren",
- "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
- "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
- "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
- "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
- "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
- "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie den <shipped>true</shipped>-Tag enthält, der bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Die App konnte nicht installiert werden, da die Version in der info.xml nicht die gleiche Version wie im App-Store ist.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Servereinstellungen",
@@ -173,7 +158,6 @@ OC.L10N.register(
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Admin" : "Administrator",
- "Recommended" : "Empfohlen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Die Anwendung \"%s\" kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
"No app name specified" : "Es wurde kein App-Name angegeben",
@@ -221,6 +205,22 @@ OC.L10N.register(
"Storage connection error. %s" : "Speicher-Verbindungsfehler. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s",
+ "App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
+ "Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
+ "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
+ "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
+ "No href specified when installing app from http" : "Der Link (href) wurde nicht angegeben um die Applikation per http zu installieren",
+ "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
+ "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
+ "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
+ "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
+ "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
+ "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie den <shipped>true</shipped>-Tag enthält, der bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Die App konnte nicht installiert werden, da die Version in der info.xml nicht die gleiche Version wie im App-Store ist.",
+ "Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.",
"Storage not available" : "Speicher nicht verfügbar",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 685123aac5f..7fa221231c2 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -36,21 +36,6 @@
"File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort",
"File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen",
"File name is too long" : "Dateiname ist zu lang",
- "App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
- "Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
- "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
- "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
- "No href specified when installing app from http" : "Der Link (href) wurde nicht angegeben um die Applikation per http zu installieren",
- "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
- "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
- "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
- "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
- "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
- "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie den <shipped>true</shipped>-Tag enthält, der bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Die App konnte nicht installiert werden, da die Version in der info.xml nicht die gleiche Version wie im App-Store ist.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Servereinstellungen",
@@ -171,7 +156,6 @@
"Personal" : "Persönlich",
"Users" : "Benutzer",
"Admin" : "Administrator",
- "Recommended" : "Empfohlen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Die Anwendung \"%s\" kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
"No app name specified" : "Es wurde kein App-Name angegeben",
@@ -219,6 +203,22 @@
"Storage connection error. %s" : "Speicher-Verbindungsfehler. %s",
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Speicher-Verbindungszeitüberschreitung. %s",
+ "App directory already exists" : "Der Ordner für die App ist bereits vorhanden.",
+ "Can't create app folder. Please fix permissions. %s" : "Der Ordner für die App konnte nicht angelegt werden. Bitte überprüfen Sie die Ordner- und Dateirechte und passen Sie diese entsprechend an. %s",
+ "Archive does not contain a directory named %s" : "Das Archiv enthält kein Verzeichnis mit dem Namen %s",
+ "No source specified when installing app" : "Für die Installation der Applikation wurde keine Quelle angegeben",
+ "No href specified when installing app from http" : "Der Link (href) wurde nicht angegeben um die Applikation per http zu installieren",
+ "No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
+ "Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
+ "Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
+ "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
+ "App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
+ "App can't be installed because it is not compatible with this version of the server" : "Die App kann nicht installiert werden, da sie mit dieser Serverversion nicht kompatibel ist.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Die App kann nicht installiert werden, weil sie den <shipped>true</shipped>-Tag enthält, der bei Apps, die nicht zum Standardumfang gehören, nicht erlaubt ist",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Die App konnte nicht installiert werden, da die Version in der info.xml nicht die gleiche Version wie im App-Store ist.",
+ "Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.",
"Storage not available" : "Speicher nicht verfügbar",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index a5594e487c5..c83345221a0 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -37,21 +37,6 @@ OC.L10N.register(
"File name is a reserved word" : "El nombre de archivo es una palabra reservada",
"File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido",
"File name is too long" : "El nombre del archivo es demasiado largo",
- "App directory already exists" : "El directorio de la aplicación ya existe",
- "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
- "Archive does not contain a directory named %s" : "El archivo no contiene un directorio llamado %s",
- "No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
- "No href specified when installing app from http" : "No href especificado cuando se ha instalado la aplicación",
- "No path specified when installing app from local file" : "Ninguna ruta especificada al instalar la aplicación desde el fichero local",
- "Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
- "Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
- "App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
- "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
- "App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
- "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Configuración del servidor",
@@ -127,7 +112,6 @@ OC.L10N.register(
"Personal" : "Personal",
"Users" : "Usuarios",
"Admin" : "Administración",
- "Recommended" : "Recomendado",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión del servidor.",
"No app name specified" : "No se ha especificado nombre de la aplicación",
@@ -174,6 +158,22 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s",
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
+ "App directory already exists" : "El directorio de la aplicación ya existe",
+ "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
+ "Archive does not contain a directory named %s" : "El archivo no contiene un directorio llamado %s",
+ "No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
+ "No href specified when installing app from http" : "No href especificado cuando se ha instalado la aplicación",
+ "No path specified when installing app from local file" : "Ninguna ruta especificada al instalar la aplicación desde el fichero local",
+ "Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
+ "Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
+ "App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
+ "App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
+ "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.",
+ "Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.",
"Storage not available" : "Almacenamiento no disponible",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index a6842f83c5a..3e527515359 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -35,21 +35,6 @@
"File name is a reserved word" : "El nombre de archivo es una palabra reservada",
"File name contains at least one invalid character" : "El nombre del archivo contiene al menos un carácter inválido",
"File name is too long" : "El nombre del archivo es demasiado largo",
- "App directory already exists" : "El directorio de la aplicación ya existe",
- "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
- "Archive does not contain a directory named %s" : "El archivo no contiene un directorio llamado %s",
- "No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
- "No href specified when installing app from http" : "No href especificado cuando se ha instalado la aplicación",
- "No path specified when installing app from local file" : "Ninguna ruta especificada al instalar la aplicación desde el fichero local",
- "Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
- "Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
- "App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
- "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
- "App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
- "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Configuración del servidor",
@@ -125,7 +110,6 @@
"Personal" : "Personal",
"Users" : "Usuarios",
"Admin" : "Administración",
- "Recommended" : "Recomendado",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "La app \"%s\" no puede ser instalada debido a que no se puede leer la información de la app.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión del servidor.",
"No app name specified" : "No se ha especificado nombre de la aplicación",
@@ -172,6 +156,22 @@
"Storage incomplete configuration. %s" : "Configuración de almacenamiento incompleta. %s",
"Storage connection error. %s" : "Error de conexión de almacenamiento. %s",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
+ "App directory already exists" : "El directorio de la aplicación ya existe",
+ "Can't create app folder. Please fix permissions. %s" : "No se puede crear la carpeta de la aplicación. Corrija los permisos. %s",
+ "Archive does not contain a directory named %s" : "El archivo no contiene un directorio llamado %s",
+ "No source specified when installing app" : "No se ha especificado origen cuando se ha instalado la aplicación",
+ "No href specified when installing app from http" : "No href especificado cuando se ha instalado la aplicación",
+ "No path specified when installing app from local file" : "Ninguna ruta especificada al instalar la aplicación desde el fichero local",
+ "Archives of type %s are not supported" : "Los ficheros de tipo %s no son soportados",
+ "Failed to open archive when installing app" : "Falló la apertura ded fichero mientras se instalaba la aplicación",
+ "App does not provide an info.xml file" : "La aplicación no suministra un fichero info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "La app no puede ser instalada debido a que no se puede leer la información de la app.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma no pudo ser evaluada. Por favor, contacte con el desarrollador de la aplicación y compruebe su pantalla de administración.",
+ "App can't be installed because of not allowed code in the App" : "La aplicación no puede ser instalada por tener código no autorizado en la aplicación",
+ "App can't be installed because it is not compatible with this version of the server" : "La aplicación no se puede instalar porque no es compatible con esta versión del servidor",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "La aplicación no se puede instalar porque contiene la etiqueta\n<shipped>\ntrue\n</shipped>\nque no está permitida para aplicaciones no distribuidas",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión reportada por la App Store.",
+ "Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.",
"Storage not available" : "Almacenamiento no disponible",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index 5cbd572fb4c..c7ef971d43f 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -37,21 +37,6 @@ OC.L10N.register(
"File name is a reserved word" : "Ce nom de fichier est un mot réservé",
"File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
"File name is too long" : "Nom de fichier trop long",
- "App directory already exists" : "Le dossier de l'application existe déjà",
- "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
- "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s",
- "No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
- "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http",
- "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local",
- "Archives of type %s are not supported" : "Les archives de type %s ne sont pas prises en charge",
- "Failed to open archive when installing app" : "Échec de l'ouverture de l'archive lors de l'installation de l'application",
- "App does not provide an info.xml file" : "L'application ne fournit pas de fichier info.xml",
- "App cannot be installed because appinfo file cannot be read." : "L'application ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La signature n'a pas pu être vérifiée. Merci de contacter le développeur de l'application et de vérifier votre page d'administration.",
- "App can't be installed because of not allowed code in the App" : "L'application ne peut être installée car elle contient du code non-autorisé",
- "App can't be installed because it is not compatible with this version of the server" : "L'application ne peut être installée car elle n'est pas compatible avec cette version du serveur",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'application ne peut être installée car elle contient la balise <shipped>true</shipped> qui n'est pas autorisée pour les applications non incluses par défaut",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'App ne peut pas être installé car la version dans info.xml diffère de la version signalée par l' app store",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Paramètres serveur",
@@ -127,7 +112,6 @@ OC.L10N.register(
"Personal" : "Personnel",
"Users" : "Utilisateurs",
"Admin" : "Administration",
- "Recommended" : "Recommandée",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "L'application \"%s\" ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version du serveur",
"No app name specified" : "Aucun nom d'application spécifié",
@@ -174,6 +158,22 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s",
"Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
+ "App directory already exists" : "Le dossier de l'application existe déjà",
+ "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
+ "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s",
+ "No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
+ "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http",
+ "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local",
+ "Archives of type %s are not supported" : "Les archives de type %s ne sont pas prises en charge",
+ "Failed to open archive when installing app" : "Échec de l'ouverture de l'archive lors de l'installation de l'application",
+ "App does not provide an info.xml file" : "L'application ne fournit pas de fichier info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "L'application ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La signature n'a pas pu être vérifiée. Merci de contacter le développeur de l'application et de vérifier votre page d'administration.",
+ "App can't be installed because of not allowed code in the App" : "L'application ne peut être installée car elle contient du code non-autorisé",
+ "App can't be installed because it is not compatible with this version of the server" : "L'application ne peut être installée car elle n'est pas compatible avec cette version du serveur",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'application ne peut être installée car elle contient la balise <shipped>true</shipped> qui n'est pas autorisée pour les applications non incluses par défaut",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'App ne peut pas être installé car la version dans info.xml diffère de la version signalée par l' app store",
+ "Recommended" : "Recommandée",
"Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.",
"Storage not available" : "Support de stockage non disponible",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index e34f7d5b32e..d580c6c0fed 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -35,21 +35,6 @@
"File name is a reserved word" : "Ce nom de fichier est un mot réservé",
"File name contains at least one invalid character" : "Le nom de fichier contient un (des) caractère(s) non valide(s)",
"File name is too long" : "Nom de fichier trop long",
- "App directory already exists" : "Le dossier de l'application existe déjà",
- "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
- "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s",
- "No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
- "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http",
- "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local",
- "Archives of type %s are not supported" : "Les archives de type %s ne sont pas prises en charge",
- "Failed to open archive when installing app" : "Échec de l'ouverture de l'archive lors de l'installation de l'application",
- "App does not provide an info.xml file" : "L'application ne fournit pas de fichier info.xml",
- "App cannot be installed because appinfo file cannot be read." : "L'application ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La signature n'a pas pu être vérifiée. Merci de contacter le développeur de l'application et de vérifier votre page d'administration.",
- "App can't be installed because of not allowed code in the App" : "L'application ne peut être installée car elle contient du code non-autorisé",
- "App can't be installed because it is not compatible with this version of the server" : "L'application ne peut être installée car elle n'est pas compatible avec cette version du serveur",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'application ne peut être installée car elle contient la balise <shipped>true</shipped> qui n'est pas autorisée pour les applications non incluses par défaut",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'App ne peut pas être installé car la version dans info.xml diffère de la version signalée par l' app store",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Paramètres serveur",
@@ -125,7 +110,6 @@
"Personal" : "Personnel",
"Users" : "Utilisateurs",
"Admin" : "Administration",
- "Recommended" : "Recommandée",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "L'application \"%s\" ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version du serveur",
"No app name specified" : "Aucun nom d'application spécifié",
@@ -172,6 +156,22 @@
"Storage incomplete configuration. %s" : "Configuration de l'espace de stockage incomplète. %s",
"Storage connection error. %s" : "Erreur de connexion à l'espace stockage. %s",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
+ "App directory already exists" : "Le dossier de l'application existe déjà",
+ "Can't create app folder. Please fix permissions. %s" : "Impossible de créer le dossier de l'application. Corrigez les droits d'accès. %s",
+ "Archive does not contain a directory named %s" : "Le fichier archive ne contient pas de répertoire %s",
+ "No source specified when installing app" : "Aucune source spécifiée pour installer l'application",
+ "No href specified when installing app from http" : "Aucun href spécifié pour installer l'application par http",
+ "No path specified when installing app from local file" : "Aucun chemin spécifié pour installer l'application depuis un fichier local",
+ "Archives of type %s are not supported" : "Les archives de type %s ne sont pas prises en charge",
+ "Failed to open archive when installing app" : "Échec de l'ouverture de l'archive lors de l'installation de l'application",
+ "App does not provide an info.xml file" : "L'application ne fournit pas de fichier info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "L'application ne peut pas être installée car le fichier appinfo ne peut pas être lu.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La signature n'a pas pu être vérifiée. Merci de contacter le développeur de l'application et de vérifier votre page d'administration.",
+ "App can't be installed because of not allowed code in the App" : "L'application ne peut être installée car elle contient du code non-autorisé",
+ "App can't be installed because it is not compatible with this version of the server" : "L'application ne peut être installée car elle n'est pas compatible avec cette version du serveur",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'application ne peut être installée car elle contient la balise <shipped>true</shipped> qui n'est pas autorisée pour les applications non incluses par défaut",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'App ne peut pas être installé car la version dans info.xml diffère de la version signalée par l' app store",
+ "Recommended" : "Recommandée",
"Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.",
"Storage not available" : "Support de stockage non disponible",
diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js
index 055966855fe..f3d5a740ab4 100644
--- a/lib/l10n/hu_HU.js
+++ b/lib/l10n/hu_HU.js
@@ -38,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "A fajl neve egy rezervált szó",
"File name contains at least one invalid character" : "A fájlnév legalább egy érvénytelen karaktert tartalmaz!",
"File name is too long" : "A fájlnév túl hosszú!",
- "App directory already exists" : "Az alkalmazás könyvtára már létezik",
- "Can't create app folder. Please fix permissions. %s" : "Nem lehetett létrehozni az alkalmazás mappáját. Kérem ellenőrizze a jogosultságokat. %s",
- "Archive does not contain a directory named %s" : "Az archívum nem tartalmazza ezt a könyvtárt: %s",
- "No source specified when installing app" : "Az alkalmazás telepítéséhez nincs forrás megadva",
- "No href specified when installing app from http" : "Az alkalmazás http-n keresztül történő telepítéséhez nincs href hivetkozás megadva",
- "No path specified when installing app from local file" : "Az alkalmazás helyi telepítéséhez nincs útvonal (mappa) megadva",
- "Archives of type %s are not supported" : "A(z) %s típusú tömörített fájl nem támogatott",
- "Failed to open archive when installing app" : "Nem sikerült megnyitni a tömörített fájlt a telepítés során",
- "App does not provide an info.xml file" : "Az alkalmazás nem szolgáltatott info.xml file-t",
- "App cannot be installed because appinfo file cannot be read." : "Az alkalmazás nem telepíthető, mert az appinfo fájl nem olvasható.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Az aláírás nem ellenőrizhető. Kérlek lépj kapcsolatba az alkalmazás fejlesztőjével és ellenőrizd az adminisztrátori képernyőt.",
- "App can't be installed because of not allowed code in the App" : "Az alkalmazást nem lehet telepíteni, mert abban nem engedélyezett programkód szerepel",
- "App can't be installed because it is not compatible with this version of the server" : "Az alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a szerver verzióval",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Az alkalmazást nem lehet telepíteni, mert tartalmazza a \n<shipped>\ntrue\n</shipped>\ncímkét, ami a nem szállított alkalmazások esetén nem engedélyezett",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml fájlban tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Szerver beállítások",
@@ -173,7 +158,6 @@ OC.L10N.register(
"Personal" : "Személyes",
"Users" : "Felhasználók",
"Admin" : "Adminisztrátor",
- "Recommended" : "Ajánlott",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "\"%s\" alkalmazás nem lehet telepíteni, mert az appinfo fájl nem olvasható.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "\"%s\" alkalmazás nem lehet telepíteni, mert nem kompatibilis a szerver jelen verziójával.",
"No app name specified" : "Nincs az alkalmazás név megadva.",
@@ -221,6 +205,22 @@ OC.L10N.register(
"Storage connection error. %s" : "Tároló kapcsolódási hiba. %s",
"Storage is temporarily not available" : "A tároló átmenetileg nem érthető el",
"Storage connection timeout. %s" : "Tároló kapcsolat időtúllépés. %s",
+ "App directory already exists" : "Az alkalmazás könyvtára már létezik",
+ "Can't create app folder. Please fix permissions. %s" : "Nem lehetett létrehozni az alkalmazás mappáját. Kérem ellenőrizze a jogosultságokat. %s",
+ "Archive does not contain a directory named %s" : "Az archívum nem tartalmazza ezt a könyvtárt: %s",
+ "No source specified when installing app" : "Az alkalmazás telepítéséhez nincs forrás megadva",
+ "No href specified when installing app from http" : "Az alkalmazás http-n keresztül történő telepítéséhez nincs href hivetkozás megadva",
+ "No path specified when installing app from local file" : "Az alkalmazás helyi telepítéséhez nincs útvonal (mappa) megadva",
+ "Archives of type %s are not supported" : "A(z) %s típusú tömörített fájl nem támogatott",
+ "Failed to open archive when installing app" : "Nem sikerült megnyitni a tömörített fájlt a telepítés során",
+ "App does not provide an info.xml file" : "Az alkalmazás nem szolgáltatott info.xml file-t",
+ "App cannot be installed because appinfo file cannot be read." : "Az alkalmazás nem telepíthető, mert az appinfo fájl nem olvasható.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Az aláírás nem ellenőrizhető. Kérlek lépj kapcsolatba az alkalmazás fejlesztőjével és ellenőrizd az adminisztrátori képernyőt.",
+ "App can't be installed because of not allowed code in the App" : "Az alkalmazást nem lehet telepíteni, mert abban nem engedélyezett programkód szerepel",
+ "App can't be installed because it is not compatible with this version of the server" : "Az alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a szerver verzióval",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Az alkalmazást nem lehet telepíteni, mert tartalmazza a \n<shipped>\ntrue\n</shipped>\ncímkét, ami a nem szállított alkalmazások esetén nem engedélyezett",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml fájlban tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
+ "Recommended" : "Ajánlott",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.",
"Storage not available" : "A tároló elérhetetlen.",
diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json
index 8158facbb4c..29e4504a895 100644
--- a/lib/l10n/hu_HU.json
+++ b/lib/l10n/hu_HU.json
@@ -36,21 +36,6 @@
"File name is a reserved word" : "A fajl neve egy rezervált szó",
"File name contains at least one invalid character" : "A fájlnév legalább egy érvénytelen karaktert tartalmaz!",
"File name is too long" : "A fájlnév túl hosszú!",
- "App directory already exists" : "Az alkalmazás könyvtára már létezik",
- "Can't create app folder. Please fix permissions. %s" : "Nem lehetett létrehozni az alkalmazás mappáját. Kérem ellenőrizze a jogosultságokat. %s",
- "Archive does not contain a directory named %s" : "Az archívum nem tartalmazza ezt a könyvtárt: %s",
- "No source specified when installing app" : "Az alkalmazás telepítéséhez nincs forrás megadva",
- "No href specified when installing app from http" : "Az alkalmazás http-n keresztül történő telepítéséhez nincs href hivetkozás megadva",
- "No path specified when installing app from local file" : "Az alkalmazás helyi telepítéséhez nincs útvonal (mappa) megadva",
- "Archives of type %s are not supported" : "A(z) %s típusú tömörített fájl nem támogatott",
- "Failed to open archive when installing app" : "Nem sikerült megnyitni a tömörített fájlt a telepítés során",
- "App does not provide an info.xml file" : "Az alkalmazás nem szolgáltatott info.xml file-t",
- "App cannot be installed because appinfo file cannot be read." : "Az alkalmazás nem telepíthető, mert az appinfo fájl nem olvasható.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Az aláírás nem ellenőrizhető. Kérlek lépj kapcsolatba az alkalmazás fejlesztőjével és ellenőrizd az adminisztrátori képernyőt.",
- "App can't be installed because of not allowed code in the App" : "Az alkalmazást nem lehet telepíteni, mert abban nem engedélyezett programkód szerepel",
- "App can't be installed because it is not compatible with this version of the server" : "Az alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a szerver verzióval",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Az alkalmazást nem lehet telepíteni, mert tartalmazza a \n<shipped>\ntrue\n</shipped>\ncímkét, ami a nem szállított alkalmazások esetén nem engedélyezett",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml fájlban tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Szerver beállítások",
@@ -171,7 +156,6 @@
"Personal" : "Személyes",
"Users" : "Felhasználók",
"Admin" : "Adminisztrátor",
- "Recommended" : "Ajánlott",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "\"%s\" alkalmazás nem lehet telepíteni, mert az appinfo fájl nem olvasható.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "\"%s\" alkalmazás nem lehet telepíteni, mert nem kompatibilis a szerver jelen verziójával.",
"No app name specified" : "Nincs az alkalmazás név megadva.",
@@ -219,6 +203,22 @@
"Storage connection error. %s" : "Tároló kapcsolódási hiba. %s",
"Storage is temporarily not available" : "A tároló átmenetileg nem érthető el",
"Storage connection timeout. %s" : "Tároló kapcsolat időtúllépés. %s",
+ "App directory already exists" : "Az alkalmazás könyvtára már létezik",
+ "Can't create app folder. Please fix permissions. %s" : "Nem lehetett létrehozni az alkalmazás mappáját. Kérem ellenőrizze a jogosultságokat. %s",
+ "Archive does not contain a directory named %s" : "Az archívum nem tartalmazza ezt a könyvtárt: %s",
+ "No source specified when installing app" : "Az alkalmazás telepítéséhez nincs forrás megadva",
+ "No href specified when installing app from http" : "Az alkalmazás http-n keresztül történő telepítéséhez nincs href hivetkozás megadva",
+ "No path specified when installing app from local file" : "Az alkalmazás helyi telepítéséhez nincs útvonal (mappa) megadva",
+ "Archives of type %s are not supported" : "A(z) %s típusú tömörített fájl nem támogatott",
+ "Failed to open archive when installing app" : "Nem sikerült megnyitni a tömörített fájlt a telepítés során",
+ "App does not provide an info.xml file" : "Az alkalmazás nem szolgáltatott info.xml file-t",
+ "App cannot be installed because appinfo file cannot be read." : "Az alkalmazás nem telepíthető, mert az appinfo fájl nem olvasható.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Az aláírás nem ellenőrizhető. Kérlek lépj kapcsolatba az alkalmazás fejlesztőjével és ellenőrizd az adminisztrátori képernyőt.",
+ "App can't be installed because of not allowed code in the App" : "Az alkalmazást nem lehet telepíteni, mert abban nem engedélyezett programkód szerepel",
+ "App can't be installed because it is not compatible with this version of the server" : "Az alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a szerver verzióval",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Az alkalmazást nem lehet telepíteni, mert tartalmazza a \n<shipped>\ntrue\n</shipped>\ncímkét, ami a nem szállított alkalmazások esetén nem engedélyezett",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml fájlban tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
+ "Recommended" : "Ajánlott",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.",
"Storage not available" : "A tároló elérhetetlen.",
diff --git a/lib/l10n/id.js b/lib/l10n/id.js
index f07dd357b24..17062f6edb8 100644
--- a/lib/l10n/id.js
+++ b/lib/l10n/id.js
@@ -37,21 +37,6 @@ OC.L10N.register(
"File name is a reserved word" : "Nama berkas merupakan kata yang disediakan",
"File name contains at least one invalid character" : "Nama berkas berisi setidaknya satu karakter yang tidak sah.",
"File name is too long" : "Nama berkas terlalu panjang",
- "App directory already exists" : "Direktori Aplikasi sudah ada",
- "Can't create app folder. Please fix permissions. %s" : "Tidak dapat membuat folder Aplikasi. Silakan perbaiki perizinan. %s",
- "Archive does not contain a directory named %s" : "Arsip tidak berisi direktori yang bernama %s",
- "No source specified when installing app" : "Tidak ada sumber yang ditentukan saat menginstal Aplikasi",
- "No href specified when installing app from http" : "Href tidak ditentukan saat menginstal Aplikasi dari http",
- "No path specified when installing app from local file" : "Lokasi tidak ditentukan saat menginstal Aplikasi dari berkas lokal",
- "Archives of type %s are not supported" : "Arsip dengan tipe %s tidak didukung",
- "Failed to open archive when installing app" : "Gagal membuka arsip saat menginstal Aplikasi",
- "App does not provide an info.xml file" : "Aplikasi tidak menyediakan berkas info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Aplikasi tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Tandatangan tidak dapat dicek. Hubungi pengembang Aplikasi dan cek layar admin Anda.",
- "App can't be installed because of not allowed code in the App" : "Aplikasi tidak dapat dipasang karena terdapat kode yang tidak diizinkan didalam Aplikasi",
- "App can't be installed because it is not compatible with this version of the server" : "Aplikasi tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikasi tidak dapat dipasang karena mengandung tag <shipped>true</shipped> yang tidak diizinkan untuk Aplikasi yang bukan bawaan.",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikasi tidak dapat dipasang karena versi dalam info.xml tidak sama dengan versi yang ada dari toko aplikasi",
"%s enter the database username and name." : "%s masukkan nama pengguna database dan nama database.",
"%s enter the database username." : "%s masukkan nama pengguna basis data.",
"%s enter the database name." : "%s masukkan nama basis data.",
@@ -119,7 +104,6 @@ OC.L10N.register(
"Personal" : "Pribadi",
"Users" : "Pengguna",
"Admin" : "Admin",
- "Recommended" : "Direkomendasikan",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikasi \"%s\" tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikasi \"%s\" tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
"No app name specified" : "Tidak ada nama Aplikasi yang ditentukan",
@@ -166,6 +150,22 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "Konfigurasi penyimpanan tidak terselesaikan. %s",
"Storage connection error. %s" : "Koneksi penyimpanan bermasalah. %s",
"Storage connection timeout. %s" : "Koneksi penyimpanan waktu-habis. %s",
+ "App directory already exists" : "Direktori Aplikasi sudah ada",
+ "Can't create app folder. Please fix permissions. %s" : "Tidak dapat membuat folder Aplikasi. Silakan perbaiki perizinan. %s",
+ "Archive does not contain a directory named %s" : "Arsip tidak berisi direktori yang bernama %s",
+ "No source specified when installing app" : "Tidak ada sumber yang ditentukan saat menginstal Aplikasi",
+ "No href specified when installing app from http" : "Href tidak ditentukan saat menginstal Aplikasi dari http",
+ "No path specified when installing app from local file" : "Lokasi tidak ditentukan saat menginstal Aplikasi dari berkas lokal",
+ "Archives of type %s are not supported" : "Arsip dengan tipe %s tidak didukung",
+ "Failed to open archive when installing app" : "Gagal membuka arsip saat menginstal Aplikasi",
+ "App does not provide an info.xml file" : "Aplikasi tidak menyediakan berkas info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikasi tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Tandatangan tidak dapat dicek. Hubungi pengembang Aplikasi dan cek layar admin Anda.",
+ "App can't be installed because of not allowed code in the App" : "Aplikasi tidak dapat dipasang karena terdapat kode yang tidak diizinkan didalam Aplikasi",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikasi tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikasi tidak dapat dipasang karena mengandung tag <shipped>true</shipped> yang tidak diizinkan untuk Aplikasi yang bukan bawaan.",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikasi tidak dapat dipasang karena versi dalam info.xml tidak sama dengan versi yang ada dari toko aplikasi",
+ "Recommended" : "Direkomendasikan",
"Microsoft Windows Platform is not supported" : "Platform Microsoft Windows tidak didukung",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Menjalankan Nextcloud Server pada platform Microsoft Windows tidak didukung. Kami menyarankan Anda menggunakan server Linux di mesin virtual jika Anda tidak memiliki pilihan untuk migrasi server itu sendiri.",
"Storage not available" : "Penyimpanan tidak tersedia",
diff --git a/lib/l10n/id.json b/lib/l10n/id.json
index 8dc3cf5b506..77af55f659a 100644
--- a/lib/l10n/id.json
+++ b/lib/l10n/id.json
@@ -35,21 +35,6 @@
"File name is a reserved word" : "Nama berkas merupakan kata yang disediakan",
"File name contains at least one invalid character" : "Nama berkas berisi setidaknya satu karakter yang tidak sah.",
"File name is too long" : "Nama berkas terlalu panjang",
- "App directory already exists" : "Direktori Aplikasi sudah ada",
- "Can't create app folder. Please fix permissions. %s" : "Tidak dapat membuat folder Aplikasi. Silakan perbaiki perizinan. %s",
- "Archive does not contain a directory named %s" : "Arsip tidak berisi direktori yang bernama %s",
- "No source specified when installing app" : "Tidak ada sumber yang ditentukan saat menginstal Aplikasi",
- "No href specified when installing app from http" : "Href tidak ditentukan saat menginstal Aplikasi dari http",
- "No path specified when installing app from local file" : "Lokasi tidak ditentukan saat menginstal Aplikasi dari berkas lokal",
- "Archives of type %s are not supported" : "Arsip dengan tipe %s tidak didukung",
- "Failed to open archive when installing app" : "Gagal membuka arsip saat menginstal Aplikasi",
- "App does not provide an info.xml file" : "Aplikasi tidak menyediakan berkas info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Aplikasi tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Tandatangan tidak dapat dicek. Hubungi pengembang Aplikasi dan cek layar admin Anda.",
- "App can't be installed because of not allowed code in the App" : "Aplikasi tidak dapat dipasang karena terdapat kode yang tidak diizinkan didalam Aplikasi",
- "App can't be installed because it is not compatible with this version of the server" : "Aplikasi tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikasi tidak dapat dipasang karena mengandung tag <shipped>true</shipped> yang tidak diizinkan untuk Aplikasi yang bukan bawaan.",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikasi tidak dapat dipasang karena versi dalam info.xml tidak sama dengan versi yang ada dari toko aplikasi",
"%s enter the database username and name." : "%s masukkan nama pengguna database dan nama database.",
"%s enter the database username." : "%s masukkan nama pengguna basis data.",
"%s enter the database name." : "%s masukkan nama basis data.",
@@ -117,7 +102,6 @@
"Personal" : "Pribadi",
"Users" : "Pengguna",
"Admin" : "Admin",
- "Recommended" : "Direkomendasikan",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikasi \"%s\" tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikasi \"%s\" tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
"No app name specified" : "Tidak ada nama Aplikasi yang ditentukan",
@@ -164,6 +148,22 @@
"Storage incomplete configuration. %s" : "Konfigurasi penyimpanan tidak terselesaikan. %s",
"Storage connection error. %s" : "Koneksi penyimpanan bermasalah. %s",
"Storage connection timeout. %s" : "Koneksi penyimpanan waktu-habis. %s",
+ "App directory already exists" : "Direktori Aplikasi sudah ada",
+ "Can't create app folder. Please fix permissions. %s" : "Tidak dapat membuat folder Aplikasi. Silakan perbaiki perizinan. %s",
+ "Archive does not contain a directory named %s" : "Arsip tidak berisi direktori yang bernama %s",
+ "No source specified when installing app" : "Tidak ada sumber yang ditentukan saat menginstal Aplikasi",
+ "No href specified when installing app from http" : "Href tidak ditentukan saat menginstal Aplikasi dari http",
+ "No path specified when installing app from local file" : "Lokasi tidak ditentukan saat menginstal Aplikasi dari berkas lokal",
+ "Archives of type %s are not supported" : "Arsip dengan tipe %s tidak didukung",
+ "Failed to open archive when installing app" : "Gagal membuka arsip saat menginstal Aplikasi",
+ "App does not provide an info.xml file" : "Aplikasi tidak menyediakan berkas info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikasi tidak dapat dipasang karena berkas appinfo tidak dapat dibaca.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Tandatangan tidak dapat dicek. Hubungi pengembang Aplikasi dan cek layar admin Anda.",
+ "App can't be installed because of not allowed code in the App" : "Aplikasi tidak dapat dipasang karena terdapat kode yang tidak diizinkan didalam Aplikasi",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikasi tidak dapat dipasang karena tidak kompatibel dengan versi server ini",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikasi tidak dapat dipasang karena mengandung tag <shipped>true</shipped> yang tidak diizinkan untuk Aplikasi yang bukan bawaan.",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikasi tidak dapat dipasang karena versi dalam info.xml tidak sama dengan versi yang ada dari toko aplikasi",
+ "Recommended" : "Direkomendasikan",
"Microsoft Windows Platform is not supported" : "Platform Microsoft Windows tidak didukung",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Menjalankan Nextcloud Server pada platform Microsoft Windows tidak didukung. Kami menyarankan Anda menggunakan server Linux di mesin virtual jika Anda tidak memiliki pilihan untuk migrasi server itu sendiri.",
"Storage not available" : "Penyimpanan tidak tersedia",
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index 9d58b7a52ea..c61ac244637 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -20,6 +20,7 @@ OC.L10N.register(
"Server version %s or lower is required." : "È richiesta la versione %s o precedente.",
"Unknown filetype" : "Tipo di file sconosciuto",
"Invalid image" : "Immagine non valida",
+ "Avatar image is not square" : "L'immagine personale non è quadrata",
"today" : "oggi",
"yesterday" : "ieri",
"_%n day ago_::_%n days ago_" : ["%d giorno fa","%n giorni fa"],
@@ -37,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Il nome del file è una parola riservata",
"File name contains at least one invalid character" : "Il nome del file contiene almeno un carattere non valido",
"File name is too long" : "Il nome del file è troppo lungo",
- "App directory already exists" : "La cartella dell'applicazione esiste già",
- "Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
- "Archive does not contain a directory named %s" : "L'archivio non contiene una cartella con nome %s",
- "No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
- "No href specified when installing app from http" : "Nessun href specificato durante l'installazione dell'applicazione da http",
- "No path specified when installing app from local file" : "Nessun percorso specificato durante l'installazione dell'applicazione da file locale",
- "Archives of type %s are not supported" : "Gli archivi di tipo %s non sono supportati",
- "Failed to open archive when installing app" : "Apertura archivio non riuscita durante l'installazione dell'applicazione",
- "App does not provide an info.xml file" : "L'applicazione non fornisce un file info.xml",
- "App cannot be installed because appinfo file cannot be read." : "L'applicazione non può essere installata poiché il file appinfo non può essere letto.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma non può essere verificata. Contatta lo sviluppatore dell'applicazione e controlla la schermata di amministrazione.",
- "App can't be installed because of not allowed code in the App" : "L'applicazione non può essere installata a causa di codice non consentito al suo interno",
- "App can't be installed because it is not compatible with this version of the server" : "L'applicazione non può essere installata perché non è compatibile con questa versione del server",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'applicazione non può essere installata poiché contiene l'etichetta <shipped>true<shipped> che è consentita per le applicazioni native",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml non è la stessa riportata dall'app store",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Impostazioni server",
@@ -115,6 +101,51 @@ OC.L10N.register(
"Expiration date is in the past" : "La data di scadenza è nel passato",
"Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"",
+ "Sunday" : "Domenica",
+ "Monday" : "Lunedì",
+ "Tuesday" : "Martedì",
+ "Wednesday" : "Mercoledì",
+ "Thursday" : "Giovedì",
+ "Friday" : "Venerdì",
+ "Saturday" : "Sabato",
+ "Sun." : "Dom.",
+ "Mon." : "Lun.",
+ "Tue." : "Mar.",
+ "Wed." : "Mer.",
+ "Thu." : "Gio.",
+ "Fri." : "Ven.",
+ "Sat." : "Sab.",
+ "Su" : "Do",
+ "Mo" : "Lu",
+ "Tu" : "Ma",
+ "We" : "Me",
+ "Th" : "Gi",
+ "Fr" : "Ve",
+ "Sa" : "Sa",
+ "January" : "Gennaio",
+ "February" : "Febbraio",
+ "March" : "Marzo",
+ "April" : "Aprile",
+ "May" : "Maggio",
+ "June" : "Giugno",
+ "July" : "Luglio",
+ "August" : "Agosto",
+ "September" : "Settembre",
+ "October" : "Ottobre",
+ "November" : "Novembre",
+ "December" : "Dicembre",
+ "Jan." : "Gen.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Mag.",
+ "Jun." : "Giu.",
+ "Jul." : "Lug.",
+ "Aug." : "Ago.",
+ "Sep." : "Set.",
+ "Oct." : "Ott.",
+ "Nov." : "Nov.",
+ "Dec." : "Dic.",
"Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo i seguenti caratteri sono consentiti in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
@@ -127,7 +158,6 @@ OC.L10N.register(
"Personal" : "Personale",
"Users" : "Utenti",
"Admin" : "Admin",
- "Recommended" : "Consigliata",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "L'applicazione \"%s\" non può essere installata poiché il file appinfo non può essere letto.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione del server.",
"No app name specified" : "Il nome dell'applicazione non è specificato",
@@ -173,7 +203,24 @@ OC.L10N.register(
"Storage unauthorized. %s" : "Archiviazione non autorizzata. %s",
"Storage incomplete configuration. %s" : "Configurazione dell'archiviazione incompleta.%s",
"Storage connection error. %s" : "Errore di connessione all'archiviazione. %s",
+ "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
"Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
+ "App directory already exists" : "La cartella dell'applicazione esiste già",
+ "Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
+ "Archive does not contain a directory named %s" : "L'archivio non contiene una cartella con nome %s",
+ "No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
+ "No href specified when installing app from http" : "Nessun href specificato durante l'installazione dell'applicazione da http",
+ "No path specified when installing app from local file" : "Nessun percorso specificato durante l'installazione dell'applicazione da file locale",
+ "Archives of type %s are not supported" : "Gli archivi di tipo %s non sono supportati",
+ "Failed to open archive when installing app" : "Apertura archivio non riuscita durante l'installazione dell'applicazione",
+ "App does not provide an info.xml file" : "L'applicazione non fornisce un file info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "L'applicazione non può essere installata poiché il file appinfo non può essere letto.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma non può essere verificata. Contatta lo sviluppatore dell'applicazione e controlla la schermata di amministrazione.",
+ "App can't be installed because of not allowed code in the App" : "L'applicazione non può essere installata a causa di codice non consentito al suo interno",
+ "App can't be installed because it is not compatible with this version of the server" : "L'applicazione non può essere installata perché non è compatibile con questa versione del server",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'applicazione non può essere installata poiché contiene l'etichetta <shipped>true<shipped> che è consentita per le applicazioni native",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml non è la stessa riportata dall'app store",
+ "Recommended" : "Consigliata",
"Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.",
"Storage not available" : "Archiviazione non disponibile",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 9a72a8848f9..4e310444042 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -18,6 +18,7 @@
"Server version %s or lower is required." : "È richiesta la versione %s o precedente.",
"Unknown filetype" : "Tipo di file sconosciuto",
"Invalid image" : "Immagine non valida",
+ "Avatar image is not square" : "L'immagine personale non è quadrata",
"today" : "oggi",
"yesterday" : "ieri",
"_%n day ago_::_%n days ago_" : ["%d giorno fa","%n giorni fa"],
@@ -35,21 +36,6 @@
"File name is a reserved word" : "Il nome del file è una parola riservata",
"File name contains at least one invalid character" : "Il nome del file contiene almeno un carattere non valido",
"File name is too long" : "Il nome del file è troppo lungo",
- "App directory already exists" : "La cartella dell'applicazione esiste già",
- "Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
- "Archive does not contain a directory named %s" : "L'archivio non contiene una cartella con nome %s",
- "No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
- "No href specified when installing app from http" : "Nessun href specificato durante l'installazione dell'applicazione da http",
- "No path specified when installing app from local file" : "Nessun percorso specificato durante l'installazione dell'applicazione da file locale",
- "Archives of type %s are not supported" : "Gli archivi di tipo %s non sono supportati",
- "Failed to open archive when installing app" : "Apertura archivio non riuscita durante l'installazione dell'applicazione",
- "App does not provide an info.xml file" : "L'applicazione non fornisce un file info.xml",
- "App cannot be installed because appinfo file cannot be read." : "L'applicazione non può essere installata poiché il file appinfo non può essere letto.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma non può essere verificata. Contatta lo sviluppatore dell'applicazione e controlla la schermata di amministrazione.",
- "App can't be installed because of not allowed code in the App" : "L'applicazione non può essere installata a causa di codice non consentito al suo interno",
- "App can't be installed because it is not compatible with this version of the server" : "L'applicazione non può essere installata perché non è compatibile con questa versione del server",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'applicazione non può essere installata poiché contiene l'etichetta <shipped>true<shipped> che è consentita per le applicazioni native",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml non è la stessa riportata dall'app store",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Impostazioni server",
@@ -113,6 +99,51 @@
"Expiration date is in the past" : "La data di scadenza è nel passato",
"Cannot set expiration date more than %s days in the future" : "Impossibile impostare la data di scadenza a più di %s giorni nel futuro",
"Could not find category \"%s\"" : "Impossibile trovare la categoria \"%s\"",
+ "Sunday" : "Domenica",
+ "Monday" : "Lunedì",
+ "Tuesday" : "Martedì",
+ "Wednesday" : "Mercoledì",
+ "Thursday" : "Giovedì",
+ "Friday" : "Venerdì",
+ "Saturday" : "Sabato",
+ "Sun." : "Dom.",
+ "Mon." : "Lun.",
+ "Tue." : "Mar.",
+ "Wed." : "Mer.",
+ "Thu." : "Gio.",
+ "Fri." : "Ven.",
+ "Sat." : "Sab.",
+ "Su" : "Do",
+ "Mo" : "Lu",
+ "Tu" : "Ma",
+ "We" : "Me",
+ "Th" : "Gi",
+ "Fr" : "Ve",
+ "Sa" : "Sa",
+ "January" : "Gennaio",
+ "February" : "Febbraio",
+ "March" : "Marzo",
+ "April" : "Aprile",
+ "May" : "Maggio",
+ "June" : "Giugno",
+ "July" : "Luglio",
+ "August" : "Agosto",
+ "September" : "Settembre",
+ "October" : "Ottobre",
+ "November" : "Novembre",
+ "December" : "Dicembre",
+ "Jan." : "Gen.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Mag.",
+ "Jun." : "Giu.",
+ "Jul." : "Lug.",
+ "Aug." : "Ago.",
+ "Sep." : "Set.",
+ "Oct." : "Ott.",
+ "Nov." : "Nov.",
+ "Dec." : "Dic.",
"Apps" : "Applicazioni",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Solo i seguenti caratteri sono consentiti in un nome utente: \"a-z\", \"A-Z\", \"0-9\", e \"_.@-'\"",
"A valid username must be provided" : "Deve essere fornito un nome utente valido",
@@ -125,7 +156,6 @@
"Personal" : "Personale",
"Users" : "Utenti",
"Admin" : "Admin",
- "Recommended" : "Consigliata",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "L'applicazione \"%s\" non può essere installata poiché il file appinfo non può essere letto.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione del server.",
"No app name specified" : "Il nome dell'applicazione non è specificato",
@@ -171,7 +201,24 @@
"Storage unauthorized. %s" : "Archiviazione non autorizzata. %s",
"Storage incomplete configuration. %s" : "Configurazione dell'archiviazione incompleta.%s",
"Storage connection error. %s" : "Errore di connessione all'archiviazione. %s",
+ "Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
"Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
+ "App directory already exists" : "La cartella dell'applicazione esiste già",
+ "Can't create app folder. Please fix permissions. %s" : "Impossibile creare la cartella dell'applicazione. Correggi i permessi. %s",
+ "Archive does not contain a directory named %s" : "L'archivio non contiene una cartella con nome %s",
+ "No source specified when installing app" : "Nessuna fonte specificata durante l'installazione dell'applicazione",
+ "No href specified when installing app from http" : "Nessun href specificato durante l'installazione dell'applicazione da http",
+ "No path specified when installing app from local file" : "Nessun percorso specificato durante l'installazione dell'applicazione da file locale",
+ "Archives of type %s are not supported" : "Gli archivi di tipo %s non sono supportati",
+ "Failed to open archive when installing app" : "Apertura archivio non riuscita durante l'installazione dell'applicazione",
+ "App does not provide an info.xml file" : "L'applicazione non fornisce un file info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "L'applicazione non può essere installata poiché il file appinfo non può essere letto.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma non può essere verificata. Contatta lo sviluppatore dell'applicazione e controlla la schermata di amministrazione.",
+ "App can't be installed because of not allowed code in the App" : "L'applicazione non può essere installata a causa di codice non consentito al suo interno",
+ "App can't be installed because it is not compatible with this version of the server" : "L'applicazione non può essere installata perché non è compatibile con questa versione del server",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "L'applicazione non può essere installata poiché contiene l'etichetta <shipped>true<shipped> che è consentita per le applicazioni native",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml non è la stessa riportata dall'app store",
+ "Recommended" : "Consigliata",
"Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.",
"Storage not available" : "Archiviazione non disponibile",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index fcfb47dc8a7..b8a47cb094e 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -37,26 +37,14 @@ OC.L10N.register(
"File name is a reserved word" : "ファイル名が予約された単語です",
"File name contains at least one invalid character" : "ファイル名に1文字以上の無効な文字が含まれています",
"File name is too long" : "ファイル名が長すぎます",
- "App directory already exists" : "アプリディレクトリはすでに存在します",
- "Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
- "Archive does not contain a directory named %s" : "%s という名前のディレクトリは、アーカイブに含まれていません",
- "No source specified when installing app" : "アプリインストール時のソースが未指定",
- "No href specified when installing app from http" : "アプリインストール時のhttpの URL が未指定",
- "No path specified when installing app from local file" : "アプリインストール時のローカルファイルのパスが未指定",
- "Archives of type %s are not supported" : "\"%s\"タイプのアーカイブ形式は未サポート",
- "Failed to open archive when installing app" : "アプリをインストール中にアーカイブファイルを開けませんでした。",
- "App does not provide an info.xml file" : "アプリにinfo.xmlファイルが入っていません",
- "App cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリがインストールできません。",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "署名が確認できませんでした。このアプリの開発者へ連絡し、管理画面を確認してください。",
- "App can't be installed because of not allowed code in the App" : "アプリで許可されないコードが入っているのが原因でアプリがインストールできません",
- "App can't be installed because it is not compatible with this version of the server" : "アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "非shippedアプリには許可されない<shipped>true</shipped>タグが含まれているためにアプリをインストールできません。",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "info.xmlのバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "サーバー設定",
+ "Sharing" : "共有",
+ "Encryption" : "暗号化",
"Logging" : "ロギング",
"Additional settings" : "追加設定",
+ "Tips & tricks" : "ヒントとコツ",
"%s enter the database username and name." : "%s データベース名とデータベースのユーザー名を入力してください。",
"%s enter the database username." : "%s のデータベースのユーザー名を入力してください。",
"%s enter the database name." : "%s のデータベース名を入力してください。",
@@ -73,7 +61,7 @@ OC.L10N.register(
"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 は、32bit PHP 環境で動作しており、php.ini に open_basedir が設定されているようです。4GB以上のファイルで問題が発生するため、この設定を利用しないことをお勧めします。",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "php.ini から open_basedir 設定を削除するか、64bit PHPに切り替えてください。",
"Set an admin username." : "管理者のユーザー名を設定",
- "Set an admin password." : "管理者のパスワードを設定。",
+ "Set an admin password." : "管理者のパスワードを設定",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"%s shared »%s« with you" : "%sが あなたと »%s«を共有しました",
@@ -113,7 +101,7 @@ OC.L10N.register(
"Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
"Apps" : "アプリ",
- "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
"Username contains whitespace at the beginning or at the end" : "ユーザー名の最初か最後に空白が含まれています",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
@@ -124,7 +112,6 @@ OC.L10N.register(
"Personal" : "個人",
"Users" : "ユーザー",
"Admin" : "管理",
- "Recommended" : "おすすめ",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリ名 \"%s\" がインストールできません。",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "\"%s\" アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
"No app name specified" : "アプリ名が未指定",
@@ -151,13 +138,13 @@ OC.L10N.register(
"Adjusting this setting in php.ini will make Nextcloud run again" : "php.ini のこの設定を調整して、再度 Nextcloudを起動してください。",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload の値は \"0\" であるべきですが、\"%s\" に設定されています",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "この問題を修正するには、php.ini ファイルの <code>mbstring.func_overload</code> を <code>0</code> に設定してください。",
- "libxml2 2.7.0 is at least required. Currently %s is installed." : "最低バージョン 2.7.0 のlibxml2 が必要です。現在 %s がインストールされています。",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 バージョン 2.7.0 が最低必要です。現在 %s がインストールされています。",
"To fix this issue update your libxml2 version and restart your web server." : "この問題を解決するには、libxml2 を更新して、ウェブサーバーを再起動してください。",
"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." : "サーバー管理者にWebサーバーを再起動するよう依頼してください。",
- "PostgreSQL >= 9 required" : "PostgreSQL >= 9 が必要です",
+ "PostgreSQL >= 9 required" : "PostgreSQL 9以上が必要です",
"Please upgrade your database version" : "新しいバージョンのデータベースにアップグレードしてください",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "ディレクトリが他のユーザーから見えないように、パーミッションを 0770 に変更してください。",
"Data directory (%s) is readable by other users" : "データディレクトリ (%s) は他のユーザーも閲覧することができます",
@@ -169,7 +156,24 @@ OC.L10N.register(
"Storage unauthorized. %s" : "権限のないストレージです。 %s",
"Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s",
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
+ "Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
+ "App directory already exists" : "アプリディレクトリはすでに存在します",
+ "Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
+ "Archive does not contain a directory named %s" : "%s という名前のディレクトリは、アーカイブに含まれていません",
+ "No source specified when installing app" : "アプリインストール時のソースが未指定",
+ "No href specified when installing app from http" : "アプリインストール時のhttpの URL が未指定",
+ "No path specified when installing app from local file" : "アプリインストール時のローカルファイルのパスが未指定",
+ "Archives of type %s are not supported" : "\"%s\"タイプのアーカイブ形式は未サポート",
+ "Failed to open archive when installing app" : "アプリをインストール中にアーカイブファイルを開けませんでした。",
+ "App does not provide an info.xml file" : "アプリにinfo.xmlファイルが入っていません",
+ "App cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリがインストールできません。",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "署名が確認できませんでした。このアプリの開発者へ連絡し、管理画面を確認してください。",
+ "App can't be installed because of not allowed code in the App" : "アプリで許可されないコードが入っているのが原因でアプリがインストールできません",
+ "App can't be installed because it is not compatible with this version of the server" : "アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "非shippedアプリには許可されない<shipped>true</shipped>タグが含まれているためにアプリをインストールできません。",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "info.xmlのバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
+ "Recommended" : "おすすめ",
"Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。",
"Storage not available" : "ストレージが利用できません",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index b9f80698859..f6117c76723 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -35,26 +35,14 @@
"File name is a reserved word" : "ファイル名が予約された単語です",
"File name contains at least one invalid character" : "ファイル名に1文字以上の無効な文字が含まれています",
"File name is too long" : "ファイル名が長すぎます",
- "App directory already exists" : "アプリディレクトリはすでに存在します",
- "Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
- "Archive does not contain a directory named %s" : "%s という名前のディレクトリは、アーカイブに含まれていません",
- "No source specified when installing app" : "アプリインストール時のソースが未指定",
- "No href specified when installing app from http" : "アプリインストール時のhttpの URL が未指定",
- "No path specified when installing app from local file" : "アプリインストール時のローカルファイルのパスが未指定",
- "Archives of type %s are not supported" : "\"%s\"タイプのアーカイブ形式は未サポート",
- "Failed to open archive when installing app" : "アプリをインストール中にアーカイブファイルを開けませんでした。",
- "App does not provide an info.xml file" : "アプリにinfo.xmlファイルが入っていません",
- "App cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリがインストールできません。",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "署名が確認できませんでした。このアプリの開発者へ連絡し、管理画面を確認してください。",
- "App can't be installed because of not allowed code in the App" : "アプリで許可されないコードが入っているのが原因でアプリがインストールできません",
- "App can't be installed because it is not compatible with this version of the server" : "アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "非shippedアプリには許可されない<shipped>true</shipped>タグが含まれているためにアプリをインストールできません。",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "info.xmlのバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "サーバー設定",
+ "Sharing" : "共有",
+ "Encryption" : "暗号化",
"Logging" : "ロギング",
"Additional settings" : "追加設定",
+ "Tips & tricks" : "ヒントとコツ",
"%s enter the database username and name." : "%s データベース名とデータベースのユーザー名を入力してください。",
"%s enter the database username." : "%s のデータベースのユーザー名を入力してください。",
"%s enter the database name." : "%s のデータベース名を入力してください。",
@@ -71,7 +59,7 @@
"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 は、32bit PHP 環境で動作しており、php.ini に open_basedir が設定されているようです。4GB以上のファイルで問題が発生するため、この設定を利用しないことをお勧めします。",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "php.ini から open_basedir 設定を削除するか、64bit PHPに切り替えてください。",
"Set an admin username." : "管理者のユーザー名を設定",
- "Set an admin password." : "管理者のパスワードを設定。",
+ "Set an admin password." : "管理者のパスワードを設定",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
"%s shared »%s« with you" : "%sが あなたと »%s«を共有しました",
@@ -111,7 +99,7 @@
"Cannot set expiration date more than %s days in the future" : "有効期限を%s日以降に設定できません。",
"Could not find category \"%s\"" : "カテゴリ \"%s\" が見つかりませんでした",
"Apps" : "アプリ",
- "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-\"",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "ユーザー名で利用できる文字列は、次のものです: \"a-z\", \"A-Z\", \"0-9\", \"_.@-\"",
"A valid username must be provided" : "有効なユーザー名を指定する必要があります",
"Username contains whitespace at the beginning or at the end" : "ユーザー名の最初か最後に空白が含まれています",
"A valid password must be provided" : "有効なパスワードを指定する必要があります",
@@ -122,7 +110,6 @@
"Personal" : "個人",
"Users" : "ユーザー",
"Admin" : "管理",
- "Recommended" : "おすすめ",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリ名 \"%s\" がインストールできません。",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "\"%s\" アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
"No app name specified" : "アプリ名が未指定",
@@ -149,13 +136,13 @@
"Adjusting this setting in php.ini will make Nextcloud run again" : "php.ini のこの設定を調整して、再度 Nextcloudを起動してください。",
"mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload の値は \"0\" であるべきですが、\"%s\" に設定されています",
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "この問題を修正するには、php.ini ファイルの <code>mbstring.func_overload</code> を <code>0</code> に設定してください。",
- "libxml2 2.7.0 is at least required. Currently %s is installed." : "最低バージョン 2.7.0 のlibxml2 が必要です。現在 %s がインストールされています。",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 バージョン 2.7.0 が最低必要です。現在 %s がインストールされています。",
"To fix this issue update your libxml2 version and restart your web server." : "この問題を解決するには、libxml2 を更新して、ウェブサーバーを再起動してください。",
"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." : "サーバー管理者にWebサーバーを再起動するよう依頼してください。",
- "PostgreSQL >= 9 required" : "PostgreSQL >= 9 が必要です",
+ "PostgreSQL >= 9 required" : "PostgreSQL 9以上が必要です",
"Please upgrade your database version" : "新しいバージョンのデータベースにアップグレードしてください",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "ディレクトリが他のユーザーから見えないように、パーミッションを 0770 に変更してください。",
"Data directory (%s) is readable by other users" : "データディレクトリ (%s) は他のユーザーも閲覧することができます",
@@ -167,7 +154,24 @@
"Storage unauthorized. %s" : "権限のないストレージです。 %s",
"Storage incomplete configuration. %s" : "設定が未完了のストレージです。 %s",
"Storage connection error. %s" : "ストレージへの接続エラー。 %s",
+ "Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
+ "App directory already exists" : "アプリディレクトリはすでに存在します",
+ "Can't create app folder. Please fix permissions. %s" : "アプリフォルダーを作成できませんでした。%s のパーミッションを修正してください。",
+ "Archive does not contain a directory named %s" : "%s という名前のディレクトリは、アーカイブに含まれていません",
+ "No source specified when installing app" : "アプリインストール時のソースが未指定",
+ "No href specified when installing app from http" : "アプリインストール時のhttpの URL が未指定",
+ "No path specified when installing app from local file" : "アプリインストール時のローカルファイルのパスが未指定",
+ "Archives of type %s are not supported" : "\"%s\"タイプのアーカイブ形式は未サポート",
+ "Failed to open archive when installing app" : "アプリをインストール中にアーカイブファイルを開けませんでした。",
+ "App does not provide an info.xml file" : "アプリにinfo.xmlファイルが入っていません",
+ "App cannot be installed because appinfo file cannot be read." : "appinfoファイルが読み込めないため、アプリがインストールできません。",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "署名が確認できませんでした。このアプリの開発者へ連絡し、管理画面を確認してください。",
+ "App can't be installed because of not allowed code in the App" : "アプリで許可されないコードが入っているのが原因でアプリがインストールできません",
+ "App can't be installed because it is not compatible with this version of the server" : "アプリは、このバージョンのサーバーと互換性がないためインストールされませんでした。",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "非shippedアプリには許可されない<shipped>true</shipped>タグが含まれているためにアプリをインストールできません。",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "info.xmlのバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
+ "Recommended" : "おすすめ",
"Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。",
"Storage not available" : "ストレージが利用できません",
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index 9e4b13ef669..b66d75a267e 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -37,21 +37,6 @@ OC.L10N.register(
"File name is a reserved word" : "Filnavnet er et reservert ord",
"File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn",
"File name is too long" : "Filnavnet er for langt",
- "App directory already exists" : "App-mappe finnes allerede",
- "Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
- "Archive does not contain a directory named %s" : "Arkivet inneholder ikke en mappe med navn %s",
- "No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
- "No href specified when installing app from http" : "Ingen href spesifisert ved installering av app fra http",
- "No path specified when installing app from local file" : "Ingen sti spesifisert ved installering av app fra lokal fil",
- "Archives of type %s are not supported" : "Arkiver av type %s støttes ikke",
- "Failed to open archive when installing app" : "Klarte ikke å åpne arkiv ved installering av app",
- "App does not provide an info.xml file" : "App-en inneholder ikke filen info.xml",
- "App cannot be installed because appinfo file cannot be read." : "App kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur kunne ikke sjekkes. Kontakt app-utvikleren og sjekk admin-bildet.",
- "App can't be installed because of not allowed code in the App" : "App kan ikke installeres på grunn av ulovlig kode i appen.",
- "App can't be installed because it is not compatible with this version of the server" : "Appen kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "App kan ikke installeres fordi den er merket med <shipped>true</shipped> som ikke er tillatt for apper som ikke leveres med systemet",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml ikke er den samme som versjonen som rapporteres fra app-butikken",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Tjenerinnstillinger",
@@ -115,6 +100,51 @@ OC.L10N.register(
"Expiration date is in the past" : "Utløpsdato er tilbake i tid",
"Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"",
+ "Sunday" : "Søndag",
+ "Monday" : "Mandag",
+ "Tuesday" : "Tirsdag",
+ "Wednesday" : "Onsdag",
+ "Thursday" : "Torsdag",
+ "Friday" : "Fredag",
+ "Saturday" : "Lørdag",
+ "Sun." : "Søn.",
+ "Mon." : "Man.",
+ "Tue." : "Tir.",
+ "Wed." : "Ons.",
+ "Thu." : "Tirs.",
+ "Fri." : "Fre.",
+ "Sat." : "Lør.",
+ "Su" : "Sø",
+ "Mo" : "Ma",
+ "Tu" : "Ti",
+ "We" : "On",
+ "Th" : "To",
+ "Fr" : "Fr",
+ "Sa" : "Lø",
+ "January" : "Januar",
+ "February" : "Februar",
+ "March" : "Mars",
+ "April" : "April",
+ "May" : "Mai",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "August",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "Desember",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Mai.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Des.",
"Apps" : "Apper",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-'\"",
"A valid username must be provided" : "Oppgi et gyldig brukernavn",
@@ -127,7 +157,6 @@ OC.L10N.register(
"Personal" : "Personlig",
"Users" : "Brukere",
"Admin" : "Admin",
- "Recommended" : "Anbefalt",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Appen \"%s\" kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Appen \"%s\" kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
"No app name specified" : "Intet app-navn spesifisert",
@@ -173,7 +202,24 @@ OC.L10N.register(
"Storage unauthorized. %s" : "Lager uautorisert: %s",
"Storage incomplete configuration. %s" : "Ikke komplett oppsett for lager. %s",
"Storage connection error. %s" : "Tilkoblingsfeil for lager. %s",
+ "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
"Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s",
+ "App directory already exists" : "App-mappe finnes allerede",
+ "Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
+ "Archive does not contain a directory named %s" : "Arkivet inneholder ikke en mappe med navn %s",
+ "No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
+ "No href specified when installing app from http" : "Ingen href spesifisert ved installering av app fra http",
+ "No path specified when installing app from local file" : "Ingen sti spesifisert ved installering av app fra lokal fil",
+ "Archives of type %s are not supported" : "Arkiver av type %s støttes ikke",
+ "Failed to open archive when installing app" : "Klarte ikke å åpne arkiv ved installering av app",
+ "App does not provide an info.xml file" : "App-en inneholder ikke filen info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "App kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur kunne ikke sjekkes. Kontakt app-utvikleren og sjekk admin-bildet.",
+ "App can't be installed because of not allowed code in the App" : "App kan ikke installeres på grunn av ulovlig kode i appen.",
+ "App can't be installed because it is not compatible with this version of the server" : "Appen kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "App kan ikke installeres fordi den er merket med <shipped>true</shipped> som ikke er tillatt for apper som ikke leveres med systemet",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml ikke er den samme som versjonen som rapporteres fra app-butikken",
+ "Recommended" : "Anbefalt",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.",
"Storage not available" : "Lagringsplass ikke tilgjengelig",
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index f61d84cd4c3..45f168b8275 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -35,21 +35,6 @@
"File name is a reserved word" : "Filnavnet er et reservert ord",
"File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn",
"File name is too long" : "Filnavnet er for langt",
- "App directory already exists" : "App-mappe finnes allerede",
- "Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
- "Archive does not contain a directory named %s" : "Arkivet inneholder ikke en mappe med navn %s",
- "No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
- "No href specified when installing app from http" : "Ingen href spesifisert ved installering av app fra http",
- "No path specified when installing app from local file" : "Ingen sti spesifisert ved installering av app fra lokal fil",
- "Archives of type %s are not supported" : "Arkiver av type %s støttes ikke",
- "Failed to open archive when installing app" : "Klarte ikke å åpne arkiv ved installering av app",
- "App does not provide an info.xml file" : "App-en inneholder ikke filen info.xml",
- "App cannot be installed because appinfo file cannot be read." : "App kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur kunne ikke sjekkes. Kontakt app-utvikleren og sjekk admin-bildet.",
- "App can't be installed because of not allowed code in the App" : "App kan ikke installeres på grunn av ulovlig kode i appen.",
- "App can't be installed because it is not compatible with this version of the server" : "Appen kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "App kan ikke installeres fordi den er merket med <shipped>true</shipped> som ikke er tillatt for apper som ikke leveres med systemet",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml ikke er den samme som versjonen som rapporteres fra app-butikken",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Tjenerinnstillinger",
@@ -113,6 +98,51 @@
"Expiration date is in the past" : "Utløpsdato er tilbake i tid",
"Cannot set expiration date more than %s days in the future" : "Kan ikke sette utløpsdato mer enn %s dager fram i tid",
"Could not find category \"%s\"" : "Kunne ikke finne kategori \"%s\"",
+ "Sunday" : "Søndag",
+ "Monday" : "Mandag",
+ "Tuesday" : "Tirsdag",
+ "Wednesday" : "Onsdag",
+ "Thursday" : "Torsdag",
+ "Friday" : "Fredag",
+ "Saturday" : "Lørdag",
+ "Sun." : "Søn.",
+ "Mon." : "Man.",
+ "Tue." : "Tir.",
+ "Wed." : "Ons.",
+ "Thu." : "Tirs.",
+ "Fri." : "Fre.",
+ "Sat." : "Lør.",
+ "Su" : "Sø",
+ "Mo" : "Ma",
+ "Tu" : "Ti",
+ "We" : "On",
+ "Th" : "To",
+ "Fr" : "Fr",
+ "Sa" : "Lø",
+ "January" : "Januar",
+ "February" : "Februar",
+ "March" : "Mars",
+ "April" : "April",
+ "May" : "Mai",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "August",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "Desember",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Mai.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Des.",
"Apps" : "Apper",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Bare disse tegnene tillates i et brukernavn: \"a-z\", \"A-Z\", \"0-9\" og \"_.@-'\"",
"A valid username must be provided" : "Oppgi et gyldig brukernavn",
@@ -125,7 +155,6 @@
"Personal" : "Personlig",
"Users" : "Brukere",
"Admin" : "Admin",
- "Recommended" : "Anbefalt",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Appen \"%s\" kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Appen \"%s\" kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
"No app name specified" : "Intet app-navn spesifisert",
@@ -171,7 +200,24 @@
"Storage unauthorized. %s" : "Lager uautorisert: %s",
"Storage incomplete configuration. %s" : "Ikke komplett oppsett for lager. %s",
"Storage connection error. %s" : "Tilkoblingsfeil for lager. %s",
+ "Storage is temporarily not available" : "Lagring er midlertidig utilgjengelig",
"Storage connection timeout. %s" : "Tidsavbrudd ved tilkobling av lager: %s",
+ "App directory already exists" : "App-mappe finnes allerede",
+ "Can't create app folder. Please fix permissions. %s" : "Kan ikke opprette app-mappe. Vennligst ordne opp i tillatelser. %s",
+ "Archive does not contain a directory named %s" : "Arkivet inneholder ikke en mappe med navn %s",
+ "No source specified when installing app" : "Ingen kilde spesifisert ved installering av app",
+ "No href specified when installing app from http" : "Ingen href spesifisert ved installering av app fra http",
+ "No path specified when installing app from local file" : "Ingen sti spesifisert ved installering av app fra lokal fil",
+ "Archives of type %s are not supported" : "Arkiver av type %s støttes ikke",
+ "Failed to open archive when installing app" : "Klarte ikke å åpne arkiv ved installering av app",
+ "App does not provide an info.xml file" : "App-en inneholder ikke filen info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "App kan ikke installeres på grunn av at appinfo filen ikke kan leses.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur kunne ikke sjekkes. Kontakt app-utvikleren og sjekk admin-bildet.",
+ "App can't be installed because of not allowed code in the App" : "App kan ikke installeres på grunn av ulovlig kode i appen.",
+ "App can't be installed because it is not compatible with this version of the server" : "Appen kan ikke installere fordi den ikke er kompatibel med denne tjenerversjonen.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "App kan ikke installeres fordi den er merket med <shipped>true</shipped> som ikke er tillatt for apper som ikke leveres med systemet",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml ikke er den samme som versjonen som rapporteres fra app-butikken",
+ "Recommended" : "Anbefalt",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.",
"Storage not available" : "Lagringsplass ikke tilgjengelig",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index c19054d8a47..f44511d8cb2 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -38,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Bestandsnaam is een gereserveerd woord",
"File name contains at least one invalid character" : "De bestandsnaam bevat in ieder geval één verboden teken",
"File name is too long" : "De bestandsnaam is te lang",
- "App directory already exists" : "App directory bestaat al",
- "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
- "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s",
- "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
- "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http",
- "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand",
- "Archives of type %s are not supported" : "Archiefbestanden van type %s niet ondersteund",
- "Failed to open archive when installing app" : "Kon archiefbestand bij installatie van de app niet openen",
- "App does not provide an info.xml file" : "De app heeft geen info.xml bestand",
- "App cannot be installed because appinfo file cannot be read." : "App kan niet worden geïnstalleerd, omdat appinfo bestand niet gelezen kan worden.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Handtekening kon niet worden geverifieerd. Nee contact op met de ontwikkelaar van de app en check je beheerscherm.",
- "App can't be installed because of not allowed code in the App" : "De app kan niet worden geïnstalleerd wegens onjuiste code in de app",
- "App can't be installed because it is not compatible with this version of the server" : "De app kan niet worden geïnstalleerd, omdat die niet compatible is met deze versie van de server",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "De app kan niet worden geïnstalleerd, omdat het de <shipped>true</shipped> markering bevat die niet is toegestaan voor niet gepubliceerde apps",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml niet dezelfde is als de versie zoals die in de app store staat vermeld",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Serverinstellingen",
@@ -116,14 +101,51 @@ OC.L10N.register(
"Expiration date is in the past" : "De vervaldatum ligt in het verleden",
"Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden",
+ "Sunday" : "Zondag",
"Monday" : "maandag",
+ "Tuesday" : "Dinsdag",
+ "Wednesday" : "Woensdag",
+ "Thursday" : "Donderdag",
+ "Friday" : "Vrijdag",
+ "Saturday" : "Zaterdag",
+ "Sun." : "Zon.",
"Mon." : "Maa.",
+ "Tue." : "Di.",
+ "Wed." : "Wo.",
+ "Thu." : "Do.",
+ "Fri." : "Vri.",
"Sat." : "Zat.",
"Su" : "Zo",
+ "Mo" : "Ma",
+ "Tu" : "Di",
+ "We" : "Wo",
+ "Th" : "Do",
"Fr" : "Vr",
"Sa" : "Za",
+ "January" : "Januari",
+ "February" : "Februari",
+ "March" : "Maart",
+ "April" : "April",
"May" : "mei",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "Augustus",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mrt.",
+ "Apr." : "Apr.",
+ "May." : "Mei",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
"Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", en \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
@@ -136,7 +158,6 @@ OC.L10N.register(
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Admin" : "Beheerder",
- "Recommended" : "Aanbevolen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" kan niet worden geïnstalleerd, omdat het appinfo bestand niet gelezen kan worden.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van de server.",
"No app name specified" : "Geen app naam opgegeven.",
@@ -184,6 +205,22 @@ OC.L10N.register(
"Storage connection error. %s" : "Opslagverbindingsfout. %s",
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Storage connection timeout. %s" : "Opslagverbinding time-out. %s",
+ "App directory already exists" : "App directory bestaat al",
+ "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
+ "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s",
+ "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
+ "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http",
+ "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand",
+ "Archives of type %s are not supported" : "Archiefbestanden van type %s niet ondersteund",
+ "Failed to open archive when installing app" : "Kon archiefbestand bij installatie van de app niet openen",
+ "App does not provide an info.xml file" : "De app heeft geen info.xml bestand",
+ "App cannot be installed because appinfo file cannot be read." : "App kan niet worden geïnstalleerd, omdat appinfo bestand niet gelezen kan worden.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Handtekening kon niet worden geverifieerd. Nee contact op met de ontwikkelaar van de app en check je beheerscherm.",
+ "App can't be installed because of not allowed code in the App" : "De app kan niet worden geïnstalleerd wegens onjuiste code in de app",
+ "App can't be installed because it is not compatible with this version of the server" : "De app kan niet worden geïnstalleerd, omdat die niet compatible is met deze versie van de server",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "De app kan niet worden geïnstalleerd, omdat het de <shipped>true</shipped> markering bevat die niet is toegestaan voor niet gepubliceerde apps",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml niet dezelfde is als de versie zoals die in de app store staat vermeld",
+ "Recommended" : "Aanbevolen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.",
"Storage not available" : "Opslag niet beschikbaar",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 41ab28b0c9b..1cdd9430893 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -36,21 +36,6 @@
"File name is a reserved word" : "Bestandsnaam is een gereserveerd woord",
"File name contains at least one invalid character" : "De bestandsnaam bevat in ieder geval één verboden teken",
"File name is too long" : "De bestandsnaam is te lang",
- "App directory already exists" : "App directory bestaat al",
- "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
- "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s",
- "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
- "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http",
- "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand",
- "Archives of type %s are not supported" : "Archiefbestanden van type %s niet ondersteund",
- "Failed to open archive when installing app" : "Kon archiefbestand bij installatie van de app niet openen",
- "App does not provide an info.xml file" : "De app heeft geen info.xml bestand",
- "App cannot be installed because appinfo file cannot be read." : "App kan niet worden geïnstalleerd, omdat appinfo bestand niet gelezen kan worden.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Handtekening kon niet worden geverifieerd. Nee contact op met de ontwikkelaar van de app en check je beheerscherm.",
- "App can't be installed because of not allowed code in the App" : "De app kan niet worden geïnstalleerd wegens onjuiste code in de app",
- "App can't be installed because it is not compatible with this version of the server" : "De app kan niet worden geïnstalleerd, omdat die niet compatible is met deze versie van de server",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "De app kan niet worden geïnstalleerd, omdat het de <shipped>true</shipped> markering bevat die niet is toegestaan voor niet gepubliceerde apps",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml niet dezelfde is als de versie zoals die in de app store staat vermeld",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Serverinstellingen",
@@ -114,14 +99,51 @@
"Expiration date is in the past" : "De vervaldatum ligt in het verleden",
"Cannot set expiration date more than %s days in the future" : "Kan vervaldatum niet verder dan %s dagen in de toekomst instellen",
"Could not find category \"%s\"" : "Kon categorie \"%s\" niet vinden",
+ "Sunday" : "Zondag",
"Monday" : "maandag",
+ "Tuesday" : "Dinsdag",
+ "Wednesday" : "Woensdag",
+ "Thursday" : "Donderdag",
+ "Friday" : "Vrijdag",
+ "Saturday" : "Zaterdag",
+ "Sun." : "Zon.",
"Mon." : "Maa.",
+ "Tue." : "Di.",
+ "Wed." : "Wo.",
+ "Thu." : "Do.",
+ "Fri." : "Vri.",
"Sat." : "Zat.",
"Su" : "Zo",
+ "Mo" : "Ma",
+ "Tu" : "Di",
+ "We" : "Wo",
+ "Th" : "Do",
"Fr" : "Vr",
"Sa" : "Za",
+ "January" : "Januari",
+ "February" : "Februari",
+ "March" : "Maart",
+ "April" : "April",
"May" : "mei",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "Augustus",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mrt.",
+ "Apr." : "Apr.",
+ "May." : "Mei",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
"Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
"Apps" : "Apps",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Alleen de volgende tekens zijn toegestaan in een gebruikersnaam: \"a-z\", \"A-Z\", \"0-9\", en \"_.@-\"",
"A valid username must be provided" : "Er moet een geldige gebruikersnaam worden opgegeven",
@@ -134,7 +156,6 @@
"Personal" : "Persoonlijk",
"Users" : "Gebruikers",
"Admin" : "Beheerder",
- "Recommended" : "Aanbevolen",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "App \"%s\" kan niet worden geïnstalleerd, omdat het appinfo bestand niet gelezen kan worden.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van de server.",
"No app name specified" : "Geen app naam opgegeven.",
@@ -182,6 +203,22 @@
"Storage connection error. %s" : "Opslagverbindingsfout. %s",
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Storage connection timeout. %s" : "Opslagverbinding time-out. %s",
+ "App directory already exists" : "App directory bestaat al",
+ "Can't create app folder. Please fix permissions. %s" : "Kan de app map niet aanmaken, Herstel de permissies. %s",
+ "Archive does not contain a directory named %s" : "Archief bevat geen directory genaamd %s",
+ "No source specified when installing app" : "Geen bron opgegeven bij installatie van de app",
+ "No href specified when installing app from http" : "Geen href opgegeven bij installeren van de app vanaf http",
+ "No path specified when installing app from local file" : "Geen pad opgegeven bij installeren van de app vanaf een lokaal bestand",
+ "Archives of type %s are not supported" : "Archiefbestanden van type %s niet ondersteund",
+ "Failed to open archive when installing app" : "Kon archiefbestand bij installatie van de app niet openen",
+ "App does not provide an info.xml file" : "De app heeft geen info.xml bestand",
+ "App cannot be installed because appinfo file cannot be read." : "App kan niet worden geïnstalleerd, omdat appinfo bestand niet gelezen kan worden.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Handtekening kon niet worden geverifieerd. Nee contact op met de ontwikkelaar van de app en check je beheerscherm.",
+ "App can't be installed because of not allowed code in the App" : "De app kan niet worden geïnstalleerd wegens onjuiste code in de app",
+ "App can't be installed because it is not compatible with this version of the server" : "De app kan niet worden geïnstalleerd, omdat die niet compatible is met deze versie van de server",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "De app kan niet worden geïnstalleerd, omdat het de <shipped>true</shipped> markering bevat die niet is toegestaan voor niet gepubliceerde apps",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml niet dezelfde is als de versie zoals die in de app store staat vermeld",
+ "Recommended" : "Aanbevolen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.",
"Storage not available" : "Opslag niet beschikbaar",
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index b59eedbf4b6..2832236cf2a 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -34,18 +34,6 @@ OC.L10N.register(
"File name is a reserved word" : "Nazwa pliku jest zarezerwowana",
"File name contains at least one invalid character" : "Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak",
"File name is too long" : "Nazwa pliku zbyt długa",
- "App directory already exists" : "Katalog aplikacji już isnieje",
- "Can't create app folder. Please fix permissions. %s" : "Nie mogę utworzyć katalogu aplikacji. Proszę popraw uprawnienia. %s",
- "Archive does not contain a directory named %s" : "Archiwum nie zawiera ścieżki o nazwie %s",
- "No source specified when installing app" : "Nie określono źródła podczas instalacji aplikacji",
- "No href specified when installing app from http" : "Nie określono linku skąd aplikacja ma być zainstalowana",
- "No path specified when installing app from local file" : "Nie określono lokalnego pliku z którego miała być instalowana aplikacja",
- "Archives of type %s are not supported" : "Typ archiwum %s nie jest obsługiwany",
- "Failed to open archive when installing app" : "Nie udało się otworzyć archiwum podczas instalacji aplikacji",
- "App does not provide an info.xml file" : "Aplikacja nie posiada pliku info.xml",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Sygnatura nie mogła zostać sprawdzona. Proszę o skontaktownie się z twórcą aplikacji i sprawdzenie panelu administratora.",
- "App can't be installed because of not allowed code in the App" : "Aplikacja nie może być zainstalowany ponieważ nie dopuszcza kod w aplikacji",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacja nie może być zainstalowana ponieważ true tag nie jest <shipped>true</shipped> , co nie jest dozwolone dla aplikacji nie wysłanych",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Ustawienia serwera",
@@ -150,7 +138,6 @@ OC.L10N.register(
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
"Admin" : "Administrator",
- "Recommended" : "Polecane",
"No app name specified" : "Nie określono nazwy aplikacji",
"App '%s' could not be installed!" : "Aplikacja '%s' nie mogła zostać zainstalowana!",
"File is currently busy, please try again later" : "Plik jest obecnie niedostępny, proszę spróbować ponownie później",
@@ -179,6 +166,19 @@ OC.L10N.register(
"Data directory (%s) is invalid" : "Katalog danych (%s) jest nieprawidłowy",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Sprawdź, czy katalog danych zawiera plik \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Nie można uzyskać blokady typu %d na \"%s\".",
+ "App directory already exists" : "Katalog aplikacji już isnieje",
+ "Can't create app folder. Please fix permissions. %s" : "Nie mogę utworzyć katalogu aplikacji. Proszę popraw uprawnienia. %s",
+ "Archive does not contain a directory named %s" : "Archiwum nie zawiera ścieżki o nazwie %s",
+ "No source specified when installing app" : "Nie określono źródła podczas instalacji aplikacji",
+ "No href specified when installing app from http" : "Nie określono linku skąd aplikacja ma być zainstalowana",
+ "No path specified when installing app from local file" : "Nie określono lokalnego pliku z którego miała być instalowana aplikacja",
+ "Archives of type %s are not supported" : "Typ archiwum %s nie jest obsługiwany",
+ "Failed to open archive when installing app" : "Nie udało się otworzyć archiwum podczas instalacji aplikacji",
+ "App does not provide an info.xml file" : "Aplikacja nie posiada pliku info.xml",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Sygnatura nie mogła zostać sprawdzona. Proszę o skontaktownie się z twórcą aplikacji i sprawdzenie panelu administratora.",
+ "App can't be installed because of not allowed code in the App" : "Aplikacja nie może być zainstalowany ponieważ nie dopuszcza kod w aplikacji",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacja nie może być zainstalowana ponieważ true tag nie jest <shipped>true</shipped> , co nie jest dozwolone dla aplikacji nie wysłanych",
+ "Recommended" : "Polecane",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana",
"Storage not available" : "Pamięć nie dostępna",
"ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index 0fc32976995..89b1d8a6ef2 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -32,18 +32,6 @@
"File name is a reserved word" : "Nazwa pliku jest zarezerwowana",
"File name contains at least one invalid character" : "Nazwa pliku zawiera co najmniej jeden nieprawidłowy znak",
"File name is too long" : "Nazwa pliku zbyt długa",
- "App directory already exists" : "Katalog aplikacji już isnieje",
- "Can't create app folder. Please fix permissions. %s" : "Nie mogę utworzyć katalogu aplikacji. Proszę popraw uprawnienia. %s",
- "Archive does not contain a directory named %s" : "Archiwum nie zawiera ścieżki o nazwie %s",
- "No source specified when installing app" : "Nie określono źródła podczas instalacji aplikacji",
- "No href specified when installing app from http" : "Nie określono linku skąd aplikacja ma być zainstalowana",
- "No path specified when installing app from local file" : "Nie określono lokalnego pliku z którego miała być instalowana aplikacja",
- "Archives of type %s are not supported" : "Typ archiwum %s nie jest obsługiwany",
- "Failed to open archive when installing app" : "Nie udało się otworzyć archiwum podczas instalacji aplikacji",
- "App does not provide an info.xml file" : "Aplikacja nie posiada pliku info.xml",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Sygnatura nie mogła zostać sprawdzona. Proszę o skontaktownie się z twórcą aplikacji i sprawdzenie panelu administratora.",
- "App can't be installed because of not allowed code in the App" : "Aplikacja nie może być zainstalowany ponieważ nie dopuszcza kod w aplikacji",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacja nie może być zainstalowana ponieważ true tag nie jest <shipped>true</shipped> , co nie jest dozwolone dla aplikacji nie wysłanych",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Ustawienia serwera",
@@ -148,7 +136,6 @@
"Personal" : "Osobiste",
"Users" : "Użytkownicy",
"Admin" : "Administrator",
- "Recommended" : "Polecane",
"No app name specified" : "Nie określono nazwy aplikacji",
"App '%s' could not be installed!" : "Aplikacja '%s' nie mogła zostać zainstalowana!",
"File is currently busy, please try again later" : "Plik jest obecnie niedostępny, proszę spróbować ponownie później",
@@ -177,6 +164,19 @@
"Data directory (%s) is invalid" : "Katalog danych (%s) jest nieprawidłowy",
"Please check that the data directory contains a file \".ocdata\" in its root." : "Sprawdź, czy katalog danych zawiera plik \".ocdata\".",
"Could not obtain lock type %d on \"%s\"." : "Nie można uzyskać blokady typu %d na \"%s\".",
+ "App directory already exists" : "Katalog aplikacji już isnieje",
+ "Can't create app folder. Please fix permissions. %s" : "Nie mogę utworzyć katalogu aplikacji. Proszę popraw uprawnienia. %s",
+ "Archive does not contain a directory named %s" : "Archiwum nie zawiera ścieżki o nazwie %s",
+ "No source specified when installing app" : "Nie określono źródła podczas instalacji aplikacji",
+ "No href specified when installing app from http" : "Nie określono linku skąd aplikacja ma być zainstalowana",
+ "No path specified when installing app from local file" : "Nie określono lokalnego pliku z którego miała być instalowana aplikacja",
+ "Archives of type %s are not supported" : "Typ archiwum %s nie jest obsługiwany",
+ "Failed to open archive when installing app" : "Nie udało się otworzyć archiwum podczas instalacji aplikacji",
+ "App does not provide an info.xml file" : "Aplikacja nie posiada pliku info.xml",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Sygnatura nie mogła zostać sprawdzona. Proszę o skontaktownie się z twórcą aplikacji i sprawdzenie panelu administratora.",
+ "App can't be installed because of not allowed code in the App" : "Aplikacja nie może być zainstalowany ponieważ nie dopuszcza kod w aplikacji",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacja nie może być zainstalowana ponieważ true tag nie jest <shipped>true</shipped> , co nie jest dozwolone dla aplikacji nie wysłanych",
+ "Recommended" : "Polecane",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana",
"Storage not available" : "Pamięć nie dostępna",
"ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 256032f17f8..00cf3969e22 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"lib",
{
"Cannot write into \"config\" directory!" : "Запись в каталог \"config\" невозможна!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить предоставив веб-серверу права на запись в каталоге конфигурации",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации",
"See %s" : "Смотрите %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
@@ -20,6 +20,7 @@ OC.L10N.register(
"Server version %s or lower is required." : "Требуется сервер версии %s или ниже.",
"Unknown filetype" : "Неизвестный тип файла",
"Invalid image" : "Изображение повреждено",
+ "Avatar image is not square" : "Изображение аватара не квадратное",
"today" : "сегодня",
"yesterday" : "вчера",
"_%n day ago_::_%n days ago_" : ["%n день назад","%n дня назад","%n дней назад","%n дней назад"],
@@ -37,21 +38,6 @@ OC.L10N.register(
"File name is a reserved word" : "Имя файла является зарезервированным словом",
"File name contains at least one invalid character" : "Имя файла содержит по крайней мере один некорректный символ",
"File name is too long" : "Имя файла слишком длинное.",
- "App directory already exists" : "Каталог приложения уже существует",
- "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
- "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
- "No source specified when installing app" : "Не указан источник при установке приложения",
- "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
- "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
- "Archives of type %s are not supported" : "Архивы %s не поддерживаются",
- "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения",
- "App does not provide an info.xml file" : "Приложение не имеет файла info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Приложение не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.",
- "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.",
- "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Настройки сервера",
@@ -100,7 +86,7 @@ OC.L10N.register(
"Setting permissions for %s failed, because the item was not found" : "Не удалось настроить права доступа для %s, элемент не найден.",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Невозможно установить дату истечения. Общие ресурсы не могут устареть позже %s с момента их публикации.",
"Cannot set expiration date. Expiration date is in the past" : "Невозможно установить дату окончания. Дата окончания в прошлом.",
- "Cannot clear expiration date. Shares are required to have an expiration date." : "Не могу очистить дату истечения срока действия. Общие ресурсы должны иметь срок годности.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Невозможно очистить дату истечения срока действия. Общие ресурсы должны иметь срок годности.",
"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 не найден",
@@ -115,6 +101,51 @@ OC.L10N.register(
"Expiration date is in the past" : "Дата окончания срока действия уже прошла",
"Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"Could not find category \"%s\"" : "Категория \"%s\" не найдена",
+ "Sunday" : "Воскресенье",
+ "Monday" : "Понедельник",
+ "Tuesday" : "Вторник",
+ "Wednesday" : "Среда",
+ "Thursday" : "Четверг",
+ "Friday" : "Пятница",
+ "Saturday" : "Суббота",
+ "Sun." : "Вс.",
+ "Mon." : "Пн.",
+ "Tue." : "Вт.",
+ "Wed." : "Ср.",
+ "Thu." : "Чт.",
+ "Fri." : "Пт.",
+ "Sat." : "Сб.",
+ "Su" : "Вс",
+ "Mo" : "Пн",
+ "Tu" : "Вт",
+ "We" : "Ср",
+ "Th" : "Чт",
+ "Fr" : "Пт",
+ "Sa" : "Сб",
+ "January" : "Январь",
+ "February" : "Февраль",
+ "March" : "Март",
+ "April" : "Апрель",
+ "May" : "Май",
+ "June" : "Июнь",
+ "July" : "Июль",
+ "August" : "Август",
+ "September" : "Сентябрь",
+ "October" : "Октябрь",
+ "November" : "Ноябрь",
+ "December" : "Декабрь",
+ "Jan." : "Янв.",
+ "Feb." : "Фев.",
+ "Mar." : "Мар.",
+ "Apr." : "Апр.",
+ "May." : "Май",
+ "Jun." : "Июн.",
+ "Jul." : "Июл.",
+ "Aug." : "Авг.",
+ "Sep." : "Сен.",
+ "Oct." : "Окт.",
+ "Nov." : "Нояб.",
+ "Dec." : "Дек.",
"Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "В составе имени пользователя допускаются следующие символы: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"",
"A valid username must be provided" : "Укажите допустимое имя пользователя",
@@ -127,7 +158,6 @@ OC.L10N.register(
"Personal" : "Личное",
"Users" : "Пользователи",
"Admin" : "Администрирование",
- "Recommended" : "Рекомендовано",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Приложение \"%s\" не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Приложение \"%s\" не может быть установлено, потому что оно несовместимо с этой версией сервера",
"No app name specified" : "Не указано имя приложения",
@@ -173,7 +203,24 @@ OC.L10N.register(
"Storage unauthorized. %s" : "Хранилище неавторизовано. %s",
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
+ "Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "App directory already exists" : "Каталог приложения уже существует",
+ "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
+ "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
+ "No source specified when installing app" : "Не указан источник при установке приложения",
+ "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
+ "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
+ "Archives of type %s are not supported" : "Архивы %s не поддерживаются",
+ "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения",
+ "App does not provide an info.xml file" : "Приложение не имеет файла info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Приложение не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.",
+ "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.",
+ "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений",
+ "Recommended" : "Рекомендовано",
"Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.",
"Storage not available" : "Хранилище недоступно",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index ca3f76640c8..0b43e8ae35a 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -1,6 +1,6 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "Запись в каталог \"config\" невозможна!",
- "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить предоставив веб-серверу права на запись в каталоге конфигурации",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации",
"See %s" : "Смотрите %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
@@ -18,6 +18,7 @@
"Server version %s or lower is required." : "Требуется сервер версии %s или ниже.",
"Unknown filetype" : "Неизвестный тип файла",
"Invalid image" : "Изображение повреждено",
+ "Avatar image is not square" : "Изображение аватара не квадратное",
"today" : "сегодня",
"yesterday" : "вчера",
"_%n day ago_::_%n days ago_" : ["%n день назад","%n дня назад","%n дней назад","%n дней назад"],
@@ -35,21 +36,6 @@
"File name is a reserved word" : "Имя файла является зарезервированным словом",
"File name contains at least one invalid character" : "Имя файла содержит по крайней мере один некорректный символ",
"File name is too long" : "Имя файла слишком длинное.",
- "App directory already exists" : "Каталог приложения уже существует",
- "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
- "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
- "No source specified when installing app" : "Не указан источник при установке приложения",
- "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
- "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
- "Archives of type %s are not supported" : "Архивы %s не поддерживаются",
- "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения",
- "App does not provide an info.xml file" : "Приложение не имеет файла info.xml",
- "App cannot be installed because appinfo file cannot be read." : "Приложение не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.",
- "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.",
- "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "Настройки сервера",
@@ -98,7 +84,7 @@
"Setting permissions for %s failed, because the item was not found" : "Не удалось настроить права доступа для %s, элемент не найден.",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Невозможно установить дату истечения. Общие ресурсы не могут устареть позже %s с момента их публикации.",
"Cannot set expiration date. Expiration date is in the past" : "Невозможно установить дату окончания. Дата окончания в прошлом.",
- "Cannot clear expiration date. Shares are required to have an expiration date." : "Не могу очистить дату истечения срока действия. Общие ресурсы должны иметь срок годности.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Невозможно очистить дату истечения срока действия. Общие ресурсы должны иметь срок годности.",
"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 не найден",
@@ -113,6 +99,51 @@
"Expiration date is in the past" : "Дата окончания срока действия уже прошла",
"Cannot set expiration date more than %s days in the future" : "Невозможно установить дату окончания срока действия более %s дней",
"Could not find category \"%s\"" : "Категория \"%s\" не найдена",
+ "Sunday" : "Воскресенье",
+ "Monday" : "Понедельник",
+ "Tuesday" : "Вторник",
+ "Wednesday" : "Среда",
+ "Thursday" : "Четверг",
+ "Friday" : "Пятница",
+ "Saturday" : "Суббота",
+ "Sun." : "Вс.",
+ "Mon." : "Пн.",
+ "Tue." : "Вт.",
+ "Wed." : "Ср.",
+ "Thu." : "Чт.",
+ "Fri." : "Пт.",
+ "Sat." : "Сб.",
+ "Su" : "Вс",
+ "Mo" : "Пн",
+ "Tu" : "Вт",
+ "We" : "Ср",
+ "Th" : "Чт",
+ "Fr" : "Пт",
+ "Sa" : "Сб",
+ "January" : "Январь",
+ "February" : "Февраль",
+ "March" : "Март",
+ "April" : "Апрель",
+ "May" : "Май",
+ "June" : "Июнь",
+ "July" : "Июль",
+ "August" : "Август",
+ "September" : "Сентябрь",
+ "October" : "Октябрь",
+ "November" : "Ноябрь",
+ "December" : "Декабрь",
+ "Jan." : "Янв.",
+ "Feb." : "Фев.",
+ "Mar." : "Мар.",
+ "Apr." : "Апр.",
+ "May." : "Май",
+ "Jun." : "Июн.",
+ "Jul." : "Июл.",
+ "Aug." : "Авг.",
+ "Sep." : "Сен.",
+ "Oct." : "Окт.",
+ "Nov." : "Нояб.",
+ "Dec." : "Дек.",
"Apps" : "Приложения",
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "В составе имени пользователя допускаются следующие символы: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"",
"A valid username must be provided" : "Укажите допустимое имя пользователя",
@@ -125,7 +156,6 @@
"Personal" : "Личное",
"Users" : "Пользователи",
"Admin" : "Администрирование",
- "Recommended" : "Рекомендовано",
"App \"%s\" cannot be installed because appinfo file cannot be read." : "Приложение \"%s\" не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Приложение \"%s\" не может быть установлено, потому что оно несовместимо с этой версией сервера",
"No app name specified" : "Не указано имя приложения",
@@ -171,7 +201,24 @@
"Storage unauthorized. %s" : "Хранилище неавторизовано. %s",
"Storage incomplete configuration. %s" : "Неполная конфигурация хранилища. %s",
"Storage connection error. %s" : "Ошибка подключения к хранилищу. %s",
+ "Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
+ "App directory already exists" : "Каталог приложения уже существует",
+ "Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
+ "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
+ "No source specified when installing app" : "Не указан источник при установке приложения",
+ "No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
+ "No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
+ "Archives of type %s are not supported" : "Архивы %s не поддерживаются",
+ "Failed to open archive when installing app" : "Ошибка открытия архива при установке приложения",
+ "App does not provide an info.xml file" : "Приложение не имеет файла info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Приложение не может быть установлено, так как файл с информацией о приложении не может быть прочтен.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Подпись не может быть проверена. Пожалуйста, свяжитесь с разработчиком приложения и проверьте свою страницу администратора.",
+ "App can't be installed because of not allowed code in the App" : "Приложение невозможно установить. В нем содержится запрещенный код.",
+ "App can't be installed because it is not compatible with this version of the server" : "Приложение не может быть установлено, потому что оно несовместимо с этой версией сервера",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложение невозможно установить. Оно содержит параметр <shipped>true</shipped> который не допустим для приложений, не входящих в поставку.",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Приложение невозможно установить. Версия в файле info.xml не совпадает с версией заявленной в магазине приложений",
+ "Recommended" : "Рекомендовано",
"Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.",
"Storage not available" : "Хранилище недоступно",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 09e78b67be5..acba2269658 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -37,21 +37,6 @@ OC.L10N.register(
"File name is a reserved word" : "檔案名稱是預設保留字",
"File name contains at least one invalid character" : "檔案名稱含有不合法的字元",
"File name is too long" : "檔案名稱太長",
- "App directory already exists" : "應用程式目錄已經存在",
- "Can't create app folder. Please fix permissions. %s" : "無法建立應用程式目錄,請檢查權限:%s",
- "Archive does not contain a directory named %s" : "檔案文件未包含目錄名稱 %s",
- "No source specified when installing app" : "沒有指定應用程式安裝來源",
- "No href specified when installing app from http" : "從 http 安裝應用程式,找不到 href 屬性",
- "No path specified when installing app from local file" : "從本地檔案安裝應用程式時沒有指定路徑",
- "Archives of type %s are not supported" : "不支援 %s 格式的壓縮檔",
- "Failed to open archive when installing app" : "安裝應用程式時無法開啓壓縮檔",
- "App does not provide an info.xml file" : "應用程式沒有提供 info.xml 檔案",
- "App cannot be installed because appinfo file cannot be read." : "程式無法安裝,因為無法讀取appinfo檔案。",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "無法驗證數位簽章,請聯絡 app 開發者,並檢查您的管理頁面",
- "App can't be installed because of not allowed code in the App" : "無法安裝應用程式因為在當中找到危險的代碼",
- "App can't be installed because it is not compatible with this version of the server" : "程式無法安裝,因為伺服器版本不符。",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "無法安裝應用程式,因為它包含了 <shipped>true</shipped> 標籤,在未發行的應用程式當中這是不允許的",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "程式無法安裝,因為info.xml檔案中版本與app商店中要求不同。",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "伺服器設定",
@@ -127,7 +112,6 @@ OC.L10N.register(
"Personal" : "個人",
"Users" : "使用者",
"Admin" : "管理",
- "Recommended" : "建議",
"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\"無法安裝,因為伺服器版本不符。",
"No app name specified" : "沒有指定應用程式名稱",
@@ -174,6 +158,22 @@ OC.L10N.register(
"Storage incomplete configuration. %s" : "儲存空間配置尚未完成。%s",
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "App directory already exists" : "應用程式目錄已經存在",
+ "Can't create app folder. Please fix permissions. %s" : "無法建立應用程式目錄,請檢查權限:%s",
+ "Archive does not contain a directory named %s" : "檔案文件未包含目錄名稱 %s",
+ "No source specified when installing app" : "沒有指定應用程式安裝來源",
+ "No href specified when installing app from http" : "從 http 安裝應用程式,找不到 href 屬性",
+ "No path specified when installing app from local file" : "從本地檔案安裝應用程式時沒有指定路徑",
+ "Archives of type %s are not supported" : "不支援 %s 格式的壓縮檔",
+ "Failed to open archive when installing app" : "安裝應用程式時無法開啓壓縮檔",
+ "App does not provide an info.xml file" : "應用程式沒有提供 info.xml 檔案",
+ "App cannot be installed because appinfo file cannot be read." : "程式無法安裝,因為無法讀取appinfo檔案。",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "無法驗證數位簽章,請聯絡 app 開發者,並檢查您的管理頁面",
+ "App can't be installed because of not allowed code in the App" : "無法安裝應用程式因為在當中找到危險的代碼",
+ "App can't be installed because it is not compatible with this version of the server" : "程式無法安裝,因為伺服器版本不符。",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "無法安裝應用程式,因為它包含了 <shipped>true</shipped> 標籤,在未發行的應用程式當中這是不允許的",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "程式無法安裝,因為info.xml檔案中版本與app商店中要求不同。",
+ "Recommended" : "建議",
"Microsoft Windows Platform is not supported" : "不支援微軟Windows系統",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。",
"Storage not available" : "無法存取儲存空間",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index c7d3b907378..1356943df67 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -35,21 +35,6 @@
"File name is a reserved word" : "檔案名稱是預設保留字",
"File name contains at least one invalid character" : "檔案名稱含有不合法的字元",
"File name is too long" : "檔案名稱太長",
- "App directory already exists" : "應用程式目錄已經存在",
- "Can't create app folder. Please fix permissions. %s" : "無法建立應用程式目錄,請檢查權限:%s",
- "Archive does not contain a directory named %s" : "檔案文件未包含目錄名稱 %s",
- "No source specified when installing app" : "沒有指定應用程式安裝來源",
- "No href specified when installing app from http" : "從 http 安裝應用程式,找不到 href 屬性",
- "No path specified when installing app from local file" : "從本地檔案安裝應用程式時沒有指定路徑",
- "Archives of type %s are not supported" : "不支援 %s 格式的壓縮檔",
- "Failed to open archive when installing app" : "安裝應用程式時無法開啓壓縮檔",
- "App does not provide an info.xml file" : "應用程式沒有提供 info.xml 檔案",
- "App cannot be installed because appinfo file cannot be read." : "程式無法安裝,因為無法讀取appinfo檔案。",
- "Signature could not get checked. Please contact the app developer and check your admin screen." : "無法驗證數位簽章,請聯絡 app 開發者,並檢查您的管理頁面",
- "App can't be installed because of not allowed code in the App" : "無法安裝應用程式因為在當中找到危險的代碼",
- "App can't be installed because it is not compatible with this version of the server" : "程式無法安裝,因為伺服器版本不符。",
- "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "無法安裝應用程式,因為它包含了 <shipped>true</shipped> 標籤,在未發行的應用程式當中這是不允許的",
- "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "程式無法安裝,因為info.xml檔案中版本與app商店中要求不同。",
"APCu" : "APCu",
"Redis" : "Redis",
"Server settings" : "伺服器設定",
@@ -125,7 +110,6 @@
"Personal" : "個人",
"Users" : "使用者",
"Admin" : "管理",
- "Recommended" : "建議",
"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\"無法安裝,因為伺服器版本不符。",
"No app name specified" : "沒有指定應用程式名稱",
@@ -172,6 +156,22 @@
"Storage incomplete configuration. %s" : "儲存空間配置尚未完成。%s",
"Storage connection error. %s" : "儲存空間連線錯誤。%s",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
+ "App directory already exists" : "應用程式目錄已經存在",
+ "Can't create app folder. Please fix permissions. %s" : "無法建立應用程式目錄,請檢查權限:%s",
+ "Archive does not contain a directory named %s" : "檔案文件未包含目錄名稱 %s",
+ "No source specified when installing app" : "沒有指定應用程式安裝來源",
+ "No href specified when installing app from http" : "從 http 安裝應用程式,找不到 href 屬性",
+ "No path specified when installing app from local file" : "從本地檔案安裝應用程式時沒有指定路徑",
+ "Archives of type %s are not supported" : "不支援 %s 格式的壓縮檔",
+ "Failed to open archive when installing app" : "安裝應用程式時無法開啓壓縮檔",
+ "App does not provide an info.xml file" : "應用程式沒有提供 info.xml 檔案",
+ "App cannot be installed because appinfo file cannot be read." : "程式無法安裝,因為無法讀取appinfo檔案。",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "無法驗證數位簽章,請聯絡 app 開發者,並檢查您的管理頁面",
+ "App can't be installed because of not allowed code in the App" : "無法安裝應用程式因為在當中找到危險的代碼",
+ "App can't be installed because it is not compatible with this version of the server" : "程式無法安裝,因為伺服器版本不符。",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "無法安裝應用程式,因為它包含了 <shipped>true</shipped> 標籤,在未發行的應用程式當中這是不允許的",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "程式無法安裝,因為info.xml檔案中版本與app商店中要求不同。",
+ "Recommended" : "建議",
"Microsoft Windows Platform is not supported" : "不支援微軟Windows系統",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。",
"Storage not available" : "無法存取儲存空間",
diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php
new file mode 100644
index 00000000000..19e61d416a0
--- /dev/null
+++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\App\AppStore\Fetcher;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Files\IAppData;
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+
+class AppFetcher extends Fetcher {
+ /**
+ * @param IAppData $appData
+ * @param IClientService $clientService
+ * @param ITimeFactory $timeFactory
+ * @param IConfig $config;
+ */
+ public function __construct(IAppData $appData,
+ IClientService $clientService,
+ ITimeFactory $timeFactory,
+ IConfig $config) {
+ parent::__construct(
+ $appData,
+ $clientService,
+ $timeFactory
+ );
+
+ $this->fileName = 'apps.json';
+
+ $versionArray = \OC_Util::getVersion();
+ $this->endpointUrl = sprintf(
+ 'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json',
+ $versionArray[0],
+ $versionArray[1],
+ $versionArray[2]
+ );
+ }
+}
diff --git a/lib/private/App/AppStore/Fetcher/CategoryFetcher.php b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php
new file mode 100644
index 00000000000..74201ec3737
--- /dev/null
+++ b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\App\AppStore\Fetcher;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Files\IAppData;
+use OCP\Http\Client\IClientService;
+
+class CategoryFetcher extends Fetcher {
+ /**
+ * @param IAppData $appData
+ * @param IClientService $clientService
+ * @param ITimeFactory $timeFactory
+ */
+ public function __construct(IAppData $appData,
+ IClientService $clientService,
+ ITimeFactory $timeFactory) {
+ parent::__construct(
+ $appData,
+ $clientService,
+ $timeFactory
+ );
+ $this->fileName = 'categories.json';
+ $this->endpointUrl = 'https://apps.nextcloud.com/api/v1/categories.json';
+ }
+}
diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php
new file mode 100644
index 00000000000..cffff9176e2
--- /dev/null
+++ b/lib/private/App/AppStore/Fetcher/Fetcher.php
@@ -0,0 +1,92 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\App\AppStore\Fetcher;
+
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\Files\IAppData;
+use OCP\Files\NotFoundException;
+use OCP\Http\Client\IClientService;
+
+abstract class Fetcher {
+ const INVALIDATE_AFTER_SECONDS = 300;
+
+ /** @var IAppData */
+ private $appData;
+ /** @var IClientService */
+ private $clientService;
+ /** @var ITimeFactory */
+ private $timeFactory;
+ /** @var string */
+ protected $fileName;
+ /** @var string */
+ protected $endpointUrl;
+
+ /**
+ * @param IAppData $appData
+ * @param IClientService $clientService
+ * @param ITimeFactory $timeFactory
+ */
+ public function __construct(IAppData $appData,
+ IClientService $clientService,
+ ITimeFactory $timeFactory) {
+ $this->appData = $appData;
+ $this->clientService = $clientService;
+ $this->timeFactory = $timeFactory;
+ }
+
+ /**
+ * Returns the array with the categories on the appstore server
+ *
+ * @return array
+ */
+ public function get() {
+ $rootFolder = $this->appData->getFolder('/');
+
+ try {
+ // File does already exists
+ $file = $rootFolder->getFile($this->fileName);
+ $jsonBlob = json_decode($file->getContent(), true);
+ if(is_array($jsonBlob)) {
+ // If the timestamp is older than 300 seconds request the files new
+ if((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS)) {
+ return $jsonBlob['data'];
+ }
+ }
+ } catch (NotFoundException $e) {
+ // File does not already exists
+ $file = $rootFolder->newFile($this->fileName);
+ }
+
+ // Refresh the file content
+ $client = $this->clientService->newClient();
+ try {
+ $response = $client->get($this->endpointUrl);
+ $responseJson = [];
+ $responseJson['data'] = json_decode($response->getBody(), true);
+ $responseJson['timestamp'] = $this->timeFactory->getTime();
+ $file->putContent(json_encode($responseJson));
+ return json_decode($file->getContent(), true)['data'];
+ } catch (\Exception $e) {
+ return [];
+ }
+ }
+}
diff --git a/lib/private/App/AppStore/Version/Version.php b/lib/private/App/AppStore/Version/Version.php
new file mode 100644
index 00000000000..ca182ae078b
--- /dev/null
+++ b/lib/private/App/AppStore/Version/Version.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\App\AppStore\Version;
+
+class Version {
+ /** @var string */
+ private $minVersion;
+ /** @var string */
+ private $maxVersion;
+
+ /**
+ * @param string $minVersion
+ * @param string $maxVersion
+ */
+ public function __construct($minVersion, $maxVersion) {
+ $this->minVersion = $minVersion;
+ $this->maxVersion = $maxVersion;
+ }
+
+ /**
+ * @return string
+ */
+ public function getMinimumVersion() {
+ return $this->minVersion;
+ }
+
+ /**
+ * @return string
+ */
+ public function getMaximumVersion() {
+ return $this->maxVersion;
+ }
+}
diff --git a/lib/private/App/AppStore/Version/VersionParser.php b/lib/private/App/AppStore/Version/VersionParser.php
new file mode 100644
index 00000000000..b548ef386d9
--- /dev/null
+++ b/lib/private/App/AppStore/Version/VersionParser.php
@@ -0,0 +1,83 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\App\AppStore\Version;
+
+/**
+ * Class VersionParser parses the versions as sent by the Nextcloud app store
+ *
+ * @package OC\App\AppStore
+ */
+class VersionParser {
+ /**
+ * @param string $versionString
+ * @return bool
+ */
+ private function isValidVersionString($versionString) {
+ return (bool)preg_match('/^[0-9.]+$/', $versionString);
+ }
+
+ /**
+ * Returns the version for a version string
+ *
+ * @param string $versionSpec
+ * @return Version
+ * @throws \Exception If the version cannot be parsed
+ */
+ public function getVersion($versionSpec) {
+ // * indicates that the version is compatible with all versions
+ if($versionSpec === '*') {
+ return new Version('', '');
+ }
+
+ // Count the amount of =, if it is one then it's either maximum or minimum
+ // version. If it is two then it is maximum and minimum.
+ $versionElements = explode(' ', $versionSpec);
+ $firstVersion = isset($versionElements[0]) ? $versionElements[0] : '';
+ $firstVersionNumber = substr($firstVersion, 2);
+ $secondVersion = isset($versionElements[1]) ? $versionElements[1] : '';
+ $secondVersionNumber = substr($secondVersion, 2);
+
+ switch(count($versionElements)) {
+ case 1:
+ if(!$this->isValidVersionString($firstVersionNumber)) {
+ break;
+ }
+ if(substr($firstVersion, 0, 1) === '>') {
+ return new Version($firstVersionNumber, '');
+ } else {
+ return new Version('', $firstVersionNumber);
+ }
+ case 2:
+ if(!$this->isValidVersionString($firstVersionNumber) || !$this->isValidVersionString($secondVersionNumber)) {
+ break;
+ }
+ return new Version($firstVersionNumber, $secondVersionNumber);
+ }
+
+ throw new \Exception(
+ sprintf(
+ 'Version cannot be parsed: %s',
+ $versionSpec
+ )
+ );
+ }
+}
diff --git a/lib/private/App/CodeChecker/DeprecationCheck.php b/lib/private/App/CodeChecker/DeprecationCheck.php
index 60e7fdf078d..a700345238b 100644
--- a/lib/private/App/CodeChecker/DeprecationCheck.php
+++ b/lib/private/App/CodeChecker/DeprecationCheck.php
@@ -114,13 +114,6 @@ class DeprecationCheck extends AbstractCheck implements ICheck {
'OCP\AppFramework\IAppContainer::isAdminUser' => '8.0.0',
'OCP\AppFramework\IAppContainer::log' => '8.0.0',
- 'OCP\BackgroundJob::addQueuedTask' => '6.0.0',
- 'OCP\BackgroundJob::addRegularTask' => '6.0.0',
- 'OCP\BackgroundJob::allQueuedTasks' => '6.0.0',
- 'OCP\BackgroundJob::allRegularTasks' => '6.0.0',
- 'OCP\BackgroundJob::deleteQueuedTask' => '6.0.0',
- 'OCP\BackgroundJob::findQueuedTask' => '6.0.0',
- 'OCP\BackgroundJob::queuedTaskWhereAppIs' => '6.0.0',
'OCP\BackgroundJob::registerJob' => '8.1.0',
'OCP\Files::tmpFile' => '8.1.0',
diff --git a/lib/private/App/DependencyAnalyzer.php b/lib/private/App/DependencyAnalyzer.php
index 67268981e99..c24b25ff14d 100644
--- a/lib/private/App/DependencyAnalyzer.php
+++ b/lib/private/App/DependencyAnalyzer.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
*
* @author Bernhard Posselt <dev@bernhard-posselt.com>
* @author Joas Schilling <coding@schilljs.com>
@@ -294,7 +295,9 @@ class DependencyAnalyzer {
private function analyzeOC(array $dependencies, array $appInfo) {
$missing = [];
$minVersion = null;
- if (isset($dependencies['owncloud']['@attributes']['min-version'])) {
+ if (isset($dependencies['nextcloud']['@attributes']['min-version'])) {
+ $minVersion = $dependencies['nextcloud']['@attributes']['min-version'];
+ } elseif (isset($dependencies['owncloud']['@attributes']['min-version'])) {
$minVersion = $dependencies['owncloud']['@attributes']['min-version'];
} elseif (isset($appInfo['requiremin'])) {
$minVersion = $appInfo['requiremin'];
@@ -302,7 +305,9 @@ class DependencyAnalyzer {
$minVersion = $appInfo['require'];
}
$maxVersion = null;
- if (isset($dependencies['owncloud']['@attributes']['max-version'])) {
+ if (isset($dependencies['nextcloud']['@attributes']['max-version'])) {
+ $maxVersion = $dependencies['nextcloud']['@attributes']['max-version'];
+ } elseif (isset($dependencies['owncloud']['@attributes']['max-version'])) {
$maxVersion = $dependencies['owncloud']['@attributes']['max-version'];
} elseif (isset($appInfo['requiremax'])) {
$maxVersion = $appInfo['requiremax'];
diff --git a/lib/private/AppFramework/Core/API.php b/lib/private/AppFramework/Core/API.php
index 85cdc00a63a..683962d67dc 100644
--- a/lib/private/AppFramework/Core/API.php
+++ b/lib/private/AppFramework/Core/API.php
@@ -170,19 +170,6 @@ class API implements IApi{
}
}
-
- /**
- * Register a backgroundjob task
- * @param string $className full namespace and class name of the class
- * @param string $methodName the name of the static method that should be
- * called
- * @deprecated Use \OC::$server->getJobList()->add();
- */
- public function addRegularTask($className, $methodName) {
- \OCP\Backgroundjob::addRegularTask($className, $methodName);
- }
-
-
/**
* Tells ownCloud to include a template in the admin overview
* @param string $mainPath the path to the main php file without the php
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index a1e845f132e..e1516c47ed6 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -290,6 +290,7 @@ class DIContainer extends SimpleContainer implements IAppContainer {
$this->registerService('OCP\\IUserSession', function($c) {
return $this->getServer()->getUserSession();
});
+ $this->registerAlias(\OC\User\Session::class, \OCP\IUserSession::class);
$this->registerService('OCP\\ISession', function($c) {
return $this->getServer()->getSession();
diff --git a/lib/private/Archive/Archive.php b/lib/private/Archive/Archive.php
index da2c53f2aa1..fadc12d2a24 100644
--- a/lib/private/Archive/Archive.php
+++ b/lib/private/Archive/Archive.php
@@ -32,26 +32,7 @@
namespace OC\Archive;
-abstract class Archive{
- /**
- * Open any of the supported archive types
- *
- * @param string $path
- * @return Archive|void
- */
- public static function open($path) {
- $mime = \OC::$server->getMimeTypeDetector()->detect($path);
-
- switch($mime) {
- case 'application/zip':
- return new ZIP($path);
- case 'application/x-gzip':
- return new TAR($path);
- case 'application/x-bzip2':
- return new TAR($path);
- }
- }
-
+abstract class Archive {
/**
* @param $source
*/
diff --git a/lib/private/Authentication/Token/DefaultToken.php b/lib/private/Authentication/Token/DefaultToken.php
index 904df9baa28..faef2f73b33 100644
--- a/lib/private/Authentication/Token/DefaultToken.php
+++ b/lib/private/Authentication/Token/DefaultToken.php
@@ -35,6 +35,8 @@ use OCP\AppFramework\Db\Entity;
* @method string getToken()
* @method void setType(string $type)
* @method int getType()
+ * @method void setRemember(int $remember)
+ * @method int getRemember()
* @method void setLastActivity(int $lastActivity)
* @method int getLastActivity()
*/
@@ -73,6 +75,11 @@ class DefaultToken extends Entity implements IToken {
/**
* @var int
*/
+ protected $remember;
+
+ /**
+ * @var int
+ */
protected $lastActivity;
/**
diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php
index 0ce26197ccf..752974ff240 100644
--- a/lib/private/Authentication/Token/DefaultTokenMapper.php
+++ b/lib/private/Authentication/Token/DefaultTokenMapper.php
@@ -40,24 +40,25 @@ class DefaultTokenMapper extends Mapper {
* @param string $token
*/
public function invalidate($token) {
+ /* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
$qb->delete('authtoken')
- ->andWhere($qb->expr()->eq('token', $qb->createParameter('token')))
+ ->where($qb->expr()->eq('token', $qb->createParameter('token')))
->setParameter('token', $token)
->execute();
}
/**
* @param int $olderThan
+ * @param int $remember
*/
- public function invalidateOld($olderThan) {
+ public function invalidateOld($olderThan, $remember = IToken::DO_NOT_REMEMBER) {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
$qb->delete('authtoken')
- ->where($qb->expr()->lt('last_activity', $qb->createParameter('last_activity')))
- ->andWhere($qb->expr()->eq('type', $qb->createParameter('type')))
- ->setParameter('last_activity', $olderThan, IQueryBuilder::PARAM_INT)
- ->setParameter('type', IToken::TEMPORARY_TOKEN, IQueryBuilder::PARAM_INT)
+ ->where($qb->expr()->lt('last_activity', $qb->createNamedParameter($olderThan, IQueryBuilder::PARAM_INT)))
+ ->andWhere($qb->expr()->eq('type', $qb->createNamedParameter(IToken::TEMPORARY_TOKEN, IQueryBuilder::PARAM_INT)))
+ ->andWhere($qb->expr()->eq('remember', $qb->createNamedParameter($remember, IQueryBuilder::PARAM_INT)))
->execute();
}
@@ -71,7 +72,7 @@ class DefaultTokenMapper extends Mapper {
public function getToken($token) {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
- $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check')
+ $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check')
->from('authtoken')
->where($qb->expr()->eq('token', $qb->createParameter('token')))
->setParameter('token', $token)
@@ -97,7 +98,7 @@ class DefaultTokenMapper extends Mapper {
public function getTokenByUser(IUser $user) {
/* @var $qb IQueryBuilder */
$qb = $this->db->getQueryBuilder();
- $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check')
+ $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'remember', 'token', 'last_activity', 'last_check')
->from('authtoken')
->where($qb->expr()->eq('uid', $qb->createNamedParameter($user->getUID())))
->setMaxResults(1000);
diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php
index b0fbeb9b47e..87f434c684c 100644
--- a/lib/private/Authentication/Token/DefaultTokenProvider.php
+++ b/lib/private/Authentication/Token/DefaultTokenProvider.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Christoph Wurst <christoph@winzerhof-wurst.at>
*
* @author Christoph Wurst <christoph@owncloud.com>
*
@@ -56,7 +57,11 @@ class DefaultTokenProvider implements IProvider {
* @param ILogger $logger
* @param ITimeFactory $time
*/
- public function __construct(DefaultTokenMapper $mapper, ICrypto $crypto, IConfig $config, ILogger $logger, ITimeFactory $time) {
+ public function __construct(DefaultTokenMapper $mapper,
+ ICrypto $crypto,
+ IConfig $config,
+ ILogger $logger,
+ ITimeFactory $time) {
$this->mapper = $mapper;
$this->crypto = $crypto;
$this->config = $config;
@@ -73,9 +78,10 @@ class DefaultTokenProvider implements IProvider {
* @param string|null $password
* @param string $name
* @param int $type token type
+ * @param int $remember whether the session token should be used for remember-me
* @return IToken
*/
- public function generateToken($token, $uid, $loginName, $password, $name, $type = IToken::TEMPORARY_TOKEN) {
+ public function generateToken($token, $uid, $loginName, $password, $name, $type = IToken::TEMPORARY_TOKEN, $remember = IToken::DO_NOT_REMEMBER) {
$dbToken = new DefaultToken();
$dbToken->setUid($uid);
$dbToken->setLoginName($loginName);
@@ -85,6 +91,7 @@ class DefaultTokenProvider implements IProvider {
$dbToken->setName($name);
$dbToken->setToken($this->hashToken($token));
$dbToken->setType($type);
+ $dbToken->setRemember($remember);
$dbToken->setLastActivity($this->time->getTime());
$this->mapper->insert($dbToken);
@@ -96,6 +103,7 @@ class DefaultTokenProvider implements IProvider {
* Save the updated token
*
* @param IToken $token
+ * @throws InvalidTokenException
*/
public function updateToken(IToken $token) {
if (!($token instanceof DefaultToken)) {
@@ -152,6 +160,28 @@ class DefaultTokenProvider implements IProvider {
}
/**
+ * @param string $oldSessionId
+ * @param string $sessionId
+ * @throws InvalidTokenException
+ */
+ public function renewSessionToken($oldSessionId, $sessionId) {
+ $token = $this->getToken($oldSessionId);
+
+ $newToken = new DefaultToken();
+ $newToken->setUid($token->getUID());
+ $newToken->setLoginName($token->getLoginName());
+ if (!is_null($token->getPassword())) {
+ $password = $this->decryptPassword($token->getPassword(), $oldSessionId);
+ $newToken->setPassword($this->encryptPassword($password, $sessionId));
+ }
+ $newToken->setName($token->getName());
+ $newToken->setToken($this->hashToken($sessionId));
+ $newToken->setType(IToken::TEMPORARY_TOKEN);
+ $newToken->setLastActivity($this->time->getTime());
+ $this->mapper->insert($newToken);
+ }
+
+ /**
* @param IToken $savedToken
* @param string $tokenId session token
* @throws InvalidTokenException
@@ -207,8 +237,11 @@ class DefaultTokenProvider implements IProvider {
*/
public function invalidateOldTokens() {
$olderThan = $this->time->getTime() - (int) $this->config->getSystemValue('session_lifetime', 60 * 60 * 24);
- $this->logger->info('Invalidating tokens older than ' . date('c', $olderThan));
- $this->mapper->invalidateOld($olderThan);
+ $this->logger->info('Invalidating session tokens older than ' . date('c', $olderThan));
+ $this->mapper->invalidateOld($olderThan, IToken::DO_NOT_REMEMBER);
+ $rememberThreshold = $this->time->getTime() - (int) $this->config->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
+ $this->logger->info('Invalidating remembered session tokens older than ' . date('c', $rememberThreshold));
+ $this->mapper->invalidateOld($rememberThreshold, IToken::REMEMBER);
}
/**
diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php
index 65b515960ea..ce14a5880c5 100644
--- a/lib/private/Authentication/Token/IProvider.php
+++ b/lib/private/Authentication/Token/IProvider.php
@@ -28,6 +28,7 @@ use OCP\IUser;
interface IProvider {
+
/**
* Create and persist a new token
*
@@ -37,9 +38,10 @@ interface IProvider {
* @param string|null $password
* @param string $name
* @param int $type token type
+ * @param int $remember whether the session token should be used for remember-me
* @return IToken
*/
- public function generateToken($token, $uid, $loginName, $password, $name, $type = IToken::TEMPORARY_TOKEN);
+ public function generateToken($token, $uid, $loginName, $password, $name, $type = IToken::TEMPORARY_TOKEN, $remember = IToken::DO_NOT_REMEMBER);
/**
* Get a token by token id
@@ -51,6 +53,15 @@ interface IProvider {
public function getToken($tokenId) ;
/**
+ * Duplicate an existing session token
+ *
+ * @param string $oldSessionId
+ * @param string $sessionId
+ * @throws InvalidTokenException
+ */
+ public function renewSessionToken($oldSessionId, $sessionId);
+
+ /**
* Invalidate (delete) the given session token
*
* @param string $token
diff --git a/lib/private/Authentication/Token/IToken.php b/lib/private/Authentication/Token/IToken.php
index e1e78ca369a..14811dd3201 100644
--- a/lib/private/Authentication/Token/IToken.php
+++ b/lib/private/Authentication/Token/IToken.php
@@ -28,6 +28,8 @@ interface IToken extends JsonSerializable {
const TEMPORARY_TOKEN = 0;
const PERMANENT_TOKEN = 1;
+ const DO_NOT_REMEMBER = 0;
+ const REMEMBER = 1;
/**
* Get the token ID
diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php
index 1bea7aa3478..d84ba4aee7e 100644
--- a/lib/private/Authentication/TwoFactorAuth/Manager.php
+++ b/lib/private/Authentication/TwoFactorAuth/Manager.php
@@ -37,6 +37,7 @@ class Manager {
const SESSION_UID_KEY = 'two_factor_auth_uid';
const BACKUP_CODES_APP_ID = 'twofactor_backupcodes';
const BACKUP_CODES_PROVIDER_ID = 'backup_codes';
+ const REMEMBER_LOGIN = 'two_factor_remember_login';
/** @var AppManager */
private $appManager;
@@ -114,6 +115,7 @@ class Manager {
* @param IUser $user
* @param bool $includeBackupApp
* @return IProvider[]
+ * @throws Exception
*/
public function getProviders(IUser $user, $includeBackupApp = false) {
$allApps = $this->appManager->getEnabledAppsForUser($user);
@@ -171,11 +173,16 @@ class Manager {
return false;
}
- $result = $provider->verifyChallenge($user, $challenge);
- if ($result) {
+ $passed = $provider->verifyChallenge($user, $challenge);
+ if ($passed) {
+ if ($this->session->get(self::REMEMBER_LOGIN) === true) {
+ // TODO: resolve cyclic dependency and use DI
+ \OC::$server->getUserSession()->createRememberMeToken($user);
+ }
$this->session->remove(self::SESSION_UID_KEY);
+ $this->session->remove(self::REMEMBER_LOGIN);
}
- return $result;
+ return $passed;
}
/**
@@ -202,12 +209,14 @@ class Manager {
}
/**
- * Prepare the 2FA login (set session value)
+ * Prepare the 2FA login
*
* @param IUser $user
+ * @param boolean $rememberMe
*/
- public function prepareTwoFactorLogin(IUser $user) {
+ public function prepareTwoFactorLogin(IUser $user, $rememberMe) {
$this->session->set(self::SESSION_UID_KEY, $user->getUID());
+ $this->session->set(self::REMEMBER_LOGIN, $rememberMe);
}
}
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index dfe2e86b617..497ff0c8a26 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -67,7 +67,11 @@ class Connection extends \Doctrine\DBAL\Connection implements IDBConnection {
* @return \OCP\DB\QueryBuilder\IQueryBuilder
*/
public function getQueryBuilder() {
- return new QueryBuilder($this);
+ return new QueryBuilder(
+ $this,
+ \OC::$server->getSystemConfig(),
+ \OC::$server->getLogger()
+ );
}
/**
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index eac77dd98fd..d5dd9cf0366 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -31,16 +31,24 @@ use OC\DB\QueryBuilder\ExpressionBuilder\ExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\MySqlExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\OCIExpressionBuilder;
use OC\DB\QueryBuilder\ExpressionBuilder\PgSqlExpressionBuilder;
+use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\DB\QueryBuilder\IParameter;
use OCP\IDBConnection;
+use OCP\ILogger;
class QueryBuilder implements IQueryBuilder {
/** @var \OCP\IDBConnection */
private $connection;
+ /** @var SystemConfig */
+ private $systemConfig;
+
+ /** @var ILogger */
+ private $logger;
+
/** @var \Doctrine\DBAL\Query\QueryBuilder */
private $queryBuilder;
@@ -56,10 +64,14 @@ class QueryBuilder implements IQueryBuilder {
/**
* Initializes a new QueryBuilder.
*
- * @param \OCP\IDBConnection $connection
+ * @param IDBConnection $connection
+ * @param SystemConfig $systemConfig
+ * @param ILogger $logger
*/
- public function __construct(IDBConnection $connection) {
+ public function __construct(IDBConnection $connection, SystemConfig $systemConfig, ILogger $logger) {
$this->connection = $connection;
+ $this->systemConfig = $systemConfig;
+ $this->logger = $logger;
$this->queryBuilder = new \Doctrine\DBAL\Query\QueryBuilder($this->connection);
$this->helper = new QuoteHelper();
}
@@ -139,6 +151,29 @@ class QueryBuilder implements IQueryBuilder {
* @return \Doctrine\DBAL\Driver\Statement|int
*/
public function execute() {
+ if ($this->systemConfig->getValue('log_query', false)) {
+ $params = [];
+ foreach ($this->getParameters() as $placeholder => $value) {
+ if (is_array($value)) {
+ $params[] = $placeholder . ' => (\'' . implode('\', \'', $value) . '\')';
+ } else {
+ $params[] = $placeholder . ' => \'' . $value . '\'';
+ }
+ }
+ if (empty($params)) {
+ $this->logger->debug('DB QueryBuilder: \'{query}\'', [
+ 'query' => $this->getSQL(),
+ 'app' => 'core',
+ ]);
+ } else {
+ $this->logger->debug('DB QueryBuilder: \'{query}\' with parameters: {params}', [
+ 'query' => $this->getSQL(),
+ 'params' => implode(', ', $params),
+ 'app' => 'core',
+ ]);
+ }
+ }
+
return $this->queryBuilder->execute();
}
diff --git a/lib/private/Files/Mount/ObjectHomeMountProvider.php b/lib/private/Files/Mount/ObjectHomeMountProvider.php
index c1eea34a72e..87878562a42 100644
--- a/lib/private/Files/Mount/ObjectHomeMountProvider.php
+++ b/lib/private/Files/Mount/ObjectHomeMountProvider.php
@@ -121,7 +121,8 @@ class ObjectHomeMountProvider implements IHomeMountProvider {
$config['arguments']['bucket'] = '';
}
$mapper = new \OC\Files\ObjectStore\Mapper($user);
- $config['arguments']['bucket'] .= $mapper->getBucket();
+ $numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
+ $config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
$this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
} else {
diff --git a/lib/private/Files/ObjectStore/Mapper.php b/lib/private/Files/ObjectStore/Mapper.php
index bfb4e998150..81f8a9e3fa5 100644
--- a/lib/private/Files/ObjectStore/Mapper.php
+++ b/lib/private/Files/ObjectStore/Mapper.php
@@ -44,10 +44,12 @@ class Mapper {
}
/**
+ * @param int $numBuckets
* @return string
*/
- public function getBucket() {
+ public function getBucket($numBuckets = 64) {
$hash = md5($this->user->getUID());
- return substr($hash, 0, 3);
+ $num = hexdec(substr($hash, 0, 4));
+ return (string)($num % $numBuckets);
}
-} \ No newline at end of file
+}
diff --git a/lib/private/Installer.php b/lib/private/Installer.php
index 009df790585..2366b762654 100644
--- a/lib/private/Installer.php
+++ b/lib/private/Installer.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Bart Visscher <bartv@thisnet.nl>
@@ -40,90 +41,64 @@
namespace OC;
+use OC\App\AppStore\Fetcher\AppFetcher;
use OC\App\CodeChecker\CodeChecker;
use OC\App\CodeChecker\EmptyCheck;
use OC\App\CodeChecker\PrivateCheck;
+use OC\Archive\Archive;
+use OC\Archive\TAR;
use OC_App;
use OC_DB;
use OC_Helper;
+use OCP\Http\Client\IClientService;
+use OCP\ILogger;
+use OCP\ITempManager;
+use phpseclib\File\X509;
/**
- * This class provides the functionality needed to install, update and remove plugins/apps
+ * This class provides the functionality needed to install, update and remove apps
*/
class Installer {
+ /** @var AppFetcher */
+ private $appFetcher;
+ /** @var IClientService */
+ private $clientService;
+ /** @var ITempManager */
+ private $tempManager;
+ /** @var ILogger */
+ private $logger;
/**
+ * @param AppFetcher $appFetcher
+ * @param IClientService $clientService
+ * @param ITempManager $tempManager
+ * @param ILogger $logger
+ */
+ public function __construct(AppFetcher $appFetcher,
+ IClientService $clientService,
+ ITempManager $tempManager,
+ ILogger $logger) {
+ $this->appFetcher = $appFetcher;
+ $this->clientService = $clientService;
+ $this->tempManager = $tempManager;
+ $this->logger = $logger;
+ }
+
+ /**
+ * Installs an app that is located in one of the app folders already
*
- * This function installs an app. All information needed are passed in the
- * associative array $data.
- * The following keys are required:
- * - source: string, can be "path" or "http"
- *
- * One of the following keys is required:
- * - path: path to the file containing the app
- * - href: link to the downloadable file containing the app
- *
- * The following keys are optional:
- * - pretend: boolean, if set true the system won't do anything
- * - noinstall: boolean, if true appinfo/install.php won't be loaded
- * - inactive: boolean, if set true the appconfig/app.sample.php won't be
- * renamed
- *
- * This function works as follows
- * -# fetching the file
- * -# unzipping it
- * -# check the code
- * -# installing the database at appinfo/database.xml
- * -# including appinfo/install.php
- * -# setting the installed version
- *
- * It is the task of oc_app_install to create the tables and do whatever is
- * needed to get the app working.
- *
- * Installs an app
- * @param array $data with all information
+ * @param string $appId App to install
* @throws \Exception
* @return integer
*/
- public static function installApp( $data = array()) {
- $l = \OC::$server->getL10N('lib');
-
- list($extractDir, $path) = self::downloadApp($data);
-
- $info = self::checkAppsIntegrity($data, $extractDir, $path);
- $appId = OC_App::cleanAppId($info['id']);
- $basedir = OC_App::getInstallPath().'/'.$appId;
- //check if the destination directory already exists
- if(is_dir($basedir)) {
- OC_Helper::rmdirr($extractDir);
- if($data['source']=='http') {
- unlink($path);
- }
- throw new \Exception($l->t("App directory already exists"));
- }
-
- if(!empty($data['pretent'])) {
- return false;
+ public function installApp($appId) {
+ $app = \OC_App::findAppInDirectories($appId);
+ if($app === false) {
+ throw new \Exception('App not found in any app directory');
}
- //copy the app to the correct place
- if(@!mkdir($basedir)) {
- OC_Helper::rmdirr($extractDir);
- if($data['source']=='http') {
- unlink($path);
- }
- throw new \Exception($l->t("Can't create app folder. Please fix permissions. %s", array($basedir)));
- }
-
- $extractDir .= '/' . $info['id'];
- if(!file_exists($extractDir)) {
- OC_Helper::rmdirr($basedir);
- throw new \Exception($l->t("Archive does not contain a directory named %s", $info['id']));
- }
- OC_Helper::copyr($extractDir, $basedir);
-
- //remove temporary files
- OC_Helper::rmdirr($extractDir);
+ $basedir = $app['path'].'/'.$appId;
+ $info = OC_App::getAppInfo($basedir.'/appinfo/info.xml', true);
//install the database
if(is_file($basedir.'/appinfo/database.xml')) {
@@ -168,259 +143,189 @@ class Installer {
*
* Checks whether or not an app is installed, i.e. registered in apps table.
*/
- public static function isInstalled( $app ) {
+ public static function isInstalled( $app ) {
return (\OC::$server->getConfig()->getAppValue($app, "installed_version", null) !== null);
}
/**
- * @brief Update an application
- * @param array $info
- * @param bool $isShipped
- * @throws \Exception
- * @return bool
- *
- * This function could work like described below, but currently it disables and then
- * enables the app again. This does result in an updated app.
- *
- *
- * This function installs an app. All information needed are passed in the
- * associative array $info.
- * The following keys are required:
- * - source: string, can be "path" or "http"
- *
- * One of the following keys is required:
- * - path: path to the file containing the app
- * - href: link to the downloadable file containing the app
- *
- * The following keys are optional:
- * - pretend: boolean, if set true the system won't do anything
- * - noupgrade: boolean, if true appinfo/upgrade.php won't be loaded
- *
- * This function works as follows
- * -# fetching the file
- * -# removing the old files
- * -# unzipping new file
- * -# including appinfo/upgrade.php
- * -# setting the installed version
- *
- * upgrade.php can determine the current installed version of the app using
- * "\OC::$server->getAppConfig()->getValue($appid, 'installed_version')"
- */
- public static function updateApp($info=array(), $isShipped=false) {
- list($extractDir, $path) = self::downloadApp($info);
- $info = self::checkAppsIntegrity($info, $extractDir, $path, $isShipped);
-
- $currentDir = OC_App::getAppPath($info['id']);
- $basedir = OC_App::getInstallPath();
- $basedir .= '/';
- $basedir .= $info['id'];
-
- if($currentDir !== false && is_writable($currentDir)) {
- $basedir = $currentDir;
- }
- if(is_dir($basedir)) {
- OC_Helper::rmdirr($basedir);
- }
-
- $appInExtractDir = $extractDir;
- if (substr($extractDir, -1) !== '/') {
- $appInExtractDir .= '/';
- }
-
- $appInExtractDir .= $info['id'];
- OC_Helper::copyr($appInExtractDir, $basedir);
- OC_Helper::rmdirr($extractDir);
-
- return OC_App::updateApp($info['id']);
- }
-
- /**
- * update an app by it's id
+ * Updates the specified app from the appstore
*
- * @param integer $ocsId
+ * @param string $appId
* @return bool
- * @throws \Exception
*/
- public static function updateAppByOCSId($ocsId) {
- $ocsClient = new OCSClient(
- \OC::$server->getHTTPClientService(),
- \OC::$server->getConfig(),
- \OC::$server->getLogger()
- );
- $appData = $ocsClient->getApplication($ocsId, \OCP\Util::getVersion());
- $download = $ocsClient->getApplicationDownload($ocsId, \OCP\Util::getVersion());
-
- if (isset($download['downloadlink']) && trim($download['downloadlink']) !== '') {
- $download['downloadlink'] = str_replace(' ', '%20', $download['downloadlink']);
- $info = array(
- 'source' => 'http',
- 'href' => $download['downloadlink'],
- 'appdata' => $appData
- );
- } else {
- throw new \Exception('Could not fetch app info!');
+ public function updateAppstoreApp($appId) {
+ if(self::isUpdateAvailable($appId, $this->appFetcher)) {
+ try {
+ $this->downloadApp($appId);
+ } catch (\Exception $e) {
+ $this->logger->error($e->getMessage(), ['app' => 'core']);
+ return false;
+ }
+ return OC_App::updateApp($appId);
}
- return self::updateApp($info);
+ return false;
}
/**
- * @param array $data
- * @return array
- * @throws \Exception
+ * Downloads an app and puts it into the app directory
+ *
+ * @param string $appId
+ *
+ * @throws \Exception If the installation was not successful
*/
- public static function downloadApp($data = array()) {
- $l = \OC::$server->getL10N('lib');
-
- if(!isset($data['source'])) {
- throw new \Exception($l->t("No source specified when installing app"));
- }
+ public function downloadApp($appId) {
+ $appId = strtolower($appId);
+
+ $apps = $this->appFetcher->get();
+ foreach($apps as $app) {
+ if($app['id'] === $appId) {
+ // Load the certificate
+ $certificate = new X509();
+ $certificate->loadCA(file_get_contents(__DIR__ . '/../../resources/codesigning/root.crt'));
+ $loadedCertificate = $certificate->loadX509($app['certificate']);
+
+ // Verify if the certificate has been revoked
+ $crl = new X509();
+ $crl->loadCA(file_get_contents(__DIR__ . '/../../resources/codesigning/root.crt'));
+ $crl->loadCRL(file_get_contents(__DIR__ . '/../../resources/codesigning/root.crl'));
+ if($crl->validateSignature() !== true) {
+ throw new \Exception('Could not validate CRL signature');
+ }
+ $csn = $loadedCertificate['tbsCertificate']['serialNumber']->toString();
+ $revoked = $crl->getRevoked($csn);
+ if ($revoked !== false) {
+ throw new \Exception(
+ sprintf(
+ 'Certificate "%s" has been revoked',
+ $csn
+ )
+ );
+ }
- //download the file if necessary
- if($data['source']=='http') {
- $pathInfo = pathinfo($data['href']);
- $extension = isset($pathInfo['extension']) ? '.' . $pathInfo['extension'] : '';
- $path = \OC::$server->getTempManager()->getTemporaryFile($extension);
- if(!isset($data['href'])) {
- throw new \Exception($l->t("No href specified when installing app from http"));
- }
- $client = \OC::$server->getHTTPClientService()->newClient();
- $client->get($data['href'], ['save_to' => $path]);
- } else {
- if(!isset($data['path'])) {
- throw new \Exception($l->t("No path specified when installing app from local file"));
- }
- $path=$data['path'];
- }
+ // Verify if the certificate has been issued by the Nextcloud Code Authority CA
+ if($certificate->validateSignature() !== true) {
+ throw new \Exception(
+ sprintf(
+ 'App with id %s has a certificate not issued by a trusted Code Signing Authority',
+ $appId
+ )
+ );
+ }
- //detect the archive type
- $mime = \OC::$server->getMimeTypeDetector()->detect($path);
- if ($mime !=='application/zip' && $mime !== 'application/x-gzip' && $mime !== 'application/x-bzip2') {
- throw new \Exception($l->t("Archives of type %s are not supported", array($mime)));
- }
+ // Verify if the certificate is issued for the requested app id
+ $certInfo = openssl_x509_parse($app['certificate']);
+ if(!isset($certInfo['subject']['CN'])) {
+ throw new \Exception(
+ sprintf(
+ 'App with id %s has a cert with no CN',
+ $appId
+ )
+ );
+ }
+ if($certInfo['subject']['CN'] !== $appId) {
+ throw new \Exception(
+ sprintf(
+ 'App with id %s has a cert issued to %s',
+ $appId,
+ $certInfo['subject']['CN']
+ )
+ );
+ }
- //extract the archive in a temporary folder
- $extractDir = \OC::$server->getTempManager()->getTemporaryFolder();
- OC_Helper::rmdirr($extractDir);
- mkdir($extractDir);
- if($archive=\OC\Archive\Archive::open($path)) {
- $archive->extract($extractDir);
- } else {
- OC_Helper::rmdirr($extractDir);
- if($data['source']=='http') {
- unlink($path);
- }
- throw new \Exception($l->t("Failed to open archive when installing app"));
- }
+ // Download the release
+ $tempFile = $this->tempManager->getTemporaryFile('.tar.gz');
+ $client = $this->clientService->newClient();
+ $client->get($app['releases'][0]['download'], ['save_to' => $tempFile]);
+
+ // Check if the signature actually matches the downloaded content
+ $certificate = openssl_get_publickey($app['certificate']);
+ $verified = (bool)openssl_verify(file_get_contents($tempFile), base64_decode($app['releases'][0]['signature']), $certificate, OPENSSL_ALGO_SHA512);
+ openssl_free_key($certificate);
+
+ if($verified === true) {
+ // Seems to match, let's proceed
+ $extractDir = $this->tempManager->getTemporaryFolder();
+ $archive = new TAR($tempFile);
+
+ if($archive) {
+ $archive->extract($extractDir);
+ $allFiles = scandir($extractDir);
+ $folders = array_diff($allFiles, ['.', '..']);
+ $folders = array_values($folders);
+
+ if(count($folders) > 1) {
+ throw new \Exception(
+ sprintf(
+ 'Extracted app %s has more than 1 folder',
+ $appId
+ )
+ );
+ }
- return array(
- $extractDir,
- $path
- );
- }
+ // Check if appinfo/info.xml has the same app ID as well
+ $loadEntities = libxml_disable_entity_loader(false);
+ $xml = simplexml_load_file($extractDir . '/' . $folders[0] . '/appinfo/info.xml');
+ libxml_disable_entity_loader($loadEntities);
+ if((string)$xml->id !== $appId) {
+ throw new \Exception(
+ sprintf(
+ 'App for id %s has a wrong app ID in info.xml: %s',
+ $appId,
+ (string)$xml->id
+ )
+ );
+ }
- /**
- * check an app's integrity
- * @param array $data
- * @param string $extractDir
- * @param string $path
- * @param bool $isShipped
- * @return array
- * @throws \Exception
- */
- public static function checkAppsIntegrity($data, $extractDir, $path, $isShipped = false) {
- $l = \OC::$server->getL10N('lib');
- //load the info.xml file of the app
- if(!is_file($extractDir.'/appinfo/info.xml')) {
- //try to find it in a subdir
- $dh=opendir($extractDir);
- if(is_resource($dh)) {
- while (($folder = readdir($dh)) !== false) {
- if($folder[0]!='.' and is_dir($extractDir.'/'.$folder)) {
- if(is_file($extractDir.'/'.$folder.'/appinfo/info.xml')) {
- $extractDir.='/'.$folder;
+ $baseDir = OC_App::getInstallPath() . '/' . $appId;
+ // Remove old app with the ID if existent
+ OC_Helper::rmdirr($baseDir);
+ // Move to app folder
+ if(@mkdir($baseDir)) {
+ $extractDir .= '/' . $folders[0];
+ OC_Helper::copyr($extractDir, $baseDir);
}
+ OC_Helper::copyr($extractDir, $baseDir);
+ OC_Helper::rmdirr($extractDir);
+ return;
+ } else {
+ throw new \Exception(
+ sprintf(
+ 'Could not extract app with ID %s to %s',
+ $appId,
+ $extractDir
+ )
+ );
}
- }
- }
- }
- if(!is_file($extractDir.'/appinfo/info.xml')) {
- OC_Helper::rmdirr($extractDir);
- if($data['source'] === 'http') {
- unlink($path);
- }
- throw new \Exception($l->t("App does not provide an info.xml file"));
- }
-
- $info = OC_App::getAppInfo($extractDir.'/appinfo/info.xml', true);
- if(!is_array($info)) {
- throw new \Exception($l->t('App cannot be installed because appinfo file cannot be read.'));
- }
-
- // We can't trust the parsed info.xml file as it may have been tampered
- // with by an attacker and thus we need to use the local data to check
- // whether the application needs to be signed.
- $appId = OC_App::cleanAppId($data['appdata']['id']);
- $appBelongingToId = OC_App::getInternalAppIdByOcs($appId);
- if(is_string($appBelongingToId)) {
- $previouslySigned = \OC::$server->getConfig()->getAppValue($appBelongingToId, 'signed', 'false');
- } else {
- $appBelongingToId = $info['id'];
- $previouslySigned = 'false';
- }
- if($data['appdata']['level'] === OC_App::officialApp || $previouslySigned === 'true') {
- \OC::$server->getConfig()->setAppValue($appBelongingToId, 'signed', 'true');
- $integrityResult = \OC::$server->getIntegrityCodeChecker()->verifyAppSignature(
- $appBelongingToId,
- $extractDir
- );
- if($integrityResult !== []) {
- $e = new \Exception(
- $l->t(
- 'Signature could not get checked. Please contact the app developer and check your admin screen.'
+ } else {
+ // Signature does not match
+ throw new \Exception(
+ sprintf(
+ 'App with id %s has invalid signature',
+ $appId
)
- );
- throw $e;
+ );
+ }
}
}
- // check the code for not allowed calls
- if(!$isShipped && !Installer::checkCode($extractDir)) {
- OC_Helper::rmdirr($extractDir);
- throw new \Exception($l->t("App can't be installed because of not allowed code in the App"));
- }
-
- // check if the app is compatible with this version of ownCloud
- if(!OC_App::isAppCompatible(\OCP\Util::getVersion(), $info)) {
- OC_Helper::rmdirr($extractDir);
- throw new \Exception($l->t("App can't be installed because it is not compatible with this version of the server"));
- }
-
- // check if shipped tag is set which is only allowed for apps that are shipped with ownCloud
- if(!$isShipped && isset($info['shipped']) && ($info['shipped']=='true')) {
- OC_Helper::rmdirr($extractDir);
- throw new \Exception($l->t("App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps"));
- }
-
- // check if the ocs version is the same as the version in info.xml/version
- $version = trim($info['version']);
-
- if(isset($data['appdata']['version']) && $version<>trim($data['appdata']['version'])) {
- OC_Helper::rmdirr($extractDir);
- throw new \Exception($l->t("App can't be installed because the version in info.xml is not the same as the version reported from the app store"));
- }
-
- return $info;
+ throw new \Exception(
+ sprintf(
+ 'Could not download app %s',
+ $appId
+ )
+ );
}
/**
* Check if an update for the app is available
- * @param string $app
- * @return string|false false or the version number of the update
*
- * The function will check if an update for a version is available
+ * @param string $appId
+ * @param AppFetcher $appFetcher
+ * @return string|false false or the version number of the update
*/
- public static function isUpdateAvailable( $app ) {
+ public static function isUpdateAvailable($appId,
+ AppFetcher $appFetcher) {
static $isInstanceReadyForUpdates = null;
if ($isInstanceReadyForUpdates === null) {
@@ -436,27 +341,20 @@ class Installer {
return false;
}
- $ocsid=\OC::$server->getAppConfig()->getValue( $app, 'ocsid', '');
-
- if($ocsid<>'') {
- $ocsClient = new OCSClient(
- \OC::$server->getHTTPClientService(),
- \OC::$server->getConfig(),
- \OC::$server->getLogger()
- );
- $ocsdata = $ocsClient->getApplication($ocsid, \OCP\Util::getVersion());
- $ocsversion= (string) $ocsdata['version'];
- $currentversion=OC_App::getAppVersion($app);
- if (version_compare($ocsversion, $currentversion, '>')) {
- return($ocsversion);
- }else{
- return false;
+ $apps = $appFetcher->get();
+ foreach($apps as $app) {
+ if($app['id'] === $appId) {
+ $currentVersion = OC_App::getAppVersion($appId);
+ $newestVersion = $app['releases'][0]['version'];
+ if (version_compare($newestVersion, $currentVersion, '>')) {
+ return $newestVersion;
+ } else {
+ return false;
+ }
}
-
- }else{
- return false;
}
+ return false;
}
/**
@@ -466,7 +364,7 @@ class Installer {
*
* The function will check if the app is already downloaded in the apps repository
*/
- public static function isDownloaded( $name ) {
+ public function isDownloaded($name) {
foreach(\OC::$APPSROOTS as $dir) {
$dirToTest = $dir['path'];
$dirToTest .= '/';
@@ -483,7 +381,7 @@ class Installer {
/**
* Removes an app
- * @param string $name name of the application to remove
+ * @param string $appId ID of the application to remove
* @return boolean
*
*
@@ -494,12 +392,10 @@ class Installer {
* The function will not delete preferences, tables and the configuration,
* this has to be done by the function oc_app_uninstall().
*/
- public static function removeApp($appId) {
-
- if(Installer::isDownloaded( $appId )) {
- $appDir=OC_App::getInstallPath() . '/' . $appId;
+ public function removeApp($appId) {
+ if($this->isDownloaded( $appId )) {
+ $appDir = OC_App::getInstallPath() . '/' . $appId;
OC_Helper::rmdirr($appDir);
-
return true;
}else{
\OCP\Util::writeLog('core', 'can\'t remove app '.$appId.'. It is not installed.', \OCP\Util::ERROR);
@@ -620,7 +516,7 @@ class Installer {
}
/**
- * @param $basedir
+ * @param string $script
*/
private static function includeAppScript($script) {
if ( file_exists($script) ){
diff --git a/lib/private/Notification/Notification.php b/lib/private/Notification/Notification.php
index 7346f35f966..ffcb36af6e5 100644
--- a/lib/private/Notification/Notification.php
+++ b/lib/private/Notification/Notification.php
@@ -74,6 +74,12 @@ class Notification implements INotification {
protected $messageParsed;
/** @var string */
+ protected $messageRich;
+
+ /** @var array */
+ protected $messageRichParameters;
+
+ /** @var string */
protected $link;
/** @var string */
@@ -112,6 +118,8 @@ class Notification implements INotification {
$this->message = '';
$this->messageParameters = [];
$this->messageParsed = '';
+ $this->messageRich = '';
+ $this->messageRichParameters = [];
$this->link = '';
$this->icon = '';
$this->actions = [];
@@ -231,12 +239,10 @@ class Notification implements INotification {
if (!is_string($subject) || $subject === '' || isset($subject[64])) {
throw new \InvalidArgumentException('The given subject is invalid');
}
- $this->subject = $subject;
- if (!is_array($parameters)) {
- throw new \InvalidArgumentException('The given subject parameters are invalid');
- }
+ $this->subject = $subject;
$this->subjectParameters = $parameters;
+
return $this;
}
@@ -289,11 +295,8 @@ class Notification implements INotification {
if (!is_string($subject) || $subject === '') {
throw new \InvalidArgumentException('The given parsed subject is invalid');
}
- $this->subjectRich = $subject;
- if (!is_array($parameters)) {
- throw new \InvalidArgumentException('The given subject parameters are invalid');
- }
+ $this->subjectRich = $subject;
$this->subjectRichParameters = $parameters;
return $this;
@@ -326,12 +329,10 @@ class Notification implements INotification {
if (!is_string($message) || $message === '' || isset($message[64])) {
throw new \InvalidArgumentException('The given message is invalid');
}
- $this->message = $message;
- if (!is_array($parameters)) {
- throw new \InvalidArgumentException('The given message parameters are invalid');
- }
+ $this->message = $message;
$this->messageParameters = $parameters;
+
return $this;
}
@@ -374,6 +375,40 @@ class Notification implements INotification {
}
/**
+ * @param string $message
+ * @param array $parameters
+ * @return $this
+ * @throws \InvalidArgumentException if the message or parameters are invalid
+ * @since 9.2.0
+ */
+ public function setRichMessage($message, array $parameters = []) {
+ if (!is_string($message) || $message === '') {
+ throw new \InvalidArgumentException('The given parsed message is invalid');
+ }
+
+ $this->messageRich = $message;
+ $this->messageRichParameters = $parameters;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 9.2.0
+ */
+ public function getRichMessage() {
+ return $this->messageRich;
+ }
+
+ /**
+ * @return array[]
+ * @since 9.2.0
+ */
+ public function getRichMessageParameters() {
+ return $this->messageRichParameters;
+ }
+
+ /**
* @param string $link
* @return $this
* @throws \InvalidArgumentException if the link is invalid
@@ -516,6 +551,14 @@ class Notification implements INotification {
}
}
+ if ($this->getRichMessage() !== '' || !empty($this->getRichMessageParameters())) {
+ try {
+ $this->richValidator->validate($this->getRichMessage(), $this->getRichMessageParameters());
+ } catch (InvalidObjectExeption $e) {
+ return false;
+ }
+ }
+
return
$this->isValidCommon()
&&
diff --git a/lib/private/OCSClient.php b/lib/private/OCSClient.php
deleted file mode 100644
index 76c0b136c06..00000000000
--- a/lib/private/OCSClient.php
+++ /dev/null
@@ -1,351 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bart Visscher <bartv@thisnet.nl>
- * @author Brice Maron <brice@bmaron.net>
- * @author Felix Moeller <mail@felixmoeller.de>
- * @author Frank Karlitschek <frank@karlitschek.de>
- * @author Jarrett <JetUni@users.noreply.github.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Kamil Domanski <kdomanski@kdemail.net>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Sam Tuke <mail@samtuke.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC;
-
-use OCP\Http\Client\IClientService;
-use OCP\IConfig;
-use OCP\ILogger;
-
-/**
- * Class OCSClient is a class for communication with the ownCloud appstore
- *
- * @package OC
- */
-class OCSClient {
- /** @var IClientService */
- private $httpClientService;
- /** @var IConfig */
- private $config;
- /** @var ILogger */
- private $logger;
-
- /**
- * @param IClientService $httpClientService
- * @param IConfig $config
- * @param ILogger $logger
- */
- public function __construct(IClientService $httpClientService,
- IConfig $config,
- ILogger $logger) {
- $this->httpClientService = $httpClientService;
- $this->config = $config;
- $this->logger = $logger;
- }
-
- /**
- * Returns whether the AppStore is enabled (i.e. because the AppStore is disabled for EE)
- *
- * @return bool
- */
- public function isAppStoreEnabled() {
- return $this->config->getSystemValue('appstoreenabled', true) === true;
- }
-
- /**
- * Get the url of the OCS AppStore server.
- *
- * @return string of the AppStore server
- */
- private function getAppStoreUrl() {
- return $this->config->getSystemValue('appstoreurl', 'https://api.owncloud.com/v1');
- }
-
- /**
- * @param string $body
- * @param string $action
- * @return null|\SimpleXMLElement
- */
- private function loadData($body, $action) {
- $loadEntities = libxml_disable_entity_loader(true);
- $data = @simplexml_load_string($body);
- libxml_disable_entity_loader($loadEntities);
-
- if($data === false) {
- libxml_clear_errors();
- $this->logger->error(
- sprintf('Could not get %s, content was no valid XML', $action),
- [
- 'app' => 'core',
- ]
- );
- return null;
- }
-
- return $data;
- }
-
- /**
- * Get all the categories from the OCS server
- *
- * @param array $targetVersion The target ownCloud version
- * @return array|null an array of category ids or null
- * @note returns NULL if config value appstoreenabled is set to false
- * This function returns a list of all the application categories on the OCS server
- */
- public function getCategories(array $targetVersion) {
- if (!$this->isAppStoreEnabled()) {
- return null;
- }
-
- $client = $this->httpClientService->newClient();
- try {
- $response = $client->get(
- $this->getAppStoreUrl() . '/content/categories',
- [
- 'timeout' => 20,
- 'query' => [
- 'version' => implode('x', $targetVersion),
- ],
- ]
- );
- } catch(\Exception $e) {
- $this->logger->error(
- sprintf('Could not get categories: %s', $e->getMessage()),
- [
- 'app' => 'core',
- ]
- );
- return null;
- }
-
- $data = $this->loadData($response->getBody(), 'categories');
- if($data === null) {
- return null;
- }
-
- $tmp = $data->data;
- $cats = [];
-
- foreach ($tmp->category as $value) {
- $id = (int)$value->id;
- $name = (string)$value->name;
- $cats[$id] = $name;
- }
-
- return $cats;
- }
-
- /**
- * Get all the applications from the OCS server
- * @param array $categories
- * @param int $page
- * @param string $filter
- * @param array $targetVersion The target ownCloud version
- * @return array An array of application data
- */
- public function getApplications(array $categories, $page, $filter, array $targetVersion) {
- if (!$this->isAppStoreEnabled()) {
- return [];
- }
-
- $client = $this->httpClientService->newClient();
- try {
- $response = $client->get(
- $this->getAppStoreUrl() . '/content/data',
- [
- 'timeout' => 20,
- 'query' => [
- 'version' => implode('x', $targetVersion),
- 'filter' => $filter,
- 'categories' => implode('x', $categories),
- 'sortmode' => 'new',
- 'page' => $page,
- 'pagesize' => 100,
- 'approved' => $filter
- ],
- ]
- );
- } catch(\Exception $e) {
- $this->logger->error(
- sprintf('Could not get applications: %s', $e->getMessage()),
- [
- 'app' => 'core',
- ]
- );
- return [];
- }
-
- $data = $this->loadData($response->getBody(), 'applications');
- if($data === null) {
- return [];
- }
-
- $tmp = $data->data->content;
- $tmpCount = count($tmp);
-
- $apps = [];
- for ($i = 0; $i < $tmpCount; $i++) {
- $app = [];
- $app['id'] = (string)$tmp[$i]->id;
- $app['name'] = (string)$tmp[$i]->name;
- $app['label'] = (string)$tmp[$i]->label;
- $app['version'] = (string)$tmp[$i]->version;
- $app['type'] = (string)$tmp[$i]->typeid;
- $app['typename'] = (string)$tmp[$i]->typename;
- $app['personid'] = (string)$tmp[$i]->personid;
- $app['profilepage'] = (string)$tmp[$i]->profilepage;
- $app['license'] = (string)$tmp[$i]->license;
- $app['detailpage'] = (string)$tmp[$i]->detailpage;
- $app['preview'] = (string)$tmp[$i]->smallpreviewpic1;
- $app['preview-full'] = (string)$tmp[$i]->previewpic1;
- $app['changed'] = strtotime($tmp[$i]->changed);
- $app['description'] = (string)$tmp[$i]->description;
- $app['score'] = (string)$tmp[$i]->score;
- $app['downloads'] = (int)$tmp[$i]->downloads;
- $app['level'] = (int)$tmp[$i]->approved;
-
- $apps[] = $app;
- }
-
- return $apps;
- }
-
-
- /**
- * Get an the applications from the OCS server
- *
- * @param string $id
- * @param array $targetVersion The target ownCloud version
- * @return array|null an array of application data or null
- *
- * This function returns an applications from the OCS server
- */
- public function getApplication($id, array $targetVersion) {
- if (!$this->isAppStoreEnabled()) {
- return null;
- }
-
- $client = $this->httpClientService->newClient();
- try {
- $response = $client->get(
- $this->getAppStoreUrl() . '/content/data/' . urlencode($id),
- [
- 'timeout' => 20,
- 'query' => [
- 'version' => implode('x', $targetVersion),
- ],
- ]
- );
- } catch(\Exception $e) {
- $this->logger->error(
- sprintf('Could not get application: %s', $e->getMessage()),
- [
- 'app' => 'core',
- ]
- );
- return null;
- }
-
- $data = $this->loadData($response->getBody(), 'application');
- if($data === null) {
- return null;
- }
-
- $tmp = $data->data->content;
- if (is_null($tmp)) {
- \OCP\Util::writeLog('core', 'No update found at the ownCloud appstore for app ' . $id, \OCP\Util::DEBUG);
- return null;
- }
-
- $app = [];
- $app['id'] = (int)$id;
- $app['name'] = (string)$tmp->name;
- $app['version'] = (string)$tmp->version;
- $app['type'] = (string)$tmp->typeid;
- $app['label'] = (string)$tmp->label;
- $app['typename'] = (string)$tmp->typename;
- $app['personid'] = (string)$tmp->personid;
- $app['profilepage'] = (string)$tmp->profilepage;
- $app['detailpage'] = (string)$tmp->detailpage;
- $app['preview1'] = (string)$tmp->smallpreviewpic1;
- $app['preview2'] = (string)$tmp->smallpreviewpic2;
- $app['preview3'] = (string)$tmp->smallpreviewpic3;
- $app['changed'] = strtotime($tmp->changed);
- $app['description'] = (string)$tmp->description;
- $app['detailpage'] = (string)$tmp->detailpage;
- $app['score'] = (int)$tmp->score;
- $app['level'] = (int)$tmp->approved;
-
- return $app;
- }
-
- /**
- * Get the download url for an application from the OCS server
- * @param string $id
- * @param array $targetVersion The target ownCloud version
- * @return array|null an array of application data or null
- */
- public function getApplicationDownload($id, array $targetVersion) {
- if (!$this->isAppStoreEnabled()) {
- return null;
- }
- $url = $this->getAppStoreUrl() . '/content/download/' . urlencode($id) . '/1';
- $client = $this->httpClientService->newClient();
- try {
- $response = $client->get(
- $url,
- [
- 'timeout' => 20,
- 'query' => [
- 'version' => implode('x', $targetVersion),
- ],
- ]
- );
- } catch(\Exception $e) {
- $this->logger->error(
- sprintf('Could not get application download URL: %s', $e->getMessage()),
- [
- 'app' => 'core',
- ]
- );
- return null;
- }
-
- $data = $this->loadData($response->getBody(), 'application download URL');
- if($data === null) {
- return null;
- }
-
- $tmp = $data->data->content;
- $app = [];
- if (isset($tmp->downloadlink)) {
- $app['downloadlink'] = (string)$tmp->downloadlink;
- } else {
- $app['downloadlink'] = '';
- }
- return $app;
- }
-
-}
diff --git a/lib/private/Security/CSRF/CsrfToken.php b/lib/private/Security/CSRF/CsrfToken.php
index dce9a83b727..e9bdf5b5204 100644
--- a/lib/private/Security/CSRF/CsrfToken.php
+++ b/lib/private/Security/CSRF/CsrfToken.php
@@ -51,8 +51,8 @@ class CsrfToken {
*/
public function getEncryptedValue() {
if($this->encryptedValue === '') {
- $sharedSecret = base64_encode(random_bytes(strlen($this->value)));
- $this->encryptedValue = base64_encode($this->value ^ $sharedSecret) . ':' . $sharedSecret;
+ $sharedSecret = random_bytes(strlen($this->value));
+ $this->encryptedValue = base64_encode($this->value ^ $sharedSecret) . ':' . base64_encode($sharedSecret);
}
return $this->encryptedValue;
@@ -71,6 +71,6 @@ class CsrfToken {
}
$obfuscatedToken = $token[0];
$secret = $token[1];
- return base64_decode($obfuscatedToken) ^ $secret;
+ return base64_decode($obfuscatedToken) ^ base64_decode($secret);
}
}
diff --git a/lib/private/Security/CSRF/TokenStorage/SessionStorage.php b/lib/private/Security/CSRF/TokenStorage/SessionStorage.php
index cf4cdfa5036..9d2e723a6d3 100644
--- a/lib/private/Security/CSRF/TokenStorage/SessionStorage.php
+++ b/lib/private/Security/CSRF/TokenStorage/SessionStorage.php
@@ -41,6 +41,13 @@ class SessionStorage {
}
/**
+ * @param ISession $session
+ */
+ public function setSession(ISession $session) {
+ $this->session = $session;
+ }
+
+ /**
* Returns the current token or throws an exception if none is found.
*
* @return string
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 21ec311401d..dca50c15733 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Bart Visscher <bartv@thisnet.nl>
@@ -41,6 +42,8 @@
namespace OC;
use bantu\IniGetWrapper\IniGetWrapper;
+use OC\App\AppStore\Fetcher\AppFetcher;
+use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\AppFramework\Http\Request;
use OC\AppFramework\Db\Db;
use OC\AppFramework\Utility\TimeFactory;
@@ -242,7 +245,7 @@ class Server extends ServerContainer implements IServerContainer {
$defaultTokenProvider = null;
}
- $userSession = new \OC\User\Session($manager, $session, $timeFactory, $defaultTokenProvider, $c->getConfig());
+ $userSession = new \OC\User\Session($manager, $session, $timeFactory, $defaultTokenProvider, $c->getConfig(), $c->getSecureRandom());
$userSession->listen('\OC\User', 'preCreateUser', function ($uid, $password) {
\OC_Hook::emit('OC_User', 'pre_createUser', array('run' => true, 'uid' => $uid, 'password' => $password));
});
@@ -283,7 +286,7 @@ class Server extends ServerContainer implements IServerContainer {
return $userSession;
});
- $this->registerService('\OC\Authentication\TwoFactorAuth\Manager', function (Server $c) {
+ $this->registerService(\OC\Authentication\TwoFactorAuth\Manager::class, function (Server $c) {
return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig());
});
@@ -320,6 +323,21 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerService('AppHelper', function ($c) {
return new \OC\AppHelper();
});
+ $this->registerService('AppFetcher', function ($c) {
+ return new AppFetcher(
+ $this->getAppDataDir('appstore'),
+ $this->getHTTPClientService(),
+ $this->query(TimeFactory::class),
+ $this->getConfig()
+ );
+ });
+ $this->registerService('CategoryFetcher', function ($c) {
+ return new CategoryFetcher(
+ $this->getAppDataDir('appstore'),
+ $this->getHTTPClientService(),
+ $this->query(TimeFactory::class)
+ );
+ });
$this->registerService('UserCache', function ($c) {
return new Cache\File();
});
@@ -580,13 +598,6 @@ class Server extends ServerContainer implements IServerContainer {
$c->getThemingDefaults()
);
});
- $this->registerService('OcsClient', function (Server $c) {
- return new OCSClient(
- $this->getHTTPClientService(),
- $this->getConfig(),
- $this->getLogger()
- );
- });
$this->registerService('LDAPProvider', function(Server $c) {
$config = $c->getConfig();
$factoryClass = $config->getSystemValue('ldapProviderFactory', null);
@@ -699,13 +710,15 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerService('CsrfTokenManager', function (Server $c) {
$tokenGenerator = new CsrfTokenGenerator($c->getSecureRandom());
- $sessionStorage = new SessionStorage($c->getSession());
return new CsrfTokenManager(
$tokenGenerator,
- $sessionStorage
+ $c->query(SessionStorage::class)
);
});
+ $this->registerService(SessionStorage::class, function (Server $c) {
+ return new SessionStorage($c->getSession());
+ });
$this->registerService('ContentSecurityPolicyManager', function (Server $c) {
return new ContentSecurityPolicyManager();
});
@@ -934,6 +947,7 @@ class Server extends ServerContainer implements IServerContainer {
* @param \OCP\ISession $session
*/
public function setSession(\OCP\ISession $session) {
+ $this->query(SessionStorage::class)->setSession($session);
return $this->query('UserSession')->setSession($session);
}
@@ -1008,6 +1022,13 @@ class Server extends ServerContainer implements IServerContainer {
}
/**
+ * @return AppFetcher
+ */
+ public function getAppFetcher() {
+ return $this->query('AppFetcher');
+ }
+
+ /**
* Returns an ICache instance. Since 8.1.0 it returns a fake cache. Use
* getMemCacheFactory() instead.
*
diff --git a/lib/private/Settings/Admin/Sharing.php b/lib/private/Settings/Admin/Sharing.php
index 59821044605..9b17efa8028 100644
--- a/lib/private/Settings/Admin/Sharing.php
+++ b/lib/private/Settings/Admin/Sharing.php
@@ -52,8 +52,6 @@ class Sharing implements ISettings {
// Built-In Sharing
'allowGroupSharing' => $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes'),
'allowLinks' => $this->config->getAppValue('core', 'shareapi_allow_links', 'yes'),
- 'allowMailNotification' => $this->config->getAppValue('core', 'shareapi_allow_mail_notification', 'no'),
- 'allowPublicMailNotification' => $this->config->getAppValue('core', 'shareapi_allow_public_notification', 'no'),
'allowPublicUpload' => $this->config->getAppValue('core', 'shareapi_allow_public_upload', 'yes'),
'allowResharing' => $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes'),
'allowShareDialogUserEnumeration' => $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes'),
diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php
index c022616d8b3..d1399c8821c 100644
--- a/lib/private/Setup/MySQL.php
+++ b/lib/private/Setup/MySQL.php
@@ -87,14 +87,22 @@ class MySQL extends AbstractDatabase {
* @throws \OC\DatabaseSetupException
*/
private function createDBUser($connection) {
- $name = $this->dbUser;
- $password = $this->dbPassword;
- // we need to create 2 accounts, one for global use and one for local user. if we don't specify the local one,
- // the anonymous user would take precedence when there is one.
- $query = "CREATE USER '$name'@'localhost' IDENTIFIED BY '$password'";
- $connection->executeUpdate($query);
- $query = "CREATE USER '$name'@'%' IDENTIFIED BY '$password'";
- $connection->executeUpdate($query);
+ try{
+ $name = $this->dbUser;
+ $password = $this->dbPassword;
+ // we need to create 2 accounts, one for global use and one for local user. if we don't specify the local one,
+ // the anonymous user would take precedence when there is one.
+ $query = "CREATE USER '$name'@'localhost' IDENTIFIED BY '$password'";
+ $connection->executeUpdate($query);
+ $query = "CREATE USER '$name'@'%' IDENTIFIED BY '$password'";
+ $connection->executeUpdate($query);
+ }
+ catch (\Exception $ex){
+ $this->logger->error('Database User creation failed: {error}', [
+ 'app' => 'mysql.setup',
+ 'error' => $ex->getMessage()
+ ]);
+ }
}
/**
diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php
index 13a5a044e8a..f13f83f8ba9 100644
--- a/lib/private/Share/Constants.php
+++ b/lib/private/Share/Constants.php
@@ -29,9 +29,9 @@ class Constants {
const SHARE_TYPE_USER = 0;
const SHARE_TYPE_GROUP = 1;
const SHARE_TYPE_LINK = 3;
- const SHARE_TYPE_EMAIL = 4; // ToDo Check if it is still in use otherwise remove it
+ const SHARE_TYPE_EMAIL = 4;
const SHARE_TYPE_CONTACT = 5; // ToDo Check if it is still in use otherwise remove it
- const SHARE_TYPE_REMOTE = 6; // ToDo Check if it is still in use otherwise remove it
+ const SHARE_TYPE_REMOTE = 6;
const FORMAT_NONE = -1;
const FORMAT_STATUSES = -2;
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 56b9d5b1ee8..bdb6ac466ec 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -24,6 +24,7 @@
namespace OC\Share20;
use OCP\Files\File;
+use OCP\Files\Folder;
use OCP\Share\IShareProvider;
use OC\Share20\Exception\InvalidShare;
use OC\Share20\Exception\ProviderException;
@@ -454,6 +455,50 @@ class DefaultShareProvider implements IShareProvider {
return $share;
}
+ public function getSharesInFolder($userId, Folder $node, $reshares) {
+ $qb = $this->dbConn->getQueryBuilder();
+ $qb->select('*')
+ ->from('share', 's')
+ ->andWhere($qb->expr()->orX(
+ $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
+ $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
+ ));
+
+ $qb->andWhere($qb->expr()->orX(
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
+ $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
+ ));
+
+ /**
+ * Reshares for this user are shares where they are the owner.
+ */
+ if ($reshares === false) {
+ $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
+ } else {
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
+ $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
+ )
+ );
+ }
+
+ $qb->innerJoin('s', 'filecache' ,'f', 's.file_source = f.fileid');
+ $qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
+
+ $qb->orderBy('id');
+
+ $cursor = $qb->execute();
+ $shares = [];
+ while ($data = $cursor->fetch()) {
+ $shares[$data['fileid']][] = $this->createShare($data);
+ }
+ $cursor->closeCursor();
+
+ return $shares;
+ }
+
/**
* @inheritdoc
*/
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 22cf5a3f65a..0c49d0b6490 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -30,10 +30,12 @@ namespace OC\Share20;
use OC\Cache\CappedMemoryCache;
use OC\Files\Mount\MoveableMount;
use OC\HintException;
+use OC\Share20\Exception\ProviderException;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\Mount\IMountManager;
+use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IConfig;
use OCP\IGroupManager;
@@ -48,6 +50,7 @@ use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;
+use OCP\Share\IShareProvider;
/**
* This class is the communication hub for all sharing related operations.
@@ -183,6 +186,10 @@ class Manager implements IManager {
if ($share->getSharedWith() === null) {
throw new \InvalidArgumentException('SharedWith should not be empty');
}
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
+ if ($share->getSharedWith() === null) {
+ throw new \InvalidArgumentException('SharedWith should not be empty');
+ }
} else {
// We can't handle other types yet
throw new \InvalidArgumentException('unkown share type');
@@ -578,6 +585,16 @@ class Manager implements IManager {
if ($share->getPassword() !== null) {
$share->setPassword($this->hasher->hash($share->getPassword()));
}
+ } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
+ $this->linkCreateChecks($share);
+ $share->setToken(
+ $this->secureRandom->generate(
+ \OC\Share\Constants::TOKEN_LENGTH,
+ \OCP\Security\ISecureRandom::CHAR_LOWER.
+ \OCP\Security\ISecureRandom::CHAR_UPPER.
+ \OCP\Security\ISecureRandom::CHAR_DIGITS
+ )
+ );
}
// Cannot share with the owner
@@ -881,6 +898,22 @@ class Manager implements IManager {
$provider->move($share, $recipientId);
}
+ public function getSharesInFolder($userId, Folder $node, $reshares = false) {
+ $providers = $this->factory->getAllProviders();
+
+ return array_reduce($providers, function($shares, IShareProvider $provider) use ($userId, $node, $reshares) {
+ $newShares = $provider->getSharesInFolder($userId, $node, $reshares);
+ foreach ($newShares as $fid => $data) {
+ if (!isset($shares[$fid])) {
+ $shares[$fid] = [];
+ }
+
+ $shares[$fid] = array_merge($shares[$fid], $data);
+ }
+ return $shares;
+ }, []);
+ }
+
/**
* @inheritdoc
*/
@@ -1016,6 +1049,16 @@ class Manager implements IManager {
// If it is not a link share try to fetch a federated share by token
if ($share === null) {
$provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_REMOTE);
+ try {
+ $share = $provider->getShareByToken($token);
+ } catch (ShareNotFound $e) {
+ $share = null;
+ }
+ }
+
+ // If it is not a link share try to fetch a federated share by token
+ if ($share === null && $this->shareProviderExists(\OCP\Share::SHARE_TYPE_EMAIL)) {
+ $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_EMAIL);
$share = $provider->getShareByToken($token);
}
@@ -1259,4 +1302,17 @@ class Manager implements IManager {
return $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes';
}
+ /**
+ * @inheritdoc
+ */
+ public function shareProviderExists($shareType) {
+ try {
+ $this->factory->getProviderForType($shareType);
+ } catch (ProviderException $e) {
+ return false;
+ }
+
+ return true;
+ }
+
}
diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php
index e3de10a8aee..457cf117c69 100644
--- a/lib/private/Share20/ProviderFactory.php
+++ b/lib/private/Share20/ProviderFactory.php
@@ -28,6 +28,7 @@ use OCA\FederatedFileSharing\DiscoveryManager;
use OCA\FederatedFileSharing\FederatedShareProvider;
use OCA\FederatedFileSharing\Notifications;
use OCA\FederatedFileSharing\TokenHandler;
+use OCA\ShareByMail\ShareByMailProvider;
use OCP\Share\IProviderFactory;
use OC\Share20\Exception\ProviderException;
use OCP\IServerContainer;
@@ -45,6 +46,8 @@ class ProviderFactory implements IProviderFactory {
private $defaultProvider = null;
/** @var FederatedShareProvider */
private $federatedProvider = null;
+ /** @var ShareByMailProvider */
+ private $shareByMailProvider;
/**
* IProviderFactory constructor.
@@ -126,6 +129,39 @@ class ProviderFactory implements IProviderFactory {
}
/**
+ * Create the federated share provider
+ *
+ * @return FederatedShareProvider
+ */
+ protected function getShareByMailProvider() {
+ if ($this->shareByMailProvider === null) {
+ /*
+ * Check if the app is enabled
+ */
+ $appManager = $this->serverContainer->getAppManager();
+ if (!$appManager->isEnabledForUser('sharebymail')) {
+ return null;
+ }
+
+ $l = $this->serverContainer->getL10N('sharebymail');
+
+ $this->shareByMailProvider = new ShareByMailProvider(
+ $this->serverContainer->getDatabaseConnection(),
+ $this->serverContainer->getSecureRandom(),
+ $this->serverContainer->getUserManager(),
+ $this->serverContainer->getLazyRootFolder(),
+ $l,
+ $this->serverContainer->getLogger(),
+ $this->serverContainer->getMailer(),
+ $this->serverContainer->getURLGenerator()
+ );
+ }
+
+ return $this->shareByMailProvider;
+ }
+
+
+ /**
* @inheritdoc
*/
public function getProvider($id) {
@@ -134,6 +170,8 @@ class ProviderFactory implements IProviderFactory {
$provider = $this->defaultShareProvider();
} else if ($id === 'ocFederatedSharing') {
$provider = $this->federatedShareProvider();
+ } else if ($id = 'ocMailShare') {
+ $provider = $this->getShareByMailProvider();
}
if ($provider === null) {
@@ -155,6 +193,8 @@ class ProviderFactory implements IProviderFactory {
$provider = $this->defaultShareProvider();
} else if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) {
$provider = $this->federatedShareProvider();
+ } else if ($shareType === \OCP\Share::SHARE_TYPE_EMAIL) {
+ $provider = $this->getShareByMailProvider();
}
if ($provider === null) {
@@ -163,4 +203,8 @@ class ProviderFactory implements IProviderFactory {
return $provider;
}
+
+ public function getAllProviders() {
+ return [$this->defaultShareProvider(), $this->federatedShareProvider()];
+ }
}
diff --git a/lib/private/Updater.php b/lib/private/Updater.php
index 646fc031a83..e7f7a944902 100644
--- a/lib/private/Updater.php
+++ b/lib/private/Updater.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Frank Karlitschek <frank@karlitschek.de>
@@ -381,6 +382,9 @@ class Updater extends BasicEmitter {
// check if the app is compatible with this version of ownCloud
$info = OC_App::getAppInfo($app);
if(!OC_App::isAppCompatible($version, $info)) {
+ if (OC_App::isShipped($app)) {
+ throw new \UnexpectedValueException('The files of the app "' . $app . '" were not correctly replaced before running the update');
+ }
OC_App::disable($app);
$this->emit('\OC\Updater', 'incompatibleAppDisabled', array($app));
}
@@ -426,11 +430,15 @@ class Updater extends BasicEmitter {
private function upgradeAppStoreApps(array $disabledApps) {
foreach($disabledApps as $app) {
try {
- if (Installer::isUpdateAvailable($app)) {
- $ocsId = \OC::$server->getConfig()->getAppValue($app, 'ocsid', '');
-
- $this->emit('\OC\Updater', 'upgradeAppStoreApp', array($app));
- Installer::updateAppByOCSId($ocsId);
+ $installer = new Installer(
+ \OC::$server->getAppFetcher(),
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getTempManager(),
+ $this->log
+ );
+ if (Installer::isUpdateAvailable($app, \OC::$server->getAppFetcher())) {
+ $this->emit('\OC\Updater', 'upgradeAppStoreApp', [$app]);
+ $installer->updateAppstoreApp($app);
}
} catch (\Exception $ex) {
$this->log->logException($ex, ['app' => 'core']);
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index a213ee48c2a..7215cbe4188 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -48,6 +48,7 @@ use OCP\ISession;
use OCP\IUser;
use OCP\IUserManager;
use OCP\IUserSession;
+use OCP\Security\ISecureRandom;
use OCP\Session\Exceptions\SessionNotAvailableException;
use OCP\Util;
@@ -89,23 +90,29 @@ class Session implements IUserSession, Emitter {
/** @var User $activeUser */
protected $activeUser;
+ /** @var ISecureRandom */
+ private $random;
+
/**
* @param IUserManager $manager
* @param ISession $session
* @param ITimeFactory $timeFacory
* @param IProvider $tokenProvider
* @param IConfig $config
+ * @param ISecureRandom $random
*/
public function __construct(IUserManager $manager,
ISession $session,
ITimeFactory $timeFacory,
$tokenProvider,
- IConfig $config) {
+ IConfig $config,
+ ISecureRandom $random) {
$this->manager = $manager;
$this->session = $session;
$this->timeFacory = $timeFacory;
$this->tokenProvider = $tokenProvider;
$this->config = $config;
+ $this->random = $random;
}
/**
@@ -526,9 +533,10 @@ class Session implements IUserSession, Emitter {
* @param string $uid user UID
* @param string $loginName login name
* @param string $password
+ * @param int $remember
* @return boolean
*/
- public function createSessionToken(IRequest $request, $uid, $loginName, $password = null) {
+ public function createSessionToken(IRequest $request, $uid, $loginName, $password = null, $remember = IToken::DO_NOT_REMEMBER) {
if (is_null($this->manager->get($uid))) {
// User does not exist
return false;
@@ -537,7 +545,7 @@ class Session implements IUserSession, Emitter {
try {
$sessionId = $this->session->getId();
$pwd = $this->getPassword($password);
- $this->tokenProvider->generateToken($sessionId, $uid, $loginName, $pwd, $name);
+ $this->tokenProvider->generateToken($sessionId, $uid, $loginName, $pwd, $name, IToken::TEMPORARY_TOKEN, IToken::REMEMBER);
return true;
} catch (SessionNotAvailableException $ex) {
// This can happen with OCC, where a memory session is used
@@ -680,9 +688,10 @@ class Session implements IUserSession, Emitter {
*
* @param string $uid the username
* @param string $currentToken
+ * @param string $oldSessionId
* @return bool
*/
- public function loginWithCookie($uid, $currentToken) {
+ public function loginWithCookie($uid, $currentToken, $oldSessionId) {
$this->session->regenerateId();
$this->manager->emit('\OC\User', 'preRememberedLogin', array($uid));
$user = $this->manager->get($uid);
@@ -692,15 +701,26 @@ class Session implements IUserSession, Emitter {
}
// get stored tokens
- $tokens = OC::$server->getConfig()->getUserKeys($uid, 'login_token');
+ $tokens = $this->config->getUserKeys($uid, 'login_token');
// test cookies token against stored tokens
if (!in_array($currentToken, $tokens, true)) {
return false;
}
// replace successfully used token with a new one
- OC::$server->getConfig()->deleteUserValue($uid, 'login_token', $currentToken);
- $newToken = OC::$server->getSecureRandom()->generate(32);
- OC::$server->getConfig()->setUserValue($uid, 'login_token', $newToken, time());
+ $this->config->deleteUserValue($uid, 'login_token', $currentToken);
+ $newToken = $this->random->generate(32);
+ $this->config->setUserValue($uid, 'login_token', $newToken, $this->timeFacory->getTime());
+
+ try {
+ $sessionId = $this->session->getId();
+ $this->tokenProvider->renewSessionToken($oldSessionId, $sessionId);
+ } catch (SessionNotAvailableException $ex) {
+ return false;
+ } catch (InvalidTokenException $ex) {
+ \OC::$server->getLogger()->warning('Renewing session token failed', ['app' => 'core']);
+ return false;
+ }
+
$this->setMagicInCookie($user->getUID(), $newToken);
//login
@@ -710,6 +730,15 @@ class Session implements IUserSession, Emitter {
}
/**
+ * @param IUser $user
+ */
+ public function createRememberMeToken(IUser $user) {
+ $token = $this->random->generate(32);
+ $this->config->setUserValue($user->getUID(), 'login_token', $token, $this->timeFacory->getTime());
+ $this->setMagicInCookie($user->getUID(), $token);
+ }
+
+ /**
* logout the user from the session
*/
public function logout() {
@@ -736,10 +765,19 @@ class Session implements IUserSession, Emitter {
*/
public function setMagicInCookie($username, $token) {
$secureCookie = OC::$server->getRequest()->getServerProtocol() === 'https';
- $expires = time() + OC::$server->getConfig()->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
- setcookie('oc_username', $username, $expires, OC::$WEBROOT, '', $secureCookie, true);
- setcookie('oc_token', $token, $expires, OC::$WEBROOT, '', $secureCookie, true);
- setcookie('oc_remember_login', '1', $expires, OC::$WEBROOT, '', $secureCookie, true);
+ $webRoot = \OC::$WEBROOT;
+ if ($webRoot === '') {
+ $webRoot = '/';
+ }
+
+ $expires = $this->timeFacory->getTime() + $this->config->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15);
+ setcookie('nc_username', $username, $expires, $webRoot, '', $secureCookie, true);
+ setcookie('nc_token', $token, $expires, $webRoot, '', $secureCookie, true);
+ try {
+ setcookie('nc_session_id', $this->session->getId(), $expires, $webRoot, '', $secureCookie, true);
+ } catch (SessionNotAvailableException $ex) {
+ // ignore
+ }
}
/**
@@ -749,17 +787,17 @@ class Session implements IUserSession, Emitter {
//TODO: DI for cookies and IRequest
$secureCookie = OC::$server->getRequest()->getServerProtocol() === 'https';
- unset($_COOKIE['oc_username']); //TODO: DI
- unset($_COOKIE['oc_token']);
- unset($_COOKIE['oc_remember_login']);
- setcookie('oc_username', '', time() - 3600, OC::$WEBROOT, '', $secureCookie, true);
- setcookie('oc_token', '', time() - 3600, OC::$WEBROOT, '', $secureCookie, true);
- setcookie('oc_remember_login', '', time() - 3600, OC::$WEBROOT, '', $secureCookie, true);
+ unset($_COOKIE['nc_username']); //TODO: DI
+ unset($_COOKIE['nc_token']);
+ unset($_COOKIE['nc_session_id']);
+ setcookie('nc_username', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT, '', $secureCookie, true);
+ setcookie('nc_token', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT, '', $secureCookie, true);
+ setcookie('nc_session_id', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT, '', $secureCookie, true);
// old cookies might be stored under /webroot/ instead of /webroot
// and Firefox doesn't like it!
- setcookie('oc_username', '', time() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
- setcookie('oc_token', '', time() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
- setcookie('oc_remember_login', '', time() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
+ setcookie('nc_username', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
+ setcookie('nc_token', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
+ setcookie('nc_session_id', '', $this->timeFacory->getTime() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true);
}
/**
@@ -779,4 +817,5 @@ class Session implements IUserSession, Emitter {
}
}
+
}
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index d25534aa822..a89a4650c5d 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -1,6 +1,7 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, Lukas Reschke <lukas@statuscode.ch>
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Bart Visscher <bartv@thisnet.nl>
@@ -326,24 +327,44 @@ class OC_App {
/**
* enables an app
*
- * @param mixed $app app
+ * @param string $appId
* @param array $groups (optional) when set, only these groups will have access to the app
* @throws \Exception
* @return void
*
* This function set an app as enabled in appconfig.
*/
- public static function enable($app, $groups = null) {
+ public function enable($appId,
+ $groups = null) {
self::$enabledAppsCache = []; // flush
- if (!Installer::isInstalled($app)) {
- $app = self::installApp($app);
+ $l = \OC::$server->getL10N('core');
+ $config = \OC::$server->getConfig();
+
+ // Check if app is already downloaded
+ $installer = new Installer(
+ \OC::$server->getAppFetcher(),
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getTempManager(),
+ \OC::$server->getLogger()
+ );
+ $isDownloaded = $installer->isDownloaded($appId);
+
+ if(!$isDownloaded) {
+ $installer->downloadApp($appId);
+ }
+
+ if (!Installer::isInstalled($appId)) {
+ $appId = self::installApp(
+ $appId,
+ $config,
+ $l
+ );
+ $installer->installApp($appId);
} else {
// check for required dependencies
- $config = \OC::$server->getConfig();
- $l = \OC::$server->getL10N('core');
- $info = self::getAppInfo($app);
-
+ $info = self::getAppInfo($appId);
self::checkAppDependencies($config, $l, $info);
+ $installer->installApp($appId);
}
$appManager = \OC::$server->getAppManager();
@@ -356,42 +377,21 @@ class OC_App {
$groupsList[] = $groupManager->get($group);
}
}
- $appManager->enableAppForGroups($app, $groupsList);
+ $appManager->enableAppForGroups($appId, $groupsList);
} else {
- $appManager->enableApp($app);
+ $appManager->enableApp($appId);
}
- $info = self::getAppInfo($app);
+ $info = self::getAppInfo($appId);
if(isset($info['settings']) && is_array($info['settings'])) {
- $appPath = self::getAppPath($app);
- self::registerAutoloading($app, $appPath);
+ $appPath = self::getAppPath($appId);
+ self::registerAutoloading($appId, $appPath);
\OC::$server->getSettingsManager()->setupSettings($info['settings']);
}
}
/**
* @param string $app
- * @return int
- */
- private static function downloadApp($app) {
- $ocsClient = new OCSClient(
- \OC::$server->getHTTPClientService(),
- \OC::$server->getConfig(),
- \OC::$server->getLogger()
- );
- $appData = $ocsClient->getApplication($app, \OCP\Util::getVersion());
- $download = $ocsClient->getApplicationDownload($app, \OCP\Util::getVersion());
- if(isset($download['downloadlink']) and $download['downloadlink']!='') {
- // Replace spaces in download link without encoding entire URL
- $download['downloadlink'] = str_replace(' ', '%20', $download['downloadlink']);
- $info = array('source' => 'http', 'href' => $download['downloadlink'], 'appdata' => $appData);
- $app = Installer::installApp($info);
- }
- return $app;
- }
-
- /**
- * @param string $app
* @return bool
*/
public static function removeApp($app) {
@@ -399,7 +399,13 @@ class OC_App {
return false;
}
- return Installer::removeApp($app);
+ $installer = new Installer(
+ \OC::$server->getAppFetcher(),
+ \OC::$server->getHTTPClientService(),
+ \OC::$server->getTempManager(),
+ \OC::$server->getLogger()
+ );
+ return $installer->removeApp($app);
}
/**
@@ -409,11 +415,6 @@ class OC_App {
* @throws Exception
*/
public static function disable($app) {
- // Convert OCS ID to regular application identifier
- if(self::getInternalAppIdByOcs($app) !== false) {
- $app = self::getInternalAppIdByOcs($app);
- }
-
// flush
self::$enabledAppsCache = array();
@@ -554,7 +555,7 @@ class OC_App {
* @param string $appId
* @return false|string
*/
- protected static function findAppInDirectories($appId) {
+ public static function findAppInDirectories($appId) {
$sanitizedAppId = self::cleanAppId($appId);
if($sanitizedAppId !== $appId) {
return false;
@@ -613,18 +614,6 @@ class OC_App {
return false;
}
-
- /**
- * check if an app's directory is writable
- *
- * @param string $appId
- * @return bool
- */
- public static function isAppDirWritable($appId) {
- $path = self::getAppPath($appId);
- return ($path !== false) ? is_writable($path) : false;
- }
-
/**
* Get the path for the given app on the access
* If the app is defined in multiple directories, the first one is taken. (false if not found)
@@ -837,20 +826,11 @@ class OC_App {
/**
* List all apps, this is used in apps.php
*
- * @param bool $onlyLocal
- * @param bool $includeUpdateInfo Should we check whether there is an update
- * in the app store?
- * @param OCSClient $ocsClient
* @return array
*/
- public static function listAllApps($onlyLocal = false,
- $includeUpdateInfo = true,
- OCSClient $ocsClient) {
+ public function listAllApps() {
$installedApps = OC_App::getAllApps();
- //TODO which apps do we want to blacklist and how do we integrate
- // blacklisting with the multi apps folder feature?
-
//we don't want to show configuration for these
$blacklist = \OC::$server->getAppManager()->getAlwaysEnabledApps();
$appList = array();
@@ -893,8 +873,6 @@ class OC_App {
$info['removable'] = true;
}
- $info['update'] = ($includeUpdateInfo) ? Installer::isUpdateAvailable($app) : null;
-
$appPath = self::getAppPath($app);
if($appPath !== false) {
$appIcon = $appPath . '/img/' . $app . '.svg';
@@ -926,29 +904,8 @@ class OC_App {
$appList[] = $info;
}
}
- if ($onlyLocal) {
- $remoteApps = [];
- } else {
- $remoteApps = OC_App::getAppstoreApps('approved', null, $ocsClient);
- }
- if ($remoteApps) {
- // Remove duplicates
- foreach ($appList as $app) {
- foreach ($remoteApps AS $key => $remote) {
- if ($app['name'] === $remote['name'] ||
- (isset($app['ocsid']) &&
- $app['ocsid'] === $remote['id'])
- ) {
- unset($remoteApps[$key]);
- }
- }
- }
- $combinedApps = array_merge($appList, $remoteApps);
- } else {
- $combinedApps = $appList;
- }
- return $combinedApps;
+ return $appList;
}
/**
@@ -966,70 +923,6 @@ class OC_App {
return false;
}
- /**
- * Get a list of all apps on the appstore
- * @param string $filter
- * @param string|null $category
- * @param OCSClient $ocsClient
- * @return array|bool multi-dimensional array of apps.
- * Keys: id, name, type, typename, personid, license, detailpage, preview, changed, description
- */
- public static function getAppstoreApps($filter = 'approved',
- $category = null,
- OCSClient $ocsClient) {
- $categories = [$category];
-
- if (is_null($category)) {
- $categoryNames = $ocsClient->getCategories(\OCP\Util::getVersion());
- if (is_array($categoryNames)) {
- // Check that categories of apps were retrieved correctly
- if (!$categories = array_keys($categoryNames)) {
- return false;
- }
- } else {
- return false;
- }
- }
-
- $page = 0;
- $remoteApps = $ocsClient->getApplications($categories, $page, $filter, \OCP\Util::getVersion());
- $apps = [];
- $i = 0;
- $l = \OC::$server->getL10N('core');
- foreach ($remoteApps as $app) {
- $potentialCleanId = self::getInternalAppIdByOcs($app['id']);
- // enhance app info (for example the description)
- $apps[$i] = OC_App::parseAppInfo($app);
- $apps[$i]['author'] = $app['personid'];
- $apps[$i]['ocs_id'] = $app['id'];
- $apps[$i]['internal'] = 0;
- $apps[$i]['active'] = ($potentialCleanId !== false) ? self::isEnabled($potentialCleanId) : false;
- $apps[$i]['update'] = false;
- $apps[$i]['groups'] = false;
- $apps[$i]['score'] = $app['score'];
- $apps[$i]['removable'] = false;
- if ($app['label'] == 'recommended') {
- $apps[$i]['internallabel'] = (string)$l->t('Recommended');
- $apps[$i]['internalclass'] = 'recommendedapp';
- }
-
- // Apps from the appstore are always assumed to be compatible with the
- // the current release as the initial filtering is done on the appstore
- $apps[$i]['dependencies']['owncloud']['@attributes']['min-version'] = implode('.', \OCP\Util::getVersion());
- $apps[$i]['dependencies']['owncloud']['@attributes']['max-version'] = implode('.', \OCP\Util::getVersion());
-
- $i++;
- }
-
-
-
- if (empty($apps)) {
- return false;
- } else {
- return $apps;
- }
- }
-
public static function shouldUpgrade($app) {
$versions = self::getAppVersions();
$currentVersion = OC_App::getAppVersion($app);
@@ -1083,7 +976,9 @@ class OC_App {
public static function isAppCompatible($ocVersion, $appInfo) {
$requireMin = '';
$requireMax = '';
- if (isset($appInfo['dependencies']['owncloud']['@attributes']['min-version'])) {
+ if (isset($appInfo['dependencies']['nextcloud']['@attributes']['min-version'])) {
+ $requireMin = $appInfo['dependencies']['nextcloud']['@attributes']['min-version'];
+ } elseif (isset($appInfo['dependencies']['owncloud']['@attributes']['min-version'])) {
$requireMin = $appInfo['dependencies']['owncloud']['@attributes']['min-version'];
} else if (isset($appInfo['requiremin'])) {
$requireMin = $appInfo['requiremin'];
@@ -1091,7 +986,9 @@ class OC_App {
$requireMin = $appInfo['require'];
}
- if (isset($appInfo['dependencies']['owncloud']['@attributes']['max-version'])) {
+ if (isset($appInfo['dependencies']['nextcloud']['@attributes']['max-version'])) {
+ $requireMax = $appInfo['dependencies']['nextcloud']['@attributes']['max-version'];
+ } elseif (isset($appInfo['dependencies']['owncloud']['@attributes']['max-version'])) {
$requireMax = $appInfo['dependencies']['owncloud']['@attributes']['max-version'];
} else if (isset($appInfo['requiremax'])) {
$requireMax = $appInfo['requiremax'];
@@ -1132,46 +1029,16 @@ class OC_App {
/**
* @param string $app
+ * @param \OCP\IConfig $config
+ * @param \OCP\IL10N $l
* @return bool
+ *
* @throws Exception if app is not compatible with this version of ownCloud
* @throws Exception if no app-name was specified
*/
- public static function installApp($app) {
- $appName = $app; // $app will be overwritten, preserve name for error logging
- $l = \OC::$server->getL10N('core');
- $config = \OC::$server->getConfig();
- $ocsClient = new OCSClient(
- \OC::$server->getHTTPClientService(),
- $config,
- \OC::$server->getLogger()
- );
- $appData = $ocsClient->getApplication($app, \OCP\Util::getVersion());
-
- // check if app is a shipped app or not. OCS apps have an integer as id, shipped apps use a string
- if (!is_numeric($app)) {
- $shippedVersion = self::getAppVersion($app);
- if ($appData && version_compare($shippedVersion, $appData['version'], '<')) {
- $app = self::downloadApp($app);
- } else {
- $app = Installer::installShippedApp($app);
- }
- } else {
- // Maybe the app is already installed - compare the version in this
- // case and use the local already installed one.
- // FIXME: This is a horrible hack. I feel sad. The god of code cleanness may forgive me.
- $internalAppId = self::getInternalAppIdByOcs($app);
- if($internalAppId !== false) {
- if($appData && version_compare(\OC_App::getAppVersion($internalAppId), $appData['version'], '<')) {
- $app = self::downloadApp($app);
- } else {
- self::enable($internalAppId);
- $app = $internalAppId;
- }
- } else {
- $app = self::downloadApp($app);
- }
- }
-
+ public function installApp($app,
+ \OCP\IConfig $config,
+ \OCP\IL10N $l) {
if ($app !== false) {
// check if the app is compatible with this version of ownCloud
$info = self::getAppInfo($app);
diff --git a/lib/private/legacy/user.php b/lib/private/legacy/user.php
index af2382dbb86..ed0d14a1ab9 100644
--- a/lib/private/legacy/user.php
+++ b/lib/private/legacy/user.php
@@ -155,10 +155,11 @@ class OC_User {
* @deprecated use \OCP\IUserSession::loginWithCookie()
* @param string $uid The username of the user to log in
* @param string $token
+ * @param string $oldSessionId
* @return bool
*/
- public static function loginWithCookie($uid, $token) {
- return self::getUserSession()->loginWithCookie($uid, $token);
+ public static function loginWithCookie($uid, $token, $oldSessionId) {
+ return self::getUserSession()->loginWithCookie($uid, $token, $oldSessionId);
}
/**
diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php
index e4c2caeafd7..5cd92eaa415 100644
--- a/lib/private/legacy/util.php
+++ b/lib/private/legacy/util.php
@@ -757,6 +757,7 @@ class OC_Util {
'simplexml_load_string' => 'SimpleXML',
'hash' => 'HASH Message Digest Framework',
'curl_init' => 'cURL',
+ 'openssl_verify' => 'OpenSSL',
],
'defined' => array(
'PDO::ATTR_DRIVER_NAME' => 'PDO'
diff --git a/lib/public/BackgroundJob.php b/lib/public/BackgroundJob.php
index b49dd922786..43f445362dc 100644
--- a/lib/public/BackgroundJob.php
+++ b/lib/public/BackgroundJob.php
@@ -90,96 +90,4 @@ class BackgroundJob {
$jobList = \OC::$server->getJobList();
$jobList->add($job, $argument);
}
-
- /**
- * @deprecated 6.0.0
- * creates a regular task
- * @param string $klass class name
- * @param string $method method name
- * @return boolean|null
- * @since 4.5.0
- */
- public static function addRegularTask($klass, $method) {
- if (!\OCP\Util::needUpgrade()) {
- self::registerJob('OC\BackgroundJob\Legacy\RegularJob', array($klass, $method));
- return true;
- }
- }
-
- /**
- * @deprecated 6.0.0
- * gets all regular tasks
- * @return array
- *
- * key is string "$klass-$method", value is array( $klass, $method )
- * @since 4.5.0
- */
- static public function allRegularTasks() {
- return [];
- }
-
- /**
- * @deprecated 6.0.0
- * Gets one queued task
- * @param int $id ID of the task
- * @return BackgroundJob\IJob|null
- * @since 4.5.0
- */
- public static function findQueuedTask($id) {
- $jobList = \OC::$server->getJobList();
- return $jobList->getById($id);
- }
-
- /**
- * @deprecated 6.0.0
- * Gets all queued tasks
- * @return array an array of associative arrays
- * @since 4.5.0
- */
- public static function allQueuedTasks() {
- return [];
- }
-
- /**
- * @deprecated 6.0.0
- * Gets all queued tasks of a specific app
- * @param string $app app name
- * @return array an array of associative arrays
- * @since 4.5.0
- */
- public static function queuedTaskWhereAppIs($app) {
- return [];
- }
-
- /**
- * @deprecated 6.0.0
- * queues a task
- * @param string $app app name
- * @param string $class class name
- * @param string $method method name
- * @param string $parameters all useful data as text
- * @return boolean id of task
- * @since 4.5.0
- */
- public static function addQueuedTask($app, $class, $method, $parameters) {
- self::registerJob('OC\BackgroundJob\Legacy\QueuedJob', array('app' => $app, 'klass' => $class, 'method' => $method, 'parameters' => $parameters));
- return true;
- }
-
- /**
- * @deprecated 6.0.0
- * deletes a queued task
- * @param int $id id of task
- * @return boolean|null
- *
- * Deletes a report
- * @since 4.5.0
- */
- public static function deleteQueuedTask($id) {
- $jobList = \OC::$server->getJobList();
- $job = $jobList->getById($id);
- if ($job) {
- $jobList->remove($job);
- }
- }
}
diff --git a/lib/public/IRequest.php b/lib/public/IRequest.php
index 11242c481f0..b36a934b0c2 100644
--- a/lib/public/IRequest.php
+++ b/lib/public/IRequest.php
@@ -145,7 +145,7 @@ interface IRequest {
* Shortcut for getting cookie variables
*
* @param string $key the key that will be taken from the $_COOKIE array
- * @return string the value in the $_COOKIE element
+ * @return string|null the value in the $_COOKIE element
* @since 6.0.0
*/
public function getCookie($key);
diff --git a/lib/public/Notification/INotification.php b/lib/public/Notification/INotification.php
index 3a8bde0a375..55109a5ee2e 100644
--- a/lib/public/Notification/INotification.php
+++ b/lib/public/Notification/INotification.php
@@ -184,6 +184,27 @@ interface INotification {
public function getParsedMessage();
/**
+ * @param string $message
+ * @param array $parameters
+ * @return $this
+ * @throws \InvalidArgumentException if the message or parameters are invalid
+ * @since 9.2.0
+ */
+ public function setRichMessage($message, array $parameters = []);
+
+ /**
+ * @return string
+ * @since 9.2.0
+ */
+ public function getRichMessage();
+
+ /**
+ * @return array[]
+ * @since 9.2.0
+ */
+ public function getRichMessageParameters();
+
+ /**
* @param string $link
* @return $this
* @throws \InvalidArgumentException if the link is invalid
diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php
index 37751911883..137dc309280 100644
--- a/lib/public/Share/IManager.php
+++ b/lib/public/Share/IManager.php
@@ -22,6 +22,7 @@
namespace OCP\Share;
+use OCP\Files\Folder;
use OCP\Files\Node;
use OCP\Share\Exceptions\ShareNotFound;
@@ -88,6 +89,17 @@ interface IManager {
public function moveShare(IShare $share, $recipientId);
/**
+ * Get all shares shared by (initiated) by the provided user in a folder.
+ *
+ * @param string $userId
+ * @param Folder $node
+ * @param bool $reshares
+ * @return IShare[]
+ * @since 9.2.0
+ */
+ public function getSharesInFolder($userId, Folder $node, $reshares = false);
+
+ /**
* Get shares shared by (initiated) by the provided user.
*
* @param string $userId
@@ -274,4 +286,12 @@ interface IManager {
*/
public function outgoingServer2ServerSharesAllowed();
+ /**
+ * Check if a given share provider exists
+ * @param int $shareType
+ * @return bool
+ * @since 9.2.0
+ */
+ public function shareProviderExists($shareType);
+
}
diff --git a/lib/public/Share/IProviderFactory.php b/lib/public/Share/IProviderFactory.php
index 8d9ea5bfdd0..928298a7860 100644
--- a/lib/public/Share/IProviderFactory.php
+++ b/lib/public/Share/IProviderFactory.php
@@ -55,4 +55,10 @@ interface IProviderFactory {
* @since 9.0.0
*/
public function getProviderForType($shareType);
+
+ /**
+ * @return IShareProvider[]
+ * @since 9.2.0
+ */
+ public function getAllProviders();
}
diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php
index c4e116ac7fd..7d134583317 100644
--- a/lib/public/Share/IShareProvider.php
+++ b/lib/public/Share/IShareProvider.php
@@ -22,6 +22,7 @@
namespace OCP\Share;
+use OCP\Files\Folder;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Files\Node;
@@ -92,6 +93,17 @@ interface IShareProvider {
public function move(\OCP\Share\IShare $share, $recipient);
/**
+ * Get all shares by the given user in a folder
+ *
+ * @param string $userId
+ * @param Folder $node
+ * @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator
+ * @return \OCP\Share\IShare[]
+ * @since 9.2.0
+ */
+ public function getSharesInFolder($userId, Folder $node, $reshares);
+
+ /**
* Get all shares by the given user
*
* @param string $userId