From d0d1684588150b24fe2bbe63eddabe5f4621e061 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 9 Jun 2016 10:49:51 +0200 Subject: [PATCH 01/42] add overflow ellipsis to session and device tokens list --- settings/css/settings.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/settings/css/settings.css b/settings/css/settings.css index 5fc9634350..04538558ca 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -120,6 +120,10 @@ table.nostyle td { padding: 0.2em 0; } #sessions .token-list td, #devices .token-list td { border-top: 1px solid #DDD; + text-overflow: ellipsis; + max-width: 200px; + white-space: nowrap; + overflow: hidden; } #sessions .token-list td a.icon-delete, #devices .token-list td a.icon-delete { From a9ea908413aa51c48739ea3e01811e36e819560c Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 10 Jun 2016 14:49:56 +0200 Subject: [PATCH 02/42] add tooltip to token names --- settings/js/authtoken_view.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js index 664dfd2814..47e6667925 100644 --- a/settings/js/authtoken_view.js +++ b/settings/js/authtoken_view.js @@ -27,7 +27,7 @@ var TEMPLATE_TOKEN = '' - + '{{name}}' + + '{{name}}' + '{{lastActivity}}' + '' + ''; @@ -80,6 +80,7 @@ viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL'); var html = _this.template(viewData); var $html = $(html); + $html.find('.token-name').tooltip(); $html.find('.last-activity').tooltip(); $html.find('.icon-delete').tooltip(); list.append($html); From 663459ca26d371731e0bc6409f746ebd7bac11ef Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 10 Jun 2016 14:58:30 +0200 Subject: [PATCH 03/42] rearrange personal settings sections --- settings/templates/personal.php | 56 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/settings/templates/personal.php b/settings/templates/personal.php index ced76fc3bf..942944ffab 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -139,6 +139,34 @@ if($_['passwordChangeSupported']) { } ?> +
+

+ +

+ + + + t('Help translate'));?> + + +
+

t('Sessions'));?>

t('These are the web, desktop and mobile clients currently logged in to your ownCloud.'));?> @@ -180,34 +208,6 @@ if($_['passwordChangeSupported']) {
-
-

- -

- - - - t('Help translate'));?> - - -
-

t('Get the apps to sync your files'));?>

From 5d1ef68cf0931b9eb70e960fe9a03575c7cb8650 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Mon, 9 May 2016 12:16:02 +0200 Subject: [PATCH 04/42] Give mysql docker more time to start up --- autotest.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/autotest.sh b/autotest.sh index e798157fe6..40c54102ea 100755 --- a/autotest.sh +++ b/autotest.sh @@ -192,8 +192,8 @@ function execute_tests { DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") echo "Waiting for MySQL initialisation ..." - if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 60; then - echo "[ERROR] Waited 60 seconds, no response" >&2 + if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 600; then + echo "[ERROR] Waited 600 seconds, no response" >&2 exit 1 fi @@ -221,8 +221,8 @@ function execute_tests { DATABASEHOST=$(docker inspect --format="{{.NetworkSettings.IPAddress}}" "$DOCKER_CONTAINER_ID") echo "Waiting for MariaDB initialisation ..." - if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 60; then - echo "[ERROR] Waited 60 seconds, no response" >&2 + if ! apps/files_external/tests/env/wait-for-connection $DATABASEHOST 3306 600; then + echo "[ERROR] Waited 600 seconds, no response" >&2 exit 1 fi From bac96e7ffc33fc4527656b7703a813555da79f5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Wed, 11 May 2016 09:37:02 +0200 Subject: [PATCH 05/42] Wait for port being accessible in addition to the notify socket --- apps/files_external/tests/env/start-swift-ceph.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/files_external/tests/env/start-swift-ceph.sh b/apps/files_external/tests/env/start-swift-ceph.sh index ba17b8f42d..b73fa899a6 100755 --- a/apps/files_external/tests/env/start-swift-ceph.sh +++ b/apps/files_external/tests/env/start-swift-ceph.sh @@ -74,6 +74,11 @@ if [[ $ready != 'READY=1' ]]; then docker logs $container exit 1 fi +if ! "$thisFolder"/env/wait-for-connection ${host} 80 600; then + echo "[ERROR] Waited 600 seconds, no response" >&2 + docker logs $container + exit 1 +fi echo "Waiting another 15 seconds" sleep 15 From a5a66f38f1cae2b623d95c739e8f8f6087c41af2 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 17 Jun 2016 15:11:31 +0200 Subject: [PATCH 06/42] Fix tooltip position in token list --- settings/js/authtoken_view.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js index 47e6667925..b1906f0b33 100644 --- a/settings/js/authtoken_view.js +++ b/settings/js/authtoken_view.js @@ -27,9 +27,9 @@ var TEMPLATE_TOKEN = '' - + '{{name}}' - + '{{lastActivity}}' - + '' + + '{{name}}' + + '{{lastActivity}}' + + '' + ''; var SubView = Backbone.View.extend({ @@ -80,9 +80,7 @@ viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL'); var html = _this.template(viewData); var $html = $(html); - $html.find('.token-name').tooltip(); - $html.find('.last-activity').tooltip(); - $html.find('.icon-delete').tooltip(); + $html.find('.has-tooltip').tooltip({container: 'body'}); list.append($html); }); }, From c4149c59c2cfe83b5e4cd2b20b8ad4caf2341ca9 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 12:08:48 +0200 Subject: [PATCH 07/42] use token last_activity instead of session value --- .../Token/DefaultTokenProvider.php | 11 +++++++---- lib/private/Authentication/Token/IProvider.php | 2 +- lib/private/User/Session.php | 18 ++---------------- .../Token/DefaultTokenProviderTest.php | 13 ++++++++++++- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 84effc5f87..03b8bb5da2 100644 --- a/lib/private/Authentication/Token/DefaultTokenProvider.php +++ b/lib/private/Authentication/Token/DefaultTokenProvider.php @@ -97,14 +97,17 @@ class DefaultTokenProvider implements IProvider { * @throws InvalidTokenException * @param IToken $token */ - public function updateToken(IToken $token) { + public function updateTokenActivity(IToken $token) { if (!($token instanceof DefaultToken)) { throw new InvalidTokenException(); } /** @var DefaultToken $token */ - $token->setLastActivity($this->time->getTime()); - - $this->mapper->update($token); + $now = $this->time->getTime(); + if ($token->getLastActivity() < ($now - 60)) { + // Update token only once per minute + $token->setLastActivity($now); + $this->mapper->update($token); + } } /** diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php index fece7dcb56..e79ba8b30e 100644 --- a/lib/private/Authentication/Token/IProvider.php +++ b/lib/private/Authentication/Token/IProvider.php @@ -76,7 +76,7 @@ interface IProvider { * * @param IToken $token */ - public function updateToken(IToken $token); + public function updateTokenActivity(IToken $token); /** * Get all token of a user diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 0cebb3e061..89148dcf8e 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -237,8 +237,7 @@ class Session implements IUserSession, Emitter { $this->session->set('last_login_check', $now); } - // Session is valid, so the token can be refreshed - $this->updateToken($token); + $this->tokenProvider->updateTokenActivity($token); } /** @@ -541,7 +540,7 @@ class Session implements IUserSession, Emitter { $result = $this->loginWithToken($token->getUID()); if ($result) { // Login success - $this->updateToken($token); + $this->tokenProvider->updateTokenActivity($token); return true; } } @@ -551,19 +550,6 @@ class Session implements IUserSession, Emitter { return false; } - /** - * @param IToken $token - */ - private function updateToken(IToken $token) { - // To save unnecessary DB queries, this is only done once a minute - $lastTokenUpdate = $this->session->get('last_token_update') ? : 0; - $now = $this->timeFacory->getTime(); - if ($lastTokenUpdate < ($now - 60)) { - $this->tokenProvider->updateToken($token); - $this->session->set('last_token_update', $now); - } - } - /** * Tries to login the user with auth token header * diff --git a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php index 98cee20806..86f4842bbc 100644 --- a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php @@ -97,14 +97,25 @@ class DefaultTokenProviderTest extends TestCase { public function testUpdateToken() { $tk = new DefaultToken(); + $tk->setLastActivity($this->time - 200); $this->mapper->expects($this->once()) ->method('update') ->with($tk); - $this->tokenProvider->updateToken($tk); + $this->tokenProvider->updateTokenActivity($tk); $this->assertEquals($this->time, $tk->getLastActivity()); } + + public function testUpdateTokenDebounce() { + $tk = new DefaultToken(); + $tk->setLastActivity($this->time - 30); + $this->mapper->expects($this->never()) + ->method('update') + ->with($tk); + + $this->tokenProvider->updateTokenActivity($tk); + } public function testGetTokenByUser() { $user = $this->getMock('\OCP\IUser'); From 0c0a216f42bb004380efca1fd665711f938579d9 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 13:59:15 +0200 Subject: [PATCH 08/42] store last check timestamp in token instead of session --- db_structure.xml | 9 ++ .../Authentication/Token/DefaultToken.php | 23 +++ .../Token/DefaultTokenMapper.php | 4 +- .../Token/DefaultTokenProvider.php | 27 ++-- .../Authentication/Token/IProvider.php | 14 +- lib/private/Authentication/Token/IToken.php | 14 ++ lib/private/User/Session.php | 146 +++++++++++------- version.php | 2 +- 8 files changed, 161 insertions(+), 78 deletions(-) diff --git a/db_structure.xml b/db_structure.xml index b7dacc05d9..6b91c3c4c5 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -1120,6 +1120,15 @@ 4 + + last_check + integer + 0 + true + true + 4 + + authtoken_token_index true diff --git a/lib/private/Authentication/Token/DefaultToken.php b/lib/private/Authentication/Token/DefaultToken.php index 299291e34a..79b03eed27 100644 --- a/lib/private/Authentication/Token/DefaultToken.php +++ b/lib/private/Authentication/Token/DefaultToken.php @@ -74,6 +74,11 @@ class DefaultToken extends Entity implements IToken { */ protected $lastActivity; + /** + * @var int + */ + protected $lastCheck; + public function getId() { return $this->id; } @@ -109,4 +114,22 @@ class DefaultToken extends Entity implements IToken { ]; } + /** + * Get the timestamp of the last password check + * + * @return int + */ + public function getLastCheck() { + return parent::getLastCheck(); + } + + /** + * Get the timestamp of the last password check + * + * @param int $time + */ + public function setLastCheck($time) { + return parent::setLastCheck($time); + } + } diff --git a/lib/private/Authentication/Token/DefaultTokenMapper.php b/lib/private/Authentication/Token/DefaultTokenMapper.php index c56a513b94..b02220976c 100644 --- a/lib/private/Authentication/Token/DefaultTokenMapper.php +++ b/lib/private/Authentication/Token/DefaultTokenMapper.php @@ -70,7 +70,7 @@ class DefaultTokenMapper extends Mapper { public function getToken($token) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); - $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity') + $result = $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check') ->from('authtoken') ->where($qb->expr()->eq('token', $qb->createParameter('token'))) ->setParameter('token', $token) @@ -95,7 +95,7 @@ class DefaultTokenMapper extends Mapper { public function getTokenByUser(IUser $user) { /* @var $qb IQueryBuilder */ $qb = $this->db->getQueryBuilder(); - $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity') + $qb->select('id', 'uid', 'login_name', 'password', 'name', 'type', 'token', 'last_activity', 'last_check') ->from('authtoken') ->where($qb->expr()->eq('uid', $qb->createNamedParameter($user->getUID()))) ->setMaxResults(1000); diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 03b8bb5da2..2467b8d836 100644 --- a/lib/private/Authentication/Token/DefaultTokenProvider.php +++ b/lib/private/Authentication/Token/DefaultTokenProvider.php @@ -91,6 +91,18 @@ class DefaultTokenProvider implements IProvider { return $dbToken; } + /** + * Save the updated token + * + * @param IToken $token + */ + public function updateToken(IToken $token) { + if (!($token instanceof DefaultToken)) { + throw new InvalidTokenException(); + } + $this->mapper->update($token); + } + /** * Update token activity timestamp * @@ -181,21 +193,6 @@ class DefaultTokenProvider implements IProvider { $this->mapper->invalidateOld($olderThan); } - /** - * @param string $token - * @throws InvalidTokenException - * @return DefaultToken user UID - */ - public function validateToken($token) { - try { - $dbToken = $this->mapper->getToken($this->hashToken($token)); - $this->logger->debug('valid default token for ' . $dbToken->getUID()); - return $dbToken; - } catch (DoesNotExistException $ex) { - throw new InvalidTokenException(); - } - } - /** * @param string $token * @return string diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php index e79ba8b30e..97f8ababbb 100644 --- a/lib/private/Authentication/Token/IProvider.php +++ b/lib/private/Authentication/Token/IProvider.php @@ -49,13 +49,6 @@ interface IProvider { */ public function getToken($tokenId) ; - /** - * @param string $token - * @throws InvalidTokenException - * @return IToken - */ - public function validateToken($token); - /** * Invalidate (delete) the given session token * @@ -71,6 +64,13 @@ interface IProvider { */ public function invalidateTokenById(IUser $user, $id); + /** + * Save the updated token + * + * @param IToken $token + */ + public function updateToken(IToken $token); + /** * Update token activity timestamp * diff --git a/lib/private/Authentication/Token/IToken.php b/lib/private/Authentication/Token/IToken.php index a34bdc2c43..096550fd09 100644 --- a/lib/private/Authentication/Token/IToken.php +++ b/lib/private/Authentication/Token/IToken.php @@ -55,4 +55,18 @@ interface IToken extends JsonSerializable { * @return string */ public function getPassword(); + + /** + * Get the timestamp of the last password check + * + * @return int + */ + public function getLastCheck(); + + /** + * Get the timestamp of the last password check + * + * @param int $time + */ + public function setLastCheck($time); } diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 89148dcf8e..ccae72ed35 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -192,52 +192,22 @@ class Session implements IUserSession, Emitter { if (is_null($this->activeUser)) { return null; } - $this->validateSession($this->activeUser); + $this->validateSession(); } return $this->activeUser; } - protected function validateSession(IUser $user) { + protected function validateSession() { try { $sessionId = $this->session->getId(); } catch (SessionNotAvailableException $ex) { return; } - try { - $token = $this->tokenProvider->getToken($sessionId); - } catch (InvalidTokenException $ex) { + + if (!$this->validateToken($sessionId)) { // Session was invalidated $this->logout(); - return; } - - // Check whether login credentials are still valid and the user was not disabled - // This check is performed each 5 minutes - $lastCheck = $this->session->get('last_login_check') ? : 0; - $now = $this->timeFacory->getTime(); - if ($lastCheck < ($now - 60 * 5)) { - try { - $pwd = $this->tokenProvider->getPassword($token, $sessionId); - } catch (InvalidTokenException $ex) { - // An invalid token password was used -> log user out - $this->logout(); - return; - } catch (PasswordlessTokenException $ex) { - // Token has no password, nothing to check - $this->session->set('last_login_check', $now); - return; - } - - if ($this->manager->checkPassword($token->getLoginName(), $pwd) === false - || !$user->isEnabled()) { - // Password has changed or user was disabled -> log user out - $this->logout(); - return; - } - $this->session->set('last_login_check', $now); - } - - $this->tokenProvider->updateTokenActivity($token); } /** @@ -297,20 +267,22 @@ class Session implements IUserSession, Emitter { public function login($uid, $password) { $this->session->regenerateId(); if ($this->validateToken($password)) { - $user = $this->getUser(); - // When logging in with token, the password must be decrypted first before passing to login hook try { $token = $this->tokenProvider->getToken($password); try { - $password = $this->tokenProvider->getPassword($token, $password); - $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); + $loginPassword = $this->tokenProvider->getPassword($token, $password); + $this->manager->emit('\OC\User', 'preLogin', array($uid, $loginPassword)); } catch (PasswordlessTokenException $ex) { $this->manager->emit('\OC\User', 'preLogin', array($uid, '')); } } catch (InvalidTokenException $ex) { // Invalid token, nothing to do } + + $this->loginWithToken($password); + $user = $this->getUser(); + $this->tokenProvider->updateTokenActivity($token); } else { $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); $user = $this->manager->checkPassword($uid, $password); @@ -459,8 +431,21 @@ class Session implements IUserSession, Emitter { return false; } - private function loginWithToken($uid) { - // TODO: $this->manager->emit('\OC\User', 'preTokenLogin', array($uid)); + private function loginWithToken($token) { + try { + $dbToken = $this->tokenProvider->getToken($token); + } catch (InvalidTokenException $ex) { + return false; + } + $uid = $dbToken->getUID(); + + try { + $password = $this->tokenProvider->getPassword($dbToken, $token); + $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); + } catch (PasswordlessTokenException $ex) { + $this->manager->emit('\OC\User', 'preLogin', array($uid, '')); + } + $user = $this->manager->get($uid); if (is_null($user)) { // user does not exist @@ -473,7 +458,9 @@ class Session implements IUserSession, Emitter { //login $this->setUser($user); - // TODO: $this->manager->emit('\OC\User', 'postTokenLogin', array($user)); + $this->tokenProvider->updateTokenActivity($dbToken); + + $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); return true; } @@ -530,24 +517,72 @@ class Session implements IUserSession, Emitter { } /** + * @param IToken $dbToken + * @param string $token + * @return boolean + */ + private function checkTokenCredentials(IToken $dbToken, $token) { + // Check whether login credentials are still valid and the user was not disabled + // This check is performed each 5 minutes + $lastCheck = $dbToken->getLastCheck() ? : 0; + $now = $this->timeFacory->getTime(); + if ($lastCheck > ($now - 60 * 5)) { + // Checked performed recently, nothing to do now + return true; + } + + try { + $pwd = $this->tokenProvider->getPassword($dbToken, $token); + } catch (InvalidTokenException $ex) { + // An invalid token password was used -> log user out + $this->logout(); + return false; + } catch (PasswordlessTokenException $ex) { + // Token has no password + + if (!is_null($this->activeUser) && !$this->activeUser->isEnabled()) { + $this->tokenProvider->invalidateToken($token); + $this->logout(); + return false; + } + + $dbToken->setLastCheck($now); + $this->tokenProvider->updateToken($dbToken); + return true; + } + + if ($this->manager->checkPassword($dbToken->getLoginName(), $pwd) === false + || (!is_null($this->activeUser) && !$this->activeUser->isEnabled())) { + $this->tokenProvider->invalidateToken($token); + // Password has changed or user was disabled -> log user out + $this->logout(); + return false; + } + $dbToken->setLastCheck($now); + $this->tokenProvider->updateToken($dbToken); + return true; + } + + /** + * Check if the given token exists and performs password/user-enabled checks + * + * Invalidates the token if checks fail + * * @param string $token * @return boolean */ private function validateToken($token) { try { - $token = $this->tokenProvider->validateToken($token); - if (!is_null($token)) { - $result = $this->loginWithToken($token->getUID()); - if ($result) { - // Login success - $this->tokenProvider->updateTokenActivity($token); - return true; - } - } + $dbToken = $this->tokenProvider->getToken($token); } catch (InvalidTokenException $ex) { - + return false; } - return false; + + if (!$this->checkTokenCredentials($dbToken, $token)) { + return false; + } + + return true; } /** @@ -562,10 +597,15 @@ class Session implements IUserSession, Emitter { // No auth header, let's try session id try { $sessionId = $this->session->getId(); - return $this->validateToken($sessionId); } catch (SessionNotAvailableException $ex) { return false; } + + if (!$this->validateToken($sessionId)) { + return false; + } + + return $this->loginWithToken($sessionId); } else { $token = substr($authHeader, 6); return $this->validateToken($token); diff --git a/version.php b/version.php index 698636a219..3015d976e5 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel // when updating major/minor version number. -$OC_Version = array(9, 1, 0, 8); +$OC_Version = array(9, 1, 0, 9); // The human readable string $OC_VersionString = '9.1.0 beta 2'; From 1889df5c7cac71e9faf42d19686b98bf61b23bf8 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 15:41:32 +0200 Subject: [PATCH 09/42] dont create a session token for clients, validate the app password instead --- lib/private/User/Session.php | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index ccae72ed35..cd9e973e30 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -197,14 +197,27 @@ class Session implements IUserSession, Emitter { return $this->activeUser; } + /** + * Validate whether the current session is valid + * + * - For token-authenticated clients, the token validity is checked + * - For browsers, the session token validity is checked + */ protected function validateSession() { - try { - $sessionId = $this->session->getId(); - } catch (SessionNotAvailableException $ex) { - return; + $token = null; + $appPassword = $this->session->get('app_password'); + + if (is_null($appPassword)) { + try { + $token = $this->session->getId(); + } catch (SessionNotAvailableException $ex) { + return; + } + } else { + $token = $appPassword; } - if (!$this->validateToken($sessionId)) { + if (!$this->validateToken($token)) { // Session was invalidated $this->logout(); } @@ -282,7 +295,6 @@ class Session implements IUserSession, Emitter { $this->loginWithToken($password); $user = $this->getUser(); - $this->tokenProvider->updateTokenActivity($token); } else { $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); $user = $this->manager->checkPassword($uid, $password); @@ -341,7 +353,10 @@ class Session implements IUserSession, Emitter { return false; } - if ($this->supportsCookies($request)) { + if ($isTokenPassword) { + $this->session->set('app_password', $password); + } else if($this->supportsCookies($request)) { + // Password login, but cookies supported -> create (browser) session token $this->createSessionToken($request, $this->getUser()->getUID(), $user, $password); } @@ -458,7 +473,6 @@ class Session implements IUserSession, Emitter { //login $this->setUser($user); - $this->tokenProvider->updateTokenActivity($dbToken); $this->manager->emit('\OC\User', 'postLogin', array($user, $password)); return true; @@ -582,6 +596,8 @@ class Session implements IUserSession, Emitter { return false; } + $this->tokenProvider->updateTokenActivity($dbToken); + return true; } From 8ef5431e7a0db3120223fafd336f273cb3a61513 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 09:10:11 +0200 Subject: [PATCH 10/42] fix user session tests --- tests/lib/User/SessionTest.php | 150 ++++++++++++++++----------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 28f6b6a537..974b5d3fd8 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -41,6 +41,7 @@ class SessionTest extends \Test\TestCase { public function testGetUser() { $token = new \OC\Authentication\Token\DefaultToken(); $token->setLoginName('User123'); + $token->setLastCheck(200); $expectedUser = $this->getMock('\OCP\IUser'); $expectedUser->expects($this->any()) @@ -56,41 +57,32 @@ class SessionTest extends \Test\TestCase { $manager = $this->getMockBuilder('\OC\User\Manager') ->disableOriginalConstructor() ->getMock(); + $session->expects($this->at(1)) + ->method('get') + ->with('app_password') + ->will($this->returnValue(null)); // No password set -> browser session $session->expects($this->once()) ->method('getId') ->will($this->returnValue($sessionId)); $this->tokenProvider->expects($this->once()) ->method('getToken') + ->with($sessionId) ->will($this->returnValue($token)); - $session->expects($this->at(2)) - ->method('get') - ->with('last_login_check') - ->will($this->returnValue(null)); // No check has been run yet $this->tokenProvider->expects($this->once()) ->method('getPassword') ->with($token, $sessionId) - ->will($this->returnValue('password123')); + ->will($this->returnValue('passme')); $manager->expects($this->once()) ->method('checkPassword') - ->with('User123', 'password123') + ->with('User123', 'passme') ->will($this->returnValue(true)); $expectedUser->expects($this->once()) ->method('isEnabled') ->will($this->returnValue(true)); - $session->expects($this->at(3)) - ->method('set') - ->with('last_login_check', 10000); - $session->expects($this->at(4)) - ->method('get') - ->with('last_token_update') - ->will($this->returnValue(null)); // No check run so far $this->tokenProvider->expects($this->once()) - ->method('updateToken') + ->method('updateTokenActivity') ->with($token); - $session->expects($this->at(5)) - ->method('set') - ->with('last_token_update', $this->equalTo(10000)); $manager->expects($this->any()) ->method('get') @@ -100,6 +92,7 @@ class SessionTest extends \Test\TestCase { $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); $user = $userSession->getUser(); $this->assertSame($expectedUser, $user); + $this->assertSame(10000, $token->getLastCheck()); } public function isLoggedInData() { @@ -155,6 +148,10 @@ class SessionTest extends \Test\TestCase { $session = $this->getMock('\OC\Session\Memory', array(), array('')); $session->expects($this->once()) ->method('regenerateId'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('bar') + ->will($this->throwException('\OC\Authentication\Exceptions\InvalidTokenException')); $session->expects($this->exactly(2)) ->method('set') ->with($this->callback(function ($key) { @@ -219,6 +216,10 @@ class SessionTest extends \Test\TestCase { ->method('set'); $session->expects($this->once()) ->method('regenerateId'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('bar') + ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException())); $managerMethods = get_class_methods('\OC\User\Manager'); //keep following methods intact in order to ensure hooks are @@ -252,11 +253,6 @@ class SessionTest extends \Test\TestCase { public function testLoginInvalidPassword() { $session = $this->getMock('\OC\Session\Memory', array(), array('')); - $session->expects($this->never()) - ->method('set'); - $session->expects($this->once()) - ->method('regenerateId'); - $managerMethods = get_class_methods('\OC\User\Manager'); //keep following methods intact in order to ensure hooks are //working @@ -268,10 +264,20 @@ class SessionTest extends \Test\TestCase { } } $manager = $this->getMock('\OC\User\Manager', $managerMethods, array()); - $backend = $this->getMock('\Test\Util\User\Dummy'); + $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); $user = $this->getMock('\OC\User\User', array(), array('foo', $backend)); + + $session->expects($this->never()) + ->method('set'); + $session->expects($this->once()) + ->method('regenerateId'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('bar') + ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException())); + $user->expects($this->never()) ->method('isEnabled'); $user->expects($this->never()) @@ -282,27 +288,29 @@ class SessionTest extends \Test\TestCase { ->with('foo', 'bar') ->will($this->returnValue(false)); - $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); $userSession->login('foo', 'bar'); } public function testLoginNonExisting() { $session = $this->getMock('\OC\Session\Memory', array(), array('')); + $manager = $this->getMock('\OC\User\Manager'); + $backend = $this->getMock('\Test\Util\User\Dummy'); + $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); + $session->expects($this->never()) ->method('set'); $session->expects($this->once()) ->method('regenerateId'); - - $manager = $this->getMock('\OC\User\Manager'); - - $backend = $this->getMock('\Test\Util\User\Dummy'); + $this->tokenProvider->expects($this->once()) + ->method('getToken') + ->with('bar') + ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException())); $manager->expects($this->once()) ->method('checkPassword') ->with('foo', 'bar') ->will($this->returnValue(false)); - $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); $userSession->login('foo', 'bar'); } @@ -351,24 +359,14 @@ class SessionTest extends \Test\TestCase { ->will($this->returnValue(true)); $userSession->expects($this->once()) ->method('login') - ->with('john', 'doe') + ->with('john', 'I-AM-AN-APP-PASSWORD') ->will($this->returnValue(true)); - $userSession->expects($this->once()) - ->method('supportsCookies') - ->with($request) - ->will($this->returnValue(true)); - $userSession->expects($this->once()) - ->method('getUser') - ->will($this->returnValue($user)); - $user->expects($this->once()) - ->method('getUID') - ->will($this->returnValue('user123')); - $userSession->expects($this->once()) - ->method('createSessionToken') - ->with($request, 'user123', 'john', 'doe'); - - $this->assertTrue($userSession->logClientIn('john', 'doe', $request)); + $session->expects($this->once()) + ->method('set') + ->with('app_password', 'I-AM-AN-APP-PASSWORD'); + + $this->assertTrue($userSession->logClientIn('john', 'I-AM-AN-APP-PASSWORD', $request)); } public function testLogClientInNoTokenPasswordNo2fa() { @@ -738,38 +736,40 @@ class SessionTest extends \Test\TestCase { ->getMock(); $user = $this->getMock('\OCP\IUser'); - $token = $this->getMock('\OC\Authentication\Token\IToken'); + $token = new \OC\Authentication\Token\DefaultToken(); + $token->setLoginName('susan'); + $token->setLastCheck(20); $session->expects($this->once()) - ->method('getId') - ->will($this->returnValue('sessionid')); + ->method('get') + ->with('app_password') + ->will($this->returnValue('APP-PASSWORD')); $tokenProvider->expects($this->once()) ->method('getToken') - ->with('sessionid') + ->with('APP-PASSWORD') ->will($this->returnValue($token)); - $session->expects($this->once()) - ->method('get') - ->with('last_login_check') - ->will($this->returnValue(1000)); $timeFactory->expects($this->once()) ->method('getTime') - ->will($this->returnValue(5000)); + ->will($this->returnValue(1000)); // more than 5min since last check $tokenProvider->expects($this->once()) ->method('getPassword') - ->with($token, 'sessionid') + ->with($token, 'APP-PASSWORD') ->will($this->returnValue('123456')); - $token->expects($this->once()) - ->method('getLoginName') - ->will($this->returnValue('User5')); $userManager->expects($this->once()) ->method('checkPassword') - ->with('User5', '123456') + ->with('susan', '123456') ->will($this->returnValue(true)); $user->expects($this->once()) ->method('isEnabled') ->will($this->returnValue(false)); - $userSession->expects($this->once()) + $this->tokenProvider->expects($this->once()) + ->method('invalidateToken') + ->with($token); + $session->expects($this->once()) ->method('logout'); + $tokenProvider->expects($this->once()) + ->method('updateToken') + ->with($token); $this->invokePrivate($userSession, 'validateSession', [$user]); } @@ -785,31 +785,31 @@ class SessionTest extends \Test\TestCase { ->getMock(); $user = $this->getMock('\OCP\IUser'); - $token = $this->getMock('\OC\Authentication\Token\IToken'); + $token = new \OC\Authentication\Token\DefaultToken(); + $token->setLastCheck(20); - $session->expects($this->once()) - ->method('getId') - ->will($this->returnValue('sessionid')); - $tokenProvider->expects($this->once()) - ->method('getToken') - ->with('sessionid') - ->will($this->returnValue($token)); $session->expects($this->once()) ->method('get') - ->with('last_login_check') - ->will($this->returnValue(1000)); + ->with('app_password') + ->will($this->returnValue('APP-PASSWORD')); + $tokenProvider->expects($this->once()) + ->method('getToken') + ->with('APP-PASSWORD') + ->will($this->returnValue($token)); $timeFactory->expects($this->once()) ->method('getTime') - ->will($this->returnValue(5000)); + ->will($this->returnValue(1000)); // more than 5min since last check $tokenProvider->expects($this->once()) ->method('getPassword') - ->with($token, 'sessionid') + ->with($token, 'APP-PASSWORD') ->will($this->throwException(new \OC\Authentication\Exceptions\PasswordlessTokenException())); - $session->expects($this->once()) - ->method('set') - ->with('last_login_check', 5000); + $tokenProvider->expects($this->once()) + ->method('updateToken') + ->with($token); $this->invokePrivate($userSession, 'validateSession', [$user]); + + $this->assertEquals(1000, $token->getLastCheck()); } } From 9d74ff02a4014d11020e21e5f73beb02bc749697 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 09:13:47 +0200 Subject: [PATCH 11/42] fix nitpick --- lib/private/User/Session.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index cd9e973e30..07235c1b42 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -454,12 +454,13 @@ class Session implements IUserSession, Emitter { } $uid = $dbToken->getUID(); + $password = ''; try { $password = $this->tokenProvider->getPassword($dbToken, $token); - $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); } catch (PasswordlessTokenException $ex) { - $this->manager->emit('\OC\User', 'preLogin', array($uid, '')); + // Ignore and use empty string instead } + $this->manager->emit('\OC\User', 'preLogin', array($uid, $password)); $user = $this->manager->get($uid); if (is_null($user)) { From 5c680848232439588a536cef02a5cc85aa994819 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 09:17:19 +0200 Subject: [PATCH 12/42] fix default token provider tests --- .../Token/DefaultTokenProviderTest.php | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php index 86f4842bbc..d0bb38e6bb 100644 --- a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php @@ -218,30 +218,4 @@ class DefaultTokenProviderTest extends TestCase { $this->tokenProvider->invalidateOldTokens(); } - public function testValidateToken() { - $token = 'sometoken'; - $dbToken = new DefaultToken(); - $this->mapper->expects($this->once()) - ->method('getToken') - ->with(hash('sha512', $token)) - ->will($this->returnValue($dbToken)); - - $actual = $this->tokenProvider->validateToken($token); - - $this->assertEquals($dbToken, $actual); - } - - /** - * @expectedException \OC\Authentication\Exceptions\InvalidTokenException - */ - public function testValidateInvalidToken() { - $token = 'sometoken'; - $this->mapper->expects($this->once()) - ->method('getToken') - ->with(hash('sha512', $token)) - ->will($this->throwException(new DoesNotExistException(''))); - - $this->tokenProvider->validateToken($token); - } - } From fb36fd495b2b97063a13239f214909011d0b1385 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 09:25:15 +0200 Subject: [PATCH 13/42] fix DefaultTokenMapperTest --- tests/lib/Authentication/Token/DefaultTokenMapperTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/lib/Authentication/Token/DefaultTokenMapperTest.php b/tests/lib/Authentication/Token/DefaultTokenMapperTest.php index 5d49f75aaa..6b73cab5ed 100644 --- a/tests/lib/Authentication/Token/DefaultTokenMapperTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenMapperTest.php @@ -63,6 +63,7 @@ class DefaultTokenMapperTest extends TestCase { 'token' => $qb->createNamedParameter('9c5a2e661482b65597408a6bb6c4a3d1af36337381872ac56e445a06cdb7fea2b1039db707545c11027a4966919918b19d875a8b774840b18c6cbb7ae56fe206'), 'type' => $qb->createNamedParameter(IToken::TEMPORARY_TOKEN), 'last_activity' => $qb->createNamedParameter($this->time - 120, IQueryBuilder::PARAM_INT), // Two minutes ago + 'last_check' => $this->time - 60 * 10, // 10mins ago ])->execute(); $qb->insert('authtoken')->values([ 'uid' => $qb->createNamedParameter('user2'), @@ -72,6 +73,7 @@ class DefaultTokenMapperTest extends TestCase { 'token' => $qb->createNamedParameter('1504445f1524fc801035448a95681a9378ba2e83930c814546c56e5d6ebde221198792fd900c88ed5ead0555780dad1ebce3370d7e154941cd5de87eb419899b'), 'type' => $qb->createNamedParameter(IToken::TEMPORARY_TOKEN), 'last_activity' => $qb->createNamedParameter($this->time - 60 * 60 * 24 * 3, IQueryBuilder::PARAM_INT), // Three days ago + 'last_check' => $this->time - 10, // 10secs ago ])->execute(); $qb->insert('authtoken')->values([ 'uid' => $qb->createNamedParameter('user1'), @@ -81,6 +83,7 @@ class DefaultTokenMapperTest extends TestCase { 'token' => $qb->createNamedParameter('47af8697ba590fb82579b5f1b3b6e8066773a62100abbe0db09a289a62f5d980dc300fa3d98b01d7228468d1ab05c1aa14c8d14bd5b6eee9cdf1ac14864680c3'), 'type' => $qb->createNamedParameter(IToken::TEMPORARY_TOKEN), 'last_activity' => $qb->createNamedParameter($this->time - 120, IQueryBuilder::PARAM_INT), // Two minutes ago + 'last_check' => $this->time - 60 * 10, // 10mins ago ])->execute(); } @@ -127,6 +130,7 @@ class DefaultTokenMapperTest extends TestCase { $token->setToken('1504445f1524fc801035448a95681a9378ba2e83930c814546c56e5d6ebde221198792fd900c88ed5ead0555780dad1ebce3370d7e154941cd5de87eb419899b'); $token->setType(IToken::TEMPORARY_TOKEN); $token->setLastActivity($this->time - 60 * 60 * 24 * 3); + $token->setLastCheck($this->time - 10); $dbToken = $this->mapper->getToken($token->getToken()); From 56199eba376e044f65e9e02844a9d98e524340b4 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 10:41:23 +0200 Subject: [PATCH 14/42] fix unit test warning/errors --- lib/private/User/Session.php | 20 +++++++++----------- tests/lib/User/SessionTest.php | 33 +++++++++++++++++---------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 07235c1b42..aedb308539 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -550,14 +550,12 @@ class Session implements IUserSession, Emitter { $pwd = $this->tokenProvider->getPassword($dbToken, $token); } catch (InvalidTokenException $ex) { // An invalid token password was used -> log user out - $this->logout(); return false; } catch (PasswordlessTokenException $ex) { // Token has no password if (!is_null($this->activeUser) && !$this->activeUser->isEnabled()) { $this->tokenProvider->invalidateToken($token); - $this->logout(); return false; } @@ -570,7 +568,6 @@ class Session implements IUserSession, Emitter { || (!is_null($this->activeUser) && !$this->activeUser->isEnabled())) { $this->tokenProvider->invalidateToken($token); // Password has changed or user was disabled -> log user out - $this->logout(); return false; } $dbToken->setLastCheck($now); @@ -613,20 +610,21 @@ class Session implements IUserSession, Emitter { if (strpos($authHeader, 'token ') === false) { // No auth header, let's try session id try { - $sessionId = $this->session->getId(); + $token = $this->session->getId(); } catch (SessionNotAvailableException $ex) { return false; } - - if (!$this->validateToken($sessionId)) { - return false; - } - - return $this->loginWithToken($sessionId); } else { $token = substr($authHeader, 6); - return $this->validateToken($token); } + + if (!$this->loginWithToken($token)) { + return false; + } + if(!$this->validateToken($token)) { + return false; + } + return true; } /** diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 974b5d3fd8..6b72cf81bc 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -151,7 +151,7 @@ class SessionTest extends \Test\TestCase { $this->tokenProvider->expects($this->once()) ->method('getToken') ->with('bar') - ->will($this->throwException('\OC\Authentication\Exceptions\InvalidTokenException')); + ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException())); $session->expects($this->exactly(2)) ->method('set') ->with($this->callback(function ($key) { @@ -698,9 +698,15 @@ class SessionTest extends \Test\TestCase { ->disableOriginalConstructor() ->getMock(); $session = new Memory(''); - $token = $this->getMock('\OC\Authentication\Token\IToken'); + $token = new \OC\Authentication\Token\DefaultToken(); + $token->setLoginName('fritz'); + $token->setUid('fritz0'); + $token->setLastCheck(100); // Needs check $user = $this->getMock('\OCP\IUser'); - $userSession = new \OC\User\Session($manager, $session, $this->timeFactory, $this->tokenProvider, $this->config); + $userSession = $this->getMockBuilder('\OC\User\Session') + ->setMethods(['logout']) + ->setConstructorArgs([$manager, $session, $this->timeFactory, $this->tokenProvider, $this->config]) + ->getMock(); $request = $this->getMock('\OCP\IRequest'); $request->expects($this->once()) @@ -708,15 +714,12 @@ class SessionTest extends \Test\TestCase { ->with('Authorization') ->will($this->returnValue('token xxxxx')); $this->tokenProvider->expects($this->once()) - ->method('validateToken') + ->method('getToken') ->with('xxxxx') ->will($this->returnValue($token)); - $token->expects($this->once()) - ->method('getUID') - ->will($this->returnValue('user123')); $manager->expects($this->once()) ->method('get') - ->with('user123') + ->with('fritz0') ->will($this->returnValue($user)); $user->expects($this->once()) ->method('isEnabled') @@ -762,16 +765,14 @@ class SessionTest extends \Test\TestCase { $user->expects($this->once()) ->method('isEnabled') ->will($this->returnValue(false)); - $this->tokenProvider->expects($this->once()) - ->method('invalidateToken') - ->with($token); - $session->expects($this->once()) - ->method('logout'); $tokenProvider->expects($this->once()) - ->method('updateToken') - ->with($token); + ->method('invalidateToken') + ->with('APP-PASSWORD'); + $userSession->expects($this->once()) + ->method('logout'); - $this->invokePrivate($userSession, 'validateSession', [$user]); + $userSession->setUser($user); + $this->invokePrivate($userSession, 'validateSession'); } public function testValidateSessionNoPassword() { From b805908dca5cd4daf9f56bc140bbed48e067d573 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 21 Jun 2016 10:23:50 +0200 Subject: [PATCH 15/42] update session token password on user password change --- .../Token/DefaultTokenProvider.php | 17 +++++ .../Authentication/Token/IProvider.php | 10 +++ lib/private/User/Session.php | 17 +++++ settings/ChangePassword/Controller.php | 1 + .../Token/DefaultTokenProviderTest.php | 33 ++++++++++ tests/lib/User/SessionTest.php | 65 +++++++++++++++++++ 6 files changed, 143 insertions(+) diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 84effc5f87..75f0fb10ba 100644 --- a/lib/private/Authentication/Token/DefaultTokenProvider.php +++ b/lib/private/Authentication/Token/DefaultTokenProvider.php @@ -150,6 +150,23 @@ class DefaultTokenProvider implements IProvider { return $this->decryptPassword($password, $tokenId); } + /** + * Encrypt and set the password of the given token + * + * @param IToken $token + * @param string $tokenId + * @param string $password + * @throws InvalidTokenException + */ + public function setPassword(IToken $token, $tokenId, $password) { + if (!($token instanceof DefaultToken)) { + throw new InvalidTokenException(); + } + /** @var DefaultToken $token */ + $token->setPassword($this->encryptPassword($password, $tokenId)); + $this->mapper->update($token); + } + /** * Invalidate (delete) the given session token * diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php index fece7dcb56..a9950dfaa4 100644 --- a/lib/private/Authentication/Token/IProvider.php +++ b/lib/private/Authentication/Token/IProvider.php @@ -99,4 +99,14 @@ interface IProvider { * @return string */ public function getPassword(IToken $token, $tokenId); + + /** + * Encrypt and set the password of the given token + * + * @param IToken $token + * @param string $tokenId + * @param string $password + * @throws InvalidTokenException + */ + public function setPassword(IToken $token, $tokenId, $password); } diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 4e9c827448..fe1835b3e5 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -676,4 +676,21 @@ class Session implements IUserSession, Emitter { setcookie('oc_remember_login', '', time() - 3600, OC::$WEBROOT . '/', '', $secureCookie, true); } + /** + * Update password of the browser session token if there is one + * + * @param string $password + */ + public function updateSessionTokenPassword($password) { + try { + $sessionId = $this->session->getId(); + $token = $this->tokenProvider->getToken($sessionId); + $this->tokenProvider->setPassword($token, $sessionId, $password); + } catch (SessionNotAvailableException $ex) { + // Nothing to do + } catch (InvalidTokenException $ex) { + // Nothing to do + } + } + } diff --git a/settings/ChangePassword/Controller.php b/settings/ChangePassword/Controller.php index 5a6c985f18..2bf743575b 100644 --- a/settings/ChangePassword/Controller.php +++ b/settings/ChangePassword/Controller.php @@ -46,6 +46,7 @@ class Controller { exit(); } if (!is_null($password) && \OC_User::setPassword($username, $password)) { + \OC::$server->getUserSession()->updateSessionTokenPassword($username, $password); \OC_JSON::success(); } else { \OC_JSON::error(); diff --git a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php index 98cee20806..d4117d877e 100644 --- a/tests/lib/Authentication/Token/DefaultTokenProviderTest.php +++ b/tests/lib/Authentication/Token/DefaultTokenProviderTest.php @@ -175,6 +175,39 @@ class DefaultTokenProviderTest extends TestCase { $tokenProvider->getPassword($tk, $token); } + public function testSetPassword() { + $token = new DefaultToken(); + $tokenId = 'token123'; + $password = '123456'; + + $this->config->expects($this->once()) + ->method('getSystemValue') + ->with('secret') + ->will($this->returnValue('ocsecret')); + $this->crypto->expects($this->once()) + ->method('encrypt') + ->with($password, $tokenId . 'ocsecret') + ->will($this->returnValue('encryptedpassword')); + $this->mapper->expects($this->once()) + ->method('update') + ->with($token); + + $this->tokenProvider->setPassword($token, $tokenId, $password); + + $this->assertEquals('encryptedpassword', $token->getPassword()); + } + + /** + * @expectedException \OC\Authentication\Exceptions\InvalidTokenException + */ + public function testSetPasswordInvalidToken() { + $token = $this->getMock('\OC\Authentication\Token\IToken'); + $tokenId = 'token123'; + $password = '123456'; + + $this->tokenProvider->setPassword($token, $tokenId, $password); + } + public function testInvalidateToken() { $this->mapper->expects($this->once()) ->method('invalidate') diff --git a/tests/lib/User/SessionTest.php b/tests/lib/User/SessionTest.php index 7a34d42a2b..4dcdc7c134 100644 --- a/tests/lib/User/SessionTest.php +++ b/tests/lib/User/SessionTest.php @@ -818,4 +818,69 @@ class SessionTest extends \Test\TestCase { $this->invokePrivate($userSession, 'validateSession', [$user]); } + public function testUpdateSessionTokenPassword() { + $userManager = $this->getMock('\OCP\IUserManager'); + $session = $this->getMock('\OCP\ISession'); + $timeFactory = $this->getMock('\OCP\AppFramework\Utility\ITimeFactory'); + $tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider'); + $userSession = new \OC\User\Session($userManager, $session, $timeFactory, $tokenProvider, $this->config); + + $password = '123456'; + $sessionId ='session1234'; + $token = new \OC\Authentication\Token\DefaultToken(); + + $session->expects($this->once()) + ->method('getId') + ->will($this->returnValue($sessionId)); + $tokenProvider->expects($this->once()) + ->method('getToken') + ->with($sessionId) + ->will($this->returnValue($token)); + $tokenProvider->expects($this->once()) + ->method('setPassword') + ->with($token, $sessionId, $password); + + $userSession->updateSessionTokenPassword($password); + } + + public function testUpdateSessionTokenPasswordNoSessionAvailable() { + $userManager = $this->getMock('\OCP\IUserManager'); + $session = $this->getMock('\OCP\ISession'); + $timeFactory = $this->getMock('\OCP\AppFramework\Utility\ITimeFactory'); + $tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider'); + $userSession = new \OC\User\Session($userManager, $session, $timeFactory, $tokenProvider, $this->config); + + $session->expects($this->once()) + ->method('getId') + ->will($this->throwException(new \OCP\Session\Exceptions\SessionNotAvailableException())); + + $userSession->updateSessionTokenPassword('1234'); + } + + public function testUpdateSessionTokenPasswordInvalidTokenException() { + $userManager = $this->getMock('\OCP\IUserManager'); + $session = $this->getMock('\OCP\ISession'); + $timeFactory = $this->getMock('\OCP\AppFramework\Utility\ITimeFactory'); + $tokenProvider = $this->getMock('\OC\Authentication\Token\IProvider'); + $userSession = new \OC\User\Session($userManager, $session, $timeFactory, $tokenProvider, $this->config); + + $password = '123456'; + $sessionId ='session1234'; + $token = new \OC\Authentication\Token\DefaultToken(); + + $session->expects($this->once()) + ->method('getId') + ->will($this->returnValue($sessionId)); + $tokenProvider->expects($this->once()) + ->method('getToken') + ->with($sessionId) + ->will($this->returnValue($token)); + $tokenProvider->expects($this->once()) + ->method('setPassword') + ->with($token, $sessionId, $password) + ->will($this->throwException(new \OC\Authentication\Exceptions\InvalidTokenException())); + + $userSession->updateSessionTokenPassword($password); + } + } From ca168265ef04c3ea1b5be468697fa4b55d1e6b38 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 21 Jun 2016 11:36:28 +0200 Subject: [PATCH 16/42] Filter out group shares for owner where owner is included (#25190) --- apps/files_sharing/lib/MountProvider.php | 5 +- .../files_sharing/tests/MountProviderTest.php | 129 ++++++++++++++++++ 2 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 apps/files_sharing/tests/MountProviderTest.php diff --git a/apps/files_sharing/lib/MountProvider.php b/apps/files_sharing/lib/MountProvider.php index a9ae48860c..c71c0e8dde 100644 --- a/apps/files_sharing/lib/MountProvider.php +++ b/apps/files_sharing/lib/MountProvider.php @@ -68,8 +68,9 @@ class MountProvider implements IMountProvider { public function getMountsForUser(IUser $user, IStorageFactory $storageFactory) { $shares = $this->shareManager->getSharedWith($user->getUID(), \OCP\Share::SHARE_TYPE_USER, null, -1); $shares = array_merge($shares, $this->shareManager->getSharedWith($user->getUID(), \OCP\Share::SHARE_TYPE_GROUP, null, -1)); - $shares = array_filter($shares, function (\OCP\Share\IShare $share) { - return $share->getPermissions() > 0; + // filter out excluded shares and group shares that includes self + $shares = array_filter($shares, function (\OCP\Share\IShare $share) use ($user) { + return $share->getPermissions() > 0 && $share->getShareOwner() !== $user->getUID(); }); $mounts = []; diff --git a/apps/files_sharing/tests/MountProviderTest.php b/apps/files_sharing/tests/MountProviderTest.php new file mode 100644 index 0000000000..993d365489 --- /dev/null +++ b/apps/files_sharing/tests/MountProviderTest.php @@ -0,0 +1,129 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\Files_Sharing\Tests; + +use OCA\Files_Sharing\MountProvider; +use OCP\Files\Storage\IStorageFactory; +use OCP\IConfig; +use OCP\IUser; +use OCP\Share\IShare; +use OCP\Share\IManager; +use OCP\Files\Mount\IMountPoint; + +class MountProviderTest extends \Test\TestCase { + + /** @var MountProvider */ + private $provider; + + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + private $config; + + /** @var IUser|\PHPUnit_Framework_MockObject_MockObject */ + private $user; + + /** @var IStorageFactory|\PHPUnit_Framework_MockObject_MockObject */ + private $loader; + + /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */ + private $shareManager; + + public function setUp() { + parent::setUp(); + + $this->config = $this->getMock('OCP\IConfig'); + $this->user = $this->getMock('OCP\IUser'); + $this->loader = $this->getMock('OCP\Files\Storage\IStorageFactory'); + $this->shareManager = $this->getMock('\OCP\Share\IManager'); + + $this->provider = new MountProvider($this->config, $this->shareManager); + } + + public function testExcludeShares() { + $share1 = $this->getMock('\OCP\Share\IShare'); + $share1->expects($this->once()) + ->method('getPermissions') + ->will($this->returnValue(0)); + + $share2 = $this->getMock('\OCP\Share\IShare'); + $share2->expects($this->once()) + ->method('getPermissions') + ->will($this->returnValue(31)); + $share2->expects($this->any()) + ->method('getShareOwner') + ->will($this->returnValue('user2')); + $share2->expects($this->any()) + ->method('getTarget') + ->will($this->returnValue('/share2')); + + $share3 = $this->getMock('\OCP\Share\IShare'); + $share3->expects($this->once()) + ->method('getPermissions') + ->will($this->returnValue(0)); + + $share4 = $this->getMock('\OCP\Share\IShare'); + $share4->expects($this->once()) + ->method('getPermissions') + ->will($this->returnValue(31)); + $share4->expects($this->any()) + ->method('getShareOwner') + ->will($this->returnValue('user2')); + $share4->expects($this->any()) + ->method('getTarget') + ->will($this->returnValue('/share4')); + + $share5 = $this->getMock('\OCP\Share\IShare'); + $share5->expects($this->once()) + ->method('getPermissions') + ->will($this->returnValue(31)); + $share5->expects($this->any()) + ->method('getShareOwner') + ->will($this->returnValue('user1')); + + $userShares = [$share1, $share2]; + $groupShares = [$share3, $share4, $share5]; + + $this->user->expects($this->any()) + ->method('getUID') + ->will($this->returnValue('user1')); + + $this->shareManager->expects($this->at(0)) + ->method('getSharedWith') + ->with('user1', \OCP\Share::SHARE_TYPE_USER) + ->will($this->returnValue($userShares)); + $this->shareManager->expects($this->at(1)) + ->method('getSharedWith') + ->with('user1', \OCP\Share::SHARE_TYPE_GROUP, null, -1) + ->will($this->returnValue($groupShares)); + + $mounts = $this->provider->getMountsForUser($this->user, $this->loader); + + $this->assertCount(2, $mounts); + $this->assertSharedMount($share1, $mounts[0]); + $this->assertSharedMount($share4, $mounts[1]); + } + + private function assertSharedMount(IShare $share, IMountPoint $mount) { + $this->assertInstanceOf('OCA\Files_Sharing\SharedMount', $mount); + $this->assertEquals($share, $mount->getShare()); + } +} + From db11c20dcb3c8848305b22dac68410864203f1e2 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 21 Jun 2016 11:54:54 +0200 Subject: [PATCH 17/42] pass new password instead of username --- settings/ChangePassword/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/ChangePassword/Controller.php b/settings/ChangePassword/Controller.php index 2bf743575b..1f3ea1b446 100644 --- a/settings/ChangePassword/Controller.php +++ b/settings/ChangePassword/Controller.php @@ -46,7 +46,7 @@ class Controller { exit(); } if (!is_null($password) && \OC_User::setPassword($username, $password)) { - \OC::$server->getUserSession()->updateSessionTokenPassword($username, $password); + \OC::$server->getUserSession()->updateSessionTokenPassword($password); \OC_JSON::success(); } else { \OC_JSON::error(); From f2f1eab7f4ade9abb77f70c6a5c3244b5c6153f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=BCller?= Date: Tue, 21 Jun 2016 13:55:11 +0200 Subject: [PATCH 18/42] fix broken unit test (#25198) --- apps/files_sharing/tests/MountProviderTest.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/files_sharing/tests/MountProviderTest.php b/apps/files_sharing/tests/MountProviderTest.php index 993d365489..f69098cde7 100644 --- a/apps/files_sharing/tests/MountProviderTest.php +++ b/apps/files_sharing/tests/MountProviderTest.php @@ -24,6 +24,7 @@ namespace OCA\Files_Sharing\Tests; use OCA\Files_Sharing\MountProvider; use OCP\Files\Storage\IStorageFactory; use OCP\IConfig; +use OCP\ILogger; use OCP\IUser; use OCP\Share\IShare; use OCP\Share\IManager; @@ -46,6 +47,9 @@ class MountProviderTest extends \Test\TestCase { /** @var IManager|\PHPUnit_Framework_MockObject_MockObject */ private $shareManager; + /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */ + private $logger; + public function setUp() { parent::setUp(); @@ -53,11 +57,13 @@ class MountProviderTest extends \Test\TestCase { $this->user = $this->getMock('OCP\IUser'); $this->loader = $this->getMock('OCP\Files\Storage\IStorageFactory'); $this->shareManager = $this->getMock('\OCP\Share\IManager'); + $this->logger = $this->getMock('\OCP\ILogger'); - $this->provider = new MountProvider($this->config, $this->shareManager); + $this->provider = new MountProvider($this->config, $this->shareManager, $this->logger); } public function testExcludeShares() { + /** @var IShare | \PHPUnit_Framework_MockObject_MockObject $share1 */ $share1 = $this->getMock('\OCP\Share\IShare'); $share1->expects($this->once()) ->method('getPermissions') @@ -79,6 +85,7 @@ class MountProviderTest extends \Test\TestCase { ->method('getPermissions') ->will($this->returnValue(0)); + /** @var IShare | \PHPUnit_Framework_MockObject_MockObject $share4 */ $share4 = $this->getMock('\OCP\Share\IShare'); $share4->expects($this->once()) ->method('getPermissions') From 1452b74de7f5a3b3afae546b757d2a3889857a61 Mon Sep 17 00:00:00 2001 From: Georg Ehrke Date: Tue, 21 Jun 2016 15:25:44 +0200 Subject: [PATCH 19/42] Contacts API: replace raw image data with url (#25081) * add uri to AddressBookImpl array * Introduce ImageExportPlugin for CardDav * add plugin to v1 routes * replace binary contact photo with link * update tests * Adding unit tests --- apps/dav/appinfo/v1/carddav.php | 1 + apps/dav/lib/AppInfo/Application.php | 3 +- apps/dav/lib/CardDAV/AddressBookImpl.php | 44 +++-- apps/dav/lib/CardDAV/CardDavBackend.php | 8 +- apps/dav/lib/CardDAV/ContactsManager.php | 14 +- apps/dav/lib/CardDAV/ImageExportPlugin.php | 146 +++++++++++++++++ apps/dav/lib/Server.php | 2 + .../unit/CardDAV/AddressBookImplTest.php | 37 +++-- .../tests/unit/CardDAV/CardDavBackendTest.php | 14 +- .../unit/CardDAV/ContactsManagerTest.php | 3 +- .../unit/CardDAV/ImageExportPluginTest.php | 151 ++++++++++++++++++ 11 files changed, 384 insertions(+), 39 deletions(-) create mode 100644 apps/dav/lib/CardDAV/ImageExportPlugin.php create mode 100644 apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php diff --git a/apps/dav/appinfo/v1/carddav.php b/apps/dav/appinfo/v1/carddav.php index 88582d64ee..fc7aff4a63 100644 --- a/apps/dav/appinfo/v1/carddav.php +++ b/apps/dav/appinfo/v1/carddav.php @@ -75,6 +75,7 @@ if ($debugging) { } $server->addPlugin(new \Sabre\CardDAV\VCFExportPlugin()); +$server->addPlugin(new \OCA\DAV\CardDAV\ImageExportPlugin(\OC::$server->getLogger())); $server->addPlugin(new ExceptionLoggerPlugin('carddav', \OC::$server->getLogger())); // And off we go! diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index de2056ebc3..b7b24ba763 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -136,7 +136,8 @@ class Application extends App { public function setupContactsProvider(IManager $contactsManager, $userID) { /** @var ContactsManager $cm */ $cm = $this->getContainer()->query('ContactsManager'); - $cm->setupContactsProvider($contactsManager, $userID); + $urlGenerator = $this->getContainer()->getServer()->getURLGenerator(); + $cm->setupContactsProvider($contactsManager, $userID, $urlGenerator); } public function registerHooks() { diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php index 310be69518..b26f81766c 100644 --- a/apps/dav/lib/CardDAV/AddressBookImpl.php +++ b/apps/dav/lib/CardDAV/AddressBookImpl.php @@ -24,6 +24,7 @@ namespace OCA\DAV\CardDAV; use OCP\Constants; use OCP\IAddressBook; +use OCP\IURLGenerator; use Sabre\VObject\Component\VCard; use Sabre\VObject\Property\Text; use Sabre\VObject\Reader; @@ -40,21 +41,27 @@ class AddressBookImpl implements IAddressBook { /** @var AddressBook */ private $addressBook; + /** @var IURLGenerator */ + private $urlGenerator; + /** * AddressBookImpl constructor. * * @param AddressBook $addressBook * @param array $addressBookInfo * @param CardDavBackend $backend + * @param IUrlGenerator $urlGenerator */ public function __construct( AddressBook $addressBook, array $addressBookInfo, - CardDavBackend $backend) { + CardDavBackend $backend, + IURLGenerator $urlGenerator) { $this->addressBook = $addressBook; $this->addressBookInfo = $addressBookInfo; $this->backend = $backend; + $this->urlGenerator = $urlGenerator; } /** @@ -83,11 +90,11 @@ class AddressBookImpl implements IAddressBook { * @since 5.0.0 */ public function search($pattern, $searchProperties, $options) { - $result = $this->backend->search($this->getKey(), $pattern, $searchProperties); + $results = $this->backend->search($this->getKey(), $pattern, $searchProperties); $vCards = []; - foreach ($result as $cardData) { - $vCards[] = $this->vCard2Array($this->readCard($cardData)); + foreach ($results as $result) { + $vCards[] = $this->vCard2Array($result['uri'], $this->readCard($result['carddata'])); } return $vCards; @@ -100,13 +107,12 @@ class AddressBookImpl implements IAddressBook { */ public function createOrUpdate($properties) { $update = false; - if (!isset($properties['UID'])) { // create a new contact + if (!isset($properties['URI'])) { // create a new contact $uid = $this->createUid(); $uri = $uid . '.vcf'; $vCard = $this->createEmptyVCard($uid); } else { // update existing contact - $uid = $properties['UID']; - $uri = $uid . '.vcf'; + $uri = $properties['URI']; $vCardData = $this->backend->getCard($this->getKey(), $uri); $vCard = $this->readCard($vCardData['carddata']); $update = true; @@ -122,7 +128,7 @@ class AddressBookImpl implements IAddressBook { $this->backend->createCard($this->getKey(), $uri, $vCard->serialize()); } - return $this->vCard2Array($vCard); + return $this->vCard2Array($uri, $vCard); } @@ -207,13 +213,31 @@ class AddressBookImpl implements IAddressBook { /** * create array with all vCard properties * + * @param string $uri * @param VCard $vCard * @return array */ - protected function vCard2Array(VCard $vCard) { - $result = []; + protected function vCard2Array($uri, VCard $vCard) { + $result = [ + 'URI' => $uri, + ]; + foreach ($vCard->children as $property) { $result[$property->name] = $property->getValue(); + if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') { + $url = $this->urlGenerator->getAbsoluteURL( + $this->urlGenerator->linkTo('', 'remote.php') . '/dav/'); + $url .= implode('/', [ + 'addressbooks', + substr($this->addressBookInfo['principaluri'], 11), //cut off 'principals/' + $this->addressBookInfo['uri'], + $uri + ]) . '?photo'; + + $result['PHOTO'] = 'VALUE=uri:' . $url; + } else { + $result[$property->name] = $property->getValue(); + } } if ($this->addressBookInfo['principaluri'] === 'principals/system/system' && $this->addressBookInfo['uri'] === 'system') { diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 3d2904df39..2ad9f4778c 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -780,7 +780,7 @@ class CardDavBackend implements BackendInterface, SyncSupport { } $query2->andWhere($query2->expr()->eq('cp.addressbookid', $query->createNamedParameter($addressBookId))); - $query->select('c.carddata')->from($this->dbCardsTable, 'c') + $query->select('c.carddata', 'c.uri')->from($this->dbCardsTable, 'c') ->where($query->expr()->in('c.id', $query->createFunction($query2->getSQL()))); $result = $query->execute(); @@ -788,8 +788,10 @@ class CardDavBackend implements BackendInterface, SyncSupport { $result->closeCursor(); - return array_map(function($array) {return $this->readBlob($array['carddata']);}, $cards); - + return array_map(function($array) { + $array['carddata'] = $this->readBlob($array['carddata']); + return $array; + }, $cards); } /** diff --git a/apps/dav/lib/CardDAV/ContactsManager.php b/apps/dav/lib/CardDAV/ContactsManager.php index 7900c6ccae..ad633483fd 100644 --- a/apps/dav/lib/CardDAV/ContactsManager.php +++ b/apps/dav/lib/CardDAV/ContactsManager.php @@ -22,6 +22,7 @@ namespace OCA\DAV\CardDAV; use OCP\Contacts\IManager; +use OCP\IURLGenerator; class ContactsManager { @@ -37,26 +38,29 @@ class ContactsManager { /** * @param IManager $cm * @param string $userId + * @param IURLGenerator $urlGenerator */ - public function setupContactsProvider(IManager $cm, $userId) { + public function setupContactsProvider(IManager $cm, $userId, IURLGenerator $urlGenerator) { $addressBooks = $this->backend->getAddressBooksForUser("principals/users/$userId"); - $this->register($cm, $addressBooks); + $this->register($cm, $addressBooks, $urlGenerator); $addressBooks = $this->backend->getAddressBooksForUser("principals/system/system"); - $this->register($cm, $addressBooks); + $this->register($cm, $addressBooks, $urlGenerator); } /** * @param IManager $cm * @param $addressBooks + * @param IURLGenerator $urlGenerator */ - private function register(IManager $cm, $addressBooks) { + private function register(IManager $cm, $addressBooks, $urlGenerator) { foreach ($addressBooks as $addressBookInfo) { $addressBook = new \OCA\DAV\CardDAV\AddressBook($this->backend, $addressBookInfo); $cm->registerAddressBook( new AddressBookImpl( $addressBook, $addressBookInfo, - $this->backend + $this->backend, + $urlGenerator ) ); } diff --git a/apps/dav/lib/CardDAV/ImageExportPlugin.php b/apps/dav/lib/CardDAV/ImageExportPlugin.php new file mode 100644 index 0000000000..3f50522249 --- /dev/null +++ b/apps/dav/lib/CardDAV/ImageExportPlugin.php @@ -0,0 +1,146 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\DAV\CardDAV; + +use OCP\ILogger; +use Sabre\CardDAV\Card; +use Sabre\DAV\Server; +use Sabre\DAV\ServerPlugin; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; +use Sabre\VObject\Parameter; +use Sabre\VObject\Property\Binary; +use Sabre\VObject\Reader; + +class ImageExportPlugin extends ServerPlugin { + + /** @var Server */ + protected $server; + /** @var ILogger */ + private $logger; + + public function __construct(ILogger $logger) { + $this->logger = $logger; + } + + /** + * Initializes the plugin and registers event handlers + * + * @param Server $server + * @return void + */ + function initialize(Server $server) { + + $this->server = $server; + $this->server->on('method:GET', [$this, 'httpGet'], 90); + } + + /** + * Intercepts GET requests on addressbook urls ending with ?photo. + * + * @param RequestInterface $request + * @param ResponseInterface $response + * @return bool|void + */ + function httpGet(RequestInterface $request, ResponseInterface $response) { + + $queryParams = $request->getQueryParameters(); + // TODO: in addition to photo we should also add logo some point in time + if (!array_key_exists('photo', $queryParams)) { + return true; + } + + $path = $request->getPath(); + $node = $this->server->tree->getNodeForPath($path); + + if (!($node instanceof Card)) { + return true; + } + + $this->server->transactionType = 'carddav-image-export'; + + // Checking ACL, if available. + if ($aclPlugin = $this->server->getPlugin('acl')) { + /** @var \Sabre\DAVACL\Plugin $aclPlugin */ + $aclPlugin->checkPrivileges($path, '{DAV:}read'); + } + + if ($result = $this->getPhoto($node)) { + $response->setHeader('Content-Type', $result['Content-Type']); + $response->setStatus(200); + + $response->setBody($result['body']); + + // Returning false to break the event chain + return false; + } + return true; + } + + function getPhoto(Card $node) { + // TODO: this is kind of expensive - load carddav data from database and parse it + // we might want to build up a cache one day + try { + $vObject = $this->readCard($node->get()); + if (!$vObject->PHOTO) { + return false; + } + + $photo = $vObject->PHOTO; + $type = $this->getType($photo); + + $valType = $photo->getValueType(); + $val = ($valType === 'URI' ? $photo->getRawMimeDirValue() : $photo->getValue()); + return [ + 'Content-Type' => $type, + 'body' => $val + ]; + } catch(\Exception $ex) { + $this->logger->logException($ex); + } + return false; + } + + private function readCard($cardData) { + return Reader::read($cardData); + } + + /** + * @param Binary $photo + * @return Parameter + */ + private function getType($photo) { + $params = $photo->parameters(); + if (isset($params['TYPE']) || isset($params['MEDIATYPE'])) { + /** @var Parameter $typeParam */ + $typeParam = isset($params['TYPE']) ? $params['TYPE'] : $params['MEDIATYPE']; + $type = $typeParam->getValue(); + + if (strpos($type, 'image/') === 0) { + return $type; + } else { + return 'image/' . strtolower($type); + } + } + return ''; + } +} diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index e150f441b8..7fa1b13783 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -25,6 +25,7 @@ namespace OCA\DAV; use OCA\DAV\CalDAV\Schedule\IMipPlugin; +use OCA\DAV\CardDAV\ImageExportPlugin; use OCA\DAV\Connector\Sabre\Auth; use OCA\DAV\Connector\Sabre\BlockLegacyClientPlugin; use OCA\DAV\Connector\Sabre\DavAclPlugin; @@ -103,6 +104,7 @@ class Server { // addressbook plugins $this->server->addPlugin(new \OCA\DAV\CardDAV\Plugin()); $this->server->addPlugin(new VCFExportPlugin()); + $this->server->addPlugin(new ImageExportPlugin(\OC::$server->getLogger())); // system tags plugins $this->server->addPlugin(new \OCA\DAV\SystemTag\SystemTagPlugin( diff --git a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php index ddfec3dc3a..4ccc841157 100644 --- a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php +++ b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php @@ -43,6 +43,9 @@ class AddressBookImplTest extends TestCase { /** @var AddressBook | \PHPUnit_Framework_MockObject_MockObject */ private $addressBook; + /** @var \OCP\IURLGenerator | \PHPUnit_Framework_MockObject_MockObject */ + private $urlGenerator; + /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject */ private $backend; @@ -61,11 +64,13 @@ class AddressBookImplTest extends TestCase { $this->backend = $this->getMockBuilder('\OCA\DAV\CardDAV\CardDavBackend') ->disableOriginalConstructor()->getMock(); $this->vCard = $this->getMock('Sabre\VObject\Component\VCard'); + $this->urlGenerator = $this->getMock('OCP\IURLGenerator'); $this->addressBookImpl = new AddressBookImpl( $this->addressBook, $this->addressBookInfo, - $this->backend + $this->backend, + $this->urlGenerator ); } @@ -87,7 +92,8 @@ class AddressBookImplTest extends TestCase { [ $this->addressBook, $this->addressBookInfo, - $this->backend + $this->backend, + $this->urlGenerator, ] ) ->setMethods(['vCard2Array', 'readCard']) @@ -100,15 +106,18 @@ class AddressBookImplTest extends TestCase { ->with($this->addressBookInfo['id'], $pattern, $searchProperties) ->willReturn( [ - 'cardData1', - 'cardData2' + ['uri' => 'foo.vcf', 'carddata' => 'cardData1'], + ['uri' => 'bar.vcf', 'carddata' => 'cardData2'] ] ); $addressBookImpl->expects($this->exactly(2))->method('readCard') ->willReturn($this->vCard); $addressBookImpl->expects($this->exactly(2))->method('vCard2Array') - ->with($this->vCard)->willReturn('vCard'); + ->withConsecutive( + ['foo.vcf', $this->vCard], + ['bar.vcf', $this->vCard] + )->willReturn('vCard'); $result = $addressBookImpl->search($pattern, $searchProperties, []); $this->assertTrue((is_array($result))); @@ -130,7 +139,8 @@ class AddressBookImplTest extends TestCase { [ $this->addressBook, $this->addressBookInfo, - $this->backend + $this->backend, + $this->urlGenerator, ] ) ->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard']) @@ -146,7 +156,7 @@ class AddressBookImplTest extends TestCase { $this->backend->expects($this->never())->method('updateCard'); $this->backend->expects($this->never())->method('getCard'); $addressBookImpl->expects($this->once())->method('vCard2Array') - ->with($this->vCard)->willReturn(true); + ->with('uid.vcf', $this->vCard)->willReturn(true); $this->assertTrue($addressBookImpl->createOrUpdate($properties)); } @@ -161,7 +171,8 @@ class AddressBookImplTest extends TestCase { public function testUpdate() { $uid = 'uid'; - $properties = ['UID' => $uid, 'FN' => 'John Doe']; + $uri = 'bla.vcf'; + $properties = ['URI' => $uri, 'UID' => $uid, 'FN' => 'John Doe']; /** @var \PHPUnit_Framework_MockObject_MockObject | AddressBookImpl $addressBookImpl */ $addressBookImpl = $this->getMockBuilder('OCA\DAV\CardDAV\AddressBookImpl') @@ -169,7 +180,8 @@ class AddressBookImplTest extends TestCase { [ $this->addressBook, $this->addressBookInfo, - $this->backend + $this->backend, + $this->urlGenerator, ] ) ->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard', 'readCard']) @@ -178,7 +190,7 @@ class AddressBookImplTest extends TestCase { $addressBookImpl->expects($this->never())->method('createUid'); $addressBookImpl->expects($this->never())->method('createEmptyVCard'); $this->backend->expects($this->once())->method('getCard') - ->with($this->addressBookInfo['id'], $uid . '.vcf') + ->with($this->addressBookInfo['id'], $uri) ->willReturn(['carddata' => 'data']); $addressBookImpl->expects($this->once())->method('readCard') ->with('data')->willReturn($this->vCard); @@ -187,7 +199,7 @@ class AddressBookImplTest extends TestCase { $this->backend->expects($this->never())->method('createCard'); $this->backend->expects($this->once())->method('updateCard'); $addressBookImpl->expects($this->once())->method('vCard2Array') - ->with($this->vCard)->willReturn(true); + ->with($uri, $this->vCard)->willReturn(true); $this->assertTrue($addressBookImpl->createOrUpdate($properties)); } @@ -251,7 +263,8 @@ class AddressBookImplTest extends TestCase { [ $this->addressBook, $this->addressBookInfo, - $this->backend + $this->backend, + $this->urlGenerator, ] ) ->setMethods(['getUid']) diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index c7cd4a3005..58a93befe6 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -535,8 +535,8 @@ class CardDavBackendTest extends TestCase { $found = []; foreach ($result as $r) { foreach ($expected as $exp) { - if (strpos($r, $exp) > 0) { - $found[$exp] = true; + if ($r['uri'] === $exp[0] && strpos($r['carddata'], $exp[1]) > 0) { + $found[$exp[1]] = true; break; } } @@ -547,11 +547,11 @@ class CardDavBackendTest extends TestCase { public function dataTestSearch() { return [ - ['John', ['FN'], ['John Doe', 'John M. Doe']], - ['M. Doe', ['FN'], ['John M. Doe']], - ['Do', ['FN'], ['John Doe', 'John M. Doe']], - 'check if duplicates are handled correctly' => ['John', ['FN', 'CLOUD'], ['John Doe', 'John M. Doe']], - 'case insensitive' => ['john', ['FN'], ['John Doe', 'John M. Doe']] + ['John', ['FN'], [['uri0', 'John Doe'], ['uri1', 'John M. Doe']]], + ['M. Doe', ['FN'], [['uri1', 'John M. Doe']]], + ['Do', ['FN'], [['uri0', 'John Doe'], ['uri1', 'John M. Doe']]], + 'check if duplicates are handled correctly' => ['John', ['FN', 'CLOUD'], [['uri0', 'John Doe'], ['uri1', 'John M. Doe']]], + 'case insensitive' => ['john', ['FN'], [['uri0', 'John Doe'], ['uri1', 'John M. Doe']]] ]; } diff --git a/apps/dav/tests/unit/CardDAV/ContactsManagerTest.php b/apps/dav/tests/unit/CardDAV/ContactsManagerTest.php index 2abd9da66e..23a49a1962 100644 --- a/apps/dav/tests/unit/CardDAV/ContactsManagerTest.php +++ b/apps/dav/tests/unit/CardDAV/ContactsManagerTest.php @@ -32,6 +32,7 @@ class ContactsManagerTest extends TestCase { /** @var IManager | \PHPUnit_Framework_MockObject_MockObject $cm */ $cm = $this->getMockBuilder('OCP\Contacts\IManager')->disableOriginalConstructor()->getMock(); $cm->expects($this->exactly(2))->method('registerAddressBook'); + $urlGenerator = $this->getMockBuilder('OCP\IUrlGenerator')->disableOriginalConstructor()->getMock(); /** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $backEnd */ $backEnd = $this->getMockBuilder('OCA\DAV\CardDAV\CardDavBackend')->disableOriginalConstructor()->getMock(); $backEnd->method('getAddressBooksForUser')->willReturn([ @@ -39,6 +40,6 @@ class ContactsManagerTest extends TestCase { ]); $app = new ContactsManager($backEnd); - $app->setupContactsProvider($cm, 'user01'); + $app->setupContactsProvider($cm, 'user01', $urlGenerator); } } diff --git a/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php new file mode 100644 index 0000000000..8583df0b6f --- /dev/null +++ b/apps/dav/tests/unit/CardDAV/ImageExportPluginTest.php @@ -0,0 +1,151 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Tests\unit\CardDAV; + + +use OCA\DAV\CardDAV\ImageExportPlugin; +use OCP\ILogger; +use Sabre\CardDAV\Card; +use Sabre\DAV\Server; +use Sabre\DAV\Tree; +use Sabre\HTTP\RequestInterface; +use Sabre\HTTP\ResponseInterface; +use Test\TestCase; + +class ImageExportPluginTest extends TestCase { + + /** @var ResponseInterface | \PHPUnit_Framework_MockObject_MockObject */ + private $response; + /** @var RequestInterface | \PHPUnit_Framework_MockObject_MockObject */ + private $request; + /** @var ImageExportPlugin | \PHPUnit_Framework_MockObject_MockObject */ + private $plugin; + /** @var Server */ + private $server; + /** @var Tree | \PHPUnit_Framework_MockObject_MockObject */ + private $tree; + /** @var ILogger | \PHPUnit_Framework_MockObject_MockObject */ + private $logger; + + function setUp() { + parent::setUp(); + + $this->request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')->getMock(); + $this->response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')->getMock(); + $this->server = $this->getMockBuilder('Sabre\DAV\Server')->getMock(); + $this->tree = $this->getMockBuilder('Sabre\DAV\Tree')->disableOriginalConstructor()->getMock(); + $this->server->tree = $this->tree; + $this->logger = $this->getMockBuilder('\OCP\ILogger')->getMock(); + + $this->plugin = $this->getMock('OCA\DAV\CardDAV\ImageExportPlugin', ['getPhoto'], [$this->logger]); + $this->plugin->initialize($this->server); + } + + /** + * @dataProvider providesQueryParams + * @param $param + */ + public function testQueryParams($param) { + $this->request->expects($this->once())->method('getQueryParameters')->willReturn($param); + $result = $this->plugin->httpGet($this->request, $this->response); + $this->assertTrue($result); + } + + public function providesQueryParams() { + return [ + [[]], + [['1']], + [['foo' => 'bar']], + ]; + } + + public function testNotACard() { + $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); + $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); + $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn(null); + $result = $this->plugin->httpGet($this->request, $this->response); + $this->assertTrue($result); + } + + /** + * @dataProvider providesCardWithOrWithoutPhoto + * @param bool $expected + * @param array $getPhotoResult + */ + public function testCardWithOrWithoutPhoto($expected, $getPhotoResult) { + $this->request->expects($this->once())->method('getQueryParameters')->willReturn(['photo' => true]); + $this->request->expects($this->once())->method('getPath')->willReturn('/files/welcome.txt'); + + $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); + $this->tree->expects($this->once())->method('getNodeForPath')->with('/files/welcome.txt')->willReturn($card); + + $this->plugin->expects($this->once())->method('getPhoto')->willReturn($getPhotoResult); + + if (!$expected) { + $this->response->expects($this->once())->method('setHeader'); + $this->response->expects($this->once())->method('setStatus'); + $this->response->expects($this->once())->method('setBody'); + } + + $result = $this->plugin->httpGet($this->request, $this->response); + $this->assertEquals($expected, $result); + } + + public function providesCardWithOrWithoutPhoto() { + return [ + [true, null], + [false, ['Content-Type' => 'image/jpeg', 'body' => '1234']], + ]; + } + + /** + * @dataProvider providesPhotoData + * @param $expected + * @param $cardData + */ + public function testGetPhoto($expected, $cardData) { + /** @var Card | \PHPUnit_Framework_MockObject_MockObject $card */ + $card = $this->getMockBuilder('Sabre\CardDAV\Card')->disableOriginalConstructor()->getMock(); + $card->expects($this->once())->method('get')->willReturn($cardData); + + $this->plugin = new ImageExportPlugin($this->logger); + $this->plugin->initialize($this->server); + + $result = $this->plugin->getPhoto($card); + $this->assertEquals($expected, $result); + } + + public function providesPhotoData() { + return [ + 'empty vcard' => [false, ''], + 'vcard without PHOTO' => [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n"], + 'vcard 3 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n"], + // + // TODO: these three below are not working - needs debugging + // + //'vcard 3 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG:http://example.org/photo.jpg\r\nEND:VCARD\r\n"], + //'vcard 4 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;MTIzNDU=\r\nEND:VCARD\r\n"], + 'vcard 4 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => 'http://example.org/photo.jpg'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n"], + ]; + } +} From 7f22aeb5d6779236efec72cdb6bb8703dd7c0ee1 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 21 Jun 2016 16:14:51 +0200 Subject: [PATCH 20/42] redirect to new login route (#25099) * redirect to new login route * encode anchor in url and restore it client-side --- lib/private/legacy/util.php | 11 ++++++----- settings/js/personal.js | 11 +++++++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php index 65d00c1638..78445dab02 100644 --- a/lib/private/legacy/util.php +++ b/lib/private/legacy/util.php @@ -962,11 +962,12 @@ class OC_Util { public static function checkLoggedIn() { // Check if we are a user if (!OC_User::isLoggedIn()) { - header('Location: ' . \OCP\Util::linkToAbsolute('', 'index.php', - [ - 'redirect_url' => \OC::$server->getRequest()->getRequestUri() - ] - ) + header('Location: ' . \OC::$server->getURLGenerator()->linkToRoute( + 'core.login.showLoginForm', + [ + 'redirect_url' => urlencode(\OC::$server->getRequest()->getRequestUri()), + ] + ) ); exit(); } diff --git a/settings/js/personal.js b/settings/js/personal.js index aea2400e99..73d65034d9 100644 --- a/settings/js/personal.js +++ b/settings/js/personal.js @@ -368,6 +368,17 @@ $(document).ready(function () { collection: collection }); view.reload(); + + // 'redirect' to anchor sections + // anchors are lost on redirects (e.g. while solving the 2fa challenge) otherwise + // example: /settings/person?section=devices will result in /settings/person?#devices + if (!window.location.hash) { + var query = OC.parseQueryString(location.search); + if (query && query.section) { + OC.Util.History.replaceState({}); + window.location.hash = query.section; + } + } }); if (!OC.Encryption) { From 704a993e37fc02b4dda0f0e683af4c9572ed51c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Tue, 21 Jun 2016 16:30:48 +0200 Subject: [PATCH 21/42] Fix null pointer exception in user_ldap (#25062) --- apps/user_ldap/lib/Access.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/user_ldap/lib/Access.php b/apps/user_ldap/lib/Access.php index daeb7d942a..4d0753696f 100644 --- a/apps/user_ldap/lib/Access.php +++ b/apps/user_ldap/lib/Access.php @@ -732,7 +732,14 @@ class Access extends LDAPUtility implements IUserTools { $user->unmark(); $user = $this->userManager->get($ocName); } - $user->processAttributes($userRecord); + if ($user !== null) { + $user->processAttributes($userRecord); + } else { + \OC::$server->getLogger()->debug( + "The ldap user manager returned null for $ocName", + ['app'=>'user_ldap'] + ); + } } } From 31f3aaa36b8ae5a06b7319f2036e6fb7c509c281 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 10:54:03 +0200 Subject: [PATCH 22/42] app passwords/device tokens wording --- settings/css/settings.css | 14 ++++++------- settings/js/authtoken_view.js | 36 ++++++++++++++++----------------- settings/personal.php | 2 +- settings/templates/personal.php | 20 +++++++++--------- 4 files changed, 36 insertions(+), 36 deletions(-) diff --git a/settings/css/settings.css b/settings/css/settings.css index 04538558ca..e4ddec9152 100644 --- a/settings/css/settings.css +++ b/settings/css/settings.css @@ -101,24 +101,24 @@ table.nostyle label { margin-right: 2em; } table.nostyle td { padding: 0.2em 0; } #sessions table, -#devices table { +#apppasswords table { width: 100%; min-height: 150px; padding-top: 25px; } #sessions table th, -#devices table th { +#apppasswords table th { font-weight: 800; } #sessions table th, #sessions table td, -#devices table th, -#devices table td { +#apppasswords table th, +#apppasswords table td { padding: 10px; } #sessions .token-list td, -#devices .token-list td { +#apppasswords .token-list td { border-top: 1px solid #DDD; text-overflow: ellipsis; max-width: 200px; @@ -126,12 +126,12 @@ table.nostyle td { padding: 0.2em 0; } overflow: hidden; } #sessions .token-list td a.icon-delete, -#devices .token-list td a.icon-delete { +#apppasswords .token-list td a.icon-delete { display: block; opacity: 0.6; } -#device-new-token { +#new-app-password { width: 186px; font-family: monospace; background-color: lightyellow; diff --git a/settings/js/authtoken_view.js b/settings/js/authtoken_view.js index b1906f0b33..da5861689a 100644 --- a/settings/js/authtoken_view.js +++ b/settings/js/authtoken_view.js @@ -103,13 +103,13 @@ _tokenName: undefined, - _addTokenBtn: undefined, + _addAppPasswordBtn: undefined, _result: undefined, - _newToken: undefined, + _newAppPassword: undefined, - _hideTokenBtn: undefined, + _hideAppPasswordBtn: undefined, _addingToken: false, @@ -119,7 +119,7 @@ var tokenTypes = [0, 1]; var _this = this; _.each(tokenTypes, function(type) { - var el = type === 0 ? '#sessions' : '#devices'; + var el = type === 0 ? '#sessions' : '#apppasswords'; _this._views.push(new SubView({ el: el, type: type, @@ -130,16 +130,16 @@ $el.on('click', 'a.icon-delete', _.bind(_this._onDeleteToken, _this)); }); - this._form = $('#device-token-form'); - this._tokenName = $('#device-token-name'); - this._addTokenBtn = $('#device-add-token'); - this._addTokenBtn.click(_.bind(this._addDeviceToken, this)); + this._form = $('#app-password-form'); + this._tokenName = $('#app-password-name'); + this._addAppPasswordBtn = $('#add-app-password'); + this._addAppPasswordBtn.click(_.bind(this._addAppPassword, this)); - this._result = $('#device-token-result'); - this._newToken = $('#device-new-token'); - this._newToken.on('focus', _.bind(this._onNewTokenFocus, this)); - this._hideTokenBtn = $('#device-token-hide'); - this._hideTokenBtn.click(_.bind(this._hideToken, this)); + this._result = $('#app-password-result'); + this._newAppPassword = $('#new-app-password'); + this._newAppPassword.on('focus', _.bind(this._onNewTokenFocus, this)); + this._hideAppPasswordBtn = $('#app-password-hide'); + this._hideAppPasswordBtn.click(_.bind(this._hideToken, this)); }, render: function() { @@ -166,7 +166,7 @@ }); }, - _addDeviceToken: function() { + _addAppPassword: function() { var _this = this; this._toggleAddingToken(true); @@ -181,9 +181,9 @@ $.when(creatingToken).done(function(resp) { _this.collection.add(resp.deviceToken); _this.render(); - _this._newToken.val(resp.token); + _this._newAppPassword.val(resp.token); _this._toggleFormResult(false); - _this._newToken.select(); + _this._newAppPassword.select(); _this._tokenName.val(''); }); $.when(creatingToken).fail(function() { @@ -195,7 +195,7 @@ }, _onNewTokenFocus: function() { - this._newToken.select(); + this._newAppPassword.select(); }, _hideToken: function() { @@ -204,7 +204,7 @@ _toggleAddingToken: function(state) { this._addingToken = state; - this._addTokenBtn.toggleClass('icon-loading-small', state); + this._addAppPasswordBtn.toggleClass('icon-loading-small', state); }, _onDeleteToken: function(event) { diff --git a/settings/personal.php b/settings/personal.php index 0b2781fb21..e7a928f88b 100644 --- a/settings/personal.php +++ b/settings/personal.php @@ -177,7 +177,7 @@ $tmpl->assign('groups', $groups2); $formsAndMore = []; $formsAndMore[]= ['anchor' => 'avatar', 'section-name' => $l->t('Personal info')]; $formsAndMore[]= ['anchor' => 'sessions', 'section-name' => $l->t('Sessions')]; -$formsAndMore[]= ['anchor' => 'devices', 'section-name' => $l->t('Devices')]; +$formsAndMore[]= ['anchor' => 'apppasswords', 'section-name' => $l->t('App passwords')]; $formsAndMore[]= ['anchor' => 'clientsbox', 'section-name' => $l->t('Sync clients')]; $forms=OC_App::getForms('personal'); diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 942944ffab..1ba7026cd0 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -183,9 +183,9 @@ if($_['passwordChangeSupported']) {
-
-

t('Devices'));?>

- t("You've linked these devices."));?> +
+

t('App passwords'));?>

+ t("You've linked these apps."));?> @@ -197,14 +197,14 @@ if($_['passwordChangeSupported']) {
-

t('A device password is a passcode that gives an app or device permissions to access your ownCloud account.'));?>

-
- - +

t('An app password is a passcode that gives an app or device permissions to access your ownCloud account.'));?>

+
+ +
- From 2c1db51e7cd0dc707d63950df1f06c929f7c4012 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 11:01:16 +0200 Subject: [PATCH 23/42] fix tranlations --- settings/templates/personal.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/settings/templates/personal.php b/settings/templates/personal.php index 1ba7026cd0..bad2d4a666 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -199,12 +199,12 @@ if($_['passwordChangeSupported']) {

t('An app password is a passcode that gives an app or device permissions to access your ownCloud account.'));?>

- - + +
From 178fa11ec15be6aa9c2bf606487d3f871158cba3 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 16 Jun 2016 11:59:09 +0200 Subject: [PATCH 24/42] use theme name instead of hard-coded 'ownCloud' --- settings/templates/personal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings/templates/personal.php b/settings/templates/personal.php index bad2d4a666..b9b8429d94 100644 --- a/settings/templates/personal.php +++ b/settings/templates/personal.php @@ -197,7 +197,7 @@ if($_['passwordChangeSupported']) { -

t('An app password is a passcode that gives an app or device permissions to access your ownCloud account.'));?>

+

t('An app password is a passcode that gives an app or device permissions to access your %s account.', [$theme->getName()]));?>

From c8b7a059b4b8ae9a72d7be36f7e42fefbb130d35 Mon Sep 17 00:00:00 2001 From: karakayasemi Date: Tue, 21 Jun 2016 17:10:52 +0200 Subject: [PATCH 25/42] Fire hooks for mkdir for folder upload fromTmpFile function, usual mkdir call is only working for file's parent directory. Does not care upper parent folders. I added a recursive function that creates parent non-existing folders with usual mkdir. --- lib/private/Files/View.php | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index e9daa12347..31549c93cb 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -998,7 +998,10 @@ class View { // Create the directories if any if (!$this->file_exists($filePath)) { - $this->mkdir($filePath); + $result = $this->createParentDirectories($filePath); + if($result === false) { + return false; + } } $source = fopen($tmpFile, 'r'); @@ -2107,4 +2110,22 @@ class View { } return [$uid, $filename]; } + + /** + * Creates parent non-existing folders + * + * @param string $filePath + * @return bool + */ + private function createParentDirectories($filePath) { + $parentDirectory = dirname($filePath); + while(!$this->file_exists($parentDirectory)) { + $result = $this->createParentDirectories($parentDirectory); + if($result === false) { + return false; + } + } + $this->mkdir($filePath); + return true; + } } From b85bcccc09746137dd6fed78629b5bce45cebe01 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Wed, 22 Jun 2016 01:54:55 -0400 Subject: [PATCH 26/42] [tx-robot] updated from transifex --- apps/comments/l10n/lb.js | 3 ++- apps/comments/l10n/lb.json | 3 ++- apps/encryption/l10n/sv.js | 6 ++++- apps/encryption/l10n/sv.json | 6 ++++- apps/files/l10n/lb.js | 2 ++ apps/files/l10n/lb.json | 2 ++ apps/files/l10n/sv.js | 11 ++++++++ apps/files/l10n/sv.json | 11 ++++++++ apps/files_external/l10n/lb.js | 1 + apps/files_external/l10n/lb.json | 1 + apps/files_external/l10n/sv.js | 1 + apps/files_external/l10n/sv.json | 1 + apps/files_sharing/l10n/lb.js | 1 + apps/files_sharing/l10n/lb.json | 1 + apps/updatenotification/l10n/lb.js | 15 +++++++++++ apps/updatenotification/l10n/lb.json | 13 ++++++++++ apps/user_ldap/l10n/lb.js | 39 +++++++++++++++++++++++++++- apps/user_ldap/l10n/lb.json | 39 +++++++++++++++++++++++++++- core/l10n/lb.js | 1 + core/l10n/lb.json | 1 + core/l10n/sv.js | 1 + core/l10n/sv.json | 1 + settings/l10n/lb.js | 7 ++++- settings/l10n/lb.json | 7 ++++- settings/l10n/sv.js | 6 +++-- settings/l10n/sv.json | 6 +++-- 26 files changed, 174 insertions(+), 12 deletions(-) create mode 100644 apps/updatenotification/l10n/lb.js create mode 100644 apps/updatenotification/l10n/lb.json diff --git a/apps/comments/l10n/lb.js b/apps/comments/l10n/lb.js index f63640ac6f..d7f8c5884a 100644 --- a/apps/comments/l10n/lb.js +++ b/apps/comments/l10n/lb.js @@ -2,6 +2,7 @@ OC.L10N.register( "comments", { "Cancel" : "Ofbriechen", - "Save" : "Späicheren" + "Save" : "Späicheren", + "Comment" : "Kommentar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/comments/l10n/lb.json b/apps/comments/l10n/lb.json index c015c4dd2a..bfa307a7e8 100644 --- a/apps/comments/l10n/lb.json +++ b/apps/comments/l10n/lb.json @@ -1,5 +1,6 @@ { "translations": { "Cancel" : "Ofbriechen", - "Save" : "Späicheren" + "Save" : "Späicheren", + "Comment" : "Kommentar" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/encryption/l10n/sv.js b/apps/encryption/l10n/sv.js index b8541cfbb2..2e00f5d35f 100644 --- a/apps/encryption/l10n/sv.js +++ b/apps/encryption/l10n/sv.js @@ -20,7 +20,7 @@ OC.L10N.register( "Could not update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln", "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.", "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.", - "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.", + "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (ownCloud <= 8.0) till den nya. Kör 'occ encryption:migrate' eller kontakta din administratör", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ogiltig privat nyckel i krypteringsprogrammet. Vänligen uppdatera lösenordet till din privata nyckel under dina personliga inställningar för att återfå tillgång till dina krypterade filer.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", @@ -30,8 +30,11 @@ OC.L10N.register( "one-time password for server-side-encryption" : "engångslösenord för kryptering på serversidan", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Filen kan inte läsas, troligtvis är det en delad fil. Be ägaren av filen att dela den med dig igen.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hej,\n\nadministratören har aktiverat kryptering på servern. Dina filer har krypterats med lösenordet '%s'.\n\nVänligen logga in i webbgränssnittet, gå till \"ownCloud baskrypteringsmodul\" i dina personliga inställningar och uppdatera ditt krypteringslösenord genom att mata in det här lösenordet i fältet \"gamla inloggningslösenordet\" och ditt nuvarande inloggningslösenord.\n\n", "The share will expire on %s." : "Utdelningen kommer att upphöra %s.", "Cheers!" : "Ha de fint!", + "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Hej,

administratören har aktiverat kryptering på servern. Dina filer har krypterats med lösenordet %s.

Vänligen logga in i webbgränssnittet, gå till \"ownCloud baskrypteringsmodul\" i dina personliga inställningar och uppdatera ditt krypteringslösenord genom att mata in det här lösenordet i fältet \"gamla inloggningslösenordet\" och ditt nuvarande inloggningslösenord.

", + "Encrypt the home storage" : "Kryptera hemmalagringen", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras", "Enable recovery key" : "Aktivera återställningsnyckel", "Disable recovery key" : "Inaktivera återställningsnyckel", @@ -43,6 +46,7 @@ OC.L10N.register( "New recovery key password" : "Nytt lösenord för återställningsnyckeln", "Repeat new recovery key password" : "Upprepa nytt lösenord för återställningsnyckeln", "Change Password" : "Byt lösenord", + "ownCloud basic encryption module" : "ownCloud baskrypteringsmodul", "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.", "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord till ditt aktuella inloggningslösenord:", " If you don't remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.", diff --git a/apps/encryption/l10n/sv.json b/apps/encryption/l10n/sv.json index 9a6919b488..b06c1bc918 100644 --- a/apps/encryption/l10n/sv.json +++ b/apps/encryption/l10n/sv.json @@ -18,7 +18,7 @@ "Could not update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln", "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.", "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.", - "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.", + "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades.", "You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please run 'occ encryption:migrate' or contact your administrator" : "Du behöver migrera dina krypteringsnycklar från den gamla krypteringen (ownCloud <= 8.0) till den nya. Kör 'occ encryption:migrate' eller kontakta din administratör", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ogiltig privat nyckel i krypteringsprogrammet. Vänligen uppdatera lösenordet till din privata nyckel under dina personliga inställningar för att återfå tillgång till dina krypterade filer.", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", @@ -28,8 +28,11 @@ "one-time password for server-side-encryption" : "engångslösenord för kryptering på serversidan", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Filen kan inte läsas, troligtvis är det en delad fil. Be ägaren av filen att dela den med dig igen.", + "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'ownCloud basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hej,\n\nadministratören har aktiverat kryptering på servern. Dina filer har krypterats med lösenordet '%s'.\n\nVänligen logga in i webbgränssnittet, gå till \"ownCloud baskrypteringsmodul\" i dina personliga inställningar och uppdatera ditt krypteringslösenord genom att mata in det här lösenordet i fältet \"gamla inloggningslösenordet\" och ditt nuvarande inloggningslösenord.\n\n", "The share will expire on %s." : "Utdelningen kommer att upphöra %s.", "Cheers!" : "Ha de fint!", + "Hey there,

the admin enabled server-side-encryption. Your files were encrypted using the password %s.

Please login to the web interface, go to the section \"ownCloud basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.

" : "Hej,

administratören har aktiverat kryptering på servern. Dina filer har krypterats med lösenordet %s.

Vänligen logga in i webbgränssnittet, gå till \"ownCloud baskrypteringsmodul\" i dina personliga inställningar och uppdatera ditt krypteringslösenord genom att mata in det här lösenordet i fältet \"gamla inloggningslösenordet\" och ditt nuvarande inloggningslösenord.

", + "Encrypt the home storage" : "Kryptera hemmalagringen", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Aktivering av det här alternativet krypterar alla filer som är lagrade på huvudlagringsplatsen, annars kommer bara filer på extern lagringsplats att krypteras", "Enable recovery key" : "Aktivera återställningsnyckel", "Disable recovery key" : "Inaktivera återställningsnyckel", @@ -41,6 +44,7 @@ "New recovery key password" : "Nytt lösenord för återställningsnyckeln", "Repeat new recovery key password" : "Upprepa nytt lösenord för återställningsnyckeln", "Change Password" : "Byt lösenord", + "ownCloud basic encryption module" : "ownCloud baskrypteringsmodul", "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.", "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord till ditt aktuella inloggningslösenord:", " If you don't remember your old password you can ask your administrator to recover your files." : "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.", diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 30a86b000b..d7888f9f19 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -9,11 +9,13 @@ OC.L10N.register( "Missing a temporary folder" : "Et feelt en temporären Dossier", "Failed to write to disk" : "Konnt net op den Disk schreiwen", "Files" : "Dateien", + "All files" : "All d'Fichieren", "Home" : "Doheem", "Close" : "Zoumaachen", "Favorites" : "Favoriten", "Upload cancelled." : "Upload ofgebrach.", "Uploading..." : "Lueden erop...", + "..." : "...", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", "Download" : "Download", "Rename" : "Ëmbenennen", diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index 99a6b4845d..a736e06570 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -7,11 +7,13 @@ "Missing a temporary folder" : "Et feelt en temporären Dossier", "Failed to write to disk" : "Konnt net op den Disk schreiwen", "Files" : "Dateien", + "All files" : "All d'Fichieren", "Home" : "Doheem", "Close" : "Zoumaachen", "Favorites" : "Favoriten", "Upload cancelled." : "Upload ofgebrach.", "Uploading..." : "Lueden erop...", + "..." : "...", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", "Download" : "Download", "Rename" : "Ëmbenennen", diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index d2f7df4a3a..b07bdf8b59 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Felaktig mapp.", "Files" : "Filer", "All files" : "Alla filer", + "File could not be found" : "Fil kunde inte hittas", "Home" : "Hem", "Close" : "Stäng", "Favorites" : "Favoriter", @@ -32,6 +33,15 @@ OC.L10N.register( "Could not get result from server." : "Gick inte att hämta resultat från server.", "Uploading..." : "Laddar upp...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} timme/ar kvar", + "{hours}:{minutes}h" : "{hours}:{minutes}", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minut(er) kvar", + "{minutes}:{seconds}m" : "{minutes}:{seconds}", + "{seconds} second{plural_s} left" : "{seconds} sekund(er) kvar", + "{seconds}s" : "{seconds}s", + "Any moment now..." : "Alldeles strax...", + "Soon..." : "Snart...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", "Actions" : "Åtgärder", "Download" : "Ladda ner", @@ -77,6 +87,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoriserad", "Favorite" : "Favorit", + "Local link" : "Lokal länk", "Folder" : "Mapp", "New folder" : "Ny mapp", "{newname} already exists" : "{newname} existerar redan", diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index c2d1d464bc..957088d80f 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -19,6 +19,7 @@ "Invalid directory." : "Felaktig mapp.", "Files" : "Filer", "All files" : "Alla filer", + "File could not be found" : "Fil kunde inte hittas", "Home" : "Hem", "Close" : "Stäng", "Favorites" : "Favoriter", @@ -30,6 +31,15 @@ "Could not get result from server." : "Gick inte att hämta resultat från server.", "Uploading..." : "Laddar upp...", "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} timme/ar kvar", + "{hours}:{minutes}h" : "{hours}:{minutes}", + "{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minut(er) kvar", + "{minutes}:{seconds}m" : "{minutes}:{seconds}", + "{seconds} second{plural_s} left" : "{seconds} sekund(er) kvar", + "{seconds}s" : "{seconds}s", + "Any moment now..." : "Alldeles strax...", + "Soon..." : "Snart...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} av {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "Filuppladdning pågår. Lämnar du sidan så avbryts uppladdningen.", "Actions" : "Åtgärder", "Download" : "Ladda ner", @@ -75,6 +85,7 @@ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoriserad", "Favorite" : "Favorit", + "Local link" : "Lokal länk", "Folder" : "Mapp", "New folder" : "Ny mapp", "{newname} already exists" : "{newname} existerar redan", diff --git a/apps/files_external/l10n/lb.js b/apps/files_external/l10n/lb.js index 598458c731..50bb06ff7f 100644 --- a/apps/files_external/l10n/lb.js +++ b/apps/files_external/l10n/lb.js @@ -6,6 +6,7 @@ OC.L10N.register( "Username" : "Benotzernumm", "Password" : "Passwuert", "Save" : "Späicheren", + "None" : "Keng", "Port" : "Port", "Region" : "Regioun", "URL" : "URL", diff --git a/apps/files_external/l10n/lb.json b/apps/files_external/l10n/lb.json index 265d8ffda9..9f7aa84bb1 100644 --- a/apps/files_external/l10n/lb.json +++ b/apps/files_external/l10n/lb.json @@ -4,6 +4,7 @@ "Username" : "Benotzernumm", "Password" : "Passwuert", "Save" : "Späicheren", + "None" : "Keng", "Port" : "Port", "Region" : "Regioun", "URL" : "URL", diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js index dfa978f202..3df7763a5f 100644 --- a/apps/files_external/l10n/sv.js +++ b/apps/files_external/l10n/sv.js @@ -1,6 +1,7 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Fel vid hämtning av åtkomst-token. Verifiera att din app-nyckel och hemlighet stämmer.", "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", "External storage" : "Extern lagring", diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json index 528588bd70..1070a322e9 100644 --- a/apps/files_external/l10n/sv.json +++ b/apps/files_external/l10n/sv.json @@ -1,4 +1,5 @@ { "translations": { + "Fetching request tokens failed. Verify that your app key and secret are correct." : "Fel vid hämtning av åtkomst-token. Verifiera att din app-nyckel och hemlighet stämmer.", "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", "External storage" : "Extern lagring", diff --git a/apps/files_sharing/l10n/lb.js b/apps/files_sharing/l10n/lb.js index fcbfd04c64..0679858d81 100644 --- a/apps/files_sharing/l10n/lb.js +++ b/apps/files_sharing/l10n/lb.js @@ -5,6 +5,7 @@ OC.L10N.register( "No shared links" : "Keng gedeelte Linken", "Cancel" : "Ofbriechen", "Shared by" : "Gedeelt vun", + "Sharing" : "Gedeelt", "The password is wrong. Try again." : "Den Passwuert ass incorrect. Probeier ed nach eng keier.", "Password" : "Passwuert", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", diff --git a/apps/files_sharing/l10n/lb.json b/apps/files_sharing/l10n/lb.json index 5a466e560c..9355d70a6f 100644 --- a/apps/files_sharing/l10n/lb.json +++ b/apps/files_sharing/l10n/lb.json @@ -3,6 +3,7 @@ "No shared links" : "Keng gedeelte Linken", "Cancel" : "Ofbriechen", "Shared by" : "Gedeelt vun", + "Sharing" : "Gedeelt", "The password is wrong. Try again." : "Den Passwuert ass incorrect. Probeier ed nach eng keier.", "Password" : "Passwuert", "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", diff --git a/apps/updatenotification/l10n/lb.js b/apps/updatenotification/l10n/lb.js new file mode 100644 index 0000000000..e877f169fc --- /dev/null +++ b/apps/updatenotification/l10n/lb.js @@ -0,0 +1,15 @@ +OC.L10N.register( + "updatenotification", + { + "Update notifications" : "Notifikatiounen aktualiséieren", + "{version} is available. Get more information on how to update." : "{Versioun} ass verfügbar. Kréi méi Informatiounen doriwwer wéi d'Aktualiséierung ofleeft.", + "Updated channel" : "Aktualiséierte Kanal", + "ownCloud core" : "ownCloud Kär", + "Update for %1$s to version %2$s is available." : "D'Aktualiséierung fir %1$s op d'Versioun %2$s ass verfügbar.", + "A new version is available: %s" : "Eng nei Versioun ass verfügbar: %s", + "Open updater" : "Den Aktualiséierungsprogramm opmaachen", + "Your version is up to date." : "Déng Versioun ass aktualiséiert.", + "Checked on %s" : "Gepréift um %s", + "Update channel:" : "Kanal updaten:" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/lb.json b/apps/updatenotification/l10n/lb.json new file mode 100644 index 0000000000..a43883f6c3 --- /dev/null +++ b/apps/updatenotification/l10n/lb.json @@ -0,0 +1,13 @@ +{ "translations": { + "Update notifications" : "Notifikatiounen aktualiséieren", + "{version} is available. Get more information on how to update." : "{Versioun} ass verfügbar. Kréi méi Informatiounen doriwwer wéi d'Aktualiséierung ofleeft.", + "Updated channel" : "Aktualiséierte Kanal", + "ownCloud core" : "ownCloud Kär", + "Update for %1$s to version %2$s is available." : "D'Aktualiséierung fir %1$s op d'Versioun %2$s ass verfügbar.", + "A new version is available: %s" : "Eng nei Versioun ass verfügbar: %s", + "Open updater" : "Den Aktualiséierungsprogramm opmaachen", + "Your version is up to date." : "Déng Versioun ass aktualiséiert.", + "Checked on %s" : "Gepréift um %s", + "Update channel:" : "Kanal updaten:" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +} \ No newline at end of file diff --git a/apps/user_ldap/l10n/lb.js b/apps/user_ldap/l10n/lb.js index b340887548..f62d292448 100644 --- a/apps/user_ldap/l10n/lb.js +++ b/apps/user_ldap/l10n/lb.js @@ -1,14 +1,51 @@ OC.L10N.register( "user_ldap", { + "Failed to delete the server configuration" : "D'Server-Konfiguratioun konnt net geläscht ginn", + "The configuration is invalid: anonymous bind is not allowed." : "Dës Konfiguratioun ass ongëlteg: eng anonym Bindung ass net erlaabt.", + "Action does not exist" : "Dës Aktioun gëtt et net", + "Testing configuration…" : "D'Konfiguratioun gëtt getest...", + "Configuration incorrect" : "D'Konfiguratioun ass net korrekt", + "Configuration incomplete" : "D'Konfiguratioun ass net komplett", + "Configuration OK" : "Konfiguratioun OK", + "Select groups" : "Wiel Gruppen äus", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "D'Späicheren huet net geklappt. W.e.g. géi sécher dass Datebank an der Operatioun ass. Lued nach emol éiers de weider fiers.", + "Select attributes" : "Wiel Attributer aus", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation):
" : "De Benotzer konnt net fonnt ginn. W.e.g. kuck deng Login Attributer a Benotzernumm no. \n ", + "_%s group found_::_%s groups found_" : ["%s Grupp fonnt","%s Gruppe fonnt"], + "_%s user found_::_%s users found_" : ["%s Benotzer fonnt","%s Benotzere fonnt"], + "Could not find the desired feature" : "Déi gewënschte Funktioun konnt net fonnt ginn", + "Server" : "Server", "Users" : "Benotzer", "Groups" : "Gruppen", + "Test Configuration" : "Konfiguratiounstest", "Help" : "Hëllef", + "Groups meeting these criteria are available in %s:" : "D'Gruppen, déi dës Critèren erfëllen sinn am %s:", + "Only these object classes:" : "Nëmmen des Klass vun Objeten:", + "Only from these groups:" : "Nëmme vun dëse Gruppen:", + "Search groups" : "Sich Gruppen", + "Available groups" : "Disponibel Gruppen", + "Selected groups" : "Ausgewielte Gruppen", + "Test Loginname" : "Test Benotzernumm", + "Verify settings" : "Astellungen iwwerpréiwen", + "1. Server" : "1. Server", + "%s. Server:" : "%s. Server", + "Delete the current configuration" : "Läsch déi aktuell Konfiguratioun", "Host" : "Host", "Port" : "Port", + "User DN" : "Benotzer DN", "Password" : "Passwuert", + "Saving" : "Speicheren...", "Back" : "Zeréck", "Continue" : "Weider", - "Advanced" : "Avancéiert" + "Advanced" : "Erweidert", + "Connection Settings" : "D'Astellunge vun der Verbindung", + "Configuration Active" : "D'Konfiguratioun ass aktiv", + "When unchecked, this configuration will be skipped." : "Ouni Iwwerpréiwung wäert dës Konfiguratioun iwwergaange ginn.", + "Directory Settings" : "Dossier's Astellungen", + "in bytes" : "A Bytes", + "Email Field" : "Email Feld", + "Internal Username" : "Interne Benotzernumm", + "Internal Username Attribute:" : "Interne Benotzernumm Attribut:" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/lb.json b/apps/user_ldap/l10n/lb.json index 4b4d46427b..e869a5821b 100644 --- a/apps/user_ldap/l10n/lb.json +++ b/apps/user_ldap/l10n/lb.json @@ -1,12 +1,49 @@ { "translations": { + "Failed to delete the server configuration" : "D'Server-Konfiguratioun konnt net geläscht ginn", + "The configuration is invalid: anonymous bind is not allowed." : "Dës Konfiguratioun ass ongëlteg: eng anonym Bindung ass net erlaabt.", + "Action does not exist" : "Dës Aktioun gëtt et net", + "Testing configuration…" : "D'Konfiguratioun gëtt getest...", + "Configuration incorrect" : "D'Konfiguratioun ass net korrekt", + "Configuration incomplete" : "D'Konfiguratioun ass net komplett", + "Configuration OK" : "Konfiguratioun OK", + "Select groups" : "Wiel Gruppen äus", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "D'Späicheren huet net geklappt. W.e.g. géi sécher dass Datebank an der Operatioun ass. Lued nach emol éiers de weider fiers.", + "Select attributes" : "Wiel Attributer aus", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation):
" : "De Benotzer konnt net fonnt ginn. W.e.g. kuck deng Login Attributer a Benotzernumm no. \n ", + "_%s group found_::_%s groups found_" : ["%s Grupp fonnt","%s Gruppe fonnt"], + "_%s user found_::_%s users found_" : ["%s Benotzer fonnt","%s Benotzere fonnt"], + "Could not find the desired feature" : "Déi gewënschte Funktioun konnt net fonnt ginn", + "Server" : "Server", "Users" : "Benotzer", "Groups" : "Gruppen", + "Test Configuration" : "Konfiguratiounstest", "Help" : "Hëllef", + "Groups meeting these criteria are available in %s:" : "D'Gruppen, déi dës Critèren erfëllen sinn am %s:", + "Only these object classes:" : "Nëmmen des Klass vun Objeten:", + "Only from these groups:" : "Nëmme vun dëse Gruppen:", + "Search groups" : "Sich Gruppen", + "Available groups" : "Disponibel Gruppen", + "Selected groups" : "Ausgewielte Gruppen", + "Test Loginname" : "Test Benotzernumm", + "Verify settings" : "Astellungen iwwerpréiwen", + "1. Server" : "1. Server", + "%s. Server:" : "%s. Server", + "Delete the current configuration" : "Läsch déi aktuell Konfiguratioun", "Host" : "Host", "Port" : "Port", + "User DN" : "Benotzer DN", "Password" : "Passwuert", + "Saving" : "Speicheren...", "Back" : "Zeréck", "Continue" : "Weider", - "Advanced" : "Avancéiert" + "Advanced" : "Erweidert", + "Connection Settings" : "D'Astellunge vun der Verbindung", + "Configuration Active" : "D'Konfiguratioun ass aktiv", + "When unchecked, this configuration will be skipped." : "Ouni Iwwerpréiwung wäert dës Konfiguratioun iwwergaange ginn.", + "Directory Settings" : "Dossier's Astellungen", + "in bytes" : "A Bytes", + "Email Field" : "Email Feld", + "Internal Username" : "Interne Benotzernumm", + "Internal Username Attribute:" : "Interne Benotzernumm Attribut:" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/core/l10n/lb.js b/core/l10n/lb.js index 92d10ed366..dfd8e7a0f6 100644 --- a/core/l10n/lb.js +++ b/core/l10n/lb.js @@ -83,6 +83,7 @@ OC.L10N.register( "can share" : "kann deelen", "can edit" : "kann änneren", "create" : "erstellen", + "change" : "änneren", "delete" : "läschen", "access control" : "Zougrëffskontroll", "Share" : "Deelen", diff --git a/core/l10n/lb.json b/core/l10n/lb.json index 382da7f58d..e1cfc10d33 100644 --- a/core/l10n/lb.json +++ b/core/l10n/lb.json @@ -81,6 +81,7 @@ "can share" : "kann deelen", "can edit" : "kann änneren", "create" : "erstellen", + "change" : "änneren", "delete" : "läschen", "access control" : "Zougrëffskontroll", "Share" : "Deelen", diff --git a/core/l10n/sv.js b/core/l10n/sv.js index d74a441a70..e7cb586306 100644 --- a/core/l10n/sv.js +++ b/core/l10n/sv.js @@ -298,6 +298,7 @@ OC.L10N.register( "Thank you for your patience." : "Tack för ditt tålamod.", "Two-step verification" : "Tvåfaktorsautentisering", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Utökad säkerhet har aktiverats på ditt konto. Vänligen autentisera med en andra faktor.", + "Cancel login" : "Avbryt inloggning", "Please authenticate using the selected factor." : "Vänligen autentisera med vald faktor.", "An error occured while verifying the token" : "Ett fel uppstod vid verifiering av token.", "You are accessing the server from an untrusted domain." : "Du ansluter till servern från en osäker domän.", diff --git a/core/l10n/sv.json b/core/l10n/sv.json index b2b2d282ad..352bea7de7 100644 --- a/core/l10n/sv.json +++ b/core/l10n/sv.json @@ -296,6 +296,7 @@ "Thank you for your patience." : "Tack för ditt tålamod.", "Two-step verification" : "Tvåfaktorsautentisering", "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "Utökad säkerhet har aktiverats på ditt konto. Vänligen autentisera med en andra faktor.", + "Cancel login" : "Avbryt inloggning", "Please authenticate using the selected factor." : "Vänligen autentisera med vald faktor.", "An error occured while verifying the token" : "Ett fel uppstod vid verifiering av token.", "You are accessing the server from an untrusted domain." : "Du ansluter till servern från en osäker domän.", diff --git a/settings/l10n/lb.js b/settings/l10n/lb.js index 0668fddcf7..42376d8202 100644 --- a/settings/l10n/lb.js +++ b/settings/l10n/lb.js @@ -9,8 +9,10 @@ OC.L10N.register( "Email saved" : "E-mail gespäichert", "APCu" : "APCu", "Redis" : "Redis", + "Sharing" : "Gedeelt", "Cron" : "Cron", "Log" : "Log", + "Updates" : "Updates", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", @@ -23,9 +25,11 @@ OC.L10N.register( "undo" : "réckgängeg man", "never" : "ni", "__language_name__" : "__language_name__", + "None" : "Keng", "Login" : "Login", "Open documentation" : "Dokumentatioun opmaachen", "Allow apps to use the Share API" : "Erlab Apps d'Share API ze benotzen", + "days" : "Deeg", "Allow resharing" : "Resharing erlaben", "Authentication required" : "Authentifizéierung néideg", "Server address" : "Server Adress", @@ -41,13 +45,14 @@ OC.L10N.register( "Current password" : "Momentan 't Passwuert", "New password" : "Neit Passwuert", "Change password" : "Passwuert änneren", - "Name" : "Numm", "Language" : "Sprooch", "Help translate" : "Hëllef iwwersetzen", + "Name" : "Numm", "Desktop client" : "Desktop-Programm", "Android app" : "Android-App", "iOS app" : "iOS-App", "Username" : "Benotzernumm", + "E-Mail" : "E-Mail", "Create" : "Erstellen", "Group" : "Grupp", "Default Quota" : "Standard Quota", diff --git a/settings/l10n/lb.json b/settings/l10n/lb.json index 20500fbc90..d59f06cf83 100644 --- a/settings/l10n/lb.json +++ b/settings/l10n/lb.json @@ -7,8 +7,10 @@ "Email saved" : "E-mail gespäichert", "APCu" : "APCu", "Redis" : "Redis", + "Sharing" : "Gedeelt", "Cron" : "Cron", "Log" : "Log", + "Updates" : "Updates", "Language changed" : "Sprooch huet geännert", "Invalid request" : "Ongülteg Requête", "Admins can't remove themself from the admin group" : "Admins kennen sech selwer net aus enger Admin Group läschen.", @@ -21,9 +23,11 @@ "undo" : "réckgängeg man", "never" : "ni", "__language_name__" : "__language_name__", + "None" : "Keng", "Login" : "Login", "Open documentation" : "Dokumentatioun opmaachen", "Allow apps to use the Share API" : "Erlab Apps d'Share API ze benotzen", + "days" : "Deeg", "Allow resharing" : "Resharing erlaben", "Authentication required" : "Authentifizéierung néideg", "Server address" : "Server Adress", @@ -39,13 +43,14 @@ "Current password" : "Momentan 't Passwuert", "New password" : "Neit Passwuert", "Change password" : "Passwuert änneren", - "Name" : "Numm", "Language" : "Sprooch", "Help translate" : "Hëllef iwwersetzen", + "Name" : "Numm", "Desktop client" : "Desktop-Programm", "Android app" : "Android-App", "iOS app" : "iOS-App", "Username" : "Benotzernumm", + "E-Mail" : "E-Mail", "Create" : "Erstellen", "Group" : "Grupp", "Default Quota" : "Standard Quota", diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js index aa5e3a8ef4..0218c95e74 100644 --- a/settings/l10n/sv.js +++ b/settings/l10n/sv.js @@ -223,6 +223,8 @@ OC.L10N.register( "Documentation:" : "Dokumentation:", "User documentation" : "Användardokumentation", "Admin documentation" : "Administratörsdokumentation", + "Visit website" : "Besök webbsida", + "Report a bug" : "Rapportera ett problem", "Show description …" : "Visa beskrivning", "Hide description …" : "Dölj beskrivning", "This app has an update available." : "Denna applikation har en uppdatering tillgänglig.", @@ -267,14 +269,14 @@ OC.L10N.register( "Current password" : "Nuvarande lösenord", "New password" : "Nytt lösenord", "Change password" : "Ändra lösenord", + "Language" : "Språk", + "Help translate" : "Hjälp att översätta", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.", "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", "You've linked these devices." : "Du har länkat dessa enheter.", "Name" : "Namn", "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ett enhetslösenord är ett lösenord som ger en app eller enhet tillåtelse att komma åt ditt ownCloud-konto.", - "Language" : "Språk", - "Help translate" : "Hjälp att översätta", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json index 0cf69401b3..35785bfbf0 100644 --- a/settings/l10n/sv.json +++ b/settings/l10n/sv.json @@ -221,6 +221,8 @@ "Documentation:" : "Dokumentation:", "User documentation" : "Användardokumentation", "Admin documentation" : "Administratörsdokumentation", + "Visit website" : "Besök webbsida", + "Report a bug" : "Rapportera ett problem", "Show description …" : "Visa beskrivning", "Hide description …" : "Dölj beskrivning", "This app has an update available." : "Denna applikation har en uppdatering tillgänglig.", @@ -265,14 +267,14 @@ "Current password" : "Nuvarande lösenord", "New password" : "Nytt lösenord", "Change password" : "Ändra lösenord", + "Language" : "Språk", + "Help translate" : "Hjälp att översätta", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.", "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", "You've linked these devices." : "Du har länkat dessa enheter.", "Name" : "Namn", "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ett enhetslösenord är ett lösenord som ger en app eller enhet tillåtelse att komma åt ditt ownCloud-konto.", - "Language" : "Språk", - "Help translate" : "Hjälp att översätta", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", From 3e763ac81e895d2b4af18af2bcd7a31e25da4cf6 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 15 Jun 2016 16:30:24 +0200 Subject: [PATCH 27/42] Add timeouts to make the UI usable again when a remote share is unreachable --- apps/federatedfilesharing/lib/DiscoveryManager.php | 5 ++++- apps/federatedfilesharing/lib/Notifications.php | 4 +++- apps/files_sharing/ajax/external.php | 5 ++++- apps/files_sharing/lib/External/Storage.php | 11 +++++++++-- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/apps/federatedfilesharing/lib/DiscoveryManager.php b/apps/federatedfilesharing/lib/DiscoveryManager.php index 2a4bb4b7f7..bf8dfeb31d 100644 --- a/apps/federatedfilesharing/lib/DiscoveryManager.php +++ b/apps/federatedfilesharing/lib/DiscoveryManager.php @@ -84,7 +84,10 @@ class DiscoveryManager { // Read the data from the response body try { - $response = $this->client->get($remote . '/ocs-provider/'); + $response = $this->client->get($remote . '/ocs-provider/', [ + 'timeout' => 3, + 'connect_timeout' => 3, + ]); if($response->getStatusCode() === 200) { $decodedService = json_decode($response->getBody(), true); if(is_array($decodedService)) { diff --git a/apps/federatedfilesharing/lib/Notifications.php b/apps/federatedfilesharing/lib/Notifications.php index 18212b82c3..575521d564 100644 --- a/apps/federatedfilesharing/lib/Notifications.php +++ b/apps/federatedfilesharing/lib/Notifications.php @@ -287,7 +287,9 @@ class Notifications { $endpoint = $this->discoveryManager->getShareEndpoint($protocol . $remoteDomain); try { $response = $client->post($protocol . $remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [ - 'body' => $fields + 'body' => $fields, + 'timeout' => 3, + 'connect_timeout' => 3, ]); $result['result'] = $response->getBody(); $result['success'] = true; diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 5cf86087f9..6a0a4dfc06 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -77,7 +77,10 @@ $externalManager = new \OCA\Files_Sharing\External\Manager( // check for ssl cert if (substr($remote, 0, 5) === 'https') { try { - \OC::$server->getHTTPClientService()->newClient()->get($remote)->getBody(); + \OC::$server->getHTTPClientService()->newClient()->get($remote, [ + 'timeout' => 3, + 'connect_timeout' => 3, + ])->getBody(); } catch (\Exception $e) { \OCP\JSON::error(array('data' => array('message' => $l->t('Invalid or untrusted SSL certificate')))); exit; diff --git a/apps/files_sharing/lib/External/Storage.php b/apps/files_sharing/lib/External/Storage.php index ca99393a1e..7302de5f93 100644 --- a/apps/files_sharing/lib/External/Storage.php +++ b/apps/files_sharing/lib/External/Storage.php @@ -254,7 +254,10 @@ class Storage extends DAV implements ISharedStorage { $client = $this->httpClient->newClient(); try { - $result = $client->get($url)->getBody(); + $result = $client->get($url, [ + 'timeout' => 3, + 'connect_timeout' => 3, + ])->getBody(); $data = json_decode($result); $returnValue = (is_object($data) && !empty($data->version)); } catch (ConnectException $e) { @@ -301,7 +304,11 @@ class Storage extends DAV implements ISharedStorage { // TODO: DI $client = \OC::$server->getHTTPClientService()->newClient(); try { - $response = $client->post($url, ['body' => ['password' => $password]]); + $response = $client->post($url, [ + 'body' => ['password' => $password], + 'timeout' => 3, + 'connect_timeout' => 3, + ]); } catch (\GuzzleHttp\Exception\RequestException $e) { if ($e->getCode() === 401 || $e->getCode() === 403) { throw new ForbiddenException(); From ec968a48e44159c1bb323d6ea3be3388277d7928 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Tue, 21 Jun 2016 17:37:44 +0200 Subject: [PATCH 28/42] Increase fed share timeout from 3 to 10 + unit tests --- .../lib/DiscoveryManager.php | 4 +-- .../lib/Notifications.php | 4 +-- .../tests/DiscoveryManagerTest.php | 25 +++++++++++++++---- apps/files_sharing/ajax/external.php | 4 +-- apps/files_sharing/lib/External/Storage.php | 8 +++--- 5 files changed, 30 insertions(+), 15 deletions(-) diff --git a/apps/federatedfilesharing/lib/DiscoveryManager.php b/apps/federatedfilesharing/lib/DiscoveryManager.php index bf8dfeb31d..25af0a40fd 100644 --- a/apps/federatedfilesharing/lib/DiscoveryManager.php +++ b/apps/federatedfilesharing/lib/DiscoveryManager.php @@ -85,8 +85,8 @@ class DiscoveryManager { // Read the data from the response body try { $response = $this->client->get($remote . '/ocs-provider/', [ - 'timeout' => 3, - 'connect_timeout' => 3, + 'timeout' => 10, + 'connect_timeout' => 10, ]); if($response->getStatusCode() === 200) { $decodedService = json_decode($response->getBody(), true); diff --git a/apps/federatedfilesharing/lib/Notifications.php b/apps/federatedfilesharing/lib/Notifications.php index 575521d564..fefa959ba3 100644 --- a/apps/federatedfilesharing/lib/Notifications.php +++ b/apps/federatedfilesharing/lib/Notifications.php @@ -288,8 +288,8 @@ class Notifications { try { $response = $client->post($protocol . $remoteDomain . $endpoint . $urlSuffix . '?format=' . self::RESPONSE_FORMAT, [ 'body' => $fields, - 'timeout' => 3, - 'connect_timeout' => 3, + 'timeout' => 10, + 'connect_timeout' => 10, ]); $result['result'] = $response->getBody(); $result['success'] = true; diff --git a/apps/federatedfilesharing/tests/DiscoveryManagerTest.php b/apps/federatedfilesharing/tests/DiscoveryManagerTest.php index 73f79b2c16..a9c324f024 100644 --- a/apps/federatedfilesharing/tests/DiscoveryManagerTest.php +++ b/apps/federatedfilesharing/tests/DiscoveryManagerTest.php @@ -77,7 +77,10 @@ class DiscoveryManagerTest extends \Test\TestCase { $this->client ->expects($this->once()) ->method('get') - ->with('https://myhost.com/ocs-provider/', []) + ->with('https://myhost.com/ocs-provider/', [ + 'timeout' => 10, + 'connect_timeout' => 10, + ]) ->willReturn($response); $this->cache ->expects($this->at(0)) @@ -111,7 +114,10 @@ class DiscoveryManagerTest extends \Test\TestCase { $this->client ->expects($this->once()) ->method('get') - ->with('https://myhost.com/ocs-provider/', []) + ->with('https://myhost.com/ocs-provider/', [ + 'timeout' => 10, + 'connect_timeout' => 10, + ]) ->willReturn($response); $expectedResult = '/public.php/MyCustomEndpoint/'; @@ -131,7 +137,10 @@ class DiscoveryManagerTest extends \Test\TestCase { $this->client ->expects($this->once()) ->method('get') - ->with('https://myhost.com/ocs-provider/', []) + ->with('https://myhost.com/ocs-provider/', [ + 'timeout' => 10, + 'connect_timeout' => 10, + ]) ->willReturn($response); $expectedResult = '/public.php/webdav'; @@ -151,7 +160,10 @@ class DiscoveryManagerTest extends \Test\TestCase { $this->client ->expects($this->once()) ->method('get') - ->with('https://myhost.com/ocs-provider/', []) + ->with('https://myhost.com/ocs-provider/', [ + 'timeout' => 10, + 'connect_timeout' => 10, + ]) ->willReturn($response); $expectedResult = '/ocs/v2.php/cloud/MyCustomShareEndpoint'; @@ -171,7 +183,10 @@ class DiscoveryManagerTest extends \Test\TestCase { $this->client ->expects($this->once()) ->method('get') - ->with('https://myhost.com/ocs-provider/', []) + ->with('https://myhost.com/ocs-provider/', [ + 'timeout' => 10, + 'connect_timeout' => 10, + ]) ->willReturn($response); $this->cache ->expects($this->at(0)) diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 6a0a4dfc06..4a7a6096c9 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -78,8 +78,8 @@ $externalManager = new \OCA\Files_Sharing\External\Manager( if (substr($remote, 0, 5) === 'https') { try { \OC::$server->getHTTPClientService()->newClient()->get($remote, [ - 'timeout' => 3, - 'connect_timeout' => 3, + 'timeout' => 10, + 'connect_timeout' => 10, ])->getBody(); } catch (\Exception $e) { \OCP\JSON::error(array('data' => array('message' => $l->t('Invalid or untrusted SSL certificate')))); diff --git a/apps/files_sharing/lib/External/Storage.php b/apps/files_sharing/lib/External/Storage.php index 7302de5f93..29b9c7b563 100644 --- a/apps/files_sharing/lib/External/Storage.php +++ b/apps/files_sharing/lib/External/Storage.php @@ -255,8 +255,8 @@ class Storage extends DAV implements ISharedStorage { $client = $this->httpClient->newClient(); try { $result = $client->get($url, [ - 'timeout' => 3, - 'connect_timeout' => 3, + 'timeout' => 10, + 'connect_timeout' => 10, ])->getBody(); $data = json_decode($result); $returnValue = (is_object($data) && !empty($data->version)); @@ -306,8 +306,8 @@ class Storage extends DAV implements ISharedStorage { try { $response = $client->post($url, [ 'body' => ['password' => $password], - 'timeout' => 3, - 'connect_timeout' => 3, + 'timeout' => 10, + 'connect_timeout' => 10, ]); } catch (\GuzzleHttp\Exception\RequestException $e) { if ($e->getCode() === 401 || $e->getCode() === 403) { From 854352d9a064a1e469ede207493bce44fd41d96c Mon Sep 17 00:00:00 2001 From: VicDeo Date: Wed, 22 Jun 2016 14:12:36 +0300 Subject: [PATCH 29/42] occ web executor (#24957) * Initial web executor * Fix PHPDoc Fix broken integration test OccControllerTests do not require database access - moch them all! Kill unused sprintf --- core/Application.php | 13 ++ core/Controller/OccController.php | 147 ++++++++++++++++++++ core/routes.php | 1 + lib/base.php | 19 ++- lib/private/Console/Application.php | 3 +- public.php | 4 +- tests/Core/Controller/OccControllerTest.php | 143 +++++++++++++++++++ 7 files changed, 324 insertions(+), 6 deletions(-) create mode 100644 core/Controller/OccController.php create mode 100644 tests/Core/Controller/OccControllerTest.php diff --git a/core/Application.php b/core/Application.php index a87917b626..8ea2672e54 100644 --- a/core/Application.php +++ b/core/Application.php @@ -32,6 +32,7 @@ use OC\AppFramework\Utility\TimeFactory; use OC\Core\Controller\AvatarController; use OC\Core\Controller\LoginController; use OC\Core\Controller\LostController; +use OC\Core\Controller\OccController; use OC\Core\Controller\TokenController; use OC\Core\Controller\TwoFactorChallengeController; use OC\Core\Controller\UserController; @@ -125,6 +126,18 @@ class Application extends App { $c->query('SecureRandom') ); }); + $container->registerService('OccController', function(SimpleContainer $c) { + return new OccController( + $c->query('AppName'), + $c->query('Request'), + $c->query('Config'), + new \OC\Console\Application( + $c->query('Config'), + $c->query('ServerContainer')->getEventDispatcher(), + $c->query('Request') + ) + ); + }); /** * Core class wrappers diff --git a/core/Controller/OccController.php b/core/Controller/OccController.php new file mode 100644 index 0000000000..917d02f37f --- /dev/null +++ b/core/Controller/OccController.php @@ -0,0 +1,147 @@ + + * + * @copyright Copyright (c) 2016, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace OC\Core\Controller; + +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\JSONResponse; +use OC\Console\Application; +use OCP\IConfig; +use OCP\IRequest; +use Symfony\Component\Console\Input\ArrayInput; +use Symfony\Component\Console\Output\BufferedOutput; + +class OccController extends Controller { + + /** @var array */ + private $allowedCommands = [ + 'app:disable', + 'app:enable', + 'app:getpath', + 'app:list', + 'check', + 'config:list', + 'maintenance:mode', + 'status', + 'upgrade' + ]; + + /** @var IConfig */ + private $config; + /** @var Application */ + private $console; + + /** + * OccController constructor. + * + * @param string $appName + * @param IRequest $request + * @param IConfig $config + * @param Application $console + */ + public function __construct($appName, IRequest $request, + IConfig $config, Application $console) { + parent::__construct($appName, $request); + $this->config = $config; + $this->console = $console; + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * Execute occ command + * Sample request + * POST http://domain.tld/index.php/occ/status', + * { + * 'params': { + * '--no-warnings':'1', + * '--output':'json' + * }, + * 'token': 'someToken' + * } + * + * @param string $command + * @param string $token + * @param array $params + * + * @return JSONResponse + * @throws \Exception + */ + public function execute($command, $token, $params = []) { + try { + $this->validateRequest($command, $token); + + $output = new BufferedOutput(); + $formatter = $output->getFormatter(); + $formatter->setDecorated(false); + $this->console->setAutoExit(false); + $this->console->loadCommands(new ArrayInput([]), $output); + + $inputArray = array_merge(['command' => $command], $params); + $input = new ArrayInput($inputArray); + + $exitCode = $this->console->run($input, $output); + $response = $output->fetch(); + + $json = [ + 'exitCode' => $exitCode, + 'response' => $response + ]; + + } catch (\UnexpectedValueException $e){ + $json = [ + 'exitCode' => 126, + 'response' => 'Not allowed', + 'details' => $e->getMessage() + ]; + } + return new JSONResponse($json); + } + + /** + * Check if command is allowed and has a valid security token + * @param $command + * @param $token + */ + protected function validateRequest($command, $token){ + if (!in_array($this->request->getRemoteAddress(), ['::1', '127.0.0.1', 'localhost'])) { + throw new \UnexpectedValueException('Web executor is not allowed to run from a different host'); + } + + if (!in_array($command, $this->allowedCommands)) { + throw new \UnexpectedValueException(sprintf('Command "%s" is not allowed to run via web request', $command)); + } + + $coreToken = $this->config->getSystemValue('updater.secret', ''); + if ($coreToken === '') { + throw new \UnexpectedValueException( + 'updater.secret is undefined in config/config.php. Either browse the admin settings in your ownCloud and click "Open updater" or define a strong secret using
php -r \'echo password_hash("MyStrongSecretDoUseYourOwn!", PASSWORD_DEFAULT)."\n";\'
and set this in the config.php.' + ); + } + + if (!password_verify($token, $coreToken)) { + throw new \UnexpectedValueException( + 'updater.secret does not match the provided token' + ); + } + } +} diff --git a/core/routes.php b/core/routes.php index 402277d8f3..c473408e2e 100644 --- a/core/routes.php +++ b/core/routes.php @@ -48,6 +48,7 @@ $application->registerRoutes($this, [ ['name' => 'login#showLoginForm', 'url' => '/login', 'verb' => 'GET'], ['name' => 'login#logout', 'url' => '/logout', 'verb' => 'GET'], ['name' => 'token#generateToken', 'url' => '/token/generate', 'verb' => 'POST'], + ['name' => 'occ#execute', 'url' => '/occ/{command}', 'verb' => 'POST'], ['name' => 'TwoFactorChallenge#selectChallenge', 'url' => '/login/selectchallenge', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#showChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'GET'], ['name' => 'TwoFactorChallenge#solveChallenge', 'url' => '/login/challenge/{challengeProviderId}', 'verb' => 'POST'], diff --git a/lib/base.php b/lib/base.php index b33687dbab..45f291e5cb 100644 --- a/lib/base.php +++ b/lib/base.php @@ -49,6 +49,8 @@ * */ +use OCP\IRequest; + require_once 'public/Constants.php'; /** @@ -271,9 +273,20 @@ class OC { } } - public static function checkMaintenanceMode() { + /** + * Limit maintenance mode access + * @param IRequest $request + */ + public static function checkMaintenanceMode(IRequest $request) { + // Check if requested URL matches 'index.php/occ' + $isOccControllerRequested = preg_match('|/index\.php$|', $request->getScriptName()) === 1 + && strpos($request->getPathInfo(), '/occ/') === 0; // Allow ajax update script to execute without being stopped - if (\OC::$server->getSystemConfig()->getValue('maintenance', false) && OC::$SUBURI != '/core/ajax/update.php') { + if ( + \OC::$server->getSystemConfig()->getValue('maintenance', false) + && OC::$SUBURI != '/core/ajax/update.php' + && !$isOccControllerRequested + ) { // send http status 503 header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); @@ -820,7 +833,7 @@ class OC { $request = \OC::$server->getRequest(); $requestPath = $request->getRawPathInfo(); if (substr($requestPath, -3) !== '.js') { // we need these files during the upgrade - self::checkMaintenanceMode(); + self::checkMaintenanceMode($request); self::checkUpgrade(); } diff --git a/lib/private/Console/Application.php b/lib/private/Console/Application.php index ec91064278..8a9191a4c5 100644 --- a/lib/private/Console/Application.php +++ b/lib/private/Console/Application.php @@ -138,9 +138,10 @@ class Application { * @throws \Exception */ public function run(InputInterface $input = null, OutputInterface $output = null) { + $args = isset($this->request->server['argv']) ? $this->request->server['argv'] : []; $this->dispatcher->dispatch(ConsoleEvent::EVENT_RUN, new ConsoleEvent( ConsoleEvent::EVENT_RUN, - $this->request->server['argv'] + $args )); return $this->application->run($input, $output); } diff --git a/public.php b/public.php index 964ed03c1a..b7125502ee 100644 --- a/public.php +++ b/public.php @@ -35,9 +35,9 @@ try { exit; } - OC::checkMaintenanceMode(); - OC::checkSingleUserMode(true); $request = \OC::$server->getRequest(); + OC::checkMaintenanceMode($request); + OC::checkSingleUserMode(true); $pathInfo = $request->getPathInfo(); if (!$pathInfo && $request->getParam('service', '') === '') { diff --git a/tests/Core/Controller/OccControllerTest.php b/tests/Core/Controller/OccControllerTest.php new file mode 100644 index 0000000000..682d917009 --- /dev/null +++ b/tests/Core/Controller/OccControllerTest.php @@ -0,0 +1,143 @@ + + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see + * + */ + +namespace Tests\Core\Controller; + +use OC\Console\Application; +use OC\Core\Controller\OccController; +use OCP\IConfig; +use Symfony\Component\Console\Output\Output; +use Test\TestCase; + +/** + * Class OccControllerTest + * + * @package OC\Core\Controller + */ +class OccControllerTest extends TestCase { + + const TEMP_SECRET = 'test'; + + /** @var \OC\AppFramework\Http\Request | \PHPUnit_Framework_MockObject_MockObject */ + private $request; + /** @var \OC\Core\Controller\OccController | \PHPUnit_Framework_MockObject_MockObject */ + private $controller; + /** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */ + private $config; + /** @var Application | \PHPUnit_Framework_MockObject_MockObject */ + private $console; + + public function testFromInvalidLocation(){ + $this->getControllerMock('example.org'); + + $response = $this->controller->execute('status', ''); + $responseData = $response->getData(); + + $this->assertArrayHasKey('exitCode', $responseData); + $this->assertEquals(126, $responseData['exitCode']); + + $this->assertArrayHasKey('details', $responseData); + $this->assertEquals('Web executor is not allowed to run from a different host', $responseData['details']); + } + + public function testNotWhiteListedCommand(){ + $this->getControllerMock('localhost'); + + $response = $this->controller->execute('missing_command', ''); + $responseData = $response->getData(); + + $this->assertArrayHasKey('exitCode', $responseData); + $this->assertEquals(126, $responseData['exitCode']); + + $this->assertArrayHasKey('details', $responseData); + $this->assertEquals('Command "missing_command" is not allowed to run via web request', $responseData['details']); + } + + public function testWrongToken(){ + $this->getControllerMock('localhost'); + + $response = $this->controller->execute('status', self::TEMP_SECRET . '-'); + $responseData = $response->getData(); + + $this->assertArrayHasKey('exitCode', $responseData); + $this->assertEquals(126, $responseData['exitCode']); + + $this->assertArrayHasKey('details', $responseData); + $this->assertEquals('updater.secret does not match the provided token', $responseData['details']); + } + + public function testSuccess(){ + $this->getControllerMock('localhost'); + $this->console->expects($this->once())->method('run') + ->willReturnCallback( + function ($input, $output) { + /** @var Output $output */ + $output->writeln('{"installed":true,"version":"9.1.0.8","versionstring":"9.1.0 beta 2","edition":""}'); + return 0; + } + ); + + $response = $this->controller->execute('status', self::TEMP_SECRET, ['--output'=>'json']); + $responseData = $response->getData(); + + $this->assertArrayHasKey('exitCode', $responseData); + $this->assertEquals(0, $responseData['exitCode']); + + $this->assertArrayHasKey('response', $responseData); + $decoded = json_decode($responseData['response'], true); + + $this->assertArrayHasKey('installed', $decoded); + $this->assertEquals(true, $decoded['installed']); + } + + private function getControllerMock($host){ + $this->request = $this->getMockBuilder('OC\AppFramework\Http\Request') + ->setConstructorArgs([ + ['server' => []], + \OC::$server->getSecureRandom(), + \OC::$server->getConfig() + ]) + ->setMethods(['getRemoteAddress']) + ->getMock(); + + $this->request->expects($this->any())->method('getRemoteAddress') + ->will($this->returnValue($host)); + + $this->config = $this->getMockBuilder('\OCP\IConfig') + ->disableOriginalConstructor() + ->getMock(); + $this->config->expects($this->any())->method('getSystemValue') + ->with('updater.secret') + ->willReturn(password_hash(self::TEMP_SECRET, PASSWORD_DEFAULT)); + + $this->console = $this->getMockBuilder('\OC\Console\Application') + ->disableOriginalConstructor() + ->getMock(); + + $this->controller = new OccController( + 'core', + $this->request, + $this->config, + $this->console + ); + } + +} From eed1c52aec1d06f541f0d86aa2650c6f9c1fa1ae Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Wed, 22 Jun 2016 13:34:55 +0200 Subject: [PATCH 30/42] Hide more default options in occ files_external:list --- apps/files_external/lib/Command/ListCommand.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/files_external/lib/Command/ListCommand.php b/apps/files_external/lib/Command/ListCommand.php index 26133ea5ed..bb43db17a8 100644 --- a/apps/files_external/lib/Command/ListCommand.php +++ b/apps/files_external/lib/Command/ListCommand.php @@ -167,7 +167,9 @@ class ListCommand extends Base { $defaultMountOptions = [ 'encrypt' => true, 'previews' => true, - 'filesystem_check_changes' => 1 + 'filesystem_check_changes' => 1, + 'enable_sharing' => false, + 'encoding_compatibility' => false ]; $rows = array_map(function (StorageConfig $config) use ($userId, $defaultMountOptions, $full) { $storageConfig = $config->getBackendOptions(); From fa3dc909a4b6e75c5ad1c49a3f35c1d2868141ea Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 22 Jun 2016 14:16:16 +0200 Subject: [PATCH 31/42] Rollback version must also adjust cached size --- apps/files_versions/lib/Storage.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/files_versions/lib/Storage.php b/apps/files_versions/lib/Storage.php index 638a1916f6..93f8b848ce 100644 --- a/apps/files_versions/lib/Storage.php +++ b/apps/files_versions/lib/Storage.php @@ -336,9 +336,16 @@ class Storage { // Restore encrypted version of the old file for the newly restored file // This has to happen manually here since the file is manually copied below $oldVersion = $users_view->getFileInfo($fileToRestore)->getEncryptedVersion(); + $oldFileInfo = $users_view->getFileInfo($fileToRestore); $newFileInfo = $files_view->getFileInfo($filename); $cache = $newFileInfo->getStorage()->getCache(); - $cache->update($newFileInfo->getId(), ['encrypted' => $oldVersion, 'encryptedVersion' => $oldVersion]); + $cache->update( + $newFileInfo->getId(), [ + 'encrypted' => $oldVersion, + 'encryptedVersion' => $oldVersion, + 'size' => $oldFileInfo->getSize() + ] + ); // rollback if (self::copyFileContents($users_view, $fileToRestore, 'files' . $filename)) { From 4a2fb1b4cb75a8a66fbe6e6f119fdf1db90b12ad Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Wed, 22 Jun 2016 16:58:06 +0200 Subject: [PATCH 32/42] Init the headers in iedavclient.js --- core/js/files/iedavclient.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/js/files/iedavclient.js b/core/js/files/iedavclient.js index 9e83f5b9a2..a0185fb3be 100644 --- a/core/js/files/iedavclient.js +++ b/core/js/files/iedavclient.js @@ -29,6 +29,7 @@ var self = this; var xhr = this.xhrProvider(); + headers = headers || {}; if (this.userName) { headers['Authorization'] = 'Basic ' + btoa(this.userName + ':' + this.password); From 1e1903e4feffb98bde50cf41618d6bb3ef11c88a Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Thu, 23 Jun 2016 02:09:38 -0400 Subject: [PATCH 33/42] [tx-robot] updated from transifex --- settings/l10n/ar.js | 3 ++- settings/l10n/ar.json | 3 ++- settings/l10n/ast.js | 2 +- settings/l10n/ast.json | 2 +- settings/l10n/az.js | 2 +- settings/l10n/az.json | 2 +- settings/l10n/bg_BG.js | 2 +- settings/l10n/bg_BG.json | 2 +- settings/l10n/bn_BD.js | 2 +- settings/l10n/bn_BD.json | 2 +- settings/l10n/bs.js | 2 +- settings/l10n/bs.json | 2 +- settings/l10n/ca.js | 2 +- settings/l10n/ca.json | 2 +- settings/l10n/cs_CZ.js | 7 ++----- settings/l10n/cs_CZ.json | 7 ++----- settings/l10n/da.js | 2 +- settings/l10n/da.json | 2 +- settings/l10n/de.js | 7 ++----- settings/l10n/de.json | 7 ++----- settings/l10n/de_DE.js | 7 ++----- settings/l10n/de_DE.json | 7 ++----- settings/l10n/el.js | 3 +-- settings/l10n/el.json | 3 +-- settings/l10n/en_GB.js | 7 ++----- settings/l10n/en_GB.json | 7 ++----- settings/l10n/eo.js | 2 +- settings/l10n/eo.json | 2 +- settings/l10n/es.js | 7 ++----- settings/l10n/es.json | 7 ++----- settings/l10n/es_AR.js | 2 +- settings/l10n/es_AR.json | 2 +- settings/l10n/es_MX.js | 2 +- settings/l10n/es_MX.json | 2 +- settings/l10n/et_EE.js | 2 +- settings/l10n/et_EE.json | 2 +- settings/l10n/eu.js | 2 +- settings/l10n/eu.json | 2 +- settings/l10n/fa.js | 2 +- settings/l10n/fa.json | 2 +- settings/l10n/fi_FI.js | 7 ++----- settings/l10n/fi_FI.json | 7 ++----- settings/l10n/fr.js | 7 ++----- settings/l10n/fr.json | 7 ++----- settings/l10n/gl.js | 2 +- settings/l10n/gl.json | 2 +- settings/l10n/he.js | 7 ++----- settings/l10n/he.json | 7 ++----- settings/l10n/hr.js | 2 +- settings/l10n/hr.json | 2 +- settings/l10n/hu_HU.js | 2 +- settings/l10n/hu_HU.json | 2 +- settings/l10n/hy.js | 2 +- settings/l10n/hy.json | 2 +- settings/l10n/ia.js | 2 +- settings/l10n/ia.json | 2 +- settings/l10n/id.js | 2 +- settings/l10n/id.json | 2 +- settings/l10n/is.js | 2 +- settings/l10n/is.json | 2 +- settings/l10n/it.js | 7 ++----- settings/l10n/it.json | 7 ++----- settings/l10n/ja.js | 9 +++------ settings/l10n/ja.json | 9 +++------ settings/l10n/ka_GE.js | 2 +- settings/l10n/ka_GE.json | 2 +- settings/l10n/km.js | 2 +- settings/l10n/km.json | 2 +- settings/l10n/kn.js | 2 +- settings/l10n/kn.json | 2 +- settings/l10n/ko.js | 2 +- settings/l10n/ko.json | 2 +- settings/l10n/lt_LT.js | 2 +- settings/l10n/lt_LT.json | 2 +- settings/l10n/lv.js | 2 +- settings/l10n/lv.json | 2 +- settings/l10n/mk.js | 2 +- settings/l10n/mk.json | 2 +- settings/l10n/ms_MY.js | 2 +- settings/l10n/ms_MY.json | 2 +- settings/l10n/nb_NO.js | 2 +- settings/l10n/nb_NO.json | 2 +- settings/l10n/nl.js | 7 ++----- settings/l10n/nl.json | 7 ++----- settings/l10n/nn_NO.js | 2 +- settings/l10n/nn_NO.json | 2 +- settings/l10n/oc.js | 2 +- settings/l10n/oc.json | 2 +- settings/l10n/pl.js | 3 +-- settings/l10n/pl.json | 3 +-- settings/l10n/pt_BR.js | 7 ++----- settings/l10n/pt_BR.json | 7 ++----- settings/l10n/pt_PT.js | 7 ++----- settings/l10n/pt_PT.json | 7 ++----- settings/l10n/ro.js | 6 ++---- settings/l10n/ro.json | 6 ++---- settings/l10n/ru.js | 7 ++----- settings/l10n/ru.json | 7 ++----- settings/l10n/si_LK.js | 2 +- settings/l10n/si_LK.json | 2 +- settings/l10n/sk_SK.js | 2 +- settings/l10n/sk_SK.json | 2 +- settings/l10n/sl.js | 5 ++--- settings/l10n/sl.json | 5 ++--- settings/l10n/sq.js | 7 ++----- settings/l10n/sq.json | 7 ++----- settings/l10n/sr.js | 2 +- settings/l10n/sr.json | 2 +- settings/l10n/sr@latin.js | 2 +- settings/l10n/sr@latin.json | 2 +- settings/l10n/sv.js | 3 --- settings/l10n/sv.json | 3 --- settings/l10n/ta_LK.js | 2 +- settings/l10n/ta_LK.json | 2 +- settings/l10n/te.js | 2 +- settings/l10n/te.json | 2 +- settings/l10n/th_TH.js | 2 +- settings/l10n/th_TH.json | 2 +- settings/l10n/tr.js | 2 +- settings/l10n/tr.json | 2 +- settings/l10n/ug.js | 2 +- settings/l10n/ug.json | 2 +- settings/l10n/uk.js | 2 +- settings/l10n/uk.json | 2 +- settings/l10n/vi.js | 2 +- settings/l10n/vi.json | 2 +- settings/l10n/zh_CN.js | 2 +- settings/l10n/zh_CN.json | 2 +- settings/l10n/zh_HK.js | 2 +- settings/l10n/zh_HK.json | 2 +- settings/l10n/zh_TW.js | 2 +- settings/l10n/zh_TW.json | 2 +- 132 files changed, 168 insertions(+), 272 deletions(-) diff --git a/settings/l10n/ar.js b/settings/l10n/ar.js index 092d265010..96eeb9004e 100644 --- a/settings/l10n/ar.js +++ b/settings/l10n/ar.js @@ -91,12 +91,13 @@ OC.L10N.register( "Current password" : "كلمات السر الحالية", "New password" : "كلمات سر جديدة", "Change password" : "عدل كلمة السر", - "Name" : "الاسم", "Language" : "اللغة", "Help translate" : "ساعد في الترجمه", + "Name" : "الاسم", "Get the apps to sync your files" : "احصل على التطبيقات لمزامنة ملفاتك", "Show First Run Wizard again" : "ابدأ خطوات بداية التشغيل من جديد", "Username" : "إسم المستخدم", + "E-Mail" : "بريد إلكتروني", "Create" : "انشئ", "Admin Recovery Password" : "استعادة كلمة المرور للمسؤول", "Enter the recovery password in order to recover the users files during password change" : "ادخل كلمة المرور المستعادة من اجل استرداد ملفات المستخدمين اثناء تغيير كلمة المرور", diff --git a/settings/l10n/ar.json b/settings/l10n/ar.json index 8236e01777..d7033ff256 100644 --- a/settings/l10n/ar.json +++ b/settings/l10n/ar.json @@ -89,12 +89,13 @@ "Current password" : "كلمات السر الحالية", "New password" : "كلمات سر جديدة", "Change password" : "عدل كلمة السر", - "Name" : "الاسم", "Language" : "اللغة", "Help translate" : "ساعد في الترجمه", + "Name" : "الاسم", "Get the apps to sync your files" : "احصل على التطبيقات لمزامنة ملفاتك", "Show First Run Wizard again" : "ابدأ خطوات بداية التشغيل من جديد", "Username" : "إسم المستخدم", + "E-Mail" : "بريد إلكتروني", "Create" : "انشئ", "Admin Recovery Password" : "استعادة كلمة المرور للمسؤول", "Enter the recovery password in order to recover the users files during password change" : "ادخل كلمة المرور المستعادة من اجل استرداد ملفات المستخدمين اثناء تغيير كلمة المرور", diff --git a/settings/l10n/ast.js b/settings/l10n/ast.js index 55d4f658d6..88f5a9c0a1 100644 --- a/settings/l10n/ast.js +++ b/settings/l10n/ast.js @@ -130,9 +130,9 @@ OC.L10N.register( "Current password" : "Contraseña actual", "New password" : "Contraseña nueva", "Change password" : "Camudar contraseña", - "Name" : "Nome", "Language" : "Llingua", "Help translate" : "Ayúdanos nes traducciones", + "Name" : "Nome", "Get the apps to sync your files" : "Obtener les aplicaciones pa sincronizar ficheros", "Desktop client" : "Cliente d'escritoriu", "Android app" : "Aplicación d'Android", diff --git a/settings/l10n/ast.json b/settings/l10n/ast.json index ae21852898..70c61c9da5 100644 --- a/settings/l10n/ast.json +++ b/settings/l10n/ast.json @@ -128,9 +128,9 @@ "Current password" : "Contraseña actual", "New password" : "Contraseña nueva", "Change password" : "Camudar contraseña", - "Name" : "Nome", "Language" : "Llingua", "Help translate" : "Ayúdanos nes traducciones", + "Name" : "Nome", "Get the apps to sync your files" : "Obtener les aplicaciones pa sincronizar ficheros", "Desktop client" : "Cliente d'escritoriu", "Android app" : "Aplicación d'Android", diff --git a/settings/l10n/az.js b/settings/l10n/az.js index 5c23484726..de5839558a 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -183,9 +183,9 @@ OC.L10N.register( "Current password" : "Hazırkı şifrə", "New password" : "Yeni şifrə", "Change password" : "Şifrəni dəyiş", - "Name" : "Ad", "Language" : "Dil", "Help translate" : "Tərcüməyə kömək", + "Name" : "Ad", "Get the apps to sync your files" : "Fayllarınızın sinxronizasiyası üçün proqramları götürün", "Desktop client" : "Desktop client", "Android app" : "Android proqramı", diff --git a/settings/l10n/az.json b/settings/l10n/az.json index c208193342..c5cc476b58 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -181,9 +181,9 @@ "Current password" : "Hazırkı şifrə", "New password" : "Yeni şifrə", "Change password" : "Şifrəni dəyiş", - "Name" : "Ad", "Language" : "Dil", "Help translate" : "Tərcüməyə kömək", + "Name" : "Ad", "Get the apps to sync your files" : "Fayllarınızın sinxronizasiyası üçün proqramları götürün", "Desktop client" : "Desktop client", "Android app" : "Android proqramı", diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js index 12795d66eb..b2cd227cd9 100644 --- a/settings/l10n/bg_BG.js +++ b/settings/l10n/bg_BG.js @@ -184,9 +184,9 @@ OC.L10N.register( "Current password" : "Текуща парола", "New password" : "Нова парола", "Change password" : "Промяна на паролата", - "Name" : "Име", "Language" : "Език", "Help translate" : "Помогни с превода", + "Name" : "Име", "Get the apps to sync your files" : "Изтегли програми за синхронизиране на файловете ти", "Desktop client" : "Клиент за настолен компютър", "Android app" : "Андроид приложение", diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json index 42f13242a0..478b1bcfd6 100644 --- a/settings/l10n/bg_BG.json +++ b/settings/l10n/bg_BG.json @@ -182,9 +182,9 @@ "Current password" : "Текуща парола", "New password" : "Нова парола", "Change password" : "Промяна на паролата", - "Name" : "Име", "Language" : "Език", "Help translate" : "Помогни с превода", + "Name" : "Име", "Get the apps to sync your files" : "Изтегли програми за синхронизиране на файловете ти", "Desktop client" : "Клиент за настолен компютър", "Android app" : "Андроид приложение", diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js index 8b03ab3a14..38f73cfb38 100644 --- a/settings/l10n/bn_BD.js +++ b/settings/l10n/bn_BD.js @@ -60,9 +60,9 @@ OC.L10N.register( "Current password" : "বর্তমান কূটশব্দ", "New password" : "নতুন কূটশব্দ", "Change password" : "কূটশব্দ পরিবর্তন করুন", - "Name" : "নাম", "Language" : "ভাষা", "Help translate" : "অনুবাদ করতে সহায়তা করুন", + "Name" : "নাম", "Get the apps to sync your files" : "আপনার ফাইলসমূহ সিংক করতে অ্যাপস নিন", "Show First Run Wizard again" : "প্রথমবার চালানোর যাদুকর পূনরায় প্রদর্শন কর", "Username" : "ব্যবহারকারী", diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json index 682f4dbab2..c5a60bb569 100644 --- a/settings/l10n/bn_BD.json +++ b/settings/l10n/bn_BD.json @@ -58,9 +58,9 @@ "Current password" : "বর্তমান কূটশব্দ", "New password" : "নতুন কূটশব্দ", "Change password" : "কূটশব্দ পরিবর্তন করুন", - "Name" : "নাম", "Language" : "ভাষা", "Help translate" : "অনুবাদ করতে সহায়তা করুন", + "Name" : "নাম", "Get the apps to sync your files" : "আপনার ফাইলসমূহ সিংক করতে অ্যাপস নিন", "Show First Run Wizard again" : "প্রথমবার চালানোর যাদুকর পূনরায় প্রদর্শন কর", "Username" : "ব্যবহারকারী", diff --git a/settings/l10n/bs.js b/settings/l10n/bs.js index 0f587b4fad..fefc3ef755 100644 --- a/settings/l10n/bs.js +++ b/settings/l10n/bs.js @@ -151,9 +151,9 @@ OC.L10N.register( "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Promijeni lozinku", - "Name" : "Ime", "Language" : "Jezik", "Help translate" : "Pomozi prevesti", + "Name" : "Ime", "Get the apps to sync your files" : "Koristite aplikacije za sinhronizaciju svojih datoteka", "Desktop client" : "Desktop klijent", "Android app" : "Android aplikacija", diff --git a/settings/l10n/bs.json b/settings/l10n/bs.json index 9e1f6ea1b3..3fc14020f6 100644 --- a/settings/l10n/bs.json +++ b/settings/l10n/bs.json @@ -149,9 +149,9 @@ "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Promijeni lozinku", - "Name" : "Ime", "Language" : "Jezik", "Help translate" : "Pomozi prevesti", + "Name" : "Ime", "Get the apps to sync your files" : "Koristite aplikacije za sinhronizaciju svojih datoteka", "Desktop client" : "Desktop klijent", "Android app" : "Android aplikacija", diff --git a/settings/l10n/ca.js b/settings/l10n/ca.js index c89bafed90..127d268cef 100644 --- a/settings/l10n/ca.js +++ b/settings/l10n/ca.js @@ -208,9 +208,9 @@ OC.L10N.register( "Current password" : "Contrasenya actual", "New password" : "Contrasenya nova", "Change password" : "Canvia la contrasenya", - "Name" : "Nom", "Language" : "Idioma", "Help translate" : "Ajudeu-nos amb la traducció", + "Name" : "Nom", "Get the apps to sync your files" : "Obtingueu les aplicacions per sincronitzar els vostres fitxers", "Desktop client" : "Client d'escriptori", "Android app" : "aplicació para Android", diff --git a/settings/l10n/ca.json b/settings/l10n/ca.json index 6956f33912..0d43ef445d 100644 --- a/settings/l10n/ca.json +++ b/settings/l10n/ca.json @@ -206,9 +206,9 @@ "Current password" : "Contrasenya actual", "New password" : "Contrasenya nova", "Change password" : "Canvia la contrasenya", - "Name" : "Nom", "Language" : "Idioma", "Help translate" : "Ajudeu-nos amb la traducció", + "Name" : "Nom", "Get the apps to sync your files" : "Obtingueu les aplicacions per sincronitzar els vostres fitxers", "Desktop client" : "Client d'escriptori", "Android app" : "aplicació para Android", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index bbca7e3fcd..71e9a9874b 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Neomezeně", "Personal info" : "Osobní informace", "Sessions" : "Sezení", - "Devices" : "Přístroje", "Sync clients" : "Synchronizační klienti", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", "Info, warnings, errors and fatal issues" : "Informace, varování, chyby a fatální problémy", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Současné heslo", "New password" : "Nové heslo", "Change password" : "Změnit heslo", + "Language" : "Jazyk", + "Help translate" : "Pomoci s překladem", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Toto jsou klienti aktuálně přihlášení do této instance ownCloud přes web, počítač, či telefon.", "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", - "You've linked these devices." : "Připojili jste tyto přístroje.", "Name" : "Název", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Heslo přístroje je přihlašovací údaj umožňující aplikaci nebo přístroji přístup k ownCloud účtu.", - "Language" : "Jazyk", - "Help translate" : "Pomoci s překladem", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 59e2d3efed..5b87ae449e 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -117,7 +117,6 @@ "Unlimited" : "Neomezeně", "Personal info" : "Osobní informace", "Sessions" : "Sezení", - "Devices" : "Přístroje", "Sync clients" : "Synchronizační klienti", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", "Info, warnings, errors and fatal issues" : "Informace, varování, chyby a fatální problémy", @@ -267,14 +266,12 @@ "Current password" : "Současné heslo", "New password" : "Nové heslo", "Change password" : "Změnit heslo", + "Language" : "Jazyk", + "Help translate" : "Pomoci s překladem", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Toto jsou klienti aktuálně přihlášení do této instance ownCloud přes web, počítač, či telefon.", "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", - "You've linked these devices." : "Připojili jste tyto přístroje.", "Name" : "Název", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Heslo přístroje je přihlašovací údaj umožňující aplikaci nebo přístroji přístup k ownCloud účtu.", - "Language" : "Jazyk", - "Help translate" : "Pomoci s překladem", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index be7ec743ca..92508e0edd 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -231,9 +231,9 @@ OC.L10N.register( "Current password" : "Nuværende adgangskode", "New password" : "Nyt kodeord", "Change password" : "Skift kodeord", - "Name" : "Navn", "Language" : "Sprog", "Help translate" : "Hjælp med oversættelsen", + "Name" : "Navn", "Get the apps to sync your files" : "Hent applikationerne for at synkronisere dine filer", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index b663d73026..ca58a9dfca 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -229,9 +229,9 @@ "Current password" : "Nuværende adgangskode", "New password" : "Nyt kodeord", "Change password" : "Skift kodeord", - "Name" : "Navn", "Language" : "Sprog", "Help translate" : "Hjælp med oversættelsen", + "Name" : "Navn", "Get the apps to sync your files" : "Hent applikationerne for at synkronisere dine filer", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index 1eb29d8d1b..f8c96e4d18 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "Devices" : "Geräte", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Change password" : "Passwort ändern", + "Language" : "Sprache", + "Help translate" : "Hilf bei der Übersetzung", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen du aktuell in deiner ownCloud angemeldet bist.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", - "You've linked these devices." : "Du hast diese Geräte verbunden.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ein Gerätepasswort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf deinen owncloud-Konto zuzugreifen,", - "Language" : "Sprache", - "Help translate" : "Hilf bei der Übersetzung", "Get the apps to sync your files" : "Lade die Apps zur Synchronisierung Deiner Daten herunter", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index 9249ab2f63..d63456ec37 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -117,7 +117,6 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "Devices" : "Geräte", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -267,14 +266,12 @@ "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Change password" : "Passwort ändern", + "Language" : "Sprache", + "Help translate" : "Hilf bei der Übersetzung", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen du aktuell in deiner ownCloud angemeldet bist.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", - "You've linked these devices." : "Du hast diese Geräte verbunden.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ein Gerätepasswort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf deinen owncloud-Konto zuzugreifen,", - "Language" : "Sprache", - "Help translate" : "Hilf bei der Übersetzung", "Get the apps to sync your files" : "Lade die Apps zur Synchronisierung Deiner Daten herunter", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index 048a5b1cdf..7af12128ec 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "Devices" : "Geräte", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Change password" : "Passwort ändern", + "Language" : "Sprache", + "Help translate" : "Helfen Sie bei der Übersetzung", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen Sie aktuell in Ihrer ownCloud angemeldet sind.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", - "You've linked these devices." : "Sie haben diese Geräte verbunden.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ein Gerätepasswort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren owncloud-Konto zuzugreifen,", - "Language" : "Sprache", - "Help translate" : "Helfen Sie bei der Übersetzung", "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 89e69a3f88..4de6cd70b7 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -117,7 +117,6 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", - "Devices" : "Geräte", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -267,14 +266,12 @@ "Current password" : "Aktuelles Passwort", "New password" : "Neues Passwort", "Change password" : "Passwort ändern", + "Language" : "Sprache", + "Help translate" : "Helfen Sie bei der Übersetzung", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen Sie aktuell in Ihrer ownCloud angemeldet sind.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", - "You've linked these devices." : "Sie haben diese Geräte verbunden.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ein Gerätepasswort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren owncloud-Konto zuzugreifen,", - "Language" : "Sprache", - "Help translate" : "Helfen Sie bei der Übersetzung", "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index 5a793c1e68..ad936384c8 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -106,7 +106,6 @@ OC.L10N.register( "__language_name__" : "__όνομα_γλώσσας__", "Unlimited" : "Απεριόριστο", "Personal info" : "Προσωπικές Πληροφορίες", - "Devices" : "Συσκευές", "Sync clients" : "Συγχρονισμός πελατών", "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", @@ -234,9 +233,9 @@ OC.L10N.register( "Current password" : "Τρέχων συνθηματικό", "New password" : "Νέο συνθηματικό", "Change password" : "Αλλαγή συνθηματικού", - "Name" : "Όνομα", "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", + "Name" : "Όνομα", "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", "Desktop client" : "Πελάτης σταθερού υπολογιστή", "Android app" : "Εφαρμογή Android", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index 77a308bd10..f7d4b064f6 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -104,7 +104,6 @@ "__language_name__" : "__όνομα_γλώσσας__", "Unlimited" : "Απεριόριστο", "Personal info" : "Προσωπικές Πληροφορίες", - "Devices" : "Συσκευές", "Sync clients" : "Συγχρονισμός πελατών", "Everything (fatal issues, errors, warnings, info, debug)" : "Όλα (καίρια ζητήματα, σφάλματα, προειδοποιήσεις, πληροφορίες, αποσφαλμάτωση)", "Info, warnings, errors and fatal issues" : "Πληροφορίες, προειδοποιήσεις, σφάλματα και καίρια ζητήματα", @@ -232,9 +231,9 @@ "Current password" : "Τρέχων συνθηματικό", "New password" : "Νέο συνθηματικό", "Change password" : "Αλλαγή συνθηματικού", - "Name" : "Όνομα", "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", + "Name" : "Όνομα", "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", "Desktop client" : "Πελάτης σταθερού υπολογιστή", "Android app" : "Εφαρμογή Android", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index 5690b237ac..b020ec6306 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Unlimited", "Personal info" : "Personal info", "Sessions" : "Sessions", - "Devices" : "Devices", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", @@ -268,14 +267,12 @@ OC.L10N.register( "Current password" : "Current password", "New password" : "New password", "Change password" : "Change password", + "Language" : "Language", + "Help translate" : "Help translate", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.", "Browser" : "Browser", "Most recent activity" : "Most recent activity", - "You've linked these devices." : "You've linked these devices.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "A device password is a passcode that gives an app or device permissions to access your ownCloud account.", - "Language" : "Language", - "Help translate" : "Help translate", "Get the apps to sync your files" : "Get the apps to sync your files", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 3fa88ef35e..8bab21429f 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -117,7 +117,6 @@ "Unlimited" : "Unlimited", "Personal info" : "Personal info", "Sessions" : "Sessions", - "Devices" : "Devices", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", @@ -266,14 +265,12 @@ "Current password" : "Current password", "New password" : "New password", "Change password" : "Change password", + "Language" : "Language", + "Help translate" : "Help translate", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.", "Browser" : "Browser", "Most recent activity" : "Most recent activity", - "You've linked these devices." : "You've linked these devices.", "Name" : "Name", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "A device password is a passcode that gives an app or device permissions to access your ownCloud account.", - "Language" : "Language", - "Help translate" : "Help translate", "Get the apps to sync your files" : "Get the apps to sync your files", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js index c34ab8141f..20eaca472b 100644 --- a/settings/l10n/eo.js +++ b/settings/l10n/eo.js @@ -122,9 +122,9 @@ OC.L10N.register( "Current password" : "Nuna pasvorto", "New password" : "Nova pasvorto", "Change password" : "Ŝanĝi la pasvorton", - "Name" : "Nomo", "Language" : "Lingvo", "Help translate" : "Helpu traduki", + "Name" : "Nomo", "Get the apps to sync your files" : "Ekhavu la aplikaĵojn por sinkronigi viajn dosierojn", "Desktop client" : "Labortabla kliento", "Android app" : "Android-aplikaĵo", diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json index 38a365fc68..03480e2aaa 100644 --- a/settings/l10n/eo.json +++ b/settings/l10n/eo.json @@ -120,9 +120,9 @@ "Current password" : "Nuna pasvorto", "New password" : "Nova pasvorto", "Change password" : "Ŝanĝi la pasvorton", - "Name" : "Nomo", "Language" : "Lingvo", "Help translate" : "Helpu traduki", + "Name" : "Nomo", "Get the apps to sync your files" : "Ekhavu la aplikaĵojn por sinkronigi viajn dosierojn", "Desktop client" : "Labortabla kliento", "Android app" : "Android-aplikaĵo", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 742b485f44..4cb08348eb 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Ilimitado", "Personal info" : "Información personal", "Sessions" : "Sesiones", - "Devices" : "Dispositivos", "Sync clients" : "Sincronizar clientes", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Errores y problemas fatales", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Contraseña actual", "New password" : "Nueva contraseña", "Change password" : "Cambiar contraseña", + "Language" : "Idioma", + "Help translate" : "Ayúdanos a traducir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estos son los clientes en web, en escritorio y en móvil actualmente conectados en su OwnCloud.", "Browser" : "Navegador", "Most recent activity" : "Actividad más reciente", - "You've linked these devices." : "Has enlazado estos dispositivos", "Name" : "Nombre", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Una contraseña de dispositivo es un código que proporciona permisos a una app o dispositivo para acceder a tu cuenta de ownCloud", - "Language" : "Idioma", - "Help translate" : "Ayúdanos a traducir", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 783777c24d..0bcdf03d9a 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -117,7 +117,6 @@ "Unlimited" : "Ilimitado", "Personal info" : "Información personal", "Sessions" : "Sesiones", - "Devices" : "Dispositivos", "Sync clients" : "Sincronizar clientes", "Everything (fatal issues, errors, warnings, info, debug)" : "Todo (Información, Avisos, Errores, debug y problemas fatales)", "Info, warnings, errors and fatal issues" : "Información, Avisos, Errores y problemas fatales", @@ -267,14 +266,12 @@ "Current password" : "Contraseña actual", "New password" : "Nueva contraseña", "Change password" : "Cambiar contraseña", + "Language" : "Idioma", + "Help translate" : "Ayúdanos a traducir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estos son los clientes en web, en escritorio y en móvil actualmente conectados en su OwnCloud.", "Browser" : "Navegador", "Most recent activity" : "Actividad más reciente", - "You've linked these devices." : "Has enlazado estos dispositivos", "Name" : "Nombre", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Una contraseña de dispositivo es un código que proporciona permisos a una app o dispositivo para acceder a tu cuenta de ownCloud", - "Language" : "Idioma", - "Help translate" : "Ayúdanos a traducir", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", diff --git a/settings/l10n/es_AR.js b/settings/l10n/es_AR.js index 4553975267..7c99d3e5d7 100644 --- a/settings/l10n/es_AR.js +++ b/settings/l10n/es_AR.js @@ -102,9 +102,9 @@ OC.L10N.register( "Current password" : "Contraseña actual", "New password" : "Nueva contraseña:", "Change password" : "Cambiar contraseña", - "Name" : "Nombre", "Language" : "Idioma", "Help translate" : "Ayudanos a traducir", + "Name" : "Nombre", "Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "App para Android", diff --git a/settings/l10n/es_AR.json b/settings/l10n/es_AR.json index f1d988e59a..46cf5526f6 100644 --- a/settings/l10n/es_AR.json +++ b/settings/l10n/es_AR.json @@ -100,9 +100,9 @@ "Current password" : "Contraseña actual", "New password" : "Nueva contraseña:", "Change password" : "Cambiar contraseña", - "Name" : "Nombre", "Language" : "Idioma", "Help translate" : "Ayudanos a traducir", + "Name" : "Nombre", "Get the apps to sync your files" : "Obtené Apps para sincronizar tus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "App para Android", diff --git a/settings/l10n/es_MX.js b/settings/l10n/es_MX.js index 292bfae47e..3472c25389 100644 --- a/settings/l10n/es_MX.js +++ b/settings/l10n/es_MX.js @@ -77,9 +77,9 @@ OC.L10N.register( "Current password" : "Contraseña actual", "New password" : "Nueva contraseña", "Change password" : "Cambiar contraseña", - "Name" : "Nombre", "Language" : "Idioma", "Help translate" : "Ayúdanos a traducir", + "Name" : "Nombre", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Show First Run Wizard again" : "Mostrar nuevamente el Asistente de ejecución inicial", "Username" : "Nombre de usuario", diff --git a/settings/l10n/es_MX.json b/settings/l10n/es_MX.json index bf00a148f8..cefc0f8c6e 100644 --- a/settings/l10n/es_MX.json +++ b/settings/l10n/es_MX.json @@ -75,9 +75,9 @@ "Current password" : "Contraseña actual", "New password" : "Nueva contraseña", "Change password" : "Cambiar contraseña", - "Name" : "Nombre", "Language" : "Idioma", "Help translate" : "Ayúdanos a traducir", + "Name" : "Nombre", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Show First Run Wizard again" : "Mostrar nuevamente el Asistente de ejecución inicial", "Username" : "Nombre de usuario", diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js index c2fa0631fb..d04e674de3 100644 --- a/settings/l10n/et_EE.js +++ b/settings/l10n/et_EE.js @@ -197,9 +197,9 @@ OC.L10N.register( "Current password" : "Praegune parool", "New password" : "Uus parool", "Change password" : "Muuda parooli", - "Name" : "Nimi", "Language" : "Keel", "Help translate" : "Aita tõlkida", + "Name" : "Nimi", "Get the apps to sync your files" : "Hangi rakendusi failide sünkroniseerimiseks", "Desktop client" : "Töölaua klient", "Android app" : "Androidi rakendus", diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json index d65f6fa7c1..10a38ccf3d 100644 --- a/settings/l10n/et_EE.json +++ b/settings/l10n/et_EE.json @@ -195,9 +195,9 @@ "Current password" : "Praegune parool", "New password" : "Uus parool", "Change password" : "Muuda parooli", - "Name" : "Nimi", "Language" : "Keel", "Help translate" : "Aita tõlkida", + "Name" : "Nimi", "Get the apps to sync your files" : "Hangi rakendusi failide sünkroniseerimiseks", "Desktop client" : "Töölaua klient", "Android app" : "Androidi rakendus", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 7e45f14452..963ecf4609 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -161,9 +161,9 @@ OC.L10N.register( "Current password" : "Uneko pasahitza", "New password" : "Pasahitz berria", "Change password" : "Aldatu pasahitza", - "Name" : "Izena", "Language" : "Hizkuntza", "Help translate" : "Lagundu itzultzen", + "Name" : "Izena", "Get the apps to sync your files" : "Lortu aplikazioak zure fitxategiak sinkronizatzeko", "Desktop client" : "Mahaigaineko bezeroa", "Android app" : "Android aplikazioa", diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 204d1a4510..41a0c348dc 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -159,9 +159,9 @@ "Current password" : "Uneko pasahitza", "New password" : "Pasahitz berria", "Change password" : "Aldatu pasahitza", - "Name" : "Izena", "Language" : "Hizkuntza", "Help translate" : "Lagundu itzultzen", + "Name" : "Izena", "Get the apps to sync your files" : "Lortu aplikazioak zure fitxategiak sinkronizatzeko", "Desktop client" : "Mahaigaineko bezeroa", "Android app" : "Android aplikazioa", diff --git a/settings/l10n/fa.js b/settings/l10n/fa.js index c6d8a17b4f..591e7c429c 100644 --- a/settings/l10n/fa.js +++ b/settings/l10n/fa.js @@ -186,9 +186,9 @@ OC.L10N.register( "Current password" : "گذرواژه کنونی", "New password" : "گذرواژه جدید", "Change password" : "تغییر گذر واژه", - "Name" : "نام", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Name" : "نام", "Get the apps to sync your files" : "برنامه ها را دریافت کنید تا فایل هایتان را همگام سازید", "Desktop client" : "نرم افزار دسکتاپ", "Android app" : "اپ اندروید", diff --git a/settings/l10n/fa.json b/settings/l10n/fa.json index 19c9426a8b..b1c27a0c26 100644 --- a/settings/l10n/fa.json +++ b/settings/l10n/fa.json @@ -184,9 +184,9 @@ "Current password" : "گذرواژه کنونی", "New password" : "گذرواژه جدید", "Change password" : "تغییر گذر واژه", - "Name" : "نام", "Language" : "زبان", "Help translate" : "به ترجمه آن کمک کنید", + "Name" : "نام", "Get the apps to sync your files" : "برنامه ها را دریافت کنید تا فایل هایتان را همگام سازید", "Desktop client" : "نرم افزار دسکتاپ", "Android app" : "اپ اندروید", diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index c05e237646..d4f6029656 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -115,7 +115,6 @@ OC.L10N.register( "Unlimited" : "Rajoittamaton", "Personal info" : "Henkilökohtaiset tiedot", "Sessions" : "Istunnot", - "Devices" : "Laitteet", "Sync clients" : "Synkronointisovellukset", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", @@ -254,14 +253,12 @@ OC.L10N.register( "Current password" : "Nykyinen salasana", "New password" : "Uusi salasana", "Change password" : "Vaihda salasana", + "Language" : "Kieli", + "Help translate" : "Auta kääntämisessä", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Nämä ovat parhaillaan ownCloudiisi kirjautuneet verkko-, työpöytä- ja mobiilisovellukset.", "Browser" : "Selain", "Most recent activity" : "Viimeisimmät toimet", - "You've linked these devices." : "Olet linkittänyt nämä laitteet.", "Name" : "Nimi", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Laitesalasana on suojakoodi, jonka avulla sovellus tai laite saa oikeuden käyttää ownCloud-tiliäsi.", - "Language" : "Kieli", - "Help translate" : "Auta kääntämisessä", "Get the apps to sync your files" : "Aseta sovellukset synkronoimaan tiedostosi", "Desktop client" : "Työpöytäsovellus", "Android app" : "Android-sovellus", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index 618e413f53..ae3082c742 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -113,7 +113,6 @@ "Unlimited" : "Rajoittamaton", "Personal info" : "Henkilökohtaiset tiedot", "Sessions" : "Istunnot", - "Devices" : "Laitteet", "Sync clients" : "Synkronointisovellukset", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", @@ -252,14 +251,12 @@ "Current password" : "Nykyinen salasana", "New password" : "Uusi salasana", "Change password" : "Vaihda salasana", + "Language" : "Kieli", + "Help translate" : "Auta kääntämisessä", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Nämä ovat parhaillaan ownCloudiisi kirjautuneet verkko-, työpöytä- ja mobiilisovellukset.", "Browser" : "Selain", "Most recent activity" : "Viimeisimmät toimet", - "You've linked these devices." : "Olet linkittänyt nämä laitteet.", "Name" : "Nimi", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Laitesalasana on suojakoodi, jonka avulla sovellus tai laite saa oikeuden käyttää ownCloud-tiliäsi.", - "Language" : "Kieli", - "Help translate" : "Auta kääntämisessä", "Get the apps to sync your files" : "Aseta sovellukset synkronoimaan tiedostosi", "Desktop client" : "Työpöytäsovellus", "Android app" : "Android-sovellus", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index ce960b80f9..daae89902d 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -118,7 +118,6 @@ OC.L10N.register( "__language_name__" : "Français", "Unlimited" : "Illimité", "Personal info" : "Informations personnelles", - "Devices" : "Appareils", "Sync clients" : "Clients de synchronisation", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", "Info, warnings, errors and fatal issues" : "Informations, avertissements, erreurs et erreurs fatales", @@ -267,14 +266,12 @@ OC.L10N.register( "Current password" : "Mot de passe actuel", "New password" : "Nouveau mot de passe", "Change password" : "Changer de mot de passe", + "Language" : "Langue", + "Help translate" : "Aidez à traduire", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Voici les clients web, de bureau et mobiles actuellement connectés à votre ownCloud.", "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", - "You've linked these devices." : "Vous avez liés ces périphériques.", "Name" : "Nom", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Un mot de passe d'un appareil est un code d'accès qui donne à une application ou à un appareil les droits d'accès à votre compte ownCloud.", - "Language" : "Langue", - "Help translate" : "Aidez à traduire", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", "Desktop client" : "Client de bureau", "Android app" : "Application Android", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 6f4b747862..76e17de70e 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -116,7 +116,6 @@ "__language_name__" : "Français", "Unlimited" : "Illimité", "Personal info" : "Informations personnelles", - "Devices" : "Appareils", "Sync clients" : "Clients de synchronisation", "Everything (fatal issues, errors, warnings, info, debug)" : "Tout (erreurs fatales, erreurs, avertissements, informations, debogage)", "Info, warnings, errors and fatal issues" : "Informations, avertissements, erreurs et erreurs fatales", @@ -265,14 +264,12 @@ "Current password" : "Mot de passe actuel", "New password" : "Nouveau mot de passe", "Change password" : "Changer de mot de passe", + "Language" : "Langue", + "Help translate" : "Aidez à traduire", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Voici les clients web, de bureau et mobiles actuellement connectés à votre ownCloud.", "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", - "You've linked these devices." : "Vous avez liés ces périphériques.", "Name" : "Nom", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Un mot de passe d'un appareil est un code d'accès qui donne à une application ou à un appareil les droits d'accès à votre compte ownCloud.", - "Language" : "Langue", - "Help translate" : "Aidez à traduire", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", "Desktop client" : "Client de bureau", "Android app" : "Application Android", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index fe21e8e143..8c03be24ee 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -223,9 +223,9 @@ OC.L10N.register( "Current password" : "Contrasinal actual", "New password" : "Novo contrasinal", "Change password" : "Cambiar o contrasinal", - "Name" : "Nome", "Language" : "Idioma", "Help translate" : "Axude na tradución", + "Name" : "Nome", "Get the apps to sync your files" : "Obteña as aplicacións para sincronizar os seus ficheiros", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación Android", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index 92f0788ba4..9e565f8919 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -221,9 +221,9 @@ "Current password" : "Contrasinal actual", "New password" : "Novo contrasinal", "Change password" : "Cambiar o contrasinal", - "Name" : "Nome", "Language" : "Idioma", "Help translate" : "Axude na tradución", + "Name" : "Nome", "Get the apps to sync your files" : "Obteña as aplicacións para sincronizar os seus ficheiros", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación Android", diff --git a/settings/l10n/he.js b/settings/l10n/he.js index a8a0cf420e..c78e89b6ea 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", "Sessions" : "שיחות", - "Devices" : "התקנים", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "סיסמא נוכחית", "New password" : "סיסמא חדשה", "Change password" : "שינוי סיסמא", + "Language" : "שפה", + "Help translate" : "עזרה בתרגום", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", - "You've linked these devices." : "ההתקנים האלו קושרו.", "Name" : "שם", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "סיסמת התקן הנה קוד סודי שמאפשר הרשאות ליישום או התקן להכנס לחשבון ה- ownCloud שלך.", - "Language" : "שפה", - "Help translate" : "עזרה בתרגום", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", "Desktop client" : "מחשב אישי", "Android app" : "יישום אנדרואיד", diff --git a/settings/l10n/he.json b/settings/l10n/he.json index bf367ed602..60b4ecc8de 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -117,7 +117,6 @@ "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", "Sessions" : "שיחות", - "Devices" : "התקנים", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", @@ -267,14 +266,12 @@ "Current password" : "סיסמא נוכחית", "New password" : "סיסמא חדשה", "Change password" : "שינוי סיסמא", + "Language" : "שפה", + "Help translate" : "עזרה בתרגום", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", - "You've linked these devices." : "ההתקנים האלו קושרו.", "Name" : "שם", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "סיסמת התקן הנה קוד סודי שמאפשר הרשאות ליישום או התקן להכנס לחשבון ה- ownCloud שלך.", - "Language" : "שפה", - "Help translate" : "עזרה בתרגום", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", "Desktop client" : "מחשב אישי", "Android app" : "יישום אנדרואיד", diff --git a/settings/l10n/hr.js b/settings/l10n/hr.js index 653b9c540b..04562940a6 100644 --- a/settings/l10n/hr.js +++ b/settings/l10n/hr.js @@ -132,9 +132,9 @@ OC.L10N.register( "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Promijenite lozinku", - "Name" : "Naziv", "Language" : "Jezik", "Help translate" : "Pomozite prevesti", + "Name" : "Naziv", "Get the apps to sync your files" : "Koristite aplikacije za sinkronizaciju svojih datoteka", "Show First Run Wizard again" : "Opet pokažite First Run Wizard", "Show storage location" : "Prikaži mjesto pohrane", diff --git a/settings/l10n/hr.json b/settings/l10n/hr.json index d663d9152a..0d06db8f80 100644 --- a/settings/l10n/hr.json +++ b/settings/l10n/hr.json @@ -130,9 +130,9 @@ "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Promijenite lozinku", - "Name" : "Naziv", "Language" : "Jezik", "Help translate" : "Pomozite prevesti", + "Name" : "Naziv", "Get the apps to sync your files" : "Koristite aplikacije za sinkronizaciju svojih datoteka", "Show First Run Wizard again" : "Opet pokažite First Run Wizard", "Show storage location" : "Prikaži mjesto pohrane", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index cc1b2b322f..065b4d3117 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -258,9 +258,9 @@ OC.L10N.register( "Current password" : "A jelenlegi jelszó", "New password" : "Az új jelszó", "Change password" : "A jelszó megváltoztatása", - "Name" : "Név", "Language" : "Nyelv", "Help translate" : "Segítsen a fordításban!", + "Name" : "Név", "Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!", "Desktop client" : "Asztali kliens", "Android app" : "Android applikáció", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 8e4e8595ba..3869df4e66 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -256,9 +256,9 @@ "Current password" : "A jelenlegi jelszó", "New password" : "Az új jelszó", "Change password" : "A jelszó megváltoztatása", - "Name" : "Név", "Language" : "Nyelv", "Help translate" : "Segítsen a fordításban!", + "Name" : "Név", "Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!", "Desktop client" : "Asztali kliens", "Android app" : "Android applikáció", diff --git a/settings/l10n/hy.js b/settings/l10n/hy.js index 16e0069913..cef2aec5e7 100644 --- a/settings/l10n/hy.js +++ b/settings/l10n/hy.js @@ -23,9 +23,9 @@ OC.L10N.register( "Password" : "Գաղտնաբառ", "New password" : "Նոր գաղտնաբառ", "Change password" : "Փոխել գաղտնաբառը", - "Name" : "Անուն", "Language" : "Լեզու", "Help translate" : "Օգնել թարգմանել", + "Name" : "Անուն", "Username" : "Օգտանուն", "Group" : "Խումբ", "Other" : "Այլ" diff --git a/settings/l10n/hy.json b/settings/l10n/hy.json index 50db186ef4..90f9363d45 100644 --- a/settings/l10n/hy.json +++ b/settings/l10n/hy.json @@ -21,9 +21,9 @@ "Password" : "Գաղտնաբառ", "New password" : "Նոր գաղտնաբառ", "Change password" : "Փոխել գաղտնաբառը", - "Name" : "Անուն", "Language" : "Լեզու", "Help translate" : "Օգնել թարգմանել", + "Name" : "Անուն", "Username" : "Օգտանուն", "Group" : "Խումբ", "Other" : "Այլ" diff --git a/settings/l10n/ia.js b/settings/l10n/ia.js index d8ee2f7b95..e772ddb4e6 100644 --- a/settings/l10n/ia.js +++ b/settings/l10n/ia.js @@ -29,9 +29,9 @@ OC.L10N.register( "Current password" : "Contrasigno currente", "New password" : "Nove contrasigno", "Change password" : "Cambiar contrasigno", - "Name" : "Nomine", "Language" : "Linguage", "Help translate" : "Adjuta a traducer", + "Name" : "Nomine", "Get the apps to sync your files" : "Obtene le apps (applicationes) pro synchronizar tu files", "Username" : "Nomine de usator", "Create" : "Crear", diff --git a/settings/l10n/ia.json b/settings/l10n/ia.json index 5d8b38f65b..d8b66b0877 100644 --- a/settings/l10n/ia.json +++ b/settings/l10n/ia.json @@ -27,9 +27,9 @@ "Current password" : "Contrasigno currente", "New password" : "Nove contrasigno", "Change password" : "Cambiar contrasigno", - "Name" : "Nomine", "Language" : "Linguage", "Help translate" : "Adjuta a traducer", + "Name" : "Nomine", "Get the apps to sync your files" : "Obtene le apps (applicationes) pro synchronizar tu files", "Username" : "Nomine de usator", "Create" : "Crear", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index e978b49dba..27ccfc4433 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -233,9 +233,9 @@ OC.L10N.register( "Current password" : "Sandi saat ini", "New password" : "Sandi baru", "Change password" : "Ubah sandi", - "Name" : "Nama", "Language" : "Bahasa", "Help translate" : "Bantu menerjemahkan", + "Name" : "Nama", "Get the apps to sync your files" : "Dapatkan aplikasi untuk sinkronisasi berkas Anda", "Desktop client" : "Klien desktop", "Android app" : "Aplikasi Android", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index 336a1c2293..c4737e1e9d 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -231,9 +231,9 @@ "Current password" : "Sandi saat ini", "New password" : "Sandi baru", "Change password" : "Ubah sandi", - "Name" : "Nama", "Language" : "Bahasa", "Help translate" : "Bantu menerjemahkan", + "Name" : "Nama", "Get the apps to sync your files" : "Dapatkan aplikasi untuk sinkronisasi berkas Anda", "Desktop client" : "Klien desktop", "Android app" : "Aplikasi Android", diff --git a/settings/l10n/is.js b/settings/l10n/is.js index 55f8ad6ec1..aa870d28d5 100644 --- a/settings/l10n/is.js +++ b/settings/l10n/is.js @@ -243,9 +243,9 @@ OC.L10N.register( "Current password" : "Núverandi lykilorð", "New password" : "Nýtt lykilorð", "Change password" : "Breyta lykilorði", - "Name" : "Heiti", "Language" : "Tungumál", "Help translate" : "Hjálpa við þýðingu", + "Name" : "Heiti", "Get the apps to sync your files" : "Náðu í forrit til að samstilla skrárnar þínar", "Desktop client" : "Skjáborðsforrit", "Android app" : "Android-forrit", diff --git a/settings/l10n/is.json b/settings/l10n/is.json index 8933e59345..0f9291d191 100644 --- a/settings/l10n/is.json +++ b/settings/l10n/is.json @@ -241,9 +241,9 @@ "Current password" : "Núverandi lykilorð", "New password" : "Nýtt lykilorð", "Change password" : "Breyta lykilorði", - "Name" : "Heiti", "Language" : "Tungumál", "Help translate" : "Hjálpa við þýðingu", + "Name" : "Heiti", "Get the apps to sync your files" : "Náðu í forrit til að samstilla skrárnar þínar", "Desktop client" : "Skjáborðsforrit", "Android app" : "Android-forrit", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 1d36d8156c..18aa0bf1aa 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Illimitata", "Personal info" : "Informazioni personali", "Sessions" : "Sessioni", - "Devices" : "Dispositivi", "Sync clients" : "Client di sincronizzazione", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", "Info, warnings, errors and fatal issues" : "Informazioni, avvisi, errori e problemi gravi", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Password attuale", "New password" : "Nuova password", "Change password" : "Modifica password", + "Language" : "Lingua", + "Help translate" : "Migliora la traduzione", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Questi sono i client web, desktop e mobile che hanno effettuato attualmente l'accesso al tuo ownCloud.", "Browser" : "Browser", "Most recent activity" : "Attività più recenti", - "You've linked these devices." : "Hai collegato questi dispositivi.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Una password di dispositivo è un codice di sicurezza che fornisce a un'applicazione o a un dispositivo i permessi per accedere al tuo account ownCloud.", - "Language" : "Lingua", - "Help translate" : "Migliora la traduzione", "Get the apps to sync your files" : "Scarica le applicazioni per sincronizzare i tuoi file", "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index 9d5c160b8b..e485dea67d 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -117,7 +117,6 @@ "Unlimited" : "Illimitata", "Personal info" : "Informazioni personali", "Sessions" : "Sessioni", - "Devices" : "Dispositivi", "Sync clients" : "Client di sincronizzazione", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", "Info, warnings, errors and fatal issues" : "Informazioni, avvisi, errori e problemi gravi", @@ -267,14 +266,12 @@ "Current password" : "Password attuale", "New password" : "Nuova password", "Change password" : "Modifica password", + "Language" : "Lingua", + "Help translate" : "Migliora la traduzione", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Questi sono i client web, desktop e mobile che hanno effettuato attualmente l'accesso al tuo ownCloud.", "Browser" : "Browser", "Most recent activity" : "Attività più recenti", - "You've linked these devices." : "Hai collegato questi dispositivi.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Una password di dispositivo è un codice di sicurezza che fornisce a un'applicazione o a un dispositivo i permessi per accedere al tuo account ownCloud.", - "Language" : "Lingua", - "Help translate" : "Migliora la traduzione", "Get the apps to sync your files" : "Scarica le applicazioni per sincronizzare i tuoi file", "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index 2e138c4348..ad8544158e 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "無制限", "Personal info" : "個人情報", "Sessions" : "セッション", - "Devices" : "デバイス", "Sync clients" : "同期用クライアント", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", "Info, warnings, errors and fatal issues" : "情報、警告、エラー、致命的な問題", @@ -267,13 +266,11 @@ OC.L10N.register( "Current password" : "現在のパスワード", "New password" : "新しいパスワード", "Change password" : "パスワードを変更", - "Browser" : "ブラウザ", - "Most recent activity" : "最新のアクティビティ", - "You've linked these devices." : "以下のデバイスをリンクしました。", - "Name" : "名前", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "デバイスパスワードはownCloudアカウントがアプリにアクセスするためアクセス許可をデバイスに与えるパスコードです。", "Language" : "言語", "Help translate" : "翻訳に協力する", + "Browser" : "ブラウザ", + "Most recent activity" : "最新のアクティビティ", + "Name" : "名前", "Get the apps to sync your files" : "ファイルを同期するアプリを取得しましょう", "Desktop client" : "デスクトップクライアント", "Android app" : "Androidアプリ", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index 310637d787..e42dcc03c4 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -117,7 +117,6 @@ "Unlimited" : "無制限", "Personal info" : "個人情報", "Sessions" : "セッション", - "Devices" : "デバイス", "Sync clients" : "同期用クライアント", "Everything (fatal issues, errors, warnings, info, debug)" : "すべて (致命的な問題、エラー、警告、情報、デバッグ)", "Info, warnings, errors and fatal issues" : "情報、警告、エラー、致命的な問題", @@ -265,13 +264,11 @@ "Current password" : "現在のパスワード", "New password" : "新しいパスワード", "Change password" : "パスワードを変更", - "Browser" : "ブラウザ", - "Most recent activity" : "最新のアクティビティ", - "You've linked these devices." : "以下のデバイスをリンクしました。", - "Name" : "名前", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "デバイスパスワードはownCloudアカウントがアプリにアクセスするためアクセス許可をデバイスに与えるパスコードです。", "Language" : "言語", "Help translate" : "翻訳に協力する", + "Browser" : "ブラウザ", + "Most recent activity" : "最新のアクティビティ", + "Name" : "名前", "Get the apps to sync your files" : "ファイルを同期するアプリを取得しましょう", "Desktop client" : "デスクトップクライアント", "Android app" : "Androidアプリ", diff --git a/settings/l10n/ka_GE.js b/settings/l10n/ka_GE.js index 41f84a34d7..2d125ba799 100644 --- a/settings/l10n/ka_GE.js +++ b/settings/l10n/ka_GE.js @@ -52,9 +52,9 @@ OC.L10N.register( "Current password" : "მიმდინარე პაროლი", "New password" : "ახალი პაროლი", "Change password" : "პაროლის შეცვლა", - "Name" : "სახელი", "Language" : "ენა", "Help translate" : "თარგმნის დახმარება", + "Name" : "სახელი", "Get the apps to sync your files" : "აპლიკაცია ფაილების სინქრონიზაციისთვის", "Show First Run Wizard again" : "მაჩვენე თავიდან გაშვებული ვიზარდი", "Username" : "მომხმარებლის სახელი", diff --git a/settings/l10n/ka_GE.json b/settings/l10n/ka_GE.json index 87ead0dce9..11fb2e4e2d 100644 --- a/settings/l10n/ka_GE.json +++ b/settings/l10n/ka_GE.json @@ -50,9 +50,9 @@ "Current password" : "მიმდინარე პაროლი", "New password" : "ახალი პაროლი", "Change password" : "პაროლის შეცვლა", - "Name" : "სახელი", "Language" : "ენა", "Help translate" : "თარგმნის დახმარება", + "Name" : "სახელი", "Get the apps to sync your files" : "აპლიკაცია ფაილების სინქრონიზაციისთვის", "Show First Run Wizard again" : "მაჩვენე თავიდან გაშვებული ვიზარდი", "Username" : "მომხმარებლის სახელი", diff --git a/settings/l10n/km.js b/settings/l10n/km.js index b4222fb714..a5de441b36 100644 --- a/settings/l10n/km.js +++ b/settings/l10n/km.js @@ -71,9 +71,9 @@ OC.L10N.register( "Current password" : "ពាក្យសម្ងាត់​បច្ចុប្បន្ន", "New password" : "ពាក្យ​សម្ងាត់​ថ្មី", "Change password" : "ប្តូរ​ពាក្យសម្ងាត់", - "Name" : "ឈ្មោះ", "Language" : "ភាសា", "Help translate" : "ជួយ​បក​ប្រែ", + "Name" : "ឈ្មោះ", "Get the apps to sync your files" : "ដាក់​អោយកម្មវិធីផ្សេងៗ ​ធ្វើសមកាលកម្ម​ឯកសារ​អ្នក", "Show First Run Wizard again" : "បង្ហាញ First Run Wizard ម្តង​ទៀត", "Username" : "ឈ្មោះ​អ្នកប្រើ", diff --git a/settings/l10n/km.json b/settings/l10n/km.json index 4fa00aca32..91f83037b4 100644 --- a/settings/l10n/km.json +++ b/settings/l10n/km.json @@ -69,9 +69,9 @@ "Current password" : "ពាក្យសម្ងាត់​បច្ចុប្បន្ន", "New password" : "ពាក្យ​សម្ងាត់​ថ្មី", "Change password" : "ប្តូរ​ពាក្យសម្ងាត់", - "Name" : "ឈ្មោះ", "Language" : "ភាសា", "Help translate" : "ជួយ​បក​ប្រែ", + "Name" : "ឈ្មោះ", "Get the apps to sync your files" : "ដាក់​អោយកម្មវិធីផ្សេងៗ ​ធ្វើសមកាលកម្ម​ឯកសារ​អ្នក", "Show First Run Wizard again" : "បង្ហាញ First Run Wizard ម្តង​ទៀត", "Username" : "ឈ្មោះ​អ្នកប្រើ", diff --git a/settings/l10n/kn.js b/settings/l10n/kn.js index de48a66a0d..987cb13491 100644 --- a/settings/l10n/kn.js +++ b/settings/l10n/kn.js @@ -106,9 +106,9 @@ OC.L10N.register( "Current password" : "ಪ್ರಸ್ತುತ ಗುಪ್ತಪದ", "New password" : "ಹೊಸ ಗುಪ್ತಪದ", "Change password" : "ಗುಪ್ತ ಪದವನ್ನು ಬದಲಾಯಿಸಿ", - "Name" : "ಹೆಸರು", "Language" : "ಭಾಷೆ", "Help translate" : "ಭಾಷಾಂತರಿಸಲು ಸಹಾಯ ಮಾಡಿ", + "Name" : "ಹೆಸರು", "Username" : "ಬಳಕೆಯ ಹೆಸರು", "E-Mail" : "ಇ-ಅಂಚೆ ವಿಳಾಸ", "Create" : "ಸೃಷ್ಟಿಸಿ", diff --git a/settings/l10n/kn.json b/settings/l10n/kn.json index 2422d0ee68..91d08cc0b5 100644 --- a/settings/l10n/kn.json +++ b/settings/l10n/kn.json @@ -104,9 +104,9 @@ "Current password" : "ಪ್ರಸ್ತುತ ಗುಪ್ತಪದ", "New password" : "ಹೊಸ ಗುಪ್ತಪದ", "Change password" : "ಗುಪ್ತ ಪದವನ್ನು ಬದಲಾಯಿಸಿ", - "Name" : "ಹೆಸರು", "Language" : "ಭಾಷೆ", "Help translate" : "ಭಾಷಾಂತರಿಸಲು ಸಹಾಯ ಮಾಡಿ", + "Name" : "ಹೆಸರು", "Username" : "ಬಳಕೆಯ ಹೆಸರು", "E-Mail" : "ಇ-ಅಂಚೆ ವಿಳಾಸ", "Create" : "ಸೃಷ್ಟಿಸಿ", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index d7727b0add..b0c4ea2f20 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -250,9 +250,9 @@ OC.L10N.register( "Current password" : "현재 암호", "New password" : "새 암호", "Change password" : "암호 변경", - "Name" : "이름", "Language" : "언어", "Help translate" : "번역 돕기", + "Name" : "이름", "Get the apps to sync your files" : "파일 동기화 앱 가져오기", "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 4b096f6697..8921e3ecbc 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -248,9 +248,9 @@ "Current password" : "현재 암호", "New password" : "새 암호", "Change password" : "암호 변경", - "Name" : "이름", "Language" : "언어", "Help translate" : "번역 돕기", + "Name" : "이름", "Get the apps to sync your files" : "파일 동기화 앱 가져오기", "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", diff --git a/settings/l10n/lt_LT.js b/settings/l10n/lt_LT.js index 83c2e715dc..18b71c4553 100644 --- a/settings/l10n/lt_LT.js +++ b/settings/l10n/lt_LT.js @@ -92,9 +92,9 @@ OC.L10N.register( "Current password" : "Dabartinis slaptažodis", "New password" : "Naujas slaptažodis", "Change password" : "Pakeisti slaptažodį", - "Name" : "Pavadinimas", "Language" : "Kalba", "Help translate" : "Padėkite išversti", + "Name" : "Pavadinimas", "Get the apps to sync your files" : "Atsisiųskite programėlių, kad sinchronizuotumėte savo failus", "Desktop client" : "Darbastalio klientas", "Android app" : "Android programa", diff --git a/settings/l10n/lt_LT.json b/settings/l10n/lt_LT.json index 3cbf7c8bc9..4a26ae8bf7 100644 --- a/settings/l10n/lt_LT.json +++ b/settings/l10n/lt_LT.json @@ -90,9 +90,9 @@ "Current password" : "Dabartinis slaptažodis", "New password" : "Naujas slaptažodis", "Change password" : "Pakeisti slaptažodį", - "Name" : "Pavadinimas", "Language" : "Kalba", "Help translate" : "Padėkite išversti", + "Name" : "Pavadinimas", "Get the apps to sync your files" : "Atsisiųskite programėlių, kad sinchronizuotumėte savo failus", "Desktop client" : "Darbastalio klientas", "Android app" : "Android programa", diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index 373468f486..9f421dd137 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -134,9 +134,9 @@ OC.L10N.register( "Current password" : "Pašreizējā parole", "New password" : "Jauna parole", "Change password" : "Mainīt paroli", - "Name" : "Nosaukums", "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", + "Name" : "Nosaukums", "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", "Android app" : "Android lietotne", diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 4cd06ecd22..52655dbfd1 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -132,9 +132,9 @@ "Current password" : "Pašreizējā parole", "New password" : "Jauna parole", "Change password" : "Mainīt paroli", - "Name" : "Nosaukums", "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", + "Name" : "Nosaukums", "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", "Android app" : "Android lietotne", diff --git a/settings/l10n/mk.js b/settings/l10n/mk.js index e184f72513..088ea3c14d 100644 --- a/settings/l10n/mk.js +++ b/settings/l10n/mk.js @@ -165,9 +165,9 @@ OC.L10N.register( "Current password" : "Моментална лозинка", "New password" : "Нова лозинка", "Change password" : "Смени лозинка", - "Name" : "Име", "Language" : "Јазик", "Help translate" : "Помогни во преводот", + "Name" : "Име", "Get the apps to sync your files" : "Преземете апликации за синхронизирање на вашите датотеки", "Show First Run Wizard again" : "Прикажи го повторно волшебникот при првото стартување", "Username" : "Корисничко име", diff --git a/settings/l10n/mk.json b/settings/l10n/mk.json index ce7291c9cb..169f2328fb 100644 --- a/settings/l10n/mk.json +++ b/settings/l10n/mk.json @@ -163,9 +163,9 @@ "Current password" : "Моментална лозинка", "New password" : "Нова лозинка", "Change password" : "Смени лозинка", - "Name" : "Име", "Language" : "Јазик", "Help translate" : "Помогни во преводот", + "Name" : "Име", "Get the apps to sync your files" : "Преземете апликации за синхронизирање на вашите датотеки", "Show First Run Wizard again" : "Прикажи го повторно волшебникот при првото стартување", "Username" : "Корисничко име", diff --git a/settings/l10n/ms_MY.js b/settings/l10n/ms_MY.js index e474482799..87f26cef18 100644 --- a/settings/l10n/ms_MY.js +++ b/settings/l10n/ms_MY.js @@ -24,9 +24,9 @@ OC.L10N.register( "Current password" : "Kata laluan semasa", "New password" : "Kata laluan baru", "Change password" : "Ubah kata laluan", - "Name" : "Nama", "Language" : "Bahasa", "Help translate" : "Bantu terjemah", + "Name" : "Nama", "Username" : "Nama pengguna", "Create" : "Buat", "Default Quota" : "Kuota Lalai", diff --git a/settings/l10n/ms_MY.json b/settings/l10n/ms_MY.json index 353c93059a..3a48456243 100644 --- a/settings/l10n/ms_MY.json +++ b/settings/l10n/ms_MY.json @@ -22,9 +22,9 @@ "Current password" : "Kata laluan semasa", "New password" : "Kata laluan baru", "Change password" : "Ubah kata laluan", - "Name" : "Nama", "Language" : "Bahasa", "Help translate" : "Bantu terjemah", + "Name" : "Nama", "Username" : "Nama pengguna", "Create" : "Buat", "Default Quota" : "Kuota Lalai", diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 7fdadca911..752e0644d8 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -259,9 +259,9 @@ OC.L10N.register( "Current password" : "Nåværende passord", "New password" : "Nytt passord", "Change password" : "Endre passord", - "Name" : "Navn", "Language" : "Språk", "Help translate" : "Bidra til oversettelsen", + "Name" : "Navn", "Get the apps to sync your files" : "Hent apper som synkroniserer filene dine", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 6a4052810a..09dd026cbb 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -257,9 +257,9 @@ "Current password" : "Nåværende passord", "New password" : "Nytt passord", "Change password" : "Endre passord", - "Name" : "Navn", "Language" : "Språk", "Help translate" : "Bidra til oversettelsen", + "Name" : "Navn", "Get the apps to sync your files" : "Hent apper som synkroniserer filene dine", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index 859fd324b9..e68d30fb1b 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Ongelimiteerd", "Personal info" : "Persoonlijke info", "Sessions" : "Sessies", - "Devices" : "Apparaten", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", "Info, warnings, errors and fatal issues" : "Info, waarschuwingen, fouten en fatale problemen", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Huidig wachtwoord", "New password" : "Nieuw", "Change password" : "Wijzig wachtwoord", + "Language" : "Taal", + "Help translate" : "Help met vertalen", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dit zijn de web, desktop en mobiele clients die momenteel zijn verbonden met uw ownCloud.", "Browser" : "Browser", "Most recent activity" : "Meest recente activiteit", - "You've linked these devices." : "U hebt deze apparaten gekoppeld.", "Name" : "Naam", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Een apparaat wachtwoord is een toegangscode waarmee een app of apparaat toegang krijgt om uw ownCloud account te gebruiken.", - "Language" : "Taal", - "Help translate" : "Help met vertalen", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index f77d3c0809..77860f07c5 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -117,7 +117,6 @@ "Unlimited" : "Ongelimiteerd", "Personal info" : "Persoonlijke info", "Sessions" : "Sessies", - "Devices" : "Apparaten", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale problemen, fouten, waarschuwingen, info, debug)", "Info, warnings, errors and fatal issues" : "Info, waarschuwingen, fouten en fatale problemen", @@ -267,14 +266,12 @@ "Current password" : "Huidig wachtwoord", "New password" : "Nieuw", "Change password" : "Wijzig wachtwoord", + "Language" : "Taal", + "Help translate" : "Help met vertalen", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dit zijn de web, desktop en mobiele clients die momenteel zijn verbonden met uw ownCloud.", "Browser" : "Browser", "Most recent activity" : "Meest recente activiteit", - "You've linked these devices." : "U hebt deze apparaten gekoppeld.", "Name" : "Naam", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Een apparaat wachtwoord is een toegangscode waarmee een app of apparaat toegang krijgt om uw ownCloud account te gebruiken.", - "Language" : "Taal", - "Help translate" : "Help met vertalen", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/nn_NO.js b/settings/l10n/nn_NO.js index 9ab1943bf7..33421d700b 100644 --- a/settings/l10n/nn_NO.js +++ b/settings/l10n/nn_NO.js @@ -65,9 +65,9 @@ OC.L10N.register( "Current password" : "Passord", "New password" : "Nytt passord", "Change password" : "Endra passord", - "Name" : "Namn", "Language" : "Språk", "Help translate" : "Hjelp oss å omsetja", + "Name" : "Namn", "Get the apps to sync your files" : "Få app-ar som kan synkronisera filene dine", "Show First Run Wizard again" : "Vis Oppstartvegvisaren igjen", "Username" : "Brukarnamn", diff --git a/settings/l10n/nn_NO.json b/settings/l10n/nn_NO.json index 23f857d38a..14b0aea0bc 100644 --- a/settings/l10n/nn_NO.json +++ b/settings/l10n/nn_NO.json @@ -63,9 +63,9 @@ "Current password" : "Passord", "New password" : "Nytt passord", "Change password" : "Endra passord", - "Name" : "Namn", "Language" : "Språk", "Help translate" : "Hjelp oss å omsetja", + "Name" : "Namn", "Get the apps to sync your files" : "Få app-ar som kan synkronisera filene dine", "Show First Run Wizard again" : "Vis Oppstartvegvisaren igjen", "Username" : "Brukarnamn", diff --git a/settings/l10n/oc.js b/settings/l10n/oc.js index a795f44806..7ae654d1f4 100644 --- a/settings/l10n/oc.js +++ b/settings/l10n/oc.js @@ -234,9 +234,9 @@ OC.L10N.register( "Current password" : "Senhal actual", "New password" : "Senhal novèl", "Change password" : "Cambiar de senhal", - "Name" : "Nom", "Language" : "Lenga", "Help translate" : "Ajudatz a tradusir", + "Name" : "Nom", "Get the apps to sync your files" : "Obtenètz las aplicacions de sincronizacion de vòstres fichièrs", "Desktop client" : "Client de burèu", "Android app" : "Aplicacion Android", diff --git a/settings/l10n/oc.json b/settings/l10n/oc.json index cdd0583f07..dd4eefe026 100644 --- a/settings/l10n/oc.json +++ b/settings/l10n/oc.json @@ -232,9 +232,9 @@ "Current password" : "Senhal actual", "New password" : "Senhal novèl", "Change password" : "Cambiar de senhal", - "Name" : "Nom", "Language" : "Lenga", "Help translate" : "Ajudatz a tradusir", + "Name" : "Nom", "Get the apps to sync your files" : "Obtenètz las aplicacions de sincronizacion de vòstres fichièrs", "Desktop client" : "Client de burèu", "Android app" : "Aplicacion Android", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 7278c7aa73..3bef124944 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -93,7 +93,6 @@ OC.L10N.register( "Unlimited" : "Bez limitu", "Personal info" : "Informacje osobiste", "Sessions" : "Sesje", - "Devices" : "Urządzenia", "Sync clients" : "Klienty synchronizacji", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", "Info, warnings, errors and fatal issues" : "Informacje, ostrzeżenia, błędy i poważne problemy", @@ -192,9 +191,9 @@ OC.L10N.register( "Current password" : "Bieżące hasło", "New password" : "Nowe hasło", "Change password" : "Zmień hasło", - "Name" : "Nazwa", "Language" : "Język", "Help translate" : "Pomóż w tłumaczeniu", + "Name" : "Nazwa", "Get the apps to sync your files" : "Pobierz aplikacje żeby synchronizować swoje pliki", "Desktop client" : "Klient na komputer", "Android app" : "Aplikacja Android", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index cc7022746c..bfb6eeb9f3 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -91,7 +91,6 @@ "Unlimited" : "Bez limitu", "Personal info" : "Informacje osobiste", "Sessions" : "Sesje", - "Devices" : "Urządzenia", "Sync clients" : "Klienty synchronizacji", "Everything (fatal issues, errors, warnings, info, debug)" : "Wszystko (Informacje, ostrzeżenia, błędy i poważne problemy, debug)", "Info, warnings, errors and fatal issues" : "Informacje, ostrzeżenia, błędy i poważne problemy", @@ -190,9 +189,9 @@ "Current password" : "Bieżące hasło", "New password" : "Nowe hasło", "Change password" : "Zmień hasło", - "Name" : "Nazwa", "Language" : "Język", "Help translate" : "Pomóż w tłumaczeniu", + "Name" : "Nazwa", "Get the apps to sync your files" : "Pobierz aplikacje żeby synchronizować swoje pliki", "Desktop client" : "Klient na komputer", "Android app" : "Aplikacja Android", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 1f015bb9f2..1984b5d1da 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", - "Devices" : "Dispositivos", "Sync clients" : "Clientes de Sincronização", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", "Info, warnings, errors and fatal issues" : "Informações, avisos, erros e problemas fatais", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Senha atual", "New password" : "Nova senha", "Change password" : "Alterar senha", + "Language" : "Idioma", + "Help translate" : "Ajude a traduzir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e clientes móveis atualmente conectado ao seu ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", - "You've linked these devices." : "Você vinculou esses dispositivos.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "A senha do dispositivo é uma senha que dá a um aplicativo ou dispositivo permissões para acessar sua conta ownCloud.", - "Language" : "Idioma", - "Help translate" : "Ajude a traduzir", "Get the apps to sync your files" : "Obtenha apps para sincronizar seus arquivos", "Desktop client" : "Cliente Desktop", "Android app" : "App Android", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 9396d801f0..3a522e1b7e 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -117,7 +117,6 @@ "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", - "Devices" : "Dispositivos", "Sync clients" : "Clientes de Sincronização", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", "Info, warnings, errors and fatal issues" : "Informações, avisos, erros e problemas fatais", @@ -267,14 +266,12 @@ "Current password" : "Senha atual", "New password" : "Nova senha", "Change password" : "Alterar senha", + "Language" : "Idioma", + "Help translate" : "Ajude a traduzir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e clientes móveis atualmente conectado ao seu ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", - "You've linked these devices." : "Você vinculou esses dispositivos.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "A senha do dispositivo é uma senha que dá a um aplicativo ou dispositivo permissões para acessar sua conta ownCloud.", - "Language" : "Idioma", - "Help translate" : "Ajude a traduzir", "Get the apps to sync your files" : "Obtenha apps para sincronizar seus arquivos", "Desktop client" : "Cliente Desktop", "Android app" : "App Android", diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index 2269cf1341..f6d5669340 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", - "Devices" : "Dispositivos", "Sync clients" : "Clientes de sync", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)", "Info, warnings, errors and fatal issues" : "Informação, avisos, erros e problemas fatais", @@ -268,14 +267,12 @@ OC.L10N.register( "Current password" : "Palavra-passe atual", "New password" : "Nova palavra-passe", "Change password" : "Alterar palavra-passe", + "Language" : "Idioma", + "Help translate" : "Ajude a traduzir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e móveis actualmente ligados à sua ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", - "You've linked these devices." : "Associou estes dispositivos.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Uma palavra-passe de dispositivo é o código que dá permissões à app ou dispositivo para aceder à sua conta ownCloud.", - "Language" : "Idioma", - "Help translate" : "Ajude a traduzir", "Get the apps to sync your files" : "Obtenha as aplicações para sincronizar os seus ficheiros", "Desktop client" : "Cliente Desktop", "Android app" : "Aplicação Android", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index 74c8728f61..aea78cd832 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -117,7 +117,6 @@ "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", - "Devices" : "Dispositivos", "Sync clients" : "Clientes de sync", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (problemas fatais, erros, avisos, informação, depuração)", "Info, warnings, errors and fatal issues" : "Informação, avisos, erros e problemas fatais", @@ -266,14 +265,12 @@ "Current password" : "Palavra-passe atual", "New password" : "Nova palavra-passe", "Change password" : "Alterar palavra-passe", + "Language" : "Idioma", + "Help translate" : "Ajude a traduzir", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e móveis actualmente ligados à sua ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", - "You've linked these devices." : "Associou estes dispositivos.", "Name" : "Nome", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Uma palavra-passe de dispositivo é o código que dá permissões à app ou dispositivo para aceder à sua conta ownCloud.", - "Language" : "Idioma", - "Help translate" : "Ajude a traduzir", "Get the apps to sync your files" : "Obtenha as aplicações para sincronizar os seus ficheiros", "Desktop client" : "Cliente Desktop", "Android app" : "Aplicação Android", diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js index bf874df1b6..b16986e611 100644 --- a/settings/l10n/ro.js +++ b/settings/l10n/ro.js @@ -91,7 +91,6 @@ OC.L10N.register( "Unlimited" : "Nelimitată", "Personal info" : "Informații personale", "Sessions" : "Sesiuni", - "Devices" : "Dispozitive", "Sync clients" : "Sincronizează clienții", "None" : "Niciuna", "Login" : "Autentificare", @@ -178,11 +177,10 @@ OC.L10N.register( "Current password" : "Parola curentă", "New password" : "Noua parolă", "Change password" : "Schimbă parola", - "Most recent activity" : "Cea mai recentă activitate", - "You've linked these devices." : "Ai legat aceste dispozitive.", - "Name" : "Nume", "Language" : "Limba", "Help translate" : "Ajută la traducere", + "Most recent activity" : "Cea mai recentă activitate", + "Name" : "Nume", "Get the apps to sync your files" : "Ia acum aplicatia pentru sincronizarea fisierelor ", "Desktop client" : "Client Desktop", "Android app" : "Aplicatie Android", diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json index 441dfef60c..aa38c2ec73 100644 --- a/settings/l10n/ro.json +++ b/settings/l10n/ro.json @@ -89,7 +89,6 @@ "Unlimited" : "Nelimitată", "Personal info" : "Informații personale", "Sessions" : "Sesiuni", - "Devices" : "Dispozitive", "Sync clients" : "Sincronizează clienții", "None" : "Niciuna", "Login" : "Autentificare", @@ -176,11 +175,10 @@ "Current password" : "Parola curentă", "New password" : "Noua parolă", "Change password" : "Schimbă parola", - "Most recent activity" : "Cea mai recentă activitate", - "You've linked these devices." : "Ai legat aceste dispozitive.", - "Name" : "Nume", "Language" : "Limba", "Help translate" : "Ajută la traducere", + "Most recent activity" : "Cea mai recentă activitate", + "Name" : "Nume", "Get the apps to sync your files" : "Ia acum aplicatia pentru sincronizarea fisierelor ", "Desktop client" : "Client Desktop", "Android app" : "Aplicatie Android", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index edc3f1f759..9a00364021 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Неограничено", "Personal info" : "Личная информация", "Sessions" : "Сессии", - "Devices" : "Устройства", "Sync clients" : "Синхронизирующиеся клиенты", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", "Info, warnings, errors and fatal issues" : "Информационные, предупреждения, ошибки и критические проблемы", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Текущий пароль", "New password" : "Новый пароль", "Change password" : "Сменить пароль", + "Language" : "Язык", + "Help translate" : "Помочь с переводом", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Это сессии, вошедшие в настоящий момент в ваш ownCloud через веб, клиенты для ПК или мобильных устройств.", "Browser" : "Браузер", "Most recent activity" : "Последняя активность", - "You've linked these devices." : "Вы привязали следующие устройства.", "Name" : "Название", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Пароль устройства — это контрольный код, который даёт приложению или устройству доступ к вашей учётной записи в ownCloud.", - "Language" : "Язык", - "Help translate" : "Помочь с переводом", "Get the apps to sync your files" : "Получить приложения для синхронизации ваших файлов", "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 76978fdbb1..0602644b93 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -117,7 +117,6 @@ "Unlimited" : "Неограничено", "Personal info" : "Личная информация", "Sessions" : "Сессии", - "Devices" : "Устройства", "Sync clients" : "Синхронизирующиеся клиенты", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", "Info, warnings, errors and fatal issues" : "Информационные, предупреждения, ошибки и критические проблемы", @@ -267,14 +266,12 @@ "Current password" : "Текущий пароль", "New password" : "Новый пароль", "Change password" : "Сменить пароль", + "Language" : "Язык", + "Help translate" : "Помочь с переводом", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Это сессии, вошедшие в настоящий момент в ваш ownCloud через веб, клиенты для ПК или мобильных устройств.", "Browser" : "Браузер", "Most recent activity" : "Последняя активность", - "You've linked these devices." : "Вы привязали следующие устройства.", "Name" : "Название", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Пароль устройства — это контрольный код, который даёт приложению или устройству доступ к вашей учётной записи в ownCloud.", - "Language" : "Язык", - "Help translate" : "Помочь с переводом", "Get the apps to sync your files" : "Получить приложения для синхронизации ваших файлов", "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", diff --git a/settings/l10n/si_LK.js b/settings/l10n/si_LK.js index 9d0343b3ab..49bfe0179a 100644 --- a/settings/l10n/si_LK.js +++ b/settings/l10n/si_LK.js @@ -33,9 +33,9 @@ OC.L10N.register( "Current password" : "වත්මන් මුරපදය", "New password" : "නව මුරපදය", "Change password" : "මුරපදය වෙනස් කිරීම", - "Name" : "නම", "Language" : "භාෂාව", "Help translate" : "පරිවර්ථන සහය", + "Name" : "නම", "Username" : "පරිශීලක නම", "Create" : "තනන්න", "Default Quota" : "සාමාන්‍ය සලාකය", diff --git a/settings/l10n/si_LK.json b/settings/l10n/si_LK.json index 24bee43d9a..8fd007d4c5 100644 --- a/settings/l10n/si_LK.json +++ b/settings/l10n/si_LK.json @@ -31,9 +31,9 @@ "Current password" : "වත්මන් මුරපදය", "New password" : "නව මුරපදය", "Change password" : "මුරපදය වෙනස් කිරීම", - "Name" : "නම", "Language" : "භාෂාව", "Help translate" : "පරිවර්ථන සහය", + "Name" : "නම", "Username" : "පරිශීලක නම", "Create" : "තනන්න", "Default Quota" : "සාමාන්‍ය සලාකය", diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index fcd54cdc92..2f35284708 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -211,9 +211,9 @@ OC.L10N.register( "Current password" : "Aktuálne heslo", "New password" : "Nové heslo", "Change password" : "Zmeniť heslo", - "Name" : "Názov", "Language" : "Jazyk", "Help translate" : "Pomôcť s prekladom", + "Name" : "Názov", "Get the apps to sync your files" : "Získať aplikácie na synchronizáciu vašich súborov", "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index 7b84596c60..4484930dfb 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -209,9 +209,9 @@ "Current password" : "Aktuálne heslo", "New password" : "Nové heslo", "Change password" : "Zmeniť heslo", - "Name" : "Názov", "Language" : "Jazyk", "Help translate" : "Pomôcť s prekladom", + "Name" : "Názov", "Get the apps to sync your files" : "Získať aplikácie na synchronizáciu vašich súborov", "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js index a875fc6437..b8b3e86782 100644 --- a/settings/l10n/sl.js +++ b/settings/l10n/sl.js @@ -111,7 +111,6 @@ OC.L10N.register( "Unlimited" : "Neomejeno", "Personal info" : "Osebni podatki", "Sessions" : "Seje", - "Devices" : "Naprave", "Sync clients" : "Uskladi odjemalce", "Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)", "Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke", @@ -232,11 +231,11 @@ OC.L10N.register( "Current password" : "Trenutno geslo", "New password" : "Novo geslo", "Change password" : "Spremeni geslo", + "Language" : "Jezik", + "Help translate" : "Sodelujte pri prevajanju", "Browser" : "Brskalnik", "Most recent activity" : "Zadnja dejavnost", "Name" : "Ime", - "Language" : "Jezik", - "Help translate" : "Sodelujte pri prevajanju", "Get the apps to sync your files" : "Pridobi programe za usklajevanje datotek", "Desktop client" : "Namizni odjemalec", "Android app" : "Program za Android", diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json index 41a60f1f9d..51b8c4e9eb 100644 --- a/settings/l10n/sl.json +++ b/settings/l10n/sl.json @@ -109,7 +109,6 @@ "Unlimited" : "Neomejeno", "Personal info" : "Osebni podatki", "Sessions" : "Seje", - "Devices" : "Naprave", "Sync clients" : "Uskladi odjemalce", "Everything (fatal issues, errors, warnings, info, debug)" : "Vse (podrobnosti, opozorila, hrošče, napake in usodne dogodke)", "Info, warnings, errors and fatal issues" : "Podrobnosti, opozorila, napake in usodne dogodke", @@ -230,11 +229,11 @@ "Current password" : "Trenutno geslo", "New password" : "Novo geslo", "Change password" : "Spremeni geslo", + "Language" : "Jezik", + "Help translate" : "Sodelujte pri prevajanju", "Browser" : "Brskalnik", "Most recent activity" : "Zadnja dejavnost", "Name" : "Ime", - "Language" : "Jezik", - "Help translate" : "Sodelujte pri prevajanju", "Get the apps to sync your files" : "Pridobi programe za usklajevanje datotek", "Desktop client" : "Namizni odjemalec", "Android app" : "Program za Android", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index 3572ee5a60..ee502c296a 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "E pakufizuar", "Personal info" : "Të dhëna personale", "Sessions" : "Sesione", - "Devices" : "Pajisje", "Sync clients" : "Klientë njëkohësimi", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", @@ -269,14 +268,12 @@ OC.L10N.register( "Current password" : "Fjalëkalimi i tanishëm", "New password" : "Fjalëkalimi i ri", "Change password" : "Ndrysho fjalëkalimin", + "Language" : "Gjuhë", + "Help translate" : "Ndihmoni në përkthim", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.", "Browser" : "Shfletues", "Most recent activity" : "Veprimtaria më e freskët", - "You've linked these devices." : "I keni të lidhura këto pajisje.", "Name" : "Emër", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Fjalëkalimi për një pajisje është një kodkalim që i jep një pajisjeje apo një aplikacioni leje të hyjë në llogarinë tuaj ownCloud.", - "Language" : "Gjuhë", - "Help translate" : "Ndihmoni në përkthim", "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index 15386e75ee..b79905c52c 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -117,7 +117,6 @@ "Unlimited" : "E pakufizuar", "Personal info" : "Të dhëna personale", "Sessions" : "Sesione", - "Devices" : "Pajisje", "Sync clients" : "Klientë njëkohësimi", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", @@ -267,14 +266,12 @@ "Current password" : "Fjalëkalimi i tanishëm", "New password" : "Fjalëkalimi i ri", "Change password" : "Ndrysho fjalëkalimin", + "Language" : "Gjuhë", + "Help translate" : "Ndihmoni në përkthim", "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.", "Browser" : "Shfletues", "Most recent activity" : "Veprimtaria më e freskët", - "You've linked these devices." : "I keni të lidhura këto pajisje.", "Name" : "Emër", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Fjalëkalimi për një pajisje është një kodkalim që i jep një pajisjeje apo një aplikacioni leje të hyjë në llogarinë tuaj ownCloud.", - "Language" : "Gjuhë", - "Help translate" : "Ndihmoni në përkthim", "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 30a290ea0e..385ae2d675 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -220,9 +220,9 @@ OC.L10N.register( "Current password" : "Тренутна лозинка", "New password" : "Нова лозинка", "Change password" : "Измени лозинку", - "Name" : "назив", "Language" : "Језик", "Help translate" : " Помозите у превођењу", + "Name" : "назив", "Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова", "Desktop client" : "Клијент за рачунар", "Android app" : "Андроид апликација", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index b34706ea7b..db270a7389 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -218,9 +218,9 @@ "Current password" : "Тренутна лозинка", "New password" : "Нова лозинка", "Change password" : "Измени лозинку", - "Name" : "назив", "Language" : "Језик", "Help translate" : " Помозите у превођењу", + "Name" : "назив", "Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова", "Desktop client" : "Клијент за рачунар", "Android app" : "Андроид апликација", diff --git a/settings/l10n/sr@latin.js b/settings/l10n/sr@latin.js index 587d565c0c..148b158059 100644 --- a/settings/l10n/sr@latin.js +++ b/settings/l10n/sr@latin.js @@ -25,8 +25,8 @@ OC.L10N.register( "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Izmeni lozinku", - "Name" : "naziv", "Language" : "Jezik", + "Name" : "naziv", "Get the apps to sync your files" : "Preuzmite aplikacije za sinhronizaciju Vaših fajlova", "Desktop client" : "Desktop klijent", "Android app" : "Android aplikacija", diff --git a/settings/l10n/sr@latin.json b/settings/l10n/sr@latin.json index 80858b4dd1..c328b49d9b 100644 --- a/settings/l10n/sr@latin.json +++ b/settings/l10n/sr@latin.json @@ -23,8 +23,8 @@ "Current password" : "Trenutna lozinka", "New password" : "Nova lozinka", "Change password" : "Izmeni lozinku", - "Name" : "naziv", "Language" : "Jezik", + "Name" : "naziv", "Get the apps to sync your files" : "Preuzmite aplikacije za sinhronizaciju Vaših fajlova", "Desktop client" : "Desktop klijent", "Android app" : "Android aplikacija", diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js index 0218c95e74..65df7d3bad 100644 --- a/settings/l10n/sv.js +++ b/settings/l10n/sv.js @@ -119,7 +119,6 @@ OC.L10N.register( "Unlimited" : "Obegränsad", "Personal info" : "Personlig information", "Sessions" : "Sessioner", - "Devices" : "Enheter", "Sync clients" : "Synk-klienter", "Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)", "Info, warnings, errors and fatal issues" : "Info, varningar och allvarliga fel", @@ -274,9 +273,7 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.", "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", - "You've linked these devices." : "Du har länkat dessa enheter.", "Name" : "Namn", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ett enhetslösenord är ett lösenord som ger en app eller enhet tillåtelse att komma åt ditt ownCloud-konto.", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json index 35785bfbf0..a38595fb77 100644 --- a/settings/l10n/sv.json +++ b/settings/l10n/sv.json @@ -117,7 +117,6 @@ "Unlimited" : "Obegränsad", "Personal info" : "Personlig information", "Sessions" : "Sessioner", - "Devices" : "Enheter", "Sync clients" : "Synk-klienter", "Everything (fatal issues, errors, warnings, info, debug)" : "Allting (allvarliga fel, fel, varningar, info, debug)", "Info, warnings, errors and fatal issues" : "Info, varningar och allvarliga fel", @@ -272,9 +271,7 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dessa webbläsare,pc och mobila klienter är för tillfället inloggade på din ownCloud.", "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", - "You've linked these devices." : "Du har länkat dessa enheter.", "Name" : "Namn", - "A device password is a passcode that gives an app or device permissions to access your ownCloud account." : "Ett enhetslösenord är ett lösenord som ger en app eller enhet tillåtelse att komma åt ditt ownCloud-konto.", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/ta_LK.js b/settings/l10n/ta_LK.js index e374ff2888..4274f39793 100644 --- a/settings/l10n/ta_LK.js +++ b/settings/l10n/ta_LK.js @@ -32,9 +32,9 @@ OC.L10N.register( "Current password" : "தற்போதைய கடவுச்சொல்", "New password" : "புதிய கடவுச்சொல்", "Change password" : "கடவுச்சொல்லை மாற்றுக", - "Name" : "பெயர்", "Language" : "மொழி", "Help translate" : "மொழிபெயர்க்க உதவி", + "Name" : "பெயர்", "Username" : "பயனாளர் பெயர்", "Create" : "உருவாக்குக", "Default Quota" : "பொது இருப்பு பங்கு", diff --git a/settings/l10n/ta_LK.json b/settings/l10n/ta_LK.json index b386bdcc31..bb07a0a5d1 100644 --- a/settings/l10n/ta_LK.json +++ b/settings/l10n/ta_LK.json @@ -30,9 +30,9 @@ "Current password" : "தற்போதைய கடவுச்சொல்", "New password" : "புதிய கடவுச்சொல்", "Change password" : "கடவுச்சொல்லை மாற்றுக", - "Name" : "பெயர்", "Language" : "மொழி", "Help translate" : "மொழிபெயர்க்க உதவி", + "Name" : "பெயர்", "Username" : "பயனாளர் பெயர்", "Create" : "உருவாக்குக", "Default Quota" : "பொது இருப்பு பங்கு", diff --git a/settings/l10n/te.js b/settings/l10n/te.js index d1cbfae006..1069841405 100644 --- a/settings/l10n/te.js +++ b/settings/l10n/te.js @@ -9,8 +9,8 @@ OC.L10N.register( "Your email address" : "మీ ఈమెయిలు చిరునామా", "Password" : "సంకేతపదం", "New password" : "కొత్త సంకేతపదం", - "Name" : "పేరు", "Language" : "భాష", + "Name" : "పేరు", "Username" : "వాడుకరి పేరు" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/te.json b/settings/l10n/te.json index 7e039c31d9..a3e720f08a 100644 --- a/settings/l10n/te.json +++ b/settings/l10n/te.json @@ -7,8 +7,8 @@ "Your email address" : "మీ ఈమెయిలు చిరునామా", "Password" : "సంకేతపదం", "New password" : "కొత్త సంకేతపదం", - "Name" : "పేరు", "Language" : "భాష", + "Name" : "పేరు", "Username" : "వాడుకరి పేరు" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index 4607c1df4f..1915e3f388 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -255,9 +255,9 @@ OC.L10N.register( "Current password" : "รหัสผ่านปัจจุบัน", "New password" : "รหัสผ่านใหม่", "Change password" : "เปลี่ยนรหัสผ่าน", - "Name" : "ชื่อ", "Language" : "ภาษา", "Help translate" : "มาช่วยกันแปลสิ!", + "Name" : "ชื่อ", "Get the apps to sync your files" : "ใช้แอพพลิเคชันในการประสานไฟล์ของคุณ", "Desktop client" : "เดสก์ทอปผู้ใช้", "Android app" : "แอพฯ แอนดรอยด์", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index e40da57a99..3f7748512c 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -253,9 +253,9 @@ "Current password" : "รหัสผ่านปัจจุบัน", "New password" : "รหัสผ่านใหม่", "Change password" : "เปลี่ยนรหัสผ่าน", - "Name" : "ชื่อ", "Language" : "ภาษา", "Help translate" : "มาช่วยกันแปลสิ!", + "Name" : "ชื่อ", "Get the apps to sync your files" : "ใช้แอพพลิเคชันในการประสานไฟล์ของคุณ", "Desktop client" : "เดสก์ทอปผู้ใช้", "Android app" : "แอพฯ แอนดรอยด์", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index 220cf7282b..8d640d180b 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -260,9 +260,9 @@ OC.L10N.register( "Current password" : "Mevcut parola", "New password" : "Yeni parola", "Change password" : "Parola değiştir", - "Name" : "Ad", "Language" : "Dil", "Help translate" : "Çevirilere yardım edin", + "Name" : "Ad", "Get the apps to sync your files" : "Dosyalarınızı eşitlemek için uygulamaları indirin", "Desktop client" : "Masaüstü istemcisi", "Android app" : "Android uygulaması", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index 789b283aed..8f2133aa7e 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -258,9 +258,9 @@ "Current password" : "Mevcut parola", "New password" : "Yeni parola", "Change password" : "Parola değiştir", - "Name" : "Ad", "Language" : "Dil", "Help translate" : "Çevirilere yardım edin", + "Name" : "Ad", "Get the apps to sync your files" : "Dosyalarınızı eşitlemek için uygulamaları indirin", "Desktop client" : "Masaüstü istemcisi", "Android app" : "Android uygulaması", diff --git a/settings/l10n/ug.js b/settings/l10n/ug.js index 616f5e5181..ba8a6d5e72 100644 --- a/settings/l10n/ug.js +++ b/settings/l10n/ug.js @@ -44,9 +44,9 @@ OC.L10N.register( "Current password" : "نۆۋەتتىكى ئىم", "New password" : "يېڭى ئىم", "Change password" : "ئىم ئۆزگەرت", - "Name" : "ئاتى", "Language" : "تىل", "Help translate" : "تەرجىمىگە ياردەم", + "Name" : "ئاتى", "Username" : "ئىشلەتكۈچى ئاتى", "Create" : "قۇر", "Other" : "باشقا", diff --git a/settings/l10n/ug.json b/settings/l10n/ug.json index 3fc60618bd..1bea1a3997 100644 --- a/settings/l10n/ug.json +++ b/settings/l10n/ug.json @@ -42,9 +42,9 @@ "Current password" : "نۆۋەتتىكى ئىم", "New password" : "يېڭى ئىم", "Change password" : "ئىم ئۆزگەرت", - "Name" : "ئاتى", "Language" : "تىل", "Help translate" : "تەرجىمىگە ياردەم", + "Name" : "ئاتى", "Username" : "ئىشلەتكۈچى ئاتى", "Create" : "قۇر", "Other" : "باشقا", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 77b6a0d34e..6345d2a50e 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -224,9 +224,9 @@ OC.L10N.register( "Current password" : "Поточний пароль", "New password" : "Новий пароль", "Change password" : "Змінити пароль", - "Name" : "Ім’я", "Language" : "Мова", "Help translate" : "Допомогти з перекладом", + "Name" : "Ім’я", "Get the apps to sync your files" : "Отримати додатки для синхронізації ваших файлів", "Desktop client" : "Клієнт для ПК", "Android app" : "Android-додаток", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index f8f1c655ff..e56c3b4412 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -222,9 +222,9 @@ "Current password" : "Поточний пароль", "New password" : "Новий пароль", "Change password" : "Змінити пароль", - "Name" : "Ім’я", "Language" : "Мова", "Help translate" : "Допомогти з перекладом", + "Name" : "Ім’я", "Get the apps to sync your files" : "Отримати додатки для синхронізації ваших файлів", "Desktop client" : "Клієнт для ПК", "Android app" : "Android-додаток", diff --git a/settings/l10n/vi.js b/settings/l10n/vi.js index 6865aedd4b..f2decd23b0 100644 --- a/settings/l10n/vi.js +++ b/settings/l10n/vi.js @@ -56,9 +56,9 @@ OC.L10N.register( "Current password" : "Mật khẩu cũ", "New password" : "Mật khẩu mới", "Change password" : "Đổi mật khẩu", - "Name" : "Tên", "Language" : "Ngôn ngữ", "Help translate" : "Hỗ trợ dịch thuật", + "Name" : "Tên", "Get the apps to sync your files" : "Nhận ứng dụng để đồng bộ file của bạn", "Show First Run Wizard again" : "Hiện lại việc chạy đồ thuật khởi đầu", "Username" : "Tên đăng nhập", diff --git a/settings/l10n/vi.json b/settings/l10n/vi.json index 9318a78eb1..bd84312282 100644 --- a/settings/l10n/vi.json +++ b/settings/l10n/vi.json @@ -54,9 +54,9 @@ "Current password" : "Mật khẩu cũ", "New password" : "Mật khẩu mới", "Change password" : "Đổi mật khẩu", - "Name" : "Tên", "Language" : "Ngôn ngữ", "Help translate" : "Hỗ trợ dịch thuật", + "Name" : "Tên", "Get the apps to sync your files" : "Nhận ứng dụng để đồng bộ file của bạn", "Show First Run Wizard again" : "Hiện lại việc chạy đồ thuật khởi đầu", "Username" : "Tên đăng nhập", diff --git a/settings/l10n/zh_CN.js b/settings/l10n/zh_CN.js index 05db4eba3c..41cb2e7a38 100644 --- a/settings/l10n/zh_CN.js +++ b/settings/l10n/zh_CN.js @@ -251,9 +251,9 @@ OC.L10N.register( "Current password" : "当前密码", "New password" : "新密码", "Change password" : "修改密码", - "Name" : "名称", "Language" : "语言", "Help translate" : "帮助翻译", + "Name" : "名称", "Get the apps to sync your files" : "安装应用进行文件同步", "Desktop client" : "桌面客户端", "Android app" : "Android 应用", diff --git a/settings/l10n/zh_CN.json b/settings/l10n/zh_CN.json index 7298dfe1b0..64b09cfbd5 100644 --- a/settings/l10n/zh_CN.json +++ b/settings/l10n/zh_CN.json @@ -249,9 +249,9 @@ "Current password" : "当前密码", "New password" : "新密码", "Change password" : "修改密码", - "Name" : "名称", "Language" : "语言", "Help translate" : "帮助翻译", + "Name" : "名称", "Get the apps to sync your files" : "安装应用进行文件同步", "Desktop client" : "桌面客户端", "Android app" : "Android 应用", diff --git a/settings/l10n/zh_HK.js b/settings/l10n/zh_HK.js index cc00f6ada7..6f1cd57b79 100644 --- a/settings/l10n/zh_HK.js +++ b/settings/l10n/zh_HK.js @@ -43,9 +43,9 @@ OC.L10N.register( "Password" : "密碼", "New password" : "新密碼", "Change password" : "更改密碼", - "Name" : "名稱", "Language" : "語言", "Help translate" : "幫忙翻譯", + "Name" : "名稱", "Android app" : "Android 應用程式", "iOS app" : "iOS 應用程式", "Username" : "用戶名稱", diff --git a/settings/l10n/zh_HK.json b/settings/l10n/zh_HK.json index af66c2b5e0..ac76df209b 100644 --- a/settings/l10n/zh_HK.json +++ b/settings/l10n/zh_HK.json @@ -41,9 +41,9 @@ "Password" : "密碼", "New password" : "新密碼", "Change password" : "更改密碼", - "Name" : "名稱", "Language" : "語言", "Help translate" : "幫忙翻譯", + "Name" : "名稱", "Android app" : "Android 應用程式", "iOS app" : "iOS 應用程式", "Username" : "用戶名稱", diff --git a/settings/l10n/zh_TW.js b/settings/l10n/zh_TW.js index 0d5d833794..09c4dcd369 100644 --- a/settings/l10n/zh_TW.js +++ b/settings/l10n/zh_TW.js @@ -245,9 +245,9 @@ OC.L10N.register( "Current password" : "目前密碼", "New password" : "新密碼", "Change password" : "變更密碼", - "Name" : "名稱", "Language" : "語言", "Help translate" : "幫助翻譯", + "Name" : "名稱", "Get the apps to sync your files" : "下載應用程式來同步您的檔案", "Desktop client" : "桌面客戶端", "Android app" : "Android 應用程式", diff --git a/settings/l10n/zh_TW.json b/settings/l10n/zh_TW.json index e58097097a..35f5ac5219 100644 --- a/settings/l10n/zh_TW.json +++ b/settings/l10n/zh_TW.json @@ -243,9 +243,9 @@ "Current password" : "目前密碼", "New password" : "新密碼", "Change password" : "變更密碼", - "Name" : "名稱", "Language" : "語言", "Help translate" : "幫助翻譯", + "Name" : "名稱", "Get the apps to sync your files" : "下載應用程式來同步您的檔案", "Desktop client" : "桌面客戶端", "Android app" : "Android 應用程式", From 508c580e67e8cdec45cd72bc7c34e60890e6576e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 23 Jun 2016 11:50:59 +0200 Subject: [PATCH 34/42] Fix trashed file name corruption when rerendering trashbin list The trashbin code does some gymnastics with the file data at render time. This fix makes sure that the modifications done on the file data are only local to the rendering code and doesn't affect the actual file data from the file list. --- apps/files_trashbin/js/filelist.js | 2 ++ apps/files_trashbin/tests/js/filelistSpec.js | 22 ++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js index feed28d8fc..510ab2c21b 100644 --- a/apps/files_trashbin/js/filelist.js +++ b/apps/files_trashbin/js/filelist.js @@ -93,6 +93,8 @@ _renderRow: function(fileData, options) { options = options || {}; + // make a copy to avoid changing original object + fileData = _.extend({}, fileData); var dir = this.getCurrentDirectory(); var dirListing = dir !== '' && dir !== '/'; // show deleted time as mtime diff --git a/apps/files_trashbin/tests/js/filelistSpec.js b/apps/files_trashbin/tests/js/filelistSpec.js index 05caaf2786..5e9a4cf27d 100644 --- a/apps/files_trashbin/tests/js/filelistSpec.js +++ b/apps/files_trashbin/tests/js/filelistSpec.js @@ -163,6 +163,28 @@ describe('OCA.Trashbin.FileList tests', function() { expect(fileList.findFileEl('One.txt.d11111')[0]).toEqual($tr[0]); }); + it('renders rows with the correct data when in root after calling setFiles with the same data set', function() { + // dir listing is false when in root + $('#dir').val('/'); + fileList.setFiles(testFiles); + fileList.setFiles(fileList.files); + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(4); + expect($tr.attr('data-id')).toEqual('1'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('One.txt.d11111'); + expect($tr.attr('data-size')).not.toBeDefined(); + expect($tr.attr('data-etag')).toEqual('abc'); + expect($tr.attr('data-permissions')).toEqual('9'); // read and delete + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.find('a.name').attr('href')).toEqual('#'); + + expect($tr.find('.nametext').text().trim()).toEqual('One.txt'); + + expect(fileList.findFileEl('One.txt.d11111')[0]).toEqual($tr[0]); + }); it('renders rows with the correct data when in subdirectory', function() { // dir listing is true when in a subdir $('#dir').val('/subdir'); From 97f1813695a183df786b4e3bf4fe27691405bf44 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Thu, 23 Jun 2016 11:54:49 +0200 Subject: [PATCH 35/42] Don't reload page in case of auth errors during setup checks If an error occurs during setup checks, do not let the global ajax error handler reload the page. --- core/js/setupchecks.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/js/setupchecks.js b/core/js/setupchecks.js index f987c9f04e..280c8d08c9 100644 --- a/core/js/setupchecks.js +++ b/core/js/setupchecks.js @@ -76,7 +76,8 @@ $.ajax({ type: 'PROPFIND', url: url, - complete: afterCall + complete: afterCall, + allowAuthErrors: true }); return deferred.promise(); }, @@ -209,7 +210,8 @@ $.ajax({ type: 'GET', url: OC.linkTo('', oc_dataURL+'/htaccesstest.txt?t=' + (new Date()).getTime()), - complete: afterCall + complete: afterCall, + allowAuthErrors: true }); return deferred.promise(); }, From bac1a3a6237b466d7b9d92491ad0f91d97247e46 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 17 Jun 2016 13:29:29 +0200 Subject: [PATCH 36/42] Add option to `occ files_external:list` to show all configured mounts --- apps/files_external/lib/Command/Export.php | 6 +++ .../lib/Command/ListCommand.php | 44 ++++++++++++++----- .../lib/Service/DBConfigService.php | 12 +++++ .../lib/Service/GlobalStoragesService.php | 19 ++++++++ .../tests/Service/DBConfigServiceTest.php | 10 +++++ 5 files changed, 81 insertions(+), 10 deletions(-) diff --git a/apps/files_external/lib/Command/Export.php b/apps/files_external/lib/Command/Export.php index 09c5ea8a9d..89655c1efc 100644 --- a/apps/files_external/lib/Command/Export.php +++ b/apps/files_external/lib/Command/Export.php @@ -41,6 +41,11 @@ class Export extends ListCommand { 'user_id', InputArgument::OPTIONAL, 'user id to export the personal mounts for, if no user is provided admin mounts will be exported' + )->addOption( + 'all', + 'a', + InputOption::VALUE_NONE, + 'show both system wide mounts and all personal mounts' ); } @@ -48,6 +53,7 @@ class Export extends ListCommand { $listCommand = new ListCommand($this->globalService, $this->userService, $this->userSession, $this->userManager); $listInput = new ArrayInput([], $listCommand->getDefinition()); $listInput->setArgument('user_id', $input->getArgument('user_id')); + $listInput->setOption('all', $input->getOption('all')); $listInput->setOption('output', 'json_pretty'); $listInput->setOption('show-password', true); $listInput->setOption('full', true); diff --git a/apps/files_external/lib/Command/ListCommand.php b/apps/files_external/lib/Command/ListCommand.php index bb43db17a8..e29a5f58f4 100644 --- a/apps/files_external/lib/Command/ListCommand.php +++ b/apps/files_external/lib/Command/ListCommand.php @@ -56,6 +56,8 @@ class ListCommand extends Base { */ protected $userManager; + const ALL = -1; + function __construct(GlobalStoragesService $globalService, UserStoragesService $userService, IUserSession $userSession, IUserManager $userManager) { parent::__construct(); $this->globalService = $globalService; @@ -67,7 +69,7 @@ class ListCommand extends Base { protected function configure() { $this ->setName('files_external:list') - ->setDescription('List configured mounts') + ->setDescription('List configured admin or personal mounts') ->addArgument( 'user_id', InputArgument::OPTIONAL, @@ -82,16 +84,27 @@ class ListCommand extends Base { null, InputOption::VALUE_NONE, 'don\'t truncate long values in table output' + )->addOption( + 'all', + 'a', + InputOption::VALUE_NONE, + 'show both system wide mounts and all personal mounts' ); parent::configure(); } protected function execute(InputInterface $input, OutputInterface $output) { - $userId = $input->getArgument('user_id'); - $storageService = $this->getStorageService($userId); + if ($input->getOption('all')) { + /** @var $mounts StorageConfig[] */ + $mounts = $this->globalService->getStorageForAllUsers(); + $userId = self::ALL; + } else { + $userId = $input->getArgument('user_id'); + $storageService = $this->getStorageService($userId); - /** @var $mounts StorageConfig[] */ - $mounts = $storageService->getAllStorages(); + /** @var $mounts StorageConfig[] */ + $mounts = $storageService->getAllStorages(); + } $this->listMounts($userId, $mounts, $input, $output); } @@ -102,13 +115,15 @@ class ListCommand extends Base { * @param InputInterface $input * @param OutputInterface $output */ - public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output){ + public function listMounts($userId, array $mounts, InputInterface $input, OutputInterface $output) { $outputType = $input->getOption('output'); if (count($mounts) === 0) { if ($outputType === self::OUTPUT_FORMAT_JSON || $outputType === self::OUTPUT_FORMAT_JSON_PRETTY) { $output->writeln('[]'); } else { - if ($userId) { + if ($userId === self::ALL) { + $output->writeln("No mounts configured"); + } else if ($userId) { $output->writeln("No mounts configured by $userId"); } else { $output->writeln("No admin mounts configured"); @@ -119,10 +134,13 @@ class ListCommand extends Base { $headers = ['Mount ID', 'Mount Point', 'Storage', 'Authentication Type', 'Configuration', 'Options']; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $headers[] = 'Applicable Users'; $headers[] = 'Applicable Groups'; } + if ($userId === self::ALL) { + $headers[] = 'Type'; + } if (!$input->getOption('show-password')) { $hideKeys = ['password', 'refresh_token', 'token', 'client_secret', 'public_key', 'private_key']; @@ -150,10 +168,13 @@ class ListCommand extends Base { $config->getBackendOptions(), $config->getMountOptions() ]; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $values[] = $config->getApplicableUsers(); $values[] = $config->getApplicableGroups(); } + if ($userId === self::ALL) { + $values[] = $config->getType() === StorageConfig::MOUNT_TYPE_ADMIN ? 'admin' : 'personal'; + } return array_combine($keys, $values); }, $mounts); @@ -215,7 +236,7 @@ class ListCommand extends Base { $optionsString ]; - if (!$userId) { + if (!$userId || $userId === self::ALL) { $applicableUsers = implode(', ', $config->getApplicableUsers()); $applicableGroups = implode(', ', $config->getApplicableGroups()); if ($applicableUsers === '' && $applicableGroups === '') { @@ -224,6 +245,9 @@ class ListCommand extends Base { $values[] = $applicableUsers; $values[] = $applicableGroups; } + if ($userId === self::ALL) { + $values[] = $config->getType() === StorageConfig::MOUNT_TYPE_ADMIN ? 'Admin' : 'Personal'; + } return $values; }, $mounts); diff --git a/apps/files_external/lib/Service/DBConfigService.php b/apps/files_external/lib/Service/DBConfigService.php index 9f7061eb93..3e38f4aed9 100644 --- a/apps/files_external/lib/Service/DBConfigService.php +++ b/apps/files_external/lib/Service/DBConfigService.php @@ -76,6 +76,18 @@ class DBConfigService { } } + /** + * Get all configured mounts + * + * @return array + */ + public function getAllMounts() { + $builder = $this->connection->getQueryBuilder(); + $query = $builder->select(['mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'type']) + ->from('external_mounts'); + return $this->getMountsFromQuery($query); + } + /** * Get admin defined mounts * diff --git a/apps/files_external/lib/Service/GlobalStoragesService.php b/apps/files_external/lib/Service/GlobalStoragesService.php index 96d7aa46e8..39d3da5d80 100644 --- a/apps/files_external/lib/Service/GlobalStoragesService.php +++ b/apps/files_external/lib/Service/GlobalStoragesService.php @@ -162,4 +162,23 @@ class GlobalStoragesService extends StoragesService { protected function isApplicable(StorageConfig $config) { return true; } + + /** + * Get all configured admin and personal mounts + * + * @return array map of storage id to storage config + */ + public function getStorageForAllUsers() { + $mounts = $this->dbConfig->getAllMounts(); + $configs = array_map([$this, 'getStorageConfigFromDBMount'], $mounts); + $configs = array_filter($configs, function ($config) { + return $config instanceof StorageConfig; + }); + + $keys = array_map(function (StorageConfig $config) { + return $config->getId(); + }, $configs); + + return array_combine($keys, $configs); + } } diff --git a/apps/files_external/tests/Service/DBConfigServiceTest.php b/apps/files_external/tests/Service/DBConfigServiceTest.php index b088a7078d..3cfa33f0bc 100644 --- a/apps/files_external/tests/Service/DBConfigServiceTest.php +++ b/apps/files_external/tests/Service/DBConfigServiceTest.php @@ -282,4 +282,14 @@ class DBConfigServiceTest extends TestCase { $this->assertCount(1, $mounts); $this->assertEquals($id1, $mounts[0]['mount_id']); } + + public function testGetAllMounts() { + $id1 = $this->addMount('/test', 'foo', 'bar', 100, DBConfigService::MOUNT_TYPE_ADMIN); + $id2 = $this->addMount('/test2', 'foo2', 'bar2', 100, DBConfigService::MOUNT_TYPE_PERSONAl); + + $mounts = $this->dbConfig->getAllMounts(); + $this->assertCount(2, $mounts); + $this->assertEquals($id1, $mounts[0]['mount_id']); + $this->assertEquals($id2, $mounts[1]['mount_id']); + } } From 29068d3845065c3ca873513f3be6d27d886c9874 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 24 Jun 2016 01:56:13 -0400 Subject: [PATCH 37/42] [tx-robot] updated from transifex --- apps/federatedfilesharing/l10n/ast.js | 5 ++- apps/federatedfilesharing/l10n/ast.json | 5 ++- apps/files/l10n/ast.js | 28 ++++++++++++ apps/files/l10n/ast.json | 28 ++++++++++++ apps/files/l10n/bg_BG.js | 3 +- apps/files/l10n/bg_BG.json | 3 +- lib/l10n/ast.js | 57 ++++++++++++++++++++++++- lib/l10n/ast.json | 57 ++++++++++++++++++++++++- settings/l10n/az.js | 1 + settings/l10n/az.json | 1 + settings/l10n/bg_BG.js | 1 + settings/l10n/bg_BG.json | 1 + settings/l10n/bn_BD.js | 1 + settings/l10n/bn_BD.json | 1 + settings/l10n/cs_CZ.js | 1 + settings/l10n/cs_CZ.json | 1 + settings/l10n/da.js | 1 + settings/l10n/da.json | 1 + settings/l10n/de.js | 6 +++ settings/l10n/de.json | 6 +++ settings/l10n/de_DE.js | 6 +++ settings/l10n/de_DE.json | 6 +++ settings/l10n/el.js | 1 + settings/l10n/el.json | 1 + settings/l10n/en_GB.js | 7 +++ settings/l10n/en_GB.json | 7 +++ settings/l10n/eo.js | 1 + settings/l10n/eo.json | 1 + settings/l10n/es.js | 1 + settings/l10n/es.json | 1 + settings/l10n/et_EE.js | 1 + settings/l10n/et_EE.json | 1 + settings/l10n/eu.js | 1 + settings/l10n/eu.json | 1 + settings/l10n/fi_FI.js | 6 +++ settings/l10n/fi_FI.json | 6 +++ settings/l10n/fr.js | 1 + settings/l10n/fr.json | 1 + settings/l10n/gl.js | 1 + settings/l10n/gl.json | 1 + settings/l10n/hu_HU.js | 1 + settings/l10n/hu_HU.json | 1 + settings/l10n/id.js | 1 + settings/l10n/id.json | 1 + settings/l10n/it.js | 6 +++ settings/l10n/it.json | 6 +++ settings/l10n/ja.js | 1 + settings/l10n/ja.json | 1 + settings/l10n/ko.js | 1 + settings/l10n/ko.json | 1 + settings/l10n/lv.js | 1 + settings/l10n/lv.json | 1 + settings/l10n/mn.js | 1 + settings/l10n/mn.json | 1 + settings/l10n/nb_NO.js | 1 + settings/l10n/nb_NO.json | 1 + settings/l10n/nl.js | 1 + settings/l10n/nl.json | 1 + settings/l10n/pl.js | 1 + settings/l10n/pl.json | 1 + settings/l10n/pt_BR.js | 6 +++ settings/l10n/pt_BR.json | 6 +++ settings/l10n/pt_PT.js | 1 + settings/l10n/pt_PT.json | 1 + settings/l10n/ru.js | 6 +++ settings/l10n/ru.json | 6 +++ settings/l10n/sk_SK.js | 1 + settings/l10n/sk_SK.json | 1 + settings/l10n/sl.js | 1 + settings/l10n/sl.json | 1 + settings/l10n/sq.js | 6 +++ settings/l10n/sq.json | 6 +++ settings/l10n/sr.js | 1 + settings/l10n/sr.json | 1 + settings/l10n/sv.js | 1 + settings/l10n/sv.json | 1 + settings/l10n/th_TH.js | 1 + settings/l10n/th_TH.json | 1 + settings/l10n/tr.js | 1 + settings/l10n/tr.json | 1 + settings/l10n/uk.js | 1 + settings/l10n/uk.json | 1 + 82 files changed, 336 insertions(+), 6 deletions(-) diff --git a/apps/federatedfilesharing/l10n/ast.js b/apps/federatedfilesharing/l10n/ast.js index 4ae5f2b9cc..3b5affabbb 100644 --- a/apps/federatedfilesharing/l10n/ast.js +++ b/apps/federatedfilesharing/l10n/ast.js @@ -1,6 +1,9 @@ OC.L10N.register( "federatedfilesharing", { - "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s" + "Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada", + "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", + "Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/federatedfilesharing/l10n/ast.json b/apps/federatedfilesharing/l10n/ast.json index 70d90ab657..e5eb10cf14 100644 --- a/apps/federatedfilesharing/l10n/ast.json +++ b/apps/federatedfilesharing/l10n/ast.json @@ -1,4 +1,7 @@ { "translations": { - "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s" + "Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada", + "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", + "Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index 6fe07fed76..092610b714 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -21,6 +21,7 @@ OC.L10N.register( "Invalid directory." : "Direutoriu non válidu.", "Files" : "Ficheros", "All files" : "Tolos ficheros", + "File could not be found" : "Nun s'atopó el ficheru", "Home" : "Casa", "Close" : "Zarrar", "Favorites" : "Favoritos", @@ -28,8 +29,19 @@ OC.L10N.register( "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}", + "Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}", "Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.", "Uploading..." : "Xubiendo...", + "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}", + "{seconds}s" : "{seconds}s", + "Any moment now..." : "En cualquier momentu...", + "Soon..." : "Pronto...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.", "Actions" : "Aiciones", "Download" : "Descargar", @@ -43,6 +55,17 @@ OC.L10N.register( "Unable to determine date" : "Imposible determinar la fecha", "This operation is forbidden" : "La operación ta prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador", + "Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste", + "Could not move \"{file}\"" : "Nun pudo movese \"{file}\"", + "{newName} already exists" : "{newName} yá esiste", + "Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.", + "Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"", + "Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste", + "Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste", + "Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'", "Name" : "Nome", "Size" : "Tamañu", @@ -64,6 +87,7 @@ OC.L10N.register( "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoritos", "Favorite" : "Favoritu", + "Local link" : "Enllaz llocal", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "{newname} already exists" : "{newname} yá existe", @@ -91,8 +115,12 @@ OC.L10N.register( "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.", + "Missing permissions to edit from here." : "Falten permisos pa editar dende equí.", "Settings" : "Axustes", + "Show hidden files" : "Amosar ficheros ocultos", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los dos Ficheros via WebDAV", "No files in here" : "Nun hai nengún ficheru equí", "Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!", "No entries found in this folder" : "Nenguna entrada en esta carpeta", diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 5b554ab8f9..7631a9149f 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -19,6 +19,7 @@ "Invalid directory." : "Direutoriu non válidu.", "Files" : "Ficheros", "All files" : "Tolos ficheros", + "File could not be found" : "Nun s'atopó el ficheru", "Home" : "Casa", "Close" : "Zarrar", "Favorites" : "Favoritos", @@ -26,8 +27,19 @@ "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}", + "Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}", "Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.", "Uploading..." : "Xubiendo...", + "..." : "...", + "{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}", + "{hours}:{minutes}h" : "{hours}:{minutes}h", + "{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ", + "{minutes}:{seconds}m" : "{minutes}:{seconds}m", + "{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}", + "{seconds}s" : "{seconds}s", + "Any moment now..." : "En cualquier momentu...", + "Soon..." : "Pronto...", + "{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})", "File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.", "Actions" : "Aiciones", "Download" : "Descargar", @@ -41,6 +53,17 @@ "Unable to determine date" : "Imposible determinar la fecha", "This operation is forbidden" : "La operación ta prohibida", "This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador", + "Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste", + "Could not move \"{file}\"" : "Nun pudo movese \"{file}\"", + "{newName} already exists" : "{newName} yá esiste", + "Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste", + "The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.", + "Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"", + "Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"", + "Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste", + "Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"", + "Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste", + "Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".", "No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'", "Name" : "Nome", "Size" : "Tamañu", @@ -62,6 +85,7 @@ "_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"], "Favorited" : "Favoritos", "Favorite" : "Favoritu", + "Local link" : "Enllaz llocal", "Folder" : "Carpeta", "New folder" : "Nueva carpeta", "{newname} already exists" : "{newname} yá existe", @@ -89,8 +113,12 @@ "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.", + "Missing permissions to edit from here." : "Falten permisos pa editar dende equí.", "Settings" : "Axustes", + "Show hidden files" : "Amosar ficheros ocultos", "WebDAV" : "WebDAV", + "Use this address to access your Files via WebDAV" : "Usa esta direición p'acceder a los dos Ficheros via WebDAV", "No files in here" : "Nun hai nengún ficheru equí", "Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!", "No entries found in this folder" : "Nenguna entrada en esta carpeta", diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index 3a00853fa1..d080e4b7c6 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -90,6 +90,7 @@ OC.L10N.register( "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", - "Text file" : "Текстов файл" + "Text file" : "Текстов файл", + "New text file.txt" : "Нов текст file.txt" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index 4d60be2069..080390bd8a 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -88,6 +88,7 @@ "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "No favorites" : "Няма любими", "Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук", - "Text file" : "Текстов файл" + "Text file" : "Текстов файл", + "New text file.txt" : "Нов текст file.txt" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/lib/l10n/ast.js b/lib/l10n/ast.js index d134495dc8..548ca59e8e 100644 --- a/lib/l10n/ast.js +++ b/lib/l10n/ast.js @@ -9,6 +9,7 @@ OC.L10N.register( "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectose que la configuración d'amuesa copiose. Esto pue encaboxar la instalación y dexala ensín soporte. Llee la documentación enantes de facer cambéos en config.php", "PHP %s or higher is required." : "Necesítase PHP %s o superior", "PHP with a version lower than %s is required." : "Necesítase una versión PHP anterior a %s", + "%sbit or higher PHP required." : "Necesítase PHP %sbit o superior", "Following databases are supported: %s" : "Les siguientes bases de datos tan sofitaes: %s", "The command line tool %s could not be found" : "La ferramienta línea de comandu %s nun pudo alcontrase", "The library %s is not available." : "La librería %s nun ta disponible", @@ -21,24 +22,37 @@ OC.L10N.register( "Invalid image" : "Imaxe inválida", "today" : "güei", "yesterday" : "ayeri", + "_%n day ago_::_%n days ago_" : ["hai %n día","hai %n díes"], "last month" : "mes caberu", "_%n month ago_::_%n months ago_" : ["hai %n mes","hai %n meses"], "last year" : "añu caberu", + "_%n year ago_::_%n years ago_" : ["hai %n añu","hai %n años"], "_%n hour ago_::_%n hours ago_" : ["hai %n hora","hai %n hores"], "_%n minute ago_::_%n minutes ago_" : ["hai %n minutu","hai %n minutos"], "seconds ago" : "hai segundos", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Nun esiste'l módulu con id: %s . Por favor, activalu na configuración d'aplicaciones o contauta col alministrador.", + "Empty filename is not allowed" : "Nun s'almite un nome de ficheru baleru", + "Dot files are not allowed" : "Ficheros Dot nun s'almiten", + "4-byte characters are not supported in file names" : "Caracteres de 4-bytes nun tan soportaos en nomes de ficheros", + "File name is a reserved word" : "El nome de ficheru ye una pallabra reservada", "File name contains at least one invalid character" : "El nome del ficheru contién polo menos un carácter non válidu", + "File name is too long" : "El nome de ficheru ye demasiáu llargu", "App directory already exists" : "El direutoriu de l'aplicación yá esiste", "Can't create app folder. Please fix permissions. %s" : "Nun pue crease la carpeta de l'aplicación. Por favor, igua los permisos. %s", + "Archive does not contain a directory named %s" : "L'archivu nun contien un directoriu nomáu %s", "No source specified when installing app" : "Nun s'especificó nenguna fonte al instalar app", "No href specified when installing app from http" : "Nun s'especificó href al instalar la app dende http", "No path specified when installing app from local file" : "Nun s'especificó camín dende un ficheru llocal al instalar l'aplicación", "Archives of type %s are not supported" : "Los ficheros de triba %s nun tán sofitaos", "Failed to open archive when installing app" : "Falló al abrir el ficheru al instalar l'aplicación", "App does not provide an info.xml file" : "L'aplicación nun apurre un ficheru info.xml", + "App cannot be installed because appinfo file cannot be read." : "L'aplicación nun puede instalase porque nun se llee'l ficheru appinfo.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma nun puede ser evaluada . Por favor, póngase en contactu col desarrollador de l'aplicación y comprueba la so pantalla d'alministración .", "App can't be installed because of not allowed code in the App" : "Nun pue instalase l'aplicación por causa d'un códigu non permitíu na App", "App can't be installed because it is not compatible with this version of ownCloud" : "Nun pue instalase l'aplicación porque nun ye compatible con esta versión d'ownCloud.", "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "L'aplicación nun pue instalase porque contién la etiqueta true que nun ta permitida p'aplicaciones non distribuyíes", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'aplicación nun puede instalase porque la versión en info.xml nun ye la mesma que la versión informada dende la tienda d'aplicaciones", + "%s enter the database username and name." : "%s introducir el nome d'usuariu y el nome de la base de datos .", "%s enter the database username." : "%s introducir l'usuariu de la base de datos.", "%s enter the database name." : "%s introducir nome de la base de datos.", "%s you may not use dots in the database name" : "%s nun pues usar puntos nel nome de la base de datos", @@ -51,57 +65,92 @@ OC.L10N.register( "PostgreSQL username and/or password not valid" : "Nome d'usuariu o contraseña PostgreSQL non válidos", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nun ta sofitáu y %s nun furrulará afayadizamente nesta plataforma. ¡Úsalu baxo'l to riesgu!", "For the best results, please consider using a GNU/Linux server instead." : "Pa los meyores resultaos, por favor considera l'usu d'un sirvidor GNU/Linux nel so llugar.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Paez ser que la instancia %s ta executándose nun entornu de PHP 32 bits y el open_basedir configuróse en php.ini. Esto va dar llugar a problemes colos ficheros de más de 4 GB y nun ye nada recomendable.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, desanicia la configuración open_basedir dientro la so php.ini o camude a PHP 64 bits.", "Set an admin username." : "Afitar nome d'usuariu p'almin", "Set an admin password." : "Afitar contraseña p'almin", "Can't create or write into the data directory %s" : "Nun pue crease o escribir dientro los datos del direutoriu %s", + "Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada", "%s shared »%s« with you" : "%s compartió »%s« contigo", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Compartir %s falló, por cuenta qu'el backend nun dexa acciones de tipu %i", "Sharing %s failed, because the file does not exist" : "Compartir %s falló, porque'l ficheru nun esiste", "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s", + "Sharing %s failed, because you can not share with yourself" : "Compartir %s falló, porque nun puede compartise contigo mesmu", "Sharing %s failed, because the user %s does not exist" : "Compartir %s falló, yá que l'usuariu %s nun esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartir %s falló, yá que l'usuariu %s nun ye miembru de nengún de los grupos de los que ye miembru %s", "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", + "Sharing %s failed, because this item is already shared with user %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose col usuariu %s", "Sharing %s failed, because the group %s does not exist" : "Compartir %s falló, porque'l grupu %s nun esiste", "Sharing %s failed, because %s is not a member of the group %s" : "Compartir %s falló, porque %s nun ye miembru del grupu %s", "You need to provide a password to create a public link, only protected links are allowed" : "Necesites apurrir una contraseña pa crear un enllaz públicu, namái tan permitíos los enllaces protexíos", "Sharing %s failed, because sharing with links is not allowed" : "Compartir %s falló, porque nun se permite compartir con enllaces", + "Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable.", "Share type %s is not valid for %s" : "La triba de compartición %s nun ye válida pa %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Falló dar permisos a %s, porque los permisos son mayores que los otorgaos a %s", "Setting permissions for %s failed, because the item was not found" : "Falló dar permisos a %s, porque l'elementu nun s'atopó", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nun pue afitase la data de caducidá. Ficheros compartíos nun puen caducar dempués de %s de compartise", "Cannot set expiration date. Expiration date is in the past" : "Nun pue afitase la data d'espiración. La data d'espiración ta nel pasáu", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Non puede desaniciar la fecha de caducidá. Compartir obliga a tener una fecha de caducidá.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartíu %s tien d'implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "Nun s'alcontró'l botón de compartición %s", "Sharing backend for %s not found" : "Nun s'alcontró'l botón de partición pa %s", + "Sharing failed, because the user %s is the original sharer" : "Compartir falló, porque l'usuariu %s ye'l compartidor orixinal", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartir %s falló, porque los permisos perpasen los otorgaos a %s", "Sharing %s failed, because resharing is not allowed" : "Compartir %s falló, porque nun se permite la re-compartición", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru", + "Cannot increase permissions of %s" : "Nun se pueden aumentar los permisos de %s", + "Files can't be shared with delete permissions" : "Los ficheros nun pueden compartise con permisos desaniciaos", + "Files can't be shared with create permissions" : "Los ficheros nun pueden compartise con crear permisos", + "Expiration date is in the past" : "La data de caducidá ta nel pasáu.", + "Cannot set expiration date more than %s days in the future" : "Nun pue afitase la data d'espiración más que %s díes nel futuru", "Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"", "Apps" : "Aplicaciones", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-'\"", "A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu", + "Username contains whitespace at the beginning or at the end" : "El nome d'usuario contién espacios en blancu al entamu o al final", "A valid password must be provided" : "Tien d'apurrise una contraseña válida", "The username is already being used" : "El nome d'usuariu yá ta usándose", + "Login canceled by app" : "Aniciar sesión canceláu pola aplicación", + "User disabled" : "Usuariu desactiváu", "Help" : "Ayuda", "Personal" : "Personal", "Users" : "Usuarios", "Admin" : "Almin", "Recommended" : "Recomendáu", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "L'aplicación \"%s\" nun puede instalase porque nun se llee'l ficheru appinfo.", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "L'aplicación \"%s\" nun puede instalase porque nun ye compatible con esta versión d'ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "L'aplicación \"%s\" nun puede instalase porque les siguientes dependencies nun se cumplen: %s", "No app name specified" : "Nun s'especificó nome de l'aplicación", "web services under your control" : "servicios web baxo'l to control", + "File is currently busy, please try again later" : "Fichaeru ta ocupáu, por favor intentelo de nuevu más tarde", + "Can't read file" : "Nun ye a lleese'l ficheru", "Application is not enabled" : "L'aplicación nun ta habilitada", "Authentication error" : "Fallu d'autenticación", "Token expired. Please reload page." : "Token caducáu. Recarga la páxina.", "Unknown user" : "Usuariu desconocíu", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nun hai controladores de bases de datos (sqlite, mysql, o postgresql)", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nun ta soportáu", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Nun s'almite la execución del Sirvidor d'ownCloud na plataforma Microsoft Windows. Suxurímoste qu'utilices un servidor Linux nuna máquina virtual si nun ties nenguna opción pa migrar el mesmu servidor. Atopa paquetes de Linux, fáciles d'implementar imaxes de máquines virtuales en %s. Pa la migración de les instalaciones esistentes pa Linux puedes atopar dellos conseyos y un script de migración en nuesa documentación .", "Cannot write into \"config\" directory" : "Nun pue escribise nel direutoriu \"config\"", "Cannot write into \"apps\" directory" : "Nun pue escribise nel direutoriu \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto pue iguase %sdando permisos d'escritura al sirvidor Web nel direutoriu%s d'apps o deshabilitando la tienda d'apps nel ficheru de configuración.", "Cannot create \"data\" directory (%s)" : "Nun pue crease'l direutoriu \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Esto pue iguase davezu dándo-y accesu d'escritura al direutoriu raigañu.", "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Davezu los permisos puen iguase %sdándo-y al sirvidor web accesu d'escritura al direutoriu raigañu%s.", "Setting locale to %s failed" : "Falló l'activación del idioma %s", "Please install one of these locales on your system and restart your webserver." : "Instala ún d'estos locales nel to sistema y reanicia'l sirvidor web", "Please ask your server administrator to install the module." : "Por favor, entrúga-y al to alministrador del sirvidor pa instalar el módulu.", "PHP module %s not installed." : "Nun ta instaláu'l módulu PHP %s", + "PHP setting \"%s\" is not set to \"%s\"." : "La configuración de PHP \"%s\" nun s'afita \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Axuste de la configuración en php.ini va executar de nueves ownCloud", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload afita \"%s\" en llugar del valor esperáu \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Pa solucionar esti problema definíu mbstring.func_overloada 0 nel so php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 ríquese siquier. Anguaño ta instaláu %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Pa solucionar esti problema actualiza latso versión de libxml2 y reanicia'l to sirvidor web.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ta aparentemente configuráu pa desaniciar bloques de documentos en llinia. Esto va facer que delles aplicaciones principales nun tean accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dablemente esto seya culpa d'un caché o acelerador, como por exemplu Zend OPcache o eAccelerator.", "PHP modules have been installed, but they are still listed as missing?" : "Instaláronse los módulos PHP, ¿pero tán entá llistaos como faltantes?", "Please ask your server administrator to restart the web server." : "Por favor, entruga al to alministrador pa reaniciar el sirvidor web.", @@ -109,9 +158,15 @@ OC.L10N.register( "Please upgrade your database version" : "Por favor, anueva la versión de la to base de datos", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, camuda los permisos a 0770 pa que'l direutoriu nun pueda llistase por otros usuarios.", "Data directory (%s) is readable by other users" : "El direutoriu de datos (%s) ye llexible por otros usuarios", + "Data directory (%s) must be an absolute path" : "El directoriu de datos (%s) ha de ser una ruta absoluta", + "Check the value of \"datadirectory\" in your configuration" : "Comprobar el valor del \"datadirectory\" na so configuración", "Data directory (%s) is invalid" : "Ye inválidu'l direutoriu de datos (%s)", "Please check that the data directory contains a file \".ocdata\" in its root." : "Verifica que'l direutoriu de datos contién un ficheru \".ocdata\" nel direutoriu raigañu.", "Could not obtain lock type %d on \"%s\"." : "Nun pudo facese'l bloquéu %d en \"%s\".", - "Storage not available" : "Almacenamientu non disponible" + "Storage unauthorized. %s" : "Almacenamientu desautorizáu. %s", + "Storage incomplete configuration. %s" : "Configuración d'almacenamientu incompleta. %s", + "Storage connection error. %s" : "Fallu de conexón al almacenamientu. %s", + "Storage not available" : "Almacenamientu non disponible", + "Storage connection timeout. %s" : "Tiempu escosao de conexón al almacenamientu. %s" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/ast.json b/lib/l10n/ast.json index be1adf3787..48bd836a8e 100644 --- a/lib/l10n/ast.json +++ b/lib/l10n/ast.json @@ -7,6 +7,7 @@ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Detectose que la configuración d'amuesa copiose. Esto pue encaboxar la instalación y dexala ensín soporte. Llee la documentación enantes de facer cambéos en config.php", "PHP %s or higher is required." : "Necesítase PHP %s o superior", "PHP with a version lower than %s is required." : "Necesítase una versión PHP anterior a %s", + "%sbit or higher PHP required." : "Necesítase PHP %sbit o superior", "Following databases are supported: %s" : "Les siguientes bases de datos tan sofitaes: %s", "The command line tool %s could not be found" : "La ferramienta línea de comandu %s nun pudo alcontrase", "The library %s is not available." : "La librería %s nun ta disponible", @@ -19,24 +20,37 @@ "Invalid image" : "Imaxe inválida", "today" : "güei", "yesterday" : "ayeri", + "_%n day ago_::_%n days ago_" : ["hai %n día","hai %n díes"], "last month" : "mes caberu", "_%n month ago_::_%n months ago_" : ["hai %n mes","hai %n meses"], "last year" : "añu caberu", + "_%n year ago_::_%n years ago_" : ["hai %n añu","hai %n años"], "_%n hour ago_::_%n hours ago_" : ["hai %n hora","hai %n hores"], "_%n minute ago_::_%n minutes ago_" : ["hai %n minutu","hai %n minutos"], "seconds ago" : "hai segundos", + "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Nun esiste'l módulu con id: %s . Por favor, activalu na configuración d'aplicaciones o contauta col alministrador.", + "Empty filename is not allowed" : "Nun s'almite un nome de ficheru baleru", + "Dot files are not allowed" : "Ficheros Dot nun s'almiten", + "4-byte characters are not supported in file names" : "Caracteres de 4-bytes nun tan soportaos en nomes de ficheros", + "File name is a reserved word" : "El nome de ficheru ye una pallabra reservada", "File name contains at least one invalid character" : "El nome del ficheru contién polo menos un carácter non válidu", + "File name is too long" : "El nome de ficheru ye demasiáu llargu", "App directory already exists" : "El direutoriu de l'aplicación yá esiste", "Can't create app folder. Please fix permissions. %s" : "Nun pue crease la carpeta de l'aplicación. Por favor, igua los permisos. %s", + "Archive does not contain a directory named %s" : "L'archivu nun contien un directoriu nomáu %s", "No source specified when installing app" : "Nun s'especificó nenguna fonte al instalar app", "No href specified when installing app from http" : "Nun s'especificó href al instalar la app dende http", "No path specified when installing app from local file" : "Nun s'especificó camín dende un ficheru llocal al instalar l'aplicación", "Archives of type %s are not supported" : "Los ficheros de triba %s nun tán sofitaos", "Failed to open archive when installing app" : "Falló al abrir el ficheru al instalar l'aplicación", "App does not provide an info.xml file" : "L'aplicación nun apurre un ficheru info.xml", + "App cannot be installed because appinfo file cannot be read." : "L'aplicación nun puede instalase porque nun se llee'l ficheru appinfo.", + "Signature could not get checked. Please contact the app developer and check your admin screen." : "La firma nun puede ser evaluada . Por favor, póngase en contactu col desarrollador de l'aplicación y comprueba la so pantalla d'alministración .", "App can't be installed because of not allowed code in the App" : "Nun pue instalase l'aplicación por causa d'un códigu non permitíu na App", "App can't be installed because it is not compatible with this version of ownCloud" : "Nun pue instalase l'aplicación porque nun ye compatible con esta versión d'ownCloud.", "App can't be installed because it contains the true tag which is not allowed for non shipped apps" : "L'aplicación nun pue instalase porque contién la etiqueta true que nun ta permitida p'aplicaciones non distribuyíes", + "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "L'aplicación nun puede instalase porque la versión en info.xml nun ye la mesma que la versión informada dende la tienda d'aplicaciones", + "%s enter the database username and name." : "%s introducir el nome d'usuariu y el nome de la base de datos .", "%s enter the database username." : "%s introducir l'usuariu de la base de datos.", "%s enter the database name." : "%s introducir nome de la base de datos.", "%s you may not use dots in the database name" : "%s nun pues usar puntos nel nome de la base de datos", @@ -49,57 +63,92 @@ "PostgreSQL username and/or password not valid" : "Nome d'usuariu o contraseña PostgreSQL non válidos", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nun ta sofitáu y %s nun furrulará afayadizamente nesta plataforma. ¡Úsalu baxo'l to riesgu!", "For the best results, please consider using a GNU/Linux server instead." : "Pa los meyores resultaos, por favor considera l'usu d'un sirvidor GNU/Linux nel so llugar.", + "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Paez ser que la instancia %s ta executándose nun entornu de PHP 32 bits y el open_basedir configuróse en php.ini. Esto va dar llugar a problemes colos ficheros de más de 4 GB y nun ye nada recomendable.", + "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Por favor, desanicia la configuración open_basedir dientro la so php.ini o camude a PHP 64 bits.", "Set an admin username." : "Afitar nome d'usuariu p'almin", "Set an admin password." : "Afitar contraseña p'almin", "Can't create or write into the data directory %s" : "Nun pue crease o escribir dientro los datos del direutoriu %s", + "Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada", "%s shared »%s« with you" : "%s compartió »%s« contigo", + "%s via %s" : "%s via %s", + "Sharing %s failed, because the backend does not allow shares from type %i" : "Compartir %s falló, por cuenta qu'el backend nun dexa acciones de tipu %i", "Sharing %s failed, because the file does not exist" : "Compartir %s falló, porque'l ficheru nun esiste", "You are not allowed to share %s" : "Nun tienes permisu pa compartir %s", + "Sharing %s failed, because you can not share with yourself" : "Compartir %s falló, porque nun puede compartise contigo mesmu", "Sharing %s failed, because the user %s does not exist" : "Compartir %s falló, yá que l'usuariu %s nun esiste", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Compartir %s falló, yá que l'usuariu %s nun ye miembru de nengún de los grupos de los que ye miembru %s", "Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s", + "Sharing %s failed, because this item is already shared with user %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose col usuariu %s", "Sharing %s failed, because the group %s does not exist" : "Compartir %s falló, porque'l grupu %s nun esiste", "Sharing %s failed, because %s is not a member of the group %s" : "Compartir %s falló, porque %s nun ye miembru del grupu %s", "You need to provide a password to create a public link, only protected links are allowed" : "Necesites apurrir una contraseña pa crear un enllaz públicu, namái tan permitíos los enllaces protexíos", "Sharing %s failed, because sharing with links is not allowed" : "Compartir %s falló, porque nun se permite compartir con enllaces", + "Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu", + "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable.", "Share type %s is not valid for %s" : "La triba de compartición %s nun ye válida pa %s", "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Falló dar permisos a %s, porque los permisos son mayores que los otorgaos a %s", "Setting permissions for %s failed, because the item was not found" : "Falló dar permisos a %s, porque l'elementu nun s'atopó", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nun pue afitase la data de caducidá. Ficheros compartíos nun puen caducar dempués de %s de compartise", "Cannot set expiration date. Expiration date is in the past" : "Nun pue afitase la data d'espiración. La data d'espiración ta nel pasáu", + "Cannot clear expiration date. Shares are required to have an expiration date." : "Non puede desaniciar la fecha de caducidá. Compartir obliga a tener una fecha de caducidá.", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "El motor compartíu %s tien d'implementar la interfaz OCP\\Share_Backend", "Sharing backend %s not found" : "Nun s'alcontró'l botón de compartición %s", "Sharing backend for %s not found" : "Nun s'alcontró'l botón de partición pa %s", + "Sharing failed, because the user %s is the original sharer" : "Compartir falló, porque l'usuariu %s ye'l compartidor orixinal", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Compartir %s falló, porque los permisos perpasen los otorgaos a %s", "Sharing %s failed, because resharing is not allowed" : "Compartir %s falló, porque nun se permite la re-compartición", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Compartir %s falló porque'l motor compartíu pa %s podría nun atopar el so orixe", "Sharing %s failed, because the file could not be found in the file cache" : "Compartir %s falló, yá que'l ficheru nun pudo atopase na caché de ficheru", + "Cannot increase permissions of %s" : "Nun se pueden aumentar los permisos de %s", + "Files can't be shared with delete permissions" : "Los ficheros nun pueden compartise con permisos desaniciaos", + "Files can't be shared with create permissions" : "Los ficheros nun pueden compartise con crear permisos", + "Expiration date is in the past" : "La data de caducidá ta nel pasáu.", + "Cannot set expiration date more than %s days in the future" : "Nun pue afitase la data d'espiración más que %s díes nel futuru", "Could not find category \"%s\"" : "Nun pudo alcontrase la estaya \"%s.\"", "Apps" : "Aplicaciones", + "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Namái tan permitíos los siguientes caráuteres nun nome d'usuariu: \"a-z\", \"A-Z\", \"0-9\", y \"_.@-'\"", "A valid username must be provided" : "Tien d'apurrise un nome d'usuariu válidu", + "Username contains whitespace at the beginning or at the end" : "El nome d'usuario contién espacios en blancu al entamu o al final", "A valid password must be provided" : "Tien d'apurrise una contraseña válida", "The username is already being used" : "El nome d'usuariu yá ta usándose", + "Login canceled by app" : "Aniciar sesión canceláu pola aplicación", + "User disabled" : "Usuariu desactiváu", "Help" : "Ayuda", "Personal" : "Personal", "Users" : "Usuarios", "Admin" : "Almin", "Recommended" : "Recomendáu", + "App \"%s\" cannot be installed because appinfo file cannot be read." : "L'aplicación \"%s\" nun puede instalase porque nun se llee'l ficheru appinfo.", + "App \"%s\" cannot be installed because it is not compatible with this version of ownCloud." : "L'aplicación \"%s\" nun puede instalase porque nun ye compatible con esta versión d'ownCloud.", + "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "L'aplicación \"%s\" nun puede instalase porque les siguientes dependencies nun se cumplen: %s", "No app name specified" : "Nun s'especificó nome de l'aplicación", "web services under your control" : "servicios web baxo'l to control", + "File is currently busy, please try again later" : "Fichaeru ta ocupáu, por favor intentelo de nuevu más tarde", + "Can't read file" : "Nun ye a lleese'l ficheru", "Application is not enabled" : "L'aplicación nun ta habilitada", "Authentication error" : "Fallu d'autenticación", "Token expired. Please reload page." : "Token caducáu. Recarga la páxina.", "Unknown user" : "Usuariu desconocíu", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nun hai controladores de bases de datos (sqlite, mysql, o postgresql)", + "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nun ta soportáu", + "Running ownCloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on %s. For migrating existing installations to Linux you can find some tips and a migration script in our documentation." : "Nun s'almite la execución del Sirvidor d'ownCloud na plataforma Microsoft Windows. Suxurímoste qu'utilices un servidor Linux nuna máquina virtual si nun ties nenguna opción pa migrar el mesmu servidor. Atopa paquetes de Linux, fáciles d'implementar imaxes de máquines virtuales en %s. Pa la migración de les instalaciones esistentes pa Linux puedes atopar dellos conseyos y un script de migración en nuesa documentación .", "Cannot write into \"config\" directory" : "Nun pue escribise nel direutoriu \"config\"", "Cannot write into \"apps\" directory" : "Nun pue escribise nel direutoriu \"apps\"", "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Esto pue iguase %sdando permisos d'escritura al sirvidor Web nel direutoriu%s d'apps o deshabilitando la tienda d'apps nel ficheru de configuración.", "Cannot create \"data\" directory (%s)" : "Nun pue crease'l direutoriu \"data\" (%s)", + "This can usually be fixed by giving the webserver write access to the root directory." : "Esto pue iguase davezu dándo-y accesu d'escritura al direutoriu raigañu.", "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Davezu los permisos puen iguase %sdándo-y al sirvidor web accesu d'escritura al direutoriu raigañu%s.", "Setting locale to %s failed" : "Falló l'activación del idioma %s", "Please install one of these locales on your system and restart your webserver." : "Instala ún d'estos locales nel to sistema y reanicia'l sirvidor web", "Please ask your server administrator to install the module." : "Por favor, entrúga-y al to alministrador del sirvidor pa instalar el módulu.", "PHP module %s not installed." : "Nun ta instaláu'l módulu PHP %s", + "PHP setting \"%s\" is not set to \"%s\"." : "La configuración de PHP \"%s\" nun s'afita \"%s\".", + "Adjusting this setting in php.ini will make ownCloud run again" : "Axuste de la configuración en php.ini va executar de nueves ownCloud", + "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload afita \"%s\" en llugar del valor esperáu \"0\"", + "To fix this issue set mbstring.func_overload to 0 in your php.ini" : "Pa solucionar esti problema definíu mbstring.func_overloada 0 nel so php.ini", + "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 ríquese siquier. Anguaño ta instaláu %s.", + "To fix this issue update your libxml2 version and restart your web server." : "Pa solucionar esti problema actualiza latso versión de libxml2 y reanicia'l to sirvidor web.", + "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP ta aparentemente configuráu pa desaniciar bloques de documentos en llinia. Esto va facer que delles aplicaciones principales nun tean accesibles.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Dablemente esto seya culpa d'un caché o acelerador, como por exemplu Zend OPcache o eAccelerator.", "PHP modules have been installed, but they are still listed as missing?" : "Instaláronse los módulos PHP, ¿pero tán entá llistaos como faltantes?", "Please ask your server administrator to restart the web server." : "Por favor, entruga al to alministrador pa reaniciar el sirvidor web.", @@ -107,9 +156,15 @@ "Please upgrade your database version" : "Por favor, anueva la versión de la to base de datos", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Por favor, camuda los permisos a 0770 pa que'l direutoriu nun pueda llistase por otros usuarios.", "Data directory (%s) is readable by other users" : "El direutoriu de datos (%s) ye llexible por otros usuarios", + "Data directory (%s) must be an absolute path" : "El directoriu de datos (%s) ha de ser una ruta absoluta", + "Check the value of \"datadirectory\" in your configuration" : "Comprobar el valor del \"datadirectory\" na so configuración", "Data directory (%s) is invalid" : "Ye inválidu'l direutoriu de datos (%s)", "Please check that the data directory contains a file \".ocdata\" in its root." : "Verifica que'l direutoriu de datos contién un ficheru \".ocdata\" nel direutoriu raigañu.", "Could not obtain lock type %d on \"%s\"." : "Nun pudo facese'l bloquéu %d en \"%s\".", - "Storage not available" : "Almacenamientu non disponible" + "Storage unauthorized. %s" : "Almacenamientu desautorizáu. %s", + "Storage incomplete configuration. %s" : "Configuración d'almacenamientu incompleta. %s", + "Storage connection error. %s" : "Fallu de conexón al almacenamientu. %s", + "Storage not available" : "Almacenamientu non disponible", + "Storage connection timeout. %s" : "Tiempu escosao de conexón al almacenamientu. %s" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/az.js b/settings/l10n/az.js index de5839558a..c9de6fb0c3 100644 --- a/settings/l10n/az.js +++ b/settings/l10n/az.js @@ -186,6 +186,7 @@ OC.L10N.register( "Language" : "Dil", "Help translate" : "Tərcüməyə kömək", "Name" : "Ad", + "Done" : "Edildi", "Get the apps to sync your files" : "Fayllarınızın sinxronizasiyası üçün proqramları götürün", "Desktop client" : "Desktop client", "Android app" : "Android proqramı", diff --git a/settings/l10n/az.json b/settings/l10n/az.json index c5cc476b58..37413d0e37 100644 --- a/settings/l10n/az.json +++ b/settings/l10n/az.json @@ -184,6 +184,7 @@ "Language" : "Dil", "Help translate" : "Tərcüməyə kömək", "Name" : "Ad", + "Done" : "Edildi", "Get the apps to sync your files" : "Fayllarınızın sinxronizasiyası üçün proqramları götürün", "Desktop client" : "Desktop client", "Android app" : "Android proqramı", diff --git a/settings/l10n/bg_BG.js b/settings/l10n/bg_BG.js index b2cd227cd9..8a41c42474 100644 --- a/settings/l10n/bg_BG.js +++ b/settings/l10n/bg_BG.js @@ -187,6 +187,7 @@ OC.L10N.register( "Language" : "Език", "Help translate" : "Помогни с превода", "Name" : "Име", + "Done" : "Завършен", "Get the apps to sync your files" : "Изтегли програми за синхронизиране на файловете ти", "Desktop client" : "Клиент за настолен компютър", "Android app" : "Андроид приложение", diff --git a/settings/l10n/bg_BG.json b/settings/l10n/bg_BG.json index 478b1bcfd6..da25c47d90 100644 --- a/settings/l10n/bg_BG.json +++ b/settings/l10n/bg_BG.json @@ -185,6 +185,7 @@ "Language" : "Език", "Help translate" : "Помогни с превода", "Name" : "Име", + "Done" : "Завършен", "Get the apps to sync your files" : "Изтегли програми за синхронизиране на файловете ти", "Desktop client" : "Клиент за настолен компютър", "Android app" : "Андроид приложение", diff --git a/settings/l10n/bn_BD.js b/settings/l10n/bn_BD.js index 38f73cfb38..d1d0ea94cb 100644 --- a/settings/l10n/bn_BD.js +++ b/settings/l10n/bn_BD.js @@ -63,6 +63,7 @@ OC.L10N.register( "Language" : "ভাষা", "Help translate" : "অনুবাদ করতে সহায়তা করুন", "Name" : "নাম", + "Done" : "শেষ হলো", "Get the apps to sync your files" : "আপনার ফাইলসমূহ সিংক করতে অ্যাপস নিন", "Show First Run Wizard again" : "প্রথমবার চালানোর যাদুকর পূনরায় প্রদর্শন কর", "Username" : "ব্যবহারকারী", diff --git a/settings/l10n/bn_BD.json b/settings/l10n/bn_BD.json index c5a60bb569..7c1df55860 100644 --- a/settings/l10n/bn_BD.json +++ b/settings/l10n/bn_BD.json @@ -61,6 +61,7 @@ "Language" : "ভাষা", "Help translate" : "অনুবাদ করতে সহায়তা করুন", "Name" : "নাম", + "Done" : "শেষ হলো", "Get the apps to sync your files" : "আপনার ফাইলসমূহ সিংক করতে অ্যাপস নিন", "Show First Run Wizard again" : "প্রথমবার চালানোর যাদুকর পূনরায় প্রদর্শন কর", "Username" : "ব্যবহারকারী", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 71e9a9874b..9ffb1a38b1 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -274,6 +274,7 @@ OC.L10N.register( "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", "Name" : "Název", + "Done" : "Dokončeno", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 5b87ae449e..55d0af36c7 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -272,6 +272,7 @@ "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", "Name" : "Název", + "Done" : "Dokončeno", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", "Android app" : "Aplikace pro Android", diff --git a/settings/l10n/da.js b/settings/l10n/da.js index 92508e0edd..0e3ba48225 100644 --- a/settings/l10n/da.js +++ b/settings/l10n/da.js @@ -234,6 +234,7 @@ OC.L10N.register( "Language" : "Sprog", "Help translate" : "Hjælp med oversættelsen", "Name" : "Navn", + "Done" : "Færdig", "Get the apps to sync your files" : "Hent applikationerne for at synkronisere dine filer", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/da.json b/settings/l10n/da.json index ca58a9dfca..b77cb15564 100644 --- a/settings/l10n/da.json +++ b/settings/l10n/da.json @@ -232,6 +232,7 @@ "Language" : "Sprog", "Help translate" : "Hjælp med oversættelsen", "Name" : "Navn", + "Done" : "Færdig", "Get the apps to sync your files" : "Hent applikationerne for at synkronisere dine filer", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/de.js b/settings/l10n/de.js index f8c96e4d18..26c62170a0 100644 --- a/settings/l10n/de.js +++ b/settings/l10n/de.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", + "App passwords" : "App-Passwörter", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen du aktuell in deiner ownCloud angemeldet bist.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", + "You've linked these apps." : "Du hast diese Apps verbunden.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Ein App-Passwort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren %s-Konto zuzugreifen.", + "App name" : "App-Name", + "Create new app password" : "Neues App-Passwort erstellen", + "Done" : "Erledigt", "Get the apps to sync your files" : "Lade die Apps zur Synchronisierung Deiner Daten herunter", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de.json b/settings/l10n/de.json index d63456ec37..3483ac763e 100644 --- a/settings/l10n/de.json +++ b/settings/l10n/de.json @@ -117,6 +117,7 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", + "App passwords" : "App-Passwörter", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Debug-Meldungen)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen du aktuell in deiner ownCloud angemeldet bist.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", + "You've linked these apps." : "Du hast diese Apps verbunden.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Ein App-Passwort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren %s-Konto zuzugreifen.", + "App name" : "App-Name", + "Create new app password" : "Neues App-Passwort erstellen", + "Done" : "Erledigt", "Get the apps to sync your files" : "Lade die Apps zur Synchronisierung Deiner Daten herunter", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de_DE.js b/settings/l10n/de_DE.js index 7af12128ec..cb822ea9f8 100644 --- a/settings/l10n/de_DE.js +++ b/settings/l10n/de_DE.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", + "App passwords" : "App-Passwörter", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen Sie aktuell in Ihrer ownCloud angemeldet sind.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", + "You've linked these apps." : "Sie haben diese Apps verbunden.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Ein App-Passwort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren %s-Konto zuzugreifen.", + "App name" : "App-Name", + "Create new app password" : "Neues App-Passwort erstellen", + "Done" : "Erledigt", "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/de_DE.json b/settings/l10n/de_DE.json index 4de6cd70b7..0b6e3d7fdc 100644 --- a/settings/l10n/de_DE.json +++ b/settings/l10n/de_DE.json @@ -117,6 +117,7 @@ "Unlimited" : "Unbegrenzt", "Personal info" : "Persönliche Informationen", "Sessions" : "Sitzungen", + "App passwords" : "App-Passwörter", "Sync clients" : "Sync-Clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Alles (fatale Probleme, Fehler, Warnungen, Infos, Fehlerdiagnose)", "Info, warnings, errors and fatal issues" : "Infos, Warnungen, Fehler und fatale Probleme", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Dies sind die Web-, Desktop und mobilen Clients, mit denen Sie aktuell in Ihrer ownCloud angemeldet sind.", "Browser" : "Browser", "Most recent activity" : "Neueste Aktivität", + "You've linked these apps." : "Sie haben diese Apps verbunden.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Ein App-Passwort ist ein Passwort, dass einer App oder einem Gerät erlaubt auf Ihren %s-Konto zuzugreifen.", + "App name" : "App-Name", + "Create new app password" : "Neues App-Passwort erstellen", + "Done" : "Erledigt", "Get the apps to sync your files" : "Installieren Sie die Anwendungen, um Ihre Dateien zu synchronisieren", "Desktop client" : "Desktop-Client", "Android app" : "Android-App", diff --git a/settings/l10n/el.js b/settings/l10n/el.js index ad936384c8..b79f5efa65 100644 --- a/settings/l10n/el.js +++ b/settings/l10n/el.js @@ -236,6 +236,7 @@ OC.L10N.register( "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", "Name" : "Όνομα", + "Done" : "Ολοκληρώθηκε", "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", "Desktop client" : "Πελάτης σταθερού υπολογιστή", "Android app" : "Εφαρμογή Android", diff --git a/settings/l10n/el.json b/settings/l10n/el.json index f7d4b064f6..623294c4f4 100644 --- a/settings/l10n/el.json +++ b/settings/l10n/el.json @@ -234,6 +234,7 @@ "Language" : "Γλώσσα", "Help translate" : "Βοηθήστε στη μετάφραση", "Name" : "Όνομα", + "Done" : "Ολοκληρώθηκε", "Get the apps to sync your files" : "Λήψη της εφαρμογής για συγχρονισμό των αρχείων σας", "Desktop client" : "Πελάτης σταθερού υπολογιστή", "Android app" : "Εφαρμογή Android", diff --git a/settings/l10n/en_GB.js b/settings/l10n/en_GB.js index b020ec6306..f080b59c55 100644 --- a/settings/l10n/en_GB.js +++ b/settings/l10n/en_GB.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Unlimited", "Personal info" : "Personal info", "Sessions" : "Sessions", + "App passwords" : "App passwords", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", @@ -222,6 +223,7 @@ OC.L10N.register( "Documentation:" : "Documentation:", "User documentation" : "User documentation", "Admin documentation" : "Admin documentation", + "Visit website" : "Visit website", "Report a bug" : "Report a bug", "Show description …" : "Show description …", "Hide description …" : "Hide description …", @@ -272,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.", "Browser" : "Browser", "Most recent activity" : "Most recent activity", + "You've linked these apps." : "You've linked these apps.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "An app password is a passcode that gives an app or device permissions to access your %s account.", + "App name" : "App name", + "Create new app password" : "Create new app password", + "Done" : "Done", "Get the apps to sync your files" : "Get the apps to sync your files", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/en_GB.json b/settings/l10n/en_GB.json index 8bab21429f..203b5fde76 100644 --- a/settings/l10n/en_GB.json +++ b/settings/l10n/en_GB.json @@ -117,6 +117,7 @@ "Unlimited" : "Unlimited", "Personal info" : "Personal info", "Sessions" : "Sessions", + "App passwords" : "App passwords", "Sync clients" : "Sync clients", "Everything (fatal issues, errors, warnings, info, debug)" : "Everything (fatal issues, errors, warnings, info, debug)", "Info, warnings, errors and fatal issues" : "Info, warnings, errors and fatal issues", @@ -220,6 +221,7 @@ "Documentation:" : "Documentation:", "User documentation" : "User documentation", "Admin documentation" : "Admin documentation", + "Visit website" : "Visit website", "Report a bug" : "Report a bug", "Show description …" : "Show description …", "Hide description …" : "Hide description …", @@ -270,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "These are the web, desktop and mobile clients currently logged in to your ownCloud.", "Browser" : "Browser", "Most recent activity" : "Most recent activity", + "You've linked these apps." : "You've linked these apps.", "Name" : "Name", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "An app password is a passcode that gives an app or device permissions to access your %s account.", + "App name" : "App name", + "Create new app password" : "Create new app password", + "Done" : "Done", "Get the apps to sync your files" : "Get the apps to sync your files", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/eo.js b/settings/l10n/eo.js index 20eaca472b..55bad706b8 100644 --- a/settings/l10n/eo.js +++ b/settings/l10n/eo.js @@ -125,6 +125,7 @@ OC.L10N.register( "Language" : "Lingvo", "Help translate" : "Helpu traduki", "Name" : "Nomo", + "Done" : "Farita", "Get the apps to sync your files" : "Ekhavu la aplikaĵojn por sinkronigi viajn dosierojn", "Desktop client" : "Labortabla kliento", "Android app" : "Android-aplikaĵo", diff --git a/settings/l10n/eo.json b/settings/l10n/eo.json index 03480e2aaa..dc0d29c1de 100644 --- a/settings/l10n/eo.json +++ b/settings/l10n/eo.json @@ -123,6 +123,7 @@ "Language" : "Lingvo", "Help translate" : "Helpu traduki", "Name" : "Nomo", + "Done" : "Farita", "Get the apps to sync your files" : "Ekhavu la aplikaĵojn por sinkronigi viajn dosierojn", "Desktop client" : "Labortabla kliento", "Android app" : "Android-aplikaĵo", diff --git a/settings/l10n/es.js b/settings/l10n/es.js index 4cb08348eb..9a16c8ea91 100644 --- a/settings/l10n/es.js +++ b/settings/l10n/es.js @@ -274,6 +274,7 @@ OC.L10N.register( "Browser" : "Navegador", "Most recent activity" : "Actividad más reciente", "Name" : "Nombre", + "Done" : "Hecho", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", diff --git a/settings/l10n/es.json b/settings/l10n/es.json index 0bcdf03d9a..bd9cb270bb 100644 --- a/settings/l10n/es.json +++ b/settings/l10n/es.json @@ -272,6 +272,7 @@ "Browser" : "Navegador", "Most recent activity" : "Actividad más reciente", "Name" : "Nombre", + "Done" : "Hecho", "Get the apps to sync your files" : "Obtener las aplicaciones para sincronizar sus archivos", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación de Android", diff --git a/settings/l10n/et_EE.js b/settings/l10n/et_EE.js index d04e674de3..8448dd500f 100644 --- a/settings/l10n/et_EE.js +++ b/settings/l10n/et_EE.js @@ -200,6 +200,7 @@ OC.L10N.register( "Language" : "Keel", "Help translate" : "Aita tõlkida", "Name" : "Nimi", + "Done" : "Valmis", "Get the apps to sync your files" : "Hangi rakendusi failide sünkroniseerimiseks", "Desktop client" : "Töölaua klient", "Android app" : "Androidi rakendus", diff --git a/settings/l10n/et_EE.json b/settings/l10n/et_EE.json index 10a38ccf3d..8d74443002 100644 --- a/settings/l10n/et_EE.json +++ b/settings/l10n/et_EE.json @@ -198,6 +198,7 @@ "Language" : "Keel", "Help translate" : "Aita tõlkida", "Name" : "Nimi", + "Done" : "Valmis", "Get the apps to sync your files" : "Hangi rakendusi failide sünkroniseerimiseks", "Desktop client" : "Töölaua klient", "Android app" : "Androidi rakendus", diff --git a/settings/l10n/eu.js b/settings/l10n/eu.js index 963ecf4609..a8703668ac 100644 --- a/settings/l10n/eu.js +++ b/settings/l10n/eu.js @@ -164,6 +164,7 @@ OC.L10N.register( "Language" : "Hizkuntza", "Help translate" : "Lagundu itzultzen", "Name" : "Izena", + "Done" : "Egina", "Get the apps to sync your files" : "Lortu aplikazioak zure fitxategiak sinkronizatzeko", "Desktop client" : "Mahaigaineko bezeroa", "Android app" : "Android aplikazioa", diff --git a/settings/l10n/eu.json b/settings/l10n/eu.json index 41a0c348dc..efb94b66a8 100644 --- a/settings/l10n/eu.json +++ b/settings/l10n/eu.json @@ -162,6 +162,7 @@ "Language" : "Hizkuntza", "Help translate" : "Lagundu itzultzen", "Name" : "Izena", + "Done" : "Egina", "Get the apps to sync your files" : "Lortu aplikazioak zure fitxategiak sinkronizatzeko", "Desktop client" : "Mahaigaineko bezeroa", "Android app" : "Android aplikazioa", diff --git a/settings/l10n/fi_FI.js b/settings/l10n/fi_FI.js index d4f6029656..2d32dc527f 100644 --- a/settings/l10n/fi_FI.js +++ b/settings/l10n/fi_FI.js @@ -115,6 +115,7 @@ OC.L10N.register( "Unlimited" : "Rajoittamaton", "Personal info" : "Henkilökohtaiset tiedot", "Sessions" : "Istunnot", + "App passwords" : "Sovellusten salasanat", "Sync clients" : "Synkronointisovellukset", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", @@ -258,7 +259,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Nämä ovat parhaillaan ownCloudiisi kirjautuneet verkko-, työpöytä- ja mobiilisovellukset.", "Browser" : "Selain", "Most recent activity" : "Viimeisimmät toimet", + "You've linked these apps." : "Olet linkittänyt nämä sovellukset.", "Name" : "Nimi", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Sovellussalasana on suojakoodi, joka antaa sovellukselle tai laitteelle käyttöoikeuden %s-tiliisi.", + "App name" : "Sovelluksen nimi", + "Create new app password" : "Luo uusi sovellussalasana", + "Done" : "Valmis", "Get the apps to sync your files" : "Aseta sovellukset synkronoimaan tiedostosi", "Desktop client" : "Työpöytäsovellus", "Android app" : "Android-sovellus", diff --git a/settings/l10n/fi_FI.json b/settings/l10n/fi_FI.json index ae3082c742..dddfd1067c 100644 --- a/settings/l10n/fi_FI.json +++ b/settings/l10n/fi_FI.json @@ -113,6 +113,7 @@ "Unlimited" : "Rajoittamaton", "Personal info" : "Henkilökohtaiset tiedot", "Sessions" : "Istunnot", + "App passwords" : "Sovellusten salasanat", "Sync clients" : "Synkronointisovellukset", "Everything (fatal issues, errors, warnings, info, debug)" : "Kaikki (vakavat ongelmat, virheet, varoitukset, tiedot, vianjäljitys)", "Info, warnings, errors and fatal issues" : "Tiedot, varoitukset, virheet ja vakavat ongelmat", @@ -256,7 +257,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Nämä ovat parhaillaan ownCloudiisi kirjautuneet verkko-, työpöytä- ja mobiilisovellukset.", "Browser" : "Selain", "Most recent activity" : "Viimeisimmät toimet", + "You've linked these apps." : "Olet linkittänyt nämä sovellukset.", "Name" : "Nimi", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Sovellussalasana on suojakoodi, joka antaa sovellukselle tai laitteelle käyttöoikeuden %s-tiliisi.", + "App name" : "Sovelluksen nimi", + "Create new app password" : "Luo uusi sovellussalasana", + "Done" : "Valmis", "Get the apps to sync your files" : "Aseta sovellukset synkronoimaan tiedostosi", "Desktop client" : "Työpöytäsovellus", "Android app" : "Android-sovellus", diff --git a/settings/l10n/fr.js b/settings/l10n/fr.js index daae89902d..b20ccbe627 100644 --- a/settings/l10n/fr.js +++ b/settings/l10n/fr.js @@ -272,6 +272,7 @@ OC.L10N.register( "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", "Name" : "Nom", + "Done" : "Terminé", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", "Desktop client" : "Client de bureau", "Android app" : "Application Android", diff --git a/settings/l10n/fr.json b/settings/l10n/fr.json index 76e17de70e..90e241cfae 100644 --- a/settings/l10n/fr.json +++ b/settings/l10n/fr.json @@ -270,6 +270,7 @@ "Browser" : "Navigateur", "Most recent activity" : "Activité la plus récente", "Name" : "Nom", + "Done" : "Terminé", "Get the apps to sync your files" : "Obtenez les applications de synchronisation de vos fichiers", "Desktop client" : "Client de bureau", "Android app" : "Application Android", diff --git a/settings/l10n/gl.js b/settings/l10n/gl.js index 8c03be24ee..d9ecbc1213 100644 --- a/settings/l10n/gl.js +++ b/settings/l10n/gl.js @@ -226,6 +226,7 @@ OC.L10N.register( "Language" : "Idioma", "Help translate" : "Axude na tradución", "Name" : "Nome", + "Done" : "Feito", "Get the apps to sync your files" : "Obteña as aplicacións para sincronizar os seus ficheiros", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación Android", diff --git a/settings/l10n/gl.json b/settings/l10n/gl.json index 9e565f8919..4cab1d0756 100644 --- a/settings/l10n/gl.json +++ b/settings/l10n/gl.json @@ -224,6 +224,7 @@ "Language" : "Idioma", "Help translate" : "Axude na tradución", "Name" : "Nome", + "Done" : "Feito", "Get the apps to sync your files" : "Obteña as aplicacións para sincronizar os seus ficheiros", "Desktop client" : "Cliente de escritorio", "Android app" : "Aplicación Android", diff --git a/settings/l10n/hu_HU.js b/settings/l10n/hu_HU.js index 065b4d3117..396fd13f22 100644 --- a/settings/l10n/hu_HU.js +++ b/settings/l10n/hu_HU.js @@ -261,6 +261,7 @@ OC.L10N.register( "Language" : "Nyelv", "Help translate" : "Segítsen a fordításban!", "Name" : "Név", + "Done" : "Kész", "Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!", "Desktop client" : "Asztali kliens", "Android app" : "Android applikáció", diff --git a/settings/l10n/hu_HU.json b/settings/l10n/hu_HU.json index 3869df4e66..ea29613851 100644 --- a/settings/l10n/hu_HU.json +++ b/settings/l10n/hu_HU.json @@ -259,6 +259,7 @@ "Language" : "Nyelv", "Help translate" : "Segítsen a fordításban!", "Name" : "Név", + "Done" : "Kész", "Get the apps to sync your files" : "Töltse le az állományok szinkronizációjához szükséges programokat!", "Desktop client" : "Asztali kliens", "Android app" : "Android applikáció", diff --git a/settings/l10n/id.js b/settings/l10n/id.js index 27ccfc4433..fbc5755958 100644 --- a/settings/l10n/id.js +++ b/settings/l10n/id.js @@ -236,6 +236,7 @@ OC.L10N.register( "Language" : "Bahasa", "Help translate" : "Bantu menerjemahkan", "Name" : "Nama", + "Done" : "Selesai", "Get the apps to sync your files" : "Dapatkan aplikasi untuk sinkronisasi berkas Anda", "Desktop client" : "Klien desktop", "Android app" : "Aplikasi Android", diff --git a/settings/l10n/id.json b/settings/l10n/id.json index c4737e1e9d..7ceb5374db 100644 --- a/settings/l10n/id.json +++ b/settings/l10n/id.json @@ -234,6 +234,7 @@ "Language" : "Bahasa", "Help translate" : "Bantu menerjemahkan", "Name" : "Nama", + "Done" : "Selesai", "Get the apps to sync your files" : "Dapatkan aplikasi untuk sinkronisasi berkas Anda", "Desktop client" : "Klien desktop", "Android app" : "Aplikasi Android", diff --git a/settings/l10n/it.js b/settings/l10n/it.js index 18aa0bf1aa..d877b7beaf 100644 --- a/settings/l10n/it.js +++ b/settings/l10n/it.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Illimitata", "Personal info" : "Informazioni personali", "Sessions" : "Sessioni", + "App passwords" : "Password di applicazione", "Sync clients" : "Client di sincronizzazione", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", "Info, warnings, errors and fatal issues" : "Informazioni, avvisi, errori e problemi gravi", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Questi sono i client web, desktop e mobile che hanno effettuato attualmente l'accesso al tuo ownCloud.", "Browser" : "Browser", "Most recent activity" : "Attività più recenti", + "You've linked these apps." : "Hai collegato queste applicazioni.", "Name" : "Nome", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Una password di applicazione è un codice di sicurezza che fornisce a un'applicazione o a un dispositivo i permessi per accedere al tuo account %s.", + "App name" : "Nome applicazione", + "Create new app password" : "Crea nuova password di applicazione", + "Done" : "Completato", "Get the apps to sync your files" : "Scarica le applicazioni per sincronizzare i tuoi file", "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", diff --git a/settings/l10n/it.json b/settings/l10n/it.json index e485dea67d..913fa6706b 100644 --- a/settings/l10n/it.json +++ b/settings/l10n/it.json @@ -117,6 +117,7 @@ "Unlimited" : "Illimitata", "Personal info" : "Informazioni personali", "Sessions" : "Sessioni", + "App passwords" : "Password di applicazione", "Sync clients" : "Client di sincronizzazione", "Everything (fatal issues, errors, warnings, info, debug)" : "Tutto (problemi gravi, errori, avvisi, informazioni, debug)", "Info, warnings, errors and fatal issues" : "Informazioni, avvisi, errori e problemi gravi", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Questi sono i client web, desktop e mobile che hanno effettuato attualmente l'accesso al tuo ownCloud.", "Browser" : "Browser", "Most recent activity" : "Attività più recenti", + "You've linked these apps." : "Hai collegato queste applicazioni.", "Name" : "Nome", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Una password di applicazione è un codice di sicurezza che fornisce a un'applicazione o a un dispositivo i permessi per accedere al tuo account %s.", + "App name" : "Nome applicazione", + "Create new app password" : "Crea nuova password di applicazione", + "Done" : "Completato", "Get the apps to sync your files" : "Scarica le applicazioni per sincronizzare i tuoi file", "Desktop client" : "Client desktop", "Android app" : "Applicazione Android", diff --git a/settings/l10n/ja.js b/settings/l10n/ja.js index ad8544158e..d4c8259b2e 100644 --- a/settings/l10n/ja.js +++ b/settings/l10n/ja.js @@ -271,6 +271,7 @@ OC.L10N.register( "Browser" : "ブラウザ", "Most recent activity" : "最新のアクティビティ", "Name" : "名前", + "Done" : "完了", "Get the apps to sync your files" : "ファイルを同期するアプリを取得しましょう", "Desktop client" : "デスクトップクライアント", "Android app" : "Androidアプリ", diff --git a/settings/l10n/ja.json b/settings/l10n/ja.json index e42dcc03c4..6e8279fb49 100644 --- a/settings/l10n/ja.json +++ b/settings/l10n/ja.json @@ -269,6 +269,7 @@ "Browser" : "ブラウザ", "Most recent activity" : "最新のアクティビティ", "Name" : "名前", + "Done" : "完了", "Get the apps to sync your files" : "ファイルを同期するアプリを取得しましょう", "Desktop client" : "デスクトップクライアント", "Android app" : "Androidアプリ", diff --git a/settings/l10n/ko.js b/settings/l10n/ko.js index b0c4ea2f20..b78566d33d 100644 --- a/settings/l10n/ko.js +++ b/settings/l10n/ko.js @@ -253,6 +253,7 @@ OC.L10N.register( "Language" : "언어", "Help translate" : "번역 돕기", "Name" : "이름", + "Done" : "완료", "Get the apps to sync your files" : "파일 동기화 앱 가져오기", "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", diff --git a/settings/l10n/ko.json b/settings/l10n/ko.json index 8921e3ecbc..1296a0db26 100644 --- a/settings/l10n/ko.json +++ b/settings/l10n/ko.json @@ -251,6 +251,7 @@ "Language" : "언어", "Help translate" : "번역 돕기", "Name" : "이름", + "Done" : "완료", "Get the apps to sync your files" : "파일 동기화 앱 가져오기", "Desktop client" : "데스크톱 클라이언트", "Android app" : "Android 앱", diff --git a/settings/l10n/lv.js b/settings/l10n/lv.js index 9f421dd137..a24704e636 100644 --- a/settings/l10n/lv.js +++ b/settings/l10n/lv.js @@ -137,6 +137,7 @@ OC.L10N.register( "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", "Name" : "Nosaukums", + "Done" : "Pabeigts", "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", "Android app" : "Android lietotne", diff --git a/settings/l10n/lv.json b/settings/l10n/lv.json index 52655dbfd1..990d454f2a 100644 --- a/settings/l10n/lv.json +++ b/settings/l10n/lv.json @@ -135,6 +135,7 @@ "Language" : "Valoda", "Help translate" : "Palīdzi tulkot", "Name" : "Nosaukums", + "Done" : "Pabeigts", "Get the apps to sync your files" : "Saņem lietotnes, lai sinhronizētu savas datnes", "Desktop client" : "Darbvirsmas klients", "Android app" : "Android lietotne", diff --git a/settings/l10n/mn.js b/settings/l10n/mn.js index cea2aa37c9..0bc562b05f 100644 --- a/settings/l10n/mn.js +++ b/settings/l10n/mn.js @@ -15,6 +15,7 @@ OC.L10N.register( "All" : "Бүгд", "Email" : "И-мэйл", "Password" : "Нууц үг", + "Done" : "Болсон", "Username" : "Хэрэглэгчийн нэр" }, "nplurals=2; plural=(n != 1);"); diff --git a/settings/l10n/mn.json b/settings/l10n/mn.json index 8e834210fb..1f888f6ef2 100644 --- a/settings/l10n/mn.json +++ b/settings/l10n/mn.json @@ -13,6 +13,7 @@ "All" : "Бүгд", "Email" : "И-мэйл", "Password" : "Нууц үг", + "Done" : "Болсон", "Username" : "Хэрэглэгчийн нэр" },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/settings/l10n/nb_NO.js b/settings/l10n/nb_NO.js index 752e0644d8..faa4e92b02 100644 --- a/settings/l10n/nb_NO.js +++ b/settings/l10n/nb_NO.js @@ -262,6 +262,7 @@ OC.L10N.register( "Language" : "Språk", "Help translate" : "Bidra til oversettelsen", "Name" : "Navn", + "Done" : "Ferdig", "Get the apps to sync your files" : "Hent apper som synkroniserer filene dine", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/nb_NO.json b/settings/l10n/nb_NO.json index 09dd026cbb..d094142fc6 100644 --- a/settings/l10n/nb_NO.json +++ b/settings/l10n/nb_NO.json @@ -260,6 +260,7 @@ "Language" : "Språk", "Help translate" : "Bidra til oversettelsen", "Name" : "Navn", + "Done" : "Ferdig", "Get the apps to sync your files" : "Hent apper som synkroniserer filene dine", "Desktop client" : "Skrivebordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/nl.js b/settings/l10n/nl.js index e68d30fb1b..3938755e97 100644 --- a/settings/l10n/nl.js +++ b/settings/l10n/nl.js @@ -274,6 +274,7 @@ OC.L10N.register( "Browser" : "Browser", "Most recent activity" : "Meest recente activiteit", "Name" : "Naam", + "Done" : "Gedaan", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/nl.json b/settings/l10n/nl.json index 77860f07c5..696812dc8e 100644 --- a/settings/l10n/nl.json +++ b/settings/l10n/nl.json @@ -272,6 +272,7 @@ "Browser" : "Browser", "Most recent activity" : "Meest recente activiteit", "Name" : "Naam", + "Done" : "Gedaan", "Get the apps to sync your files" : "Download de apps om bestanden te synchroniseren", "Desktop client" : "Desktop client", "Android app" : "Android app", diff --git a/settings/l10n/pl.js b/settings/l10n/pl.js index 3bef124944..0d68b38493 100644 --- a/settings/l10n/pl.js +++ b/settings/l10n/pl.js @@ -194,6 +194,7 @@ OC.L10N.register( "Language" : "Język", "Help translate" : "Pomóż w tłumaczeniu", "Name" : "Nazwa", + "Done" : "Ukończono", "Get the apps to sync your files" : "Pobierz aplikacje żeby synchronizować swoje pliki", "Desktop client" : "Klient na komputer", "Android app" : "Aplikacja Android", diff --git a/settings/l10n/pl.json b/settings/l10n/pl.json index bfb6eeb9f3..bdae17d4ee 100644 --- a/settings/l10n/pl.json +++ b/settings/l10n/pl.json @@ -192,6 +192,7 @@ "Language" : "Język", "Help translate" : "Pomóż w tłumaczeniu", "Name" : "Nazwa", + "Done" : "Ukończono", "Get the apps to sync your files" : "Pobierz aplikacje żeby synchronizować swoje pliki", "Desktop client" : "Klient na komputer", "Android app" : "Aplikacja Android", diff --git a/settings/l10n/pt_BR.js b/settings/l10n/pt_BR.js index 1984b5d1da..3e8c0da81c 100644 --- a/settings/l10n/pt_BR.js +++ b/settings/l10n/pt_BR.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", + "App passwords" : "Senhas de aplicativos", "Sync clients" : "Clientes de Sincronização", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", "Info, warnings, errors and fatal issues" : "Informações, avisos, erros e problemas fatais", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e clientes móveis atualmente conectado ao seu ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", + "You've linked these apps." : "Você vinculou esses aplicativos.", "Name" : "Nome", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "A senha do aplicativo é um código de acesso que dá ao aplicativo ou dispositivo permissões para acessar sua conta %s.", + "App name" : "Nome do aplicativo", + "Create new app password" : "Criar uma nova senha do aplicativo", + "Done" : "Concluída", "Get the apps to sync your files" : "Obtenha apps para sincronizar seus arquivos", "Desktop client" : "Cliente Desktop", "Android app" : "App Android", diff --git a/settings/l10n/pt_BR.json b/settings/l10n/pt_BR.json index 3a522e1b7e..72f1be2005 100644 --- a/settings/l10n/pt_BR.json +++ b/settings/l10n/pt_BR.json @@ -117,6 +117,7 @@ "Unlimited" : "Ilimitado", "Personal info" : "Informação pessoal", "Sessions" : "Sessões", + "App passwords" : "Senhas de aplicativos", "Sync clients" : "Clientes de Sincronização", "Everything (fatal issues, errors, warnings, info, debug)" : "Tudo (questões fatais, erros, avisos, informações, depuração)", "Info, warnings, errors and fatal issues" : "Informações, avisos, erros e problemas fatais", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Estes são os clientes web, desktop e clientes móveis atualmente conectado ao seu ownCloud.", "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", + "You've linked these apps." : "Você vinculou esses aplicativos.", "Name" : "Nome", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "A senha do aplicativo é um código de acesso que dá ao aplicativo ou dispositivo permissões para acessar sua conta %s.", + "App name" : "Nome do aplicativo", + "Create new app password" : "Criar uma nova senha do aplicativo", + "Done" : "Concluída", "Get the apps to sync your files" : "Obtenha apps para sincronizar seus arquivos", "Desktop client" : "Cliente Desktop", "Android app" : "App Android", diff --git a/settings/l10n/pt_PT.js b/settings/l10n/pt_PT.js index f6d5669340..bfadac2bc3 100644 --- a/settings/l10n/pt_PT.js +++ b/settings/l10n/pt_PT.js @@ -273,6 +273,7 @@ OC.L10N.register( "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", "Name" : "Nome", + "Done" : "Concluído", "Get the apps to sync your files" : "Obtenha as aplicações para sincronizar os seus ficheiros", "Desktop client" : "Cliente Desktop", "Android app" : "Aplicação Android", diff --git a/settings/l10n/pt_PT.json b/settings/l10n/pt_PT.json index aea78cd832..cd934850e6 100644 --- a/settings/l10n/pt_PT.json +++ b/settings/l10n/pt_PT.json @@ -271,6 +271,7 @@ "Browser" : "Navegador", "Most recent activity" : "Atividade mais recente", "Name" : "Nome", + "Done" : "Concluído", "Get the apps to sync your files" : "Obtenha as aplicações para sincronizar os seus ficheiros", "Desktop client" : "Cliente Desktop", "Android app" : "Aplicação Android", diff --git a/settings/l10n/ru.js b/settings/l10n/ru.js index 9a00364021..d4c952f7bd 100644 --- a/settings/l10n/ru.js +++ b/settings/l10n/ru.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Неограничено", "Personal info" : "Личная информация", "Sessions" : "Сессии", + "App passwords" : "Пароль приложения", "Sync clients" : "Синхронизирующиеся клиенты", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", "Info, warnings, errors and fatal issues" : "Информационные, предупреждения, ошибки и критические проблемы", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Это сессии, вошедшие в настоящий момент в ваш ownCloud через веб, клиенты для ПК или мобильных устройств.", "Browser" : "Браузер", "Most recent activity" : "Последняя активность", + "You've linked these apps." : "Вы привязали это приложение.", "Name" : "Название", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Пароль приложения представляет собой код доступа, который дает приложению или устройству разрешения на доступ к вашему аккаунту %s.", + "App name" : "Название приложения", + "Create new app password" : "Создать новый пароль для приложения", + "Done" : "Выполнено", "Get the apps to sync your files" : "Получить приложения для синхронизации ваших файлов", "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", diff --git a/settings/l10n/ru.json b/settings/l10n/ru.json index 0602644b93..819a852658 100644 --- a/settings/l10n/ru.json +++ b/settings/l10n/ru.json @@ -117,6 +117,7 @@ "Unlimited" : "Неограничено", "Personal info" : "Личная информация", "Sessions" : "Сессии", + "App passwords" : "Пароль приложения", "Sync clients" : "Синхронизирующиеся клиенты", "Everything (fatal issues, errors, warnings, info, debug)" : "Все (критические проблемы, ошибки, предупреждения, информационные, отладочные)", "Info, warnings, errors and fatal issues" : "Информационные, предупреждения, ошибки и критические проблемы", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Это сессии, вошедшие в настоящий момент в ваш ownCloud через веб, клиенты для ПК или мобильных устройств.", "Browser" : "Браузер", "Most recent activity" : "Последняя активность", + "You've linked these apps." : "Вы привязали это приложение.", "Name" : "Название", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Пароль приложения представляет собой код доступа, который дает приложению или устройству разрешения на доступ к вашему аккаунту %s.", + "App name" : "Название приложения", + "Create new app password" : "Создать новый пароль для приложения", + "Done" : "Выполнено", "Get the apps to sync your files" : "Получить приложения для синхронизации ваших файлов", "Desktop client" : "Клиент для ПК", "Android app" : "Android приложение", diff --git a/settings/l10n/sk_SK.js b/settings/l10n/sk_SK.js index 2f35284708..4ca631bb8b 100644 --- a/settings/l10n/sk_SK.js +++ b/settings/l10n/sk_SK.js @@ -214,6 +214,7 @@ OC.L10N.register( "Language" : "Jazyk", "Help translate" : "Pomôcť s prekladom", "Name" : "Názov", + "Done" : "Hotovo", "Get the apps to sync your files" : "Získať aplikácie na synchronizáciu vašich súborov", "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", diff --git a/settings/l10n/sk_SK.json b/settings/l10n/sk_SK.json index 4484930dfb..fbb0a5fe24 100644 --- a/settings/l10n/sk_SK.json +++ b/settings/l10n/sk_SK.json @@ -212,6 +212,7 @@ "Language" : "Jazyk", "Help translate" : "Pomôcť s prekladom", "Name" : "Názov", + "Done" : "Hotovo", "Get the apps to sync your files" : "Získať aplikácie na synchronizáciu vašich súborov", "Desktop client" : "Desktopový klient", "Android app" : "Android aplikácia", diff --git a/settings/l10n/sl.js b/settings/l10n/sl.js index b8b3e86782..f75df25d7f 100644 --- a/settings/l10n/sl.js +++ b/settings/l10n/sl.js @@ -236,6 +236,7 @@ OC.L10N.register( "Browser" : "Brskalnik", "Most recent activity" : "Zadnja dejavnost", "Name" : "Ime", + "Done" : "Končano", "Get the apps to sync your files" : "Pridobi programe za usklajevanje datotek", "Desktop client" : "Namizni odjemalec", "Android app" : "Program za Android", diff --git a/settings/l10n/sl.json b/settings/l10n/sl.json index 51b8c4e9eb..b7eb34f46f 100644 --- a/settings/l10n/sl.json +++ b/settings/l10n/sl.json @@ -234,6 +234,7 @@ "Browser" : "Brskalnik", "Most recent activity" : "Zadnja dejavnost", "Name" : "Ime", + "Done" : "Končano", "Get the apps to sync your files" : "Pridobi programe za usklajevanje datotek", "Desktop client" : "Namizni odjemalec", "Android app" : "Program za Android", diff --git a/settings/l10n/sq.js b/settings/l10n/sq.js index ee502c296a..dc949a0672 100644 --- a/settings/l10n/sq.js +++ b/settings/l10n/sq.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "E pakufizuar", "Personal info" : "Të dhëna personale", "Sessions" : "Sesione", + "App passwords" : "Fjalëkalim aplikacioni", "Sync clients" : "Klientë njëkohësimi", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.", "Browser" : "Shfletues", "Most recent activity" : "Veprimtaria më e freskët", + "You've linked these apps." : "I keni lidhur këto aplikacione.", "Name" : "Emër", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Fjalëkalimet e aplikacioneve janë kodkalime që u japin leje një aplikacioni ose pajisjeje të hyjnë në llogarinë tuaj %s.", + "App name" : "Emër aplikacioni", + "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", + "Done" : "U bë", "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", diff --git a/settings/l10n/sq.json b/settings/l10n/sq.json index b79905c52c..bc625b6d67 100644 --- a/settings/l10n/sq.json +++ b/settings/l10n/sq.json @@ -117,6 +117,7 @@ "Unlimited" : "E pakufizuar", "Personal info" : "Të dhëna personale", "Sessions" : "Sesione", + "App passwords" : "Fjalëkalim aplikacioni", "Sync clients" : "Klientë njëkohësimi", "Everything (fatal issues, errors, warnings, info, debug)" : "Gjithçka (probleme fatale, gabime, sinjalizime, të dhëna, diagnostikim)", "Info, warnings, errors and fatal issues" : "Të dhëna, sinjalizime, gabime dhe probleme fatale", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Këta janë klientët web, desktop dhe celular të futur në këtë çast në ownCloud-in tuaj.", "Browser" : "Shfletues", "Most recent activity" : "Veprimtaria më e freskët", + "You've linked these apps." : "I keni lidhur këto aplikacione.", "Name" : "Emër", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Fjalëkalimet e aplikacioneve janë kodkalime që u japin leje një aplikacioni ose pajisjeje të hyjnë në llogarinë tuaj %s.", + "App name" : "Emër aplikacioni", + "Create new app password" : "Krijoni fjalëkalim aplikacioni të ri", + "Done" : "U bë", "Get the apps to sync your files" : "Merrni aplikacionet për njëkohësim të kartelave tuaja", "Desktop client" : "Klient desktopi", "Android app" : "Aplikacion për Android", diff --git a/settings/l10n/sr.js b/settings/l10n/sr.js index 385ae2d675..5b77f60797 100644 --- a/settings/l10n/sr.js +++ b/settings/l10n/sr.js @@ -223,6 +223,7 @@ OC.L10N.register( "Language" : "Језик", "Help translate" : " Помозите у превођењу", "Name" : "назив", + "Done" : "Завршено", "Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова", "Desktop client" : "Клијент за рачунар", "Android app" : "Андроид апликација", diff --git a/settings/l10n/sr.json b/settings/l10n/sr.json index db270a7389..77513de8fa 100644 --- a/settings/l10n/sr.json +++ b/settings/l10n/sr.json @@ -221,6 +221,7 @@ "Language" : "Језик", "Help translate" : " Помозите у превођењу", "Name" : "назив", + "Done" : "Завршено", "Get the apps to sync your files" : "Преузмите апликације ради синхронизовања ваших фајлова", "Desktop client" : "Клијент за рачунар", "Android app" : "Андроид апликација", diff --git a/settings/l10n/sv.js b/settings/l10n/sv.js index 65df7d3bad..05b24bb4c7 100644 --- a/settings/l10n/sv.js +++ b/settings/l10n/sv.js @@ -274,6 +274,7 @@ OC.L10N.register( "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", "Name" : "Namn", + "Done" : "Färdig", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/sv.json b/settings/l10n/sv.json index a38595fb77..d8e9422eee 100644 --- a/settings/l10n/sv.json +++ b/settings/l10n/sv.json @@ -272,6 +272,7 @@ "Browser" : "Webbläsare", "Most recent activity" : "Senaste aktivitet", "Name" : "Namn", + "Done" : "Färdig", "Get the apps to sync your files" : "Skaffa apparna för att synkronisera dina filer", "Desktop client" : "Skrivbordsklient", "Android app" : "Android-app", diff --git a/settings/l10n/th_TH.js b/settings/l10n/th_TH.js index 1915e3f388..b8517d661b 100644 --- a/settings/l10n/th_TH.js +++ b/settings/l10n/th_TH.js @@ -258,6 +258,7 @@ OC.L10N.register( "Language" : "ภาษา", "Help translate" : "มาช่วยกันแปลสิ!", "Name" : "ชื่อ", + "Done" : "เสร็จสิ้น", "Get the apps to sync your files" : "ใช้แอพพลิเคชันในการประสานไฟล์ของคุณ", "Desktop client" : "เดสก์ทอปผู้ใช้", "Android app" : "แอพฯ แอนดรอยด์", diff --git a/settings/l10n/th_TH.json b/settings/l10n/th_TH.json index 3f7748512c..8d568dfecb 100644 --- a/settings/l10n/th_TH.json +++ b/settings/l10n/th_TH.json @@ -256,6 +256,7 @@ "Language" : "ภาษา", "Help translate" : "มาช่วยกันแปลสิ!", "Name" : "ชื่อ", + "Done" : "เสร็จสิ้น", "Get the apps to sync your files" : "ใช้แอพพลิเคชันในการประสานไฟล์ของคุณ", "Desktop client" : "เดสก์ทอปผู้ใช้", "Android app" : "แอพฯ แอนดรอยด์", diff --git a/settings/l10n/tr.js b/settings/l10n/tr.js index 8d640d180b..9a2962ad20 100644 --- a/settings/l10n/tr.js +++ b/settings/l10n/tr.js @@ -263,6 +263,7 @@ OC.L10N.register( "Language" : "Dil", "Help translate" : "Çevirilere yardım edin", "Name" : "Ad", + "Done" : "Bitti", "Get the apps to sync your files" : "Dosyalarınızı eşitlemek için uygulamaları indirin", "Desktop client" : "Masaüstü istemcisi", "Android app" : "Android uygulaması", diff --git a/settings/l10n/tr.json b/settings/l10n/tr.json index 8f2133aa7e..4e3c867c7f 100644 --- a/settings/l10n/tr.json +++ b/settings/l10n/tr.json @@ -261,6 +261,7 @@ "Language" : "Dil", "Help translate" : "Çevirilere yardım edin", "Name" : "Ad", + "Done" : "Bitti", "Get the apps to sync your files" : "Dosyalarınızı eşitlemek için uygulamaları indirin", "Desktop client" : "Masaüstü istemcisi", "Android app" : "Android uygulaması", diff --git a/settings/l10n/uk.js b/settings/l10n/uk.js index 6345d2a50e..a1afbc55f4 100644 --- a/settings/l10n/uk.js +++ b/settings/l10n/uk.js @@ -227,6 +227,7 @@ OC.L10N.register( "Language" : "Мова", "Help translate" : "Допомогти з перекладом", "Name" : "Ім’я", + "Done" : "Готово", "Get the apps to sync your files" : "Отримати додатки для синхронізації ваших файлів", "Desktop client" : "Клієнт для ПК", "Android app" : "Android-додаток", diff --git a/settings/l10n/uk.json b/settings/l10n/uk.json index e56c3b4412..4ab44f9623 100644 --- a/settings/l10n/uk.json +++ b/settings/l10n/uk.json @@ -225,6 +225,7 @@ "Language" : "Мова", "Help translate" : "Допомогти з перекладом", "Name" : "Ім’я", + "Done" : "Готово", "Get the apps to sync your files" : "Отримати додатки для синхронізації ваших файлів", "Desktop client" : "Клієнт для ПК", "Android app" : "Android-додаток", From 56ad4cdfec41f5b3dbbca357b4730f7db1700b1e Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 24 Jun 2016 10:10:10 +0200 Subject: [PATCH 38/42] Show error message when posting an invalid comment When an internal server error occurs while creating or updating a comment, display a proper error notification in the UI. --- apps/comments/js/commentstabview.js | Bin 12843 -> 13048 bytes apps/dav/lib/Comments/CommentNode.php | 2 +- .../tests/unit/Comments/CommentsNodeTest.php | 6 +++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/comments/js/commentstabview.js b/apps/comments/js/commentstabview.js index 9475dc53fc059208398833997e90b1db8f38f528..f71567f04d1a9220fecfb1e07d9e7035321c711b 100644 GIT binary patch delta 297 zcmZ3T@*{P_Gz}I_g=((JjRxwIGc@=oU)C@SE74F-&d<$F%_}KZ*HKV+Eh@?{QpitE zE-flbO;IS%$jnJqC`v6U%1kZG%u82*s#Pe@EXh#FOi`%LOsNIx15#EnInR_@&CNWT zvsfnY(vO*(t}QrO-+*JXoSte3F?N*}q$HM*Vw0O59}~Jwro`A(kY9{!k-FyQF9zm} E0FiKL;s5{u delta 96 zcmey7x;kaUG!6FL;&e@gYOcu&dg_xiH25c9&@f{LifxY3oW;Thk(~TaCt&hw1J22Q ZhISyi$p;O^HviK5!H7eC^Fc#%MgYmtBb)#L diff --git a/apps/dav/lib/Comments/CommentNode.php b/apps/dav/lib/Comments/CommentNode.php index edf46d210f..5c22f8a8a7 100644 --- a/apps/dav/lib/Comments/CommentNode.php +++ b/apps/dav/lib/Comments/CommentNode.php @@ -185,7 +185,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties { $msg = 'Message exceeds allowed character limit of '; throw new BadRequest($msg . IComment::MAX_MESSAGE_LENGTH, 0, $e); } - return false; + throw $e; } } diff --git a/apps/dav/tests/unit/Comments/CommentsNodeTest.php b/apps/dav/tests/unit/Comments/CommentsNodeTest.php index 6bf06375a4..18b18ab8d3 100644 --- a/apps/dav/tests/unit/Comments/CommentsNodeTest.php +++ b/apps/dav/tests/unit/Comments/CommentsNodeTest.php @@ -166,6 +166,10 @@ class CommentsNodeTest extends \Test\TestCase { $this->assertTrue($this->node->updateComment($msg)); } + /** + * @expectedException Exception + * @expectedExceptionMessage buh! + */ public function testUpdateCommentLogException() { $msg = null; @@ -198,7 +202,7 @@ class CommentsNodeTest extends \Test\TestCase { $this->logger->expects($this->once()) ->method('logException'); - $this->assertFalse($this->node->updateComment($msg)); + $this->node->updateComment($msg); } /** From bf3ee69d8612a9f6df730ea5e28175317a24fe23 Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 24 Jun 2016 11:31:29 +0200 Subject: [PATCH 39/42] Fix search result link for file results outside default list When outside the "All files" list, the search result link must properly redirect to the "All files" list. --- apps/files/js/search.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/files/js/search.js b/apps/files/js/search.js index 394bcb4860..d35cacfa40 100644 --- a/apps/files/js/search.js +++ b/apps/files/js/search.js @@ -133,7 +133,7 @@ this.handleFolderClick = function($row, result, event) { // open folder - if (self.fileAppLoaded()) { + if (self.fileAppLoaded() && self.fileList.id === 'files') { self.fileList.changeDirectory(result.path); return false; } else { @@ -142,7 +142,7 @@ }; this.handleFileClick = function($row, result, event) { - if (self.fileAppLoaded()) { + if (self.fileAppLoaded() && self.fileList.id === 'files') { self.fileList.changeDirectory(OC.dirname(result.path)); self.fileList.scrollTo(result.name); return false; From 39b533d0d89557a2349dd09b4602ab7a1a8cb9ec Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 24 Jun 2016 11:32:14 +0200 Subject: [PATCH 40/42] Hide search results after switching directory When clicking on a folder result in the search result list, the result box for "results in another folder" must disappear. --- apps/files/js/search.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/files/js/search.js b/apps/files/js/search.js index d35cacfa40..625e4b13f4 100644 --- a/apps/files/js/search.js +++ b/apps/files/js/search.js @@ -184,6 +184,13 @@ search.setHandler('folder', this.handleFolderClick.bind(this)); search.setHandler(['file', 'audio', 'image'], this.handleFileClick.bind(this)); + + if (self.fileAppLoaded()) { + // hide results when switching directory outside of search results + $('#app-content').delegate('>div', 'changeDirectory', function() { + search.clear(); + }); + } } }; OCA.Search.Files = Files; From 3d65979f0a4e470829cc2810f9e23ab76a8a11c4 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sat, 25 Jun 2016 01:56:48 -0400 Subject: [PATCH 41/42] [tx-robot] updated from transifex --- apps/comments/l10n/bg_BG.js | 1 + apps/comments/l10n/bg_BG.json | 1 + apps/updatenotification/l10n/bg_BG.js | 3 +- apps/updatenotification/l10n/bg_BG.json | 3 +- apps/user_ldap/l10n/ast.js | 57 +++++++++++++++++++++++++ apps/user_ldap/l10n/ast.json | 57 +++++++++++++++++++++++++ settings/l10n/cs_CZ.js | 5 +++ settings/l10n/cs_CZ.json | 5 +++ 8 files changed, 130 insertions(+), 2 deletions(-) diff --git a/apps/comments/l10n/bg_BG.js b/apps/comments/l10n/bg_BG.js index c5fbba69f7..ca60bb48bf 100644 --- a/apps/comments/l10n/bg_BG.js +++ b/apps/comments/l10n/bg_BG.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Type in a new comment..." : "Напиши нов коментар...", "Delete comment" : "Изтрий коментар", + "Post" : "Публикация", "Cancel" : "Отказ", "Edit comment" : "Редактирай коментра", "[Deleted user]" : "[Изтрит потребител]", diff --git a/apps/comments/l10n/bg_BG.json b/apps/comments/l10n/bg_BG.json index 64f516861c..2b79857f6b 100644 --- a/apps/comments/l10n/bg_BG.json +++ b/apps/comments/l10n/bg_BG.json @@ -1,6 +1,7 @@ { "translations": { "Type in a new comment..." : "Напиши нов коментар...", "Delete comment" : "Изтрий коментар", + "Post" : "Публикация", "Cancel" : "Отказ", "Edit comment" : "Редактирай коментра", "[Deleted user]" : "[Изтрит потребител]", diff --git a/apps/updatenotification/l10n/bg_BG.js b/apps/updatenotification/l10n/bg_BG.js index bfe17bf453..00e2fbf90d 100644 --- a/apps/updatenotification/l10n/bg_BG.js +++ b/apps/updatenotification/l10n/bg_BG.js @@ -6,6 +6,7 @@ OC.L10N.register( "A new version is available: %s" : "Има Нова Версия: %s", "Open updater" : "Отвори обновяването", "Your version is up to date." : "Вие разполагате с последна версия", - "Update channel:" : "Обновяване отказано:" + "Update channel:" : "Обновяване отказано:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Винаги може да оновите до по-нова версия / експирементален канал. Но неможете вече да върнете до по-стабилен канал.." }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/updatenotification/l10n/bg_BG.json b/apps/updatenotification/l10n/bg_BG.json index 7d4b4a5940..f4b312190d 100644 --- a/apps/updatenotification/l10n/bg_BG.json +++ b/apps/updatenotification/l10n/bg_BG.json @@ -4,6 +4,7 @@ "A new version is available: %s" : "Има Нова Версия: %s", "Open updater" : "Отвори обновяването", "Your version is up to date." : "Вие разполагате с последна версия", - "Update channel:" : "Обновяване отказано:" + "Update channel:" : "Обновяване отказано:", + "You can always update to a newer version / experimental channel. But you can never downgrade to a more stable channel." : "Винаги може да оновите до по-нова версия / експирементален канал. Но неможете вече да върнете до по-стабилен канал.." },"pluralForm" :"nplurals=2; plural=(n != 1);" } \ No newline at end of file diff --git a/apps/user_ldap/l10n/ast.js b/apps/user_ldap/l10n/ast.js index 9f7b3e6693..d7c76703db 100644 --- a/apps/user_ldap/l10n/ast.js +++ b/apps/user_ldap/l10n/ast.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Failed to clear the mappings." : "Hebo un fallu al desaniciar les asignaciones.", "Failed to delete the server configuration" : "Fallu al desaniciar la configuración del sirvidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración nun ye válida: nun s'almite l'enllaz anónimu ", "The configuration is valid and the connection could be established!" : "¡La configuración ye válida y pudo afitase la conexón!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración ye válida, pero falló'l vínculu. Por favor, comprueba la configuración y les credenciales nel sirvidor.", "The configuration is invalid. Please have a look at the logs for further details." : "La configuración nun ye válida. Por favor, écha-y un güeyu a los rexistros pa más detalles.", @@ -10,15 +11,42 @@ OC.L10N.register( "No configuration specified" : "Nun s'especificó la configuración", "No data specified" : "Nun s'especificaron los datos", " Could not set configuration %s" : "Nun pudo afitase la configuración %s", + "Action does not exist" : "L'acción nun esiste", + "The Base DN appears to be wrong" : "La base DN paez tar mal", + "Testing configuration…" : "Probando configuración...", "Configuration incorrect" : "Configuración incorreuta", "Configuration incomplete" : "Configuración incompleta", "Configuration OK" : "Configuración correuta", "Select groups" : "Esbillar grupos", "Select object classes" : "Seleicionar la clas d'oxetu", + "Please check the credentials, they seem to be wrong." : "Por favor, compruebe les credenciales, que paecen tar mal.", + "Please specify the port, it could not be auto-detected." : "Por favor especifica'l puertu, nun puede ser detectáu automáticamente .", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nun puede ser detectada automáticamente, por favor revisa les credenciales, host yá'l puertu.", + "Could not detect Base DN, please enter it manually." : "Nun se detectó base DN, por favor introduzla manualmente .", "{nthServer}. Server" : "{nthServer}. Sirvidor", + "No object found in the given Base DN. Please revise." : "Nun s'atopó nengún oxetu na Base DN dada. Por favor, revísalo.", + "More than 1,000 directory entries available." : "Más de 1.000 entraes de directoriu disponibles.", + " entries available within the provided Base DN" : "entraes disponibles dientro la Base DN proporcionada", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Asocedió un erru. Por favor, compruebe la Base DN , amás de la configuración de conexón y les credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Daveres que quies desaniciar la configuración actual del sirvidor?", "Confirm Deletion" : "Confirmar desaniciu", + "Mappings cleared successfully!" : "¡Asignaciones borraes correutamente!", + "Error while clearing the mappings." : "Fallu mientres desaniciaben les asignaciones.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Nun s'almite l'enllaz anónimu. Por favor apurre un usuariu DN y contraseña.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Erru d'operaciones LDAP . Enllaz anónimu nun s'almite.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Nun pudo guardase. Por favor asegúrate que la base de datos ta en funcionamientu. Actualiza enantes de siguir.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar el mou va habilitar les consultes LDAP automátiques . Dependiendo del to tamañu de LDAP puede llevar un tiempu. ¿Inda deseya camudar el mou?", + "Mode switch" : "Conmutar mou", "Select attributes" : "Esbillar atributos", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation):
" : "Nun s'alcuentra l'usuariu. Encamiéntase consultar los atributos d'accesu y nome d'usuariu. Filtru efectivu (copiar y pegar pa la validación de llínea de comandos):
", + "User found and settings verified." : "Usuariu atopáu y la configuración verificada.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Axustes verificaos, pero atopose un usuariu . Namá'l primeru d'ellos va ser capaz d'empecipiar sesión. Considere un filtru más acutáu.", + "An unspecified error occurred. Please check the settings and the log." : "Asocedió un erru. Por favor, compruebe la configuración y el rexistru.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtru de busca nun ye válidu , probablemente por cuenta de problemes de sintaxis como'l númberu impar de soportes abiertos y zarraos. Por favor revisalo.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Asocedió un erru de conexón a LDAP / AD, por favor, comprueba'l host, el puertu y les credenciales.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "El marcador de posición %uid nun s'atopa. Va ser trocáu col nome d'entamu de sesión cuando se consulta LDAP / AD.", + "Please provide a login name to test against" : "Por favor, proporcione un nombre de inicio de sesión para comprobar en contra", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadru de grupu taba desactiváu , por mor qu'el servidor LDAP / AD nun almite memberOf .", "_%s group found_::_%s groups found_" : ["%s grupu alcontráu","%s grupos alcontraos"], "_%s user found_::_%s users found_" : ["%s usuariu alcontráu","%s usuarios alcontraos"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nun deteutamos el nome d'atributu na pantalla d'usuariu. Por favor especifícalu nos axustes avanzaos de ldap", @@ -26,27 +54,52 @@ OC.L10N.register( "Invalid Host" : "Host inválidu", "Server" : "Sirvidor", "Users" : "Usuarios", + "Login Attributes" : "Los atributos d'aniciu de sesión", "Groups" : "Grupos", "Test Configuration" : "Configuración de prueba", "Help" : "Ayuda", "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen estos criterios tán disponibles en %s:", + "Only these object classes:" : "Namái d'estes clases d'oxetu:", + "Only from these groups:" : "Namái d'estos grupos:", + "Search groups" : "Esbillar grupos", + "Available groups" : "Grupos disponibles", + "Selected groups" : "Grupos seleicionaos", + "Edit LDAP Query" : "Editar consulta LDAP", + "LDAP Filter:" : "Filtru LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtru especifica qué grupos LDAP van tener accesu a %s.", + "Verify settings and count groups" : "Comprobar la configuración y grupos de recuentu", + "When logging in, %s will find the user based on the following attributes:" : "Al empecipiar sesión, %s atópase l'usuariu en función de los siguientes atributos :", + "LDAP / AD Username:" : "Nome d'usuariu LDAP / AD:", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Permite la entrada en contra'l nome d'usuariu LDAP / AD, yá sía uid o samaccountname y va ser detectada.", + "LDAP / AD Email Address:" : "Direición e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Almite la entrada contra un atributu de corréu electrónicu. Almitirase corréu electrónicu y mailPrimaryAddress.", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define'l filtru a aplicar cuando s'intenta identificar. %%uid va trocar al nome d'usuariu nel procesu d'identificación. Por exemplu: \"uid=%%uid\"", + "Test Loginname" : "Preba de Nome d'Aniciu de Sesión", + "Verify settings" : "Comprobar los axustes", "1. Server" : "1. Sirvidor", "%s. Server:" : "%s. Sirvidor:", + "Add a new and blank configuration" : "Amestar una configuración nueva y en blancu", + "Copy current configuration into new directory binding" : "Copiar configuración actual nel nuevu directoriu obligatoriu", + "Delete the current configuration" : "Desaniciar la configuración actual", "Host" : "Equipu", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Pues omitir el protocolu, sacantes si necesites SSL. Nesi casu, entama con ldaps://", "Port" : "Puertu", + "Detect Port" : "Detectar Puertu", "User DN" : "DN usuariu", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuariu veceru col que va facese l'asociación, p.ex. uid=axente,dc=exemplu,dc=com. P'accesu anónimu, dexa DN y contraseña baleros.", "Password" : "Contraseña", "For anonymous access, leave DN and Password empty." : "Pa un accesu anónimu, dexar el DN y la contraseña baleros.", "One Base DN per line" : "Un DN Base por llinia", "You can specify Base DN for users and groups in the Advanced tab" : "Pues especificar el DN base pa usuarios y grupos na llingüeta Avanzáu", + "Detect Base DN" : "Detectar Base DN", + "Test Base DN" : "Probar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automátiques de LDAP. Meyor pa grandes configuraciones, pero rique mayor conocimientu de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Inxerta manualmente los filtros de LDAP (recomendáu pa direutorios llargos)", + "%s access is limited to users meeting these criteria:" : "%s accesos llendaos a los usuarios que cumplan estos criterios:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les clases d'oxetos más comunes pa los usuarios d'Internet son organizationalPerson, persona, usuariu y inetOrgPerson . Si nun ta seguro de qué clase d'oxetu escoyer, por favor consulte al so alministrador de directorios.", "The filter specifies which LDAP users shall have access to the %s instance." : "El filtru especifica qué usuarios LDAP puen tener accesu a %s.", + "Verify settings and count users" : "Comprobar la configuración y usuarios de recuentu", "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", @@ -70,6 +123,8 @@ OC.L10N.register( "Directory Settings" : "Axustes del direutoriu", "User Display Name Field" : "Campu de nome d'usuariu a amosar", "The LDAP attribute to use to generate the user's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del usuariu.", + "2nd User Display Name Field" : "2ª usuariu amuesa Nome del campu", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributu LDAP que s'amesta al nome de visualización ente paréntesis. Los resultaos en, por exemplu, »John Doe (john.doe@example.org)«.", "Base User Tree" : "Árbol base d'usuariu", "One User Base DN per line" : "Un DN Base d'Usuariu por llinia", "User Search Attributes" : "Atributos de la gueta d'usuariu", @@ -80,6 +135,8 @@ OC.L10N.register( "One Group Base DN per line" : "Un DN Base de Grupu por llinia", "Group Search Attributes" : "Atributos de gueta de grupu", "Group-Member association" : "Asociación Grupu-Miembru", + "Dynamic Group Member URL" : "URL Dinámica de Grupu d'Usuarios", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atributu LDAP que nos oxetos de grupu contien una gueta de URLs de LDAP que determina qué oxetos pertenecen al grupu. (Un axuste vacíu desanicia la funcionalidá dinámica de pertenencia al grupu.)", "Nested Groups" : "Grupos añeraos", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando s'active, van permitise grupos que contengan otros grupos (namái funciona si l'atributu de miembru de grupu contién DNs).", "Paging chunksize" : "Tamañu de los fragmentos de paxinación", diff --git a/apps/user_ldap/l10n/ast.json b/apps/user_ldap/l10n/ast.json index 7b097287bb..c1fbc12850 100644 --- a/apps/user_ldap/l10n/ast.json +++ b/apps/user_ldap/l10n/ast.json @@ -1,6 +1,7 @@ { "translations": { "Failed to clear the mappings." : "Hebo un fallu al desaniciar les asignaciones.", "Failed to delete the server configuration" : "Fallu al desaniciar la configuración del sirvidor", + "The configuration is invalid: anonymous bind is not allowed." : "La configuración nun ye válida: nun s'almite l'enllaz anónimu ", "The configuration is valid and the connection could be established!" : "¡La configuración ye válida y pudo afitase la conexón!", "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuración ye válida, pero falló'l vínculu. Por favor, comprueba la configuración y les credenciales nel sirvidor.", "The configuration is invalid. Please have a look at the logs for further details." : "La configuración nun ye válida. Por favor, écha-y un güeyu a los rexistros pa más detalles.", @@ -8,15 +9,42 @@ "No configuration specified" : "Nun s'especificó la configuración", "No data specified" : "Nun s'especificaron los datos", " Could not set configuration %s" : "Nun pudo afitase la configuración %s", + "Action does not exist" : "L'acción nun esiste", + "The Base DN appears to be wrong" : "La base DN paez tar mal", + "Testing configuration…" : "Probando configuración...", "Configuration incorrect" : "Configuración incorreuta", "Configuration incomplete" : "Configuración incompleta", "Configuration OK" : "Configuración correuta", "Select groups" : "Esbillar grupos", "Select object classes" : "Seleicionar la clas d'oxetu", + "Please check the credentials, they seem to be wrong." : "Por favor, compruebe les credenciales, que paecen tar mal.", + "Please specify the port, it could not be auto-detected." : "Por favor especifica'l puertu, nun puede ser detectáu automáticamente .", + "Base DN could not be auto-detected, please revise credentials, host and port." : "Base DN nun puede ser detectada automáticamente, por favor revisa les credenciales, host yá'l puertu.", + "Could not detect Base DN, please enter it manually." : "Nun se detectó base DN, por favor introduzla manualmente .", "{nthServer}. Server" : "{nthServer}. Sirvidor", + "No object found in the given Base DN. Please revise." : "Nun s'atopó nengún oxetu na Base DN dada. Por favor, revísalo.", + "More than 1,000 directory entries available." : "Más de 1.000 entraes de directoriu disponibles.", + " entries available within the provided Base DN" : "entraes disponibles dientro la Base DN proporcionada", + "An error occurred. Please check the Base DN, as well as connection settings and credentials." : "Asocedió un erru. Por favor, compruebe la Base DN , amás de la configuración de conexón y les credenciales.", "Do you really want to delete the current Server Configuration?" : "¿Daveres que quies desaniciar la configuración actual del sirvidor?", "Confirm Deletion" : "Confirmar desaniciu", + "Mappings cleared successfully!" : "¡Asignaciones borraes correutamente!", + "Error while clearing the mappings." : "Fallu mientres desaniciaben les asignaciones.", + "Anonymous bind is not allowed. Please provide a User DN and Password." : "Nun s'almite l'enllaz anónimu. Por favor apurre un usuariu DN y contraseña.", + "LDAP Operations error. Anonymous bind might not be allowed." : "Erru d'operaciones LDAP . Enllaz anónimu nun s'almite.", + "Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Nun pudo guardase. Por favor asegúrate que la base de datos ta en funcionamientu. Actualiza enantes de siguir.", + "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Cambiar el mou va habilitar les consultes LDAP automátiques . Dependiendo del to tamañu de LDAP puede llevar un tiempu. ¿Inda deseya camudar el mou?", + "Mode switch" : "Conmutar mou", "Select attributes" : "Esbillar atributos", + "User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation):
" : "Nun s'alcuentra l'usuariu. Encamiéntase consultar los atributos d'accesu y nome d'usuariu. Filtru efectivu (copiar y pegar pa la validación de llínea de comandos):
", + "User found and settings verified." : "Usuariu atopáu y la configuración verificada.", + "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Axustes verificaos, pero atopose un usuariu . Namá'l primeru d'ellos va ser capaz d'empecipiar sesión. Considere un filtru más acutáu.", + "An unspecified error occurred. Please check the settings and the log." : "Asocedió un erru. Por favor, compruebe la configuración y el rexistru.", + "The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "El filtru de busca nun ye válidu , probablemente por cuenta de problemes de sintaxis como'l númberu impar de soportes abiertos y zarraos. Por favor revisalo.", + "A connection error to LDAP / AD occurred, please check host, port and credentials." : "Asocedió un erru de conexón a LDAP / AD, por favor, comprueba'l host, el puertu y les credenciales.", + "The %uid placeholder is missing. It will be replaced with the login name when querying LDAP / AD." : "El marcador de posición %uid nun s'atopa. Va ser trocáu col nome d'entamu de sesión cuando se consulta LDAP / AD.", + "Please provide a login name to test against" : "Por favor, proporcione un nombre de inicio de sesión para comprobar en contra", + "The group box was disabled, because the LDAP / AD server does not support memberOf." : "El cuadru de grupu taba desactiváu , por mor qu'el servidor LDAP / AD nun almite memberOf .", "_%s group found_::_%s groups found_" : ["%s grupu alcontráu","%s grupos alcontraos"], "_%s user found_::_%s users found_" : ["%s usuariu alcontráu","%s usuarios alcontraos"], "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nun deteutamos el nome d'atributu na pantalla d'usuariu. Por favor especifícalu nos axustes avanzaos de ldap", @@ -24,27 +52,52 @@ "Invalid Host" : "Host inválidu", "Server" : "Sirvidor", "Users" : "Usuarios", + "Login Attributes" : "Los atributos d'aniciu de sesión", "Groups" : "Grupos", "Test Configuration" : "Configuración de prueba", "Help" : "Ayuda", "Groups meeting these criteria are available in %s:" : "Los grupos que cumplen estos criterios tán disponibles en %s:", + "Only these object classes:" : "Namái d'estes clases d'oxetu:", + "Only from these groups:" : "Namái d'estos grupos:", + "Search groups" : "Esbillar grupos", + "Available groups" : "Grupos disponibles", + "Selected groups" : "Grupos seleicionaos", + "Edit LDAP Query" : "Editar consulta LDAP", + "LDAP Filter:" : "Filtru LDAP:", "The filter specifies which LDAP groups shall have access to the %s instance." : "El filtru especifica qué grupos LDAP van tener accesu a %s.", + "Verify settings and count groups" : "Comprobar la configuración y grupos de recuentu", + "When logging in, %s will find the user based on the following attributes:" : "Al empecipiar sesión, %s atópase l'usuariu en función de los siguientes atributos :", + "LDAP / AD Username:" : "Nome d'usuariu LDAP / AD:", + "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Permite la entrada en contra'l nome d'usuariu LDAP / AD, yá sía uid o samaccountname y va ser detectada.", + "LDAP / AD Email Address:" : "Direición e-mail LDAP / AD:", + "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Almite la entrada contra un atributu de corréu electrónicu. Almitirase corréu electrónicu y mailPrimaryAddress.", "Other Attributes:" : "Otros atributos:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Define'l filtru a aplicar cuando s'intenta identificar. %%uid va trocar al nome d'usuariu nel procesu d'identificación. Por exemplu: \"uid=%%uid\"", + "Test Loginname" : "Preba de Nome d'Aniciu de Sesión", + "Verify settings" : "Comprobar los axustes", "1. Server" : "1. Sirvidor", "%s. Server:" : "%s. Sirvidor:", + "Add a new and blank configuration" : "Amestar una configuración nueva y en blancu", + "Copy current configuration into new directory binding" : "Copiar configuración actual nel nuevu directoriu obligatoriu", + "Delete the current configuration" : "Desaniciar la configuración actual", "Host" : "Equipu", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Pues omitir el protocolu, sacantes si necesites SSL. Nesi casu, entama con ldaps://", "Port" : "Puertu", + "Detect Port" : "Detectar Puertu", "User DN" : "DN usuariu", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "El DN del usuariu veceru col que va facese l'asociación, p.ex. uid=axente,dc=exemplu,dc=com. P'accesu anónimu, dexa DN y contraseña baleros.", "Password" : "Contraseña", "For anonymous access, leave DN and Password empty." : "Pa un accesu anónimu, dexar el DN y la contraseña baleros.", "One Base DN per line" : "Un DN Base por llinia", "You can specify Base DN for users and groups in the Advanced tab" : "Pues especificar el DN base pa usuarios y grupos na llingüeta Avanzáu", + "Detect Base DN" : "Detectar Base DN", + "Test Base DN" : "Probar Base DN", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automátiques de LDAP. Meyor pa grandes configuraciones, pero rique mayor conocimientu de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Inxerta manualmente los filtros de LDAP (recomendáu pa direutorios llargos)", + "%s access is limited to users meeting these criteria:" : "%s accesos llendaos a los usuarios que cumplan estos criterios:", + "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Les clases d'oxetos más comunes pa los usuarios d'Internet son organizationalPerson, persona, usuariu y inetOrgPerson . Si nun ta seguro de qué clase d'oxetu escoyer, por favor consulte al so alministrador de directorios.", "The filter specifies which LDAP users shall have access to the %s instance." : "El filtru especifica qué usuarios LDAP puen tener accesu a %s.", + "Verify settings and count users" : "Comprobar la configuración y usuarios de recuentu", "Saving" : "Guardando", "Back" : "Atrás", "Continue" : "Continuar", @@ -68,6 +121,8 @@ "Directory Settings" : "Axustes del direutoriu", "User Display Name Field" : "Campu de nome d'usuariu a amosar", "The LDAP attribute to use to generate the user's display name." : "El campu LDAP a usar pa xenerar el nome p'amosar del usuariu.", + "2nd User Display Name Field" : "2ª usuariu amuesa Nome del campu", + "Optional. An LDAP attribute to be added to the display name in brackets. Results in e.g. »John Doe (john.doe@example.org)«." : "Opcional. Un atributu LDAP que s'amesta al nome de visualización ente paréntesis. Los resultaos en, por exemplu, »John Doe (john.doe@example.org)«.", "Base User Tree" : "Árbol base d'usuariu", "One User Base DN per line" : "Un DN Base d'Usuariu por llinia", "User Search Attributes" : "Atributos de la gueta d'usuariu", @@ -78,6 +133,8 @@ "One Group Base DN per line" : "Un DN Base de Grupu por llinia", "Group Search Attributes" : "Atributos de gueta de grupu", "Group-Member association" : "Asociación Grupu-Miembru", + "Dynamic Group Member URL" : "URL Dinámica de Grupu d'Usuarios", + "The LDAP attribute that on group objects contains an LDAP search URL that determines what objects belong to the group. (An empty setting disables dynamic group membership functionality.)" : "L'atributu LDAP que nos oxetos de grupu contien una gueta de URLs de LDAP que determina qué oxetos pertenecen al grupu. (Un axuste vacíu desanicia la funcionalidá dinámica de pertenencia al grupu.)", "Nested Groups" : "Grupos añeraos", "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando s'active, van permitise grupos que contengan otros grupos (namái funciona si l'atributu de miembru de grupu contién DNs).", "Paging chunksize" : "Tamañu de los fragmentos de paxinación", diff --git a/settings/l10n/cs_CZ.js b/settings/l10n/cs_CZ.js index 9ffb1a38b1..704b1970b1 100644 --- a/settings/l10n/cs_CZ.js +++ b/settings/l10n/cs_CZ.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "Neomezeně", "Personal info" : "Osobní informace", "Sessions" : "Sezení", + "App passwords" : "Hesla aplikací", "Sync clients" : "Synchronizační klienti", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", "Info, warnings, errors and fatal issues" : "Informace, varování, chyby a fatální problémy", @@ -273,7 +274,11 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Toto jsou klienti aktuálně přihlášení do této instance ownCloud přes web, počítač, či telefon.", "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", + "You've linked these apps." : "Připojili jste tyto aplikace.", "Name" : "Název", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Heslo aplikace je přihlašovací údaj umožňující aplikaci nebo přístroji přístup k %s účtu.", + "App name" : "Jméno aplikace", + "Create new app password" : "Vytvořit nové heslo aplikace", "Done" : "Dokončeno", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", diff --git a/settings/l10n/cs_CZ.json b/settings/l10n/cs_CZ.json index 55d0af36c7..30380cf6e3 100644 --- a/settings/l10n/cs_CZ.json +++ b/settings/l10n/cs_CZ.json @@ -117,6 +117,7 @@ "Unlimited" : "Neomezeně", "Personal info" : "Osobní informace", "Sessions" : "Sezení", + "App passwords" : "Hesla aplikací", "Sync clients" : "Synchronizační klienti", "Everything (fatal issues, errors, warnings, info, debug)" : "Vše (fatální problémy, chyby, varování, informační, ladící)", "Info, warnings, errors and fatal issues" : "Informace, varování, chyby a fatální problémy", @@ -271,7 +272,11 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "Toto jsou klienti aktuálně přihlášení do této instance ownCloud přes web, počítač, či telefon.", "Browser" : "Prohlížeč", "Most recent activity" : "Nejnovější aktivity", + "You've linked these apps." : "Připojili jste tyto aplikace.", "Name" : "Název", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "Heslo aplikace je přihlašovací údaj umožňující aplikaci nebo přístroji přístup k %s účtu.", + "App name" : "Jméno aplikace", + "Create new app password" : "Vytvořit nové heslo aplikace", "Done" : "Dokončeno", "Get the apps to sync your files" : "Získat aplikace pro synchronizaci vašich souborů", "Desktop client" : "Aplikace pro počítač", From 52eab2a61a5d27b64fcd0440b91f854c052933a9 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Sun, 26 Jun 2016 01:55:53 -0400 Subject: [PATCH 42/42] [tx-robot] updated from transifex --- apps/comments/l10n/cs_CZ.js | 3 +++ apps/comments/l10n/cs_CZ.json | 3 +++ apps/comments/l10n/de.js | 3 +++ apps/comments/l10n/de.json | 3 +++ apps/comments/l10n/de_DE.js | 3 +++ apps/comments/l10n/de_DE.json | 3 +++ apps/comments/l10n/he.js | 3 +++ apps/comments/l10n/he.json | 3 +++ apps/comments/l10n/it.js | 3 +++ apps/comments/l10n/it.json | 3 +++ apps/comments/l10n/sq.js | 3 +++ apps/comments/l10n/sq.json | 3 +++ core/l10n/ro.js | 16 +++++++++++++++- core/l10n/ro.json | 16 +++++++++++++++- settings/l10n/he.js | 6 ++++++ settings/l10n/he.json | 6 ++++++ settings/l10n/ro.js | 18 ++++++++++++++++++ settings/l10n/ro.json | 18 ++++++++++++++++++ 18 files changed, 114 insertions(+), 2 deletions(-) diff --git a/apps/comments/l10n/cs_CZ.js b/apps/comments/l10n/cs_CZ.js index d41b0f99f4..0653209616 100644 --- a/apps/comments/l10n/cs_CZ.js +++ b/apps/comments/l10n/cs_CZ.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "Více komentářů...", "Save" : "Uložit", "Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}", + "Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}", + "Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}", + "Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře", "{count} unread comments" : "{count} nepřečtených komentářů", "Comment" : "Komentář", "Comments for files (always listed in stream)" : "Komentáře pro soubory (vždy uvedeny v proudu)", diff --git a/apps/comments/l10n/cs_CZ.json b/apps/comments/l10n/cs_CZ.json index c695e50c64..efdd227bfb 100644 --- a/apps/comments/l10n/cs_CZ.json +++ b/apps/comments/l10n/cs_CZ.json @@ -10,6 +10,9 @@ "More comments..." : "Více komentářů...", "Save" : "Uložit", "Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}", + "Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}", + "Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}", + "Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře", "{count} unread comments" : "{count} nepřečtených komentářů", "Comment" : "Komentář", "Comments for files (always listed in stream)" : "Komentáře pro soubory (vždy uvedeny v proudu)", diff --git a/apps/comments/l10n/de.js b/apps/comments/l10n/de.js index ebf473c6b9..b46dcb2090 100644 --- a/apps/comments/l10n/de.js +++ b/apps/comments/l10n/de.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "Weitere Kommentare...", "Save" : "Speichern", "Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}", + "Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten", + "Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten", + "Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten", "{count} unread comments" : "{count} ungelesene Kommentare", "Comment" : "Kommentar", "Comments for files (always listed in stream)" : "Kommentare für Dateien(immer im Stream aufgelistet)", diff --git a/apps/comments/l10n/de.json b/apps/comments/l10n/de.json index 0e4bc1b53b..ff7d59cf5c 100644 --- a/apps/comments/l10n/de.json +++ b/apps/comments/l10n/de.json @@ -10,6 +10,9 @@ "More comments..." : "Weitere Kommentare...", "Save" : "Speichern", "Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}", + "Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten", + "Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten", + "Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten", "{count} unread comments" : "{count} ungelesene Kommentare", "Comment" : "Kommentar", "Comments for files (always listed in stream)" : "Kommentare für Dateien(immer im Stream aufgelistet)", diff --git a/apps/comments/l10n/de_DE.js b/apps/comments/l10n/de_DE.js index 74e129e0a2..7330b6ab06 100644 --- a/apps/comments/l10n/de_DE.js +++ b/apps/comments/l10n/de_DE.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "Weitere Kommentare...", "Save" : "Speichern", "Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt", + "Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten", + "Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten", + "Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten", "{count} unread comments" : "[count] ungelesene Kommentare", "Comment" : "Kommentar", "Comments for files (always listed in stream)" : "Kommentare für Dateien(immer im Stream aufgelistet)", diff --git a/apps/comments/l10n/de_DE.json b/apps/comments/l10n/de_DE.json index 6c18cf15fc..611521dc90 100644 --- a/apps/comments/l10n/de_DE.json +++ b/apps/comments/l10n/de_DE.json @@ -10,6 +10,9 @@ "More comments..." : "Weitere Kommentare...", "Save" : "Speichern", "Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt", + "Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten", + "Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten", + "Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten", "{count} unread comments" : "[count] ungelesene Kommentare", "Comment" : "Kommentar", "Comments for files (always listed in stream)" : "Kommentare für Dateien(immer im Stream aufgelistet)", diff --git a/apps/comments/l10n/he.js b/apps/comments/l10n/he.js index 02168b4f8e..e7b2454b1c 100644 --- a/apps/comments/l10n/he.js +++ b/apps/comments/l10n/he.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "תגובות נוספות...", "Save" : "שמירה", "Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}", + "Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}", + "Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}", + "Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה", "{count} unread comments" : "{count} תגובות שלא נקראו", "Comment" : "תגובה", "Comments for files (always listed in stream)" : "תגובות עבור קבצים (תמיד נרשמים בהזרמת מדיה)", diff --git a/apps/comments/l10n/he.json b/apps/comments/l10n/he.json index 66ac46ce2d..075e86f967 100644 --- a/apps/comments/l10n/he.json +++ b/apps/comments/l10n/he.json @@ -10,6 +10,9 @@ "More comments..." : "תגובות נוספות...", "Save" : "שמירה", "Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}", + "Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}", + "Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}", + "Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה", "{count} unread comments" : "{count} תגובות שלא נקראו", "Comment" : "תגובה", "Comments for files (always listed in stream)" : "תגובות עבור קבצים (תמיד נרשמים בהזרמת מדיה)", diff --git a/apps/comments/l10n/it.js b/apps/comments/l10n/it.js index 27844003c0..ce98270c06 100644 --- a/apps/comments/l10n/it.js +++ b/apps/comments/l10n/it.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "Altri commenti...", "Save" : "Salva", "Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}", + "Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}", + "Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}", + "Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.", "{count} unread comments" : "{count} commenti non letti", "Comment" : "Commento", "Comments for files (always listed in stream)" : "Commenti sui file (elencati sempre nel flusso)", diff --git a/apps/comments/l10n/it.json b/apps/comments/l10n/it.json index 73605cd6f0..50b8aa1769 100644 --- a/apps/comments/l10n/it.json +++ b/apps/comments/l10n/it.json @@ -10,6 +10,9 @@ "More comments..." : "Altri commenti...", "Save" : "Salva", "Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}", + "Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}", + "Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}", + "Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.", "{count} unread comments" : "{count} commenti non letti", "Comment" : "Commento", "Comments for files (always listed in stream)" : "Commenti sui file (elencati sempre nel flusso)", diff --git a/apps/comments/l10n/sq.js b/apps/comments/l10n/sq.js index 0f0366d87f..1cc9966f1d 100644 --- a/apps/comments/l10n/sq.js +++ b/apps/comments/l10n/sq.js @@ -12,6 +12,9 @@ OC.L10N.register( "More comments..." : "Më tepër komente…", "Save" : "Ruaje", "Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}", + "Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}", + "Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}", + "Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti", "{count} unread comments" : "{count} komente të palexuar", "Comment" : "Koment", "Comments for files (always listed in stream)" : "Komente për kartela (përherë të pranishme në rrjedhë)", diff --git a/apps/comments/l10n/sq.json b/apps/comments/l10n/sq.json index e4fdcbaeb5..71f01a2722 100644 --- a/apps/comments/l10n/sq.json +++ b/apps/comments/l10n/sq.json @@ -10,6 +10,9 @@ "More comments..." : "Më tepër komente…", "Save" : "Ruaje", "Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}", + "Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}", + "Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}", + "Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti", "{count} unread comments" : "{count} komente të palexuar", "Comment" : "Koment", "Comments for files (always listed in stream)" : "Komente për kartela (përherë të pranishme në rrjedhë)", diff --git a/core/l10n/ro.js b/core/l10n/ro.js index e73ec5cf79..fad21a73e5 100644 --- a/core/l10n/ro.js +++ b/core/l10n/ro.js @@ -9,6 +9,11 @@ OC.L10N.register( "Invalid image" : "Imagine invalidă", "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.", "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou", + "Crop is not square" : "Selecția nu este pătrată", + "Couldn't reset password because the token is invalid" : "Parola nu a putut fi resetată deoarece token-ul este invalid", + "Couldn't reset password because the token is expired" : "Parola nu a putut fi resetată deoarece token-ul a expirat", + "Couldn't send reset email. Please make sure your username is correct." : "Nu a putut fi trimis un email pentru resetare. Asigură-te că numele de utilizator este corect.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nu a putut fi trimis un email pentru resetare deoarece nu există o adresă email pentru acest utilizator. Contactează-ți administratorul.", "%s password reset" : "%s resetare parola", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Error loading tags" : "Eroare la încărcarea etichetelor", @@ -115,6 +120,7 @@ OC.L10N.register( "So-so password" : "Parolă medie", "Good password" : "Parolă bună", "Strong password" : "Parolă puternică", + "Error occurred while checking server setup" : "A apărut o eroare la verificarea configurației serverului", "Shared" : "Partajat", "Shared with {recipients}" : "Partajat cu {recipients}", "Error" : "Eroare", @@ -151,6 +157,8 @@ OC.L10N.register( "access control" : "control acces", "Could not unshare" : "Nu s-a putut elimina partajarea", "Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.", + "No users or groups found for {search}" : "Nu au fost găsiți utilizatori sau grupuri pentru {search}", + "No users found for {search}" : "Nu au fost găsiți utilizatori pentru {search}", "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou", "Share" : "Partajează", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud", @@ -175,6 +183,7 @@ OC.L10N.register( "sunny" : "însorit", "Hello {name}" : "Salut {name}", "new" : "nou", + "_download %n file_::_download %n files_" : ["descarcă %n fișier","descarcă %n fișiere","descarcă %n fișiere"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.", "Updating to {version}" : "Actualizare la {version}", "An error occurred." : "A apărut o eroare.", @@ -238,8 +247,12 @@ OC.L10N.register( "New password" : "Noua parolă", "New Password" : "Noua parolă", "Reset password" : "Resetează parola", + "This ownCloud instance is currently in single user mode." : "Această instanță ownCloud este momentan în modul de utilizare de către un singur utilizator.", + "This means only administrators can use the instance." : "Asta înseamnă că doar administratorii pot folosi instanța.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactează-ți administratorul de sistem dacă acest mesaj persistă sau a apărut neașteptat.", "Thank you for your patience." : "Îți mulțumim pentru răbdare.", "Two-step verification" : "Verificare în doi pași", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A fost activată securitatea sporită pentru contul tău. Te rugăm să te autentifici folosind un al doilea factor.", "Cancel login" : "Anulează autentificarea", "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.", "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului", @@ -254,6 +267,7 @@ OC.L10N.register( "Detailed logs" : "Loguri detaliate", "Update needed" : "E necesară actualizarea", "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.", - "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme." + "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme.", + "This page will refresh itself when the %s instance is available again." : "Această pagină se va reîmprospăta atunci când %s instance e disponibil din nou." }, "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));"); diff --git a/core/l10n/ro.json b/core/l10n/ro.json index c154312dab..b922cf154a 100644 --- a/core/l10n/ro.json +++ b/core/l10n/ro.json @@ -7,6 +7,11 @@ "Invalid image" : "Imagine invalidă", "An error occurred. Please contact your admin." : "A apărut o eroare. Te rugăm să contactezi administratorul.", "No temporary profile picture available, try again" : "Nu este disponibilă nicio imagine temporară a profilului, încearcă din nou", + "Crop is not square" : "Selecția nu este pătrată", + "Couldn't reset password because the token is invalid" : "Parola nu a putut fi resetată deoarece token-ul este invalid", + "Couldn't reset password because the token is expired" : "Parola nu a putut fi resetată deoarece token-ul a expirat", + "Couldn't send reset email. Please make sure your username is correct." : "Nu a putut fi trimis un email pentru resetare. Asigură-te că numele de utilizator este corect.", + "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Nu a putut fi trimis un email pentru resetare deoarece nu există o adresă email pentru acest utilizator. Contactează-ți administratorul.", "%s password reset" : "%s resetare parola", "Couldn't send reset email. Please contact your administrator." : "Expedierea email-ului de resetare a eşuat. Vă rugăm să contactaţi administratorul dvs.", "Error loading tags" : "Eroare la încărcarea etichetelor", @@ -113,6 +118,7 @@ "So-so password" : "Parolă medie", "Good password" : "Parolă bună", "Strong password" : "Parolă puternică", + "Error occurred while checking server setup" : "A apărut o eroare la verificarea configurației serverului", "Shared" : "Partajat", "Shared with {recipients}" : "Partajat cu {recipients}", "Error" : "Eroare", @@ -149,6 +155,8 @@ "access control" : "control acces", "Could not unshare" : "Nu s-a putut elimina partajarea", "Share details could not be loaded for this item." : "Nu s-au putut încărca detaliile de partajare pentru acest element.", + "No users or groups found for {search}" : "Nu au fost găsiți utilizatori sau grupuri pentru {search}", + "No users found for {search}" : "Nu au fost găsiți utilizatori pentru {search}", "An error occurred. Please try again" : "A apărut o eroare. Încearcă din nou", "Share" : "Partajează", "Share with people on other ownClouds using the syntax username@example.com/owncloud" : "Partajează cu persoane din alte instanțe ownCloud folosind sintaxa nume_utilizator@exemplu.com/owncloud", @@ -173,6 +181,7 @@ "sunny" : "însorit", "Hello {name}" : "Salut {name}", "new" : "nou", + "_download %n file_::_download %n files_" : ["descarcă %n fișier","descarcă %n fișiere","descarcă %n fișiere"], "The upgrade is in progress, leaving this page might interrupt the process in some environments." : "Actualizarea este în progres, părăsirea acestei pagini ar putea duce la întreruperea procesului în unele medii.", "Updating to {version}" : "Actualizare la {version}", "An error occurred." : "A apărut o eroare.", @@ -236,8 +245,12 @@ "New password" : "Noua parolă", "New Password" : "Noua parolă", "Reset password" : "Resetează parola", + "This ownCloud instance is currently in single user mode." : "Această instanță ownCloud este momentan în modul de utilizare de către un singur utilizator.", + "This means only administrators can use the instance." : "Asta înseamnă că doar administratorii pot folosi instanța.", + "Contact your system administrator if this message persists or appeared unexpectedly." : "Contactează-ți administratorul de sistem dacă acest mesaj persistă sau a apărut neașteptat.", "Thank you for your patience." : "Îți mulțumim pentru răbdare.", "Two-step verification" : "Verificare în doi pași", + "Enhanced security has been enabled for your account. Please authenticate using a second factor." : "A fost activată securitatea sporită pentru contul tău. Te rugăm să te autentifici folosind un al doilea factor.", "Cancel login" : "Anulează autentificarea", "Please authenticate using the selected factor." : "Autentifică-te folosind factorul ales.", "An error occured while verifying the token" : "A apărut o eroare la verificarea jetonului", @@ -252,6 +265,7 @@ "Detailed logs" : "Loguri detaliate", "Update needed" : "E necesară actualizarea", "Please use the command line updater because you have a big instance." : "Folosește actualizarea din linia de comandă deoarece ai o instanță mare.", - "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme." + "This %s instance is currently in maintenance mode, which may take a while." : "Instanța %s este acum în modul de mentenanță, ceea ce ar putea dura o vreme.", + "This page will refresh itself when the %s instance is available again." : "Această pagină se va reîmprospăta atunci când %s instance e disponibil din nou." },"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/settings/l10n/he.js b/settings/l10n/he.js index c78e89b6ea..644c3219a4 100644 --- a/settings/l10n/he.js +++ b/settings/l10n/he.js @@ -119,6 +119,7 @@ OC.L10N.register( "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", "Sessions" : "שיחות", + "App passwords" : "סיסמת יישום", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", @@ -273,7 +274,12 @@ OC.L10N.register( "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", + "You've linked these apps." : "יישומים אלו כבר קושרו על ידך.", "Name" : "שם", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "סיסמת יישום הנה קוד סיסמא שמאפשרת ליישום או התקן הרשאות גישה לחשבון %s שלך.", + "App name" : "שם יישום", + "Create new app password" : "יצירת סיסמת יישום חדשה", + "Done" : "הסתיים", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", "Desktop client" : "מחשב אישי", "Android app" : "יישום אנדרואיד", diff --git a/settings/l10n/he.json b/settings/l10n/he.json index 60b4ecc8de..48953344b8 100644 --- a/settings/l10n/he.json +++ b/settings/l10n/he.json @@ -117,6 +117,7 @@ "Unlimited" : "ללא הגבלה", "Personal info" : "מידע אישי", "Sessions" : "שיחות", + "App passwords" : "סיסמת יישום", "Sync clients" : "סנכרון לקוחות", "Everything (fatal issues, errors, warnings, info, debug)" : "הכול (נושאים חמורים, שגיאות, אזהרות, מידע, ניפוי שגיאות)", "Info, warnings, errors and fatal issues" : "מידע, אזהרות, שגיאות ונושאים חמורים", @@ -271,7 +272,12 @@ "These are the web, desktop and mobile clients currently logged in to your ownCloud." : "אלו הם לקוחות האינטרנט, המחשב השולחני והטלפון שכרגע מחוברים ל- ownCloud שלך.", "Browser" : "דפדפן", "Most recent activity" : "פעילות אחרונה", + "You've linked these apps." : "יישומים אלו כבר קושרו על ידך.", "Name" : "שם", + "An app password is a passcode that gives an app or device permissions to access your %s account." : "סיסמת יישום הנה קוד סיסמא שמאפשרת ליישום או התקן הרשאות גישה לחשבון %s שלך.", + "App name" : "שם יישום", + "Create new app password" : "יצירת סיסמת יישום חדשה", + "Done" : "הסתיים", "Get the apps to sync your files" : "קבלת היישומים לסנכרון הקבצים שלך", "Desktop client" : "מחשב אישי", "Android app" : "יישום אנדרואיד", diff --git a/settings/l10n/ro.js b/settings/l10n/ro.js index b16986e611..d0a0b107d0 100644 --- a/settings/l10n/ro.js +++ b/settings/l10n/ro.js @@ -58,6 +58,7 @@ OC.L10N.register( "All" : "Toate ", "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta", "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin", + "_You have %n app update pending_::_You have %n app updates pending_" : ["Ai %n actualizare de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare"], "Please wait...." : "Aşteptaţi vă rog....", "Error while disabling app" : "Eroare în timpul dezactivării aplicației", "Disable" : "Dezactivați", @@ -67,7 +68,10 @@ OC.L10N.register( "Error while updating app" : "Eroare în timpul actualizării aplicaţiei", "Updated" : "Actualizat", "Uninstalling ...." : "Dezinstalaza ....", + "Error while uninstalling app" : "Eroare la dezinstalarea aplicației", "Uninstall" : "Dezinstalați", + "App update" : "Actualizare aplicație", + "Disconnect" : "Deconectare", "Valid until {date}" : "Valabil până la {date}", "Delete" : "Șterge", "An error occurred: {message}" : "A apărut o eroare: {message}", @@ -79,26 +83,40 @@ OC.L10N.register( "Strong password" : "Parolă puternică", "Groups" : "Grupuri", "Unable to delete {objName}" : "Nu s-a putut șterge {objName}", + "Error creating group: {message}" : "Eroare la crearea grupului: {message}", + "A valid group name must be provided" : "Trebuie furnizat un nume de grup valid", "deleted {groupName}" : "{groupName} s-a șters", "undo" : "Anulează ultima acțiune", "no group" : "niciun grup", "never" : "niciodată", "deleted {userName}" : "{userName} șters", "add group" : "adăugaţi grupul", + "Changing the password will result in data loss, because data recovery is not available for this user" : "Schimbarea parolei va rezulta în pierderea datelor deoarece recuperarea acestora nu este disponibilă pentru acest utilizator", "A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid", + "Error creating user: {message}" : "Eroare la crearea utilizatorului: {message}", "A valid password must be provided" : "Trebuie să furnizaţi o parolă validă", + "A valid email must be provided" : "Trebuie furnizată o adresă email validă", "__language_name__" : "_language_name_", "Unlimited" : "Nelimitată", "Personal info" : "Informații personale", "Sessions" : "Sesiuni", + "App passwords" : "Parole aplicații", "Sync clients" : "Sincronizează clienții", + "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (erori fatale, erori, avertizări, informări, depanare)", + "Info, warnings, errors and fatal issues" : "Informări, avertizări, erori și erori fatale", + "Warnings, errors and fatal issues" : "Avertizări, erori și erori fatale", + "Errors and fatal issues" : "Erori și erori fatale", + "Fatal issues only" : "Doar erori fatale", "None" : "Niciuna", "Login" : "Autentificare", + "NT LAN Manager" : "NT LAN Manager", "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Modulul PHP \"Fileinfo\" lipsește. Va recomandam sa activaţi acest modul pentru a obține cele mai bune rezultate cu detectarea mime-type.", + "All checks passed." : "Toate verificările s-au terminat fără erori.", "Open documentation" : "Deschide documentația", "Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare", + "Allow users to share via link" : "Permite utilizatorilor să partajeze via link", "Allow public uploads" : "Permite încărcări publice", "Enforce password protection" : "Impune protecția prin parolă", "Set default expiration date" : "Setează data implicită de expirare", diff --git a/settings/l10n/ro.json b/settings/l10n/ro.json index aa38c2ec73..4f3a30ab5c 100644 --- a/settings/l10n/ro.json +++ b/settings/l10n/ro.json @@ -56,6 +56,7 @@ "All" : "Toate ", "No apps found for your version" : "Nu au fost găsite aplicații pentru versiunea ta", "The app will be downloaded from the app store" : "Aplicația va fi descărcată din magazin", + "_You have %n app update pending_::_You have %n app updates pending_" : ["Ai %n actualizare de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare","Ai %n actualizări de aplicație în așteptare"], "Please wait...." : "Aşteptaţi vă rog....", "Error while disabling app" : "Eroare în timpul dezactivării aplicației", "Disable" : "Dezactivați", @@ -65,7 +66,10 @@ "Error while updating app" : "Eroare în timpul actualizării aplicaţiei", "Updated" : "Actualizat", "Uninstalling ...." : "Dezinstalaza ....", + "Error while uninstalling app" : "Eroare la dezinstalarea aplicației", "Uninstall" : "Dezinstalați", + "App update" : "Actualizare aplicație", + "Disconnect" : "Deconectare", "Valid until {date}" : "Valabil până la {date}", "Delete" : "Șterge", "An error occurred: {message}" : "A apărut o eroare: {message}", @@ -77,26 +81,40 @@ "Strong password" : "Parolă puternică", "Groups" : "Grupuri", "Unable to delete {objName}" : "Nu s-a putut șterge {objName}", + "Error creating group: {message}" : "Eroare la crearea grupului: {message}", + "A valid group name must be provided" : "Trebuie furnizat un nume de grup valid", "deleted {groupName}" : "{groupName} s-a șters", "undo" : "Anulează ultima acțiune", "no group" : "niciun grup", "never" : "niciodată", "deleted {userName}" : "{userName} șters", "add group" : "adăugaţi grupul", + "Changing the password will result in data loss, because data recovery is not available for this user" : "Schimbarea parolei va rezulta în pierderea datelor deoarece recuperarea acestora nu este disponibilă pentru acest utilizator", "A valid username must be provided" : "Trebuie să furnizaţi un nume de utilizator valid", + "Error creating user: {message}" : "Eroare la crearea utilizatorului: {message}", "A valid password must be provided" : "Trebuie să furnizaţi o parolă validă", + "A valid email must be provided" : "Trebuie furnizată o adresă email validă", "__language_name__" : "_language_name_", "Unlimited" : "Nelimitată", "Personal info" : "Informații personale", "Sessions" : "Sesiuni", + "App passwords" : "Parole aplicații", "Sync clients" : "Sincronizează clienții", + "Everything (fatal issues, errors, warnings, info, debug)" : "Tot (erori fatale, erori, avertizări, informări, depanare)", + "Info, warnings, errors and fatal issues" : "Informări, avertizări, erori și erori fatale", + "Warnings, errors and fatal issues" : "Avertizări, erori și erori fatale", + "Errors and fatal issues" : "Erori și erori fatale", + "Fatal issues only" : "Doar erori fatale", "None" : "Niciuna", "Login" : "Autentificare", + "NT LAN Manager" : "NT LAN Manager", "SSL" : "SSL", "TLS" : "TLS", "The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "Modulul PHP \"Fileinfo\" lipsește. Va recomandam sa activaţi acest modul pentru a obține cele mai bune rezultate cu detectarea mime-type.", + "All checks passed." : "Toate verificările s-au terminat fără erori.", "Open documentation" : "Deschide documentația", "Allow apps to use the Share API" : "Permite aplicațiilor să folosească API-ul de partajare", + "Allow users to share via link" : "Permite utilizatorilor să partajeze via link", "Allow public uploads" : "Permite încărcări publice", "Enforce password protection" : "Impune protecția prin parolă", "Set default expiration date" : "Setează data implicită de expirare",