diff options
36 files changed, 284 insertions, 28 deletions
diff --git a/apps/dav/lib/DAV/CustomPropertiesBackend.php b/apps/dav/lib/DAV/CustomPropertiesBackend.php index 5f512995ce8..acee65cd00d 100644 --- a/apps/dav/lib/DAV/CustomPropertiesBackend.php +++ b/apps/dav/lib/DAV/CustomPropertiesBackend.php @@ -54,6 +54,28 @@ class CustomPropertiesBackend implements BackendInterface { '{http://owncloud.org/ns}dDC', '{http://owncloud.org/ns}size', '{http://nextcloud.org/ns}is-encrypted', + + // Currently, returning null from any propfind handler would still trigger the backend, + // so we add all known Nextcloud custom properties in here to avoid that + + // text app + '{http://nextcloud.org/ns}rich-workspace', + '{http://nextcloud.org/ns}rich-workspace-file', + // groupfolders + '{http://nextcloud.org/ns}acl-enabled', + '{http://nextcloud.org/ns}acl-can-manage', + '{http://nextcloud.org/ns}acl-list', + '{http://nextcloud.org/ns}inherited-acl-list', + '{http://nextcloud.org/ns}group-folder-id', + // files_lock + '{http://nextcloud.org/ns}lock', + '{http://nextcloud.org/ns}lock-owner-type', + '{http://nextcloud.org/ns}lock-owner', + '{http://nextcloud.org/ns}lock-owner-displayname', + '{http://nextcloud.org/ns}lock-owner-editor', + '{http://nextcloud.org/ns}lock-time', + '{http://nextcloud.org/ns}lock-timeout', + '{http://nextcloud.org/ns}lock-token', ]; /** diff --git a/apps/files_external/l10n/fi.js b/apps/files_external/l10n/fi.js index 06c7c2e5029..dc2c8b5fdd0 100644 --- a/apps/files_external/l10n/fi.js +++ b/apps/files_external/l10n/fi.js @@ -20,6 +20,7 @@ OC.L10N.register( "Never" : "Ei koskaan", "Once every direct access" : "Kerran aina suoran käytön yhteydessä", "Read only" : "Vain luku", + "Disconnect" : "Katkaise yhteys", "Admin defined" : "Ylläpitäjän määrittämä", "Delete storage?" : "Poistetaanko tallennustila?", "Saved" : "Tallennettu", diff --git a/apps/files_external/l10n/fi.json b/apps/files_external/l10n/fi.json index 09f9621c41b..8f26136ebae 100644 --- a/apps/files_external/l10n/fi.json +++ b/apps/files_external/l10n/fi.json @@ -18,6 +18,7 @@ "Never" : "Ei koskaan", "Once every direct access" : "Kerran aina suoran käytön yhteydessä", "Read only" : "Vain luku", + "Disconnect" : "Katkaise yhteys", "Admin defined" : "Ylläpitäjän määrittämä", "Delete storage?" : "Poistetaanko tallennustila?", "Saved" : "Tallennettu", diff --git a/apps/files_sharing/l10n/fi.js b/apps/files_sharing/l10n/fi.js index 3db7e899224..4ad2412692c 100644 --- a/apps/files_sharing/l10n/fi.js +++ b/apps/files_sharing/l10n/fi.js @@ -101,6 +101,7 @@ OC.L10N.register( "Wrong share ID, share doesn't exist" : "Väärä jakotunniste, jakoa ei ole olemassa", "Could not delete share" : "Jaon poistaminen epäonnistui", "Please specify a file or folder path" : "Määritä tiedoston tai kansion polku", + "Wrong path, file/folder does not exist" : "Väärä polku, tiedostoa/kansiota ei ole olemassa", "Could not create share" : "Jaon luominen epäonnistui", "Invalid permissions" : "Virheelliset käyttöoikeudet", "Please specify a valid user" : "Määritä kelvollinen käyttäjä", @@ -116,6 +117,7 @@ OC.L10N.register( "Please specify a valid circle" : "Määritä kelvollinen piiri", "Unknown share type" : "Tuntematon jaon tyyppi", "Not a directory" : "Ei hakemisto", + "Could not lock node" : "Solmua ei voitu lukita", "Could not lock path" : "Polun lukitseminen ei onnistunut", "Wrong or no update parameter given" : "Päivitettävä parametri puuttuu tai on väärin", "shared by %s" : "%s jakama", @@ -139,6 +141,10 @@ OC.L10N.register( "Read only" : "Vain luku", "Allow upload and editing" : "Salli lähetys ja muokkaus", "File drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", + "Custom permissions" : "Mukautetut oikeudet", + "Read" : "Lue", + "Upload" : "Lähetä", + "Edit" : "Muokkaa", "Allow creating" : "Salli luominen", "Allow deleting" : "Salli poistaminen", "Allow resharing" : "Salli uudelleenjakaminen", @@ -231,6 +237,7 @@ OC.L10N.register( "Wrong path, file/folder doesn't exist" : "Väärä polku, tiedostoa tai kansiota ei ole olemassa", "invalid permissions" : "vialliset oikeudet", "Can't change permissions for public share links" : "Julkisten jakolinkkien käyttöoikeuksia ei voi muuttaa", - "Download %s" : "Lataa %s" + "Download %s" : "Lataa %s", + "Cannot change permissions for public share links" : "Julkisten jakolinkkien oikeuksia ei voi muuttaa" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/fi.json b/apps/files_sharing/l10n/fi.json index 59d876fef14..0507545ee83 100644 --- a/apps/files_sharing/l10n/fi.json +++ b/apps/files_sharing/l10n/fi.json @@ -99,6 +99,7 @@ "Wrong share ID, share doesn't exist" : "Väärä jakotunniste, jakoa ei ole olemassa", "Could not delete share" : "Jaon poistaminen epäonnistui", "Please specify a file or folder path" : "Määritä tiedoston tai kansion polku", + "Wrong path, file/folder does not exist" : "Väärä polku, tiedostoa/kansiota ei ole olemassa", "Could not create share" : "Jaon luominen epäonnistui", "Invalid permissions" : "Virheelliset käyttöoikeudet", "Please specify a valid user" : "Määritä kelvollinen käyttäjä", @@ -114,6 +115,7 @@ "Please specify a valid circle" : "Määritä kelvollinen piiri", "Unknown share type" : "Tuntematon jaon tyyppi", "Not a directory" : "Ei hakemisto", + "Could not lock node" : "Solmua ei voitu lukita", "Could not lock path" : "Polun lukitseminen ei onnistunut", "Wrong or no update parameter given" : "Päivitettävä parametri puuttuu tai on väärin", "shared by %s" : "%s jakama", @@ -137,6 +139,10 @@ "Read only" : "Vain luku", "Allow upload and editing" : "Salli lähetys ja muokkaus", "File drop (upload only)" : "Tiedostojen pudotus (vain lähetys)", + "Custom permissions" : "Mukautetut oikeudet", + "Read" : "Lue", + "Upload" : "Lähetä", + "Edit" : "Muokkaa", "Allow creating" : "Salli luominen", "Allow deleting" : "Salli poistaminen", "Allow resharing" : "Salli uudelleenjakaminen", @@ -229,6 +235,7 @@ "Wrong path, file/folder doesn't exist" : "Väärä polku, tiedostoa tai kansiota ei ole olemassa", "invalid permissions" : "vialliset oikeudet", "Can't change permissions for public share links" : "Julkisten jakolinkkien käyttöoikeuksia ei voi muuttaa", - "Download %s" : "Lataa %s" + "Download %s" : "Lataa %s", + "Cannot change permissions for public share links" : "Julkisten jakolinkkien oikeuksia ei voi muuttaa" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/lib/AppInfo/Application.php b/apps/files_sharing/lib/AppInfo/Application.php index befd1532d02..2539247b561 100644 --- a/apps/files_sharing/lib/AppInfo/Application.php +++ b/apps/files_sharing/lib/AppInfo/Application.php @@ -30,6 +30,7 @@ namespace OCA\Files_Sharing\AppInfo; use OC\Share\Share; +use OC\User\DisplayNameCache; use OCA\Files_Sharing\Capabilities; use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent; use OCA\Files_Sharing\External\Manager; @@ -65,6 +66,7 @@ use OCP\IUserSession; use OCP\L10N\IFactory; use OCP\Share\Events\ShareCreatedEvent; use OCP\Share\IManager; +use OCP\User\Events\UserChangedEvent; use OCP\Util; use Psr\Container\ContainerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -98,6 +100,7 @@ class Application extends App implements IBootstrap { $context->registerCapability(Capabilities::class); $context->registerNotifierService(Notifier::class); + $context->registerEventListener(UserChangedEvent::class, DisplayNameCache::class); } public function boot(IBootContext $context): void { diff --git a/apps/files_sharing/lib/Cache.php b/apps/files_sharing/lib/Cache.php index 8729426221b..9f11431008f 100644 --- a/apps/files_sharing/lib/Cache.php +++ b/apps/files_sharing/lib/Cache.php @@ -33,11 +33,13 @@ use OC\Files\Cache\Wrapper\CacheJail; use OC\Files\Search\SearchBinaryOperator; use OC\Files\Search\SearchComparison; use OC\Files\Storage\Wrapper\Jail; +use OC\User\DisplayNameCache; use OCP\Files\Cache\ICacheEntry; use OCP\Files\Search\ISearchBinaryOperator; use OCP\Files\Search\ISearchComparison; use OCP\Files\Search\ISearchOperator; use OCP\Files\StorageNotAvailableException; +use OCP\ICacheFactory; use OCP\IUserManager; /** @@ -46,27 +48,22 @@ use OCP\IUserManager; * don't use this class directly if you need to get metadata, use \OC\Files\Filesystem::getFileInfo instead */ class Cache extends CacheJail { - /** @var \OCA\Files_Sharing\SharedStorage */ + /** @var SharedStorage */ private $storage; - /** @var ICacheEntry */ - private $sourceRootInfo; - /** @var IUserManager */ - private $userManager; - - private $rootUnchanged = true; - - private $ownerDisplayName; - + private ICacheEntry $sourceRootInfo; + private bool $rootUnchanged = true; + private ?string $ownerDisplayName = null; private $numericId; + private DisplayNameCache $displayNameCache; /** - * @param \OCA\Files_Sharing\SharedStorage $storage + * @param SharedStorage $storage */ - public function __construct($storage, ICacheEntry $sourceRootInfo, IUserManager $userManager) { + public function __construct($storage, ICacheEntry $sourceRootInfo, DisplayNameCache $displayNameCache) { $this->storage = $storage; $this->sourceRootInfo = $sourceRootInfo; - $this->userManager = $userManager; $this->numericId = $sourceRootInfo->getStorageId(); + $this->displayNameCache = $displayNameCache; parent::__construct( null, @@ -173,12 +170,7 @@ class Cache extends CacheJail { private function getOwnerDisplayName() { if (!$this->ownerDisplayName) { $uid = $this->storage->getOwner(''); - $user = $this->userManager->get($uid); - if ($user) { - $this->ownerDisplayName = $user->getDisplayName(); - } else { - $this->ownerDisplayName = $uid; - } + $this->ownerDisplayName = $this->displayNameCache->getDisplayName($uid); } return $this->ownerDisplayName; } diff --git a/apps/files_sharing/lib/SharedStorage.php b/apps/files_sharing/lib/SharedStorage.php index 6a342f0bdbf..60a292c498d 100644 --- a/apps/files_sharing/lib/SharedStorage.php +++ b/apps/files_sharing/lib/SharedStorage.php @@ -35,7 +35,12 @@ namespace OCA\Files_Sharing; use OC\Files\Cache\FailedCache; use OC\Files\Cache\NullWatcher; use OC\Files\Cache\Watcher; +use OC\Files\ObjectStore\HomeObjectStoreStorage; +use OC\Files\Storage\Common; +use OC\Files\Storage\Home; +use OC\User\DisplayNameCache; use OCP\Files\Folder; +use OCP\Files\IHomeStorage; use OCP\Files\Node; use OC\Files\Storage\FailedStorage; use OC\Files\Storage\Wrapper\PermissionsMask; @@ -182,10 +187,17 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto * @inheritdoc */ public function instanceOfStorage($class): bool { - if ($class === '\OC\Files\Storage\Common') { + if ($class === '\OC\Files\Storage\Common' || $class == Common::class) { return true; } - if (in_array($class, ['\OC\Files\Storage\Home', '\OC\Files\ObjectStore\HomeObjectStoreStorage', '\OCP\Files\IHomeStorage'])) { + if (in_array($class, [ + '\OC\Files\Storage\Home', + '\OC\Files\ObjectStore\HomeObjectStoreStorage', + '\OCP\Files\IHomeStorage', + Home::class, + HomeObjectStoreStorage::class, + IHomeStorage::class + ])) { return false; } return parent::instanceOfStorage($class); @@ -405,7 +417,7 @@ class SharedStorage extends \OC\Files\Storage\Wrapper\Jail implements ISharedSto $this->cache = new \OCA\Files_Sharing\Cache( $storage, $sourceRoot, - \OC::$server->get(IUserManager::class) + \OC::$server->get(DisplayNameCache::class) ); return $this->cache; } diff --git a/apps/files_sharing/tests/TestCase.php b/apps/files_sharing/tests/TestCase.php index bb1e3125ab2..234ea2c69c8 100644 --- a/apps/files_sharing/tests/TestCase.php +++ b/apps/files_sharing/tests/TestCase.php @@ -39,6 +39,7 @@ use OCA\Files_Sharing\MountProvider; use OCP\Files\Config\IMountProviderCollection; use OCP\Share\IShare; use Test\Traits\MountProviderTrait; +use OC\User\DisplayNameCache; /** * Class TestCase @@ -116,6 +117,7 @@ abstract class TestCase extends \Test\TestCase { protected function setUp(): void { parent::setUp(); + \OC::$server->get(DisplayNameCache::class)->clear(); //login as user1 self::loginHelper(self::TEST_FILES_SHARING_API_USER1); diff --git a/apps/weather_status/l10n/eu.js b/apps/weather_status/l10n/eu.js index cffdb9d1a5e..d36bcaaf2dd 100644 --- a/apps/weather_status/l10n/eu.js +++ b/apps/weather_status/l10n/eu.js @@ -21,6 +21,18 @@ OC.L10N.register( "{temperature} {unit} partly cloudy" : "{temperature} {unit} hodei-tarteak", "{temperature} {unit} foggy later today" : "{temperature} {unit} lainotu egingo da geroago", "{temperature} {unit} foggy" : "{temperature} {unit} lainotsu", + "{temperature} {unit} light rainfall later today" : "{tenperatura} {unitatea} eurite arina gaur beranduago", + "{temperature} {unit} light rainfall" : "{tenperatura} {unitatea} prezipitazio arina", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} prezipitazioa gaur beranduago", + "{temperature} {unit} rainfall" : "{tenperatura} {unitatea} prezipitazioa", + "{temperature} {unit} heavy rainfall later today" : "{tenperatura} {unitatea} eurite handia gaur beranduago", + "{temperature} {unit} heavy rainfall" : "{tenperatura} {unitatea} euri-jasa", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} euri zaparrada gaur beranduago", + "{temperature} {unit} rainfall showers" : "{tenperatura} {unitatea} euri zaparradak gaur beranduago", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} zaparrada arinak gaur beranduago", + "{temperature} {unit} light rainfall showers" : "{tenperatura} {unitatea} zaparrada arinak", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} euri zaparrada handiak gaur beranduago", + "{temperature} {unit} heavy rainfall showers" : "{tenperatura} {unitatea} euri zaparrada handiak", "More weather for {adr}" : "Eguraldi gehiago {adr}-(e)rako", "Loading weather" : "Eguraldia kargatzen", "Remove from favorites" : "Kendu gogokoetatik", diff --git a/apps/weather_status/l10n/eu.json b/apps/weather_status/l10n/eu.json index 091def3710b..3e974d1dba5 100644 --- a/apps/weather_status/l10n/eu.json +++ b/apps/weather_status/l10n/eu.json @@ -19,6 +19,18 @@ "{temperature} {unit} partly cloudy" : "{temperature} {unit} hodei-tarteak", "{temperature} {unit} foggy later today" : "{temperature} {unit} lainotu egingo da geroago", "{temperature} {unit} foggy" : "{temperature} {unit} lainotsu", + "{temperature} {unit} light rainfall later today" : "{tenperatura} {unitatea} eurite arina gaur beranduago", + "{temperature} {unit} light rainfall" : "{tenperatura} {unitatea} prezipitazio arina", + "{temperature} {unit} rainfall later today" : "{temperature} {unit} prezipitazioa gaur beranduago", + "{temperature} {unit} rainfall" : "{tenperatura} {unitatea} prezipitazioa", + "{temperature} {unit} heavy rainfall later today" : "{tenperatura} {unitatea} eurite handia gaur beranduago", + "{temperature} {unit} heavy rainfall" : "{tenperatura} {unitatea} euri-jasa", + "{temperature} {unit} rainfall showers later today" : "{temperature} {unit} euri zaparrada gaur beranduago", + "{temperature} {unit} rainfall showers" : "{tenperatura} {unitatea} euri zaparradak gaur beranduago", + "{temperature} {unit} light rainfall showers later today" : "{temperature} {unit} zaparrada arinak gaur beranduago", + "{temperature} {unit} light rainfall showers" : "{tenperatura} {unitatea} zaparrada arinak", + "{temperature} {unit} heavy rainfall showers later today" : "{temperature} {unit} euri zaparrada handiak gaur beranduago", + "{temperature} {unit} heavy rainfall showers" : "{tenperatura} {unitatea} euri zaparrada handiak", "More weather for {adr}" : "Eguraldi gehiago {adr}-(e)rako", "Loading weather" : "Eguraldia kargatzen", "Remove from favorites" : "Kendu gogokoetatik", diff --git a/core/Application.php b/core/Application.php index 34932cab183..443585ebc79 100644 --- a/core/Application.php +++ b/core/Application.php @@ -218,6 +218,13 @@ class Application extends App { $subject->addHintForMissingSubject($table->getName(), 'direct_edit_timestamp'); } } + + if ($schema->hasTable('preferences')) { + $table = $schema->getTable('preferences'); + if (!$table->hasIndex('preferences_app_key')) { + $subject->addHintForMissingSubject($table->getName(), 'preferences_app_key'); + } + } } ); diff --git a/core/Command/Db/AddMissingIndices.php b/core/Command/Db/AddMissingIndices.php index a4379ffacc3..8394e75e845 100644 --- a/core/Command/Db/AddMissingIndices.php +++ b/core/Command/Db/AddMissingIndices.php @@ -435,6 +435,19 @@ class AddMissingIndices extends Command { } } + $output->writeln('<info>Check indices of the oc_preferences table.</info>'); + if ($schema->hasTable('preferences')) { + $table = $schema->getTable('preferences'); + if (!$table->hasIndex('preferences_app_key')) { + $output->writeln('<info>Adding preferences_app_key index to the oc_preferences table, this can take some time...</info>'); + + $table->addIndex(['appid', 'configkey'], 'preferences_app_key'); + $this->connection->migrateToSchema($schema->getWrappedSchema()); + $updated = true; + $output->writeln('<info>oc_properties table updated successfully.</info>'); + } + } + if (!$updated) { $output->writeln('<info>Done.</info>'); } diff --git a/core/Migrations/Version13000Date20170718121200.php b/core/Migrations/Version13000Date20170718121200.php index 02864830b2c..3e14b4af47a 100644 --- a/core/Migrations/Version13000Date20170718121200.php +++ b/core/Migrations/Version13000Date20170718121200.php @@ -333,6 +333,7 @@ class Version13000Date20170718121200 extends SimpleMigrationStep { 'notnull' => false, ]); $table->setPrimaryKey(['userid', 'appid', 'configkey']); + $table->addIndex(['appid', 'configkey'], 'preferences_app_key'); } if (!$schema->hasTable('properties')) { diff --git a/core/l10n/cs.js b/core/l10n/cs.js index 09506f34699..f3302f4ea8e 100644 --- a/core/l10n/cs.js +++ b/core/l10n/cs.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} uživatel zatím nezadal žádné informace", "Error opening the user status modal, try hard refreshing the page" : "Chyba při otevírání dialogu stavu uživatele, pokus o opětovné načtení stránky", "Reset search" : "Resetovat hledání", + "Start search" : "Zahájit vyhledávání", "Search for {name} only" : "Hledat pouze {name}", "No results for {query}" : "Pro {query} nic nenalezeno", + "Press enter to start searching" : "Vyhledávání zahájíte stisknutím klávesy Enter", "Start typing to search" : "Hledejte psaním", "Loading more results …" : "Načítání dalších výsledků…", "Load more results" : "Načíst další výsledky", diff --git a/core/l10n/cs.json b/core/l10n/cs.json index ae17e521f03..29fdd624e32 100644 --- a/core/l10n/cs.json +++ b/core/l10n/cs.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} uživatel zatím nezadal žádné informace", "Error opening the user status modal, try hard refreshing the page" : "Chyba při otevírání dialogu stavu uživatele, pokus o opětovné načtení stránky", "Reset search" : "Resetovat hledání", + "Start search" : "Zahájit vyhledávání", "Search for {name} only" : "Hledat pouze {name}", "No results for {query}" : "Pro {query} nic nenalezeno", + "Press enter to start searching" : "Vyhledávání zahájíte stisknutím klávesy Enter", "Start typing to search" : "Hledejte psaním", "Loading more results …" : "Načítání dalších výsledků…", "Load more results" : "Načíst další výsledky", diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js index 49e4308f5ec..2117098c970 100644 --- a/core/l10n/de_DE.js +++ b/core/l10n/de_DE.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} hat noch keine Infos hinzugefügt", "Error opening the user status modal, try hard refreshing the page" : "Fehler beim Modal-öffnen des Benutzerstatus, versuchen Sie die Seite zu aktualisieren", "Reset search" : "Suche zurücksetzen", + "Start search" : "Starte Suche", "Search for {name} only" : "Nur nach {name} suchen", "No results for {query}" : "Keine Suchergebnisse zu {query}", + "Press enter to start searching" : "Eingabetaste zum Starten der Suche drücken", "Start typing to search" : "Beginnen Sie mit der Eingabe, um zu suchen", "Loading more results …" : "Lade weitere Ergebnisse…", "Load more results" : "Weitere Ergebnisse laden", diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json index 380a7091223..803c711340e 100644 --- a/core/l10n/de_DE.json +++ b/core/l10n/de_DE.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} hat noch keine Infos hinzugefügt", "Error opening the user status modal, try hard refreshing the page" : "Fehler beim Modal-öffnen des Benutzerstatus, versuchen Sie die Seite zu aktualisieren", "Reset search" : "Suche zurücksetzen", + "Start search" : "Starte Suche", "Search for {name} only" : "Nur nach {name} suchen", "No results for {query}" : "Keine Suchergebnisse zu {query}", + "Press enter to start searching" : "Eingabetaste zum Starten der Suche drücken", "Start typing to search" : "Beginnen Sie mit der Eingabe, um zu suchen", "Loading more results …" : "Lade weitere Ergebnisse…", "Load more results" : "Weitere Ergebnisse laden", diff --git a/core/l10n/fi.js b/core/l10n/fi.js index 20d11b9a8a7..817981caf6f 100644 --- a/core/l10n/fi.js +++ b/core/l10n/fi.js @@ -147,9 +147,12 @@ OC.L10N.register( "Login form is disabled." : "Kirjautumislomake on poistettu käytöstä.", "Edit Profile" : "Muokkaa profiilia", "You have not added any info yet" : "Et ole lisännyt tietoja vielä", + "{user} has not added any info yet" : "{user} ei ole lisännyt tietoja vielä", "Reset search" : "Tyhjennä haku", + "Start search" : "Aloita haku", "Search for {name} only" : "Etsi vain {name}", "No results for {query}" : "Ei tuloksia haulle {query}", + "Press enter to start searching" : "Paina enter aloittaaksesi haun", "Start typing to search" : "Aloita kirjoittaminen hakeaksesi", "Loading more results …" : "Ladataan lisää tuloksia…", "Load more results" : "Lataa lisää tuloksia", @@ -309,6 +312,9 @@ OC.L10N.register( "You can close this window." : "Voit sulkea tämän ikkunan.", "This share is password-protected" : "Jako on salasanasuojattu", "The password is wrong. Try again." : "Salasana on väärin. Yritä uudelleen.", + "Email address" : "Sähköpostiosoite", + "Password sent!" : "Salasana lähetetty!", + "Request password" : "Pyydä salasanaa", "Go to %s" : "Siirry %s§", "Two-factor authentication" : "Kaksivaiheinen tunnistautuminen", "Enhanced security is enabled for your account. Choose a second factor for authentication:" : "Tilisi tietoturvatasoa on korotettu. Käytä kaksivaiheista tunnistautumista:", @@ -371,6 +377,8 @@ OC.L10N.register( "Could not fetch list of apps from the app store." : "Ei voitu hakea sovelluskaupan listaa.", "Can't install this app because it is not compatible" : "Tätä sovellusta ei voi asentaa, koska se ei ole yhteensopiva", "Can't install this app" : "Tätä sovellusta ei voi asentaa", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the {linkstart}documentation ↗{linkend}." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue {linkstart}dokumentaatio ↗{linkend}." + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the {linkstart}documentation ↗{linkend}." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue {linkstart}dokumentaatio ↗{linkend}.", + "You haven't added any info yet" : "Et ole lisännyt tietoja vielä", + "{user} hasn't added any info yet" : "{user} ei ole lisännyt tietoja vielä" }, "nplurals=2; plural=(n != 1);"); diff --git a/core/l10n/fi.json b/core/l10n/fi.json index 8899c6e6cda..5c459d69d97 100644 --- a/core/l10n/fi.json +++ b/core/l10n/fi.json @@ -145,9 +145,12 @@ "Login form is disabled." : "Kirjautumislomake on poistettu käytöstä.", "Edit Profile" : "Muokkaa profiilia", "You have not added any info yet" : "Et ole lisännyt tietoja vielä", + "{user} has not added any info yet" : "{user} ei ole lisännyt tietoja vielä", "Reset search" : "Tyhjennä haku", + "Start search" : "Aloita haku", "Search for {name} only" : "Etsi vain {name}", "No results for {query}" : "Ei tuloksia haulle {query}", + "Press enter to start searching" : "Paina enter aloittaaksesi haun", "Start typing to search" : "Aloita kirjoittaminen hakeaksesi", "Loading more results …" : "Ladataan lisää tuloksia…", "Load more results" : "Lataa lisää tuloksia", @@ -307,6 +310,9 @@ "You can close this window." : "Voit sulkea tämän ikkunan.", "This share is password-protected" : "Jako on salasanasuojattu", "The password is wrong. Try again." : "Salasana on väärin. Yritä uudelleen.", + "Email address" : "Sähköpostiosoite", + "Password sent!" : "Salasana lähetetty!", + "Request password" : "Pyydä salasanaa", "Go to %s" : "Siirry %s§", "Two-factor authentication" : "Kaksivaiheinen tunnistautuminen", "Enhanced security is enabled for your account. Choose a second factor for authentication:" : "Tilisi tietoturvatasoa on korotettu. Käytä kaksivaiheista tunnistautumista:", @@ -369,6 +375,8 @@ "Could not fetch list of apps from the app store." : "Ei voitu hakea sovelluskaupan listaa.", "Can't install this app because it is not compatible" : "Tätä sovellusta ei voi asentaa, koska se ei ole yhteensopiva", "Can't install this app" : "Tätä sovellusta ei voi asentaa", - "To migrate to another database use the command line tool: 'occ db:convert-type', or see the {linkstart}documentation ↗{linkend}." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue {linkstart}dokumentaatio ↗{linkend}." + "To migrate to another database use the command line tool: 'occ db:convert-type', or see the {linkstart}documentation ↗{linkend}." : "Siirtyäksesi toiseen tietokantaan, käytä komentorivityökalua: 'occ db:convert-type', tai lue {linkstart}dokumentaatio ↗{linkend}.", + "You haven't added any info yet" : "Et ole lisännyt tietoja vielä", + "{user} hasn't added any info yet" : "{user} ei ole lisännyt tietoja vielä" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/core/l10n/pl.js b/core/l10n/pl.js index b4be46eb0f2..712283f8b6f 100644 --- a/core/l10n/pl.js +++ b/core/l10n/pl.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} nie dodał jeszcze żadnych informacji", "Error opening the user status modal, try hard refreshing the page" : "Błąd podczas otwierania modalnego statusu użytkownika, spróbuj bardziej odświeżyć stronę", "Reset search" : "Zresetuj wyszukiwanie", + "Start search" : "Zacznij wyszukiwać", "Search for {name} only" : "Wyszukaj tylko {name}", "No results for {query}" : "Brak wyników dla {query}", + "Press enter to start searching" : "Naciśnij Enter, aby rozpocząć wyszukiwanie", "Start typing to search" : "Zacznij pisać, aby wyszukać", "Loading more results …" : "Wczytuję więcej wyników…", "Load more results" : "Wczytaj więcej wyników", diff --git a/core/l10n/pl.json b/core/l10n/pl.json index 2b1a0b8b536..3fbecd2c49b 100644 --- a/core/l10n/pl.json +++ b/core/l10n/pl.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} nie dodał jeszcze żadnych informacji", "Error opening the user status modal, try hard refreshing the page" : "Błąd podczas otwierania modalnego statusu użytkownika, spróbuj bardziej odświeżyć stronę", "Reset search" : "Zresetuj wyszukiwanie", + "Start search" : "Zacznij wyszukiwać", "Search for {name} only" : "Wyszukaj tylko {name}", "No results for {query}" : "Brak wyników dla {query}", + "Press enter to start searching" : "Naciśnij Enter, aby rozpocząć wyszukiwanie", "Start typing to search" : "Zacznij pisać, aby wyszukać", "Loading more results …" : "Wczytuję więcej wyników…", "Load more results" : "Wczytaj więcej wyników", diff --git a/core/l10n/tr.js b/core/l10n/tr.js index 05bfc7887c3..56c8dc9c6b2 100644 --- a/core/l10n/tr.js +++ b/core/l10n/tr.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} henüz herhangi bir bilgi eklememiş", "Error opening the user status modal, try hard refreshing the page" : "Üste açılan kullanıcı durumu penceresinde sorun çıktı. Sayfası temizleyerek yenilemeyi deneyin ", "Reset search" : "Aramayı sıfırla", + "Start search" : "Aramayı başlat", "Search for {name} only" : "Yalnız {name} için aransın", "No results for {query}" : "{query} sorgusundan bir sonuç alınamadı", + "Press enter to start searching" : "Aramayı başlatmak için Enter tuşuna basın", "Start typing to search" : "Aramak için yazmaya başlayın", "Loading more results …" : "Diğer sonuçlar yükleniyor…", "Load more results" : "Diğer sonuçları yükle", diff --git a/core/l10n/tr.json b/core/l10n/tr.json index 580f67a1775..448e823c6bc 100644 --- a/core/l10n/tr.json +++ b/core/l10n/tr.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} henüz herhangi bir bilgi eklememiş", "Error opening the user status modal, try hard refreshing the page" : "Üste açılan kullanıcı durumu penceresinde sorun çıktı. Sayfası temizleyerek yenilemeyi deneyin ", "Reset search" : "Aramayı sıfırla", + "Start search" : "Aramayı başlat", "Search for {name} only" : "Yalnız {name} için aransın", "No results for {query}" : "{query} sorgusundan bir sonuç alınamadı", + "Press enter to start searching" : "Aramayı başlatmak için Enter tuşuna basın", "Start typing to search" : "Aramak için yazmaya başlayın", "Loading more results …" : "Diğer sonuçlar yükleniyor…", "Load more results" : "Diğer sonuçları yükle", diff --git a/core/l10n/zh_HK.js b/core/l10n/zh_HK.js index 90ab574c051..e3eedaf434e 100644 --- a/core/l10n/zh_HK.js +++ b/core/l10n/zh_HK.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} 尚未新增任何資訊", "Error opening the user status modal, try hard refreshing the page" : "打開用戶狀態模式時出錯,請嘗試刷新頁面", "Reset search" : "重置搜尋", + "Start search" : "開始搜尋", "Search for {name} only" : "只搜尋 {name}", "No results for {query}" : "{query} 查詢沒有結果", + "Press enter to start searching" : "按 Enter 開始搜尋", "Start typing to search" : "輸入文字以檢索", "Loading more results …" : "正在載入更多結果...", "Load more results" : "載入更多結果", diff --git a/core/l10n/zh_HK.json b/core/l10n/zh_HK.json index 2a5751e3918..1e7a85cdb8e 100644 --- a/core/l10n/zh_HK.json +++ b/core/l10n/zh_HK.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} 尚未新增任何資訊", "Error opening the user status modal, try hard refreshing the page" : "打開用戶狀態模式時出錯,請嘗試刷新頁面", "Reset search" : "重置搜尋", + "Start search" : "開始搜尋", "Search for {name} only" : "只搜尋 {name}", "No results for {query}" : "{query} 查詢沒有結果", + "Press enter to start searching" : "按 Enter 開始搜尋", "Start typing to search" : "輸入文字以檢索", "Loading more results …" : "正在載入更多結果...", "Load more results" : "載入更多結果", diff --git a/core/l10n/zh_TW.js b/core/l10n/zh_TW.js index 3ec54f66d81..0620c75cb37 100644 --- a/core/l10n/zh_TW.js +++ b/core/l10n/zh_TW.js @@ -187,8 +187,10 @@ OC.L10N.register( "{user} has not added any info yet" : "{user} 尚未新增任何資訊。", "Error opening the user status modal, try hard refreshing the page" : "開啟使用者狀態模式時發生問題,嘗試重新整理頁面", "Reset search" : "重置搜尋", + "Start search" : "開始搜尋", "Search for {name} only" : "僅搜尋 {name}", "No results for {query}" : "{query} 查詢沒有結果", + "Press enter to start searching" : "按 Enter 以開始搜尋", "Start typing to search" : "開始輸入以搜尋", "Loading more results …" : "正在載入更多結果…", "Load more results" : "載入更多結果", diff --git a/core/l10n/zh_TW.json b/core/l10n/zh_TW.json index 350b4043fc1..e2816a3fea3 100644 --- a/core/l10n/zh_TW.json +++ b/core/l10n/zh_TW.json @@ -185,8 +185,10 @@ "{user} has not added any info yet" : "{user} 尚未新增任何資訊。", "Error opening the user status modal, try hard refreshing the page" : "開啟使用者狀態模式時發生問題,嘗試重新整理頁面", "Reset search" : "重置搜尋", + "Start search" : "開始搜尋", "Search for {name} only" : "僅搜尋 {name}", "No results for {query}" : "{query} 查詢沒有結果", + "Press enter to start searching" : "按 Enter 以開始搜尋", "Start typing to search" : "開始輸入以搜尋", "Loading more results …" : "正在載入更多結果…", "Load more results" : "載入更多結果", diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index f2b5cf94d11..3ad0b54435d 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1541,6 +1541,7 @@ return array( 'OC\\UserStatus\\Manager' => $baseDir . '/lib/private/UserStatus/Manager.php', 'OC\\User\\Backend' => $baseDir . '/lib/private/User/Backend.php', 'OC\\User\\Database' => $baseDir . '/lib/private/User/Database.php', + 'OC\\User\\DisplayNameCache' => $baseDir . '/lib/private/User/DisplayNameCache.php', 'OC\\User\\LoginException' => $baseDir . '/lib/private/User/LoginException.php', 'OC\\User\\Manager' => $baseDir . '/lib/private/User/Manager.php', 'OC\\User\\NoUserException' => $baseDir . '/lib/private/User/NoUserException.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 0f3c0a175af..9e04858cc53 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1570,6 +1570,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OC\\UserStatus\\Manager' => __DIR__ . '/../../..' . '/lib/private/UserStatus/Manager.php', 'OC\\User\\Backend' => __DIR__ . '/../../..' . '/lib/private/User/Backend.php', 'OC\\User\\Database' => __DIR__ . '/../../..' . '/lib/private/User/Database.php', + 'OC\\User\\DisplayNameCache' => __DIR__ . '/../../..' . '/lib/private/User/DisplayNameCache.php', 'OC\\User\\LoginException' => __DIR__ . '/../../..' . '/lib/private/User/LoginException.php', 'OC\\User\\Manager' => __DIR__ . '/../../..' . '/lib/private/User/Manager.php', 'OC\\User\\NoUserException' => __DIR__ . '/../../..' . '/lib/private/User/NoUserException.php', diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js index 383187ab188..1e8c7a4d62f 100644 --- a/lib/l10n/eu.js +++ b/lib/l10n/eu.js @@ -2,6 +2,7 @@ OC.L10N.register( "lib", { "Cannot write into \"config\" directory!" : "Ezin da idatzi \"config\" karpetan!", + "This can usually be fixed by giving the web server write access to the config directory." : "Hau normalean konpon daiteke web zerbitzariari konfigurazio direktoriorako idazteko sarbidea emanez.", "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Edo, config.php fitxategia irakurtzeko soilik mantendu nahi baduzu, ezarri \"config_is_read_only\" aukera 'egia' baliora barruan.", "See %s" : "Ikusi %s", "The files of the app %1$s were not replaced correctly. Make sure it is a version compatible with the server." : "%1$s aplikazioaren fitxategiak ez dira behar bezala ordezkatu. Ziurtatu zerbitzariarekin bateragarria den bertsioa dela.", @@ -212,15 +213,22 @@ OC.L10N.register( "Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.", "No database drivers (sqlite, mysql, or postgresql) installed." : "Ez dago datubaseen (sqlite, mysql edo postgresql) driverrik instalatuta.", "Cannot write into \"config\" directory." : "Ezin da \"config\" karpetan idatzi.", + "This can usually be fixed by giving the web server write access to the config directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari konfigurazio direktoriorako sarbidea emanez. Ikus %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" : "Edo, config.php fitxategia irakurtzeko soilik mantendu nahi baduzu, ezarri \"config_is_read_only\" aukera 'egia' baliora barruan. Ikusi %s", "Cannot write into \"apps\" directory." : "Ezin da idatzi \"apps\" fitxategian.", + "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Hau normalean konpondu daiteke web zerbitzariari aplikazioen direktorioko sarbidea emanez edo konfigurazioko fitxategian App Store desgaituz.", "Cannot create \"data\" directory." : "Ezin da \"data\" fitxategia sortu.", + "This can usually be fixed by giving the web server write access to the root directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari root direktorioko idazketa sarbidea emanez. Ikus %s", + "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : " 99% match \nNormalean baimenak konpondu daitezke web zerbitzariari root direktorioko sarbidea emanez. Ikus%s.", "Your data directory is not writable." : "Zure datuen karpeta ez da idazgarria.", "Setting locale to %s failed." : "Lokala %sra ezartzeak huts egin du", + "Please install one of these locales on your system and restart your web server." : "Mesedez, instalatu lokal hauetako bat zure sisteman eta berrabiarazi zure web zerbitzaria.", "PHP module %s not installed." : "PHPren %s modulua ez dago instalaturik.", "Please ask your server administrator to install the module." : "Mesedez eskatu zure zerbitzariaren kudeatzaileari modulua instala dezan.", "PHP setting \"%s\" is not set to \"%s\"." : "\"%s\" PHP ezarpena ez dago \"%s\" gisa jarrita.", "Adjusting this setting in php.ini will make Nextcloud run again" : "Ezarpen hau php.ini fitxategian doitzen bada, Nextcloud berriro exekutatuko da", + "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code><code>%s</code>-en ezartzen da espero den <code>0</code> balioaren ordez.", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "Arazo hau konpontzeko, ezarri<code>mbstring.func_overload</code> <code>0</code>-n zure php.ini-n.", "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 bertsioa edo berriagoa behar da. Orain %s dago instalatuta.", "To fix this issue update your libxml2 version and restart your web server." : "Arazo hori konpontzeko, eguneratu zure libxml2 bertsioa eta berrabiarazi web zerbitzaria.", "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP lerro bakarreko blokeak mozteko konfiguratua dagoela dirudi. Oinarrizko app batzuk eskuraezin bihurtuko dira.", @@ -232,6 +240,7 @@ OC.L10N.register( "Your data directory is readable by other users." : "Zure datuen karpeta beste erabiltzaileek irakur dezakete.", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Mesedez aldatu baimenak 0770ra beste erabiltzaileek karpetan sartu ezin izateko.", "Your data directory must be an absolute path." : "Zure datuen karpeta bide-izen absolutua izan behar da.", + "Check the value of \"datadirectory\" in your configuration." : "Egiaztatu \"datadirectory\"-ren balioa zure konfigurazioan.", "Your data directory is invalid." : "Zure datuen karpeta baliogabea da.", "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Ziurtatu datu direktorioaren erroan \".ocdata\" izeneko fitxategia dagoela.", "Action \"%s\" not supported or implemented." : "\"%s\" ekintza ez da onartzen edo ez dago inplementaturik.", diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json index acd8d32e6e4..1329b284d1a 100644 --- a/lib/l10n/eu.json +++ b/lib/l10n/eu.json @@ -1,5 +1,6 @@ { "translations": { "Cannot write into \"config\" directory!" : "Ezin da idatzi \"config\" karpetan!", + "This can usually be fixed by giving the web server write access to the config directory." : "Hau normalean konpon daiteke web zerbitzariari konfigurazio direktoriorako idazteko sarbidea emanez.", "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Edo, config.php fitxategia irakurtzeko soilik mantendu nahi baduzu, ezarri \"config_is_read_only\" aukera 'egia' baliora barruan.", "See %s" : "Ikusi %s", "The files of the app %1$s were not replaced correctly. Make sure it is a version compatible with the server." : "%1$s aplikazioaren fitxategiak ez dira behar bezala ordezkatu. Ziurtatu zerbitzariarekin bateragarria den bertsioa dela.", @@ -210,15 +211,22 @@ "Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.", "No database drivers (sqlite, mysql, or postgresql) installed." : "Ez dago datubaseen (sqlite, mysql edo postgresql) driverrik instalatuta.", "Cannot write into \"config\" directory." : "Ezin da \"config\" karpetan idatzi.", + "This can usually be fixed by giving the web server write access to the config directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari konfigurazio direktoriorako sarbidea emanez. Ikus %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" : "Edo, config.php fitxategia irakurtzeko soilik mantendu nahi baduzu, ezarri \"config_is_read_only\" aukera 'egia' baliora barruan. Ikusi %s", "Cannot write into \"apps\" directory." : "Ezin da idatzi \"apps\" fitxategian.", + "This can usually be fixed by giving the web server write access to the apps directory or disabling the App Store in the config file." : "Hau normalean konpondu daiteke web zerbitzariari aplikazioen direktorioko sarbidea emanez edo konfigurazioko fitxategian App Store desgaituz.", "Cannot create \"data\" directory." : "Ezin da \"data\" fitxategia sortu.", + "This can usually be fixed by giving the web server write access to the root directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari root direktorioko idazketa sarbidea emanez. Ikus %s", + "Permissions can usually be fixed by giving the web server write access to the root directory. See %s." : " 99% match \nNormalean baimenak konpondu daitezke web zerbitzariari root direktorioko sarbidea emanez. Ikus%s.", "Your data directory is not writable." : "Zure datuen karpeta ez da idazgarria.", "Setting locale to %s failed." : "Lokala %sra ezartzeak huts egin du", + "Please install one of these locales on your system and restart your web server." : "Mesedez, instalatu lokal hauetako bat zure sisteman eta berrabiarazi zure web zerbitzaria.", "PHP module %s not installed." : "PHPren %s modulua ez dago instalaturik.", "Please ask your server administrator to install the module." : "Mesedez eskatu zure zerbitzariaren kudeatzaileari modulua instala dezan.", "PHP setting \"%s\" is not set to \"%s\"." : "\"%s\" PHP ezarpena ez dago \"%s\" gisa jarrita.", "Adjusting this setting in php.ini will make Nextcloud run again" : "Ezarpen hau php.ini fitxategian doitzen bada, Nextcloud berriro exekutatuko da", + "<code>mbstring.func_overload</code> is set to <code>%s</code> instead of the expected value <code>0</code>." : "<code>mbstring.func_overload</code><code>%s</code>-en ezartzen da espero den <code>0</code> balioaren ordez.", + "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini." : "Arazo hau konpontzeko, ezarri<code>mbstring.func_overload</code> <code>0</code>-n zure php.ini-n.", "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 bertsioa edo berriagoa behar da. Orain %s dago instalatuta.", "To fix this issue update your libxml2 version and restart your web server." : "Arazo hori konpontzeko, eguneratu zure libxml2 bertsioa eta berrabiarazi web zerbitzaria.", "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP lerro bakarreko blokeak mozteko konfiguratua dagoela dirudi. Oinarrizko app batzuk eskuraezin bihurtuko dira.", @@ -230,6 +238,7 @@ "Your data directory is readable by other users." : "Zure datuen karpeta beste erabiltzaileek irakur dezakete.", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Mesedez aldatu baimenak 0770ra beste erabiltzaileek karpetan sartu ezin izateko.", "Your data directory must be an absolute path." : "Zure datuen karpeta bide-izen absolutua izan behar da.", + "Check the value of \"datadirectory\" in your configuration." : "Egiaztatu \"datadirectory\"-ren balioa zure konfigurazioan.", "Your data directory is invalid." : "Zure datuen karpeta baliogabea da.", "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Ziurtatu datu direktorioaren erroan \".ocdata\" izeneko fitxategia dagoela.", "Action \"%s\" not supported or implemented." : "\"%s\" ekintza ez da onartzen edo ez dago inplementaturik.", diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php index 36eb0bbf6d9..e5a6e6a5acd 100644 --- a/lib/private/AllConfig.php +++ b/lib/private/AllConfig.php @@ -497,6 +497,8 @@ class AllConfig implements \OCP\IConfig { $sql .= 'AND `configvalue` = ?'; } + $sql .= ' ORDER BY `userid`'; + $result = $this->connection->executeQuery($sql, [$appName, $key, $value]); $userIDs = []; @@ -534,6 +536,8 @@ class AllConfig implements \OCP\IConfig { $sql .= 'AND LOWER(`configvalue`) = ?'; } + $sql .= ' ORDER BY `userid`'; + $result = $this->connection->executeQuery($sql, [$appName, $key, strtolower($value)]); $userIDs = []; diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index e0575ea92a5..f1799798ccb 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -81,6 +81,7 @@ class SetupManager { private LoggerInterface $logger; private IConfig $config; private bool $listeningForProviders; + private array $fullSetupRequired = []; public function __construct( IEventLogger $eventLogger, @@ -268,6 +269,7 @@ class SetupManager { $cacheDuration = $this->config->getSystemValueInt('fs_mount_cache_duration', 5 * 60); if ($cacheDuration > 0) { $this->cache->set($user->getUID(), true, $cacheDuration); + $this->fullSetupRequired[$user->getUID()] = false; } } @@ -434,7 +436,10 @@ class SetupManager { // we perform a "cached" setup only after having done the full setup recently // this is also used to trigger a full setup after handling events that are likely // to change the available mounts - return !$this->cache->get($user->getUID()); + if (!isset($this->fullSetupRequired[$user->getUID()])) { + $this->fullSetupRequired[$user->getUID()] = !$this->cache->get($user->getUID()); + } + return $this->fullSetupRequired[$user->getUID()]; } /** @@ -489,6 +494,7 @@ class SetupManager { $this->setupUsers = []; $this->setupUsersComplete = []; $this->setupUserMountProviders = []; + $this->fullSetupRequired = []; $this->rootSetup = false; $this->mountManager->clear(); $this->eventDispatcher->dispatchTyped(new FilesystemTornDownEvent()); diff --git a/lib/private/User/DisplayNameCache.php b/lib/private/User/DisplayNameCache.php new file mode 100644 index 00000000000..ed0c723ef37 --- /dev/null +++ b/lib/private/User/DisplayNameCache.php @@ -0,0 +1,77 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright 2022 Carl Schwan <carl@carlschwan.eu> + * @license AGPL-3.0-or-later + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ + + +namespace OC\User; + +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\ICache; +use OCP\ICacheFactory; +use OCP\IUserManager; +use OCP\User\Events\UserChangedEvent; + +/** + * Class that cache the relation UserId -> Display name + * + * This saves fetching the user from a user backend and later on fetching + * their preferences. It's generally not an issue if this data is slightly + * outdated. + */ +class DisplayNameCache implements IEventListener { + private ICache $internalCache; + private IUserManager $userManager; + + public function __construct(ICacheFactory $cacheFactory, IUserManager $userManager) { + $this->internalCache = $cacheFactory->createDistributed('displayNameMappingCache'); + $this->userManager = $userManager; + } + + public function getDisplayName(string $userId) { + $displayName = $this->internalCache->get($userId); + if ($displayName) { + return $displayName; + } + + $user = $this->userManager->get($userId); + if ($user) { + $displayName = $user->getDisplayName(); + } else { + $displayName = $userId; + } + $this->internalCache->set($userId, $displayName, 60 * 10); // 10 minutes + + return $displayName; + } + + public function clear(): void { + $this->internalCache->clear(); + } + + public function handle(Event $event): void { + if ($event instanceof UserChangedEvent && $event->getFeature() === 'displayName') { + $userId = $event->getUser()->getUID(); + $newDisplayName = $event->getValue(); + $this->internalCache->set($userId, $newDisplayName, 60 * 10); // 10 minutes + } + } +} diff --git a/lib/private/legacy/OC_Helper.php b/lib/private/legacy/OC_Helper.php index 547ffef8607..68fb4311ef8 100644 --- a/lib/private/legacy/OC_Helper.php +++ b/lib/private/legacy/OC_Helper.php @@ -44,7 +44,9 @@ * */ use bantu\IniGetWrapper\IniGetWrapper; +use OC\Files\Filesystem; use OCP\Files\Mount\IMountPoint; +use OCP\ICacheFactory; use OCP\IUser; use Symfony\Component\Process\ExecutableFinder; @@ -486,9 +488,20 @@ class OC_Helper { * @throws \OCP\Files\NotFoundException */ public static function getStorageInfo($path, $rootInfo = null, $includeMountPoints = true) { + /** @var ICacheFactory $cacheFactory */ + $cacheFactory = \OC::$server->get(ICacheFactory::class); + $memcache = $cacheFactory->createLocal('storage_info'); + // return storage info without adding mount points $includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false); + $fullPath = Filesystem::getView()->getAbsolutePath($path); + $cacheKey = $fullPath. '::' . ($includeMountPoints ? 'include' : 'exclude'); + $cached = $memcache->get($cacheKey); + if ($cached) { + return $cached; + } + if (!$rootInfo) { $rootInfo = \OC\Files\Filesystem::getFileInfo($path, $includeExtStorage ? 'ext' : false); } @@ -559,7 +572,7 @@ class OC_Helper { [,,,$mountPoint] = explode('/', $mount->getMountPoint(), 4); } - return [ + $info = [ 'free' => $free, 'used' => $used, 'quota' => $quota, @@ -570,6 +583,10 @@ class OC_Helper { 'mountType' => $mount->getMountType(), 'mountPoint' => trim($mountPoint, '/'), ]; + + $memcache->set($cacheKey, $info, 5 * 60); + + return $info; } /** |