aboutsummaryrefslogtreecommitdiffstats
path: root/apps/profile
diff options
context:
space:
mode:
Diffstat (limited to 'apps/profile')
-rw-r--r--apps/profile/.noopenapi0
-rw-r--r--apps/profile/appinfo/info.xml21
-rw-r--r--apps/profile/composer/autoload.php25
-rw-r--r--apps/profile/composer/composer.json13
-rw-r--r--apps/profile/composer/composer.lock18
-rw-r--r--apps/profile/composer/composer/ClassLoader.php579
-rw-r--r--apps/profile/composer/composer/InstalledVersions.php359
-rw-r--r--apps/profile/composer/composer/LICENSE21
-rw-r--r--apps/profile/composer/composer/autoload_classmap.php11
-rw-r--r--apps/profile/composer/composer/autoload_namespaces.php9
-rw-r--r--apps/profile/composer/composer/autoload_psr4.php10
-rw-r--r--apps/profile/composer/composer/autoload_real.php37
-rw-r--r--apps/profile/composer/composer/autoload_static.php37
-rw-r--r--apps/profile/composer/composer/installed.json5
-rw-r--r--apps/profile/composer/composer/installed.php23
-rw-r--r--apps/profile/l10n/.gitkeep0
-rw-r--r--apps/profile/l10n/ar.js16
-rw-r--r--apps/profile/l10n/ar.json14
-rw-r--r--apps/profile/l10n/ast.js14
-rw-r--r--apps/profile/l10n/ast.json12
-rw-r--r--apps/profile/l10n/be.js12
-rw-r--r--apps/profile/l10n/be.json10
-rw-r--r--apps/profile/l10n/bg.js14
-rw-r--r--apps/profile/l10n/bg.json12
-rw-r--r--apps/profile/l10n/ca.js13
-rw-r--r--apps/profile/l10n/ca.json11
-rw-r--r--apps/profile/l10n/cs.js16
-rw-r--r--apps/profile/l10n/cs.json14
-rw-r--r--apps/profile/l10n/da.js16
-rw-r--r--apps/profile/l10n/da.json14
-rw-r--r--apps/profile/l10n/de.js16
-rw-r--r--apps/profile/l10n/de.json14
-rw-r--r--apps/profile/l10n/de_DE.js16
-rw-r--r--apps/profile/l10n/de_DE.json14
-rw-r--r--apps/profile/l10n/el.js13
-rw-r--r--apps/profile/l10n/el.json11
-rw-r--r--apps/profile/l10n/en_GB.js16
-rw-r--r--apps/profile/l10n/en_GB.json14
-rw-r--r--apps/profile/l10n/es.js16
-rw-r--r--apps/profile/l10n/es.json14
-rw-r--r--apps/profile/l10n/es_EC.js14
-rw-r--r--apps/profile/l10n/es_EC.json12
-rw-r--r--apps/profile/l10n/es_MX.js14
-rw-r--r--apps/profile/l10n/es_MX.json12
-rw-r--r--apps/profile/l10n/et_EE.js16
-rw-r--r--apps/profile/l10n/et_EE.json14
-rw-r--r--apps/profile/l10n/eu.js14
-rw-r--r--apps/profile/l10n/eu.json12
-rw-r--r--apps/profile/l10n/fa.js14
-rw-r--r--apps/profile/l10n/fa.json12
-rw-r--r--apps/profile/l10n/fi.js13
-rw-r--r--apps/profile/l10n/fi.json11
-rw-r--r--apps/profile/l10n/fr.js16
-rw-r--r--apps/profile/l10n/fr.json14
-rw-r--r--apps/profile/l10n/ga.js16
-rw-r--r--apps/profile/l10n/ga.json14
-rw-r--r--apps/profile/l10n/gl.js16
-rw-r--r--apps/profile/l10n/gl.json14
-rw-r--r--apps/profile/l10n/hu.js14
-rw-r--r--apps/profile/l10n/hu.json12
-rw-r--r--apps/profile/l10n/id.js12
-rw-r--r--apps/profile/l10n/id.json10
-rw-r--r--apps/profile/l10n/is.js13
-rw-r--r--apps/profile/l10n/is.json11
-rw-r--r--apps/profile/l10n/it.js16
-rw-r--r--apps/profile/l10n/it.json14
-rw-r--r--apps/profile/l10n/ja.js14
-rw-r--r--apps/profile/l10n/ja.json12
-rw-r--r--apps/profile/l10n/ka.js14
-rw-r--r--apps/profile/l10n/ka.json12
-rw-r--r--apps/profile/l10n/ko.js16
-rw-r--r--apps/profile/l10n/ko.json14
-rw-r--r--apps/profile/l10n/lt_LT.js13
-rw-r--r--apps/profile/l10n/lt_LT.json11
-rw-r--r--apps/profile/l10n/lv.js11
-rw-r--r--apps/profile/l10n/lv.json9
-rw-r--r--apps/profile/l10n/mk.js13
-rw-r--r--apps/profile/l10n/mk.json11
-rw-r--r--apps/profile/l10n/nb.js14
-rw-r--r--apps/profile/l10n/nb.json12
-rw-r--r--apps/profile/l10n/nl.js16
-rw-r--r--apps/profile/l10n/nl.json14
-rw-r--r--apps/profile/l10n/pl.js16
-rw-r--r--apps/profile/l10n/pl.json14
-rw-r--r--apps/profile/l10n/pt_BR.js16
-rw-r--r--apps/profile/l10n/pt_BR.json14
-rw-r--r--apps/profile/l10n/pt_PT.js13
-rw-r--r--apps/profile/l10n/pt_PT.json11
-rw-r--r--apps/profile/l10n/ro.js13
-rw-r--r--apps/profile/l10n/ro.json11
-rw-r--r--apps/profile/l10n/ru.js16
-rw-r--r--apps/profile/l10n/ru.json14
-rw-r--r--apps/profile/l10n/sk.js16
-rw-r--r--apps/profile/l10n/sk.json14
-rw-r--r--apps/profile/l10n/sl.js14
-rw-r--r--apps/profile/l10n/sl.json12
-rw-r--r--apps/profile/l10n/sr.js16
-rw-r--r--apps/profile/l10n/sr.json14
-rw-r--r--apps/profile/l10n/sv.js16
-rw-r--r--apps/profile/l10n/sv.json14
-rw-r--r--apps/profile/l10n/sw.js16
-rw-r--r--apps/profile/l10n/sw.json14
-rw-r--r--apps/profile/l10n/th.js11
-rw-r--r--apps/profile/l10n/th.json9
-rw-r--r--apps/profile/l10n/tr.js16
-rw-r--r--apps/profile/l10n/tr.json14
-rw-r--r--apps/profile/l10n/ug.js14
-rw-r--r--apps/profile/l10n/ug.json12
-rw-r--r--apps/profile/l10n/uk.js16
-rw-r--r--apps/profile/l10n/uk.json14
-rw-r--r--apps/profile/l10n/uz.js16
-rw-r--r--apps/profile/l10n/uz.json14
-rw-r--r--apps/profile/l10n/vi.js14
-rw-r--r--apps/profile/l10n/vi.json12
-rw-r--r--apps/profile/l10n/zh_CN.js16
-rw-r--r--apps/profile/l10n/zh_CN.json14
-rw-r--r--apps/profile/l10n/zh_HK.js16
-rw-r--r--apps/profile/l10n/zh_HK.json14
-rw-r--r--apps/profile/l10n/zh_TW.js16
-rw-r--r--apps/profile/l10n/zh_TW.json14
-rw-r--r--apps/profile/lib/Controller/ProfilePageController.php116
-rw-r--r--apps/profile/src/main.ts27
-rw-r--r--apps/profile/src/services/ProfileSections.ts25
-rw-r--r--apps/profile/src/views/Profile.vue490
-rw-r--r--apps/profile/templates/404-profile.php30
-rw-r--r--apps/profile/templates/profile.php7
-rw-r--r--apps/profile/tests/Controller/ProfilePageControllerTest.php78
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());
+ }
+}