diff options
Diffstat (limited to 'apps/profile')
127 files changed, 3365 insertions, 0 deletions
diff --git a/apps/profile/.noopenapi b/apps/profile/.noopenapi new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/apps/profile/.noopenapi diff --git a/apps/profile/appinfo/info.xml b/apps/profile/appinfo/info.xml new file mode 100644 index 00000000000..d9bbea6d878 --- /dev/null +++ b/apps/profile/appinfo/info.xml @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!-- + - SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> +<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> + <id>profile</id> + <name>Profile</name> + <summary>This application provides the profile</summary> + <description>Provides a customisable user profile interface.</description> + <version>1.1.0</version> + <licence>agpl</licence> + <author>Nextcloud GmbH</author> + <namespace>Profile</namespace> + <category>social</category> + <bugs>https://github.com/nextcloud/server/issues</bugs> + <dependencies> + <nextcloud min-version="32" max-version="32"/> + </dependencies> +</info> diff --git a/apps/profile/composer/autoload.php b/apps/profile/composer/autoload.php new file mode 100644 index 00000000000..8fc3e68f25f --- /dev/null +++ b/apps/profile/composer/autoload.php @@ -0,0 +1,25 @@ +<?php + +// autoload.php @generated by Composer + +if (PHP_VERSION_ID < 50600) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); +} + +require_once __DIR__ . '/composer/autoload_real.php'; + +return ComposerAutoloaderInitProfile::getLoader(); diff --git a/apps/profile/composer/composer.json b/apps/profile/composer/composer.json new file mode 100644 index 00000000000..1e09baee734 --- /dev/null +++ b/apps/profile/composer/composer.json @@ -0,0 +1,13 @@ +{ + "config" : { + "vendor-dir": ".", + "optimize-autoloader": true, + "classmap-authoritative": true, + "autoloader-suffix": "Profile" + }, + "autoload" : { + "psr-4": { + "OCA\\Profile\\": "../lib/" + } + } +} diff --git a/apps/profile/composer/composer.lock b/apps/profile/composer/composer.lock new file mode 100644 index 00000000000..fd0bcbcb753 --- /dev/null +++ b/apps/profile/composer/composer.lock @@ -0,0 +1,18 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "d751713988987e9331980363e24189ce", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.1.0" +} diff --git a/apps/profile/composer/composer/ClassLoader.php b/apps/profile/composer/composer/ClassLoader.php new file mode 100644 index 00000000000..7824d8f7eaf --- /dev/null +++ b/apps/profile/composer/composer/ClassLoader.php @@ -0,0 +1,579 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier <fabien@symfony.com> + * @author Jordi Boggiano <j.boggiano@seld.be> + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array<string, array<string, int>> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array<string, list<string>> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list<string> + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array<string, array<string, list<string>>> + */ + private $prefixesPsr0 = array(); + /** + * @var list<string> + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array<string, string> + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array<string, bool> + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array<string, self> + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array<string, list<string>> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array<string, list<string>> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list<string> + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list<string> + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array<string, string> Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array<string, string> $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list<string>|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list<string>|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array<string, self> + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/apps/profile/composer/composer/InstalledVersions.php b/apps/profile/composer/composer/InstalledVersions.php new file mode 100644 index 00000000000..51e734a774b --- /dev/null +++ b/apps/profile/composer/composer/InstalledVersions.php @@ -0,0 +1,359 @@ +<?php + +/* + * This file is part of Composer. + * + * (c) Nils Adermann <naderman@naderman.de> + * Jordi Boggiano <j.boggiano@seld.be> + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list<string> + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/apps/profile/composer/composer/LICENSE b/apps/profile/composer/composer/LICENSE new file mode 100644 index 00000000000..f27399a042d --- /dev/null +++ b/apps/profile/composer/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/apps/profile/composer/composer/autoload_classmap.php b/apps/profile/composer/composer/autoload_classmap.php new file mode 100644 index 00000000000..1f4149e7210 --- /dev/null +++ b/apps/profile/composer/composer/autoload_classmap.php @@ -0,0 +1,11 @@ +<?php + +// autoload_classmap.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'OCA\\Profile\\Controller\\ProfilePageController' => $baseDir . '/../lib/Controller/ProfilePageController.php', +); diff --git a/apps/profile/composer/composer/autoload_namespaces.php b/apps/profile/composer/composer/autoload_namespaces.php new file mode 100644 index 00000000000..3f5c9296251 --- /dev/null +++ b/apps/profile/composer/composer/autoload_namespaces.php @@ -0,0 +1,9 @@ +<?php + +// autoload_namespaces.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( +); diff --git a/apps/profile/composer/composer/autoload_psr4.php b/apps/profile/composer/composer/autoload_psr4.php new file mode 100644 index 00000000000..2417bba1809 --- /dev/null +++ b/apps/profile/composer/composer/autoload_psr4.php @@ -0,0 +1,10 @@ +<?php + +// autoload_psr4.php @generated by Composer + +$vendorDir = dirname(__DIR__); +$baseDir = $vendorDir; + +return array( + 'OCA\\Profile\\' => array($baseDir . '/../lib'), +); diff --git a/apps/profile/composer/composer/autoload_real.php b/apps/profile/composer/composer/autoload_real.php new file mode 100644 index 00000000000..5610a6a6702 --- /dev/null +++ b/apps/profile/composer/composer/autoload_real.php @@ -0,0 +1,37 @@ +<?php + +// autoload_real.php @generated by Composer + +class ComposerAutoloaderInitProfile +{ + private static $loader; + + public static function loadClassLoader($class) + { + if ('Composer\Autoload\ClassLoader' === $class) { + require __DIR__ . '/ClassLoader.php'; + } + } + + /** + * @return \Composer\Autoload\ClassLoader + */ + public static function getLoader() + { + if (null !== self::$loader) { + return self::$loader; + } + + spl_autoload_register(array('ComposerAutoloaderInitProfile', 'loadClassLoader'), true, true); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); + spl_autoload_unregister(array('ComposerAutoloaderInitProfile', 'loadClassLoader')); + + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInitProfile::getInitializer($loader)); + + $loader->setClassMapAuthoritative(true); + $loader->register(true); + + return $loader; + } +} diff --git a/apps/profile/composer/composer/autoload_static.php b/apps/profile/composer/composer/autoload_static.php new file mode 100644 index 00000000000..b7cc44a825e --- /dev/null +++ b/apps/profile/composer/composer/autoload_static.php @@ -0,0 +1,37 @@ +<?php + +// autoload_static.php @generated by Composer + +namespace Composer\Autoload; + +class ComposerStaticInitProfile +{ + public static $prefixLengthsPsr4 = array ( + 'O' => + array ( + 'OCA\\Profile\\' => 12, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'OCA\\Profile\\' => + array ( + 0 => __DIR__ . '/..' . '/../lib', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'OCA\\Profile\\Controller\\ProfilePageController' => __DIR__ . '/..' . '/../lib/Controller/ProfilePageController.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitProfile::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitProfile::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitProfile::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/apps/profile/composer/composer/installed.json b/apps/profile/composer/composer/installed.json new file mode 100644 index 00000000000..f20a6c47c6d --- /dev/null +++ b/apps/profile/composer/composer/installed.json @@ -0,0 +1,5 @@ +{ + "packages": [], + "dev": false, + "dev-package-names": [] +} diff --git a/apps/profile/composer/composer/installed.php b/apps/profile/composer/composer/installed.php new file mode 100644 index 00000000000..b1f92945b0a --- /dev/null +++ b/apps/profile/composer/composer/installed.php @@ -0,0 +1,23 @@ +<?php return array( + 'root' => array( + 'name' => '__root__', + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'a489d88a2b2203cffdd08f4a5f1ae03a497bc52f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'dev' => false, + ), + 'versions' => array( + '__root__' => array( + 'pretty_version' => 'dev-master', + 'version' => 'dev-master', + 'reference' => 'a489d88a2b2203cffdd08f4a5f1ae03a497bc52f', + 'type' => 'library', + 'install_path' => __DIR__ . '/../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/apps/profile/l10n/.gitkeep b/apps/profile/l10n/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/apps/profile/l10n/.gitkeep diff --git a/apps/profile/l10n/ar.js b/apps/profile/l10n/ar.js new file mode 100644 index 00000000000..b06d7c12973 --- /dev/null +++ b/apps/profile/l10n/ar.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "لمحة تعريفية", + "This application provides the profile" : "هذا التطبيق يوفر اللمحة التعريفية", + "Provides a customisable user profile interface." : "يُوفِّر واجهة مخصصة للمحة التعريفية عن المستخدِم", + "You have not added any info yet" : "لم تقم بإضافة أي معلومات حتى الآن", + "{user} has not added any info yet" : "لم يقم المستخدم {user} بإضافة أي معلومات بعد", + "Error opening the user status modal, try hard refreshing the page" : "خطأ في فتح حالة المستخدم ، حاول تحديث الصفحة", + "Edit Profile" : "تعديل الملف الشخصي", + "The headline and about sections will show up here" : "سيظهر هنا العنوان والأقسام الخاصة بالملف الشخصي", + "Profile not found" : "ملف المستخدم غير موجود", + "The profile does not exist." : "الملف الشخصي غير موجود.", + "Back to %s" : "عودة إلى %s" +}, +"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); diff --git a/apps/profile/l10n/ar.json b/apps/profile/l10n/ar.json new file mode 100644 index 00000000000..d972a96ecc9 --- /dev/null +++ b/apps/profile/l10n/ar.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "لمحة تعريفية", + "This application provides the profile" : "هذا التطبيق يوفر اللمحة التعريفية", + "Provides a customisable user profile interface." : "يُوفِّر واجهة مخصصة للمحة التعريفية عن المستخدِم", + "You have not added any info yet" : "لم تقم بإضافة أي معلومات حتى الآن", + "{user} has not added any info yet" : "لم يقم المستخدم {user} بإضافة أي معلومات بعد", + "Error opening the user status modal, try hard refreshing the page" : "خطأ في فتح حالة المستخدم ، حاول تحديث الصفحة", + "Edit Profile" : "تعديل الملف الشخصي", + "The headline and about sections will show up here" : "سيظهر هنا العنوان والأقسام الخاصة بالملف الشخصي", + "Profile not found" : "ملف المستخدم غير موجود", + "The profile does not exist." : "الملف الشخصي غير موجود.", + "Back to %s" : "عودة إلى %s" +},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ast.js b/apps/profile/l10n/ast.js new file mode 100644 index 00000000000..87df5f41a56 --- /dev/null +++ b/apps/profile/l10n/ast.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "You have not added any info yet" : "Nun amestesti nenguna información", + "{user} has not added any info yet" : "{user} nun amestó nenguna información", + "Error opening the user status modal, try hard refreshing the page" : "Hebo un error al abrir el diálogu modal del estáu d'usuariu, prueba a anovar la páxina", + "Edit Profile" : "Editar el perfil", + "The headline and about sections will show up here" : "Equí apaecen la testera y les seiciones d'información", + "Profile not found" : "Nun s'atopó'l perfil", + "The profile does not exist." : "El perfil nun esiste.", + "Back to %s" : "Volver a «%s»" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/ast.json b/apps/profile/l10n/ast.json new file mode 100644 index 00000000000..d75d9b9ca25 --- /dev/null +++ b/apps/profile/l10n/ast.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Perfil", + "You have not added any info yet" : "Nun amestesti nenguna información", + "{user} has not added any info yet" : "{user} nun amestó nenguna información", + "Error opening the user status modal, try hard refreshing the page" : "Hebo un error al abrir el diálogu modal del estáu d'usuariu, prueba a anovar la páxina", + "Edit Profile" : "Editar el perfil", + "The headline and about sections will show up here" : "Equí apaecen la testera y les seiciones d'información", + "Profile not found" : "Nun s'atopó'l perfil", + "The profile does not exist." : "El perfil nun esiste.", + "Back to %s" : "Volver a «%s»" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/be.js b/apps/profile/l10n/be.js new file mode 100644 index 00000000000..40762e2b51c --- /dev/null +++ b/apps/profile/l10n/be.js @@ -0,0 +1,12 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профіль", + "You have not added any info yet" : "Вы пакуль не дадалі ніякай інфармацыі", + "{user} has not added any info yet" : "{user} пакуль не дадаў(-ла) ніякай інфармацыі", + "Edit Profile" : "Рэдагаваць профіль", + "Profile not found" : "Профіль не знойдзены", + "The profile does not exist." : "Профіль не існуе.", + "Back to %s" : "Назад да %s" +}, +"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/profile/l10n/be.json b/apps/profile/l10n/be.json new file mode 100644 index 00000000000..16101d03b70 --- /dev/null +++ b/apps/profile/l10n/be.json @@ -0,0 +1,10 @@ +{ "translations": { + "Profile" : "Профіль", + "You have not added any info yet" : "Вы пакуль не дадалі ніякай інфармацыі", + "{user} has not added any info yet" : "{user} пакуль не дадаў(-ла) ніякай інфармацыі", + "Edit Profile" : "Рэдагаваць профіль", + "Profile not found" : "Профіль не знойдзены", + "The profile does not exist." : "Профіль не існуе.", + "Back to %s" : "Назад да %s" +},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/bg.js b/apps/profile/l10n/bg.js new file mode 100644 index 00000000000..34df662bf57 --- /dev/null +++ b/apps/profile/l10n/bg.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профил", + "You have not added any info yet" : "Все още не сте добавили никаква информация", + "{user} has not added any info yet" : "{user} все още не е добавил никаква информация", + "Error opening the user status modal, try hard refreshing the page" : "Грешка при отваряне на модалния статус на потребителя, опитайте настоятелно да опресните страницата", + "Edit Profile" : "Редактиране на профил", + "The headline and about sections will show up here" : "Заглавието и секцията за информация ще се покажат тук", + "Profile not found" : "Профилът не е намерен", + "The profile does not exist." : "Профилът не съществува.", + "Back to %s" : "Обратно към %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/bg.json b/apps/profile/l10n/bg.json new file mode 100644 index 00000000000..0070da701d0 --- /dev/null +++ b/apps/profile/l10n/bg.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Профил", + "You have not added any info yet" : "Все още не сте добавили никаква информация", + "{user} has not added any info yet" : "{user} все още не е добавил никаква информация", + "Error opening the user status modal, try hard refreshing the page" : "Грешка при отваряне на модалния статус на потребителя, опитайте настоятелно да опресните страницата", + "Edit Profile" : "Редактиране на профил", + "The headline and about sections will show up here" : "Заглавието и секцията за информация ще се покажат тук", + "Profile not found" : "Профилът не е намерен", + "The profile does not exist." : "Профилът не съществува.", + "Back to %s" : "Обратно към %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ca.js b/apps/profile/l10n/ca.js new file mode 100644 index 00000000000..1e514409905 --- /dev/null +++ b/apps/profile/l10n/ca.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "Encara no heu afegit cap informació", + "{user} has not added any info yet" : "{user} encara no ha afegit cap informació", + "Error opening the user status modal, try hard refreshing the page" : "S'ha produït un error en obrir el quadre de diàleg modal d'estat de l'usuari, proveu d'actualitzar la pàgina", + "Edit Profile" : "Edita el perfil", + "The headline and about sections will show up here" : "La capçalera i les seccions d'informació es mostraran aquí", + "Profile not found" : "No s'ha trobat el perfil", + "The profile does not exist." : "El perfil no existeix.", + "Back to %s" : "Torna a %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/ca.json b/apps/profile/l10n/ca.json new file mode 100644 index 00000000000..5e4f8e909fd --- /dev/null +++ b/apps/profile/l10n/ca.json @@ -0,0 +1,11 @@ +{ "translations": { + "You have not added any info yet" : "Encara no heu afegit cap informació", + "{user} has not added any info yet" : "{user} encara no ha afegit cap informació", + "Error opening the user status modal, try hard refreshing the page" : "S'ha produït un error en obrir el quadre de diàleg modal d'estat de l'usuari, proveu d'actualitzar la pàgina", + "Edit Profile" : "Edita el perfil", + "The headline and about sections will show up here" : "La capçalera i les seccions d'informació es mostraran aquí", + "Profile not found" : "No s'ha trobat el perfil", + "The profile does not exist." : "El perfil no existeix.", + "Back to %s" : "Torna a %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/cs.js b/apps/profile/l10n/cs.js new file mode 100644 index 00000000000..e7d09437a7d --- /dev/null +++ b/apps/profile/l10n/cs.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Tato aplikace poskytuje profil", + "Provides a customisable user profile interface." : "Poskytuje přizpůsobitelné rozhraní uživatelského profilu.", + "You have not added any info yet" : "Zatím jste nezadali žádné informace", + "{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", + "Edit Profile" : "Upravit profil", + "The headline and about sections will show up here" : "Nadpis a sekce o uživatelích se zobrazí zde", + "Profile not found" : "Profil nenalezen", + "The profile does not exist." : "Profil neexistuje.", + "Back to %s" : "Zpět na %s" +}, +"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"); diff --git a/apps/profile/l10n/cs.json b/apps/profile/l10n/cs.json new file mode 100644 index 00000000000..871fcc1b823 --- /dev/null +++ b/apps/profile/l10n/cs.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Tato aplikace poskytuje profil", + "Provides a customisable user profile interface." : "Poskytuje přizpůsobitelné rozhraní uživatelského profilu.", + "You have not added any info yet" : "Zatím jste nezadali žádné informace", + "{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", + "Edit Profile" : "Upravit profil", + "The headline and about sections will show up here" : "Nadpis a sekce o uživatelích se zobrazí zde", + "Profile not found" : "Profil nenalezen", + "The profile does not exist." : "Profil neexistuje.", + "Back to %s" : "Zpět na %s" +},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/da.js b/apps/profile/l10n/da.js new file mode 100644 index 00000000000..cb3ddebb4d2 --- /dev/null +++ b/apps/profile/l10n/da.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Denne applikation leverer profilen", + "Provides a customisable user profile interface." : "Leverer en brugerdefinerbar brugerprofil grænseflade.", + "You have not added any info yet" : "Du har ikke tilføjet nogen information endnu", + "{user} has not added any info yet" : "{user} har ikke tilføjet nogen oplysninger endnu", + "Error opening the user status modal, try hard refreshing the page" : "Fejl ved åbning af brugerstatusmodal. Prøv at opdatere siden", + "Edit Profile" : "Rediger profil", + "The headline and about sections will show up here" : "Overskriften og om sektionerne vises her", + "Profile not found" : "Profil ikke fundet", + "The profile does not exist." : "Profilen eksisterer ikke.", + "Back to %s" : "Tilbage til %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/da.json b/apps/profile/l10n/da.json new file mode 100644 index 00000000000..910027ae8a1 --- /dev/null +++ b/apps/profile/l10n/da.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Denne applikation leverer profilen", + "Provides a customisable user profile interface." : "Leverer en brugerdefinerbar brugerprofil grænseflade.", + "You have not added any info yet" : "Du har ikke tilføjet nogen information endnu", + "{user} has not added any info yet" : "{user} har ikke tilføjet nogen oplysninger endnu", + "Error opening the user status modal, try hard refreshing the page" : "Fejl ved åbning af brugerstatusmodal. Prøv at opdatere siden", + "Edit Profile" : "Rediger profil", + "The headline and about sections will show up here" : "Overskriften og om sektionerne vises her", + "Profile not found" : "Profil ikke fundet", + "The profile does not exist." : "Profilen eksisterer ikke.", + "Back to %s" : "Tilbage til %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/de.js b/apps/profile/l10n/de.js new file mode 100644 index 00000000000..e32888ef029 --- /dev/null +++ b/apps/profile/l10n/de.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Diese Anwendung liefert das Profil", + "Provides a customisable user profile interface." : "Bietet eine anpassbare Benutzerprofilschnittstelle.", + "You have not added any info yet" : "Du hast noch keine Infos hinzugefügt", + "{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, versuche die Seite zu aktualisieren", + "Edit Profile" : "Profil bearbeiten", + "The headline and about sections will show up here" : "Die Überschrift und der Infobereich werden hier angezeigt", + "Profile not found" : "Profil nicht gefunden", + "The profile does not exist." : "Das Profil existiert nicht", + "Back to %s" : "Zurück zu %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/de.json b/apps/profile/l10n/de.json new file mode 100644 index 00000000000..ea90e511a85 --- /dev/null +++ b/apps/profile/l10n/de.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Diese Anwendung liefert das Profil", + "Provides a customisable user profile interface." : "Bietet eine anpassbare Benutzerprofilschnittstelle.", + "You have not added any info yet" : "Du hast noch keine Infos hinzugefügt", + "{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, versuche die Seite zu aktualisieren", + "Edit Profile" : "Profil bearbeiten", + "The headline and about sections will show up here" : "Die Überschrift und der Infobereich werden hier angezeigt", + "Profile not found" : "Profil nicht gefunden", + "The profile does not exist." : "Das Profil existiert nicht", + "Back to %s" : "Zurück zu %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/de_DE.js b/apps/profile/l10n/de_DE.js new file mode 100644 index 00000000000..535b9a32d57 --- /dev/null +++ b/apps/profile/l10n/de_DE.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Diese Anwendung liefert das Profil", + "Provides a customisable user profile interface." : "Bietet eine anpassbare Benutzerprofilschnittstelle.", + "You have not added any info yet" : "Sie haben noch keine Infos hinzugefügt", + "{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", + "Edit Profile" : "Profil bearbeiten", + "The headline and about sections will show up here" : "Die Überschrift und der Infobereich werden hier angezeigt", + "Profile not found" : "Profil nicht gefunden", + "The profile does not exist." : "Das Profil existiert nicht.", + "Back to %s" : "Zurück zu %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/de_DE.json b/apps/profile/l10n/de_DE.json new file mode 100644 index 00000000000..d591c79d47f --- /dev/null +++ b/apps/profile/l10n/de_DE.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Diese Anwendung liefert das Profil", + "Provides a customisable user profile interface." : "Bietet eine anpassbare Benutzerprofilschnittstelle.", + "You have not added any info yet" : "Sie haben noch keine Infos hinzugefügt", + "{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", + "Edit Profile" : "Profil bearbeiten", + "The headline and about sections will show up here" : "Die Überschrift und der Infobereich werden hier angezeigt", + "Profile not found" : "Profil nicht gefunden", + "The profile does not exist." : "Das Profil existiert nicht.", + "Back to %s" : "Zurück zu %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/el.js b/apps/profile/l10n/el.js new file mode 100644 index 00000000000..f9ec98ee9c1 --- /dev/null +++ b/apps/profile/l10n/el.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "Δεν έχετε προσθέσει ακόμα πληροφορίες", + "{user} has not added any info yet" : "{user} δεν έχει προσθέσει ακόμη πληροφορίες", + "Error opening the user status modal, try hard refreshing the page" : "Σφάλμα κατά το άνοιγμα της κατάστασης χρήστη, δοκιμάστε να ανανεώσετε τη σελίδα", + "Edit Profile" : "Επεξεργασία προφίλ", + "The headline and about sections will show up here" : "Ο \"τίτλος\" και οι ενότητες \"σχετικά με\" θα εμφανιστούν εδώ", + "Profile not found" : "Το προφίλ δε βρέθηκε", + "The profile does not exist." : "Το προφίλ δεν υπάρχει.", + "Back to %s" : "Πίσω στο %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/el.json b/apps/profile/l10n/el.json new file mode 100644 index 00000000000..926d6d4c99e --- /dev/null +++ b/apps/profile/l10n/el.json @@ -0,0 +1,11 @@ +{ "translations": { + "You have not added any info yet" : "Δεν έχετε προσθέσει ακόμα πληροφορίες", + "{user} has not added any info yet" : "{user} δεν έχει προσθέσει ακόμη πληροφορίες", + "Error opening the user status modal, try hard refreshing the page" : "Σφάλμα κατά το άνοιγμα της κατάστασης χρήστη, δοκιμάστε να ανανεώσετε τη σελίδα", + "Edit Profile" : "Επεξεργασία προφίλ", + "The headline and about sections will show up here" : "Ο \"τίτλος\" και οι ενότητες \"σχετικά με\" θα εμφανιστούν εδώ", + "Profile not found" : "Το προφίλ δε βρέθηκε", + "The profile does not exist." : "Το προφίλ δεν υπάρχει.", + "Back to %s" : "Πίσω στο %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/en_GB.js b/apps/profile/l10n/en_GB.js new file mode 100644 index 00000000000..c531b85060d --- /dev/null +++ b/apps/profile/l10n/en_GB.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profile", + "This application provides the profile" : "This application provides the profile", + "Provides a customisable user profile interface." : "Provides a customisable user profile interface.", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "Edit Profile", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profile not found", + "The profile does not exist." : "The profile does not exist.", + "Back to %s" : "Back to %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/en_GB.json b/apps/profile/l10n/en_GB.json new file mode 100644 index 00000000000..34e76562548 --- /dev/null +++ b/apps/profile/l10n/en_GB.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profile", + "This application provides the profile" : "This application provides the profile", + "Provides a customisable user profile interface." : "Provides a customisable user profile interface.", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "Edit Profile", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profile not found", + "The profile does not exist." : "The profile does not exist.", + "Back to %s" : "Back to %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/es.js b/apps/profile/l10n/es.js new file mode 100644 index 00000000000..ba060b5ef54 --- /dev/null +++ b/apps/profile/l10n/es.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "This application provides the profile" : "Esta aplicación proporciona el perfil", + "Provides a customisable user profile interface." : "Proporciona una interfaz de perfil de usuario personalizable.", + "You have not added any info yet" : "Aún no has añadido nada de información", + "{user} has not added any info yet" : "{user} no ha añadido aún nada de información", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir la ventana de estado del usuario, intente actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El título y la sección acerca de aparecerán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/es.json b/apps/profile/l10n/es.json new file mode 100644 index 00000000000..5882db4498d --- /dev/null +++ b/apps/profile/l10n/es.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Perfil", + "This application provides the profile" : "Esta aplicación proporciona el perfil", + "Provides a customisable user profile interface." : "Proporciona una interfaz de perfil de usuario personalizable.", + "You have not added any info yet" : "Aún no has añadido nada de información", + "{user} has not added any info yet" : "{user} no ha añadido aún nada de información", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir la ventana de estado del usuario, intente actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El título y la sección acerca de aparecerán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/es_EC.js b/apps/profile/l10n/es_EC.js new file mode 100644 index 00000000000..681c2d11d7d --- /dev/null +++ b/apps/profile/l10n/es_EC.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "You have not added any info yet" : "No has agregado ninguna información todavía", + "{user} has not added any info yet" : "{user} no ha agregado ninguna información aún", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir el modal de estado del usuario, intenta actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El titular y la sección Acerca de se mostrarán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/es_EC.json b/apps/profile/l10n/es_EC.json new file mode 100644 index 00000000000..ad63e2f22cc --- /dev/null +++ b/apps/profile/l10n/es_EC.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Perfil", + "You have not added any info yet" : "No has agregado ninguna información todavía", + "{user} has not added any info yet" : "{user} no ha agregado ninguna información aún", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir el modal de estado del usuario, intenta actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El titular y la sección Acerca de se mostrarán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/es_MX.js b/apps/profile/l10n/es_MX.js new file mode 100644 index 00000000000..1adf2610b27 --- /dev/null +++ b/apps/profile/l10n/es_MX.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "You have not added any info yet" : "Aún no has añadido información", + "{user} has not added any info yet" : "{user} aún no añade información", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir la ventana de estado del usuario, intente actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El encabezado y la sección Acerca de aparecerán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/es_MX.json b/apps/profile/l10n/es_MX.json new file mode 100644 index 00000000000..b1d1e90eec3 --- /dev/null +++ b/apps/profile/l10n/es_MX.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Perfil", + "You have not added any info yet" : "Aún no has añadido información", + "{user} has not added any info yet" : "{user} aún no añade información", + "Error opening the user status modal, try hard refreshing the page" : "Error al abrir la ventana de estado del usuario, intente actualizar la página", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "El encabezado y la sección Acerca de aparecerán aquí", + "Profile not found" : "Perfil no encontrado", + "The profile does not exist." : "El perfil no existe.", + "Back to %s" : "Volver a %s" +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/et_EE.js b/apps/profile/l10n/et_EE.js new file mode 100644 index 00000000000..f716328096d --- /dev/null +++ b/apps/profile/l10n/et_EE.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profiil", + "This application provides the profile" : "See rakendus tagab profiili olemasolu", + "Provides a customisable user profile interface." : "Tagab kasutajaliidese kasutaja kohendatava profiili jaoks.", + "You have not added any info yet" : "Sa pole veel mingit infot lisanud", + "{user} has not added any info yet" : "{user} pole veel mingit infot lisanud", + "Error opening the user status modal, try hard refreshing the page" : "Kasutaja oleku modaalse vaate avamine ei õnnestunud, proovi lehte värskendada", + "Edit Profile" : "Muuda profiili", + "The headline and about sections will show up here" : "Alapealkirja ja teabe lõigud saavad olema nähtavad siin", + "Profile not found" : "Profiili ei leitud", + "The profile does not exist." : "Profiili ei eksisteeri", + "Back to %s" : "Tagasi siia: %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/et_EE.json b/apps/profile/l10n/et_EE.json new file mode 100644 index 00000000000..47a4be5a21d --- /dev/null +++ b/apps/profile/l10n/et_EE.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profiil", + "This application provides the profile" : "See rakendus tagab profiili olemasolu", + "Provides a customisable user profile interface." : "Tagab kasutajaliidese kasutaja kohendatava profiili jaoks.", + "You have not added any info yet" : "Sa pole veel mingit infot lisanud", + "{user} has not added any info yet" : "{user} pole veel mingit infot lisanud", + "Error opening the user status modal, try hard refreshing the page" : "Kasutaja oleku modaalse vaate avamine ei õnnestunud, proovi lehte värskendada", + "Edit Profile" : "Muuda profiili", + "The headline and about sections will show up here" : "Alapealkirja ja teabe lõigud saavad olema nähtavad siin", + "Profile not found" : "Profiili ei leitud", + "The profile does not exist." : "Profiili ei eksisteeri", + "Back to %s" : "Tagasi siia: %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/eu.js b/apps/profile/l10n/eu.js new file mode 100644 index 00000000000..99ef6e710fb --- /dev/null +++ b/apps/profile/l10n/eu.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profila", + "You have not added any info yet" : "Oraindik ez duzu informaziorik gehitu", + "{user} has not added any info yet" : "{user}-(e)k ez du oraindik informaziorik gehitu", + "Error opening the user status modal, try hard refreshing the page" : "Errorea erabiltzailen egoera leihoa irekitzean, saiatu orria guztiz freskatzen", + "Edit Profile" : "Editatu profila", + "The headline and about sections will show up here" : "Izenburua eta 'Niri buruz' atalak hemen agertuko dira", + "Profile not found" : "Profila ez da aurkitu", + "The profile does not exist." : "Profila ez da existitzen", + "Back to %s" : "Itzuli %s(e)ra" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/eu.json b/apps/profile/l10n/eu.json new file mode 100644 index 00000000000..60218770cda --- /dev/null +++ b/apps/profile/l10n/eu.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Profila", + "You have not added any info yet" : "Oraindik ez duzu informaziorik gehitu", + "{user} has not added any info yet" : "{user}-(e)k ez du oraindik informaziorik gehitu", + "Error opening the user status modal, try hard refreshing the page" : "Errorea erabiltzailen egoera leihoa irekitzean, saiatu orria guztiz freskatzen", + "Edit Profile" : "Editatu profila", + "The headline and about sections will show up here" : "Izenburua eta 'Niri buruz' atalak hemen agertuko dira", + "Profile not found" : "Profila ez da aurkitu", + "The profile does not exist." : "Profila ez da existitzen", + "Back to %s" : "Itzuli %s(e)ra" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/fa.js b/apps/profile/l10n/fa.js new file mode 100644 index 00000000000..0f758b3f8e5 --- /dev/null +++ b/apps/profile/l10n/fa.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "نمایه", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "ویرایش نمایه", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "نمایه، یافت نشد", + "The profile does not exist." : "این نمایه وجود ندارد.", + "Back to %s" : "Back to %s" +}, +"nplurals=2; plural=(n > 1);"); diff --git a/apps/profile/l10n/fa.json b/apps/profile/l10n/fa.json new file mode 100644 index 00000000000..834633511f8 --- /dev/null +++ b/apps/profile/l10n/fa.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "نمایه", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "ویرایش نمایه", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "نمایه، یافت نشد", + "The profile does not exist." : "این نمایه وجود ندارد.", + "Back to %s" : "Back to %s" +},"pluralForm" :"nplurals=2; plural=(n > 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/fi.js b/apps/profile/l10n/fi.js new file mode 100644 index 00000000000..344c16bba30 --- /dev/null +++ b/apps/profile/l10n/fi.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profiili", + "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ä", + "Edit Profile" : "Muokkaa profiilia", + "The headline and about sections will show up here" : "Otsikko ja listätieto-osiot näkyvät tässä", + "Profile not found" : "Profiilia ei löytynyt", + "The profile does not exist." : "Profiilia ei ole olemassa", + "Back to %s" : "Takaisin kohtaan %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/fi.json b/apps/profile/l10n/fi.json new file mode 100644 index 00000000000..43a918e9755 --- /dev/null +++ b/apps/profile/l10n/fi.json @@ -0,0 +1,11 @@ +{ "translations": { + "Profile" : "Profiili", + "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ä", + "Edit Profile" : "Muokkaa profiilia", + "The headline and about sections will show up here" : "Otsikko ja listätieto-osiot näkyvät tässä", + "Profile not found" : "Profiilia ei löytynyt", + "The profile does not exist." : "Profiilia ei ole olemassa", + "Back to %s" : "Takaisin kohtaan %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/fr.js b/apps/profile/l10n/fr.js new file mode 100644 index 00000000000..1564f041407 --- /dev/null +++ b/apps/profile/l10n/fr.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Cette application fournit le profil", + "Provides a customisable user profile interface." : "Fournit une interface de profil utilisateur personnalisable", + "You have not added any info yet" : "Vous n’avez pas ajouté d’informations pour le moment", + "{user} has not added any info yet" : "{user} n’a pas ajouté d’informations pour le moment", + "Error opening the user status modal, try hard refreshing the page" : "Erreur lors de l'ouverture du modal du statut de l'utilisateur, essayez d'actualiser la page", + "Edit Profile" : "Modifier le profil", + "The headline and about sections will show up here" : "Le titre et la section « À propos » apparaîtront ici", + "Profile not found" : "Profile introuvable", + "The profile does not exist." : "Le profile n'existe pas.", + "Back to %s" : "Retourner à %s" +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/fr.json b/apps/profile/l10n/fr.json new file mode 100644 index 00000000000..1b9c4403d12 --- /dev/null +++ b/apps/profile/l10n/fr.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Cette application fournit le profil", + "Provides a customisable user profile interface." : "Fournit une interface de profil utilisateur personnalisable", + "You have not added any info yet" : "Vous n’avez pas ajouté d’informations pour le moment", + "{user} has not added any info yet" : "{user} n’a pas ajouté d’informations pour le moment", + "Error opening the user status modal, try hard refreshing the page" : "Erreur lors de l'ouverture du modal du statut de l'utilisateur, essayez d'actualiser la page", + "Edit Profile" : "Modifier le profil", + "The headline and about sections will show up here" : "Le titre et la section « À propos » apparaîtront ici", + "Profile not found" : "Profile introuvable", + "The profile does not exist." : "Le profile n'existe pas.", + "Back to %s" : "Retourner à %s" +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ga.js b/apps/profile/l10n/ga.js new file mode 100644 index 00000000000..e226c170afd --- /dev/null +++ b/apps/profile/l10n/ga.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Próifíl", + "This application provides the profile" : "Soláthraíonn an feidhmchlár seo an phróifíl", + "Provides a customisable user profile interface." : "Soláthraíonn sé comhéadan próifíl úsáideora customizable.", + "You have not added any info yet" : "Níl aon fhaisnéis curtha agat fós", + "{user} has not added any info yet" : "Níor chuir {user} aon fhaisnéis leis fós", + "Error opening the user status modal, try hard refreshing the page" : "Earráid agus an modh stádas úsáideora á oscailt, déan iarracht an leathanach a athnuachan go dian", + "Edit Profile" : "Cuir Próifíl in Eagar", + "The headline and about sections will show up here" : "Taispeánfar an ceannlíne agus na hailt faoi anseo", + "Profile not found" : "Próifíl gan aimsiú", + "The profile does not exist." : "Níl an phróifíl ann.", + "Back to %s" : "Ar ais go dtí %s" +}, +"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"); diff --git a/apps/profile/l10n/ga.json b/apps/profile/l10n/ga.json new file mode 100644 index 00000000000..e72976c34db --- /dev/null +++ b/apps/profile/l10n/ga.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Próifíl", + "This application provides the profile" : "Soláthraíonn an feidhmchlár seo an phróifíl", + "Provides a customisable user profile interface." : "Soláthraíonn sé comhéadan próifíl úsáideora customizable.", + "You have not added any info yet" : "Níl aon fhaisnéis curtha agat fós", + "{user} has not added any info yet" : "Níor chuir {user} aon fhaisnéis leis fós", + "Error opening the user status modal, try hard refreshing the page" : "Earráid agus an modh stádas úsáideora á oscailt, déan iarracht an leathanach a athnuachan go dian", + "Edit Profile" : "Cuir Próifíl in Eagar", + "The headline and about sections will show up here" : "Taispeánfar an ceannlíne agus na hailt faoi anseo", + "Profile not found" : "Próifíl gan aimsiú", + "The profile does not exist." : "Níl an phróifíl ann.", + "Back to %s" : "Ar ais go dtí %s" +},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/gl.js b/apps/profile/l10n/gl.js new file mode 100644 index 00000000000..48d488a62b9 --- /dev/null +++ b/apps/profile/l10n/gl.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "This application provides the profile" : "Esta aplicación fornece o perfil", + "Provides a customisable user profile interface." : "Fornece unha interface de perfil de usuario personalizábel.", + "You have not added any info yet" : "Aínda non engadiu ningunha información", + "{user} has not added any info yet" : "{user} aínda non engadiu ningunha información", + "Error opening the user status modal, try hard refreshing the page" : "Produciuse un erro ao abrir a xanela modal de estado do usuario, tente forzar a actualización da páxina", + "Edit Profile" : "Editar o perfil", + "The headline and about sections will show up here" : "As seccións título e sobre aparecerán aquí", + "Profile not found" : "Non se atopou o perfil", + "The profile does not exist." : "O perfil non existe.", + "Back to %s" : "Volver a %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/gl.json b/apps/profile/l10n/gl.json new file mode 100644 index 00000000000..7517004073c --- /dev/null +++ b/apps/profile/l10n/gl.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Perfil", + "This application provides the profile" : "Esta aplicación fornece o perfil", + "Provides a customisable user profile interface." : "Fornece unha interface de perfil de usuario personalizábel.", + "You have not added any info yet" : "Aínda non engadiu ningunha información", + "{user} has not added any info yet" : "{user} aínda non engadiu ningunha información", + "Error opening the user status modal, try hard refreshing the page" : "Produciuse un erro ao abrir a xanela modal de estado do usuario, tente forzar a actualización da páxina", + "Edit Profile" : "Editar o perfil", + "The headline and about sections will show up here" : "As seccións título e sobre aparecerán aquí", + "Profile not found" : "Non se atopou o perfil", + "The profile does not exist." : "O perfil non existe.", + "Back to %s" : "Volver a %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/hu.js b/apps/profile/l10n/hu.js new file mode 100644 index 00000000000..2e11608e1b6 --- /dev/null +++ b/apps/profile/l10n/hu.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "You have not added any info yet" : "Még nem adott meg semmilyen információt", + "{user} has not added any info yet" : "{user} még nem adott meg semmilyen információt", + "Error opening the user status modal, try hard refreshing the page" : "Hiba a felhasználói állapot párbeszédablak megnyitásakor, próbálja meg az oldal kényszerített újratöltését", + "Edit Profile" : "Profil szerkesztése", + "The headline and about sections will show up here" : "A címsor és a névjegy szakaszok itt fognak megjelenni", + "Profile not found" : "Nem található profil", + "The profile does not exist." : "A profil nem létezik.", + "Back to %s" : "Vissza ide: %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/hu.json b/apps/profile/l10n/hu.json new file mode 100644 index 00000000000..37e81f74370 --- /dev/null +++ b/apps/profile/l10n/hu.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Profil", + "You have not added any info yet" : "Még nem adott meg semmilyen információt", + "{user} has not added any info yet" : "{user} még nem adott meg semmilyen információt", + "Error opening the user status modal, try hard refreshing the page" : "Hiba a felhasználói állapot párbeszédablak megnyitásakor, próbálja meg az oldal kényszerített újratöltését", + "Edit Profile" : "Profil szerkesztése", + "The headline and about sections will show up here" : "A címsor és a névjegy szakaszok itt fognak megjelenni", + "Profile not found" : "Nem található profil", + "The profile does not exist." : "A profil nem létezik.", + "Back to %s" : "Vissza ide: %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/id.js b/apps/profile/l10n/id.js new file mode 100644 index 00000000000..abb40c8c7b9 --- /dev/null +++ b/apps/profile/l10n/id.js @@ -0,0 +1,12 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "You have not added any info yet" : "Anda belum menambahkan info apa pun", + "{user} has not added any info yet" : "{user} belum menambahkan info apa pun", + "Edit Profile" : "Sunting profil", + "Profile not found" : "Profil tidak ditemukan", + "The profile does not exist." : "Profil tidak ada.", + "Back to %s" : "Kembali ke %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/id.json b/apps/profile/l10n/id.json new file mode 100644 index 00000000000..7dcb6e506c7 --- /dev/null +++ b/apps/profile/l10n/id.json @@ -0,0 +1,10 @@ +{ "translations": { + "Profile" : "Profil", + "You have not added any info yet" : "Anda belum menambahkan info apa pun", + "{user} has not added any info yet" : "{user} belum menambahkan info apa pun", + "Edit Profile" : "Sunting profil", + "Profile not found" : "Profil tidak ditemukan", + "The profile does not exist." : "Profil tidak ada.", + "Back to %s" : "Kembali ke %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/is.js b/apps/profile/l10n/is.js new file mode 100644 index 00000000000..29a6b2a4283 --- /dev/null +++ b/apps/profile/l10n/is.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "Þú hefur ekki bætt við neinum upplýsingum ennþá", + "{user} has not added any info yet" : "{user} hefur ekki bætt við neinum upplýsingum ennþá", + "Error opening the user status modal, try hard refreshing the page" : "Villa við að opna stöðuglugga notandans, prófaðu að þvinga endurlestur síðunnar", + "Edit Profile" : "Breyta sniði", + "The headline and about sections will show up here" : "Fyrirsögnin og hlutar um hugbúnaðinn munu birtast hér", + "Profile not found" : "Sniðið finnst ekki", + "The profile does not exist." : "Sniðið er ekki til.", + "Back to %s" : "Til baka í %s" +}, +"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);"); diff --git a/apps/profile/l10n/is.json b/apps/profile/l10n/is.json new file mode 100644 index 00000000000..3a8c5e84494 --- /dev/null +++ b/apps/profile/l10n/is.json @@ -0,0 +1,11 @@ +{ "translations": { + "You have not added any info yet" : "Þú hefur ekki bætt við neinum upplýsingum ennþá", + "{user} has not added any info yet" : "{user} hefur ekki bætt við neinum upplýsingum ennþá", + "Error opening the user status modal, try hard refreshing the page" : "Villa við að opna stöðuglugga notandans, prófaðu að þvinga endurlestur síðunnar", + "Edit Profile" : "Breyta sniði", + "The headline and about sections will show up here" : "Fyrirsögnin og hlutar um hugbúnaðinn munu birtast hér", + "Profile not found" : "Sniðið finnst ekki", + "The profile does not exist." : "Sniðið er ekki til.", + "Back to %s" : "Til baka í %s" +},"pluralForm" :"nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/it.js b/apps/profile/l10n/it.js new file mode 100644 index 00000000000..5444015f5e4 --- /dev/null +++ b/apps/profile/l10n/it.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profilo", + "This application provides the profile" : "Questa applicazione fornisce il profilo", + "Provides a customisable user profile interface." : "Fornisce un'interfaccia personalizzabile per il profilo utente.", + "You have not added any info yet" : "Non hai ancora aggiunto alcuna informazione", + "{user} has not added any info yet" : "{user} non ha ancora aggiunto alcuna informazione", + "Error opening the user status modal, try hard refreshing the page" : "Errore nell'apertura dello stato utente, prova a ricaricare la pagina", + "Edit Profile" : "Modifica il profilo", + "The headline and about sections will show up here" : "Le sezioni del titolo e delle informazioni verranno mostrate qui", + "Profile not found" : "Profilo non trovato", + "The profile does not exist." : "Il profilo non esiste.", + "Back to %s" : "Torna a %s" +}, +"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/it.json b/apps/profile/l10n/it.json new file mode 100644 index 00000000000..1220bfc1b86 --- /dev/null +++ b/apps/profile/l10n/it.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profilo", + "This application provides the profile" : "Questa applicazione fornisce il profilo", + "Provides a customisable user profile interface." : "Fornisce un'interfaccia personalizzabile per il profilo utente.", + "You have not added any info yet" : "Non hai ancora aggiunto alcuna informazione", + "{user} has not added any info yet" : "{user} non ha ancora aggiunto alcuna informazione", + "Error opening the user status modal, try hard refreshing the page" : "Errore nell'apertura dello stato utente, prova a ricaricare la pagina", + "Edit Profile" : "Modifica il profilo", + "The headline and about sections will show up here" : "Le sezioni del titolo e delle informazioni verranno mostrate qui", + "Profile not found" : "Profilo non trovato", + "The profile does not exist." : "Il profilo non esiste.", + "Back to %s" : "Torna a %s" +},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ja.js b/apps/profile/l10n/ja.js new file mode 100644 index 00000000000..75cbc3fbe32 --- /dev/null +++ b/apps/profile/l10n/ja.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "プロフィール", + "You have not added any info yet" : "まだ情報が追加されていません", + "{user} has not added any info yet" : "{user}が、まだ情報を追加していません", + "Error opening the user status modal, try hard refreshing the page" : "ユーザーステータスモーダルを開くときにエラーが発生しました。ページを更新してみてください", + "Edit Profile" : "プロフィールを編集", + "The headline and about sections will show up here" : "見出しと概要セクションがここに表示されます", + "Profile not found" : "プロフィールが見つかりません", + "The profile does not exist." : "プロフィールはありません", + "Back to %s" : "%s に戻る" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/ja.json b/apps/profile/l10n/ja.json new file mode 100644 index 00000000000..9c9c0e2bff3 --- /dev/null +++ b/apps/profile/l10n/ja.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "プロフィール", + "You have not added any info yet" : "まだ情報が追加されていません", + "{user} has not added any info yet" : "{user}が、まだ情報を追加していません", + "Error opening the user status modal, try hard refreshing the page" : "ユーザーステータスモーダルを開くときにエラーが発生しました。ページを更新してみてください", + "Edit Profile" : "プロフィールを編集", + "The headline and about sections will show up here" : "見出しと概要セクションがここに表示されます", + "Profile not found" : "プロフィールが見つかりません", + "The profile does not exist." : "プロフィールはありません", + "Back to %s" : "%s に戻る" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ka.js b/apps/profile/l10n/ka.js new file mode 100644 index 00000000000..faffe59999b --- /dev/null +++ b/apps/profile/l10n/ka.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profile", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "Edit Profile", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profile not found", + "The profile does not exist." : "The profile does not exist.", + "Back to %s" : "Back to %s" +}, +"nplurals=2; plural=(n!=1);"); diff --git a/apps/profile/l10n/ka.json b/apps/profile/l10n/ka.json new file mode 100644 index 00000000000..bf4895a06eb --- /dev/null +++ b/apps/profile/l10n/ka.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Profile", + "You have not added any info yet" : "You have not added any info yet", + "{user} has not added any info yet" : "{user} has not added any info yet", + "Error opening the user status modal, try hard refreshing the page" : "Error opening the user status modal, try hard refreshing the page", + "Edit Profile" : "Edit Profile", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profile not found", + "The profile does not exist." : "The profile does not exist.", + "Back to %s" : "Back to %s" +},"pluralForm" :"nplurals=2; plural=(n!=1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ko.js b/apps/profile/l10n/ko.js new file mode 100644 index 00000000000..bd811513299 --- /dev/null +++ b/apps/profile/l10n/ko.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "프로필", + "This application provides the profile" : "이 애플리케이션은 프로필을 제공합니다.", + "Provides a customisable user profile interface." : "사용자 정의 가능한 사용자 프로필 인터페이스 제공", + "You have not added any info yet" : "아직 아무 정보도 추가하지 않았습니다.", + "{user} has not added any info yet" : "{user}님이 아직 아무 정보도 추가하지 않음", + "Error opening the user status modal, try hard refreshing the page" : "사용자 상태 모달을 불러오는 데 실패했습니다, 페이지를 완전히 새로고침 해 보십시오.", + "Edit Profile" : "프로필 수정", + "The headline and about sections will show up here" : "표제와 기타 정보가 이곳에 나타납니다.", + "Profile not found" : "프로필 찾을 수 없음", + "The profile does not exist." : "프로필이 존재하지 않습니다.", + "Back to %s" : "%s(으)로 돌아가기" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/ko.json b/apps/profile/l10n/ko.json new file mode 100644 index 00000000000..2ff4a928c8e --- /dev/null +++ b/apps/profile/l10n/ko.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "프로필", + "This application provides the profile" : "이 애플리케이션은 프로필을 제공합니다.", + "Provides a customisable user profile interface." : "사용자 정의 가능한 사용자 프로필 인터페이스 제공", + "You have not added any info yet" : "아직 아무 정보도 추가하지 않았습니다.", + "{user} has not added any info yet" : "{user}님이 아직 아무 정보도 추가하지 않음", + "Error opening the user status modal, try hard refreshing the page" : "사용자 상태 모달을 불러오는 데 실패했습니다, 페이지를 완전히 새로고침 해 보십시오.", + "Edit Profile" : "프로필 수정", + "The headline and about sections will show up here" : "표제와 기타 정보가 이곳에 나타납니다.", + "Profile not found" : "프로필 찾을 수 없음", + "The profile does not exist." : "프로필이 존재하지 않습니다.", + "Back to %s" : "%s(으)로 돌아가기" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/lt_LT.js b/apps/profile/l10n/lt_LT.js new file mode 100644 index 00000000000..f00ab8ac429 --- /dev/null +++ b/apps/profile/l10n/lt_LT.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profilis", + "You have not added any info yet" : "Jūs kol kas nesate pridėję jokios informacijos", + "{user} has not added any info yet" : "Naudotojas {user} kol kas nėra pridėjęs jokios informacijos", + "Edit Profile" : "Taisyti profilį", + "The headline and about sections will show up here" : "Čia bus rodoma santrauka apie jus bei kita su jumis susijusi informacija", + "Profile not found" : "Profilis nerastas", + "The profile does not exist." : "Profilio nėra.", + "Back to %s" : "Atgal į %s" +}, +"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/profile/l10n/lt_LT.json b/apps/profile/l10n/lt_LT.json new file mode 100644 index 00000000000..8b46261ebf0 --- /dev/null +++ b/apps/profile/l10n/lt_LT.json @@ -0,0 +1,11 @@ +{ "translations": { + "Profile" : "Profilis", + "You have not added any info yet" : "Jūs kol kas nesate pridėję jokios informacijos", + "{user} has not added any info yet" : "Naudotojas {user} kol kas nėra pridėjęs jokios informacijos", + "Edit Profile" : "Taisyti profilį", + "The headline and about sections will show up here" : "Čia bus rodoma santrauka apie jus bei kita su jumis susijusi informacija", + "Profile not found" : "Profilis nerastas", + "The profile does not exist." : "Profilio nėra.", + "Back to %s" : "Atgal į %s" +},"pluralForm" :"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/lv.js b/apps/profile/l10n/lv.js new file mode 100644 index 00000000000..4dba0d596ef --- /dev/null +++ b/apps/profile/l10n/lv.js @@ -0,0 +1,11 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profils", + "This application provides the profile" : "Šī lietotne nodrošina profilu", + "Provides a customisable user profile interface." : "Nodrošina pielāgojamu lietotāja profila saskarni.", + "You have not added any info yet" : "Vēl nav pievienota nekāda informācija", + "{user} has not added any info yet" : "{user} vēl nav pievienojis nekādu informāciju ", + "Edit Profile" : "Labot profilu" +}, +"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/profile/l10n/lv.json b/apps/profile/l10n/lv.json new file mode 100644 index 00000000000..9b0bb1d9dfe --- /dev/null +++ b/apps/profile/l10n/lv.json @@ -0,0 +1,9 @@ +{ "translations": { + "Profile" : "Profils", + "This application provides the profile" : "Šī lietotne nodrošina profilu", + "Provides a customisable user profile interface." : "Nodrošina pielāgojamu lietotāja profila saskarni.", + "You have not added any info yet" : "Vēl nav pievienota nekāda informācija", + "{user} has not added any info yet" : "{user} vēl nav pievienojis nekādu informāciju ", + "Edit Profile" : "Labot profilu" +},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/mk.js b/apps/profile/l10n/mk.js new file mode 100644 index 00000000000..9c049120014 --- /dev/null +++ b/apps/profile/l10n/mk.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профил", + "You have not added any info yet" : "Сè уште немате додадено никакви информации", + "{user} has not added any info yet" : "{user} нема додадено никакви информации", + "Edit Profile" : "Уреди профил", + "The headline and about sections will show up here" : "Насловот и за секциите ќе се појават овде", + "Profile not found" : "Профилот не е пронајден", + "The profile does not exist." : "Профилот на постои", + "Back to %s" : "Врати се на %s" +}, +"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); diff --git a/apps/profile/l10n/mk.json b/apps/profile/l10n/mk.json new file mode 100644 index 00000000000..83c23cffafb --- /dev/null +++ b/apps/profile/l10n/mk.json @@ -0,0 +1,11 @@ +{ "translations": { + "Profile" : "Профил", + "You have not added any info yet" : "Сè уште немате додадено никакви информации", + "{user} has not added any info yet" : "{user} нема додадено никакви информации", + "Edit Profile" : "Уреди профил", + "The headline and about sections will show up here" : "Насловот и за секциите ќе се појават овде", + "Profile not found" : "Профилот не е пронајден", + "The profile does not exist." : "Профилот на постои", + "Back to %s" : "Врати се на %s" +},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/nb.js b/apps/profile/l10n/nb.js new file mode 100644 index 00000000000..daa377cf851 --- /dev/null +++ b/apps/profile/l10n/nb.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "You have not added any info yet" : "Du har ikke lagt inn noe informasjon ennå", + "{user} has not added any info yet" : "{user} har ikke lagt inn noe informasjon ennå", + "Error opening the user status modal, try hard refreshing the page" : "Feil ved åpning av bruker-status modal, prøv å laste inn siden på nytt med hard refresh", + "Edit Profile" : "Endre profil", + "The headline and about sections will show up here" : "Overskriften og om-seksjoner vil vises her", + "Profile not found" : "Finner ikke profil", + "The profile does not exist." : "Profilen finnes ikke", + "Back to %s" : "Tilbake til %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/nb.json b/apps/profile/l10n/nb.json new file mode 100644 index 00000000000..bd26fc37e27 --- /dev/null +++ b/apps/profile/l10n/nb.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Profil", + "You have not added any info yet" : "Du har ikke lagt inn noe informasjon ennå", + "{user} has not added any info yet" : "{user} har ikke lagt inn noe informasjon ennå", + "Error opening the user status modal, try hard refreshing the page" : "Feil ved åpning av bruker-status modal, prøv å laste inn siden på nytt med hard refresh", + "Edit Profile" : "Endre profil", + "The headline and about sections will show up here" : "Overskriften og om-seksjoner vil vises her", + "Profile not found" : "Finner ikke profil", + "The profile does not exist." : "Profilen finnes ikke", + "Back to %s" : "Tilbake til %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/nl.js b/apps/profile/l10n/nl.js new file mode 100644 index 00000000000..63c6d1d0056 --- /dev/null +++ b/apps/profile/l10n/nl.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profiel", + "This application provides the profile" : "Deze applicatie biedt het profiel", + "Provides a customisable user profile interface." : "Biedt een aanpasbare gebruikersprofielinterface.", + "You have not added any info yet" : "Je hebt nog geen info toegevoegd", + "{user} has not added any info yet" : "{user} heeft nog geen info toegevoegd", + "Error opening the user status modal, try hard refreshing the page" : "Fout bij het openen van het gebruiker status model, probeer een harde refresh van de pagina", + "Edit Profile" : "Wijzig Profiel", + "The headline and about sections will show up here" : "De koplijn- en oversectie zal hier verschijnen", + "Profile not found" : "Profiel niet gevonden", + "The profile does not exist." : "Het profiel bestaat niet.", + "Back to %s" : "Terug naar %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/nl.json b/apps/profile/l10n/nl.json new file mode 100644 index 00000000000..920d89bf38f --- /dev/null +++ b/apps/profile/l10n/nl.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profiel", + "This application provides the profile" : "Deze applicatie biedt het profiel", + "Provides a customisable user profile interface." : "Biedt een aanpasbare gebruikersprofielinterface.", + "You have not added any info yet" : "Je hebt nog geen info toegevoegd", + "{user} has not added any info yet" : "{user} heeft nog geen info toegevoegd", + "Error opening the user status modal, try hard refreshing the page" : "Fout bij het openen van het gebruiker status model, probeer een harde refresh van de pagina", + "Edit Profile" : "Wijzig Profiel", + "The headline and about sections will show up here" : "De koplijn- en oversectie zal hier verschijnen", + "Profile not found" : "Profiel niet gevonden", + "The profile does not exist." : "Het profiel bestaat niet.", + "Back to %s" : "Terug naar %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/pl.js b/apps/profile/l10n/pl.js new file mode 100644 index 00000000000..4ec2c9b6b8c --- /dev/null +++ b/apps/profile/l10n/pl.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Ta aplikacja dostarcza profil", + "Provides a customisable user profile interface." : "Dostarcza konfigurowalny interfejs profilu użytkownika.", + "You have not added any info yet" : "Nie dodałeś jeszcze żadnych informacji", + "{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ę", + "Edit Profile" : "Edytuj profil", + "The headline and about sections will show up here" : "Tutaj pojawi się nagłówek i informacje o sekcjach", + "Profile not found" : "Nie znaleziono profilu", + "The profile does not exist." : "Profil nie istnieje.", + "Back to %s" : "Powrót do %s" +}, +"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"); diff --git a/apps/profile/l10n/pl.json b/apps/profile/l10n/pl.json new file mode 100644 index 00000000000..cd9ac4d3aad --- /dev/null +++ b/apps/profile/l10n/pl.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Ta aplikacja dostarcza profil", + "Provides a customisable user profile interface." : "Dostarcza konfigurowalny interfejs profilu użytkownika.", + "You have not added any info yet" : "Nie dodałeś jeszcze żadnych informacji", + "{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ę", + "Edit Profile" : "Edytuj profil", + "The headline and about sections will show up here" : "Tutaj pojawi się nagłówek i informacje o sekcjach", + "Profile not found" : "Nie znaleziono profilu", + "The profile does not exist." : "Profil nie istnieje.", + "Back to %s" : "Powrót do %s" +},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/pt_BR.js b/apps/profile/l10n/pt_BR.js new file mode 100644 index 00000000000..3c3a3fc85a6 --- /dev/null +++ b/apps/profile/l10n/pt_BR.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Perfil", + "This application provides the profile" : "Esse aplicativo fornece o perfil", + "Provides a customisable user profile interface." : "Fornece uma interface customizável para o perfil do usuário", + "You have not added any info yet" : "Você ainda não adicionou nenhuma informação", + "{user} has not added any info yet" : "{user} ainda não adicionou nenhuma informação", + "Error opening the user status modal, try hard refreshing the page" : "Erro ao abrir o modal de status do usuário, tente atualizar a página", + "Edit Profile" : "Editar Perfil ", + "The headline and about sections will show up here" : "O título e as seções sobre serão exibidos aqui", + "Profile not found" : "Perfil não encontrado", + "The profile does not exist." : "O perfil não existe. ", + "Back to %s" : "Voltar para %s" +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/pt_BR.json b/apps/profile/l10n/pt_BR.json new file mode 100644 index 00000000000..5b93971ec84 --- /dev/null +++ b/apps/profile/l10n/pt_BR.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Perfil", + "This application provides the profile" : "Esse aplicativo fornece o perfil", + "Provides a customisable user profile interface." : "Fornece uma interface customizável para o perfil do usuário", + "You have not added any info yet" : "Você ainda não adicionou nenhuma informação", + "{user} has not added any info yet" : "{user} ainda não adicionou nenhuma informação", + "Error opening the user status modal, try hard refreshing the page" : "Erro ao abrir o modal de status do usuário, tente atualizar a página", + "Edit Profile" : "Editar Perfil ", + "The headline and about sections will show up here" : "O título e as seções sobre serão exibidos aqui", + "Profile not found" : "Perfil não encontrado", + "The profile does not exist." : "O perfil não existe. ", + "Back to %s" : "Voltar para %s" +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/pt_PT.js b/apps/profile/l10n/pt_PT.js new file mode 100644 index 00000000000..c9627213248 --- /dev/null +++ b/apps/profile/l10n/pt_PT.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "Ainda não adicionou qualquer informação ", + "{user} has not added any info yet" : "{user} ainda não adicionou qualquer informação", + "Error opening the user status modal, try hard refreshing the page" : "Erro ao abrir o modal de estado do utilizador; tente atualizar a página forçadamente", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "Os campos de título e sobre aparecerão aqui", + "Profile not found" : "Perfil não encontrado", + "The profile does not exist." : "O perfil não existe.", + "Back to %s" : "Voltar para %s" +}, +"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); diff --git a/apps/profile/l10n/pt_PT.json b/apps/profile/l10n/pt_PT.json new file mode 100644 index 00000000000..11ce126965c --- /dev/null +++ b/apps/profile/l10n/pt_PT.json @@ -0,0 +1,11 @@ +{ "translations": { + "You have not added any info yet" : "Ainda não adicionou qualquer informação ", + "{user} has not added any info yet" : "{user} ainda não adicionou qualquer informação", + "Error opening the user status modal, try hard refreshing the page" : "Erro ao abrir o modal de estado do utilizador; tente atualizar a página forçadamente", + "Edit Profile" : "Editar perfil", + "The headline and about sections will show up here" : "Os campos de título e sobre aparecerão aqui", + "Profile not found" : "Perfil não encontrado", + "The profile does not exist." : "O perfil não existe.", + "Back to %s" : "Voltar para %s" +},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ro.js b/apps/profile/l10n/ro.js new file mode 100644 index 00000000000..578ce3ccbdd --- /dev/null +++ b/apps/profile/l10n/ro.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "Nu ați adăugat nicio informație", + "{user} has not added any info yet" : "{user} nu a adăugat nicio informație", + "Error opening the user status modal, try hard refreshing the page" : "Eroare la deschiderea status utilizator, încercați refresh", + "Edit Profile" : "Editare profil", + "The headline and about sections will show up here" : "Secțiunile titlu și despre vor fi afișate aici", + "Profile not found" : "Profil inexistent", + "The profile does not exist." : "Profilul nu există", + "Back to %s" : "Înapoi la %s" +}, +"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/apps/profile/l10n/ro.json b/apps/profile/l10n/ro.json new file mode 100644 index 00000000000..a8a8981c73f --- /dev/null +++ b/apps/profile/l10n/ro.json @@ -0,0 +1,11 @@ +{ "translations": { + "You have not added any info yet" : "Nu ați adăugat nicio informație", + "{user} has not added any info yet" : "{user} nu a adăugat nicio informație", + "Error opening the user status modal, try hard refreshing the page" : "Eroare la deschiderea status utilizator, încercați refresh", + "Edit Profile" : "Editare profil", + "The headline and about sections will show up here" : "Secțiunile titlu și despre vor fi afișate aici", + "Profile not found" : "Profil inexistent", + "The profile does not exist." : "Profilul nu există", + "Back to %s" : "Înapoi la %s" +},"pluralForm" :"nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ru.js b/apps/profile/l10n/ru.js new file mode 100644 index 00000000000..ca55ac4e79d --- /dev/null +++ b/apps/profile/l10n/ru.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профиль", + "This application provides the profile" : "Это приложение предоставляет профиль", + "Provides a customisable user profile interface." : "Предоставляет настраиваемый интерфейс профиля пользователя.", + "You have not added any info yet" : "Вы ещё не добавили никакой информации", + "{user} has not added any info yet" : "Пользователь {user} ещё не добавил(а) никакой информации", + "Error opening the user status modal, try hard refreshing the page" : "Произошла ошибка при открытии модального окна пользователя, попробуйте обновить страницу", + "Edit Profile" : "Редактирование профиля", + "The headline and about sections will show up here" : "Разделы \"Заголовок\" и \"О вас\" будут отображаться здесь", + "Profile not found" : "Профиль не найден", + "The profile does not exist." : "Профиль не существует", + "Back to %s" : "Вернуться к %s" +}, +"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); diff --git a/apps/profile/l10n/ru.json b/apps/profile/l10n/ru.json new file mode 100644 index 00000000000..291790a98c3 --- /dev/null +++ b/apps/profile/l10n/ru.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Профиль", + "This application provides the profile" : "Это приложение предоставляет профиль", + "Provides a customisable user profile interface." : "Предоставляет настраиваемый интерфейс профиля пользователя.", + "You have not added any info yet" : "Вы ещё не добавили никакой информации", + "{user} has not added any info yet" : "Пользователь {user} ещё не добавил(а) никакой информации", + "Error opening the user status modal, try hard refreshing the page" : "Произошла ошибка при открытии модального окна пользователя, попробуйте обновить страницу", + "Edit Profile" : "Редактирование профиля", + "The headline and about sections will show up here" : "Разделы \"Заголовок\" и \"О вас\" будут отображаться здесь", + "Profile not found" : "Профиль не найден", + "The profile does not exist." : "Профиль не существует", + "Back to %s" : "Вернуться к %s" +},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/sk.js b/apps/profile/l10n/sk.js new file mode 100644 index 00000000000..854ec3280f6 --- /dev/null +++ b/apps/profile/l10n/sk.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Táto aplikácia poskytuje profil", + "Provides a customisable user profile interface." : "Poskytuje prispôsobiteľné rozhranie používateľského profilu.", + "You have not added any info yet" : "Zatiaľ ste nepridali žiadne informácie", + "{user} has not added any info yet" : "{user} zatiaľ nepridal žiadne informácie", + "Error opening the user status modal, try hard refreshing the page" : "Chyba pri otváraní modálneho okna stavu používateľa, skúste stránku obnoviť", + "Edit Profile" : "Upraviť rofil", + "The headline and about sections will show up here" : "Tu sa zobrazí titul a sekcia Informácie", + "Profile not found" : "Profil nenájdený", + "The profile does not exist." : "Profil neexistuje.", + "Back to %s" : "Späť na %s" +}, +"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);"); diff --git a/apps/profile/l10n/sk.json b/apps/profile/l10n/sk.json new file mode 100644 index 00000000000..614be6ee3ce --- /dev/null +++ b/apps/profile/l10n/sk.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Táto aplikácia poskytuje profil", + "Provides a customisable user profile interface." : "Poskytuje prispôsobiteľné rozhranie používateľského profilu.", + "You have not added any info yet" : "Zatiaľ ste nepridali žiadne informácie", + "{user} has not added any info yet" : "{user} zatiaľ nepridal žiadne informácie", + "Error opening the user status modal, try hard refreshing the page" : "Chyba pri otváraní modálneho okna stavu používateľa, skúste stránku obnoviť", + "Edit Profile" : "Upraviť rofil", + "The headline and about sections will show up here" : "Tu sa zobrazí titul a sekcia Informácie", + "Profile not found" : "Profil nenájdený", + "The profile does not exist." : "Profil neexistuje.", + "Back to %s" : "Späť na %s" +},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/sl.js b/apps/profile/l10n/sl.js new file mode 100644 index 00000000000..a6edaa032ae --- /dev/null +++ b/apps/profile/l10n/sl.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "You have not added any info yet" : "Ni še vpisanih podrobnosti", + "{user} has not added any info yet" : "Oseba {user} še ni dodala nobenih podrobnosti.", + "Error opening the user status modal, try hard refreshing the page" : "Prišlo je do napake pri odpiranju modalnega okna stanja uporabnika. Napako je mogoče razrešiti z osvežitvijo strani.", + "Edit Profile" : "Uredi profil", + "The headline and about sections will show up here" : "Naslovnica in odsek s podatki bo prikazan na tem mestu.", + "Profile not found" : "Profila ni mogoče najti", + "The profile does not exist." : "Profil ne obstaja.", + "Back to %s" : "Nazaj na %s" +}, +"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/profile/l10n/sl.json b/apps/profile/l10n/sl.json new file mode 100644 index 00000000000..4f253e2666a --- /dev/null +++ b/apps/profile/l10n/sl.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Profil", + "You have not added any info yet" : "Ni še vpisanih podrobnosti", + "{user} has not added any info yet" : "Oseba {user} še ni dodala nobenih podrobnosti.", + "Error opening the user status modal, try hard refreshing the page" : "Prišlo je do napake pri odpiranju modalnega okna stanja uporabnika. Napako je mogoče razrešiti z osvežitvijo strani.", + "Edit Profile" : "Uredi profil", + "The headline and about sections will show up here" : "Naslovnica in odsek s podatki bo prikazan na tem mestu.", + "Profile not found" : "Profila ni mogoče najti", + "The profile does not exist." : "Profil ne obstaja.", + "Back to %s" : "Nazaj na %s" +},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/sr.js b/apps/profile/l10n/sr.js new file mode 100644 index 00000000000..735655ddaca --- /dev/null +++ b/apps/profile/l10n/sr.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профил", + "This application provides the profile" : "Ова апликација обезбеђује профил", + "Provides a customisable user profile interface." : "Обезбеђује интерфејс корисничког профила који може да се прилагоди.", + "You have not added any info yet" : "Још увек нисте додали никакве информације", + "{user} has not added any info yet" : "{user} још увек није унео никакве информације", + "Error opening the user status modal, try hard refreshing the page" : "Грешка приликом отварања модалног прозора за статус корисника, покушајте да освежите страну уз брисање кеша", + "Edit Profile" : "Уреди профил", + "The headline and about sections will show up here" : "Овде ће се појавити насловна линија и одељак „о”", + "Profile not found" : "Није пронађен профил", + "The profile does not exist." : "Профил не постоји.", + "Back to %s" : "Назад на %s" +}, +"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/profile/l10n/sr.json b/apps/profile/l10n/sr.json new file mode 100644 index 00000000000..7b6b0115aef --- /dev/null +++ b/apps/profile/l10n/sr.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Профил", + "This application provides the profile" : "Ова апликација обезбеђује профил", + "Provides a customisable user profile interface." : "Обезбеђује интерфејс корисничког профила који може да се прилагоди.", + "You have not added any info yet" : "Још увек нисте додали никакве информације", + "{user} has not added any info yet" : "{user} још увек није унео никакве информације", + "Error opening the user status modal, try hard refreshing the page" : "Грешка приликом отварања модалног прозора за статус корисника, покушајте да освежите страну уз брисање кеша", + "Edit Profile" : "Уреди профил", + "The headline and about sections will show up here" : "Овде ће се појавити насловна линија и одељак „о”", + "Profile not found" : "Није пронађен профил", + "The profile does not exist." : "Профил не постоји.", + "Back to %s" : "Назад на %s" +},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/sv.js b/apps/profile/l10n/sv.js new file mode 100644 index 00000000000..c967f554e81 --- /dev/null +++ b/apps/profile/l10n/sv.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Denna app tillhandahåller profilen", + "Provides a customisable user profile interface." : "Tillhandahåller ett anpassningsbart gränssnitt för användarprofiler.", + "You have not added any info yet" : "Du har inte angivit någon information ännu", + "{user} has not added any info yet" : "{user} har inte angivit någon information ännu", + "Error opening the user status modal, try hard refreshing the page" : "Kunde inte öppna användarstatus-rutan, försök att ladda om sidan", + "Edit Profile" : "Redigera profil", + "The headline and about sections will show up here" : "Rubriken och avsnitten \"om\" kommer att dyka upp här", + "Profile not found" : "Profil kunde inte hittas", + "The profile does not exist." : "Profilen existerar inte.", + "Back to %s" : "Tillbaka till %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/sv.json b/apps/profile/l10n/sv.json new file mode 100644 index 00000000000..75e58eab903 --- /dev/null +++ b/apps/profile/l10n/sv.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Denna app tillhandahåller profilen", + "Provides a customisable user profile interface." : "Tillhandahåller ett anpassningsbart gränssnitt för användarprofiler.", + "You have not added any info yet" : "Du har inte angivit någon information ännu", + "{user} has not added any info yet" : "{user} har inte angivit någon information ännu", + "Error opening the user status modal, try hard refreshing the page" : "Kunde inte öppna användarstatus-rutan, försök att ladda om sidan", + "Edit Profile" : "Redigera profil", + "The headline and about sections will show up here" : "Rubriken och avsnitten \"om\" kommer att dyka upp här", + "Profile not found" : "Profil kunde inte hittas", + "The profile does not exist." : "Profilen existerar inte.", + "Back to %s" : "Tillbaka till %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/sw.js b/apps/profile/l10n/sw.js new file mode 100644 index 00000000000..f9d54112cbc --- /dev/null +++ b/apps/profile/l10n/sw.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Wasifu", + "This application provides the profile" : "Programu hii hutoa wasifu", + "Provides a customisable user profile interface." : "Hutoa kiolesura cha wasifu unaoweza kubinafsishwa.", + "You have not added any info yet" : "Hujaongeza taarifa yoyote bado", + "{user} has not added any info yet" : "{user} hajaongeza taarifa yoyote bado", + "Error opening the user status modal, try hard refreshing the page" : "Hitilafu imetokea wakati wa kufungua modi ya hali ya mtumiaji, jaribu kuonyesha upya ukurasa kwa bidii", + "Edit Profile" : "Hariri wasifu", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Wasifu haupatikani", + "The profile does not exist." : "Wasifu haupo", + "Back to %s" : "Rudi kwenye %s" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/sw.json b/apps/profile/l10n/sw.json new file mode 100644 index 00000000000..311b0b44266 --- /dev/null +++ b/apps/profile/l10n/sw.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Wasifu", + "This application provides the profile" : "Programu hii hutoa wasifu", + "Provides a customisable user profile interface." : "Hutoa kiolesura cha wasifu unaoweza kubinafsishwa.", + "You have not added any info yet" : "Hujaongeza taarifa yoyote bado", + "{user} has not added any info yet" : "{user} hajaongeza taarifa yoyote bado", + "Error opening the user status modal, try hard refreshing the page" : "Hitilafu imetokea wakati wa kufungua modi ya hali ya mtumiaji, jaribu kuonyesha upya ukurasa kwa bidii", + "Edit Profile" : "Hariri wasifu", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Wasifu haupatikani", + "The profile does not exist." : "Wasifu haupo", + "Back to %s" : "Rudi kwenye %s" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/th.js b/apps/profile/l10n/th.js new file mode 100644 index 00000000000..c6ece39c98e --- /dev/null +++ b/apps/profile/l10n/th.js @@ -0,0 +1,11 @@ +OC.L10N.register( + "profile", + { + "You have not added any info yet" : "คุณยังไม่ได้เพิ่มข้อมูลใด ๆ", + "{user} has not added any info yet" : "{user} ยังไม่ได้เพิ่มข้อมูลใด ๆ", + "Edit Profile" : "แก้ไขโปรไฟล์", + "Profile not found" : "ไม่พบโปรไฟล์", + "The profile does not exist." : "โปรไฟล์นี้ไม่มีอยู่", + "Back to %s" : "กลับสู่ %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/th.json b/apps/profile/l10n/th.json new file mode 100644 index 00000000000..d870968705d --- /dev/null +++ b/apps/profile/l10n/th.json @@ -0,0 +1,9 @@ +{ "translations": { + "You have not added any info yet" : "คุณยังไม่ได้เพิ่มข้อมูลใด ๆ", + "{user} has not added any info yet" : "{user} ยังไม่ได้เพิ่มข้อมูลใด ๆ", + "Edit Profile" : "แก้ไขโปรไฟล์", + "Profile not found" : "ไม่พบโปรไฟล์", + "The profile does not exist." : "โปรไฟล์นี้ไม่มีอยู่", + "Back to %s" : "กลับสู่ %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/tr.js b/apps/profile/l10n/tr.js new file mode 100644 index 00000000000..b3a99b0d434 --- /dev/null +++ b/apps/profile/l10n/tr.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Bu uygulama profili sağlar", + "Provides a customisable user profile interface." : "Özelleştirilebilir bir kullanıcı profili arayüzü sağlar.", + "You have not added any info yet" : "Henüz herhangi bir bilgi eklememişsiniz", + "{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 ", + "Edit Profile" : "Profili düzenle", + "The headline and about sections will show up here" : "Başlık ve hakkında bölümleri burada görüntülenir", + "Profile not found" : "Profil bulunamadı", + "The profile does not exist." : "Profil bulunamadı.", + "Back to %s" : "%s sayfasına dön" +}, +"nplurals=2; plural=(n > 1);"); diff --git a/apps/profile/l10n/tr.json b/apps/profile/l10n/tr.json new file mode 100644 index 00000000000..2d777e44bac --- /dev/null +++ b/apps/profile/l10n/tr.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Bu uygulama profili sağlar", + "Provides a customisable user profile interface." : "Özelleştirilebilir bir kullanıcı profili arayüzü sağlar.", + "You have not added any info yet" : "Henüz herhangi bir bilgi eklememişsiniz", + "{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 ", + "Edit Profile" : "Profili düzenle", + "The headline and about sections will show up here" : "Başlık ve hakkında bölümleri burada görüntülenir", + "Profile not found" : "Profil bulunamadı", + "The profile does not exist." : "Profil bulunamadı.", + "Back to %s" : "%s sayfasına dön" +},"pluralForm" :"nplurals=2; plural=(n > 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/ug.js b/apps/profile/l10n/ug.js new file mode 100644 index 00000000000..2d62f65c456 --- /dev/null +++ b/apps/profile/l10n/ug.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "ئارخىپ", + "You have not added any info yet" : "سىز تېخى ھېچقانداق ئۇچۇر قوشمىدىڭىز", + "{user} has not added any info yet" : "{user} تېخى ھېچقانداق ئۇچۇر قوشمىدى", + "Error opening the user status modal, try hard refreshing the page" : "ئىشلەتكۈچى ھالىتى ھالىتىنى ئېچىشتا خاتالىق ، بەتنى يېڭىلاشنى سىناپ بېقىڭ", + "Edit Profile" : "ئارخىپنى تەھرىرلەش", + "The headline and about sections will show up here" : "ماۋزۇ ۋە بۆلەكلەر بۇ يەردە كۆرسىتىلىدۇ", + "Profile not found" : "ئارخىپ تېپىلمىدى", + "The profile does not exist." : "ئارخىپ مەۋجۇت ئەمەس.", + "Back to %s" : "% S گە قايتىش" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/profile/l10n/ug.json b/apps/profile/l10n/ug.json new file mode 100644 index 00000000000..f3bd6e94bad --- /dev/null +++ b/apps/profile/l10n/ug.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "ئارخىپ", + "You have not added any info yet" : "سىز تېخى ھېچقانداق ئۇچۇر قوشمىدىڭىز", + "{user} has not added any info yet" : "{user} تېخى ھېچقانداق ئۇچۇر قوشمىدى", + "Error opening the user status modal, try hard refreshing the page" : "ئىشلەتكۈچى ھالىتى ھالىتىنى ئېچىشتا خاتالىق ، بەتنى يېڭىلاشنى سىناپ بېقىڭ", + "Edit Profile" : "ئارخىپنى تەھرىرلەش", + "The headline and about sections will show up here" : "ماۋزۇ ۋە بۆلەكلەر بۇ يەردە كۆرسىتىلىدۇ", + "Profile not found" : "ئارخىپ تېپىلمىدى", + "The profile does not exist." : "ئارخىپ مەۋجۇت ئەمەس.", + "Back to %s" : "% S گە قايتىش" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/uk.js b/apps/profile/l10n/uk.js new file mode 100644 index 00000000000..24c11db00d4 --- /dev/null +++ b/apps/profile/l10n/uk.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Профіль", + "This application provides the profile" : "Цей застосунок створює профіль", + "Provides a customisable user profile interface." : "Надає інтерфейс профілю користувача, який можна налаштувати", + "You have not added any info yet" : "Ви ще не додали жодної інформації", + "{user} has not added any info yet" : "{user} ще не додав жодної інформації", + "Error opening the user status modal, try hard refreshing the page" : "Помилка відкриття режиму статусу користувача. Спробуйте оновити сторінку", + "Edit Profile" : "Редагувати профіль", + "The headline and about sections will show up here" : "Тут відображатимуться заголовок і розділи про", + "Profile not found" : "Профіль не знайдено", + "The profile does not exist." : "Профіль не існує.", + "Back to %s" : "Назад до %s" +}, +"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); diff --git a/apps/profile/l10n/uk.json b/apps/profile/l10n/uk.json new file mode 100644 index 00000000000..41e7504e153 --- /dev/null +++ b/apps/profile/l10n/uk.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Профіль", + "This application provides the profile" : "Цей застосунок створює профіль", + "Provides a customisable user profile interface." : "Надає інтерфейс профілю користувача, який можна налаштувати", + "You have not added any info yet" : "Ви ще не додали жодної інформації", + "{user} has not added any info yet" : "{user} ще не додав жодної інформації", + "Error opening the user status modal, try hard refreshing the page" : "Помилка відкриття режиму статусу користувача. Спробуйте оновити сторінку", + "Edit Profile" : "Редагувати профіль", + "The headline and about sections will show up here" : "Тут відображатимуться заголовок і розділи про", + "Profile not found" : "Профіль не знайдено", + "The profile does not exist." : "Профіль не існує.", + "Back to %s" : "Назад до %s" +},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" +}
\ No newline at end of file diff --git a/apps/profile/l10n/uz.js b/apps/profile/l10n/uz.js new file mode 100644 index 00000000000..ab7b1b66465 --- /dev/null +++ b/apps/profile/l10n/uz.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Profil", + "This application provides the profile" : "Ushbu ilova profilni taqdim etadi", + "Provides a customisable user profile interface." : "Moslashtirilgan foydalanuvchi Profil interfeysini taqdim etadi.", + "You have not added any info yet" : "Siz hali hech qanday ma'lumot qo'shmadingiz", + "{user} has not added any info yet" : "{user} hali hech qanday ma'lumot qo'shmagan", + "Error opening the user status modal, try hard refreshing the page" : "Foydalanuvchi holati modalini ochishda xato, sahifani yangilashga harakat qiling", + "Edit Profile" : "Profilni Tahrirlash", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profil topilmadi", + "The profile does not exist." : "Profil mavjud emas.", + "Back to %s" : "%sga qaytish" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/uz.json b/apps/profile/l10n/uz.json new file mode 100644 index 00000000000..6de70cafd00 --- /dev/null +++ b/apps/profile/l10n/uz.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "Profil", + "This application provides the profile" : "Ushbu ilova profilni taqdim etadi", + "Provides a customisable user profile interface." : "Moslashtirilgan foydalanuvchi Profil interfeysini taqdim etadi.", + "You have not added any info yet" : "Siz hali hech qanday ma'lumot qo'shmadingiz", + "{user} has not added any info yet" : "{user} hali hech qanday ma'lumot qo'shmagan", + "Error opening the user status modal, try hard refreshing the page" : "Foydalanuvchi holati modalini ochishda xato, sahifani yangilashga harakat qiling", + "Edit Profile" : "Profilni Tahrirlash", + "The headline and about sections will show up here" : "The headline and about sections will show up here", + "Profile not found" : "Profil topilmadi", + "The profile does not exist." : "Profil mavjud emas.", + "Back to %s" : "%sga qaytish" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/vi.js b/apps/profile/l10n/vi.js new file mode 100644 index 00000000000..4ae85403a8b --- /dev/null +++ b/apps/profile/l10n/vi.js @@ -0,0 +1,14 @@ +OC.L10N.register( + "profile", + { + "Profile" : "Hồ sơ", + "You have not added any info yet" : "Bạn chưa thêm bất kỳ thông tin nào", + "{user} has not added any info yet" : "{user} chưa thêm bất kỳ thông tin nào", + "Error opening the user status modal, try hard refreshing the page" : "Lỗi khi mở phương thức trạng thái người dùng, hãy thử làm mới trang", + "Edit Profile" : "Chỉnh sửa hồ sơ", + "The headline and about sections will show up here" : "Dòng tiêu đề và phần giới thiệu sẽ hiển thị ở đây", + "Profile not found" : "Không tìm thấy hồ sơ", + "The profile does not exist." : "Hồ sơ không tồn tại.", + "Back to %s" : "Quay lại %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/vi.json b/apps/profile/l10n/vi.json new file mode 100644 index 00000000000..9392b48d73c --- /dev/null +++ b/apps/profile/l10n/vi.json @@ -0,0 +1,12 @@ +{ "translations": { + "Profile" : "Hồ sơ", + "You have not added any info yet" : "Bạn chưa thêm bất kỳ thông tin nào", + "{user} has not added any info yet" : "{user} chưa thêm bất kỳ thông tin nào", + "Error opening the user status modal, try hard refreshing the page" : "Lỗi khi mở phương thức trạng thái người dùng, hãy thử làm mới trang", + "Edit Profile" : "Chỉnh sửa hồ sơ", + "The headline and about sections will show up here" : "Dòng tiêu đề và phần giới thiệu sẽ hiển thị ở đây", + "Profile not found" : "Không tìm thấy hồ sơ", + "The profile does not exist." : "Hồ sơ không tồn tại.", + "Back to %s" : "Quay lại %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/zh_CN.js b/apps/profile/l10n/zh_CN.js new file mode 100644 index 00000000000..13e586898eb --- /dev/null +++ b/apps/profile/l10n/zh_CN.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "个人资料", + "This application provides the profile" : "此应用程序提供个人资料", + "Provides a customisable user profile interface." : "提供可定制的用户个人资料界面。", + "You have not added any info yet" : "您尚未添加任何信息", + "{user} has not added any info yet" : "{user} 尚未添加任何信息", + "Error opening the user status modal, try hard refreshing the page" : "打开用户状态模块时出错,请努力刷新页面", + "Edit Profile" : "编辑个人资料", + "The headline and about sections will show up here" : "标题和关于部分将显示在此处", + "Profile not found" : "未找到个人资料", + "The profile does not exist." : "个人资料不存在", + "Back to %s" : "返回 %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/zh_CN.json b/apps/profile/l10n/zh_CN.json new file mode 100644 index 00000000000..f77f0743248 --- /dev/null +++ b/apps/profile/l10n/zh_CN.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "个人资料", + "This application provides the profile" : "此应用程序提供个人资料", + "Provides a customisable user profile interface." : "提供可定制的用户个人资料界面。", + "You have not added any info yet" : "您尚未添加任何信息", + "{user} has not added any info yet" : "{user} 尚未添加任何信息", + "Error opening the user status modal, try hard refreshing the page" : "打开用户状态模块时出错,请努力刷新页面", + "Edit Profile" : "编辑个人资料", + "The headline and about sections will show up here" : "标题和关于部分将显示在此处", + "Profile not found" : "未找到个人资料", + "The profile does not exist." : "个人资料不存在", + "Back to %s" : "返回 %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/zh_HK.js b/apps/profile/l10n/zh_HK.js new file mode 100644 index 00000000000..be1a8f4dbb9 --- /dev/null +++ b/apps/profile/l10n/zh_HK.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "個人設定", + "This application provides the profile" : "此應用提供個人資料", + "Provides a customisable user profile interface." : "提供可自訂的使用者個人檔案介面。", + "You have not added any info yet" : "您尚未新增任何資訊", + "{user} has not added any info yet" : "{user} 尚未新增任何資訊", + "Error opening the user status modal, try hard refreshing the page" : "打開用戶狀態模式時出錯,請嘗試刷新頁面", + "Edit Profile" : "編輯個人設定", + "The headline and about sections will show up here" : "標題與關於部份將在此顯示", + "Profile not found" : "找不到個人資料", + "The profile does not exist." : "個人資料不存在", + "Back to %s" : "返回 %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/zh_HK.json b/apps/profile/l10n/zh_HK.json new file mode 100644 index 00000000000..2a131ca91a2 --- /dev/null +++ b/apps/profile/l10n/zh_HK.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "個人設定", + "This application provides the profile" : "此應用提供個人資料", + "Provides a customisable user profile interface." : "提供可自訂的使用者個人檔案介面。", + "You have not added any info yet" : "您尚未新增任何資訊", + "{user} has not added any info yet" : "{user} 尚未新增任何資訊", + "Error opening the user status modal, try hard refreshing the page" : "打開用戶狀態模式時出錯,請嘗試刷新頁面", + "Edit Profile" : "編輯個人設定", + "The headline and about sections will show up here" : "標題與關於部份將在此顯示", + "Profile not found" : "找不到個人資料", + "The profile does not exist." : "個人資料不存在", + "Back to %s" : "返回 %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/l10n/zh_TW.js b/apps/profile/l10n/zh_TW.js new file mode 100644 index 00000000000..0ba2ab998fe --- /dev/null +++ b/apps/profile/l10n/zh_TW.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "profile", + { + "Profile" : "個人檔案", + "This application provides the profile" : "此應用程式提供了個人檔案", + "Provides a customisable user profile interface." : "提供可自訂的使用者個人檔案介面。", + "You have not added any info yet" : "您尚未新增任何資訊", + "{user} has not added any info yet" : "{user} 尚未新增任何資訊", + "Error opening the user status modal, try hard refreshing the page" : "開啟使用者狀態的模組時發生問題,嘗試重新整理頁面", + "Edit Profile" : "編輯個人檔案", + "The headline and about sections will show up here" : "標題與關於區段將在此顯示", + "Profile not found" : "找不到個人檔案", + "The profile does not exist." : "個人檔案不存在。", + "Back to %s" : "返回 %s" +}, +"nplurals=1; plural=0;"); diff --git a/apps/profile/l10n/zh_TW.json b/apps/profile/l10n/zh_TW.json new file mode 100644 index 00000000000..863b25d12d0 --- /dev/null +++ b/apps/profile/l10n/zh_TW.json @@ -0,0 +1,14 @@ +{ "translations": { + "Profile" : "個人檔案", + "This application provides the profile" : "此應用程式提供了個人檔案", + "Provides a customisable user profile interface." : "提供可自訂的使用者個人檔案介面。", + "You have not added any info yet" : "您尚未新增任何資訊", + "{user} has not added any info yet" : "{user} 尚未新增任何資訊", + "Error opening the user status modal, try hard refreshing the page" : "開啟使用者狀態的模組時發生問題,嘗試重新整理頁面", + "Edit Profile" : "編輯個人檔案", + "The headline and about sections will show up here" : "標題與關於區段將在此顯示", + "Profile not found" : "找不到個人檔案", + "The profile does not exist." : "個人檔案不存在。", + "Back to %s" : "返回 %s" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/profile/lib/Controller/ProfilePageController.php b/apps/profile/lib/Controller/ProfilePageController.php new file mode 100644 index 00000000000..0a5ec251e38 --- /dev/null +++ b/apps/profile/lib/Controller/ProfilePageController.php @@ -0,0 +1,116 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Profile\Controller; + +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Attribute\AnonRateLimit; +use OCP\AppFramework\Http\Attribute\BruteForceProtection; +use OCP\AppFramework\Http\Attribute\FrontpageRoute; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\OpenAPI; +use OCP\AppFramework\Http\Attribute\PublicPage; +use OCP\AppFramework\Http\Attribute\UserRateLimit; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Services\IInitialState; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\INavigationManager; +use OCP\IRequest; +use OCP\IUserManager; +use OCP\IUserSession; +use OCP\Profile\BeforeTemplateRenderedEvent; +use OCP\Profile\IProfileManager; +use OCP\Share\IManager as IShareManager; +use OCP\UserStatus\IManager as IUserStatusManager; +use OCP\Util; + +#[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)] +class ProfilePageController extends Controller { + public function __construct( + string $appName, + IRequest $request, + private IInitialState $initialStateService, + private IProfileManager $profileManager, + private IShareManager $shareManager, + private IUserManager $userManager, + private IUserSession $userSession, + private IUserStatusManager $userStatusManager, + private INavigationManager $navigationManager, + private IEventDispatcher $eventDispatcher, + ) { + parent::__construct($appName, $request); + } + + #[PublicPage] + #[NoCSRFRequired] + #[FrontpageRoute(verb: 'GET', url: '/u/{targetUserId}', root: '')] + #[BruteForceProtection(action: 'user')] + #[UserRateLimit(limit: 30, period: 120)] + #[AnonRateLimit(limit: 30, period: 120)] + public function index(string $targetUserId): TemplateResponse { + $profileNotFoundTemplate = new TemplateResponse( + 'profile', + '404-profile', + [], + TemplateResponse::RENDER_AS_GUEST, + ); + + $targetUser = $this->userManager->get($targetUserId); + if ($targetUser === null) { + $profileNotFoundTemplate->throttle(); + return $profileNotFoundTemplate; + } + if (!$targetUser->isEnabled()) { + return $profileNotFoundTemplate; + } + $visitingUser = $this->userSession->getUser(); + + if (!$this->profileManager->isProfileEnabled($targetUser)) { + return $profileNotFoundTemplate; + } + + // Run user enumeration checks only if viewing another user's profile + if ($targetUser !== $visitingUser) { + if (!$this->shareManager->currentUserCanEnumerateTargetUser($visitingUser, $targetUser)) { + return $profileNotFoundTemplate; + } + } + + if ($visitingUser !== null) { + $userStatuses = $this->userStatusManager->getUserStatuses([$targetUserId]); + $status = $userStatuses[$targetUserId] ?? null; + if ($status !== null) { + $this->initialStateService->provideInitialState('status', [ + 'icon' => $status->getIcon(), + 'message' => $status->getMessage(), + ]); + } + } + + $this->initialStateService->provideInitialState( + 'profileParameters', + $this->profileManager->getProfileFields($targetUser, $visitingUser), + ); + + if ($targetUser === $visitingUser) { + $this->navigationManager->setActiveEntry('profile'); + } + + $this->eventDispatcher->dispatchTyped(new BeforeTemplateRenderedEvent($targetUserId)); + + Util::addScript('profile', 'main'); + + return new TemplateResponse( + 'profile', + 'profile', + [], + $this->userSession->isLoggedIn() ? TemplateResponse::RENDER_AS_USER : TemplateResponse::RENDER_AS_PUBLIC, + ); + } +} diff --git a/apps/profile/src/main.ts b/apps/profile/src/main.ts new file mode 100644 index 00000000000..b48c6d5dc74 --- /dev/null +++ b/apps/profile/src/main.ts @@ -0,0 +1,27 @@ +/** + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import { getCSPNonce } from '@nextcloud/auth' +import Vue from 'vue' + +import Profile from './views/Profile.vue' +import ProfileSections from './services/ProfileSections.js' + +__webpack_nonce__ = getCSPNonce() + +if (!window.OCA) { + window.OCA = {} +} + +if (!window.OCA.Core) { + window.OCA.Core = {} +} +Object.assign(window.OCA.Core, { ProfileSections: new ProfileSections() }) + +const View = Vue.extend(Profile) + +window.addEventListener('DOMContentLoaded', () => { + new View().$mount('#content') +}) diff --git a/apps/profile/src/services/ProfileSections.ts b/apps/profile/src/services/ProfileSections.ts new file mode 100644 index 00000000000..9c6ca08e33f --- /dev/null +++ b/apps/profile/src/services/ProfileSections.ts @@ -0,0 +1,25 @@ +/** + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +export default class ProfileSections { + + _sections + + constructor() { + this._sections = [] + } + + /** + * @param {registerSectionCallback} section To be called to mount the section to the profile page + */ + registerSection(section) { + this._sections.push(section) + } + + getSections() { + return this._sections + } + +} diff --git a/apps/profile/src/views/Profile.vue b/apps/profile/src/views/Profile.vue new file mode 100644 index 00000000000..046a731cb93 --- /dev/null +++ b/apps/profile/src/views/Profile.vue @@ -0,0 +1,490 @@ +<!-- + - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + - SPDX-License-Identifier: AGPL-3.0-or-later +--> + +<template> + <NcContent app-name="profile"> + <NcAppContent> + <div class="profile__header"> + <div class="profile__header__container"> + <div class="profile__header__container__placeholder" /> + <div class="profile__header__container__displayname"> + <h2>{{ displayname || userId }}</h2> + <span v-if="pronouns">·</span> + <span v-if="pronouns" class="profile__header__container__pronouns">{{ pronouns }}</span> + <NcButton v-if="isCurrentUser" + type="primary" + :href="settingsUrl"> + <template #icon> + <PencilIcon :size="20" /> + </template> + {{ t('profile', 'Edit Profile') }} + </NcButton> + </div> + <NcButton v-if="status.icon || status.message" + :disabled="!isCurrentUser" + :type="isCurrentUser ? 'tertiary' : 'tertiary-no-background'" + @click="openStatusModal"> + {{ status.icon }} {{ status.message }} + </NcButton> + </div> + </div> + + <div class="profile__wrapper"> + <div class="profile__content"> + <div class="profile__sidebar"> + <NcAvatar class="avatar" + :class="{ interactive: isCurrentUser }" + :user="userId" + :size="180" + :show-user-status="true" + :show-user-status-compact="false" + :disable-menu="true" + :disable-tooltip="true" + :is-no-user="!isUserAvatarVisible" + @click.native.prevent.stop="openStatusModal" /> + + <div class="user-actions"> + <!-- When a tel: URL is opened with target="_blank", a blank new tab is opened which is inconsistent with the handling of other URLs so we set target="_self" for the phone action --> + <NcButton v-if="primaryAction" + type="primary" + class="user-actions__primary" + :href="primaryAction.target" + :icon="primaryAction.icon" + :target="primaryAction.id === 'phone' ? '_self' :'_blank'"> + <template #icon> + <!-- Fix for https://github.com/nextcloud-libraries/nextcloud-vue/issues/2315 --> + <img :src="primaryAction.icon" alt="" class="user-actions__primary__icon"> + </template> + {{ primaryAction.title }} + </NcButton> + <NcActions class="user-actions__other" :inline="4"> + <NcActionLink v-for="action in otherActions" + :key="action.id" + :close-after-click="true" + :href="action.target" + :target="action.id === 'phone' ? '_self' :'_blank'"> + <template #icon> + <!-- Fix for https://github.com/nextcloud-libraries/nextcloud-vue/issues/2315 --> + <img :src="action.icon" alt="" class="user-actions__other__icon"> + </template> + {{ action.title }} + </NcActionLink> + </NcActions> + </div> + </div> + + <div class="profile__blocks"> + <div v-if="organisation || role || address" class="profile__blocks-details"> + <div v-if="organisation || role" class="detail"> + <p>{{ organisation }} <span v-if="organisation && role">•</span> {{ role }}</p> + </div> + <div v-if="address" class="detail"> + <p> + <MapMarkerIcon class="map-icon" + :size="16" /> + {{ address }} + </p> + </div> + </div> + <template v-if="headline || biography || sections.length > 0"> + <h3 v-if="headline" class="profile__blocks-headline"> + {{ headline }} + </h3> + <NcRichText v-if="biography" :text="biography" use-extended-markdown /> + + <!-- additional entries, use it with cautious --> + <div v-for="(section, index) in sections" + :ref="'section-' + index" + :key="index" + class="profile__additionalContent"> + <component :is="section($refs['section-'+index], userId)" :user-id="userId" /> + </div> + </template> + <NcEmptyContent v-else + class="profile__blocks-empty-info" + :name="emptyProfileMessage" + :description="t('profile', 'The headline and about sections will show up here')"> + <template #icon> + <AccountIcon :size="60" /> + </template> + </NcEmptyContent> + </div> + </div> + </div> + </NcAppContent> + </NcContent> +</template> + +<script lang="ts"> +import { defineComponent } from 'vue' +import { generateUrl } from '@nextcloud/router' +import { getCurrentUser } from '@nextcloud/auth' +import { loadState } from '@nextcloud/initial-state' +import { showError } from '@nextcloud/dialogs' +import { subscribe, unsubscribe } from '@nextcloud/event-bus' +import { translate as t } from '@nextcloud/l10n' + +import NcActions from '@nextcloud/vue/components/NcActions' +import NcActionLink from '@nextcloud/vue/components/NcActionLink' +import NcAppContent from '@nextcloud/vue/components/NcAppContent' +import NcAvatar from '@nextcloud/vue/components/NcAvatar' +import NcButton from '@nextcloud/vue/components/NcButton' +import NcContent from '@nextcloud/vue/components/NcContent' +import NcEmptyContent from '@nextcloud/vue/components/NcEmptyContent' +import NcRichText from '@nextcloud/vue/components/NcRichText' +import AccountIcon from 'vue-material-design-icons/AccountOutline.vue' +import MapMarkerIcon from 'vue-material-design-icons/MapMarker.vue' +import PencilIcon from 'vue-material-design-icons/PencilOutline.vue' + +interface IProfileAction { + target: string + icon: string + id: string + title: string +} + +interface IStatus { + icon: string, + message: string, + userId: string, +} + +export default defineComponent({ + name: 'Profile', + + components: { + AccountIcon, + MapMarkerIcon, + NcActionLink, + NcActions, + NcAppContent, + NcAvatar, + NcButton, + NcContent, + NcEmptyContent, + NcRichText, + PencilIcon, + }, + + setup() { + return { + t, + } + }, + + data() { + const profileParameters = loadState('profile', 'profileParameters', { + userId: null as string|null, + displayname: null as string|null, + address: null as string|null, + organisation: null as string|null, + role: null as string|null, + headline: null as string|null, + biography: null as string|null, + actions: [] as IProfileAction[], + isUserAvatarVisible: false, + pronouns: null as string|null, + }) + + return { + ...profileParameters, + status: loadState<Partial<IStatus>>('profile', 'status', {}), + sections: window.OCA.Core.ProfileSections.getSections(), + } + }, + + computed: { + isCurrentUser() { + return getCurrentUser()?.uid === this.userId + }, + + allActions() { + return this.actions + }, + + primaryAction() { + if (this.allActions.length) { + return this.allActions[0] + } + return null + }, + + otherActions() { + if (this.allActions.length > 1) { + return this.allActions.slice(1) + } + return [] + }, + + settingsUrl() { + return generateUrl('/settings/user') + }, + + emptyProfileMessage() { + return this.isCurrentUser + ? t('profile', 'You have not added any info yet') + : t('profile', '{user} has not added any info yet', { user: (this.displayname || this.userId || '') }) + }, + }, + + mounted() { + // Set the user's displayname or userId in the page title and preserve the default title of "Nextcloud" at the end + document.title = `${this.displayname || this.userId} - ${document.title}` + subscribe('user_status:status.updated', this.handleStatusUpdate) + }, + + beforeDestroy() { + unsubscribe('user_status:status.updated', this.handleStatusUpdate) + }, + + methods: { + handleStatusUpdate(status: IStatus) { + if (this.isCurrentUser && status.userId === this.userId) { + this.status = status + } + }, + + openStatusModal() { + const statusMenuItem = document.querySelector<HTMLButtonElement>('.user-status-menu-item') + // Changing the user status is only enabled if you are the current user + if (this.isCurrentUser) { + if (statusMenuItem) { + statusMenuItem.click() + } else { + showError(t('profile', 'Error opening the user status modal, try hard refreshing the page')) + } + } + }, + }, +}) +</script> + +<style lang="scss" scoped> +$profile-max-width: 1024px; +$content-max-width: 640px; + +:deep(#app-content-vue) { + background-color: unset; +} + +.profile { + width: 100%; + overflow-y: auto; + + &__header { + display: flex; + position: sticky; + height: 190px; + top: -40px; + background-color: var(--color-main-background-blur); + backdrop-filter: var(--filter-background-blur); + -webkit-backdrop-filter: var(--filter-background-blur); + + &__container { + align-self: flex-end; + width: 100%; + max-width: $profile-max-width; + margin: 8px auto; + row-gap: 8px; + display: grid; + grid-template-rows: max-content max-content; + grid-template-columns: 240px 1fr; + justify-content: center; + + &__placeholder { + grid-row: 1 / 3; + } + + &__displayname { + padding-inline: 16px; // same as the status text button, see NcButton + width: $content-max-width; + height: 45px; + margin-block: 125px 0; + display: flex; + align-items: center; + gap: 18px; + + h2 { + font-size: 30px; + margin: 0; + } + + span { + font-size: 20px; + } + } + } + } + + &__sidebar { + position: sticky; + top: 0; + align-self: flex-start; + padding-top: 20px; + min-width: 220px; + margin-block: -150px 0; + margin-inline: 0 20px; + + // Specificity hack is needed to override Avatar component styles + :deep(.avatar.avatardiv) { + text-align: center; + margin: auto; + display: block; + padding: 8px; + + &.interactive { + .avatardiv__user-status { + // Show that the status is interactive + cursor: pointer; + } + } + + .avatardiv__user-status { + inset-inline-end: 14px; + bottom: 14px; + width: 34px; + height: 34px; + background-size: 28px; + border: none; + // Styles when custom status icon and status text are set + background-color: var(--color-main-background); + line-height: 34px; + font-size: 20px; + } + } + } + + &__wrapper { + background-color: var(--color-main-background); + min-height: 100%; + } + + &__content { + max-width: $profile-max-width; + margin: 0 auto; + display: flex; + width: 100%; + } + + &__blocks { + margin: 18px 0 80px 0; + display: grid; + gap: 16px 0; + width: $content-max-width; + + p, h3 { + cursor: text; + overflow-wrap: anywhere; + } + + &-details { + display: flex; + flex-direction: column; + gap: 2px 0; + + .detail { + display: inline-block; + color: var(--color-text-maxcontrast); + + p .map-icon { + display: inline-block; + vertical-align: middle; + } + } + } + + &-headline { + margin-inline: 0; + margin-block: 10px 0; + font-weight: bold; + font-size: 20px; + } + } +} + +@media only screen and (max-width: 1024px) { + .profile { + &__header { + height: 250px; + position: unset; + + &__container { + grid-template-columns: unset; + margin-bottom: 110px; + + &__displayname { + margin: 80px 20px 0px 0px!important; + width: unset; + text-align: center; + padding-inline: 12px; + } + + &__edit-button { + width: fit-content; + display: block; + margin: 60px auto; + } + + &__status-text { + margin: 4px auto; + } + } + } + + &__content { + display: block; + + .avatar { + // Overlap avatar to top header + margin-top: -110px !important; + } + } + + &__blocks { + width: unset; + max-width: 600px; + margin: 0 auto; + padding: 20px 50px 50px 50px; + } + + &__sidebar { + margin: unset; + position: unset; + } + } +} + +.user-actions { + display: flex; + flex-direction: column; + gap: 8px 0; + margin-top: 20px; + max-width: 300px; + + &__primary { + margin: 0 auto; + max-width: 100%; + + &__icon { + filter: var(--primary-invert-if-dark); + } + } + + &__other { + display: flex; + justify-content: center; + gap: 0 4px; + + &__icon { + height: 20px; + width: 20px; + object-fit: contain; + filter: var(--background-invert-if-dark); + align-self: center; + margin: 12px; // so we get 44px x 44px + } + } +} +</style> diff --git a/apps/profile/templates/404-profile.php b/apps/profile/templates/404-profile.php new file mode 100644 index 00000000000..2d34a9e7614 --- /dev/null +++ b/apps/profile/templates/404-profile.php @@ -0,0 +1,30 @@ +<?php +/** + * SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +/** @var array $_ */ +/** @var \OCP\IL10N $l */ +/** @var \OCP\Defaults $theme */ +// @codeCoverageIgnoreStart +if (!isset($_)) { //standalone page is not supported anymore - redirect to / + require_once '../../../lib/base.php'; + + $urlGenerator = \OCP\Server::get(\OCP\IURLGenerator::class); + header('Location: ' . $urlGenerator->getAbsoluteURL('/')); + exit; +} +// @codeCoverageIgnoreEnd +?> +<?php if (isset($_['content'])) : ?> + <?php print_unescaped($_['content']) ?> +<?php else : ?> + <div class="body-login-container update"> + <div class="icon-big icon-error"></div> + <h2><?php p($l->t('Profile not found')); ?></h2> + <p class="infogroup"><?php p($l->t('The profile does not exist.')); ?></p> + <p><a class="button primary" href="<?php p(\OCP\Server::get(\OCP\IURLGenerator::class)->linkTo('', 'index.php')) ?>"> + <?php p($l->t('Back to %s', [$theme->getName()])); ?> + </a></p> + </div> +<?php endif; ?> diff --git a/apps/profile/templates/profile.php b/apps/profile/templates/profile.php new file mode 100644 index 00000000000..460bfcc4221 --- /dev/null +++ b/apps/profile/templates/profile.php @@ -0,0 +1,7 @@ +<?php +/** + * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +?> +<div id="content"></div> diff --git a/apps/profile/tests/Controller/ProfilePageControllerTest.php b/apps/profile/tests/Controller/ProfilePageControllerTest.php new file mode 100644 index 00000000000..6c6c5ec79df --- /dev/null +++ b/apps/profile/tests/Controller/ProfilePageControllerTest.php @@ -0,0 +1,78 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +namespace OCA\Profile\Tests\Controller; + +use OC\Profile\ProfileManager; +use OC\UserStatus\Manager; +use OCA\Profile\Controller\ProfilePageController; +use OCP\AppFramework\Services\IInitialState; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\INavigationManager; +use OCP\IRequest; +use OCP\IUser; +use OCP\IUserManager; +use OCP\IUserSession; +use OCP\Share\IManager; +use Test\TestCase; + +class ProfilePageControllerTest extends TestCase { + + private IUserManager $userManager; + private ProfilePageController $controller; + + protected function setUp(): void { + parent::setUp(); + + $request = $this->createMock(IRequest::class); + $initialStateService = $this->createMock(IInitialState::class); + $profileManager = $this->createMock(ProfileManager::class); + $shareManager = $this->createMock(IManager::class); + $this->userManager = $this->createMock(IUserManager::class); + $userSession = $this->createMock(IUserSession::class); + $userStatusManager = $this->createMock(Manager::class); + $navigationManager = $this->createMock(INavigationManager::class); + $eventDispatcher = $this->createMock(IEventDispatcher::class); + + $this->controller = new ProfilePageController( + 'profile', + $request, + $initialStateService, + $profileManager, + $shareManager, + $this->userManager, + $userSession, + $userStatusManager, + $navigationManager, + $eventDispatcher, + ); + } + + public function testUserNotFound(): void { + $this->userManager->method('get') + ->willReturn(null); + + $response = $this->controller->index('bob'); + + $this->assertTrue($response->isThrottled()); + } + + public function testUserDisabled(): void { + $user = $this->createMock(IUser::class); + $user->method('isEnabled') + ->willReturn(false); + + $this->userManager->method('get') + ->willReturn($user); + + $response = $this->controller->index('bob'); + + $this->assertFalse($response->isThrottled()); + } +} |