From c4149c59c2cfe83b5e4cd2b20b8ad4caf2341ca9 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 12:08:48 +0200 Subject: use token last_activity instead of session value --- .../Authentication/Token/DefaultTokenProvider.php | 11 +++++++---- lib/private/Authentication/Token/IProvider.php | 2 +- lib/private/User/Session.php | 18 ++---------------- 3 files changed, 10 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 84effc5f875..03b8bb5da28 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 fece7dcb567..e79ba8b30e5 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 0cebb3e0613..89148dcf8ec 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 * -- cgit v1.2.3 From 0c0a216f42bb004380efca1fd665711f938579d9 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 13:59:15 +0200 Subject: store last check timestamp in token instead of session --- db_structure.xml | 9 ++ lib/private/Authentication/Token/DefaultToken.php | 23 ++++ .../Authentication/Token/DefaultTokenMapper.php | 4 +- .../Authentication/Token/DefaultTokenProvider.php | 27 ++-- lib/private/Authentication/Token/IProvider.php | 14 +- lib/private/Authentication/Token/IToken.php | 14 ++ lib/private/User/Session.php | 144 +++++++++++++-------- version.php | 2 +- 8 files changed, 160 insertions(+), 77 deletions(-) (limited to 'lib') diff --git a/db_structure.xml b/db_structure.xml index b7dacc05d92..6b91c3c4c5d 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 299291e34af..79b03eed27f 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 c56a513b94c..b02220976cf 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 03b8bb5da28..2467b8d836f 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 e79ba8b30e5..97f8ababbbe 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 a34bdc2c43d..096550fd091 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 89148dcf8ec..ccae72ed35a 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 validateToken($token) { + 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 { - $token = $this->tokenProvider->validateToken($token); - if (!is_null($token)) { - $result = $this->loginWithToken($token->getUID()); - if ($result) { - // Login success - $this->tokenProvider->updateTokenActivity($token); - return true; - } + $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 { + $dbToken = $this->tokenProvider->getToken($token); } catch (InvalidTokenException $ex) { + return false; + } + if (!$this->checkTokenCredentials($dbToken, $token)) { + return false; } - 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 698636a2196..3015d976e53 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'; -- cgit v1.2.3 From 1889df5c7cac71e9faf42d19686b98bf61b23bf8 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 17 Jun 2016 15:41:32 +0200 Subject: 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(-) (limited to 'lib') diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index ccae72ed35a..cd9e973e306 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; } -- cgit v1.2.3 From 9d74ff02a4014d11020e21e5f73beb02bc749697 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 09:13:47 +0200 Subject: fix nitpick --- lib/private/User/Session.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index cd9e973e306..07235c1b42b 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)) { -- cgit v1.2.3 From 56199eba376e044f65e9e02844a9d98e524340b4 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 20 Jun 2016 10:41:23 +0200 Subject: fix unit test warning/errors --- lib/private/User/Session.php | 20 +++++++++----------- tests/lib/User/SessionTest.php | 31 ++++++++++++++++--------------- 2 files changed, 25 insertions(+), 26 deletions(-) (limited to 'lib') diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 07235c1b42b..aedb308539a 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 974b5d3fd88..6b72cf81bc9 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()) + $tokenProvider->expects($this->once()) ->method('invalidateToken') - ->with($token); - $session->expects($this->once()) + ->with('APP-PASSWORD'); + $userSession->expects($this->once()) ->method('logout'); - $tokenProvider->expects($this->once()) - ->method('updateToken') - ->with($token); - $this->invokePrivate($userSession, 'validateSession', [$user]); + $userSession->setUser($user); + $this->invokePrivate($userSession, 'validateSession'); } public function testValidateSessionNoPassword() { -- cgit v1.2.3 From b805908dca5cd4daf9f56bc140bbed48e067d573 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 21 Jun 2016 10:23:50 +0200 Subject: update session token password on user password change --- .../Authentication/Token/DefaultTokenProvider.php | 17 ++++++ lib/private/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(+) (limited to 'lib') diff --git a/lib/private/Authentication/Token/DefaultTokenProvider.php b/lib/private/Authentication/Token/DefaultTokenProvider.php index 84effc5f875..75f0fb10ba6 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 fece7dcb567..a9950dfaa4b 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 4e9c827448d..fe1835b3e55 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 5a6c985f181..2bf743575b0 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 98cee208065..d4117d877ea 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 7a34d42a2bc..4dcdc7c1348 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); + } + } -- cgit v1.2.3 From 7f22aeb5d6779236efec72cdb6bb8703dd7c0ee1 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Tue, 21 Jun 2016 16:14:51 +0200 Subject: 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(-) (limited to 'lib') diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php index 65d00c16388..78445dab020 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 aea2400e999..73d65034d9a 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) { -- cgit v1.2.3 From c8b7a059b4b8ae9a72d7be36f7e42fefbb130d35 Mon Sep 17 00:00:00 2001 From: karakayasemi Date: Tue, 21 Jun 2016 17:10:52 +0200 Subject: 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(-) (limited to 'lib') diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index e9daa123470..31549c93cb2 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; + } } -- cgit v1.2.3 From 854352d9a064a1e469ede207493bce44fd41d96c Mon Sep 17 00:00:00 2001 From: VicDeo Date: Wed, 22 Jun 2016 14:12:36 +0300 Subject: 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 (limited to 'lib') diff --git a/core/Application.php b/core/Application.php index a87917b626a..8ea2672e54e 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 00000000000..917d02f37f1 --- /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 402277d8f3e..c473408e2e9 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 b33687dbab7..45f291e5cb7 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 ec91064278e..8a9191a4c53 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 964ed03c1aa..b7125502ee8 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 00000000000..682d9170096 --- /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 + ); + } + +} -- cgit v1.2.3 From 29068d3845065c3ca873513f3be6d27d886c9874 Mon Sep 17 00:00:00 2001 From: Jenkins for ownCloud Date: Fri, 24 Jun 2016 01:56:13 -0400 Subject: [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(-) (limited to 'lib') diff --git a/apps/federatedfilesharing/l10n/ast.js b/apps/federatedfilesharing/l10n/ast.js index 4ae5f2b9cc1..3b5affabbb9 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 70d90ab6578..e5eb10cf14e 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 6fe07fed765..092610b7140 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 5b554ab8f93..7631a9149f2 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 3a00853fa18..d080e4b7c69 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 4d60be20692..080390bd8a6 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 d134495dc88..548ca59e8e8 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 be1adf37875..48bd836a8e6 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 de5839558a1..c9de6fb0c3b 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 c5cc476b58f..37413d0e37d 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 b2cd227cd95..8a41c42474c 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 478b1bcfd6b..da25c47d906 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 38f73cfb384..d1d0ea94cb9 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 c5a60bb5694..7c1df558601 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 71e9a9874b0..9ffb1a38b19 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 5b87ae449ec..55d0af36c77 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 92508e0edd9..0e3ba482251 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 ca58a9dfca0..b77cb15564a 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 f8c96e4d181..26c62170a0c 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 d63456ec378..3483ac763e0 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 7af12128ec8..cb822ea9f8d 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 4de6cd70b79..0b6e3d7fdca 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 ad936384c8e..b79f5efa65d 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 f7d4b064f63..623294c4f40 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 b020ec6306e..f080b59c553 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 8bab21429fc..203b5fde76e 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 20eaca472b2..55bad706b82 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 03480e2aaa4..dc0d29c1de7 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 4cb08348eb5..9a16c8ea914 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 0bcdf03d9a5..bd9cb270bbd 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 d04e674de3c..8448dd500fd 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 10a38ccf3d6..8d74443002d 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 963ecf4609b..a8703668ac2 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 41a0c348dc0..efb94b66a8a 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 d4f60296566..2d32dc527f9 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 ae3082c7423..dddfd1067c5 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 daae89902de..b20ccbe627f 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 76e17de70e4..90e241cfae3 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 8c03be24eee..d9ecbc1213b 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 9e565f89194..4cab1d0756b 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 065b4d31175..396fd13f22e 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 3869df4e661..ea29613851e 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 27ccfc44336..fbc57559584 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 c4737e1e9d6..7ceb5374dbd 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 18aa0bf1aa9..d877b7beafa 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 e485dea67d6..913fa6706b8 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 ad8544158e4..d4c8259b2ea 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 e42dcc03c4b..6e8279fb49e 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 b0c4ea2f20a..b78566d33d2 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 8921e3ecbcd..1296a0db263 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 9f421dd1376..a24704e6360 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 52655dbfd16..990d454f2a0 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 cea2aa37c9a..0bc562b05f7 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 8e834210fb5..1f888f6ef2d 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 752e0644d8d..faa4e92b021 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 09dd026cbbb..d094142fc6c 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 e68d30fb1b7..3938755e974 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 77860f07c57..696812dc8e8 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 3bef1249442..0d68b384931 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 bfb6eeb9f3e..bdae17d4eef 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 1984b5d1daa..3e8c0da81ce 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 3a522e1b7ec..72f1be20054 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 f6d5669340a..bfadac2bc3f 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 aea78cd8326..cd934850e69 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 9a003640214..d4c952f7bd1 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 0602644b93c..819a852658c 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 2f352847086..4ca631bb8b6 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 4484930dfb5..fbb0a5fe24f 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 b8b3e867825..f75df25d7fe 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 51b8c4e9ebf..b7eb34f46f3 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 ee502c296a3..dc949a06726 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 b79905c52cc..bc625b6d67f 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 385ae2d6751..5b77f607971 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 db270a7389d..77513de8fac 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 65df7d3badd..05b24bb4c75 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 a38595fb775..d8e9422eeec 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 1915e3f3882..b8517d661b5 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 3f7748512c0..8d568dfecbc 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 8d640d180b8..9a2962ad209 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 8f2133aa7e7..4e3c867c7f4 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 6345d2a50e2..a1afbc55f45 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 e56c3b44120..4ab44f9623a 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-додаток", -- cgit v1.2.3