summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/l10n/bg.js17
-rw-r--r--lib/l10n/bg.json17
-rw-r--r--lib/l10n/cs.js8
-rw-r--r--lib/l10n/cs.json8
-rw-r--r--lib/l10n/eu.js19
-rw-r--r--lib/l10n/eu.json19
-rw-r--r--lib/l10n/gl.js96
-rw-r--r--lib/l10n/gl.json96
-rw-r--r--lib/l10n/ja.js2
-rw-r--r--lib/l10n/ja.json2
-rw-r--r--lib/l10n/pt_BR.js4
-rw-r--r--lib/l10n/pt_BR.json4
-rw-r--r--lib/l10n/zh_CN.js112
-rw-r--r--lib/l10n/zh_CN.json112
-rw-r--r--lib/private/Accounts/AccountManager.php2
-rw-r--r--lib/private/AllConfig.php32
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php179
-rw-r--r--lib/private/AppFramework/Http/Request.php10
-rw-r--r--lib/private/Comments/Manager.php43
-rw-r--r--lib/private/DB/MigrationService.php52
-rw-r--r--lib/private/Encryption/DecryptAll.php3
-rw-r--r--lib/private/Files/AppData/AppData.php93
-rw-r--r--lib/private/Files/AppData/Factory.php7
-rw-r--r--lib/private/Files/ObjectStore/SwiftFactory.php68
-rw-r--r--lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php35
-rw-r--r--lib/private/FullTextSearch/FullTextSearchManager.php2
-rw-r--r--lib/private/Http/Client/Response.php8
-rw-r--r--lib/private/Log/ExceptionSerializer.php3
-rw-r--r--lib/private/Mail/Mailer.php4
-rw-r--r--lib/private/Server.php5
-rw-r--r--lib/private/TemplateLayout.php9
-rw-r--r--lib/private/User/Manager.php2
-rw-r--r--lib/private/User/Session.php2
-rw-r--r--lib/private/legacy/template.php25
-rw-r--r--lib/public/AppFramework/Db/QBMapper.php4
-rw-r--r--lib/public/AppFramework/Http/ContentSecurityPolicy.php5
-rw-r--r--lib/public/FullTextSearch/Service/IIndexService.php14
-rw-r--r--lib/versioncheck.php7
40 files changed, 754 insertions, 378 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 29910544895..26aee010519 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -802,6 +802,7 @@ return array(
'OC\\Files\\ObjectStore\\StorageObjectStore' => $baseDir . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => $baseDir . '/lib/private/Files/ObjectStore/Swift.php',
'OC\\Files\\ObjectStore\\SwiftFactory' => $baseDir . '/lib/private/Files/ObjectStore/SwiftFactory.php',
+ 'OC\\Files\\ObjectStore\\SwiftV2CachingAuthService' => $baseDir . '/lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php',
'OC\\Files\\Search\\SearchBinaryOperator' => $baseDir . '/lib/private/Files/Search/SearchBinaryOperator.php',
'OC\\Files\\Search\\SearchComparison' => $baseDir . '/lib/private/Files/Search/SearchComparison.php',
'OC\\Files\\Search\\SearchOrder' => $baseDir . '/lib/private/Files/Search/SearchOrder.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index d476460c827..64eb952d2c6 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -832,6 +832,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\ObjectStore\\StorageObjectStore' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Swift.php',
'OC\\Files\\ObjectStore\\SwiftFactory' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/SwiftFactory.php',
+ 'OC\\Files\\ObjectStore\\SwiftV2CachingAuthService' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php',
'OC\\Files\\Search\\SearchBinaryOperator' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchBinaryOperator.php',
'OC\\Files\\Search\\SearchComparison' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchComparison.php',
'OC\\Files\\Search\\SearchOrder' => __DIR__ . '/../../..' . '/lib/private/Files/Search/SearchOrder.php',
diff --git a/lib/l10n/bg.js b/lib/l10n/bg.js
index 23212a61785..c273c6226f5 100644
--- a/lib/l10n/bg.js
+++ b/lib/l10n/bg.js
@@ -19,10 +19,13 @@ OC.L10N.register(
"Unknown filetype" : "Непознат тип файл",
"Invalid image" : "Невалидно изображение.",
"today" : "днес",
+ "tomorrow" : "утре",
"yesterday" : "вчера",
"_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"],
+ "next month" : "следващия месец",
"last month" : "миналия месец",
"_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"],
+ "next year" : "следващата година",
"last year" : "миналата година",
"_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"],
"_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"],
@@ -38,11 +41,15 @@ OC.L10N.register(
"Log out" : "Отписване",
"Users" : "Потребители",
"Unknown user" : "Непознат потребител",
+ "Create" : "Създай",
+ "Delete" : "Изтриване",
+ "Share" : "Споделяне",
"Basic settings" : "Основни настройки",
"Sharing" : "Споделяне",
"Security" : "Сигурност",
"Additional settings" : "Допълнителни настройки",
"Personal info" : "Лични данни",
+ "Unlimited" : "Неограничено",
"%s enter the database username and name." : "%s въведете потребителско име и име за базата данни",
"%s enter the database username." : "%s въведете потребител за базата данни.",
"%s enter the database name." : "%s въведи име на базата данни.",
@@ -55,6 +62,7 @@ OC.L10N.register(
"Set an admin username." : "Задайте потребителско име за администратор.",
"Set an admin password." : "Задай парола за администратор.",
"Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s",
+ "Invalid Federated Cloud ID" : "Невалиден Federated Cloud ID",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.",
"Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.",
"You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
@@ -68,6 +76,8 @@ OC.L10N.register(
"Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторното споделяне е забранено",
"Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
"Can’t set expiration date more than %s days in the future" : "Неуспешно задаване на срок на валидност повече от %s дни в бъдещето",
+ "%1$s shared »%2$s« with you" : "%1$s сподели »%2$s« с вас",
+ "%1$s shared »%2$s« with you." : "%1$s сподели »%2$s« с вас.",
"Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
"Sunday" : "неделя",
"Monday" : "понеделник",
@@ -85,6 +95,7 @@ OC.L10N.register(
"Sat." : "съб",
"Su" : "нд",
"Mo" : "пн",
+ "Tu" : "вт",
"We" : "ср",
"Th" : "чт",
"Fr" : "пт",
@@ -118,10 +129,11 @@ OC.L10N.register(
"Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.",
"A valid password must be provided" : "Трябва да въведете валидна парола.",
"The username is already being used" : "Потребителското име е вече заето.",
+ "User disabled" : "Потребителят е деактивиран",
"a safe home for all your data" : "безопасен дом за всички ваши данни",
"Can't read file" : "Файлът не може да бъде прочетен",
"Application is not enabled" : "Приложението не е включено",
- "Authentication error" : "Проблем с идентификацията",
+ "Authentication error" : "Грешка при удостоверяването",
"Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).",
"Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
@@ -141,6 +153,8 @@ OC.L10N.register(
"Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
"APCu" : "APCu",
"Redis" : "Redis",
+ "Encryption" : "Криптиране",
+ "Sync clients" : "Клиенти за синхронизиране",
"Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.",
"Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
@@ -151,6 +165,7 @@ OC.L10N.register(
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
"%s shared »%s« with you" : "%s сподели »%s« с вас",
+ "%s shared »%s« with you." : "%s сподели »%s« с вас.",
"%s via %s" : "%s чрез %s"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/bg.json b/lib/l10n/bg.json
index 0f5e7a28663..63bfcaff675 100644
--- a/lib/l10n/bg.json
+++ b/lib/l10n/bg.json
@@ -17,10 +17,13 @@
"Unknown filetype" : "Непознат тип файл",
"Invalid image" : "Невалидно изображение.",
"today" : "днес",
+ "tomorrow" : "утре",
"yesterday" : "вчера",
"_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"],
+ "next month" : "следващия месец",
"last month" : "миналия месец",
"_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"],
+ "next year" : "следващата година",
"last year" : "миналата година",
"_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"],
"_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"],
@@ -36,11 +39,15 @@
"Log out" : "Отписване",
"Users" : "Потребители",
"Unknown user" : "Непознат потребител",
+ "Create" : "Създай",
+ "Delete" : "Изтриване",
+ "Share" : "Споделяне",
"Basic settings" : "Основни настройки",
"Sharing" : "Споделяне",
"Security" : "Сигурност",
"Additional settings" : "Допълнителни настройки",
"Personal info" : "Лични данни",
+ "Unlimited" : "Неограничено",
"%s enter the database username and name." : "%s въведете потребителско име и име за базата данни",
"%s enter the database username." : "%s въведете потребител за базата данни.",
"%s enter the database name." : "%s въведи име на базата данни.",
@@ -53,6 +60,7 @@
"Set an admin username." : "Задайте потребителско име за администратор.",
"Set an admin password." : "Задай парола за администратор.",
"Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s",
+ "Invalid Federated Cloud ID" : "Невалиден Federated Cloud ID",
"Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.",
"Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.",
"You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
@@ -66,6 +74,8 @@
"Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторното споделяне е забранено",
"Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
"Can’t set expiration date more than %s days in the future" : "Неуспешно задаване на срок на валидност повече от %s дни в бъдещето",
+ "%1$s shared »%2$s« with you" : "%1$s сподели »%2$s« с вас",
+ "%1$s shared »%2$s« with you." : "%1$s сподели »%2$s« с вас.",
"Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
"Sunday" : "неделя",
"Monday" : "понеделник",
@@ -83,6 +93,7 @@
"Sat." : "съб",
"Su" : "нд",
"Mo" : "пн",
+ "Tu" : "вт",
"We" : "ср",
"Th" : "чт",
"Fr" : "пт",
@@ -116,10 +127,11 @@
"Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.",
"A valid password must be provided" : "Трябва да въведете валидна парола.",
"The username is already being used" : "Потребителското име е вече заето.",
+ "User disabled" : "Потребителят е деактивиран",
"a safe home for all your data" : "безопасен дом за всички ваши данни",
"Can't read file" : "Файлът не може да бъде прочетен",
"Application is not enabled" : "Приложението не е включено",
- "Authentication error" : "Проблем с идентификацията",
+ "Authentication error" : "Грешка при удостоверяването",
"Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).",
"Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
@@ -139,6 +151,8 @@
"Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
"APCu" : "APCu",
"Redis" : "Redis",
+ "Encryption" : "Криптиране",
+ "Sync clients" : "Клиенти за синхронизиране",
"Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.",
"Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
@@ -149,6 +163,7 @@
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
"%s shared »%s« with you" : "%s сподели »%s« с вас",
+ "%s shared »%s« with you." : "%s сподели »%s« с вас.",
"%s via %s" : "%s чрез %s"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/cs.js b/lib/l10n/cs.js
index 612367f3543..6efbb694de4 100644
--- a/lib/l10n/cs.js
+++ b/lib/l10n/cs.js
@@ -15,8 +15,8 @@ OC.L10N.register(
"%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"Education Edition" : "Vydání pro vzdělávací instituce",
- "Enterprise bundle" : "Enterprise balíček",
- "Groupware bundle" : "Balíček groupware",
+ "Enterprise bundle" : "Sada pro organizace",
+ "Groupware bundle" : "Sada pro podporu spolupráce",
"Social sharing bundle" : "Balíček sociálního sdílení",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
@@ -60,8 +60,8 @@ OC.L10N.register(
"Empty filename is not allowed" : "Je třeba vyplnit název souboru",
"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.",
- "__language_name__" : "Česky",
- "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný e-mail, neodpovídejte na něj.",
+ "__language_name__" : "čeština",
+ "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný email, neodpovídejte na něj.",
"Help" : "Nápověda",
"Apps" : "Aplikace",
"Settings" : "Nastavení",
diff --git a/lib/l10n/cs.json b/lib/l10n/cs.json
index 2b331a3d866..6ae5cbfb1f9 100644
--- a/lib/l10n/cs.json
+++ b/lib/l10n/cs.json
@@ -13,8 +13,8 @@
"%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"Education Edition" : "Vydání pro vzdělávací instituce",
- "Enterprise bundle" : "Enterprise balíček",
- "Groupware bundle" : "Balíček groupware",
+ "Enterprise bundle" : "Sada pro organizace",
+ "Groupware bundle" : "Sada pro podporu spolupráce",
"Social sharing bundle" : "Balíček sociálního sdílení",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
@@ -58,8 +58,8 @@
"Empty filename is not allowed" : "Je třeba vyplnit název souboru",
"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.",
- "__language_name__" : "Česky",
- "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný e-mail, neodpovídejte na něj.",
+ "__language_name__" : "čeština",
+ "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný email, neodpovídejte na něj.",
"Help" : "Nápověda",
"Apps" : "Aplikace",
"Settings" : "Nastavení",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index ac4987e9f94..9e94c962012 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -20,12 +20,14 @@ OC.L10N.register(
"Invalid image" : "Baliogabeko irudia",
"Avatar image is not square" : "Abatarreko irudia ez da karratua",
"today" : "gaur",
+ "tomorrow" : "bihar",
"yesterday" : "atzo",
"_%n day ago_::_%n days ago_" : ["orain dela egun %n","orain dela %n egun"],
"last month" : "joan den hilabetean",
"_%n month ago_::_%n months ago_" : ["orain dela hilabete %n","orain dela %n hilabete"],
"last year" : "joan den urtean",
"_%n year ago_::_%n years ago_" : ["orain dela urte %n","orain dela %n urte"],
+ "_in %n hour_::_in %n hours_" : ["ordu %n barru","%n ordu barru"],
"_%n hour ago_::_%n hours ago_" : ["orain dela ordu %n","orain dela %n ordu"],
"_%n minute ago_::_%n minutes ago_" : ["orain dela minutu %n","orain dela %n minutu"],
"seconds ago" : "duela segundu batzuk",
@@ -37,10 +39,21 @@ OC.L10N.register(
"__language_name__" : "Euskara",
"Help" : "Laguntza",
"Apps" : "Aplikazioak",
+ "Settings" : "Ezarpenak",
"Users" : "Erabiltzaileak",
"Unknown user" : "Erabiltzaile ezezaguna",
+ "Create" : "Sortu",
+ "Change" : "Aldatu",
+ "Delete" : "Ezabatu",
+ "Share" : "Partekatu",
+ "Basic settings" : "Oinarrizko ezarpenak",
"Sharing" : "Partekatze",
+ "Security" : "Segurtasuna",
"Additional settings" : "Ezarpen gehiago",
+ "Mobile & desktop" : "Mugikorra eta mahaigaina",
+ "Unlimited" : "Mugagabea",
+ "Verifying" : "Egiaztatzen",
+ "Verify" : "Egiaztatu",
"%s enter the database username and name." : "%s sartu datu-basearen erabiltzaile-izena eta izena.",
"%s enter the database username." : "%s sartu datu basearen erabiltzaile izena.",
"%s enter the database name." : "%s sartu datu basearen izena.",
@@ -50,7 +63,7 @@ OC.L10N.register(
"PostgreSQL username and/or password not valid" : "PostgreSQL erabiltzaile edota pasahitza ez dira egokiak.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X-ek ez du sostengurik eta %s gaizki ibili daiteke plataforma honetan. Erabiltzekotan, zure ardurapean.",
"For the best results, please consider using a GNU/Linux server instead." : "Emaitza hobeak izateko, mesedez gogoan hartu GNU/Linux zerbitzari bat erabiltzea.",
- "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Mesedez ezabatu open_basedir ezarpena zure php.ini-tik edo aldatu 64-biteko PHPra.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Mesedez kendu open_basedir ezarpena zure php.ini-tik edo aldatu 64-biteko PHPra.",
"Set an admin username." : "Ezarri administraziorako erabiltzaile izena.",
"Set an admin password." : "Ezarri administraziorako pasahitza.",
"Can't create or write into the data directory %s" : "Ezin da %s datu karpeta sortu edo bertan idatzi ",
@@ -66,6 +79,7 @@ OC.L10N.register(
"Sharing backend for %s not found" : "Ez da %srako elkarbanaketa motorrik aurkitu",
"Sharing %s failed, because resharing is not allowed" : "%s elkarbanatzeak huts egin du, ber-elkarbanatzea baimenduta ez dagoelako",
"Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako",
+ "Open »%s«" : "Ireki »%s«",
"Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu",
"Sunday" : "Igandea",
"Monday" : "Astelehena",
@@ -151,6 +165,7 @@ OC.L10N.register(
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s elkarbanatzeak huts egin du, baimenak %sri emandakoak baino gehiago direlako",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako",
"%s shared »%s« with you" : "%s-ek »%s« zurekin partekatu du",
- "%s via %s" : "%s %s bidez"
+ "%s via %s" : "%s %s bidez",
+ "No app name specified" : "Ez da aplikazio izenik zehaztu"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index 6264ba4d84b..1c3ccc3c8cf 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -18,12 +18,14 @@
"Invalid image" : "Baliogabeko irudia",
"Avatar image is not square" : "Abatarreko irudia ez da karratua",
"today" : "gaur",
+ "tomorrow" : "bihar",
"yesterday" : "atzo",
"_%n day ago_::_%n days ago_" : ["orain dela egun %n","orain dela %n egun"],
"last month" : "joan den hilabetean",
"_%n month ago_::_%n months ago_" : ["orain dela hilabete %n","orain dela %n hilabete"],
"last year" : "joan den urtean",
"_%n year ago_::_%n years ago_" : ["orain dela urte %n","orain dela %n urte"],
+ "_in %n hour_::_in %n hours_" : ["ordu %n barru","%n ordu barru"],
"_%n hour ago_::_%n hours ago_" : ["orain dela ordu %n","orain dela %n ordu"],
"_%n minute ago_::_%n minutes ago_" : ["orain dela minutu %n","orain dela %n minutu"],
"seconds ago" : "duela segundu batzuk",
@@ -35,10 +37,21 @@
"__language_name__" : "Euskara",
"Help" : "Laguntza",
"Apps" : "Aplikazioak",
+ "Settings" : "Ezarpenak",
"Users" : "Erabiltzaileak",
"Unknown user" : "Erabiltzaile ezezaguna",
+ "Create" : "Sortu",
+ "Change" : "Aldatu",
+ "Delete" : "Ezabatu",
+ "Share" : "Partekatu",
+ "Basic settings" : "Oinarrizko ezarpenak",
"Sharing" : "Partekatze",
+ "Security" : "Segurtasuna",
"Additional settings" : "Ezarpen gehiago",
+ "Mobile & desktop" : "Mugikorra eta mahaigaina",
+ "Unlimited" : "Mugagabea",
+ "Verifying" : "Egiaztatzen",
+ "Verify" : "Egiaztatu",
"%s enter the database username and name." : "%s sartu datu-basearen erabiltzaile-izena eta izena.",
"%s enter the database username." : "%s sartu datu basearen erabiltzaile izena.",
"%s enter the database name." : "%s sartu datu basearen izena.",
@@ -48,7 +61,7 @@
"PostgreSQL username and/or password not valid" : "PostgreSQL erabiltzaile edota pasahitza ez dira egokiak.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X-ek ez du sostengurik eta %s gaizki ibili daiteke plataforma honetan. Erabiltzekotan, zure ardurapean.",
"For the best results, please consider using a GNU/Linux server instead." : "Emaitza hobeak izateko, mesedez gogoan hartu GNU/Linux zerbitzari bat erabiltzea.",
- "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Mesedez ezabatu open_basedir ezarpena zure php.ini-tik edo aldatu 64-biteko PHPra.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Mesedez kendu open_basedir ezarpena zure php.ini-tik edo aldatu 64-biteko PHPra.",
"Set an admin username." : "Ezarri administraziorako erabiltzaile izena.",
"Set an admin password." : "Ezarri administraziorako pasahitza.",
"Can't create or write into the data directory %s" : "Ezin da %s datu karpeta sortu edo bertan idatzi ",
@@ -64,6 +77,7 @@
"Sharing backend for %s not found" : "Ez da %srako elkarbanaketa motorrik aurkitu",
"Sharing %s failed, because resharing is not allowed" : "%s elkarbanatzeak huts egin du, ber-elkarbanatzea baimenduta ez dagoelako",
"Sharing %s failed, because the file could not be found in the file cache" : "%s elkarbanatzeak huts egin du, fitxategia katxean aurkitu ez delako",
+ "Open »%s«" : "Ireki »%s«",
"Could not find category \"%s\"" : "Ezin da \"%s\" kategoria aurkitu",
"Sunday" : "Igandea",
"Monday" : "Astelehena",
@@ -149,6 +163,7 @@
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "%s elkarbanatzeak huts egin du, baimenak %sri emandakoak baino gehiago direlako",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "%s elkarbanatzeak huts egin du, %sren elkarbanaketa motorrak bere iturria aurkitu ezin duelako",
"%s shared »%s« with you" : "%s-ek »%s« zurekin partekatu du",
- "%s via %s" : "%s %s bidez"
+ "%s via %s" : "%s %s bidez",
+ "No app name specified" : "Ez da aplikazio izenik zehaztu"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js
index d456a0be47f..521c01f8e41 100644
--- a/lib/l10n/gl.js
+++ b/lib/l10n/gl.js
@@ -4,16 +4,19 @@ OC.L10N.register(
"Cannot write into \"config\" directory!" : "Non é posíbel escribir no directorio «config»!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Polo xeral, isto pode ser fixado para permitirlle ao servidor web acceso de escritura ao directorio «config»",
"See %s" : "Vexa %s",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Ou, se prefire manter o ficheiro «config.php» como de só lectura, marque a opción «config_is_read_only» como «true» nel.",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Polo xeral, isto pode ser fixado para permitirlle ao servidor web acceso de escritura ao directorio «config». Vexa %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros da aplicación %$1s non foron substituídos correctamente. Asegúrese que é unha versión compatíbel co servidor.",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Ou, se prefire manter o ficheiro «config.php» como de só lectura, marque a opción «config_is_read_only» como «true» nel. Vexa %s",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros do aplicativo %$1s non foron substituídos correctamente. Asegúrese que é unha versión compatíbel co servidor.",
"Sample configuration detected" : "Detectouse a configuración de exemplo",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectouse que foi copiada a configuración de exemplo. Isto pode rachar a súa instalación e non é compatíbel. Lea a documentación antes de facer cambios en config.php",
"%1$s and %2$s" : "%1$s e %2$s",
"%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s",
"%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s",
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s",
+ "Education Edition" : "Edición para educación",
"Enterprise bundle" : "Paquete empresarial",
- "Groupware bundle" : "Paquete de Groupware",
+ "Groupware bundle" : "Paquete de software colaborativo",
"Social sharing bundle" : "Paquete para compartir en redes sociais",
"PHP %s or higher is required." : "Requirese PHP %s ou superior.",
"PHP with a version lower than %s is required." : "Requírese PHP cunha versión inferior a %s.",
@@ -21,41 +24,66 @@ OC.L10N.register(
"Following databases are supported: %s" : "Admítense as seguintes bases de datos: %s",
"The command line tool %s could not be found" : "Non foi posíbel atopar a ferramenta de liña de ordes %s",
"The library %s is not available." : "Non está dispoñíbel a biblioteca %s.",
+ "Library %1$s with a version higher than %2$s is required - available version %3$s." : "Requírese a biblioteca %1$s cunha versión superior a %2$s - dispoñíbel a versión %3$s.",
+ "Library %1$s with a version lower than %2$s is required - available version %3$s." : "Requírese a biblioteca %1$s cunha versión inferior a %2$s - dispoñíbel a versión %3$s.",
"Following platforms are supported: %s" : "Admítense as seguintes plataformas: %s",
"Server version %s or higher is required." : "Requírese a versión %s ou superior do servidor.",
"Server version %s or lower is required." : "Requírese a versión %s ou inferior do servidor.",
+ "Logged in user must be an admin" : "O usuario registrado debe ser un administrador",
"Unknown filetype" : "Tipo de ficheiro descoñecido",
"Invalid image" : "Imaxe incorrecta",
"Avatar image is not square" : "A imaxe do avatar non é un cadrado",
"today" : "hoxe",
+ "tomorrow" : "mañá",
"yesterday" : "onte",
+ "_in %n day_::_in %n days_" : ["nun día","en %n días"],
"_%n day ago_::_%n days ago_" : ["hai %n día","hai %n días"],
- "last month" : "último mes",
+ "next month" : "o mes que ven",
+ "last month" : "o mes pasado",
+ "_in %n month_::_in %n months_" : ["nun mes","en %n meses"],
"_%n month ago_::_%n months ago_" : ["hai %n mes","hai %n meses"],
- "last year" : "último ano",
+ "next year" : "o ano que ven",
+ "last year" : "o ano pasado",
+ "_in %n year_::_in %n years_" : ["nun ano","en %n anos"],
"_%n year ago_::_%n years ago_" : ["hai %n ano","hai %n anos"],
+ "_in %n hour_::_in %n hours_" : ["nunha hora","en %n horas"],
"_%n hour ago_::_%n hours ago_" : ["hai %n hora","hai %n horas"],
+ "_in %n minute_::_in %n minutes_" : ["nun minuto","en %n minutos"],
"_%n minute ago_::_%n minutes ago_" : ["hai %n minuto","hai %n minutos"],
+ "in a few seconds" : "en poucos segundos",
"seconds ago" : "segundos atrás",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Non existe o módulo co ID: %s. Actíveo nos axustes das aplicacións ou contacte co administrador.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Non existe o módulo co ID: %s. Actíveo nos axustes dos aplicativos ou contacte co administrador.",
"File name is a reserved word" : "O nome de ficheiro é unha palabra reservada",
"File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto",
"File name is too long" : "O nome de ficheiro é longo de máis",
"Dot files are not allowed" : "Non se admiten os ficheiros con punto",
"Empty filename is not allowed" : "Non está permitido deixar baleiro o nome de ficheiro",
- "App \"%s\" cannot be installed because appinfo file cannot be read." : "Non é posíbel instalar a aplicación «%s» por mor de non poder ler o ficheiro appinfo.",
- "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Non é posíbel instalar a aplicación «%s» por mor de non ser compatíbel con esta versión do servidor.",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Non é posíbel instalar o aplicativo «%s» por mor de non poder ler o ficheiro appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Non é posíbel instalar o aplicativo «%s» por mor de non ser compatíbel con esta versión do servidor.",
"__language_name__" : "Galego",
"This is an automatically sent email, please do not reply." : "Este é un correo enviado automaticamente, non responda.",
"Help" : "Axuda",
- "Apps" : "Aplicacións",
+ "Apps" : "Aplicativos",
+ "Settings" : "Axustes",
"Log out" : "Desconectar",
"Users" : "Usuarios",
"Unknown user" : "Usuario descoñecido",
+ "Create" : "Crear",
+ "Change" : "Cambiar",
+ "Delete" : "Eliminar",
+ "Share" : "Compartir",
+ "Overview" : "Vista xeral",
"Basic settings" : "Axustes básicos",
"Sharing" : "Compartindo",
"Security" : "Seguridade",
+ "Groupware" : "Software colaborativo",
"Additional settings" : "Axustes adicionais",
+ "Personal info" : "Información persoal",
+ "Mobile & desktop" : "Móbil e escritorio",
+ "Unlimited" : "Sen límites",
+ "Verifying" : "Verificando",
+ "Verifying …" : "Verificando…",
+ "Verify" : "Verificar",
"%s enter the database username and name." : "%s insira o nome de usuario e o nome da base de datos",
"%s enter the database username." : "%s insira o nome de usuario da base de datos",
"%s enter the database name." : "%s insira o nome da base de datos",
@@ -63,7 +91,7 @@ OC.L10N.register(
"Oracle connection could not be established" : "Non foi posíbel estabelecer a conexión con Oracle",
"Oracle username and/or password not valid" : "O nome de usuario e/ou contrasinal de Oracle é incorrecto",
"PostgreSQL username and/or password not valid" : "Nome de usuario e/ou contrasinal de PostgreSQL incorrecto",
- "You need to enter details of an existing account." : "Debe insira os detalles dunha conta existente.",
+ "You need to enter details of an existing account." : "Debe inserir os detalles dunha conta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non é compatíbel e %s non funcionará correctamente nesta plataforma. Utilíceo baixo a súa responsabilidade!",
"For the best results, please consider using a GNU/Linux server instead." : "Para obter mellores resultados, considere o emprego dun servidor GNU/Linux no seu canto.",
"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." : "Semella que esta instancia de %s está a funcionar nun entorno PHP de 32 bisst e o open_basedir foi configurado no php.ini. Isto provocará problemas con ficheiros maiores de 4 GB e está absolutamente desaconsellado.",
@@ -76,18 +104,41 @@ OC.L10N.register(
"Sharing %s failed, because the file does not exist" : "Fallou a compartición de %s, o ficheiro non existe",
"You are not allowed to share %s" : "Non ten permiso para compartir %s",
"Sharing %s failed, because you can not share with yourself" : "Fallou a compartición de %s por mor de que non pode compartir con vostede mesmo",
+ "Sharing %1$s failed, because the user %2$s does not exist" : "Fallou a compartición de %1$s, o usuario %2$s non existe",
+ "Sharing %1$s failed, because the user %2$s is not a member of any groups that %3$s is a member of" : "Fallou a compartición de %1$s, o usuario %2$s non é participante en ningún grupo no que sexa participante %3$s",
+ "Sharing %1$s failed, because this item is already shared with %2$s" : "Produciuse un fallou na compartición de %1$s, este elemento xa está compartido con %2$s",
+ "Sharing %1$s failed, because this item is already shared with user %2$s" : "Fallou a compartición de %1$s por mor de que este elemento xa foi compartido co usuario %2$s",
+ "Sharing %1$s failed, because the group %2$s does not exist" : "Fallou a compartición de %1$s, o grupo %2$s non existe",
+ "Sharing %1$s failed, because %2$s is not a member of the group %3$s" : "Fallou a compartición de %1$s, %2$s non é participante no grupo %3$s",
"You need to provide a password to create a public link, only protected links are allowed" : "Ten que fornecer un contrasinal para a ligazón pública, só se permiten ligazóns protexidas",
"Sharing %s failed, because sharing with links is not allowed" : "Fallou a compartición de %s, non está permitido compartir con ligazóns",
"Not allowed to create a federated share with the same user" : "Non está permitido crear un compartido federado co mesmo usuario",
+ "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable." : "Fallou a compartición de %1$s, non foi posíbel atopar %2$s,é probábel que o servidor non estea accesíbel.",
+ "Share type %1$s is not valid for %2$s" : "Non se admite a compartición do tipo %1$s para %2$s",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Non é posíbel estabelecer a data de caducidade. As comparticións non poden caducar máis aló de %s após de seren compartidas",
"Cannot set expiration date. Expiration date is in the past" : "Non é posíbel estabelecer a data de caducidade. A data de caducidade está no pasado.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s",
"Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s",
"Sharing failed, because the user %s is the original sharer" : "Fallou a compartición, por mor de que o usuario %s é o compartidor orixinal",
+ "Sharing %1$s failed, because the permissions exceed permissions granted to %2$s" : "Fallou a compartición de %1$s, os permisos superan os permisos concedidos a %2$s",
"Sharing %s failed, because resharing is not allowed" : "Fallou a compartición de %s, non está permitido repetir a compartción",
+ "Sharing %1$s failed, because the sharing backend for %2$s could not find its source" : "Fallou a compartición de %1$s, a infraestrutura de compartición para %2$s non foi quen de atopar a orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s compartiu «%2$s» con vostede e quere engadir:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s compartiu «%2$s» con vostede e quere engadir",
+ "»%s« added a note to a file shared with you" : "«%s» engadiu unha nota a un ficheiro compartido con vostede",
+ "Open »%s«" : "Abrir «%s»",
+ "%1$s via %2$s" : "%1$s mediante %2$s",
+ "Can’t increase permissions of %s" : "Non é posíbel aumentar os permisos de %s",
+ "Files can’t be shared with delete permissions" : "Non é posíbel compartir ficheiros con permisos de eliminación",
+ "Files can’t be shared with create permissions" : "Non é posíbel compartir ficheiros con permisos de creación",
"Expiration date is in the past" : "Xa pasou a data de caducidade",
+ "Can’t set expiration date more than %s days in the future" : "Non é posíbel estabelecer a data de caducidade máis alo de %s días no futuro",
+ "%1$s shared »%2$s« with you" : "%1$s compartiu «%2$s» con vostede",
+ "%1$s shared »%2$s« with you." : "%1$s compartiu «%2$s» con vostede.",
+ "Click the button below to open it." : "Prema no botón de embaixo para abrilo.",
+ "The requested share does not exist anymore" : "O recurso compartido solicitado xa non existe",
"Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»",
"Sunday" : "domingo",
"Monday" : "luns",
@@ -140,18 +191,20 @@ OC.L10N.register(
"Username must not consist of dots only" : "O nome de usuario non debe consistir só de puntos",
"A valid password must be provided" : "Debe fornecer un contrasinal",
"The username is already being used" : "Este nome de usuario xa está a ser usado",
+ "Could not create user" : "Non foi posíbel crear o usuario",
"User disabled" : "Usuario desactivado",
- "Login canceled by app" : "Acceso cancelado pola aplicación",
+ "Login canceled by app" : "Acceso cancelado polo aplicativo",
+ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Non é posíbel instalar o aplicativo «%1$s» por mor de non cumprirse as dependencias: %2$s",
"a safe home for all your data" : "un lugar seguro para todos os seus datos",
"File is currently busy, please try again later" : "O ficheiro está ocupado neste momento, ténteo máis tarde.",
"Can't read file" : "Non é posíbel ler o ficheiro",
- "Application is not enabled" : "A aplicación non está activada",
+ "Application is not enabled" : "O aplicativo non está activado",
"Authentication error" : "Produciuse un erro de autenticación",
"Token expired. Please reload page." : "Marca caducada. Recargue a páxina.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Non hay controladores de base de datos (sqlite, mysql, ou postgresql) instalados.",
"Cannot write into \"config\" directory" : "Non é posíbel escribir no directorio «config»",
"Cannot write into \"apps\" directory" : "Non é posíbel escribir no directorio «apps»",
- "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio das aplicacións ou desactivando a appstore no ficheiro de configuración. Vexa %s",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio dos aplicativos ou desactivando a tenda de aplicativos no ficheiro de configuración. Vexa %s",
"Cannot create \"data\" directory" : "Non é posíbel crear o directorio «data»",
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio raíz. Vexa %s.",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Polo xeral, pódense corrixir os permisos dándolle ao servidor web acceso de escritura ao directorio raíz. Vexa %s.",
@@ -165,7 +218,7 @@ OC.L10N.register(
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para arranxar este problema, estabeleza <code>mbstring.func_overload</code> a <code>0</code> no ficheiro php.ini",
"libxml2 2.7.0 is at least required. Currently %s is installed." : "Requírese cando menos libxml2 2.7.0. Actualmente esta instalado %s.",
"To fix this issue update your libxml2 version and restart your web server." : "Para arranxar este problema, actualice a versión de libxml2 e reinicie o servidor web. ",
- "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Semella que PHP foi configurado para quitar bloques de documentos en liña. Isto fará que varias aplicacións sexan inaccesíbeis.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Semella que PHP foi configurado para quitar bloques de documentos en liña. Isto fará que varios aplicativos sexan inaccesíbeis.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto probabelmente se debe unha caché/acelerador como Zend OPcache ou eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "Instaláronse os módulos de PHP, mais aínda aparecen listados como perdidos?",
"Please ask your server administrator to restart the web server." : "Pregúntelle ao administrador do servidor polo reinicio do servidor web..",
@@ -176,6 +229,12 @@ OC.L10N.register(
"Your data directory must be an absolute path" : "O seu directorio de datos debe ser unha ruta absoluta",
"Check the value of \"datadirectory\" in your configuration" : "Comprobe o valor de «datadirectory» na configuración",
"Your data directory is invalid" : "O seu directorio de datos non é correcto",
+ "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Asegúrese de que existe un ficheiro chamado «.ocdata» na raíz do directorio de datos.",
+ "Action \"%s\" not supported or implemented." : "A acción «%s» non está admitida ou implementada.",
+ "Authentication failed, wrong token or provider ID given" : "Produciuse un fallo de autenticación. Deuse unha marca ou un ID de provedor erróneos.",
+ "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Faltan parámetros para completar a solicitude. Parámetros que faltan: «%s»",
+ "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "O ID «%1$s» xa está a ser usado polo provedor da nube federada «%2$s»",
+ "Cloud Federation Provider with ID: \"%s\" does not exist." : "O provedor de nube federada co ID «%s» non existe.",
"Could not obtain lock type %d on \"%s\"." : "Non foi posíbel obter un bloqueo do tipo %d en «%s».",
"Storage unauthorized. %s" : "Almacenamento non autorizado. %s",
"Storage incomplete configuration. %s" : "Configuración incompleta do almacenamento. %s",
@@ -188,6 +247,7 @@ OC.L10N.register(
"Redis" : "Redis",
"Encryption" : "Cifrado",
"Tips & tricks" : "Trucos e consellos",
+ "Sync clients" : "Sincronizar clientes",
"Sharing %s failed, because the user %s does not exist" : "Fallou a compartición de %s, o usuario %s non existe",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Fallou a compartición de %s, o usuario %s non é participante en ningún grupo no que sexa participante %s",
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
@@ -199,9 +259,11 @@ OC.L10N.register(
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Fallou a compartición de %s, os permisos superan os permisos concedidos a %s",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe",
"%s shared »%s« with you" : "%s compartiu «%s» con vostede",
- "%s via %s" : "%s vía %s",
- "No app name specified" : "Non se especificou o nome da aplicación",
- "App '%s' could not be installed!" : "Non foi posíbel instalar a aplicación «%s»!",
- "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Non é posíbel instalar a aplicación «%s» por mor de non cumprirse as dependencias: %s"
+ "%s shared »%s« with you." : "%s compartiu «%s» con vostede.",
+ "%s via %s" : "%s mediante %s",
+ "No app name specified" : "Non se especificou o nome do aplicativo",
+ "App '%s' could not be installed!" : "Non foi posíbel instalar o aplicativo «%s»!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Non é posíbel instalar o aplicativo «%s» por mor de non cumprirse as dependencias: %s",
+ "ID \"%s\" already used by cloud federation provider \"%s\"" : "O ID «%s» xa está a ser usado polo provedor da nube federada «%s»"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json
index 3f714b93741..f194524717e 100644
--- a/lib/l10n/gl.json
+++ b/lib/l10n/gl.json
@@ -2,16 +2,19 @@
"Cannot write into \"config\" directory!" : "Non é posíbel escribir no directorio «config»!",
"This can usually be fixed by giving the webserver write access to the config directory" : "Polo xeral, isto pode ser fixado para permitirlle ao servidor web acceso de escritura ao directorio «config»",
"See %s" : "Vexa %s",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Ou, se prefire manter o ficheiro «config.php» como de só lectura, marque a opción «config_is_read_only» como «true» nel.",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Polo xeral, isto pode ser fixado para permitirlle ao servidor web acceso de escritura ao directorio «config». Vexa %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros da aplicación %$1s non foron substituídos correctamente. Asegúrese que é unha versión compatíbel co servidor.",
+ "Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Ou, se prefire manter o ficheiro «config.php» como de só lectura, marque a opción «config_is_read_only» como «true» nel. Vexa %s",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Os ficheiros do aplicativo %$1s non foron substituídos correctamente. Asegúrese que é unha versión compatíbel co servidor.",
"Sample configuration detected" : "Detectouse a configuración de exemplo",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectouse que foi copiada a configuración de exemplo. Isto pode rachar a súa instalación e non é compatíbel. Lea a documentación antes de facer cambios en config.php",
"%1$s and %2$s" : "%1$s e %2$s",
"%1$s, %2$s and %3$s" : "%1$s, %2$s e %3$s",
"%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s e %4$s",
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s e %5$s",
+ "Education Edition" : "Edición para educación",
"Enterprise bundle" : "Paquete empresarial",
- "Groupware bundle" : "Paquete de Groupware",
+ "Groupware bundle" : "Paquete de software colaborativo",
"Social sharing bundle" : "Paquete para compartir en redes sociais",
"PHP %s or higher is required." : "Requirese PHP %s ou superior.",
"PHP with a version lower than %s is required." : "Requírese PHP cunha versión inferior a %s.",
@@ -19,41 +22,66 @@
"Following databases are supported: %s" : "Admítense as seguintes bases de datos: %s",
"The command line tool %s could not be found" : "Non foi posíbel atopar a ferramenta de liña de ordes %s",
"The library %s is not available." : "Non está dispoñíbel a biblioteca %s.",
+ "Library %1$s with a version higher than %2$s is required - available version %3$s." : "Requírese a biblioteca %1$s cunha versión superior a %2$s - dispoñíbel a versión %3$s.",
+ "Library %1$s with a version lower than %2$s is required - available version %3$s." : "Requírese a biblioteca %1$s cunha versión inferior a %2$s - dispoñíbel a versión %3$s.",
"Following platforms are supported: %s" : "Admítense as seguintes plataformas: %s",
"Server version %s or higher is required." : "Requírese a versión %s ou superior do servidor.",
"Server version %s or lower is required." : "Requírese a versión %s ou inferior do servidor.",
+ "Logged in user must be an admin" : "O usuario registrado debe ser un administrador",
"Unknown filetype" : "Tipo de ficheiro descoñecido",
"Invalid image" : "Imaxe incorrecta",
"Avatar image is not square" : "A imaxe do avatar non é un cadrado",
"today" : "hoxe",
+ "tomorrow" : "mañá",
"yesterday" : "onte",
+ "_in %n day_::_in %n days_" : ["nun día","en %n días"],
"_%n day ago_::_%n days ago_" : ["hai %n día","hai %n días"],
- "last month" : "último mes",
+ "next month" : "o mes que ven",
+ "last month" : "o mes pasado",
+ "_in %n month_::_in %n months_" : ["nun mes","en %n meses"],
"_%n month ago_::_%n months ago_" : ["hai %n mes","hai %n meses"],
- "last year" : "último ano",
+ "next year" : "o ano que ven",
+ "last year" : "o ano pasado",
+ "_in %n year_::_in %n years_" : ["nun ano","en %n anos"],
"_%n year ago_::_%n years ago_" : ["hai %n ano","hai %n anos"],
+ "_in %n hour_::_in %n hours_" : ["nunha hora","en %n horas"],
"_%n hour ago_::_%n hours ago_" : ["hai %n hora","hai %n horas"],
+ "_in %n minute_::_in %n minutes_" : ["nun minuto","en %n minutos"],
"_%n minute ago_::_%n minutes ago_" : ["hai %n minuto","hai %n minutos"],
+ "in a few seconds" : "en poucos segundos",
"seconds ago" : "segundos atrás",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Non existe o módulo co ID: %s. Actíveo nos axustes das aplicacións ou contacte co administrador.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Non existe o módulo co ID: %s. Actíveo nos axustes dos aplicativos ou contacte co administrador.",
"File name is a reserved word" : "O nome de ficheiro é unha palabra reservada",
"File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto",
"File name is too long" : "O nome de ficheiro é longo de máis",
"Dot files are not allowed" : "Non se admiten os ficheiros con punto",
"Empty filename is not allowed" : "Non está permitido deixar baleiro o nome de ficheiro",
- "App \"%s\" cannot be installed because appinfo file cannot be read." : "Non é posíbel instalar a aplicación «%s» por mor de non poder ler o ficheiro appinfo.",
- "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Non é posíbel instalar a aplicación «%s» por mor de non ser compatíbel con esta versión do servidor.",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Non é posíbel instalar o aplicativo «%s» por mor de non poder ler o ficheiro appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Non é posíbel instalar o aplicativo «%s» por mor de non ser compatíbel con esta versión do servidor.",
"__language_name__" : "Galego",
"This is an automatically sent email, please do not reply." : "Este é un correo enviado automaticamente, non responda.",
"Help" : "Axuda",
- "Apps" : "Aplicacións",
+ "Apps" : "Aplicativos",
+ "Settings" : "Axustes",
"Log out" : "Desconectar",
"Users" : "Usuarios",
"Unknown user" : "Usuario descoñecido",
+ "Create" : "Crear",
+ "Change" : "Cambiar",
+ "Delete" : "Eliminar",
+ "Share" : "Compartir",
+ "Overview" : "Vista xeral",
"Basic settings" : "Axustes básicos",
"Sharing" : "Compartindo",
"Security" : "Seguridade",
+ "Groupware" : "Software colaborativo",
"Additional settings" : "Axustes adicionais",
+ "Personal info" : "Información persoal",
+ "Mobile & desktop" : "Móbil e escritorio",
+ "Unlimited" : "Sen límites",
+ "Verifying" : "Verificando",
+ "Verifying …" : "Verificando…",
+ "Verify" : "Verificar",
"%s enter the database username and name." : "%s insira o nome de usuario e o nome da base de datos",
"%s enter the database username." : "%s insira o nome de usuario da base de datos",
"%s enter the database name." : "%s insira o nome da base de datos",
@@ -61,7 +89,7 @@
"Oracle connection could not be established" : "Non foi posíbel estabelecer a conexión con Oracle",
"Oracle username and/or password not valid" : "O nome de usuario e/ou contrasinal de Oracle é incorrecto",
"PostgreSQL username and/or password not valid" : "Nome de usuario e/ou contrasinal de PostgreSQL incorrecto",
- "You need to enter details of an existing account." : "Debe insira os detalles dunha conta existente.",
+ "You need to enter details of an existing account." : "Debe inserir os detalles dunha conta existente.",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X non é compatíbel e %s non funcionará correctamente nesta plataforma. Utilíceo baixo a súa responsabilidade!",
"For the best results, please consider using a GNU/Linux server instead." : "Para obter mellores resultados, considere o emprego dun servidor GNU/Linux no seu canto.",
"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." : "Semella que esta instancia de %s está a funcionar nun entorno PHP de 32 bisst e o open_basedir foi configurado no php.ini. Isto provocará problemas con ficheiros maiores de 4 GB e está absolutamente desaconsellado.",
@@ -74,18 +102,41 @@
"Sharing %s failed, because the file does not exist" : "Fallou a compartición de %s, o ficheiro non existe",
"You are not allowed to share %s" : "Non ten permiso para compartir %s",
"Sharing %s failed, because you can not share with yourself" : "Fallou a compartición de %s por mor de que non pode compartir con vostede mesmo",
+ "Sharing %1$s failed, because the user %2$s does not exist" : "Fallou a compartición de %1$s, o usuario %2$s non existe",
+ "Sharing %1$s failed, because the user %2$s is not a member of any groups that %3$s is a member of" : "Fallou a compartición de %1$s, o usuario %2$s non é participante en ningún grupo no que sexa participante %3$s",
+ "Sharing %1$s failed, because this item is already shared with %2$s" : "Produciuse un fallou na compartición de %1$s, este elemento xa está compartido con %2$s",
+ "Sharing %1$s failed, because this item is already shared with user %2$s" : "Fallou a compartición de %1$s por mor de que este elemento xa foi compartido co usuario %2$s",
+ "Sharing %1$s failed, because the group %2$s does not exist" : "Fallou a compartición de %1$s, o grupo %2$s non existe",
+ "Sharing %1$s failed, because %2$s is not a member of the group %3$s" : "Fallou a compartición de %1$s, %2$s non é participante no grupo %3$s",
"You need to provide a password to create a public link, only protected links are allowed" : "Ten que fornecer un contrasinal para a ligazón pública, só se permiten ligazóns protexidas",
"Sharing %s failed, because sharing with links is not allowed" : "Fallou a compartición de %s, non está permitido compartir con ligazóns",
"Not allowed to create a federated share with the same user" : "Non está permitido crear un compartido federado co mesmo usuario",
+ "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable." : "Fallou a compartición de %1$s, non foi posíbel atopar %2$s,é probábel que o servidor non estea accesíbel.",
+ "Share type %1$s is not valid for %2$s" : "Non se admite a compartición do tipo %1$s para %2$s",
"Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Non é posíbel estabelecer a data de caducidade. As comparticións non poden caducar máis aló de %s após de seren compartidas",
"Cannot set expiration date. Expiration date is in the past" : "Non é posíbel estabelecer a data de caducidade. A data de caducidade está no pasado.",
"Sharing backend %s must implement the interface OCP\\Share_Backend" : "A infraestrutura de compartición %s ten que implementar a interface OCP\\Share_Backend",
"Sharing backend %s not found" : "Non se atopou a infraestrutura de compartición %s",
"Sharing backend for %s not found" : "Non se atopou a infraestrutura de compartición para %s",
"Sharing failed, because the user %s is the original sharer" : "Fallou a compartición, por mor de que o usuario %s é o compartidor orixinal",
+ "Sharing %1$s failed, because the permissions exceed permissions granted to %2$s" : "Fallou a compartición de %1$s, os permisos superan os permisos concedidos a %2$s",
"Sharing %s failed, because resharing is not allowed" : "Fallou a compartición de %s, non está permitido repetir a compartción",
+ "Sharing %1$s failed, because the sharing backend for %2$s could not find its source" : "Fallou a compartición de %1$s, a infraestrutura de compartición para %2$s non foi quen de atopar a orixe",
"Sharing %s failed, because the file could not be found in the file cache" : "Fallou a compartición de %s, non foi posíbel atopar o ficheiro na caché de ficheiros",
+ "%1$s shared »%2$s« with you and wants to add:" : "%1$s compartiu «%2$s» con vostede e quere engadir:",
+ "%1$s shared »%2$s« with you and wants to add" : "%1$s compartiu «%2$s» con vostede e quere engadir",
+ "»%s« added a note to a file shared with you" : "«%s» engadiu unha nota a un ficheiro compartido con vostede",
+ "Open »%s«" : "Abrir «%s»",
+ "%1$s via %2$s" : "%1$s mediante %2$s",
+ "Can’t increase permissions of %s" : "Non é posíbel aumentar os permisos de %s",
+ "Files can’t be shared with delete permissions" : "Non é posíbel compartir ficheiros con permisos de eliminación",
+ "Files can’t be shared with create permissions" : "Non é posíbel compartir ficheiros con permisos de creación",
"Expiration date is in the past" : "Xa pasou a data de caducidade",
+ "Can’t set expiration date more than %s days in the future" : "Non é posíbel estabelecer a data de caducidade máis alo de %s días no futuro",
+ "%1$s shared »%2$s« with you" : "%1$s compartiu «%2$s» con vostede",
+ "%1$s shared »%2$s« with you." : "%1$s compartiu «%2$s» con vostede.",
+ "Click the button below to open it." : "Prema no botón de embaixo para abrilo.",
+ "The requested share does not exist anymore" : "O recurso compartido solicitado xa non existe",
"Could not find category \"%s\"" : "Non foi posíbel atopar a categoría «%s»",
"Sunday" : "domingo",
"Monday" : "luns",
@@ -138,18 +189,20 @@
"Username must not consist of dots only" : "O nome de usuario non debe consistir só de puntos",
"A valid password must be provided" : "Debe fornecer un contrasinal",
"The username is already being used" : "Este nome de usuario xa está a ser usado",
+ "Could not create user" : "Non foi posíbel crear o usuario",
"User disabled" : "Usuario desactivado",
- "Login canceled by app" : "Acceso cancelado pola aplicación",
+ "Login canceled by app" : "Acceso cancelado polo aplicativo",
+ "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Non é posíbel instalar o aplicativo «%1$s» por mor de non cumprirse as dependencias: %2$s",
"a safe home for all your data" : "un lugar seguro para todos os seus datos",
"File is currently busy, please try again later" : "O ficheiro está ocupado neste momento, ténteo máis tarde.",
"Can't read file" : "Non é posíbel ler o ficheiro",
- "Application is not enabled" : "A aplicación non está activada",
+ "Application is not enabled" : "O aplicativo non está activado",
"Authentication error" : "Produciuse un erro de autenticación",
"Token expired. Please reload page." : "Marca caducada. Recargue a páxina.",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Non hay controladores de base de datos (sqlite, mysql, ou postgresql) instalados.",
"Cannot write into \"config\" directory" : "Non é posíbel escribir no directorio «config»",
"Cannot write into \"apps\" directory" : "Non é posíbel escribir no directorio «apps»",
- "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio das aplicacións ou desactivando a appstore no ficheiro de configuración. Vexa %s",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio dos aplicativos ou desactivando a tenda de aplicativos no ficheiro de configuración. Vexa %s",
"Cannot create \"data\" directory" : "Non é posíbel crear o directorio «data»",
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Polo xeral, isto pódese solucionar dándolle ao servidor web acceso de escritura ao directorio raíz. Vexa %s.",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Polo xeral, pódense corrixir os permisos dándolle ao servidor web acceso de escritura ao directorio raíz. Vexa %s.",
@@ -163,7 +216,7 @@
"To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Para arranxar este problema, estabeleza <code>mbstring.func_overload</code> a <code>0</code> no ficheiro php.ini",
"libxml2 2.7.0 is at least required. Currently %s is installed." : "Requírese cando menos libxml2 2.7.0. Actualmente esta instalado %s.",
"To fix this issue update your libxml2 version and restart your web server." : "Para arranxar este problema, actualice a versión de libxml2 e reinicie o servidor web. ",
- "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Semella que PHP foi configurado para quitar bloques de documentos en liña. Isto fará que varias aplicacións sexan inaccesíbeis.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Semella que PHP foi configurado para quitar bloques de documentos en liña. Isto fará que varios aplicativos sexan inaccesíbeis.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Isto probabelmente se debe unha caché/acelerador como Zend OPcache ou eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "Instaláronse os módulos de PHP, mais aínda aparecen listados como perdidos?",
"Please ask your server administrator to restart the web server." : "Pregúntelle ao administrador do servidor polo reinicio do servidor web..",
@@ -174,6 +227,12 @@
"Your data directory must be an absolute path" : "O seu directorio de datos debe ser unha ruta absoluta",
"Check the value of \"datadirectory\" in your configuration" : "Comprobe o valor de «datadirectory» na configuración",
"Your data directory is invalid" : "O seu directorio de datos non é correcto",
+ "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Asegúrese de que existe un ficheiro chamado «.ocdata» na raíz do directorio de datos.",
+ "Action \"%s\" not supported or implemented." : "A acción «%s» non está admitida ou implementada.",
+ "Authentication failed, wrong token or provider ID given" : "Produciuse un fallo de autenticación. Deuse unha marca ou un ID de provedor erróneos.",
+ "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Faltan parámetros para completar a solicitude. Parámetros que faltan: «%s»",
+ "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "O ID «%1$s» xa está a ser usado polo provedor da nube federada «%2$s»",
+ "Cloud Federation Provider with ID: \"%s\" does not exist." : "O provedor de nube federada co ID «%s» non existe.",
"Could not obtain lock type %d on \"%s\"." : "Non foi posíbel obter un bloqueo do tipo %d en «%s».",
"Storage unauthorized. %s" : "Almacenamento non autorizado. %s",
"Storage incomplete configuration. %s" : "Configuración incompleta do almacenamento. %s",
@@ -186,6 +245,7 @@
"Redis" : "Redis",
"Encryption" : "Cifrado",
"Tips & tricks" : "Trucos e consellos",
+ "Sync clients" : "Sincronizar clientes",
"Sharing %s failed, because the user %s does not exist" : "Fallou a compartición de %s, o usuario %s non existe",
"Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Fallou a compartición de %s, o usuario %s non é participante en ningún grupo no que sexa participante %s",
"Sharing %s failed, because this item is already shared with %s" : "Fallou a compartición de %s, este elemento xa está compartido con %s",
@@ -197,9 +257,11 @@
"Sharing %s failed, because the permissions exceed permissions granted to %s" : "Fallou a compartición de %s, os permisos superan os permisos concedidos a %s",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Fallou a compartición de %s, a infraestrutura de compartición para %s non foi quen de atopar a orixe",
"%s shared »%s« with you" : "%s compartiu «%s» con vostede",
- "%s via %s" : "%s vía %s",
- "No app name specified" : "Non se especificou o nome da aplicación",
- "App '%s' could not be installed!" : "Non foi posíbel instalar a aplicación «%s»!",
- "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Non é posíbel instalar a aplicación «%s» por mor de non cumprirse as dependencias: %s"
+ "%s shared »%s« with you." : "%s compartiu «%s» con vostede.",
+ "%s via %s" : "%s mediante %s",
+ "No app name specified" : "Non se especificou o nome do aplicativo",
+ "App '%s' could not be installed!" : "Non foi posíbel instalar o aplicativo «%s»!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Non é posíbel instalar o aplicativo «%s» por mor de non cumprirse as dependencias: %s",
+ "ID \"%s\" already used by cloud federation provider \"%s\"" : "O ID «%s» xa está a ser usado polo provedor da nube federada «%s»"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index 40b2de0688f..62d617bf302 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -95,7 +95,7 @@ OC.L10N.register(
"Set an admin username." : "管理者のユーザー名を設定",
"Set an admin password." : "管理者のパスワードを設定",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
- "Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
+ "Invalid Federated Cloud ID" : "無効なクラウド共有ID",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s を共有できませんでした。%i タイプからの共有は許可されていません。",
"Sharing %s failed, because the file does not exist" : "%s を共有できませんでした。そのファイルは存在しません。",
"You are not allowed to share %s" : "%s を共有することを許可されていません。",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index ff48d5ac925..c210002a370 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -93,7 +93,7 @@
"Set an admin username." : "管理者のユーザー名を設定",
"Set an admin password." : "管理者のパスワードを設定",
"Can't create or write into the data directory %s" : "%s データディレクトリに作成、書き込みができません",
- "Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
+ "Invalid Federated Cloud ID" : "無効なクラウド共有ID",
"Sharing %s failed, because the backend does not allow shares from type %i" : "%s を共有できませんでした。%i タイプからの共有は許可されていません。",
"Sharing %s failed, because the file does not exist" : "%s を共有できませんでした。そのファイルは存在しません。",
"You are not allowed to share %s" : "%s を共有することを許可されていません。",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 6997a87efc3..b7084c608da 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -72,13 +72,13 @@ OC.L10N.register(
"Change" : "Mudar",
"Delete" : "Excluir",
"Share" : "Compartilhar",
- "Overview" : "Visão Geral",
+ "Overview" : "Visão geral",
"Basic settings" : "Configurações básicas",
"Sharing" : "Compartilhamento",
"Security" : "Segurança",
"Groupware" : "Groupware",
"Additional settings" : "Configurações adicionais",
- "Personal info" : "Informação Pessoal",
+ "Personal info" : "Informação pessoal",
"Mobile & desktop" : "Móvel & desktop",
"Unlimited" : "Ilimitado",
"Verifying" : "Verificando",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 4500fb28d20..8c46567a02c 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -70,13 +70,13 @@
"Change" : "Mudar",
"Delete" : "Excluir",
"Share" : "Compartilhar",
- "Overview" : "Visão Geral",
+ "Overview" : "Visão geral",
"Basic settings" : "Configurações básicas",
"Sharing" : "Compartilhamento",
"Security" : "Segurança",
"Groupware" : "Groupware",
"Additional settings" : "Configurações adicionais",
- "Personal info" : "Informação Pessoal",
+ "Personal info" : "Informação pessoal",
"Mobile & desktop" : "Móvel & desktop",
"Unlimited" : "Ilimitado",
"Verifying" : "Verificando",
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index b55f42a3251..498846bc1d7 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -1,27 +1,27 @@
OC.L10N.register(
"lib",
{
- "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!ond",
+ "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!",
"This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题",
"See %s" : "查看 %s",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "或者,如果希望保持 config.php 文件的只读权限,请将 \"config_is_read_only\" 设置为 true。",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "这个通常可以通过赋予写入权限到 config 目录来修复。查看:%s",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "或者,如果希望保持 config.php 文件的只读权限,请将 \"config_is_read_only\" 设置为 true。查看 %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确。请确认版本与当前服务器兼容。",
"Sample configuration detected" : "示例配置检测",
- "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用。这可能会破坏您的安装。在对 config.php 进行修改之前请先阅读相关文档。",
"%1$s and %2$s" : "%1$s 和 %2$s",
- "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s",
- "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s",
- "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s",
+ "%1$s, %2$s and %3$s" : "%1$s,%2$s 和 %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s,%2$s,%3$s 和 %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s,%2$s,%3$s,%4$s 和 %5$s",
"Education Edition" : "教育版",
"Enterprise bundle" : "企业捆绑包",
"Groupware bundle" : "群组捆绑包",
"Social sharing bundle" : "社交共享捆绑包",
"PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
- "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.",
+ "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP。",
"%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP",
- "Following databases are supported: %s" : "支持以下数据库: %s",
+ "Following databases are supported: %s" : "支持以下数据库:%s",
"The command line tool %s could not be found" : "命令行工具 %s 未找到",
"The library %s is not available." : "库文件 %s 不可用",
"Library %1$s with a version higher than %2$s is required - available version %3$s." : "库版本 %1$s 高于需要的版本 %2$s - 可用版本 %3$s。",
@@ -56,10 +56,10 @@ OC.L10N.register(
"File name is a reserved word" : "文件名包含敏感字符",
"File name contains at least one invalid character" : "文件名中存在至少一个非法字符",
"File name is too long" : "文件名过长",
- "Dot files are not allowed" : ".文件 不被允许",
+ "Dot files are not allowed" : "以 . 开头的文件不被允许",
"Empty filename is not allowed" : "不允许使用空名称。",
- "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.",
- "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.",
+ "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\" 无法安装,因为它与这个版本的服务器不兼容。",
"__language_name__" : "简体中文",
"This is an automatically sent email, please do not reply." : "这是一个自动生成的电子邮件,请不要回复。",
"Help" : "帮助",
@@ -84,7 +84,7 @@ OC.L10N.register(
"Verifying" : "验证",
"Verifying …" : "验证...",
"Verify" : "验证",
- "%s enter the database username and name." : "%s 输入数据库用户名和名称.",
+ "%s enter the database username and name." : "%s 输入数据库用户名和名称。",
"%s enter the database username." : "%s 输入数据库用户名。",
"%s enter the database name." : "%s 输入数据库名称。",
"%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
@@ -100,29 +100,29 @@ OC.L10N.register(
"Set an admin password." : "请设置一个管理员密码。",
"Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s",
"Invalid Federated Cloud ID" : "无效的联合云ID",
- "Sharing %s failed, because the backend does not allow shares from type %i" : "共享 %s 失败, 因为后端不允许共享 %i 类型",
- "Sharing %s failed, because the file does not exist" : "共享 %s 失败, 因为文件不存在.",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "共享 %s 失败,因为后端不允许共享 %i 类型",
+ "Sharing %s failed, because the file does not exist" : "共享 %s 失败,因为文件不存在。",
"You are not allowed to share %s" : "您无权共享 %s",
- "Sharing %s failed, because you can not share with yourself" : "共享 %s 失败, 因为您不能共享给自己",
+ "Sharing %s failed, because you can not share with yourself" : "共享 %s 失败,因为您不能共享给自己",
"Sharing %1$s failed, because the user %2$s does not exist" : "共享 %1$s 失败,因为 %2$s 用户不存在",
"You need to provide a password to create a public link, only protected links are allowed" : "您需要提供密码以创建公开链接,因为只允许创建受保护的链接。",
- "Sharing %s failed, because sharing with links is not allowed" : "共享 %s 失败, 因为不允许使用链接共享",
+ "Sharing %s failed, because sharing with links is not allowed" : "共享 %s 失败,因为不允许使用链接共享",
"Not allowed to create a federated share with the same user" : "不允许创建对相同用户的联合共享",
- "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 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" : "无法设置过期时间。过期时间不能为过去",
"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 的共享后端未找到",
"Sharing failed, because the user %s is the original sharer" : "共享失败,因为用户 %s 是原始的共享者。",
- "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败, 因为不允许二次共享",
- "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败, 因为文件缓存中找不到该文件",
+ "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败,因为不允许二次共享",
+ "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为文件缓存中找不到该文件",
"Open »%s«" : "打开 %s",
"Can’t increase permissions of %s" : "无法增加%s的权限。",
"Files can’t be shared with delete permissions" : "无法共享有删除权限的文件",
"Files can’t be shared with create permissions" : "无法共享有创建权限的文件",
- "Expiration date is in the past" : "到期日期已过.",
- "Can’t set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.",
- "Click the button below to open it." : "点击下方按钮可打开它.",
+ "Expiration date is in the past" : "到期日期已过。",
+ "Can’t set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天。",
+ "Click the button below to open it." : "点击下方按钮可打开它。",
"The requested share does not exist anymore" : "当前请求的共享已经不存在",
"Could not find category \"%s\"" : "无法找到分类 \"%s\"",
"Sunday" : "星期日",
@@ -185,7 +185,7 @@ OC.L10N.register(
"Application is not enabled" : "应用程序未启用",
"Authentication error" : "认证出错",
"Token expired. Please reload page." : "Token 过期,请刷新页面。",
- "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动(SQLite、MySQL 或 PostgreSQL)。",
"Cannot write into \"config\" directory" : "无法写入“config”目录",
"Cannot write into \"apps\" directory" : "无法写入“apps”目录",
"This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "这个通常可以通过赋予 apps 目录写入权限或者在 config 文件中关闭 AppStore 来修复。详情:%s",
@@ -193,56 +193,56 @@ OC.L10N.register(
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "这个通常可以通过赋予根目录写入权限来修复。查看:%s",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "权限通常可以通过赋予根目录写入权限来修复。查看:%s。",
"Setting locale to %s failed" : "设置语言为 %s 失败",
- "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.",
- "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.",
- "PHP module %s not installed." : "PHP %s 模块未安装.",
- "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".",
+ "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器。",
+ "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块。",
+ "PHP module %s not installed." : "PHP %s 模块未安装。",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\"。",
"Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行",
- "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\",预期值为 \"0\"",
"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." : "至少需要 libxml2 2.7.0. 当前安装 %s.",
- "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.",
- "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 服务器.",
+ "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 版本然后重启 Web 服务器以解决该问题。",
+ "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",
"Please upgrade your database version" : "请升级您的数据库版本",
- "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录。",
"Your data directory is readable by other users" : "你的数据目录可被其他用户读取",
"Your data directory must be an absolute path" : "您的数据目录必须是绝对路径",
"Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值",
"Your data directory is invalid" : "您的数据目录无效",
"Ensure there is a file called \".ocdata\" in the root of the data directory." : "请确定在根目录下有一个名为\".ocdata\"的文件。",
- "Action \"%s\" not supported or implemented." : "操作 \"%s\" 不支持或未实现.",
- "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.",
- "Storage unauthorized. %s" : "存储认证失败. %s",
- "Storage incomplete configuration. %s" : "存储未完成配置. %s",
- "Storage connection error. %s" : "存储连接错误. %s",
+ "Action \"%s\" not supported or implemented." : "操作 \"%s\" 不支持或未实现。",
+ "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d。",
+ "Storage unauthorized. %s" : "存储认证失败。%s",
+ "Storage incomplete configuration. %s" : "存储未完成配置。%s",
+ "Storage connection error. %s" : "存储连接错误。%s",
"Storage is temporarily not available" : "存储暂时不可用",
- "Storage connection timeout. %s" : "存储连接超时. %s",
- "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.",
- "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.",
+ "Storage connection timeout. %s" : "存储连接超时。%s",
+ "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s。",
+ "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s。",
"APCu" : "APCu",
"Redis" : "Redis",
"Encryption" : "加密",
"Tips & tricks" : "小提示",
"Sync clients" : "同步客户",
- "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败, 因为用户 %s 不存在",
- "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户",
- "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败, 因为该项已经共享给用户 %s",
- "Sharing %s failed, because this item is already shared with user %s" : "共享 %s 失败, 因为该项已经共享给用户 %s",
- "Sharing %s failed, because the group %s does not exist" : "共享 %s 失败, 因为 %s 分组不存在",
- "Sharing %s failed, because %s is not a member of the group %s" : "共享 %s 失败, 因为 %s 不是 %s 分组的成员",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,无法找到 %s, 该服务当前无法连接。",
+ "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败,因为用户 %s 不存在",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败,因为用户 %s 不是 %s 所属的任何组的用户",
+ "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为该项已经共享给用户 %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "共享 %s 失败,因为该项已经共享给用户 %s",
+ "Sharing %s failed, because the group %s does not exist" : "共享 %s 失败,因为 %s 分组不存在",
+ "Sharing %s failed, because %s is not a member of the group %s" : "共享 %s 失败,因为 %s 不是 %s 分组的成员",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,无法找到 %s,该服务当前无法连接。",
"Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型",
- "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败, 因为权限超过了 %s 的已有权限",
- "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败, 因为无法找到 %s 共享后端的来源",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败,因为权限超过了 %s 的已有权限",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为无法找到 %s 共享后端的来源",
"%s shared »%s« with you" : "%s 向您共享了 »%s«",
- "%s shared »%s« with you." : "%s 已与您共享了 %s .",
+ "%s shared »%s« with you." : "%s 已与您共享了 %s 。",
"%s via %s" : "%s 通过 %s",
"No app name specified" : "没有指定的 App 名称",
- "App '%s' could not be installed!" : "应用 '%s' 无法被安装!",
- "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s"
+ "App '%s' could not be installed!" : "应用 '%s' 无法被安装!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系:%s"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index 2df83c8ee31..56dd49d673d 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -1,25 +1,25 @@
{ "translations": {
- "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!ond",
+ "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!",
"This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题",
"See %s" : "查看 %s",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "或者,如果希望保持 config.php 文件的只读权限,请将 \"config_is_read_only\" 设置为 true。",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "这个通常可以通过赋予写入权限到 config 目录来修复。查看:%s",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "或者,如果希望保持 config.php 文件的只读权限,请将 \"config_is_read_only\" 设置为 true。查看 %s",
- "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确。请确认版本与当前服务器兼容。",
"Sample configuration detected" : "示例配置检测",
- "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用。这可能会破坏您的安装。在对 config.php 进行修改之前请先阅读相关文档。",
"%1$s and %2$s" : "%1$s 和 %2$s",
- "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s",
- "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s",
- "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s",
+ "%1$s, %2$s and %3$s" : "%1$s,%2$s 和 %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s,%2$s,%3$s 和 %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s,%2$s,%3$s,%4$s 和 %5$s",
"Education Edition" : "教育版",
"Enterprise bundle" : "企业捆绑包",
"Groupware bundle" : "群组捆绑包",
"Social sharing bundle" : "社交共享捆绑包",
"PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
- "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.",
+ "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP。",
"%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP",
- "Following databases are supported: %s" : "支持以下数据库: %s",
+ "Following databases are supported: %s" : "支持以下数据库:%s",
"The command line tool %s could not be found" : "命令行工具 %s 未找到",
"The library %s is not available." : "库文件 %s 不可用",
"Library %1$s with a version higher than %2$s is required - available version %3$s." : "库版本 %1$s 高于需要的版本 %2$s - 可用版本 %3$s。",
@@ -54,10 +54,10 @@
"File name is a reserved word" : "文件名包含敏感字符",
"File name contains at least one invalid character" : "文件名中存在至少一个非法字符",
"File name is too long" : "文件名过长",
- "Dot files are not allowed" : ".文件 不被允许",
+ "Dot files are not allowed" : "以 . 开头的文件不被允许",
"Empty filename is not allowed" : "不允许使用空名称。",
- "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.",
- "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.",
+ "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\" 无法安装,因为它与这个版本的服务器不兼容。",
"__language_name__" : "简体中文",
"This is an automatically sent email, please do not reply." : "这是一个自动生成的电子邮件,请不要回复。",
"Help" : "帮助",
@@ -82,7 +82,7 @@
"Verifying" : "验证",
"Verifying …" : "验证...",
"Verify" : "验证",
- "%s enter the database username and name." : "%s 输入数据库用户名和名称.",
+ "%s enter the database username and name." : "%s 输入数据库用户名和名称。",
"%s enter the database username." : "%s 输入数据库用户名。",
"%s enter the database name." : "%s 输入数据库名称。",
"%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
@@ -98,29 +98,29 @@
"Set an admin password." : "请设置一个管理员密码。",
"Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s",
"Invalid Federated Cloud ID" : "无效的联合云ID",
- "Sharing %s failed, because the backend does not allow shares from type %i" : "共享 %s 失败, 因为后端不允许共享 %i 类型",
- "Sharing %s failed, because the file does not exist" : "共享 %s 失败, 因为文件不存在.",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "共享 %s 失败,因为后端不允许共享 %i 类型",
+ "Sharing %s failed, because the file does not exist" : "共享 %s 失败,因为文件不存在。",
"You are not allowed to share %s" : "您无权共享 %s",
- "Sharing %s failed, because you can not share with yourself" : "共享 %s 失败, 因为您不能共享给自己",
+ "Sharing %s failed, because you can not share with yourself" : "共享 %s 失败,因为您不能共享给自己",
"Sharing %1$s failed, because the user %2$s does not exist" : "共享 %1$s 失败,因为 %2$s 用户不存在",
"You need to provide a password to create a public link, only protected links are allowed" : "您需要提供密码以创建公开链接,因为只允许创建受保护的链接。",
- "Sharing %s failed, because sharing with links is not allowed" : "共享 %s 失败, 因为不允许使用链接共享",
+ "Sharing %s failed, because sharing with links is not allowed" : "共享 %s 失败,因为不允许使用链接共享",
"Not allowed to create a federated share with the same user" : "不允许创建对相同用户的联合共享",
- "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 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" : "无法设置过期时间。过期时间不能为过去",
"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 的共享后端未找到",
"Sharing failed, because the user %s is the original sharer" : "共享失败,因为用户 %s 是原始的共享者。",
- "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败, 因为不允许二次共享",
- "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败, 因为文件缓存中找不到该文件",
+ "Sharing %s failed, because resharing is not allowed" : "共享 %s 失败,因为不允许二次共享",
+ "Sharing %s failed, because the file could not be found in the file cache" : "共享 %s 失败,因为文件缓存中找不到该文件",
"Open »%s«" : "打开 %s",
"Can’t increase permissions of %s" : "无法增加%s的权限。",
"Files can’t be shared with delete permissions" : "无法共享有删除权限的文件",
"Files can’t be shared with create permissions" : "无法共享有创建权限的文件",
- "Expiration date is in the past" : "到期日期已过.",
- "Can’t set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.",
- "Click the button below to open it." : "点击下方按钮可打开它.",
+ "Expiration date is in the past" : "到期日期已过。",
+ "Can’t set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天。",
+ "Click the button below to open it." : "点击下方按钮可打开它。",
"The requested share does not exist anymore" : "当前请求的共享已经不存在",
"Could not find category \"%s\"" : "无法找到分类 \"%s\"",
"Sunday" : "星期日",
@@ -183,7 +183,7 @@
"Application is not enabled" : "应用程序未启用",
"Authentication error" : "认证出错",
"Token expired. Please reload page." : "Token 过期,请刷新页面。",
- "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动(SQLite、MySQL 或 PostgreSQL)。",
"Cannot write into \"config\" directory" : "无法写入“config”目录",
"Cannot write into \"apps\" directory" : "无法写入“apps”目录",
"This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "这个通常可以通过赋予 apps 目录写入权限或者在 config 文件中关闭 AppStore 来修复。详情:%s",
@@ -191,56 +191,56 @@
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "这个通常可以通过赋予根目录写入权限来修复。查看:%s",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "权限通常可以通过赋予根目录写入权限来修复。查看:%s。",
"Setting locale to %s failed" : "设置语言为 %s 失败",
- "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.",
- "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.",
- "PHP module %s not installed." : "PHP %s 模块未安装.",
- "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".",
+ "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器。",
+ "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块。",
+ "PHP module %s not installed." : "PHP %s 模块未安装。",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\"。",
"Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行",
- "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\",预期值为 \"0\"",
"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." : "至少需要 libxml2 2.7.0. 当前安装 %s.",
- "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.",
- "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 服务器.",
+ "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 版本然后重启 Web 服务器以解决该问题。",
+ "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",
"Please upgrade your database version" : "请升级您的数据库版本",
- "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录。",
"Your data directory is readable by other users" : "你的数据目录可被其他用户读取",
"Your data directory must be an absolute path" : "您的数据目录必须是绝对路径",
"Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值",
"Your data directory is invalid" : "您的数据目录无效",
"Ensure there is a file called \".ocdata\" in the root of the data directory." : "请确定在根目录下有一个名为\".ocdata\"的文件。",
- "Action \"%s\" not supported or implemented." : "操作 \"%s\" 不支持或未实现.",
- "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.",
- "Storage unauthorized. %s" : "存储认证失败. %s",
- "Storage incomplete configuration. %s" : "存储未完成配置. %s",
- "Storage connection error. %s" : "存储连接错误. %s",
+ "Action \"%s\" not supported or implemented." : "操作 \"%s\" 不支持或未实现。",
+ "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d。",
+ "Storage unauthorized. %s" : "存储认证失败。%s",
+ "Storage incomplete configuration. %s" : "存储未完成配置。%s",
+ "Storage connection error. %s" : "存储连接错误。%s",
"Storage is temporarily not available" : "存储暂时不可用",
- "Storage connection timeout. %s" : "存储连接超时. %s",
- "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.",
- "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.",
+ "Storage connection timeout. %s" : "存储连接超时。%s",
+ "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s。",
+ "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s。",
"APCu" : "APCu",
"Redis" : "Redis",
"Encryption" : "加密",
"Tips & tricks" : "小提示",
"Sync clients" : "同步客户",
- "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败, 因为用户 %s 不存在",
- "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户",
- "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败, 因为该项已经共享给用户 %s",
- "Sharing %s failed, because this item is already shared with user %s" : "共享 %s 失败, 因为该项已经共享给用户 %s",
- "Sharing %s failed, because the group %s does not exist" : "共享 %s 失败, 因为 %s 分组不存在",
- "Sharing %s failed, because %s is not a member of the group %s" : "共享 %s 失败, 因为 %s 不是 %s 分组的成员",
- "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,无法找到 %s, 该服务当前无法连接。",
+ "Sharing %s failed, because the user %s does not exist" : "共享 %s 失败,因为用户 %s 不存在",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "共享 %s 失败,因为用户 %s 不是 %s 所属的任何组的用户",
+ "Sharing %s failed, because this item is already shared with %s" : "共享 %s 失败,因为该项已经共享给用户 %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "共享 %s 失败,因为该项已经共享给用户 %s",
+ "Sharing %s failed, because the group %s does not exist" : "共享 %s 失败,因为 %s 分组不存在",
+ "Sharing %s failed, because %s is not a member of the group %s" : "共享 %s 失败,因为 %s 不是 %s 分组的成员",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "共享 %s 失败,无法找到 %s,该服务当前无法连接。",
"Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型",
- "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败, 因为权限超过了 %s 的已有权限",
- "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败, 因为无法找到 %s 共享后端的来源",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "共享 %s 失败,因为权限超过了 %s 的已有权限",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "共享 %s 失败,因为无法找到 %s 共享后端的来源",
"%s shared »%s« with you" : "%s 向您共享了 »%s«",
- "%s shared »%s« with you." : "%s 已与您共享了 %s .",
+ "%s shared »%s« with you." : "%s 已与您共享了 %s 。",
"%s via %s" : "%s 通过 %s",
"No app name specified" : "没有指定的 App 名称",
- "App '%s' could not be installed!" : "应用 '%s' 无法被安装!",
- "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s"
+ "App '%s' could not be installed!" : "应用 '%s' 无法被安装!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系:%s"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php
index a057cb4fc27..408f070dc0d 100644
--- a/lib/private/Accounts/AccountManager.php
+++ b/lib/private/Accounts/AccountManager.php
@@ -330,7 +330,7 @@ class AccountManager implements IAccountManager {
private function parseAccountData(IUser $user, $data): Account {
$account = new Account($user);
foreach($data as $property => $accountData) {
- $account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'], $accountData['verified']);
+ $account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'] ?? self::VISIBILITY_PRIVATE, $accountData['verified'] ?? self::NOT_VERIFIED);
}
return $account;
}
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index 58706e290fb..09520aae2a9 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -459,6 +459,38 @@ class AllConfig implements \OCP\IConfig {
return $userIDs;
}
+ /**
+ * Determines the users that have the given value set for a specific app-key-pair
+ *
+ * @param string $appName the app to get the user for
+ * @param string $key the key to get the user for
+ * @param string $value the value to get the user for
+ * @return array of user IDs
+ */
+ public function getUsersForUserValueCaseInsensitive($appName, $key, $value) {
+ // TODO - FIXME
+ $this->fixDIInit();
+
+ $sql = 'SELECT `userid` FROM `*PREFIX*preferences` ' .
+ 'WHERE `appid` = ? AND `configkey` = ? ';
+
+ if($this->getSystemValue('dbtype', 'sqlite') === 'oci') {
+ //oracle hack: need to explicitly cast CLOB to CHAR for comparison
+ $sql .= 'AND LOWER(to_char(`configvalue`)) = LOWER(?)';
+ } else {
+ $sql .= 'AND LOWER(`configvalue`) = LOWER(?)';
+ }
+
+ $result = $this->connection->executeQuery($sql, array($appName, $key, $value));
+
+ $userIDs = array();
+ while ($row = $result->fetch()) {
+ $userIDs[] = $row['userid'];
+ }
+
+ return $userIDs;
+ }
+
public function getSystemConfig() {
return $this->systemConfig;
}
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 3708d967c9d..38857af0d39 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -58,9 +58,11 @@ use OCP\Files\IAppData;
use OCP\GlobalScale\IConfig;
use OCP\IL10N;
use OCP\ILogger;
+use OCP\INavigationManager;
use OCP\IRequest;
use OCP\IServerContainer;
use OCP\ISession;
+use OCP\IURLGenerator;
use OCP\IUserSession;
use OCA\WorkflowEngine\Manager;
@@ -69,7 +71,7 @@ class DIContainer extends SimpleContainer implements IAppContainer {
/**
* @var array
*/
- private $middleWares = array();
+ private $middleWares = [];
/** @var ServerContainer */
private $server;
@@ -102,7 +104,7 @@ class DIContainer extends SimpleContainer implements IAppContainer {
/**
* Core services
*/
- $this->registerService(IOutput::class, function($c){
+ $this->registerService(IOutput::class, function(){
return new Output($this->getServer()->getWebRoot());
});
@@ -123,7 +125,7 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return new OC\AppFramework\Logger($this->server->query(ILogger::class), $c->query('AppName'));
});
- $this->registerService(IServerContainer::class, function ($c) {
+ $this->registerService(IServerContainer::class, function () {
return $this->getServer();
});
$this->registerAlias('ServerContainer', IServerContainer::class);
@@ -179,16 +181,35 @@ class DIContainer extends SimpleContainer implements IAppContainer {
/**
* Middleware
*/
- $app = $this;
- $this->registerService('SecurityMiddleware', function($c) use ($app){
- /** @var \OC\Server $server */
- $server = $app->getServer();
+ $this->registerService('MiddlewareDispatcher', function(SimpleContainer $c) {
+ $server = $this->getServer();
+
+ $dispatcher = new MiddlewareDispatcher();
+ $dispatcher->registerMiddleware(
+ new OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware(
+ $c->query(IRequest::class),
+ $c->query(IControllerMethodReflector::class)
+ )
+ );
+ $dispatcher->registerMiddleware(
+ new CORSMiddleware(
+ $c->query(IRequest::class),
+ $c->query(IControllerMethodReflector::class),
+ $c->query(IUserSession::class),
+ $c->query(OC\Security\Bruteforce\Throttler::class)
+ )
+ );
+ $dispatcher->registerMiddleware(
+ new OCSMiddleware(
+ $c->query(IRequest::class)
+ )
+ );
- return new SecurityMiddleware(
- $c['Request'],
- $server->query(IControllerMethodReflector::class),
- $server->getNavigationManager(),
- $server->getURLGenerator(),
+ $securityMiddleware = new SecurityMiddleware(
+ $c->query(IRequest::class),
+ $c->query(IControllerMethodReflector::class),
+ $c->query(INavigationManager::class),
+ $c->query(IURLGenerator::class),
$server->getLogger(),
$c['AppName'],
$server->getUserSession()->isLoggedIn(),
@@ -199,105 +220,59 @@ class DIContainer extends SimpleContainer implements IAppContainer {
$server->getAppManager(),
$server->getL10N('lib')
);
- });
-
- $this->registerService(OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware::class, function ($c) use ($app) {
- /** @var \OC\Server $server */
- $server = $app->getServer();
-
- return new OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware(
- $c->query(IControllerMethodReflector::class),
- $server->getSession(),
- $server->getUserSession(),
- $server->query(ITimeFactory::class)
- );
- });
-
- $this->registerService('BruteForceMiddleware', function($c) use ($app) {
- /** @var \OC\Server $server */
- $server = $app->getServer();
-
- return new OC\AppFramework\Middleware\Security\BruteForceMiddleware(
- $c->query(IControllerMethodReflector::class),
- $server->getBruteForceThrottler(),
- $server->getRequest()
- );
- });
-
- $this->registerService('RateLimitingMiddleware', function($c) use ($app) {
- /** @var \OC\Server $server */
- $server = $app->getServer();
-
- return new RateLimitingMiddleware(
- $server->getRequest(),
- $server->getUserSession(),
- $c->query(IControllerMethodReflector::class),
- $c->query(OC\Security\RateLimiting\Limiter::class)
+ $dispatcher->registerMiddleware($securityMiddleware);
+ $dispatcher->registerMiddleware(
+ new OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware(
+ $c->query(IControllerMethodReflector::class),
+ $c->query(ISession::class),
+ $c->query(IUserSession::class),
+ $c->query(ITimeFactory::class)
+ )
);
- });
-
- $this->registerService('CORSMiddleware', function($c) {
- return new CORSMiddleware(
- $c['Request'],
- $c->query(IControllerMethodReflector::class),
- $c->query(IUserSession::class),
- $c->getServer()->getBruteForceThrottler()
+ $dispatcher->registerMiddleware(
+ new TwoFactorMiddleware(
+ $c->query(OC\Authentication\TwoFactorAuth\Manager::class),
+ $c->query(IUserSession::class),
+ $c->query(ISession::class),
+ $c->query(IURLGenerator::class),
+ $c->query(IControllerMethodReflector::class),
+ $c->query(IRequest::class)
+ )
);
- });
-
- $this->registerService('SessionMiddleware', function($c) use ($app) {
- return new SessionMiddleware(
- $c['Request'],
- $c->query(IControllerMethodReflector::class),
- $app->getServer()->getSession()
+ $dispatcher->registerMiddleware(
+ new OC\AppFramework\Middleware\Security\BruteForceMiddleware(
+ $c->query(IControllerMethodReflector::class),
+ $c->query(OC\Security\Bruteforce\Throttler::class),
+ $c->query(IRequest::class)
+ )
);
- });
-
- $this->registerService('TwoFactorMiddleware', function (SimpleContainer $c) use ($app) {
- $twoFactorManager = $c->getServer()->getTwoFactorAuthManager();
- $userSession = $app->getServer()->getUserSession();
- $session = $app->getServer()->getSession();
- $urlGenerator = $app->getServer()->getURLGenerator();
- $reflector = $c->query(IControllerMethodReflector::class);
- $request = $app->getServer()->getRequest();
- return new TwoFactorMiddleware($twoFactorManager, $userSession, $session, $urlGenerator, $reflector, $request);
- });
-
- $this->registerService('OCSMiddleware', function (SimpleContainer $c) {
- return new OCSMiddleware(
- $c['Request']
+ $dispatcher->registerMiddleware(
+ new RateLimitingMiddleware(
+ $c->query(IRequest::class),
+ $c->query(IUserSession::class),
+ $c->query(IControllerMethodReflector::class),
+ $c->query(OC\Security\RateLimiting\Limiter::class)
+ )
);
- });
-
- $this->registerService(OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware::class, function (SimpleContainer $c) {
- return new OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware(
- $c['Request'],
- $c->query(IControllerMethodReflector::class)
+ $dispatcher->registerMiddleware(
+ new OC\AppFramework\Middleware\PublicShare\PublicShareMiddleware(
+ $c->query(IRequest::class),
+ $c->query(ISession::class),
+ $c->query(\OCP\IConfig::class)
+ )
);
- });
- $middleWares = &$this->middleWares;
- $this->registerService('MiddlewareDispatcher', function(SimpleContainer $c) use (&$middleWares) {
- $dispatcher = new MiddlewareDispatcher();
- $dispatcher->registerMiddleware($c[OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware::class]);
- $dispatcher->registerMiddleware($c['CORSMiddleware']);
- $dispatcher->registerMiddleware($c['OCSMiddleware']);
- $dispatcher->registerMiddleware($c['SecurityMiddleware']);
- $dispatcher->registerMiddleware($c[OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware::class]);
- $dispatcher->registerMiddleware($c['TwoFactorMiddleware']);
- $dispatcher->registerMiddleware($c['BruteForceMiddleware']);
- $dispatcher->registerMiddleware($c['RateLimitingMiddleware']);
- $dispatcher->registerMiddleware(new OC\AppFramework\Middleware\PublicShare\PublicShareMiddleware(
- $c['Request'],
- $c->query(ISession::class),
- $c->query(\OCP\IConfig::class)
- ));
-
- foreach($middleWares as $middleWare) {
+ foreach($this->middleWares as $middleWare) {
$dispatcher->registerMiddleware($c[$middleWare]);
}
- $dispatcher->registerMiddleware($c['SessionMiddleware']);
+ $dispatcher->registerMiddleware(
+ new SessionMiddleware(
+ $c->query(IRequest::class),
+ $c->query(IControllerMethodReflector::class),
+ $c->query(ISession::class)
+ )
+ );
return $dispatcher;
});
diff --git a/lib/private/AppFramework/Http/Request.php b/lib/private/AppFramework/Http/Request.php
index 2c745973ed2..00668e87e34 100644
--- a/lib/private/AppFramework/Http/Request.php
+++ b/lib/private/AppFramework/Http/Request.php
@@ -691,7 +691,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
return $this->config->getSystemValue('overwriteprotocol');
}
- if (isset($this->server['HTTP_X_FORWARDED_PROTO'])) {
+ if ($this->fromTrustedProxy() && isset($this->server['HTTP_X_FORWARDED_PROTO'])) {
if (strpos($this->server['HTTP_X_FORWARDED_PROTO'], ',') !== false) {
$parts = explode(',', $this->server['HTTP_X_FORWARDED_PROTO']);
$proto = strtolower(trim($parts[0]));
@@ -862,7 +862,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
*/
public function getInsecureServerHost(): string {
$host = 'localhost';
- if (isset($this->server['HTTP_X_FORWARDED_HOST'])) {
+ if ($this->fromTrustedProxy() && isset($this->server['HTTP_X_FORWARDED_HOST'])) {
if (strpos($this->server['HTTP_X_FORWARDED_HOST'], ',') !== false) {
$parts = explode(',', $this->server['HTTP_X_FORWARDED_HOST']);
$host = trim(current($parts));
@@ -924,4 +924,10 @@ class Request implements \ArrayAccess, \Countable, IRequest {
return null;
}
+ private function fromTrustedProxy(): bool {
+ $remoteAddress = isset($this->server['REMOTE_ADDR']) ? $this->server['REMOTE_ADDR'] : '';
+ $trustedProxies = $this->config->getSystemValue('trusted_proxies', []);
+
+ return \is_array($trustedProxies) && $this->isTrustedProxy($trustedProxies, $remoteAddress);
+ }
}
diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php
index f3865c6504f..8df4a84a477 100644
--- a/lib/private/Comments/Manager.php
+++ b/lib/private/Comments/Manager.php
@@ -581,27 +581,42 @@ class Manager implements ICommentsManager {
* @param int $folderId
* @param IUser $user
* @return array [$fileId => $unreadCount]
+ *
+ * @suppress SqlInjectionChecker
*/
public function getNumberOfUnreadCommentsForFolder($folderId, IUser $user) {
$qb = $this->dbConn->getQueryBuilder();
+
$query = $qb->select('f.fileid')
->addSelect($qb->func()->count('c.id', 'num_ids'))
- ->from('comments', 'c')
- ->innerJoin('c', 'filecache', 'f', $qb->expr()->andX(
- $qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
- $qb->expr()->eq('f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT))
+ ->from('filecache', 'f')
+ ->leftJoin('f', 'comments', 'c', $qb->expr()->eq(
+ 'f.fileid', $qb->expr()->castColumn('c.object_id', IQueryBuilder::PARAM_INT)
))
- ->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->andX(
- $qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
- $qb->expr()->eq('m.object_id', 'c.object_id'),
- $qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID()))
+ ->leftJoin('c', 'comments_read_markers', 'm', $qb->expr()->eq(
+ 'c.object_id', 'm.object_id'
))
- ->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)))
- ->andWhere($qb->expr()->orX(
- $qb->expr()->gt('c.creation_timestamp', 'marker_datetime'),
- $qb->expr()->isNull('marker_datetime')
- ))
- ->groupBy('f.fileid');
+ ->where(
+ $qb->expr()->andX(
+ $qb->expr()->eq('f.parent', $qb->createNamedParameter($folderId)),
+ $qb->expr()->orX(
+ $qb->expr()->eq('c.object_type', $qb->createNamedParameter('files')),
+ $qb->expr()->isNull('c.object_type')
+ ),
+ $qb->expr()->orX(
+ $qb->expr()->eq('m.object_type', $qb->createNamedParameter('files')),
+ $qb->expr()->isNull('m.object_type')
+ ),
+ $qb->expr()->orX(
+ $qb->expr()->eq('m.user_id', $qb->createNamedParameter($user->getUID())),
+ $qb->expr()->isNull('m.user_id')
+ ),
+ $qb->expr()->orX(
+ $qb->expr()->gt('c.creation_timestamp', 'm.marker_datetime'),
+ $qb->expr()->isNull('m.marker_datetime')
+ )
+ )
+ )->groupBy('f.fileid');
$resultStatement = $query->execute();
diff --git a/lib/private/DB/MigrationService.php b/lib/private/DB/MigrationService.php
index f584cb351d2..97f1dd269d1 100644
--- a/lib/private/DB/MigrationService.php
+++ b/lib/private/DB/MigrationService.php
@@ -25,11 +25,12 @@ namespace OC\DB;
use Doctrine\DBAL\Platforms\OraclePlatform;
use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
-use Doctrine\DBAL\Schema\Column;
use Doctrine\DBAL\Schema\Index;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\DBAL\Schema\SchemaException;
use Doctrine\DBAL\Schema\Sequence;
+use Doctrine\DBAL\Schema\Table;
+use OC\App\InfoParser;
use OC\IntegrityCheck\Helpers\AppLocator;
use OC\Migration\SimpleOutput;
use OCP\AppFramework\App;
@@ -51,6 +52,8 @@ class MigrationService {
private $connection;
/** @var string */
private $appName;
+ /** @var bool */
+ private $checkOracle;
/**
* MigrationService constructor.
@@ -72,6 +75,7 @@ class MigrationService {
if ($appName === 'core') {
$this->migrationsPath = \OC::$SERVERROOT . '/core/Migrations';
$this->migrationsNamespace = 'OC\\Core\\Migrations';
+ $this->checkOracle = true;
} else {
if (null === $appLocator) {
$appLocator = new AppLocator();
@@ -80,6 +84,21 @@ class MigrationService {
$namespace = App::buildAppNamespace($appName);
$this->migrationsPath = "$appPath/lib/Migration";
$this->migrationsNamespace = $namespace . '\\Migration';
+
+ $infoParser = new InfoParser();
+ $info = $infoParser->parse($appPath . '/appinfo/info.xml');
+ if (!isset($info['dependencies']['database'])) {
+ $this->checkOracle = true;
+ } else {
+ $this->checkOracle = false;
+ foreach ($info['dependencies']['database'] as $database) {
+ if (\is_string($database) && $database === 'oci') {
+ $this->checkOracle = true;
+ } else if (\is_array($database) && isset($database['@value']) && $database['@value'] === 'oci') {
+ $this->checkOracle = true;
+ }
+ }
+ }
}
}
@@ -457,8 +476,10 @@ class MigrationService {
if ($toSchema instanceof SchemaWrapper) {
$targetSchema = $toSchema->getWrappedSchema();
- // TODO re-enable once stable14 is branched of: https://github.com/nextcloud/server/issues/10518
- // $this->ensureOracleIdentifierLengthLimit($targetSchema, strlen($this->connection->getPrefix()));
+ if ($this->checkOracle) {
+ $sourceSchema = $this->connection->createSchema();
+ $this->ensureOracleIdentifierLengthLimit($sourceSchema, $targetSchema, strlen($this->connection->getPrefix()));
+ }
$this->connection->migrateToSchema($targetSchema);
$toSchema->performDropTableCalls();
}
@@ -472,34 +493,39 @@ class MigrationService {
$this->markAsExecuted($version);
}
- public function ensureOracleIdentifierLengthLimit(Schema $schema, int $prefixLength) {
- $sequences = $schema->getSequences();
+ public function ensureOracleIdentifierLengthLimit(Schema $sourceSchema, Schema $targetSchema, int $prefixLength) {
+ $sequences = $targetSchema->getSequences();
- foreach ($schema->getTables() as $table) {
- if (\strlen($table->getName()) - $prefixLength > 27) {
- throw new \InvalidArgumentException('Table name "' . $table->getName() . '" is too long.');
+ foreach ($targetSchema->getTables() as $table) {
+ try {
+ $sourceTable = $sourceSchema->getTable($table->getName());
+ } catch (SchemaException $e) {
+ if (\strlen($table->getName()) - $prefixLength > 27) {
+ throw new \InvalidArgumentException('Table name "' . $table->getName() . '" is too long.');
+ }
+ $sourceTable = null;
}
foreach ($table->getColumns() as $thing) {
- if (\strlen($thing->getName()) - $prefixLength > 27) {
+ if ((!$sourceTable instanceof Table || !$sourceTable->hasColumn($thing->getName())) && \strlen($thing->getName()) - $prefixLength > 27) {
throw new \InvalidArgumentException('Column name "' . $table->getName() . '"."' . $thing->getName() . '" is too long.');
}
}
foreach ($table->getIndexes() as $thing) {
- if (\strlen($thing->getName()) - $prefixLength > 27) {
+ if ((!$sourceTable instanceof Table || !$sourceTable->hasIndex($thing->getName())) && \strlen($thing->getName()) - $prefixLength > 27) {
throw new \InvalidArgumentException('Index name "' . $table->getName() . '"."' . $thing->getName() . '" is too long.');
}
}
foreach ($table->getForeignKeys() as $thing) {
- if (\strlen($thing->getName()) - $prefixLength > 27) {
+ if ((!$sourceTable instanceof Table || !$sourceTable->hasForeignKey($thing->getName())) && \strlen($thing->getName()) - $prefixLength > 27) {
throw new \InvalidArgumentException('Foreign key name "' . $table->getName() . '"."' . $thing->getName() . '" is too long.');
}
}
$primaryKey = $table->getPrimaryKey();
- if ($primaryKey instanceof Index) {
+ if ($primaryKey instanceof Index && (!$sourceTable instanceof Table || !$sourceTable->hasPrimaryKey())) {
$indexName = strtolower($primaryKey->getName());
$isUsingDefaultName = $indexName === 'primary';
@@ -528,7 +554,7 @@ class MigrationService {
}
foreach ($sequences as $sequence) {
- if (\strlen($sequence->getName()) - $prefixLength > 27) {
+ if (!$sourceSchema->hasSequence($sequence->getName()) && \strlen($sequence->getName()) - $prefixLength > 27) {
throw new \InvalidArgumentException('Sequence name "' . $sequence->getName() . '" is too long.');
}
}
diff --git a/lib/private/Encryption/DecryptAll.php b/lib/private/Encryption/DecryptAll.php
index 16eee347334..d95a8660762 100644
--- a/lib/private/Encryption/DecryptAll.php
+++ b/lib/private/Encryption/DecryptAll.php
@@ -105,6 +105,9 @@ class DecryptAll {
$this->output->writeln('maybe the user is not set up in a way that supports this operation: ');
foreach ($this->failed as $uid => $paths) {
$this->output->writeln(' ' . $uid);
+ foreach ($paths as $path) {
+ $this->output->writeln(' ' . $path);
+ }
}
$this->output->writeln('');
}
diff --git a/lib/private/Files/AppData/AppData.php b/lib/private/Files/AppData/AppData.php
index e25bf450446..7ce29bd0e00 100644
--- a/lib/private/Files/AppData/AppData.php
+++ b/lib/private/Files/AppData/AppData.php
@@ -24,6 +24,7 @@ declare(strict_types=1);
namespace OC\Files\AppData;
+use OC\Cache\CappedMemoryCache;
use OC\Files\SimpleFS\SimpleFolder;
use OCP\Files\IAppData;
use OCP\Files\IRootFolder;
@@ -48,6 +49,9 @@ class AppData implements IAppData {
/** @var Folder */
private $folder;
+ /** @var (ISimpleFolder|NotFoundException)[]|CappedMemoryCache */
+ private $folders;
+
/**
* AppData constructor.
*
@@ -62,6 +66,32 @@ class AppData implements IAppData {
$this->rootFolder = $rootFolder;
$this->config = $systemConfig;
$this->appId = $appId;
+ $this->folders = new CappedMemoryCache();
+ }
+
+ private function getAppDataFolderName() {
+ $instanceId = $this->config->getValue('instanceid', null);
+ if ($instanceId === null) {
+ throw new \RuntimeException('no instance id!');
+ }
+
+ return 'appdata_' . $instanceId;
+ }
+
+ private function getAppDataRootFolder(): Folder {
+ $name = $this->getAppDataFolderName();
+
+ try {
+ /** @var Folder $node */
+ $node = $this->rootFolder->get($name);
+ return $node;
+ } catch (NotFoundException $e) {
+ try {
+ return $this->rootFolder->newFolder($name);
+ } catch (NotPermittedException $e) {
+ throw new \RuntimeException('Could not get appdata folder');
+ }
+ }
}
/**
@@ -70,56 +100,69 @@ class AppData implements IAppData {
*/
private function getAppDataFolder(): Folder {
if ($this->folder === null) {
- $instanceId = $this->config->getValue('instanceid', null);
- if ($instanceId === null) {
- throw new \RuntimeException('no instance id!');
- }
-
- $name = 'appdata_' . $instanceId;
+ $name = $this->getAppDataFolderName();
try {
- $appDataFolder = $this->rootFolder->get($name);
+ $this->folder = $this->rootFolder->get($name . '/' . $this->appId);
} catch (NotFoundException $e) {
- try {
- $appDataFolder = $this->rootFolder->newFolder($name);
- } catch (NotPermittedException $e) {
- throw new \RuntimeException('Could not get appdata folder');
- }
- }
+ $appDataRootFolder = $this->getAppDataRootFolder();
- try {
- $appDataFolder = $appDataFolder->get($this->appId);
- } catch (NotFoundException $e) {
try {
- $appDataFolder = $appDataFolder->newFolder($this->appId);
- } catch (NotPermittedException $e) {
- throw new \RuntimeException('Could not get appdata folder for ' . $this->appId);
+ $this->folder = $appDataRootFolder->get($this->appId);
+ } catch (NotFoundException $e) {
+ try {
+ $this->folder = $appDataRootFolder->newFolder($this->appId);
+ } catch (NotPermittedException $e) {
+ throw new \RuntimeException('Could not get appdata folder for ' . $this->appId);
+ }
}
}
-
- $this->folder = $appDataFolder;
}
return $this->folder;
}
public function getFolder(string $name): ISimpleFolder {
- $node = $this->getAppDataFolder()->get($name);
+ $key = $this->appId . '/' . $name;
+ if ($cachedFolder = $this->folders->get($key)) {
+ if ($cachedFolder instanceof \Exception) {
+ throw $cachedFolder;
+ } else {
+ return $cachedFolder;
+ }
+ }
+ try {
+ // Hardening if somebody wants to retrieve '/'
+ if ($name === '/') {
+ $node = $this->getAppDataFolder();
+ } else {
+ $path = $this->getAppDataFolderName() . '/' . $this->appId . '/' . $name;
+ $node = $this->rootFolder->get($path);
+ }
+ } catch (NotFoundException $e) {
+ $this->folders->set($key, $e);
+ throw $e;
+ }
/** @var Folder $node */
- return new SimpleFolder($node);
+ $folder = new SimpleFolder($node);
+ $this->folders->set($key, $folder);
+ return $folder;
}
public function newFolder(string $name): ISimpleFolder {
+ $key = $this->appId . '/' . $name;
$folder = $this->getAppDataFolder()->newFolder($name);
- return new SimpleFolder($folder);
+ $simpleFolder = new SimpleFolder($folder);
+ $this->folders->set($key, $simpleFolder);
+ return $simpleFolder;
}
public function getDirectoryListing(): array {
$listing = $this->getAppDataFolder()->getDirectoryListing();
- $fileListing = array_map(function(Node $folder) {
+ $fileListing = array_map(function (Node $folder) {
if ($folder instanceof Folder) {
return new SimpleFolder($folder);
}
diff --git a/lib/private/Files/AppData/Factory.php b/lib/private/Files/AppData/Factory.php
index fba2232db06..5c7d554ba5b 100644
--- a/lib/private/Files/AppData/Factory.php
+++ b/lib/private/Files/AppData/Factory.php
@@ -34,6 +34,8 @@ class Factory {
/** @var SystemConfig */
private $config;
+ private $folders = [];
+
public function __construct(IRootFolder $rootFolder,
SystemConfig $systemConfig) {
@@ -46,6 +48,9 @@ class Factory {
* @return AppData
*/
public function get(string $appId): AppData {
- return new AppData($this->rootFolder, $this->config, $appId);
+ if (!isset($this->folders[$appId])) {
+ $this->folders[$appId] = new AppData($this->rootFolder, $this->config, $appId);
+ }
+ return $this->folders[$appId];
}
}
diff --git a/lib/private/Files/ObjectStore/SwiftFactory.php b/lib/private/Files/ObjectStore/SwiftFactory.php
index 3ff534b4e64..1034026327b 100644
--- a/lib/private/Files/ObjectStore/SwiftFactory.php
+++ b/lib/private/Files/ObjectStore/SwiftFactory.php
@@ -33,6 +33,7 @@ use OCP\ICache;
use OCP\ILogger;
use OpenStack\Common\Error\BadResponseError;
use OpenStack\Common\Auth\Token;
+use OpenStack\Identity\v2\Models\Catalog;
use OpenStack\Identity\v2\Service as IdentityV2Service;
use OpenStack\Identity\v3\Service as IdentityV3Service;
use OpenStack\OpenStack;
@@ -47,6 +48,13 @@ class SwiftFactory {
private $container = null;
private $logger;
+ const DEFAULT_OPTIONS = [
+ 'autocreate' => false,
+ 'urlType' => 'publicURL',
+ 'catalogName' => 'swift',
+ 'catalogType' => 'object-store'
+ ];
+
public function __construct(ICache $cache, array $params, ILogger $logger) {
$this->cache = $cache;
$this->params = $params;
@@ -62,11 +70,21 @@ class SwiftFactory {
}
}
- private function cacheToken(Token $token, string $cacheKey) {
+ private function cacheToken(Token $token, string $serviceUrl, string $cacheKey) {
if ($token instanceof \OpenStack\Identity\v3\Models\Token) {
+ // for v3 the catalog is cached as part of the token, so no need to cache $serviceUrl separately
$value = json_encode($token->export());
} else {
- $value = json_encode($token);
+ /** @var \OpenStack\Identity\v2\Models\Token $token */
+ $value = json_encode([
+ 'serviceUrl' => $serviceUrl,
+ 'token' => [
+ 'issued_at' => $token->issuedAt->format('c'),
+ 'expires' => $token->expires->format('c'),
+ 'id' => $token->id,
+ 'tenant' => $token->tenant
+ ]
+ ]);
}
$this->cache->set($cacheKey . '/token', $value);
}
@@ -82,10 +100,6 @@ class SwiftFactory {
if (!isset($this->params['container'])) {
$this->params['container'] = 'nextcloud';
}
- if (!isset($this->params['autocreate'])) {
- // should only be true for tests
- $this->params['autocreate'] = false;
- }
if (isset($this->params['user']) && is_array($this->params['user'])) {
$userName = $this->params['user']['name'];
} else {
@@ -97,6 +111,7 @@ class SwiftFactory {
if (!isset($this->params['tenantName']) && isset($this->params['tenant'])) {
$this->params['tenantName'] = $this->params['tenant'];
}
+ $this->params = array_merge(self::DEFAULT_OPTIONS, $this->params);
$cacheKey = $userName . '@' . $this->params['url'] . '/' . $this->params['container'];
$token = $this->getCachedToken($cacheKey);
@@ -114,7 +129,7 @@ class SwiftFactory {
return $this->auth(IdentityV3Service::factory($httpClient), $cacheKey);
} else {
- return $this->auth(IdentityV2Service::factory($httpClient), $cacheKey);
+ return $this->auth(SwiftV2CachingAuthService::factory($httpClient), $cacheKey);
}
}
@@ -127,25 +142,41 @@ class SwiftFactory {
private function auth($authService, string $cacheKey) {
$this->params['identityService'] = $authService;
$this->params['authUrl'] = $this->params['url'];
- $client = new OpenStack($this->params);
$cachedToken = $this->params['cachedToken'];
$hasValidCachedToken = false;
- if (\is_array($cachedToken) && ($authService instanceof IdentityV3Service)) {
- $token = $authService->generateTokenFromCache($cachedToken);
- if (\is_null($token->catalog)) {
- $this->logger->warning('Invalid cached token for swift, no catalog set: ' . json_encode($cachedToken));
- } else if ($token->hasExpired()) {
- $this->logger->debug('Cached token for swift expired');
+ if (\is_array($cachedToken)) {
+ if ($authService instanceof IdentityV3Service) {
+ $token = $authService->generateTokenFromCache($cachedToken);
+ if (\is_null($token->catalog)) {
+ $this->logger->warning('Invalid cached token for swift, no catalog set: ' . json_encode($cachedToken));
+ } else if ($token->hasExpired()) {
+ $this->logger->debug('Cached token for swift expired');
+ } else {
+ $hasValidCachedToken = true;
+ }
} else {
- $hasValidCachedToken = true;
+ try {
+ /** @var \OpenStack\Identity\v2\Models\Token $token */
+ $token = $authService->model(\OpenStack\Identity\v2\Models\Token::class, $cachedToken['token']);
+ $now = new \DateTimeImmutable("now");
+ if ($token->expires > $now) {
+ $hasValidCachedToken = true;
+ $this->params['v2cachedToken'] = $token;
+ $this->params['v2serviceUrl'] = $cachedToken['serviceUrl'];
+ } else {
+ $this->logger->debug('Cached token for swift expired');
+ }
+ } catch (\Exception $e) {
+ $this->logger->logException($e);
+ }
}
}
if (!$hasValidCachedToken) {
try {
- $token = $authService->generateToken($this->params);
- $this->cacheToken($token, $cacheKey);
+ list($token, $serviceUrl) = $authService->authenticate($this->params);
+ $this->cacheToken($token, $serviceUrl, $cacheKey);
} catch (ConnectException $e) {
throw new StorageAuthException('Failed to connect to keystone, verify the keystone url', $e);
} catch (ClientException $e) {
@@ -164,6 +195,9 @@ class SwiftFactory {
}
}
+
+ $client = new OpenStack($this->params);
+
return $client;
}
diff --git a/lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php b/lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php
new file mode 100644
index 00000000000..38f1e54dac3
--- /dev/null
+++ b/lib/private/Files/ObjectStore/SwiftV2CachingAuthService.php
@@ -0,0 +1,35 @@
+<?php declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl>
+ *
+ * @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\Files\ObjectStore;
+
+
+use OpenStack\Identity\v2\Service;
+
+class SwiftV2CachingAuthService extends Service {
+ public function authenticate(array $options = []): array {
+ if (!empty($options['v2cachedToken'])) {
+ return [$options['v2cachedToken'], $options['v2serviceUrl']];
+ } else {
+ return parent::authenticate($options);
+ }
+ }
+}
diff --git a/lib/private/FullTextSearch/FullTextSearchManager.php b/lib/private/FullTextSearch/FullTextSearchManager.php
index 9a9b077cf23..444774fb4a7 100644
--- a/lib/private/FullTextSearch/FullTextSearchManager.php
+++ b/lib/private/FullTextSearch/FullTextSearchManager.php
@@ -166,7 +166,7 @@ class FullTextSearchManager implements IFullTextSearchManager {
* @throws FullTextSearchAppNotAvailableException
*/
public function createIndex(string $providerId, string $documentId, string $userId, int $status = 0): IIndex {
- return $this->getIndexService()->getIndex($providerId, $documentId);
+ return $this->getIndexService()->createIndex($providerId, $documentId, $userId, $status);
}
diff --git a/lib/private/Http/Client/Response.php b/lib/private/Http/Client/Response.php
index 73c14c2926d..6786ecd6fc1 100644
--- a/lib/private/Http/Client/Response.php
+++ b/lib/private/Http/Client/Response.php
@@ -71,7 +71,13 @@ class Response implements IResponse {
* @return string
*/
public function getHeader(string $key): string {
- return $this->response->getHeader($key)[0];
+ $headers = $this->response->getHeader($key);
+
+ if (count($headers) === 0) {
+ return '';
+ }
+
+ return $headers[0];
}
/**
diff --git a/lib/private/Log/ExceptionSerializer.php b/lib/private/Log/ExceptionSerializer.php
index 768c6484963..d291275ee95 100644
--- a/lib/private/Log/ExceptionSerializer.php
+++ b/lib/private/Log/ExceptionSerializer.php
@@ -37,6 +37,9 @@ class ExceptionSerializer {
'{closure}',
'createSessionToken',
+ // Provisioning
+ 'addUser',
+
// TokenProvider
'getToken',
'isTokenPassword',
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php
index 7a8b4ad2599..d103e1380c5 100644
--- a/lib/private/Mail/Mailer.php
+++ b/lib/private/Mail/Mailer.php
@@ -259,6 +259,10 @@ class Mailer implements IMailer {
if (!empty($smtpSecurity)) {
$transport->setEncryption($smtpSecurity);
}
+ $streamingOptions = $this->config->getSystemValue('mail_smtpstreamoptions', []);
+ if (is_array($streamingOptions) && !empty($streamingOptions)) {
+ $transport->setStreamOptions($streamingOptions);
+ }
return $transport;
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 8ae2cb7652c..03d115fe022 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -553,7 +553,7 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerAlias(\OCP\Support\CrashReport\IRegistry::class, \OC\Support\CrashReport\Registry::class);
- $this->registerService(\OCP\ILogger::class, function (Server $c) {
+ $this->registerService(\OC\Log::class, function (Server $c) {
$logType = $c->query('AllConfig')->getSystemValue('log_type', 'file');
$factory = new LogFactory($c, $this->getSystemConfig());
$logger = $factory->get($logType);
@@ -561,7 +561,8 @@ class Server extends ServerContainer implements IServerContainer {
return new Log($logger, $this->getSystemConfig(), null, $registry);
});
- $this->registerAlias('Logger', \OCP\ILogger::class);
+ $this->registerAlias(\OCP\ILogger::class, \OC\Log::class);
+ $this->registerAlias('Logger', \OC\Log::class);
$this->registerService(ILogFactory::class, function (Server $c) {
return new LogFactory($c, $this->getSystemConfig());
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index cbadf1df53f..284f14c5db4 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -210,7 +210,14 @@ class TemplateLayout extends \OC_Template {
if (substr($file, -strlen('print.css')) === 'print.css') {
$this->append( 'printcssfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
} else {
- $this->append( 'cssfiles', $web.'/'.$file . $this->getVersionHashSuffix($web, $file) );
+ $suffix = $this->getVersionHashSuffix($web, $file);
+
+ if (strpos($file, '?v=') == false) {
+ $this->append( 'cssfiles', $web.'/'.$file . $suffix);
+ } else {
+ $this->append( 'cssfiles', $web.'/'.$file . '-' . substr($suffix, 3));
+ }
+
}
}
}
diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php
index 4243ced2e98..f1a2029a7d5 100644
--- a/lib/private/User/Manager.php
+++ b/lib/private/User/Manager.php
@@ -589,7 +589,7 @@ class Manager extends PublicEmitter implements IUserManager {
* @since 9.1.0
*/
public function getByEmail($email) {
- $userIds = $this->config->getUsersForUserValue('settings', 'email', $email);
+ $userIds = $this->config->getUsersForUserValueCaseInsensitive('settings', 'email', $email);
$users = array_map(function($uid) {
return $this->get($uid);
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index 8d1cfd13a50..a69aed3910b 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -425,7 +425,7 @@ class Session implements IUserSession, Emitter {
$this->logger->warning('Login failed: \'' . $user . '\' (Remote IP: \'' . \OC::$server->getRequest()->getRemoteAddress() . '\')', ['app' => 'core']);
- $throttler->registerAttempt('login', $request->getRemoteAddress(), ['uid' => $user]);
+ $throttler->registerAttempt('login', $request->getRemoteAddress(), ['user' => $user]);
if ($currentDelay === 0) {
$throttler->sleepDelay($request->getRemoteAddress(), 'login');
}
diff --git a/lib/private/legacy/template.php b/lib/private/legacy/template.php
index 9c7da75e5fd..d0812de5f68 100644
--- a/lib/private/legacy/template.php
+++ b/lib/private/legacy/template.php
@@ -112,8 +112,6 @@ class OC_Template extends \OC\Template\Base {
OC_Util::addStyle('css-variables', null, true);
OC_Util::addStyle('server', null, true);
OC_Util::addStyle('jquery-ui-fixes',null,true);
- OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui',null,true);
- OC_Util::addVendorStyle('select2/select2', null, true);
OC_Util::addStyle('jquery.ocdialog');
OC_Util::addTranslations("core", null, true);
OC_Util::addStyle('search', 'results');
@@ -125,30 +123,9 @@ class OC_Template extends \OC\Template\Base {
OC_Util::addScript('files/client');
OC_Util::addScript('contactsmenu');
OC_Util::addScript('contactsmenu_templates');
-
- if (\OC::$server->getConfig()->getSystemValue('debug')) {
- // Add the stuff we need always
- // following logic will import all vendor libraries that are
- // specified in core/js/core.json
- $fileContent = file_get_contents(OC::$SERVERROOT . '/core/js/core.json');
- if($fileContent !== false) {
- $coreDependencies = json_decode($fileContent, true);
- foreach(array_reverse($coreDependencies['vendor']) as $vendorLibrary) {
- //remove trailing ".js" as addVendorScript will append it
- OC_Util::addVendorScript(
- substr($vendorLibrary, 0, -3),null,true);
- }
- } else {
- throw new \Exception('Cannot read core/js/core.json');
- }
- } else {
- // Import all (combined) default vendor libraries
- OC_Util::addVendorScript('core', null, true);
- }
+ OC_Util::addScript('core', 'dist/main', true);
if (\OC::$server->getRequest()->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE])) {
- // polyfill for btoa/atob for IE friends
- OC_Util::addVendorScript('base64/base64');
// shim for the davclient.js library
\OCP\Util::addScript('files/iedavclient');
}
diff --git a/lib/public/AppFramework/Db/QBMapper.php b/lib/public/AppFramework/Db/QBMapper.php
index dbc47d2d43d..a6a44b8902e 100644
--- a/lib/public/AppFramework/Db/QBMapper.php
+++ b/lib/public/AppFramework/Db/QBMapper.php
@@ -119,7 +119,9 @@ abstract class QBMapper {
$qb->execute();
- $entity->setId((int) $qb->getLastInsertId());
+ if($entity->id === null) {
+ $entity->setId((int)$qb->getLastInsertId());
+ }
return $entity;
}
diff --git a/lib/public/AppFramework/Http/ContentSecurityPolicy.php b/lib/public/AppFramework/Http/ContentSecurityPolicy.php
index e9ecf000364..c12fbc7561e 100644
--- a/lib/public/AppFramework/Http/ContentSecurityPolicy.php
+++ b/lib/public/AppFramework/Http/ContentSecurityPolicy.php
@@ -80,12 +80,15 @@ class ContentSecurityPolicy extends EmptyContentSecurityPolicy {
/** @var array Domains from which fonts can be loaded */
protected $allowedFontDomains = [
'\'self\'',
+ 'data:',
];
/** @var array Domains from which web-workers and nested browsing content can load elements */
protected $allowedChildSrcDomains = [];
/** @var array Domains which can embed this Nextcloud instance */
- protected $allowedFrameAncestors = [];
+ protected $allowedFrameAncestors = [
+ '\'self\'',
+ ];
/** @var array Domains from which web-workers can be loaded */
protected $allowedWorkerSrcDomains = [];
diff --git a/lib/public/FullTextSearch/Service/IIndexService.php b/lib/public/FullTextSearch/Service/IIndexService.php
index c5d1b9b3bcf..b70c7eb965f 100644
--- a/lib/public/FullTextSearch/Service/IIndexService.php
+++ b/lib/public/FullTextSearch/Service/IIndexService.php
@@ -45,6 +45,20 @@ interface IIndexService {
/**
+ * Create an Index
+ *
+ * @since 15.0.1
+ *
+ * @param string $providerId
+ * @param string $documentId
+ * @param string $userId
+ * @param int $status
+ * @return IIndex
+ */
+ public function createIndex(string $providerId, string $documentId, string $userId, int $status): IIndex;
+
+
+ /**
* Retrieve an Index from the database, based on the Id of the Provider
* and the Id of the Document
*
diff --git a/lib/versioncheck.php b/lib/versioncheck.php
index 739c045f6df..ffaa0e510a3 100644
--- a/lib/versioncheck.php
+++ b/lib/versioncheck.php
@@ -1,10 +1,9 @@
<?php
-// Show warning if a PHP version below 7.0 is used, this has to happen here
-// because base.php will already use 7.0 syntax.
-if (version_compare(PHP_VERSION, '7.0') === -1) {
+// Show warning if a PHP version below 7.1 is used,
+if (version_compare(PHP_VERSION, '7.1') === -1) {
http_response_code(500);
- echo 'This version of Nextcloud requires at least PHP 7.0<br/>';
+ echo 'This version of Nextcloud requires at least PHP 7.1<br/>';
echo 'You are currently running ' . PHP_VERSION . '. Please update your PHP version.';
exit(-1);
}