From 5bb63e59e05400b090e3d4fabe75729b5e7fe800 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 3 Dec 2019 21:11:42 +0100 Subject: [PATCH 01/21] Move App::internalRedirect to BaseUrl::redirect --- src/App.php | 18 ++++-------------- src/App/BaseURL.php | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/App.php b/src/App.php index c6ed818dd..bbf980d17 100644 --- a/src/App.php +++ b/src/App.php @@ -796,22 +796,12 @@ class App } /** - * Redirects to another module relative to the current Friendica base. - * If you want to redirect to a external URL, use System::externalRedirectTo() - * - * @param string $toUrl The destination URL (Default is empty, which is the default page of the Friendica node) - * @param bool $ssl if true, base URL will try to get called with https:// (works just for relative paths) - * - * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node + * @deprecated 2019.12 use BaseUrl::redirect instead + * @see BaseURL::redirect() */ public function internalRedirect($toUrl = '', $ssl = false) { - if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) { - throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo"); - } - - $redirectTo = $this->baseURL->get($ssl) . '/' . ltrim($toUrl, '/'); - Core\System::externalRedirect($redirectTo); + $this->baseURL->redirect($toUrl, $ssl); } /** @@ -827,7 +817,7 @@ class App if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) { Core\System::externalRedirect($toUrl); } else { - $this->internalRedirect($toUrl); + $this->baseURL->redirect($toUrl); } } } diff --git a/src/App/BaseURL.php b/src/App/BaseURL.php index 8d76a0d2d..501e5fbd3 100644 --- a/src/App/BaseURL.php +++ b/src/App/BaseURL.php @@ -3,8 +3,10 @@ namespace Friendica\App; use Friendica\Core\Config\Configuration; +use Friendica\Core\System; use Friendica\Util\Network; use Friendica\Util\Strings; +use Friendica\Network\HTTPException; /** * A class which checks and contains the basic @@ -414,4 +416,23 @@ class BaseURL return $url; } } + + /** + * Redirects to another module relative to the current Friendica base URL. + * If you want to redirect to a external URL, use System::externalRedirectTo() + * + * @param string $toUrl The destination URL (Default is empty, which is the default page of the Friendica node) + * @param bool $ssl if true, base URL will try to get called with https:// (works just for relative paths) + * + * @throws HTTPException\InternalServerErrorException In Case the given URL is not relative to the Friendica node + */ + public function redirect($toUrl = '', $ssl = false) + { + if (!empty(parse_url($toUrl, PHP_URL_SCHEME))) { + throw new HTTPException\InternalServerErrorException("'$toUrl is not a relative path, please use System::externalRedirectTo"); + } + + $redirectTo = $this->get($ssl) . '/' . ltrim($toUrl, '/'); + System::externalRedirect($redirectTo); + } } From 18a3d18ba62203b9ca233f42676a4a13f63203cc Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 3 Dec 2019 21:18:26 +0100 Subject: [PATCH 02/21] Move Authentication methods to class "Authentication" --- mod/dfrn_poll.php | 3 +- src/App.php | 3 +- src/Core/Authentication.php | 213 ++++++++++++++++++++++++++++++++++ src/Module/Login.php | 220 +----------------------------------- 4 files changed, 219 insertions(+), 220 deletions(-) diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index ca60cc87a..6aef31a54 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -5,6 +5,7 @@ */ use Friendica\App; +use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\Logger; @@ -20,7 +21,7 @@ use Friendica\Util\XML; function dfrn_poll_init(App $a) { - Login::sessionAuth(); + Authentication::sessionAuth(); $dfrn_id = $_GET['dfrn_id'] ?? ''; $type = ($_GET['type'] ?? '') ?: 'data'; diff --git a/src/App.php b/src/App.php index bbf980d17..4d652496b 100644 --- a/src/App.php +++ b/src/App.php @@ -8,6 +8,7 @@ use Exception; use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\App\Page; +use Friendica\Core\Authentication; use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; @@ -717,7 +718,7 @@ class App Model\Profile::openWebAuthInit($token); } - Login::sessionAuth(); + Authentication::sessionAuth(); if (empty($_SESSION['authenticated'])) { header('X-Account-Management-Status: none'); diff --git a/src/Core/Authentication.php b/src/Core/Authentication.php index 6d017664a..6ea727871 100644 --- a/src/Core/Authentication.php +++ b/src/Core/Authentication.php @@ -8,13 +8,226 @@ namespace Friendica\Core; use Friendica\App; use Friendica\BaseObject; +use Friendica\Database\DBA; +use Friendica\Model\User; use Friendica\Network\HTTPException\ForbiddenException; +use Friendica\Util\DateTimeFormat; +use Friendica\Util\Network; +use Friendica\Util\Strings; /** * Handle Authentification, Session and Cookies */ class Authentication extends BaseObject { + /** + * Attempts to authenticate using OpenId + * + * @param string $openid_url OpenID URL string + * @param bool $remember Whether to set the session remember flag + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function openIdAuthentication($openid_url, $remember) + { + $noid = Config::get('system', 'no_openid'); + + $a = self::getApp(); + + // if it's an email address or doesn't resolve to a URL, fail. + if ($noid || strpos($openid_url, '@') || !Network::isUrlValid($openid_url)) { + notice(L10n::t('Login failed.') . EOL); + $a->internalRedirect(); + // NOTREACHED + } + + // Otherwise it's probably an openid. + try { + $openid = new LightOpenID($a->getHostName()); + $openid->identity = $openid_url; + Session::set('openid', $openid_url); + Session::set('remember', $remember); + $openid->returnUrl = $a->getBaseURL(true) . '/openid'; + $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; + System::externalRedirect($openid->authUrl()); + } catch (Exception $e) { + notice(L10n::t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '

' . L10n::t('The error message was:') . ' ' . $e->getMessage()); + } + } + + /** + * Attempts to authenticate using login/password + * + * @param string $username User name + * @param string $password Clear password + * @param bool $remember Whether to set the session remember flag + * @param string $openid_identity OpenID identity + * @param string $openid_server OpenID URL + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function passwordAuthentication($username, $password, $remember, $openid_identity, $openid_server) + { + $record = null; + + $addon_auth = [ + 'username' => $username, + 'password' => $password, + 'authenticated' => 0, + 'user_record' => null + ]; + + $a = self::getApp(); + + /* + * An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record + * Addons should never set 'authenticated' except to indicate success - as hooks may be chained + * and later addons should not interfere with an earlier one that succeeded. + */ + Hook::callAll('authenticate', $addon_auth); + + try { + if ($addon_auth['authenticated']) { + $record = $addon_auth['user_record']; + + if (empty($record)) { + throw new Exception(L10n::t('Login failed.')); + } + } else { + $record = DBA::selectFirst( + 'user', + [], + ['uid' => User::getIdFromPasswordAuthentication($username, $password)] + ); + } + } catch (Exception $e) { + Logger::warning('authenticate: failed login attempt', ['action' => 'login', 'username' => Strings::escapeTags($username), 'ip' => $_SERVER['REMOTE_ADDR']]); + info('Login failed. Please check your credentials.' . EOL); + $a->internalRedirect(); + } + + if (!$remember) { + Authentication::setCookie(0); // 0 means delete on browser exit + } + + // if we haven't failed up this point, log them in. + Session::set('remember', $remember); + Session::set('last_login_date', DateTimeFormat::utcNow()); + + if (!empty($openid_identity) || !empty($openid_server)) { + DBA::update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); + } + + Session::setAuthenticatedForUser($a, $record, true, true); + + $return_path = Session::get('return_path', ''); + Session::remove('return_path'); + + $a->internalRedirect($return_path); + } + + /** + * @brief Tries to auth the user from the cookie or session + * + * @todo Should be moved to Friendica\Core\Session when it's created + */ + public static function sessionAuth() + { + $a = self::getApp(); + + // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. + if (isset($_COOKIE["Friendica"])) { + $data = json_decode($_COOKIE["Friendica"]); + if (isset($data->uid)) { + + $user = DBA::selectFirst( + 'user', + [], + [ + 'uid' => $data->uid, + 'blocked' => false, + 'account_expired' => false, + 'account_removed' => false, + 'verified' => true, + ] + ); + if (DBA::isResult($user)) { + if (!hash_equals( + Authentication::getCookieHashForUser($user), + $data->hash + )) { + Logger::log("Hash for user " . $data->uid . " doesn't fit."); + Authentication::deleteSession(); + $a->internalRedirect(); + } + + // Renew the cookie + // Expires after 7 days by default, + // can be set via system.auth_cookie_lifetime + $authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7); + Authentication::setCookie($authcookiedays * 24 * 60 * 60, $user); + + // Do the authentification if not done by now + if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) { + Session::setAuthenticatedForUser($a, $user); + + if (Config::get('system', 'paranoia')) { + $_SESSION['addr'] = $data->ip; + } + } + } + } + } + + if (!empty($_SESSION['authenticated'])) { + if (!empty($_SESSION['visitor_id']) && empty($_SESSION['uid'])) { + $contact = DBA::selectFirst('contact', [], ['id' => $_SESSION['visitor_id']]); + if (DBA::isResult($contact)) { + self::getApp()->contact = $contact; + } + } + + if (!empty($_SESSION['uid'])) { + // already logged in user returning + $check = Config::get('system', 'paranoia'); + // extra paranoia - if the IP changed, log them out + if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) { + Logger::log('Session address changed. Paranoid setting in effect, blocking session. ' . + $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']); + Authentication::deleteSession(); + $a->internalRedirect(); + } + + $user = DBA::selectFirst( + 'user', + [], + [ + 'uid' => $_SESSION['uid'], + 'blocked' => false, + 'account_expired' => false, + 'account_removed' => false, + 'verified' => true, + ] + ); + if (!DBA::isResult($user)) { + Authentication::deleteSession(); + $a->internalRedirect(); + } + + // Make sure to refresh the last login time for the user if the user + // stays logged in for a long time, e.g. with "Remember Me" + $login_refresh = false; + if (empty($_SESSION['last_login_date'])) { + $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); + } + if (strcmp(DateTimeFormat::utc('now - 12 hours'), $_SESSION['last_login_date']) > 0) { + $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); + $login_refresh = true; + } + + Session::setAuthenticatedForUser($a, $user, false, false, $login_refresh); + } + } + } + /** * @brief Calculate the hash that is needed for the "Friendica" cookie * diff --git a/src/Module/Login.php b/src/Module/Login.php index c84af17cc..f43bd221e 100644 --- a/src/Module/Login.php +++ b/src/Module/Login.php @@ -6,22 +6,14 @@ namespace Friendica\Module; -use Exception; use Friendica\BaseModule; use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; -use Friendica\Core\Logger; use Friendica\Core\Renderer; use Friendica\Core\Session; -use Friendica\Core\System; -use Friendica\Database\DBA; -use Friendica\Model\User; -use Friendica\Util\DateTimeFormat; -use Friendica\Util\Network; use Friendica\Util\Strings; -use LightOpenID; /** * Login module @@ -58,11 +50,11 @@ class Login extends BaseModule ) { $openid_url = trim(($_POST['openid_url'] ?? '') ?: $_POST['username']); - self::openIdAuthentication($openid_url, !empty($_POST['remember'])); + Authentication::openIdAuthentication($openid_url, !empty($_POST['remember'])); } if (!empty($_POST['auth-params']) && $_POST['auth-params'] === 'login') { - self::passwordAuthentication( + Authentication::passwordAuthentication( trim($_POST['username']), trim($_POST['password']), !empty($_POST['remember']), @@ -72,214 +64,6 @@ class Login extends BaseModule } } - /** - * Attempts to authenticate using OpenId - * - * @param string $openid_url OpenID URL string - * @param bool $remember Whether to set the session remember flag - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - private static function openIdAuthentication($openid_url, $remember) - { - $noid = Config::get('system', 'no_openid'); - - $a = self::getApp(); - - // if it's an email address or doesn't resolve to a URL, fail. - if ($noid || strpos($openid_url, '@') || !Network::isUrlValid($openid_url)) { - notice(L10n::t('Login failed.') . EOL); - $a->internalRedirect(); - // NOTREACHED - } - - // Otherwise it's probably an openid. - try { - $openid = new LightOpenID($a->getHostName()); - $openid->identity = $openid_url; - Session::set('openid', $openid_url); - Session::set('remember', $remember); - $openid->returnUrl = $a->getBaseURL(true) . '/openid'; - $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; - System::externalRedirect($openid->authUrl()); - } catch (Exception $e) { - notice(L10n::t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '

' . L10n::t('The error message was:') . ' ' . $e->getMessage()); - } - } - - /** - * Attempts to authenticate using login/password - * - * @param string $username User name - * @param string $password Clear password - * @param bool $remember Whether to set the session remember flag - * @param string $openid_identity OpenID identity - * @param string $openid_server OpenID URL - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - private static function passwordAuthentication($username, $password, $remember, $openid_identity, $openid_server) - { - $record = null; - - $addon_auth = [ - 'username' => $username, - 'password' => $password, - 'authenticated' => 0, - 'user_record' => null - ]; - - $a = self::getApp(); - - /* - * An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record - * Addons should never set 'authenticated' except to indicate success - as hooks may be chained - * and later addons should not interfere with an earlier one that succeeded. - */ - Hook::callAll('authenticate', $addon_auth); - - try { - if ($addon_auth['authenticated']) { - $record = $addon_auth['user_record']; - - if (empty($record)) { - throw new Exception(L10n::t('Login failed.')); - } - } else { - $record = DBA::selectFirst( - 'user', - [], - ['uid' => User::getIdFromPasswordAuthentication($username, $password)] - ); - } - } catch (Exception $e) { - Logger::warning('authenticate: failed login attempt', ['action' => 'login', 'username' => Strings::escapeTags($username), 'ip' => $_SERVER['REMOTE_ADDR']]); - info('Login failed. Please check your credentials.' . EOL); - $a->internalRedirect(); - } - - if (!$remember) { - Authentication::setCookie(0); // 0 means delete on browser exit - } - - // if we haven't failed up this point, log them in. - Session::set('remember', $remember); - Session::set('last_login_date', DateTimeFormat::utcNow()); - - if (!empty($openid_identity) || !empty($openid_server)) { - DBA::update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); - } - - Session::setAuthenticatedForUser($a, $record, true, true); - - $return_path = Session::get('return_path', ''); - Session::remove('return_path'); - - $a->internalRedirect($return_path); - } - - /** - * @brief Tries to auth the user from the cookie or session - * - * @todo Should be moved to Friendica\Core\Session when it's created - */ - public static function sessionAuth() - { - $a = self::getApp(); - - // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. - if (isset($_COOKIE["Friendica"])) { - $data = json_decode($_COOKIE["Friendica"]); - if (isset($data->uid)) { - - $user = DBA::selectFirst( - 'user', - [], - [ - 'uid' => $data->uid, - 'blocked' => false, - 'account_expired' => false, - 'account_removed' => false, - 'verified' => true, - ] - ); - if (DBA::isResult($user)) { - if (!hash_equals( - Authentication::getCookieHashForUser($user), - $data->hash - )) { - Logger::log("Hash for user " . $data->uid . " doesn't fit."); - Authentication::deleteSession(); - $a->internalRedirect(); - } - - // Renew the cookie - // Expires after 7 days by default, - // can be set via system.auth_cookie_lifetime - $authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7); - Authentication::setCookie($authcookiedays * 24 * 60 * 60, $user); - - // Do the authentification if not done by now - if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) { - Session::setAuthenticatedForUser($a, $user); - - if (Config::get('system', 'paranoia')) { - $_SESSION['addr'] = $data->ip; - } - } - } - } - } - - if (!empty($_SESSION['authenticated'])) { - if (!empty($_SESSION['visitor_id']) && empty($_SESSION['uid'])) { - $contact = DBA::selectFirst('contact', [], ['id' => $_SESSION['visitor_id']]); - if (DBA::isResult($contact)) { - self::getApp()->contact = $contact; - } - } - - if (!empty($_SESSION['uid'])) { - // already logged in user returning - $check = Config::get('system', 'paranoia'); - // extra paranoia - if the IP changed, log them out - if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) { - Logger::log('Session address changed. Paranoid setting in effect, blocking session. ' . - $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']); - Authentication::deleteSession(); - $a->internalRedirect(); - } - - $user = DBA::selectFirst( - 'user', - [], - [ - 'uid' => $_SESSION['uid'], - 'blocked' => false, - 'account_expired' => false, - 'account_removed' => false, - 'verified' => true, - ] - ); - if (!DBA::isResult($user)) { - Authentication::deleteSession(); - $a->internalRedirect(); - } - - // Make sure to refresh the last login time for the user if the user - // stays logged in for a long time, e.g. with "Remember Me" - $login_refresh = false; - if (empty($_SESSION['last_login_date'])) { - $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); - } - if (strcmp(DateTimeFormat::utc('now - 12 hours'), $_SESSION['last_login_date']) > 0) { - $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); - $login_refresh = true; - } - - Session::setAuthenticatedForUser($a, $user, false, false, $login_refresh); - } - } - } - /** * @brief Wrapper for adding a login box. * From 96555a7385a73c3830a6c1715e19da5ffd509835 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 3 Dec 2019 22:29:37 +0100 Subject: [PATCH 03/21] Refactor "Authentication" class with four main methods: - withSession() - for auto authentication with Session/Cookie variables - withOpenId() - for authentication with an OpenID account - withPassword() - for authentication with Password - setForUser() - for setting the user auth context of the current session Refactor "Session" class - contains now "native" Session Management methods --- include/api.php | 5 +- index.php | 3 +- mod/dfrn_poll.php | 5 +- mod/openid.php | 6 +- src/App.php | 6 +- src/Core/Authentication.php | 438 ++++++++++++++++++------------ src/Core/Session.php | 183 +++++-------- src/Module/Delegation.php | 5 +- src/Module/Login.php | 18 +- src/Module/Logout.php | 3 +- src/Module/TwoFactor/Recovery.php | 5 +- src/Module/TwoFactor/Verify.php | 5 +- src/Network/FKOAuth1.php | 5 +- 13 files changed, 386 insertions(+), 301 deletions(-) diff --git a/include/api.php b/include/api.php index 681515cc3..f4b95733e 100644 --- a/include/api.php +++ b/include/api.php @@ -12,6 +12,7 @@ use Friendica\Content\ContactSelector; use Friendica\Content\Feature; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; +use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; @@ -253,7 +254,9 @@ function api_login(App $a) throw new UnauthorizedException("This API requires login"); } - Session::setAuthenticatedForUser($a, $record); + /** @var Authentication $authentication */ + $authentication = BaseObject::getClass(Authentication::class); + $authentication->setForUser($a, $record); $_SESSION["allow_api"] = true; diff --git a/index.php b/index.php index 5407532d4..00ec0edb7 100644 --- a/index.php +++ b/index.php @@ -22,5 +22,6 @@ $a = \Friendica\BaseObject::getApp(); $a->runFrontend( $dice->create(\Friendica\App\Module::class), $dice->create(\Friendica\App\Router::class), - $dice->create(\Friendica\Core\Config\PConfiguration::class) + $dice->create(\Friendica\Core\Config\PConfiguration::class), + $dice->create(\Friendica\Core\Authentication::class) ); diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 6aef31a54..892aecacb 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -5,6 +5,7 @@ */ use Friendica\App; +use Friendica\BaseObject; use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; @@ -21,7 +22,9 @@ use Friendica\Util\XML; function dfrn_poll_init(App $a) { - Authentication::sessionAuth(); + /** @var Authentication $authentication */ + $authentication = BaseObject::getClass(Authentication::class); + $authentication->withSession($a, $_COOKIE); $dfrn_id = $_GET['dfrn_id'] ?? ''; $type = ($_GET['type'] ?? '') ?: 'data'; diff --git a/mod/openid.php b/mod/openid.php index 98748c21d..0c21f7a31 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -4,6 +4,8 @@ */ use Friendica\App; +use Friendica\BaseObject; +use Friendica\Core\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\Logger; @@ -45,7 +47,9 @@ function openid_content(App $a) { unset($_SESSION['openid']); - Session::setAuthenticatedForUser($a, $user, true, true); + /** @var Authentication $authentication */ + $authentication = BaseObject::getClass(Authentication::class); + $authentication->setForUser($a, $user, true, true); // just in case there was no return url set // and we fell through diff --git a/src/App.php b/src/App.php index 4d652496b..243f5ba07 100644 --- a/src/App.php +++ b/src/App.php @@ -13,6 +13,7 @@ use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; use Friendica\Core\L10n\L10n; +use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Core\Theme; use Friendica\Database\Database; @@ -641,10 +642,11 @@ class App * @param App\Module $module The determined module * @param App\Router $router * @param PConfiguration $pconfig + * @param Authentication $auth The Authentication backend of the node * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public function runFrontend(App\Module $module, App\Router $router, PConfiguration $pconfig) + public function runFrontend(App\Module $module, App\Router $router, PConfiguration $pconfig, Authentication $auth) { $moduleName = $module->getName(); @@ -718,7 +720,7 @@ class App Model\Profile::openWebAuthInit($token); } - Authentication::sessionAuth(); + $auth->withSession($this, $_COOKIE); if (empty($_SESSION['authenticated'])) { header('X-Account-Management-Status: none'); diff --git a/src/Core/Authentication.php b/src/Core/Authentication.php index 6ea727871..39de73ce0 100644 --- a/src/Core/Authentication.php +++ b/src/Core/Authentication.php @@ -6,77 +6,213 @@ namespace Friendica\Core; +use Exception; use Friendica\App; -use Friendica\BaseObject; +use Friendica\Core\Config\Configuration; +use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Model\User; -use Friendica\Network\HTTPException\ForbiddenException; +use Friendica\Network\HTTPException; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; use Friendica\Util\Strings; +use LightOpenID; +use Friendica\Core\L10n\L10n; +use Psr\Log\LoggerInterface; /** * Handle Authentification, Session and Cookies */ -class Authentication extends BaseObject +class Authentication { + /** @var Configuration */ + private $config; + /** @var App\BaseURL */ + private $baseUrl; + /** @var L10n */ + private $l10n; + /** @var Database */ + private $dba; + /** @var LoggerInterface */ + private $logger; + + /** + * Authentication constructor. + * + * @param Configuration $config + * @param App\BaseURL $baseUrl + * @param L10n $l10n + * @param Database $dba + * @param LoggerInterface $logger + */ + public function __construct(Configuration $config, App\BaseURL $baseUrl, L10n $l10n, Database $dba, LoggerInterface $logger) + { + $this->config = $config; + $this->baseUrl = $baseUrl; + $this->l10n = $l10n; + $this->dba = $dba; + $this->logger = $logger; + } + + /** + * @brief Tries to auth the user from the cookie or session + * + * @param App $a The Friendica Application context + * @param array $cookie The $_COOKIE array + * + * @throws HttpException\InternalServerErrorException In case of Friendica internal exceptions + * @throws Exception In case of general exceptions (like SQL Grammar) + */ + public function withSession(App $a, array $cookie) + { + // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. + if (isset($cookie["Friendica"])) { + $data = json_decode($cookie["Friendica"]); + if (isset($data->uid)) { + + $user = $this->dba->selectFirst( + 'user', + [], + [ + 'uid' => $data->uid, + 'blocked' => false, + 'account_expired' => false, + 'account_removed' => false, + 'verified' => true, + ] + ); + if (DBA::isResult($user)) { + if (!Session::checkCookie($data->hash, $user)) { + $this->logger->notice("Hash doesn't fit.", ['user' => $data->uid]); + Session::delete(); + $this->baseUrl->redirect(); + } + + // Renew the cookie + // Expires after 7 days by default, + // can be set via system.auth_cookie_lifetime + $authcookiedays = $this->config->get('system', 'auth_cookie_lifetime', 7); + Session::setCookie($authcookiedays * 24 * 60 * 60, $user); + + // Do the authentification if not done by now + if (!Session::get('authenticated')) { + $this->setForUser($a, $user); + + if ($this->config->get('system', 'paranoia')) { + Session::set('addr', $data->ip); + } + } + } + } + } + + if (Session::get('authenticated')) { + if (Session::get('visitor_id') && !Session::get('uid')) { + $contact = $this->dba->selectFirst('contact', [], ['id' => Session::get('visitor_id')]); + if ($this->dba->isResult($contact)) { + $a->contact = $contact; + } + } + + if (Session::get('uid')) { + // already logged in user returning + $check = $this->config->get('system', 'paranoia'); + // extra paranoia - if the IP changed, log them out + if ($check && (Session::get('addr') != $_SERVER['REMOTE_ADDR'])) { + $this->logger->notice('Session address changed. Paranoid setting in effect, blocking session. ', [ + 'addr' => Session::get('addr'), + 'remote_addr' => $_SERVER['REMOTE_ADDR']] + ); + Session::delete(); + $this->baseUrl->redirect(); + } + + $user = $this->dba->selectFirst( + 'user', + [], + [ + 'uid' => Session::get('uid'), + 'blocked' => false, + 'account_expired' => false, + 'account_removed' => false, + 'verified' => true, + ] + ); + if (!$this->dba->isResult($user)) { + Session::delete(); + $this->baseUrl->redirect(); + } + + // Make sure to refresh the last login time for the user if the user + // stays logged in for a long time, e.g. with "Remember Me" + $login_refresh = false; + if (!Session::get('last_login_date')) { + Session::set('last_login_date', DateTimeFormat::utcNow()); + } + if (strcmp(DateTimeFormat::utc('now - 12 hours'), Session::get('last_login_date')) > 0) { + Session::set('last_login_date', DateTimeFormat::utcNow()); + $login_refresh = true; + } + + $this->setForUser($a, $user, false, false, $login_refresh); + } + } + } + /** * Attempts to authenticate using OpenId * * @param string $openid_url OpenID URL string * @param bool $remember Whether to set the session remember flag - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * + * @throws HttpException\InternalServerErrorException In case of Friendica internal exceptions */ - public static function openIdAuthentication($openid_url, $remember) + public function withOpenId(string $openid_url, bool $remember) { - $noid = Config::get('system', 'no_openid'); - - $a = self::getApp(); + $noid = $this->config->get('system', 'no_openid'); // if it's an email address or doesn't resolve to a URL, fail. if ($noid || strpos($openid_url, '@') || !Network::isUrlValid($openid_url)) { - notice(L10n::t('Login failed.') . EOL); - $a->internalRedirect(); - // NOTREACHED + notice($this->l10n->t('Login failed.') . EOL); + $this->baseUrl->redirect(); } // Otherwise it's probably an openid. try { - $openid = new LightOpenID($a->getHostName()); + $openid = new LightOpenID($this->baseUrl->getHostname()); $openid->identity = $openid_url; Session::set('openid', $openid_url); Session::set('remember', $remember); - $openid->returnUrl = $a->getBaseURL(true) . '/openid'; - $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; + $openid->returnUrl = $this->baseUrl->get(true) . '/openid'; + $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; System::externalRedirect($openid->authUrl()); } catch (Exception $e) { - notice(L10n::t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '

' . L10n::t('The error message was:') . ' ' . $e->getMessage()); + notice($this->l10n->t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.') . '

' . $this->l10n->t('The error message was:') . ' ' . $e->getMessage()); } } /** * Attempts to authenticate using login/password * - * @param string $username User name - * @param string $password Clear password - * @param bool $remember Whether to set the session remember flag - * @param string $openid_identity OpenID identity - * @param string $openid_server OpenID URL - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @param App $a The Friendica Application context + * @param string $username User name + * @param string $password Clear password + * @param bool $remember Whether to set the session remember flag + * + * @throws HttpException\InternalServerErrorException In case of Friendica internal exceptions + * @throws Exception A general Exception (like SQL Grammar exceptions) */ - public static function passwordAuthentication($username, $password, $remember, $openid_identity, $openid_server) + public function withPassword(App $a, string $username, string $password, bool $remember) { $record = null; $addon_auth = [ - 'username' => $username, - 'password' => $password, + 'username' => $username, + 'password' => $password, 'authenticated' => 0, - 'user_record' => null + 'user_record' => null ]; - $a = self::getApp(); - /* * An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record * Addons should never set 'authenticated' except to indicate success - as hooks may be chained @@ -89,199 +225,159 @@ class Authentication extends BaseObject $record = $addon_auth['user_record']; if (empty($record)) { - throw new Exception(L10n::t('Login failed.')); + throw new Exception($this->l10n->t('Login failed.')); } } else { - $record = DBA::selectFirst( + $record = $this->dba->selectFirst( 'user', [], ['uid' => User::getIdFromPasswordAuthentication($username, $password)] ); } } catch (Exception $e) { - Logger::warning('authenticate: failed login attempt', ['action' => 'login', 'username' => Strings::escapeTags($username), 'ip' => $_SERVER['REMOTE_ADDR']]); - info('Login failed. Please check your credentials.' . EOL); - $a->internalRedirect(); + $this->logger->warning('authenticate: failed login attempt', ['action' => 'login', 'username' => Strings::escapeTags($username), 'ip' => $_SERVER['REMOTE_ADDR']]); + info($this->l10n->t('Login failed. Please check your credentials.' . EOL)); + $this->baseUrl->redirect(); } if (!$remember) { - Authentication::setCookie(0); // 0 means delete on browser exit + Session::setCookie(0); // 0 means delete on browser exit } // if we haven't failed up this point, log them in. Session::set('remember', $remember); Session::set('last_login_date', DateTimeFormat::utcNow()); + $openid_identity = Session::get('openid_identity'); + $openid_server = Session::get('openid_server'); + if (!empty($openid_identity) || !empty($openid_server)) { - DBA::update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); + $this->dba->update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); } - Session::setAuthenticatedForUser($a, $record, true, true); + $this->setForUser($a, $record, true, true); $return_path = Session::get('return_path', ''); Session::remove('return_path'); - $a->internalRedirect($return_path); + $this->baseUrl->redirect($return_path); } /** - * @brief Tries to auth the user from the cookie or session + * @brief Sets the provided user's authenticated session * - * @todo Should be moved to Friendica\Core\Session when it's created + * @param App $a The Friendica application context + * @param array $user_record The current "user" record + * @param bool $login_initial + * @param bool $interactive + * @param bool $login_refresh + * + * @throws HTTPException\InternalServerErrorException In case of Friendica specific exceptions + * @throws Exception In case of general Exceptions (like SQL Grammar exceptions) */ - public static function sessionAuth() + public function setForUser(App $a, array $user_record, bool $login_initial = false, bool $interactive = false, bool $login_refresh = false) { - $a = self::getApp(); + Session::setMultiple([ + 'uid' => $user_record['uid'], + 'theme' => $user_record['theme'], + 'mobile-theme' => PConfig::get($user_record['uid'], 'system', 'mobile_theme'), + 'authenticated' => 1, + 'page_flags' => $user_record['page-flags'], + 'my_url' => $this->baseUrl->get() . '/profile/' . $user_record['nickname'], + 'my_address' => $user_record['nickname'] . '@' . substr($this->baseUrl->get(), strpos($this->baseUrl->get(), '://') + 3), + 'addr' => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0' + ]); - // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. - if (isset($_COOKIE["Friendica"])) { - $data = json_decode($_COOKIE["Friendica"]); - if (isset($data->uid)) { + Session::setVisitorsContacts(); - $user = DBA::selectFirst( - 'user', - [], - [ - 'uid' => $data->uid, - 'blocked' => false, - 'account_expired' => false, - 'account_removed' => false, - 'verified' => true, - ] - ); - if (DBA::isResult($user)) { - if (!hash_equals( - Authentication::getCookieHashForUser($user), - $data->hash - )) { - Logger::log("Hash for user " . $data->uid . " doesn't fit."); - Authentication::deleteSession(); - $a->internalRedirect(); - } + $member_since = strtotime($user_record['register_date']); + Session::set('new_member', time() < ($member_since + (60 * 60 * 24 * 14))); - // Renew the cookie - // Expires after 7 days by default, - // can be set via system.auth_cookie_lifetime - $authcookiedays = Config::get('system', 'auth_cookie_lifetime', 7); - Authentication::setCookie($authcookiedays * 24 * 60 * 60, $user); + if (strlen($user_record['timezone'])) { + date_default_timezone_set($user_record['timezone']); + $a->timezone = $user_record['timezone']; + } - // Do the authentification if not done by now - if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) { - Session::setAuthenticatedForUser($a, $user); + $masterUid = $user_record['uid']; - if (Config::get('system', 'paranoia')) { - $_SESSION['addr'] = $data->ip; - } - } - } + if (Session::get('submanage')) { + $user = $this->dba->selectFirst('user', ['uid'], ['uid' => Session::get('submanage')]); + if ($this->dba->isResult($user)) { + $masterUid = $user['uid']; } } - if (!empty($_SESSION['authenticated'])) { - if (!empty($_SESSION['visitor_id']) && empty($_SESSION['uid'])) { - $contact = DBA::selectFirst('contact', [], ['id' => $_SESSION['visitor_id']]); - if (DBA::isResult($contact)) { - self::getApp()->contact = $contact; - } + $a->identities = User::identities($masterUid); + + if ($login_initial) { + $this->logger->info('auth_identities: ' . print_r($a->identities, true)); + } + + if ($login_refresh) { + $this->logger->info('auth_identities refresh: ' . print_r($a->identities, true)); + } + + $contact = $this->dba->selectFirst('contact', [], ['uid' => $user_record['uid'], 'self' => true]); + if ($this->dba->isResult($contact)) { + $a->contact = $contact; + $a->cid = $contact['id']; + Session::set('cid', $a->cid); + } + + header('X-Account-Management-Status: active; name="' . $user_record['username'] . '"; id="' . $user_record['nickname'] . '"'); + + if ($login_initial || $login_refresh) { + $this->dba->update('user', ['login_date' => DateTimeFormat::utcNow()], ['uid' => $user_record['uid']]); + + // Set the login date for all identities of the user + $this->dba->update('user', ['login_date' => DateTimeFormat::utcNow()], + ['parent-uid' => $masterUid, 'account_removed' => false]); + } + + if ($login_initial) { + /* + * If the user specified to remember the authentication, then set a cookie + * that expires after one week (the default is when the browser is closed). + * The cookie will be renewed automatically. + * The week ensures that sessions will expire after some inactivity. + */; + if (Session::get('remember')) { + $a->getLogger()->info('Injecting cookie for remembered user ' . $user_record['nickname']); + Session::setCookie(604800, $user_record); + Session::remove('remember'); } + } - if (!empty($_SESSION['uid'])) { - // already logged in user returning - $check = Config::get('system', 'paranoia'); - // extra paranoia - if the IP changed, log them out - if ($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) { - Logger::log('Session address changed. Paranoid setting in effect, blocking session. ' . - $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']); - Authentication::deleteSession(); - $a->internalRedirect(); - } + $this->twoFactorCheck($user_record['uid'], $a); - $user = DBA::selectFirst( - 'user', - [], - [ - 'uid' => $_SESSION['uid'], - 'blocked' => false, - 'account_expired' => false, - 'account_removed' => false, - 'verified' => true, - ] - ); - if (!DBA::isResult($user)) { - Authentication::deleteSession(); - $a->internalRedirect(); - } + if ($interactive) { + if ($user_record['login_date'] <= DBA::NULL_DATETIME) { + info($this->l10n->t('Welcome %s', $user_record['username'])); + info($this->l10n->t('Please upload a profile photo.')); + $this->baseUrl->redirect('profile_photo/new'); + } else { + info($this->l10n->t("Welcome back %s", $user_record['username'])); + } + } - // Make sure to refresh the last login time for the user if the user - // stays logged in for a long time, e.g. with "Remember Me" - $login_refresh = false; - if (empty($_SESSION['last_login_date'])) { - $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); - } - if (strcmp(DateTimeFormat::utc('now - 12 hours'), $_SESSION['last_login_date']) > 0) { - $_SESSION['last_login_date'] = DateTimeFormat::utcNow(); - $login_refresh = true; - } + $a->user = $user_record; - Session::setAuthenticatedForUser($a, $user, false, false, $login_refresh); + if ($login_initial) { + Hook::callAll('logged_in', $a->user); + + if ($a->module !== 'home' && Session::exists('return_path')) { + $this->baseUrl->redirect(Session::get('return_path')); } } } /** - * @brief Calculate the hash that is needed for the "Friendica" cookie + * @param int $uid The User Identified + * @param App $a The Friendica Application context * - * @param array $user Record from "user" table - * - * @return string Hashed data - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws HTTPException\ForbiddenException In case the two factor authentication is forbidden (e.g. for AJAX calls) */ - public static function getCookieHashForUser($user) - { - return hash_hmac( - "sha256", - hash_hmac("sha256", $user["password"], $user["prvkey"]), - Config::get("system", "site_prvkey") - ); - } - - /** - * @brief Set the "Friendica" cookie - * - * @param int $time - * @param array $user Record from "user" table - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public static function setCookie($time, $user = []) - { - if ($time != 0) { - $time = $time + time(); - } - - if ($user) { - $value = json_encode([ - "uid" => $user["uid"], - "hash" => self::getCookieHashForUser($user), - "ip" => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0' - ]); - } else { - $value = ""; - } - - setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true); - } - - /** - * @brief Kills the "Friendica" cookie and all session data - */ - public static function deleteSession() - { - self::setCookie(-3600); // make sure cookie is deleted on browser close, as a security measure - session_unset(); - session_destroy(); - } - - public static function twoFactorCheck($uid, App $a) + private function twoFactorCheck(int $uid, App $a) { // Check user setting, if 2FA disabled return if (!PConfig::get($uid, '2fa', 'verified')) { @@ -300,7 +396,7 @@ class Authentication extends BaseObject // Case 2: No valid 2FA session: redirect to code verification page if ($a->isAjax()) { - throw new ForbiddenException(); + throw new HTTPException\ForbiddenException(); } else { $a->internalRedirect('2fa'); } diff --git a/src/Core/Session.php b/src/Core/Session.php index aaead868a..02e10482d 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -10,8 +10,6 @@ use Friendica\Core\Session\CacheSessionHandler; use Friendica\Core\Session\DatabaseSessionHandler; use Friendica\Database\DBA; use Friendica\Model\Contact; -use Friendica\Model\User; -use Friendica\Util\DateTimeFormat; use Friendica\Util\Strings; /** @@ -104,117 +102,11 @@ class Session */ public static function clear() { + session_unset(); + session_start(); $_SESSION = []; } - /** - * @brief Sets the provided user's authenticated session - * - * @param App $a - * @param array $user_record - * @param bool $login_initial - * @param bool $interactive - * @param bool $login_refresh - * @throws \Friendica\Network\HTTPException\ForbiddenException - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public static function setAuthenticatedForUser(App $a, array $user_record, $login_initial = false, $interactive = false, $login_refresh = false) - { - self::setMultiple([ - 'uid' => $user_record['uid'], - 'theme' => $user_record['theme'], - 'mobile-theme' => PConfig::get($user_record['uid'], 'system', 'mobile_theme'), - 'authenticated' => 1, - 'page_flags' => $user_record['page-flags'], - 'my_url' => $a->getBaseURL() . '/profile/' . $user_record['nickname'], - 'my_address' => $user_record['nickname'] . '@' . substr($a->getBaseURL(), strpos($a->getBaseURL(), '://') + 3), - 'addr' => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0' - ]); - - self::setVisitorsContacts(); - - $member_since = strtotime($user_record['register_date']); - self::set('new_member', time() < ($member_since + ( 60 * 60 * 24 * 14))); - - if (strlen($user_record['timezone'])) { - date_default_timezone_set($user_record['timezone']); - $a->timezone = $user_record['timezone']; - } - - $masterUid = $user_record['uid']; - - if (self::get('submanage')) { - $user = DBA::selectFirst('user', ['uid'], ['uid' => self::get('submanage')]); - if (DBA::isResult($user)) { - $masterUid = $user['uid']; - } - } - - $a->identities = User::identities($masterUid); - - if ($login_initial) { - $a->getLogger()->info('auth_identities: ' . print_r($a->identities, true)); - } - - if ($login_refresh) { - $a->getLogger()->info('auth_identities refresh: ' . print_r($a->identities, true)); - } - - $contact = DBA::selectFirst('contact', [], ['uid' => $user_record['uid'], 'self' => true]); - if (DBA::isResult($contact)) { - $a->contact = $contact; - $a->cid = $contact['id']; - self::set('cid', $a->cid); - } - - header('X-Account-Management-Status: active; name="' . $user_record['username'] . '"; id="' . $user_record['nickname'] . '"'); - - if ($login_initial || $login_refresh) { - DBA::update('user', ['login_date' => DateTimeFormat::utcNow()], ['uid' => $user_record['uid']]); - - // Set the login date for all identities of the user - DBA::update('user', ['login_date' => DateTimeFormat::utcNow()], - ['parent-uid' => $masterUid, 'account_removed' => false]); - } - - if ($login_initial) { - /* - * If the user specified to remember the authentication, then set a cookie - * that expires after one week (the default is when the browser is closed). - * The cookie will be renewed automatically. - * The week ensures that sessions will expire after some inactivity. - */ - ; - if (self::get('remember')) { - $a->getLogger()->info('Injecting cookie for remembered user ' . $user_record['nickname']); - Authentication::setCookie(604800, $user_record); - self::remove('remember'); - } - } - - Authentication::twoFactorCheck($user_record['uid'], $a); - - if ($interactive) { - if ($user_record['login_date'] <= DBA::NULL_DATETIME) { - info(L10n::t('Welcome %s', $user_record['username'])); - info(L10n::t('Please upload a profile photo.')); - $a->internalRedirect('profile_photo/new'); - } else { - info(L10n::t("Welcome back %s", $user_record['username'])); - } - } - - $a->user = $user_record; - - if ($login_initial) { - Hook::callAll('logged_in', $a->user); - - if ($a->module !== 'home' && self::exists('return_path')) { - $a->internalRedirect(self::get('return_path')); - } - } - } - /** * Returns contact ID for given user ID * @@ -278,4 +170,75 @@ class Session return $_SESSION['authenticated']; } + + /** + * @brief Calculate the hash that is needed for the "Friendica" cookie + * + * @param array $user Record from "user" table + * + * @return string Hashed data + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + private static function getCookieHashForUser($user) + { + return hash_hmac( + "sha256", + hash_hmac("sha256", $user["password"], $user["prvkey"]), + Config::get("system", "site_prvkey") + ); + } + + /** + * @brief Set the "Friendica" cookie + * + * @param int $time + * @param array $user Record from "user" table + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function setCookie($time, $user = []) + { + if ($time != 0) { + $time = $time + time(); + } + + if ($user) { + $value = json_encode([ + "uid" => $user["uid"], + "hash" => self::getCookieHashForUser($user), + "ip" => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0' + ]); + } else { + $value = ""; + } + + setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true); + } + + /** + * @brief Checks if the "Friendica" cookie is set + * + * @param string $hash + * @param array $user Record from "user" table + * + * @return boolean True, if the cookie is set + * + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function checkCookie(string $hash, array $user) + { + return hash_equals( + self::getCookieHashForUser($user), + $hash + ); + } + + /** + * @brief Kills the "Friendica" cookie and all session data + */ + public static function delete() + { + self::setCookie(-3600); // make sure cookie is deleted on browser close, as a security measure + session_unset(); + session_destroy(); + } } diff --git a/src/Module/Delegation.php b/src/Module/Delegation.php index d2930317c..2e3a5cafe 100644 --- a/src/Module/Delegation.php +++ b/src/Module/Delegation.php @@ -3,6 +3,7 @@ namespace Friendica\Module; use Friendica\BaseModule; +use Friendica\Core\Authentication; use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Renderer; @@ -79,7 +80,9 @@ class Delegation extends BaseModule Session::clear(); - Session::setAuthenticatedForUser(self::getApp(), $user, true, true); + /** @var Authentication $authentication */ + $authentication = self::getClass(Authentication::class); + $authentication->setForUser(self::getApp(), $user, true, true); if ($limited_id) { Session::set('submanage', $original_id); diff --git a/src/Module/Login.php b/src/Module/Login.php index f43bd221e..8ecf3e40c 100644 --- a/src/Module/Login.php +++ b/src/Module/Login.php @@ -35,11 +35,8 @@ class Login extends BaseModule public static function post(array $parameters = []) { - $openid_identity = Session::get('openid_identity'); - $openid_server = Session::get('openid_server'); - $return_path = Session::get('return_path'); - session_unset(); + Session::clear(); Session::set('return_path', $return_path); // OpenId Login @@ -50,16 +47,19 @@ class Login extends BaseModule ) { $openid_url = trim(($_POST['openid_url'] ?? '') ?: $_POST['username']); - Authentication::openIdAuthentication($openid_url, !empty($_POST['remember'])); + /** @var Authentication $authentication */ + $authentication = self::getClass(Authentication::class); + $authentication->withOpenId($openid_url, !empty($_POST['remember'])); } if (!empty($_POST['auth-params']) && $_POST['auth-params'] === 'login') { - Authentication::passwordAuthentication( + /** @var Authentication $authentication */ + $authentication = self::getClass(Authentication::class); + $authentication->withPassword( + self::getApp(), trim($_POST['username']), trim($_POST['password']), - !empty($_POST['remember']), - $openid_identity, - $openid_server + !empty($_POST['remember']) ); } } diff --git a/src/Module/Logout.php b/src/Module/Logout.php index 49ede01a3..877a8cda0 100644 --- a/src/Module/Logout.php +++ b/src/Module/Logout.php @@ -10,6 +10,7 @@ use Friendica\Core\Authentication; use Friendica\Core\Cache; use Friendica\Core\Hook; use Friendica\Core\L10n; +use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Model\Profile; @@ -32,7 +33,7 @@ class Logout extends BaseModule } Hook::callAll("logging_out"); - Authentication::deleteSession(); + Session::delete(); if ($visitor_home) { System::externalRedirect($visitor_home); diff --git a/src/Module/TwoFactor/Recovery.php b/src/Module/TwoFactor/Recovery.php index bd8783646..f1454469f 100644 --- a/src/Module/TwoFactor/Recovery.php +++ b/src/Module/TwoFactor/Recovery.php @@ -3,6 +3,7 @@ namespace Friendica\Module\TwoFactor; use Friendica\BaseModule; +use Friendica\Core\Authentication; use Friendica\Core\L10n; use Friendica\Core\Renderer; use Friendica\Core\Session; @@ -41,7 +42,9 @@ class Recovery extends BaseModule notice(L10n::t('Remaining recovery codes: %d', RecoveryCode::countValidForUser(local_user()))); // Resume normal login workflow - Session::setAuthenticatedForUser($a, $a->user, true, true); + /** @var Authentication $authentication */ + $authentication = self::getClass(Authentication::class); + $authentication->setForUser($a, $a->user, true, true); } else { notice(L10n::t('Invalid code, please retry.')); } diff --git a/src/Module/TwoFactor/Verify.php b/src/Module/TwoFactor/Verify.php index 27001683e..e4a0b2ff1 100644 --- a/src/Module/TwoFactor/Verify.php +++ b/src/Module/TwoFactor/Verify.php @@ -3,6 +3,7 @@ namespace Friendica\Module\TwoFactor; use Friendica\BaseModule; +use Friendica\Core\Authentication; use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\Renderer; @@ -38,7 +39,9 @@ class Verify extends BaseModule Session::set('2fa', $code); // Resume normal login workflow - Session::setAuthenticatedForUser($a, $a->user, true, true); + /** @var Authentication $authentication */ + $authentication = self::getClass(Authentication::class); + $authentication->setForUser($a, $a->user, true, true); } else { self::$errors[] = L10n::t('Invalid code, please retry.'); } diff --git a/src/Network/FKOAuth1.php b/src/Network/FKOAuth1.php index eb1329057..81c0c1b29 100644 --- a/src/Network/FKOAuth1.php +++ b/src/Network/FKOAuth1.php @@ -5,6 +5,7 @@ namespace Friendica\Network; use Friendica\BaseObject; +use Friendica\Core\Authentication; use Friendica\Core\Logger; use Friendica\Core\Session; use Friendica\Database\DBA; @@ -45,6 +46,8 @@ class FKOAuth1 extends OAuthServer die('This api requires login'); } - Session::setAuthenticatedForUser($a, $record, true); + /** @var Authentication $authentication */ + $authentication = BaseObject::getClass(Authentication::class); + $authentication->setForUser($a, $record, true); } } From afb93ab0fecac0b9b1fbaedeac0e01f4600988b2 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Thu, 5 Dec 2019 23:19:27 +0100 Subject: [PATCH 04/21] move Hook doc --- doc/Addons.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Addons.md b/doc/Addons.md index fb9956089..06b05bdff 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -716,7 +716,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep- ### src/Module/Login.php - Hook::callAll('authenticate', $addon_auth); Hook::callAll('login_hook', $o); ### src/Module/Logout.php @@ -740,6 +739,7 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep- ### src/Core/Authentication.php Hook::callAll('logged_in', $a->user); + Hook::callAll('authenticate', $addon_auth); ### src/Core/Hook.php From c45b6d309be4dc13aeb8a4ec0aea7c2db907e076 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Thu, 5 Dec 2019 23:29:18 +0100 Subject: [PATCH 05/21] regenerate messages.po --- view/lang/C/messages.po | 14602 +++++++++++++++++++------------------- 1 file changed, 7327 insertions(+), 7275 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 3894baee4..24f3fc1c3 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: \n" +"Project-Id-Version: 2019.12-dev\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-11-04 10:26+0100\n" +"POT-Creation-Date: 2019-12-05 23:28+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,517 +18,34 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" -#: include/api.php:1121 +#: include/api.php:1124 #, php-format msgid "Daily posting limit of %d post reached. The post was rejected." msgid_plural "Daily posting limit of %d posts reached. The post was rejected." msgstr[0] "" msgstr[1] "" -#: include/api.php:1135 +#: include/api.php:1138 #, php-format msgid "Weekly posting limit of %d post reached. The post was rejected." msgid_plural "Weekly posting limit of %d posts reached. The post was rejected." msgstr[0] "" msgstr[1] "" -#: include/api.php:1149 +#: include/api.php:1152 #, php-format msgid "Monthly posting limit of %d post reached. The post was rejected." msgstr "" -#: include/api.php:4566 mod/profile_photo.php:85 mod/profile_photo.php:94 +#: include/api.php:4576 src/Model/User.php:841 src/Model/User.php:849 +#: src/Model/User.php:857 mod/profile_photo.php:85 mod/profile_photo.php:94 #: mod/profile_photo.php:103 mod/profile_photo.php:210 #: mod/profile_photo.php:298 mod/profile_photo.php:308 mod/photos.php:90 #: mod/photos.php:181 mod/photos.php:628 mod/photos.php:1055 -#: mod/photos.php:1072 mod/photos.php:1580 src/Model/User.php:841 -#: src/Model/User.php:849 src/Model/User.php:857 +#: mod/photos.php:1072 mod/photos.php:1580 msgid "Profile Photos" msgstr "" -#: include/conversation.php:167 include/conversation.php:304 -#: src/Model/Item.php:3322 -msgid "event" -msgstr "" - -#: include/conversation.php:170 include/conversation.php:180 -#: include/conversation.php:307 include/conversation.php:316 -#: mod/subthread.php:91 mod/tagger.php:72 -msgid "status" -msgstr "" - -#: include/conversation.php:175 include/conversation.php:312 -#: mod/subthread.php:91 mod/tagger.php:72 src/Model/Item.php:3324 -msgid "photo" -msgstr "" - -#: include/conversation.php:188 -#, php-format -msgid "%1$s likes %2$s's %3$s" -msgstr "" - -#: include/conversation.php:190 -#, php-format -msgid "%1$s doesn't like %2$s's %3$s" -msgstr "" - -#: include/conversation.php:192 -#, php-format -msgid "%1$s attends %2$s's %3$s" -msgstr "" - -#: include/conversation.php:194 -#, php-format -msgid "%1$s doesn't attend %2$s's %3$s" -msgstr "" - -#: include/conversation.php:196 -#, php-format -msgid "%1$s attends maybe %2$s's %3$s" -msgstr "" - -#: include/conversation.php:231 -#, php-format -msgid "%1$s is now friends with %2$s" -msgstr "" - -#: include/conversation.php:272 -#, php-format -msgid "%1$s poked %2$s" -msgstr "" - -#: include/conversation.php:326 mod/tagger.php:105 -#, php-format -msgid "%1$s tagged %2$s's %3$s with %4$s" -msgstr "" - -#: include/conversation.php:348 -msgid "post/item" -msgstr "" - -#: include/conversation.php:349 -#, php-format -msgid "%1$s marked %2$s's %3$s as favorite" -msgstr "" - -#: include/conversation.php:574 mod/photos.php:1407 mod/profiles.php:352 -msgid "Likes" -msgstr "" - -#: include/conversation.php:575 mod/photos.php:1407 mod/profiles.php:355 -msgid "Dislikes" -msgstr "" - -#: include/conversation.php:576 include/conversation.php:1577 -#: mod/photos.php:1408 -msgid "Attending" -msgid_plural "Attending" -msgstr[0] "" -msgstr[1] "" - -#: include/conversation.php:577 mod/photos.php:1408 -msgid "Not attending" -msgstr "" - -#: include/conversation.php:578 mod/photos.php:1408 -msgid "Might attend" -msgstr "" - -#: include/conversation.php:579 -msgid "Reshares" -msgstr "" - -#: include/conversation.php:659 mod/photos.php:1469 src/Object/Post.php:206 -msgid "Select" -msgstr "" - -#: include/conversation.php:660 mod/photos.php:1470 mod/settings.php:730 -#: src/Module/Admin/Users.php:288 src/Module/Contact.php:826 -#: src/Module/Contact.php:1107 -msgid "Delete" -msgstr "" - -#: include/conversation.php:689 src/Object/Post.php:383 src/Object/Post.php:384 -#, php-format -msgid "View %s's profile @ %s" -msgstr "" - -#: include/conversation.php:702 src/Object/Post.php:371 -msgid "Categories:" -msgstr "" - -#: include/conversation.php:703 src/Object/Post.php:372 -msgid "Filed under:" -msgstr "" - -#: include/conversation.php:710 src/Object/Post.php:397 -#, php-format -msgid "%s from %s" -msgstr "" - -#: include/conversation.php:725 -msgid "View in context" -msgstr "" - -#: include/conversation.php:727 include/conversation.php:1243 -#: mod/editpost.php:87 mod/message.php:260 mod/message.php:442 -#: mod/photos.php:1380 mod/wallmessage.php:141 src/Module/Item/Compose.php:197 -#: src/Object/Post.php:424 -msgid "Please wait" -msgstr "" - -#: include/conversation.php:791 -msgid "remove" -msgstr "" - -#: include/conversation.php:795 -msgid "Delete Selected Items" -msgstr "" - -#: include/conversation.php:950 view/theme/frio/theme.php:363 -msgid "Follow Thread" -msgstr "" - -#: include/conversation.php:951 src/Model/Contact.php:1255 -msgid "View Status" -msgstr "" - -#: include/conversation.php:952 include/conversation.php:970 mod/suggest.php:87 -#: mod/match.php:87 src/Model/Contact.php:1185 src/Model/Contact.php:1247 -#: src/Model/Contact.php:1256 src/Module/AllFriends.php:74 -#: src/Module/BaseSearchModule.php:137 src/Module/Directory.php:148 -msgid "View Profile" -msgstr "" - -#: include/conversation.php:953 src/Model/Contact.php:1257 -msgid "View Photos" -msgstr "" - -#: include/conversation.php:954 src/Model/Contact.php:1248 -#: src/Model/Contact.php:1258 -msgid "Network Posts" -msgstr "" - -#: include/conversation.php:955 src/Model/Contact.php:1249 -#: src/Model/Contact.php:1259 -msgid "View Contact" -msgstr "" - -#: include/conversation.php:956 src/Model/Contact.php:1261 -msgid "Send PM" -msgstr "" - -#: include/conversation.php:957 src/Module/Admin/Blocklist/Contact.php:67 -#: src/Module/Admin/Users.php:289 src/Module/Contact.php:606 -#: src/Module/Contact.php:823 src/Module/Contact.php:1082 -msgid "Block" -msgstr "" - -#: include/conversation.php:958 mod/notifications.php:66 -#: mod/notifications.php:201 mod/notifications.php:294 -#: src/Module/Contact.php:607 src/Module/Contact.php:824 -#: src/Module/Contact.php:1090 -msgid "Ignore" -msgstr "" - -#: include/conversation.php:962 src/Model/Contact.php:1262 -msgid "Poke" -msgstr "" - -#: include/conversation.php:967 mod/suggest.php:88 mod/follow.php:160 -#: mod/match.php:88 view/theme/vier/theme.php:178 src/Content/Widget.php:67 -#: src/Model/Contact.php:1250 src/Model/Contact.php:1263 -#: src/Module/AllFriends.php:75 src/Module/BaseSearchModule.php:138 -msgid "Connect/Follow" -msgstr "" - -#: include/conversation.php:1095 -#, php-format -msgid "%s likes this." -msgstr "" - -#: include/conversation.php:1098 -#, php-format -msgid "%s doesn't like this." -msgstr "" - -#: include/conversation.php:1101 -#, php-format -msgid "%s attends." -msgstr "" - -#: include/conversation.php:1104 -#, php-format -msgid "%s doesn't attend." -msgstr "" - -#: include/conversation.php:1107 -#, php-format -msgid "%s attends maybe." -msgstr "" - -#: include/conversation.php:1110 include/conversation.php:1153 -#, php-format -msgid "%s reshared this." -msgstr "" - -#: include/conversation.php:1118 -msgid "and" -msgstr "" - -#: include/conversation.php:1124 -#, php-format -msgid "and %d other people" -msgstr "" - -#: include/conversation.php:1132 -#, php-format -msgid "%2$d people like this" -msgstr "" - -#: include/conversation.php:1133 -#, php-format -msgid "%s like this." -msgstr "" - -#: include/conversation.php:1136 -#, php-format -msgid "%2$d people don't like this" -msgstr "" - -#: include/conversation.php:1137 -#, php-format -msgid "%s don't like this." -msgstr "" - -#: include/conversation.php:1140 -#, php-format -msgid "%2$d people attend" -msgstr "" - -#: include/conversation.php:1141 -#, php-format -msgid "%s attend." -msgstr "" - -#: include/conversation.php:1144 -#, php-format -msgid "%2$d people don't attend" -msgstr "" - -#: include/conversation.php:1145 -#, php-format -msgid "%s don't attend." -msgstr "" - -#: include/conversation.php:1148 -#, php-format -msgid "%2$d people attend maybe" -msgstr "" - -#: include/conversation.php:1149 -#, php-format -msgid "%s attend maybe." -msgstr "" - -#: include/conversation.php:1152 -#, php-format -msgid "%2$d people reshared this" -msgstr "" - -#: include/conversation.php:1182 -msgid "Visible to everybody" -msgstr "" - -#: include/conversation.php:1183 src/Module/Item/Compose.php:191 -#: src/Object/Post.php:893 -msgid "Please enter a image/video/audio/webpage URL:" -msgstr "" - -#: include/conversation.php:1184 -msgid "Tag term:" -msgstr "" - -#: include/conversation.php:1185 src/Module/Filer/SaveTag.php:48 -msgid "Save to Folder:" -msgstr "" - -#: include/conversation.php:1186 -msgid "Where are you right now?" -msgstr "" - -#: include/conversation.php:1187 -msgid "Delete item(s)?" -msgstr "" - -#: include/conversation.php:1219 -msgid "New Post" -msgstr "" - -#: include/conversation.php:1222 -msgid "Share" -msgstr "" - -#: include/conversation.php:1223 mod/editpost.php:73 mod/message.php:258 -#: mod/message.php:439 mod/wallmessage.php:139 -msgid "Upload photo" -msgstr "" - -#: include/conversation.php:1224 mod/editpost.php:74 -msgid "upload photo" -msgstr "" - -#: include/conversation.php:1225 mod/editpost.php:75 -msgid "Attach file" -msgstr "" - -#: include/conversation.php:1226 mod/editpost.php:76 -msgid "attach file" -msgstr "" - -#: include/conversation.php:1227 src/Module/Item/Compose.php:183 -#: src/Object/Post.php:885 -msgid "Bold" -msgstr "" - -#: include/conversation.php:1228 src/Module/Item/Compose.php:184 -#: src/Object/Post.php:886 -msgid "Italic" -msgstr "" - -#: include/conversation.php:1229 src/Module/Item/Compose.php:185 -#: src/Object/Post.php:887 -msgid "Underline" -msgstr "" - -#: include/conversation.php:1230 src/Module/Item/Compose.php:186 -#: src/Object/Post.php:888 -msgid "Quote" -msgstr "" - -#: include/conversation.php:1231 src/Module/Item/Compose.php:187 -#: src/Object/Post.php:889 -msgid "Code" -msgstr "" - -#: include/conversation.php:1232 src/Module/Item/Compose.php:188 -#: src/Object/Post.php:890 -msgid "Image" -msgstr "" - -#: include/conversation.php:1233 src/Module/Item/Compose.php:189 -#: src/Object/Post.php:891 -msgid "Link" -msgstr "" - -#: include/conversation.php:1234 src/Module/Item/Compose.php:190 -#: src/Object/Post.php:892 -msgid "Link or Media" -msgstr "" - -#: include/conversation.php:1235 mod/editpost.php:83 -#: src/Module/Item/Compose.php:193 -msgid "Set your location" -msgstr "" - -#: include/conversation.php:1236 mod/editpost.php:84 -msgid "set location" -msgstr "" - -#: include/conversation.php:1237 mod/editpost.php:85 -msgid "Clear browser location" -msgstr "" - -#: include/conversation.php:1238 mod/editpost.php:86 -msgid "clear location" -msgstr "" - -#: include/conversation.php:1240 mod/editpost.php:100 -#: src/Module/Item/Compose.php:198 -msgid "Set title" -msgstr "" - -#: include/conversation.php:1242 mod/editpost.php:102 -#: src/Module/Item/Compose.php:199 -msgid "Categories (comma-separated list)" -msgstr "" - -#: include/conversation.php:1244 mod/editpost.php:88 -msgid "Permission settings" -msgstr "" - -#: include/conversation.php:1245 mod/editpost.php:117 -msgid "permissions" -msgstr "" - -#: include/conversation.php:1254 mod/editpost.php:97 -msgid "Public post" -msgstr "" - -#: include/conversation.php:1258 mod/editpost.php:108 mod/events.php:556 -#: mod/photos.php:1398 mod/photos.php:1437 mod/photos.php:1502 -#: src/Module/Item/Compose.php:192 src/Object/Post.php:894 -msgid "Preview" -msgstr "" - -#: include/conversation.php:1262 include/items.php:392 mod/suggest.php:76 -#: mod/dfrn_request.php:652 mod/editpost.php:111 mod/fbrowser.php:110 -#: mod/fbrowser.php:139 mod/follow.php:174 mod/message.php:153 -#: mod/photos.php:1049 mod/photos.php:1156 mod/settings.php:670 -#: mod/settings.php:696 mod/tagrm.php:20 mod/tagrm.php:115 mod/unfollow.php:132 -#: src/Module/Contact.php:447 -msgid "Cancel" -msgstr "" - -#: include/conversation.php:1267 -msgid "Post to Groups" -msgstr "" - -#: include/conversation.php:1268 -msgid "Post to Contacts" -msgstr "" - -#: include/conversation.php:1269 -msgid "Private post" -msgstr "" - -#: include/conversation.php:1274 mod/editpost.php:115 src/Model/Profile.php:546 -#: src/Module/Contact.php:322 -msgid "Message" -msgstr "" - -#: include/conversation.php:1275 mod/editpost.php:116 -msgid "Browser" -msgstr "" - -#: include/conversation.php:1547 -msgid "View all" -msgstr "" - -#: include/conversation.php:1571 -msgid "Like" -msgid_plural "Likes" -msgstr[0] "" -msgstr[1] "" - -#: include/conversation.php:1574 -msgid "Dislike" -msgid_plural "Dislikes" -msgstr[0] "" -msgstr[1] "" - -#: include/conversation.php:1580 -msgid "Not Attending" -msgid_plural "Not Attending" -msgstr[0] "" -msgstr[1] "" - -#: include/conversation.php:1583 src/Content/ContactSelector.php:243 -msgid "Undecided" -msgid_plural "Undecided" -msgstr[0] "" -msgstr[1] "" - #: include/enotify.php:58 msgid "Friendica Notification" msgstr "" @@ -843,6 +360,490 @@ msgstr "" msgid "Please visit %s to approve or reject the request." msgstr "" +#: include/conversation.php:167 include/conversation.php:304 +#: src/Model/Item.php:3394 +msgid "event" +msgstr "" + +#: include/conversation.php:170 include/conversation.php:180 +#: include/conversation.php:307 include/conversation.php:316 mod/tagger.php:72 +#: mod/subthread.php:91 +msgid "status" +msgstr "" + +#: include/conversation.php:175 include/conversation.php:312 +#: src/Model/Item.php:3396 mod/tagger.php:72 mod/subthread.php:91 +msgid "photo" +msgstr "" + +#: include/conversation.php:188 +#, php-format +msgid "%1$s likes %2$s's %3$s" +msgstr "" + +#: include/conversation.php:190 +#, php-format +msgid "%1$s doesn't like %2$s's %3$s" +msgstr "" + +#: include/conversation.php:192 +#, php-format +msgid "%1$s attends %2$s's %3$s" +msgstr "" + +#: include/conversation.php:194 +#, php-format +msgid "%1$s doesn't attend %2$s's %3$s" +msgstr "" + +#: include/conversation.php:196 +#, php-format +msgid "%1$s attends maybe %2$s's %3$s" +msgstr "" + +#: include/conversation.php:231 +#, php-format +msgid "%1$s is now friends with %2$s" +msgstr "" + +#: include/conversation.php:272 +#, php-format +msgid "%1$s poked %2$s" +msgstr "" + +#: include/conversation.php:326 mod/tagger.php:105 +#, php-format +msgid "%1$s tagged %2$s's %3$s with %4$s" +msgstr "" + +#: include/conversation.php:348 +msgid "post/item" +msgstr "" + +#: include/conversation.php:349 +#, php-format +msgid "%1$s marked %2$s's %3$s as favorite" +msgstr "" + +#: include/conversation.php:574 mod/photos.php:1407 mod/profiles.php:352 +msgid "Likes" +msgstr "" + +#: include/conversation.php:575 mod/photos.php:1407 mod/profiles.php:355 +msgid "Dislikes" +msgstr "" + +#: include/conversation.php:576 include/conversation.php:1603 +#: mod/photos.php:1408 +msgid "Attending" +msgid_plural "Attending" +msgstr[0] "" +msgstr[1] "" + +#: include/conversation.php:577 mod/photos.php:1408 +msgid "Not attending" +msgstr "" + +#: include/conversation.php:578 mod/photos.php:1408 +msgid "Might attend" +msgstr "" + +#: include/conversation.php:579 +msgid "Reshares" +msgstr "" + +#: include/conversation.php:659 src/Object/Post.php:211 mod/photos.php:1469 +msgid "Select" +msgstr "" + +#: include/conversation.php:660 src/Module/Admin/Users.php:288 +#: src/Module/Contact.php:826 src/Module/Contact.php:1107 mod/photos.php:1470 +#: mod/settings.php:731 mod/settings.php:873 +msgid "Delete" +msgstr "" + +#: include/conversation.php:689 src/Object/Post.php:407 src/Object/Post.php:408 +#, php-format +msgid "View %s's profile @ %s" +msgstr "" + +#: include/conversation.php:702 src/Object/Post.php:395 +msgid "Categories:" +msgstr "" + +#: include/conversation.php:703 src/Object/Post.php:396 +msgid "Filed under:" +msgstr "" + +#: include/conversation.php:710 src/Object/Post.php:421 +#, php-format +msgid "%s from %s" +msgstr "" + +#: include/conversation.php:725 +msgid "View in context" +msgstr "" + +#: include/conversation.php:727 include/conversation.php:1249 +#: src/Object/Post.php:451 src/Module/Item/Compose.php:143 +#: mod/wallmessage.php:141 mod/photos.php:1380 mod/editpost.php:87 +#: mod/message.php:260 mod/message.php:442 +msgid "Please wait" +msgstr "" + +#: include/conversation.php:791 +msgid "remove" +msgstr "" + +#: include/conversation.php:795 +msgid "Delete Selected Items" +msgstr "" + +#: include/conversation.php:956 view/theme/frio/theme.php:363 +msgid "Follow Thread" +msgstr "" + +#: include/conversation.php:957 src/Model/Contact.php:1255 +msgid "View Status" +msgstr "" + +#: include/conversation.php:958 include/conversation.php:976 +#: src/Model/Contact.php:1185 src/Model/Contact.php:1247 +#: src/Model/Contact.php:1256 src/Module/Directory.php:148 +#: src/Module/BaseSearchModule.php:137 src/Module/AllFriends.php:74 +#: mod/match.php:87 mod/suggest.php:87 +msgid "View Profile" +msgstr "" + +#: include/conversation.php:959 src/Model/Contact.php:1257 +msgid "View Photos" +msgstr "" + +#: include/conversation.php:960 src/Model/Contact.php:1248 +#: src/Model/Contact.php:1258 +msgid "Network Posts" +msgstr "" + +#: include/conversation.php:961 src/Model/Contact.php:1249 +#: src/Model/Contact.php:1259 +msgid "View Contact" +msgstr "" + +#: include/conversation.php:962 src/Model/Contact.php:1261 +msgid "Send PM" +msgstr "" + +#: include/conversation.php:963 src/Module/Admin/Blocklist/Contact.php:67 +#: src/Module/Admin/Users.php:289 src/Module/Contact.php:606 +#: src/Module/Contact.php:823 src/Module/Contact.php:1082 +msgid "Block" +msgstr "" + +#: include/conversation.php:964 src/Module/Contact.php:607 +#: src/Module/Contact.php:824 src/Module/Contact.php:1090 +#: mod/notifications.php:66 mod/notifications.php:201 mod/notifications.php:294 +msgid "Ignore" +msgstr "" + +#: include/conversation.php:968 src/Model/Contact.php:1262 +msgid "Poke" +msgstr "" + +#: include/conversation.php:973 view/theme/vier/theme.php:178 +#: src/Content/Widget.php:67 src/Model/Contact.php:1250 +#: src/Model/Contact.php:1263 src/Module/BaseSearchModule.php:138 +#: src/Module/AllFriends.php:75 mod/follow.php:160 mod/match.php:88 +#: mod/suggest.php:88 +msgid "Connect/Follow" +msgstr "" + +#: include/conversation.php:1101 +#, php-format +msgid "%s likes this." +msgstr "" + +#: include/conversation.php:1104 +#, php-format +msgid "%s doesn't like this." +msgstr "" + +#: include/conversation.php:1107 +#, php-format +msgid "%s attends." +msgstr "" + +#: include/conversation.php:1110 +#, php-format +msgid "%s doesn't attend." +msgstr "" + +#: include/conversation.php:1113 +#, php-format +msgid "%s attends maybe." +msgstr "" + +#: include/conversation.php:1116 include/conversation.php:1159 +#, php-format +msgid "%s reshared this." +msgstr "" + +#: include/conversation.php:1124 +msgid "and" +msgstr "" + +#: include/conversation.php:1130 +#, php-format +msgid "and %d other people" +msgstr "" + +#: include/conversation.php:1138 +#, php-format +msgid "%2$d people like this" +msgstr "" + +#: include/conversation.php:1139 +#, php-format +msgid "%s like this." +msgstr "" + +#: include/conversation.php:1142 +#, php-format +msgid "%2$d people don't like this" +msgstr "" + +#: include/conversation.php:1143 +#, php-format +msgid "%s don't like this." +msgstr "" + +#: include/conversation.php:1146 +#, php-format +msgid "%2$d people attend" +msgstr "" + +#: include/conversation.php:1147 +#, php-format +msgid "%s attend." +msgstr "" + +#: include/conversation.php:1150 +#, php-format +msgid "%2$d people don't attend" +msgstr "" + +#: include/conversation.php:1151 +#, php-format +msgid "%s don't attend." +msgstr "" + +#: include/conversation.php:1154 +#, php-format +msgid "%2$d people attend maybe" +msgstr "" + +#: include/conversation.php:1155 +#, php-format +msgid "%s attend maybe." +msgstr "" + +#: include/conversation.php:1158 +#, php-format +msgid "%2$d people reshared this" +msgstr "" + +#: include/conversation.php:1188 +msgid "Visible to everybody" +msgstr "" + +#: include/conversation.php:1189 src/Object/Post.php:920 +#: src/Module/Item/Compose.php:137 +msgid "Please enter a image/video/audio/webpage URL:" +msgstr "" + +#: include/conversation.php:1190 +msgid "Tag term:" +msgstr "" + +#: include/conversation.php:1191 src/Module/Filer/SaveTag.php:48 +msgid "Save to Folder:" +msgstr "" + +#: include/conversation.php:1192 +msgid "Where are you right now?" +msgstr "" + +#: include/conversation.php:1193 +msgid "Delete item(s)?" +msgstr "" + +#: include/conversation.php:1225 +msgid "New Post" +msgstr "" + +#: include/conversation.php:1228 +msgid "Share" +msgstr "" + +#: include/conversation.php:1229 mod/wallmessage.php:139 mod/editpost.php:73 +#: mod/message.php:258 mod/message.php:439 +msgid "Upload photo" +msgstr "" + +#: include/conversation.php:1230 mod/editpost.php:74 +msgid "upload photo" +msgstr "" + +#: include/conversation.php:1231 mod/editpost.php:75 +msgid "Attach file" +msgstr "" + +#: include/conversation.php:1232 mod/editpost.php:76 +msgid "attach file" +msgstr "" + +#: include/conversation.php:1233 src/Object/Post.php:912 +#: src/Module/Item/Compose.php:129 +msgid "Bold" +msgstr "" + +#: include/conversation.php:1234 src/Object/Post.php:913 +#: src/Module/Item/Compose.php:130 +msgid "Italic" +msgstr "" + +#: include/conversation.php:1235 src/Object/Post.php:914 +#: src/Module/Item/Compose.php:131 +msgid "Underline" +msgstr "" + +#: include/conversation.php:1236 src/Object/Post.php:915 +#: src/Module/Item/Compose.php:132 +msgid "Quote" +msgstr "" + +#: include/conversation.php:1237 src/Object/Post.php:916 +#: src/Module/Item/Compose.php:133 +msgid "Code" +msgstr "" + +#: include/conversation.php:1238 src/Object/Post.php:917 +#: src/Module/Item/Compose.php:134 +msgid "Image" +msgstr "" + +#: include/conversation.php:1239 src/Object/Post.php:918 +#: src/Module/Item/Compose.php:135 +msgid "Link" +msgstr "" + +#: include/conversation.php:1240 src/Object/Post.php:919 +#: src/Module/Item/Compose.php:136 +msgid "Link or Media" +msgstr "" + +#: include/conversation.php:1241 src/Module/Item/Compose.php:139 +#: mod/editpost.php:83 +msgid "Set your location" +msgstr "" + +#: include/conversation.php:1242 mod/editpost.php:84 +msgid "set location" +msgstr "" + +#: include/conversation.php:1243 mod/editpost.php:85 +msgid "Clear browser location" +msgstr "" + +#: include/conversation.php:1244 mod/editpost.php:86 +msgid "clear location" +msgstr "" + +#: include/conversation.php:1246 src/Module/Item/Compose.php:144 +#: mod/editpost.php:100 +msgid "Set title" +msgstr "" + +#: include/conversation.php:1248 src/Module/Item/Compose.php:145 +#: mod/editpost.php:102 +msgid "Categories (comma-separated list)" +msgstr "" + +#: include/conversation.php:1250 mod/editpost.php:88 +msgid "Permission settings" +msgstr "" + +#: include/conversation.php:1251 mod/editpost.php:117 +msgid "permissions" +msgstr "" + +#: include/conversation.php:1260 mod/editpost.php:97 +msgid "Public post" +msgstr "" + +#: include/conversation.php:1264 src/Object/Post.php:921 +#: src/Module/Item/Compose.php:138 mod/events.php:556 mod/photos.php:1398 +#: mod/photos.php:1437 mod/photos.php:1502 mod/editpost.php:108 +msgid "Preview" +msgstr "" + +#: include/conversation.php:1268 include/items.php:392 +#: src/Module/Contact.php:447 mod/dfrn_request.php:652 mod/follow.php:174 +#: mod/fbrowser.php:110 mod/fbrowser.php:139 mod/unfollow.php:132 +#: mod/photos.php:1049 mod/photos.php:1156 mod/settings.php:671 +#: mod/settings.php:697 mod/suggest.php:76 mod/editpost.php:111 +#: mod/message.php:153 mod/tagrm.php:20 mod/tagrm.php:115 +msgid "Cancel" +msgstr "" + +#: include/conversation.php:1273 +msgid "Post to Groups" +msgstr "" + +#: include/conversation.php:1274 +msgid "Post to Contacts" +msgstr "" + +#: include/conversation.php:1275 +msgid "Private post" +msgstr "" + +#: include/conversation.php:1280 src/Model/Profile.php:546 +#: src/Module/Contact.php:322 mod/editpost.php:115 +msgid "Message" +msgstr "" + +#: include/conversation.php:1281 mod/editpost.php:116 +msgid "Browser" +msgstr "" + +#: include/conversation.php:1573 +msgid "View all" +msgstr "" + +#: include/conversation.php:1597 +msgid "Like" +msgid_plural "Likes" +msgstr[0] "" +msgstr[1] "" + +#: include/conversation.php:1600 +msgid "Dislike" +msgid_plural "Dislikes" +msgstr[0] "" +msgstr[1] "" + +#: include/conversation.php:1606 +msgid "Not Attending" +msgid_plural "Not Attending" +msgstr[0] "" +msgstr[1] "" + +#: include/conversation.php:1609 src/Content/ContactSelector.php:245 +msgid "Undecided" +msgid_plural "Undecided" +msgstr[0] "" +msgstr[1] "" + #: include/items.php:355 src/Module/Admin/Themes/Details.php:53 #: src/Module/Admin/Themes/Index.php:43 src/Module/Debug/ItemBody.php:27 #: src/Module/Debug/ItemBody.php:40 @@ -853,3247 +854,177 @@ msgstr "" msgid "Do you really want to delete this item?" msgstr "" -#: include/items.php:389 mod/suggest.php:73 mod/api.php:110 -#: mod/dfrn_request.php:642 mod/follow.php:163 mod/message.php:150 +#: include/items.php:389 src/Module/Contact.php:444 src/Module/Register.php:91 +#: mod/api.php:110 mod/dfrn_request.php:642 mod/follow.php:163 #: mod/profiles.php:526 mod/profiles.php:529 mod/profiles.php:551 -#: mod/settings.php:1081 mod/settings.php:1087 mod/settings.php:1094 -#: mod/settings.php:1098 mod/settings.php:1102 mod/settings.php:1106 -#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1134 -#: mod/settings.php:1135 mod/settings.php:1136 mod/settings.php:1137 -#: mod/settings.php:1138 src/Module/Contact.php:444 src/Module/Register.php:91 +#: mod/settings.php:1090 mod/settings.php:1096 mod/settings.php:1103 +#: mod/settings.php:1107 mod/settings.php:1111 mod/settings.php:1115 +#: mod/settings.php:1119 mod/settings.php:1123 mod/settings.php:1143 +#: mod/settings.php:1144 mod/settings.php:1145 mod/settings.php:1146 +#: mod/settings.php:1147 mod/suggest.php:73 mod/message.php:150 msgid "Yes" msgstr "" -#: include/items.php:439 mod/ostatus_subscribe.php:18 mod/repair_ostatus.php:16 -#: mod/notes.php:27 mod/profile_photo.php:32 mod/profile_photo.php:177 -#: mod/profile_photo.php:197 mod/suggest.php:39 mod/api.php:35 mod/api.php:40 -#: mod/cal.php:291 mod/common.php:27 mod/crepair.php:90 mod/dfrn_confirm.php:65 -#: mod/editpost.php:22 mod/events.php:214 mod/follow.php:57 mod/follow.php:134 -#: mod/fsuggest.php:63 mod/item.php:174 mod/message.php:56 mod/message.php:101 -#: mod/network.php:38 mod/notifications.php:76 mod/photos.php:163 -#: mod/photos.php:927 mod/poke.php:142 mod/profiles.php:182 -#: mod/profiles.php:499 mod/regmod.php:89 mod/settings.php:54 -#: mod/settings.php:167 mod/settings.php:659 mod/uimport.php:17 -#: mod/unfollow.php:22 mod/unfollow.php:77 mod/unfollow.php:109 -#: mod/wall_attach.php:63 mod/wall_attach.php:66 mod/wall_upload.php:95 -#: mod/wall_upload.php:98 mod/wallmessage.php:19 mod/wallmessage.php:43 -#: mod/wallmessage.php:82 mod/wallmessage.php:106 src/Module/Attach.php:42 -#: src/Module/Group.php:31 src/Module/Group.php:77 src/Module/Invite.php:22 -#: src/Module/Invite.php:110 src/Module/Notifications/Notify.php:20 -#: src/Module/Profile/Contacts.php:50 src/Module/Search/Directory.php:19 +#: include/items.php:439 src/Module/Delegation.php:101 +#: src/Module/Notifications/Notify.php:20 src/Module/Attach.php:42 #: src/Module/Settings/Delegation.php:26 src/Module/Settings/Delegation.php:54 -#: src/Module/Contact.php:361 src/Module/Delegation.php:98 -#: src/Module/FollowConfirm.php:27 src/Module/Register.php:186 +#: src/Module/Group.php:31 src/Module/Group.php:77 +#: src/Module/FollowConfirm.php:27 src/Module/Profile/Contacts.php:50 +#: src/Module/Contact.php:361 src/Module/Invite.php:22 +#: src/Module/Invite.php:110 src/Module/Register.php:186 +#: src/Module/Search/Directory.php:19 mod/notes.php:27 mod/uimport.php:17 +#: mod/fsuggest.php:63 mod/common.php:27 mod/events.php:215 mod/api.php:35 +#: mod/api.php:40 mod/cal.php:291 mod/crepair.php:90 mod/notifications.php:76 +#: mod/wallmessage.php:19 mod/wallmessage.php:43 mod/wallmessage.php:82 +#: mod/wallmessage.php:106 mod/ostatus_subscribe.php:18 mod/follow.php:57 +#: mod/follow.php:134 mod/network.php:38 mod/unfollow.php:22 +#: mod/unfollow.php:77 mod/unfollow.php:109 mod/profile_photo.php:32 +#: mod/profile_photo.php:177 mod/profile_photo.php:197 mod/poke.php:142 +#: mod/photos.php:163 mod/photos.php:927 mod/profiles.php:182 +#: mod/profiles.php:499 mod/wall_attach.php:63 mod/wall_attach.php:66 +#: mod/item.php:174 mod/regmod.php:89 mod/settings.php:54 mod/settings.php:167 +#: mod/settings.php:660 mod/suggest.php:39 mod/dfrn_confirm.php:65 +#: mod/wall_upload.php:95 mod/wall_upload.php:98 mod/editpost.php:22 +#: mod/message.php:56 mod/message.php:101 mod/repair_ostatus.php:16 msgid "Permission denied." msgstr "" -#: mod/oexchange.php:32 -msgid "Post successful." -msgstr "" - -#: mod/ostatus_subscribe.php:23 -msgid "Subscribing to OStatus contacts" -msgstr "" - -#: mod/ostatus_subscribe.php:35 -msgid "No contact provided." -msgstr "" - -#: mod/ostatus_subscribe.php:42 -msgid "Couldn't fetch information for contact." -msgstr "" - -#: mod/ostatus_subscribe.php:52 -msgid "Couldn't fetch friends for contact." -msgstr "" - -#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52 -msgid "Done" -msgstr "" - -#: mod/ostatus_subscribe.php:84 -msgid "success" -msgstr "" - -#: mod/ostatus_subscribe.php:86 -msgid "failed" -msgstr "" - -#: mod/ostatus_subscribe.php:89 src/Object/Post.php:282 -msgid "ignored" -msgstr "" - -#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58 -msgid "Keep this window open until done." -msgstr "" - -#: mod/profperm.php:30 -msgid "Permission denied" -msgstr "" - -#: mod/profperm.php:36 mod/profperm.php:69 -msgid "Invalid profile identifier." -msgstr "" - -#: mod/profperm.php:115 -msgid "Profile Visibility Editor" -msgstr "" - -#: mod/profperm.php:117 view/theme/frio/theme.php:268 src/Content/Nav.php:161 -#: src/Model/Profile.php:885 src/Model/Profile.php:921 -#: src/Module/Welcome.php:38 src/Module/Contact.php:639 -#: src/Module/Contact.php:868 -msgid "Profile" -msgstr "" - -#: mod/profperm.php:119 src/Module/Group.php:321 -msgid "Click on a contact to add or remove." -msgstr "" - -#: mod/profperm.php:128 -msgid "Visible To" -msgstr "" - -#: mod/profperm.php:144 -msgid "All Contacts (with secure profile access)" -msgstr "" - -#: mod/removeme.php:46 -msgid "User deleted their account" -msgstr "" - -#: mod/removeme.php:47 -msgid "" -"On your Friendica node an user deleted their account. Please ensure that " -"their data is removed from the backups." -msgstr "" - -#: mod/removeme.php:48 +#: update.php:218 #, php-format -msgid "The user id is %d" +msgid "%s: Updating author-id and owner-id in item and thread table. " msgstr "" -#: mod/removeme.php:84 mod/removeme.php:87 -msgid "Remove My Account" -msgstr "" - -#: mod/removeme.php:85 -msgid "" -"This will completely remove your account. Once this has been done it is not " -"recoverable." -msgstr "" - -#: mod/removeme.php:86 -msgid "Please enter your password for verification:" -msgstr "" - -#: mod/repair_ostatus.php:21 -msgid "Resubscribing to OStatus contacts" -msgstr "" - -#: mod/repair_ostatus.php:37 src/Module/TwoFactor/Verify.php:64 -msgid "Error" -msgid_plural "Errors" -msgstr[0] "" -msgstr[1] "" - -#: mod/update_community.php:23 mod/update_contact.php:23 -#: mod/update_display.php:24 mod/update_network.php:33 mod/update_notes.php:36 -#: mod/update_profile.php:34 -msgid "[Embedded content - reload page to view]" -msgstr "" - -#: mod/notes.php:34 src/Model/Profile.php:971 -msgid "Personal Notes" -msgstr "" - -#: mod/notes.php:46 mod/editpost.php:72 src/Content/Text/HTML.php:905 -#: src/Module/Filer/SaveTag.php:49 -msgid "Save" -msgstr "" - -#: mod/ping.php:272 -msgid "{0} wants to be your friend" -msgstr "" - -#: mod/ping.php:288 -msgid "{0} requested registration" -msgstr "" - -#: mod/profile_photo.php:58 -msgid "Image uploaded but image cropping failed." -msgstr "" - -#: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106 -#: mod/profile_photo.php:311 +#: update.php:273 #, php-format -msgid "Image size reduction [%s] failed." +msgid "%s: Updating post-type." msgstr "" -#: mod/profile_photo.php:125 -msgid "" -"Shift-reload the page or clear browser cache if the new photo does not " -"display immediately." +#: view/theme/vier/theme.php:128 view/theme/vier/config.php:126 +msgid "Community Profiles" msgstr "" -#: mod/profile_photo.php:133 -msgid "Unable to process image" +#: view/theme/vier/theme.php:158 view/theme/vier/config.php:130 +msgid "Last users" msgstr "" -#: mod/profile_photo.php:152 mod/photos.php:674 mod/photos.php:677 -#: mod/photos.php:706 mod/wall_upload.php:186 -#, php-format -msgid "Image exceeds size limit of %s" +#: view/theme/vier/theme.php:176 src/Content/Widget.php:65 +msgid "Find People" msgstr "" -#: mod/profile_photo.php:161 mod/photos.php:729 mod/wall_upload.php:200 -msgid "Unable to process image." +#: view/theme/vier/theme.php:177 src/Content/Widget.php:66 +msgid "Enter name or interest" msgstr "" -#: mod/profile_photo.php:244 -msgid "Upload File:" +#: view/theme/vier/theme.php:179 src/Content/Widget.php:68 +msgid "Examples: Robert Morgenstein, Fishing" msgstr "" -#: mod/profile_photo.php:245 -msgid "Select a profile:" +#: view/theme/vier/theme.php:180 src/Content/Widget.php:69 +#: src/Module/Directory.php:84 src/Module/Contact.php:816 +msgid "Find" msgstr "" -#: mod/profile_photo.php:246 mod/profiles.php:583 src/Module/Welcome.php:39 -msgid "Upload Profile Photo" -msgstr "" - -#: mod/profile_photo.php:247 mod/fbrowser.php:112 mod/fbrowser.php:141 -msgid "Upload" -msgstr "" - -#: mod/profile_photo.php:250 -msgid "or" -msgstr "" - -#: mod/profile_photo.php:251 -msgid "skip this step" -msgstr "" - -#: mod/profile_photo.php:251 -msgid "select a photo from your photo albums" -msgstr "" - -#: mod/profile_photo.php:264 -msgid "Crop Image" -msgstr "" - -#: mod/profile_photo.php:265 -msgid "Please adjust the image cropping for optimum viewing." -msgstr "" - -#: mod/profile_photo.php:267 -msgid "Done Editing" -msgstr "" - -#: mod/profile_photo.php:301 -msgid "Image uploaded successfully." -msgstr "" - -#: mod/profile_photo.php:303 mod/photos.php:758 mod/wall_upload.php:239 -msgid "Image upload failed." -msgstr "" - -#: mod/suggest.php:28 -msgid "Contact suggestion successfully ignored." -msgstr "" - -#: mod/suggest.php:52 -msgid "" -"No suggestions available. If this is a new site, please try again in 24 " -"hours." -msgstr "" - -#: mod/suggest.php:71 -msgid "Do you really want to delete this suggestion?" -msgstr "" - -#: mod/suggest.php:89 mod/suggest.php:109 -msgid "Ignore/Hide" -msgstr "" - -#: mod/suggest.php:106 mod/match.php:102 src/Content/Widget.php:43 -#: src/Module/AllFriends.php:91 src/Module/BaseSearchModule.php:135 -msgid "Connect" -msgstr "" - -#: mod/suggest.php:119 view/theme/vier/theme.php:181 src/Content/Widget.php:70 +#: view/theme/vier/theme.php:181 src/Content/Widget.php:70 mod/suggest.php:119 msgid "Friend Suggestions" msgstr "" -#: mod/api.php:85 mod/api.php:107 -msgid "Authorize application connection" +#: view/theme/vier/theme.php:182 src/Content/Widget.php:71 +msgid "Similar Interests" msgstr "" -#: mod/api.php:86 -msgid "Return to your app and insert this Securty Code:" +#: view/theme/vier/theme.php:183 src/Content/Widget.php:72 +msgid "Random Profile" msgstr "" -#: mod/api.php:95 src/Module/BaseAdminModule.php:56 -msgid "Please login to continue." +#: view/theme/vier/theme.php:184 src/Content/Widget.php:73 +msgid "Invite Friends" msgstr "" -#: mod/api.php:109 -msgid "" -"Do you want to authorize this application to access your posts and contacts, " -"and/or create new posts for you?" +#: view/theme/vier/theme.php:185 src/Content/Widget.php:74 +#: src/Module/Directory.php:76 +msgid "Global Directory" msgstr "" -#: mod/api.php:111 mod/dfrn_request.php:642 mod/follow.php:163 -#: mod/profiles.php:526 mod/profiles.php:530 mod/profiles.php:551 -#: mod/settings.php:1081 mod/settings.php:1087 mod/settings.php:1094 -#: mod/settings.php:1098 mod/settings.php:1102 mod/settings.php:1106 -#: mod/settings.php:1110 mod/settings.php:1114 mod/settings.php:1134 -#: mod/settings.php:1135 mod/settings.php:1136 mod/settings.php:1137 -#: mod/settings.php:1138 src/Module/Register.php:92 -msgid "No" +#: view/theme/vier/theme.php:187 src/Content/Widget.php:76 +msgid "Local Directory" msgstr "" -#: mod/cal.php:31 mod/cal.php:35 mod/community.php:32 mod/follow.php:20 -#: src/Module/Debug/ItemBody.php:18 src/Module/Diaspora/Receive.php:39 -#: src/Module/Item/Ignore.php:25 -msgid "Access denied." +#: view/theme/vier/theme.php:227 src/Content/Text/HTML.php:926 +#: src/Content/ForumManager.php:130 src/Content/Nav.php:209 +msgid "Forums" msgstr "" -#: mod/cal.php:130 mod/display.php:296 src/Module/Profile.php:175 -msgid "Access to this profile has been restricted." +#: view/theme/vier/theme.php:229 src/Content/ForumManager.php:132 +msgid "External link to forum" msgstr "" -#: mod/cal.php:261 mod/events.php:389 view/theme/frio/theme.php:271 -#: view/theme/frio/theme.php:275 src/Content/Nav.php:164 -#: src/Content/Nav.php:228 src/Model/Profile.php:949 src/Model/Profile.php:960 -msgid "Events" +#: view/theme/vier/theme.php:232 src/Content/Widget.php:409 +#: src/Content/Widget.php:509 src/Content/ForumManager.php:135 +msgid "show more" msgstr "" -#: mod/cal.php:262 mod/events.php:390 -msgid "View" +#: view/theme/vier/theme.php:265 +msgid "Quick Start" msgstr "" -#: mod/cal.php:263 mod/events.php:392 -msgid "Previous" +#: view/theme/vier/theme.php:271 src/Content/Nav.php:192 src/Module/Help.php:50 +#: src/Module/Settings/TwoFactor/Verify.php:117 +#: src/Module/Settings/TwoFactor/AppSpecific.php:99 +#: src/Module/Settings/TwoFactor/Index.php:90 +#: src/Module/Settings/TwoFactor/Recovery.php:77 +msgid "Help" msgstr "" -#: mod/cal.php:264 mod/events.php:393 src/Module/Install.php:174 -msgid "Next" +#: view/theme/vier/theme.php:350 view/theme/vier/config.php:128 +msgid "Connect Services" msgstr "" -#: mod/cal.php:267 mod/events.php:398 src/Model/Event.php:429 -msgid "today" +#: view/theme/vier/config.php:78 +msgid "Comma separated list of helper forums" msgstr "" -#: mod/cal.php:268 mod/events.php:399 src/Util/Temporal.php:313 -#: src/Model/Event.php:430 -msgid "month" +#: view/theme/vier/config.php:118 +msgid "don't show" msgstr "" -#: mod/cal.php:269 mod/events.php:400 src/Util/Temporal.php:314 -#: src/Model/Event.php:431 -msgid "week" +#: view/theme/vier/config.php:118 +msgid "show" msgstr "" -#: mod/cal.php:270 mod/events.php:401 src/Util/Temporal.php:315 -#: src/Model/Event.php:432 -msgid "day" -msgstr "" - -#: mod/cal.php:271 mod/events.php:402 -msgid "list" -msgstr "" - -#: mod/cal.php:284 src/Model/User.php:415 src/Console/NewPassword.php:88 -msgid "User not found" -msgstr "" - -#: mod/cal.php:300 -msgid "This calendar format is not supported" -msgstr "" - -#: mod/cal.php:302 -msgid "No exportable data found" -msgstr "" - -#: mod/cal.php:319 -msgid "calendar" -msgstr "" - -#: mod/common.php:90 -msgid "No contacts in common." -msgstr "" - -#: mod/common.php:141 src/Module/Contact.php:891 -msgid "Common Friends" -msgstr "" - -#: mod/community.php:25 mod/dfrn_request.php:599 mod/display.php:200 -#: mod/photos.php:841 mod/videos.php:115 src/Module/Debug/Probe.php:20 -#: src/Module/Debug/WebFinger.php:19 src/Module/Search/Index.php:31 -#: src/Module/Search/Index.php:36 src/Module/Directory.php:31 -msgid "Public access denied." -msgstr "" - -#: mod/community.php:68 -msgid "Community option not available." -msgstr "" - -#: mod/community.php:85 -msgid "Not available." -msgstr "" - -#: mod/community.php:95 -msgid "Local Community" -msgstr "" - -#: mod/community.php:98 -msgid "Posts from local users on this server" -msgstr "" - -#: mod/community.php:106 -msgid "Global Community" -msgstr "" - -#: mod/community.php:109 -msgid "Posts from users of the whole federated network" -msgstr "" - -#: mod/community.php:155 src/Module/Search/Index.php:178 -msgid "No results." -msgstr "" - -#: mod/community.php:207 -msgid "" -"This community stream shows all public posts received by this node. They may " -"not reflect the opinions of this node’s users." -msgstr "" - -#: mod/crepair.php:79 -msgid "Contact settings applied." -msgstr "" - -#: mod/crepair.php:81 -msgid "Contact update failed." -msgstr "" - -#: mod/crepair.php:102 mod/dfrn_confirm.php:126 mod/fsuggest.php:32 -#: mod/fsuggest.php:75 mod/redir.php:32 mod/redir.php:122 mod/redir.php:137 -#: src/Module/Group.php:92 src/Module/FollowConfirm.php:46 -msgid "Contact not found." -msgstr "" - -#: mod/crepair.php:115 -msgid "" -"WARNING: This is highly advanced and if you enter incorrect " -"information your communications with this contact may stop working." -msgstr "" - -#: mod/crepair.php:116 -msgid "" -"Please use your browser 'Back' button now if you are " -"uncertain what to do on this page." -msgstr "" - -#: mod/crepair.php:130 mod/crepair.php:132 -msgid "No mirroring" -msgstr "" - -#: mod/crepair.php:130 -msgid "Mirror as forwarded posting" -msgstr "" - -#: mod/crepair.php:130 mod/crepair.php:132 -msgid "Mirror as my own posting" -msgstr "" - -#: mod/crepair.php:145 -msgid "Return to contact editor" -msgstr "" - -#: mod/crepair.php:147 -msgid "Refetch contact data" -msgstr "" - -#: mod/crepair.php:149 mod/events.php:558 mod/fsuggest.php:92 -#: mod/message.php:261 mod/message.php:441 mod/photos.php:956 -#: mod/photos.php:1066 mod/photos.php:1352 mod/photos.php:1397 -#: mod/photos.php:1436 mod/photos.php:1501 mod/poke.php:185 -#: mod/profiles.php:562 view/theme/duepuntozero/config.php:72 +#: view/theme/vier/config.php:122 view/theme/duepuntozero/config.php:72 #: view/theme/frio/config.php:127 view/theme/quattro/config.php:74 -#: view/theme/vier/config.php:122 src/Module/Debug/Localtime.php:45 -#: src/Module/Invite.php:157 src/Module/Item/Compose.php:182 -#: src/Module/Contact.php:581 src/Module/Delegation.php:131 +#: src/Object/Post.php:911 src/Module/Delegation.php:134 #: src/Module/Install.php:212 src/Module/Install.php:252 -#: src/Module/Install.php:288 src/Object/Post.php:884 +#: src/Module/Install.php:288 src/Module/Debug/Localtime.php:45 +#: src/Module/Contact.php:581 src/Module/Invite.php:157 +#: src/Module/Item/Compose.php:128 mod/fsuggest.php:92 mod/events.php:558 +#: mod/crepair.php:149 mod/poke.php:185 mod/photos.php:956 mod/photos.php:1066 +#: mod/photos.php:1352 mod/photos.php:1397 mod/photos.php:1436 +#: mod/photos.php:1501 mod/profiles.php:562 mod/message.php:261 +#: mod/message.php:441 msgid "Submit" msgstr "" -#: mod/crepair.php:150 -msgid "Remote Self" -msgstr "" - -#: mod/crepair.php:153 -msgid "Mirror postings from this contact" -msgstr "" - -#: mod/crepair.php:155 -msgid "" -"Mark this contact as remote_self, this will cause friendica to repost new " -"entries from this contact." -msgstr "" - -#: mod/crepair.php:159 mod/settings.php:671 mod/settings.php:697 -#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272 -#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297 -#: src/Module/Admin/Users.php:313 -msgid "Name" -msgstr "" - -#: mod/crepair.php:160 -msgid "Account Nickname" -msgstr "" - -#: mod/crepair.php:161 -msgid "@Tagname - overrides Name/Nickname" -msgstr "" - -#: mod/crepair.php:162 -msgid "Account URL" -msgstr "" - -#: mod/crepair.php:163 -msgid "Account URL Alias" -msgstr "" - -#: mod/crepair.php:164 -msgid "Friend Request URL" -msgstr "" - -#: mod/crepair.php:165 -msgid "Friend Confirm URL" -msgstr "" - -#: mod/crepair.php:166 -msgid "Notification Endpoint URL" -msgstr "" - -#: mod/crepair.php:167 -msgid "Poll/Feed URL" -msgstr "" - -#: mod/crepair.php:168 -msgid "New photo from this URL" -msgstr "" - -#: mod/dfrn_confirm.php:71 mod/profiles.php:43 mod/profiles.php:152 -#: mod/profiles.php:196 mod/profiles.php:511 -msgid "Profile not found." -msgstr "" - -#: mod/dfrn_confirm.php:127 -msgid "" -"This may occasionally happen if contact was requested by both persons and it " -"has already been approved." -msgstr "" - -#: mod/dfrn_confirm.php:228 -msgid "Response from remote site was not understood." -msgstr "" - -#: mod/dfrn_confirm.php:235 mod/dfrn_confirm.php:241 -msgid "Unexpected response from remote site: " -msgstr "" - -#: mod/dfrn_confirm.php:250 -msgid "Confirmation completed successfully." -msgstr "" - -#: mod/dfrn_confirm.php:262 -msgid "Temporary failure. Please wait and try again." -msgstr "" - -#: mod/dfrn_confirm.php:265 -msgid "Introduction failed or was revoked." -msgstr "" - -#: mod/dfrn_confirm.php:270 -msgid "Remote site reported: " -msgstr "" - -#: mod/dfrn_confirm.php:375 -#, php-format -msgid "No user record found for '%s' " -msgstr "" - -#: mod/dfrn_confirm.php:385 -msgid "Our site encryption key is apparently messed up." -msgstr "" - -#: mod/dfrn_confirm.php:396 -msgid "Empty site URL was provided or URL could not be decrypted by us." -msgstr "" - -#: mod/dfrn_confirm.php:412 -msgid "Contact record was not found for you on our site." -msgstr "" - -#: mod/dfrn_confirm.php:426 -#, php-format -msgid "Site public key not available in contact record for URL %s." -msgstr "" - -#: mod/dfrn_confirm.php:442 -msgid "" -"The ID provided by your system is a duplicate on our system. It should work " -"if you try again." -msgstr "" - -#: mod/dfrn_confirm.php:453 -msgid "Unable to set your contact credentials on our system." -msgstr "" - -#: mod/dfrn_confirm.php:509 -msgid "Unable to update your contact profile details on our system" -msgstr "" - -#: mod/dfrn_confirm.php:539 mod/dfrn_request.php:562 src/Model/Contact.php:2589 -msgid "[Name Withheld]" -msgstr "" - -#: mod/dfrn_poll.php:123 mod/dfrn_poll.php:526 -#, php-format -msgid "%1$s welcomes %2$s" -msgstr "" - -#: mod/dfrn_request.php:100 -msgid "This introduction has already been accepted." -msgstr "" - -#: mod/dfrn_request.php:118 mod/dfrn_request.php:356 -msgid "Profile location is not valid or does not contain profile information." -msgstr "" - -#: mod/dfrn_request.php:122 mod/dfrn_request.php:360 -msgid "Warning: profile location has no identifiable owner name." -msgstr "" - -#: mod/dfrn_request.php:125 mod/dfrn_request.php:363 -msgid "Warning: profile location has no profile photo." -msgstr "" - -#: mod/dfrn_request.php:129 mod/dfrn_request.php:367 -#, php-format -msgid "%d required parameter was not found at the given location" -msgid_plural "%d required parameters were not found at the given location" -msgstr[0] "" -msgstr[1] "" - -#: mod/dfrn_request.php:167 -msgid "Introduction complete." -msgstr "" - -#: mod/dfrn_request.php:203 -msgid "Unrecoverable protocol error." -msgstr "" - -#: mod/dfrn_request.php:230 -msgid "Profile unavailable." -msgstr "" - -#: mod/dfrn_request.php:251 -#, php-format -msgid "%s has received too many connection requests today." -msgstr "" - -#: mod/dfrn_request.php:252 -msgid "Spam protection measures have been invoked." -msgstr "" - -#: mod/dfrn_request.php:253 -msgid "Friends are advised to please try again in 24 hours." -msgstr "" - -#: mod/dfrn_request.php:277 -msgid "Invalid locator" -msgstr "" - -#: mod/dfrn_request.php:313 -msgid "You have already introduced yourself here." -msgstr "" - -#: mod/dfrn_request.php:316 -#, php-format -msgid "Apparently you are already friends with %s." -msgstr "" - -#: mod/dfrn_request.php:336 -msgid "Invalid profile URL." -msgstr "" - -#: mod/dfrn_request.php:342 src/Model/Contact.php:2212 -msgid "Disallowed profile URL." -msgstr "" - -#: mod/dfrn_request.php:348 src/Model/Contact.php:2217 -#: src/Module/Friendica.php:59 -msgid "Blocked domain" -msgstr "" - -#: mod/dfrn_request.php:415 src/Module/Contact.php:143 -msgid "Failed to update contact record." -msgstr "" - -#: mod/dfrn_request.php:435 -msgid "Your introduction has been sent." -msgstr "" - -#: mod/dfrn_request.php:473 -msgid "" -"Remote subscription can't be done for your network. Please subscribe " -"directly on your system." -msgstr "" - -#: mod/dfrn_request.php:489 -msgid "Please login to confirm introduction." -msgstr "" - -#: mod/dfrn_request.php:497 -msgid "" -"Incorrect identity currently logged in. Please login to this profile." -msgstr "" - -#: mod/dfrn_request.php:511 mod/dfrn_request.php:526 -msgid "Confirm" -msgstr "" - -#: mod/dfrn_request.php:522 -msgid "Hide this contact" -msgstr "" - -#: mod/dfrn_request.php:524 -#, php-format -msgid "Welcome home %s." -msgstr "" - -#: mod/dfrn_request.php:525 -#, php-format -msgid "Please confirm your introduction/connection request to %s." -msgstr "" - -#: mod/dfrn_request.php:634 -msgid "" -"Please enter your 'Identity Address' from one of the following supported " -"communications networks:" -msgstr "" - -#: mod/dfrn_request.php:636 -#, php-format -msgid "" -"If you are not yet a member of the free social web, follow " -"this link to find a public Friendica site and join us today." -msgstr "" - -#: mod/dfrn_request.php:639 -msgid "Friend/Connection Request" -msgstr "" - -#: mod/dfrn_request.php:640 -msgid "" -"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, " -"testuser@gnusocial.de" -msgstr "" - -#: mod/dfrn_request.php:641 mod/follow.php:162 -msgid "Please answer the following:" -msgstr "" - -#: mod/dfrn_request.php:642 mod/follow.php:163 -#, php-format -msgid "Does %s know you?" -msgstr "" - -#: mod/dfrn_request.php:643 mod/follow.php:164 -msgid "Add a personal note:" -msgstr "" - -#: mod/dfrn_request.php:645 -msgid "Friendica" -msgstr "" - -#: mod/dfrn_request.php:646 -msgid "GNU Social (Pleroma, Mastodon)" -msgstr "" - -#: mod/dfrn_request.php:647 -msgid "Diaspora (Socialhome, Hubzilla)" -msgstr "" - -#: mod/dfrn_request.php:648 -#, php-format -msgid "" -" - please do not use this form. Instead, enter %s into your Diaspora search " -"bar." -msgstr "" - -#: mod/dfrn_request.php:649 mod/follow.php:170 mod/unfollow.php:128 -msgid "Your Identity Address:" -msgstr "" - -#: mod/dfrn_request.php:651 mod/follow.php:76 mod/unfollow.php:131 -msgid "Submit Request" -msgstr "" - -#: mod/display.php:255 mod/display.php:332 -msgid "The requested item doesn't exist or has been deleted." -msgstr "" - -#: mod/display.php:410 -msgid "The feed for this item is unavailable." -msgstr "" - -#: mod/editpost.php:29 mod/editpost.php:39 -msgid "Item not found" -msgstr "" - -#: mod/editpost.php:46 -msgid "Edit post" -msgstr "" - -#: mod/editpost.php:77 mod/message.php:259 mod/message.php:440 -#: mod/wallmessage.php:140 -msgid "Insert web link" -msgstr "" - -#: mod/editpost.php:78 -msgid "web link" -msgstr "" - -#: mod/editpost.php:79 -msgid "Insert video link" -msgstr "" - -#: mod/editpost.php:80 -msgid "video link" -msgstr "" - -#: mod/editpost.php:81 -msgid "Insert audio link" -msgstr "" - -#: mod/editpost.php:82 -msgid "audio link" -msgstr "" - -#: mod/editpost.php:96 src/Core/ACL.php:309 src/Module/Item/Compose.php:204 -msgid "CC: email addresses" -msgstr "" - -#: mod/editpost.php:103 src/Core/ACL.php:310 -msgid "Example: bob@example.com, mary@example.com" -msgstr "" - -#: mod/events.php:120 mod/events.php:122 -msgid "Event can not end before it has started." -msgstr "" - -#: mod/events.php:129 mod/events.php:131 -msgid "Event title and start time are required." -msgstr "" - -#: mod/events.php:391 -msgid "Create New Event" -msgstr "" - -#: mod/events.php:514 -msgid "Event details" -msgstr "" - -#: mod/events.php:515 -msgid "Starting date and Title are required." -msgstr "" - -#: mod/events.php:516 mod/events.php:521 -msgid "Event Starts:" -msgstr "" - -#: mod/events.php:516 mod/events.php:548 mod/profiles.php:592 -msgid "Required" -msgstr "" - -#: mod/events.php:529 mod/events.php:554 -msgid "Finish date/time is not known or not relevant" -msgstr "" - -#: mod/events.php:531 mod/events.php:536 -msgid "Event Finishes:" -msgstr "" - -#: mod/events.php:542 mod/events.php:555 -msgid "Adjust for viewer timezone" -msgstr "" - -#: mod/events.php:544 -msgid "Description:" -msgstr "" - -#: mod/events.php:546 mod/notifications.php:276 src/Model/Event.php:69 -#: src/Model/Event.php:96 src/Model/Event.php:438 src/Model/Event.php:934 -#: src/Model/Profile.php:443 src/Module/Contact.php:628 -#: src/Module/Directory.php:135 -msgid "Location:" -msgstr "" - -#: mod/events.php:548 mod/events.php:550 -msgid "Title:" -msgstr "" - -#: mod/events.php:551 mod/events.php:552 -msgid "Share this event" -msgstr "" - -#: mod/events.php:559 src/Model/Profile.php:886 -msgid "Basic" -msgstr "" - -#: mod/events.php:560 src/Model/Profile.php:887 src/Module/Admin/Site.php:573 -#: src/Module/Contact.php:901 -msgid "Advanced" -msgstr "" - -#: mod/events.php:561 mod/photos.php:974 mod/photos.php:1348 -#: src/Core/ACL.php:315 -msgid "Permissions" -msgstr "" - -#: mod/events.php:577 -msgid "Failed to remove event" -msgstr "" - -#: mod/events.php:579 -msgid "Event removed" -msgstr "" - -#: mod/fbrowser.php:43 view/theme/frio/theme.php:269 src/Content/Nav.php:162 -#: src/Model/Profile.php:929 -msgid "Photos" -msgstr "" - -#: mod/fbrowser.php:52 mod/fbrowser.php:76 mod/photos.php:181 -#: mod/photos.php:938 mod/photos.php:1055 mod/photos.php:1072 -#: mod/photos.php:1554 mod/photos.php:1569 src/Model/Photo.php:560 -#: src/Model/Photo.php:569 -msgid "Contact Photos" -msgstr "" - -#: mod/fbrowser.php:136 -msgid "Files" -msgstr "" - -#: mod/follow.php:46 -msgid "The contact could not be added." -msgstr "" - -#: mod/follow.php:87 -msgid "You already added this contact." -msgstr "" - -#: mod/follow.php:99 -msgid "Diaspora support isn't enabled. Contact can't be added." -msgstr "" - -#: mod/follow.php:106 -msgid "OStatus support is disabled. Contact can't be added." -msgstr "" - -#: mod/follow.php:113 -msgid "The network type couldn't be detected. Contact can't be added." -msgstr "" - -#: mod/follow.php:179 mod/notifications.php:194 mod/notifications.php:286 -#: mod/unfollow.php:137 src/Module/Admin/Blocklist/Contact.php:83 -#: src/Module/Contact.php:624 -msgid "Profile URL" -msgstr "" - -#: mod/follow.php:183 mod/notifications.php:280 src/Model/Profile.php:816 -#: src/Module/Contact.php:634 -msgid "Tags:" -msgstr "" - -#: mod/follow.php:195 mod/unfollow.php:147 src/Model/Profile.php:916 -#: src/Module/Contact.php:863 -msgid "Status Messages and Posts" -msgstr "" - -#: mod/fsuggest.php:44 -msgid "Suggested contact not found." -msgstr "" - -#: mod/fsuggest.php:57 -msgid "Friend suggestion sent." -msgstr "" - -#: mod/fsuggest.php:79 -msgid "Suggest Friends" -msgstr "" - -#: mod/fsuggest.php:81 -#, php-format -msgid "Suggest a friend for %s" -msgstr "" - -#: mod/hcard.php:21 -msgid "No profile" -msgstr "" - -#: mod/item.php:127 -msgid "Unable to locate original post." -msgstr "" - -#: mod/item.php:330 -msgid "Empty post discarded." -msgstr "" - -#: mod/item.php:801 -#, php-format -msgid "" -"This message was sent to you by %s, a member of the Friendica social network." -msgstr "" - -#: mod/item.php:803 -#, php-format -msgid "You may visit them online at %s" -msgstr "" - -#: mod/item.php:804 -msgid "" -"Please contact the sender by replying to this post if you do not wish to " -"receive these messages." -msgstr "" - -#: mod/item.php:808 -#, php-format -msgid "%s posted an update." -msgstr "" - -#: mod/lockview.php:49 mod/lockview.php:60 -msgid "Remote privacy information not available." -msgstr "" - -#: mod/lockview.php:72 -msgid "Visible to:" -msgstr "" - -#: mod/lockview.php:78 mod/lockview.php:113 src/Content/Widget.php:193 -#: src/Module/Item/Compose.php:101 src/Module/Profile/Contacts.php:126 -#: src/Module/Contact.php:792 -msgid "Followers" -msgstr "" - -#: mod/lockview.php:84 mod/lockview.php:119 src/Module/Item/Compose.php:108 -msgid "Mutuals" -msgstr "" - -#: mod/lostpass.php:27 -msgid "No valid account found." -msgstr "" - -#: mod/lostpass.php:39 -msgid "Password reset request issued. Check your email." -msgstr "" - -#: mod/lostpass.php:45 -#, php-format -msgid "" -"\n" -"\t\tDear %1$s,\n" -"\t\t\tA request was recently received at \"%2$s\" to reset your account\n" -"\t\tpassword. In order to confirm this request, please select the " -"verification link\n" -"\t\tbelow or paste it into your web browser address bar.\n" -"\n" -"\t\tIf you did NOT request this change, please DO NOT follow the link\n" -"\t\tprovided and ignore and/or delete this email, the request will expire " -"shortly.\n" -"\n" -"\t\tYour password will not be changed unless we can verify that you\n" -"\t\tissued this request." -msgstr "" - -#: mod/lostpass.php:56 -#, php-format -msgid "" -"\n" -"\t\tFollow this link soon to verify your identity:\n" -"\n" -"\t\t%1$s\n" -"\n" -"\t\tYou will then receive a follow-up message containing the new password.\n" -"\t\tYou may change that password from your account settings page after " -"logging in.\n" -"\n" -"\t\tThe login details are as follows:\n" -"\n" -"\t\tSite Location:\t%2$s\n" -"\t\tLogin Name:\t%3$s" -msgstr "" - -#: mod/lostpass.php:75 -#, php-format -msgid "Password reset requested at %s" -msgstr "" - -#: mod/lostpass.php:90 -msgid "" -"Request could not be verified. (You may have previously submitted it.) " -"Password reset failed." -msgstr "" - -#: mod/lostpass.php:103 -msgid "Request has expired, please make a new one." -msgstr "" - -#: mod/lostpass.php:118 -msgid "Forgot your Password?" -msgstr "" - -#: mod/lostpass.php:119 -msgid "" -"Enter your email address and submit to have your password reset. Then check " -"your email for further instructions." -msgstr "" - -#: mod/lostpass.php:120 src/Module/Login.php:355 -msgid "Nickname or Email: " -msgstr "" - -#: mod/lostpass.php:121 -msgid "Reset" -msgstr "" - -#: mod/lostpass.php:136 src/Module/Login.php:367 -msgid "Password Reset" -msgstr "" - -#: mod/lostpass.php:137 -msgid "Your password has been reset as requested." -msgstr "" - -#: mod/lostpass.php:138 -msgid "Your new password is" -msgstr "" - -#: mod/lostpass.php:139 -msgid "Save or copy your new password - and then" -msgstr "" - -#: mod/lostpass.php:140 -msgid "click here to login" -msgstr "" - -#: mod/lostpass.php:141 -msgid "" -"Your password may be changed from the Settings page after " -"successful login." -msgstr "" - -#: mod/lostpass.php:148 -#, php-format -msgid "" -"\n" -"\t\t\tDear %1$s,\n" -"\t\t\t\tYour password has been changed as requested. Please retain this\n" -"\t\t\tinformation for your records (or change your password immediately to\n" -"\t\t\tsomething that you will remember).\n" -"\t\t" -msgstr "" - -#: mod/lostpass.php:154 -#, php-format -msgid "" -"\n" -"\t\t\tYour login details are as follows:\n" -"\n" -"\t\t\tSite Location:\t%1$s\n" -"\t\t\tLogin Name:\t%2$s\n" -"\t\t\tPassword:\t%3$s\n" -"\n" -"\t\t\tYou may change that password from your account settings page after " -"logging in.\n" -"\t\t" -msgstr "" - -#: mod/lostpass.php:170 -#, php-format -msgid "Your password has been changed at %s" -msgstr "" - -#: mod/match.php:49 -msgid "No keywords to match. Please add keywords to your default profile." -msgstr "" - -#: mod/match.php:115 src/Content/Pager.php:198 -msgid "first" -msgstr "" - -#: mod/match.php:120 src/Content/Pager.php:258 -msgid "next" -msgstr "" - -#: mod/match.php:130 src/Module/BaseSearchModule.php:96 -msgid "No matches" -msgstr "" - -#: mod/match.php:135 -msgid "Profile Match" -msgstr "" - -#: mod/message.php:33 mod/message.php:116 src/Content/Nav.php:257 -msgid "New Message" -msgstr "" - -#: mod/message.php:70 mod/wallmessage.php:60 -msgid "No recipient selected." -msgstr "" - -#: mod/message.php:74 -msgid "Unable to locate contact information." -msgstr "" - -#: mod/message.php:77 mod/wallmessage.php:66 -msgid "Message could not be sent." -msgstr "" - -#: mod/message.php:80 mod/wallmessage.php:69 -msgid "Message collection failure." -msgstr "" - -#: mod/message.php:83 mod/wallmessage.php:72 -msgid "Message sent." -msgstr "" - -#: mod/message.php:110 mod/notifications.php:48 mod/notifications.php:202 -#: mod/notifications.php:258 -msgid "Discard" -msgstr "" - -#: mod/message.php:123 view/theme/frio/theme.php:276 src/Content/Nav.php:254 -msgid "Messages" -msgstr "" - -#: mod/message.php:148 -msgid "Do you really want to delete this message?" -msgstr "" - -#: mod/message.php:166 -msgid "Conversation not found." -msgstr "" - -#: mod/message.php:171 -msgid "Message deleted." -msgstr "" - -#: mod/message.php:176 mod/message.php:190 -msgid "Conversation removed." -msgstr "" - -#: mod/message.php:204 mod/message.php:360 mod/wallmessage.php:123 -msgid "Please enter a link URL:" -msgstr "" - -#: mod/message.php:246 mod/wallmessage.php:128 -msgid "Send Private Message" -msgstr "" - -#: mod/message.php:247 mod/message.php:430 mod/wallmessage.php:130 -msgid "To:" -msgstr "" - -#: mod/message.php:251 mod/message.php:432 mod/wallmessage.php:131 -msgid "Subject:" -msgstr "" - -#: mod/message.php:255 mod/message.php:435 mod/wallmessage.php:137 -#: src/Module/Invite.php:150 -msgid "Your message:" -msgstr "" - -#: mod/message.php:289 -msgid "No messages." -msgstr "" - -#: mod/message.php:352 -msgid "Message not available." -msgstr "" - -#: mod/message.php:406 -msgid "Delete message" -msgstr "" - -#: mod/message.php:408 mod/message.php:540 -msgid "D, d M Y - g:i A" -msgstr "" - -#: mod/message.php:423 mod/message.php:537 -msgid "Delete conversation" -msgstr "" - -#: mod/message.php:425 -msgid "" -"No secure communications available. You may be able to " -"respond from the sender's profile page." -msgstr "" - -#: mod/message.php:429 -msgid "Send Reply" -msgstr "" - -#: mod/message.php:512 -#, php-format -msgid "Unknown sender - %s" -msgstr "" - -#: mod/message.php:514 -#, php-format -msgid "You and %s" -msgstr "" - -#: mod/message.php:516 -#, php-format -msgid "%s and You" -msgstr "" - -#: mod/message.php:543 -#, php-format -msgid "%d message" -msgid_plural "%d messages" -msgstr[0] "" -msgstr[1] "" - -#: mod/network.php:525 -#, php-format -msgid "" -"Warning: This group contains %s member from a network that doesn't allow non " -"public messages." -msgid_plural "" -"Warning: This group contains %s members from a network that doesn't allow " -"non public messages." -msgstr[0] "" -msgstr[1] "" - -#: mod/network.php:528 -msgid "Messages in this group won't be send to these receivers." -msgstr "" - -#: mod/network.php:595 -msgid "No such group" -msgstr "" - -#: mod/network.php:616 src/Module/Group.php:288 -msgid "Group is empty" -msgstr "" - -#: mod/network.php:620 -#, php-format -msgid "Group: %s" -msgstr "" - -#: mod/network.php:646 -msgid "Private messages to this person are at risk of public disclosure." -msgstr "" - -#: mod/network.php:649 src/Module/AllFriends.php:35 -#: src/Module/AllFriends.php:43 -msgid "Invalid contact." -msgstr "" - -#: mod/network.php:928 -msgid "Latest Activity" -msgstr "" - -#: mod/network.php:931 -msgid "Sort by latest activity" -msgstr "" - -#: mod/network.php:936 -msgid "Latest Posts" -msgstr "" - -#: mod/network.php:939 -msgid "Sort by post received date" -msgstr "" - -#: mod/network.php:946 mod/profiles.php:579 -msgid "Personal" -msgstr "" - -#: mod/network.php:949 -msgid "Posts that mention or involve you" -msgstr "" - -#: mod/network.php:956 -msgid "New" -msgstr "" - -#: mod/network.php:959 -msgid "Activity Stream - by date" -msgstr "" - -#: mod/network.php:967 -msgid "Shared Links" -msgstr "" - -#: mod/network.php:970 -msgid "Interesting Links" -msgstr "" - -#: mod/network.php:977 -msgid "Starred" -msgstr "" - -#: mod/network.php:980 -msgid "Favourite Posts" -msgstr "" - -#: mod/notifications.php:39 -msgid "Invalid request identifier." -msgstr "" - -#: mod/notifications.php:100 src/Content/Nav.php:249 -msgid "Notifications" -msgstr "" - -#: mod/notifications.php:119 -msgid "Network Notifications" -msgstr "" - -#: mod/notifications.php:124 -msgid "System Notifications" -msgstr "" - -#: mod/notifications.php:129 -msgid "Personal Notifications" -msgstr "" - -#: mod/notifications.php:134 -msgid "Home Notifications" -msgstr "" - -#: mod/notifications.php:157 -msgid "Show unread" -msgstr "" - -#: mod/notifications.php:157 -msgid "Show all" -msgstr "" - -#: mod/notifications.php:168 -msgid "Show Ignored Requests" -msgstr "" - -#: mod/notifications.php:168 -msgid "Hide Ignored Requests" -msgstr "" - -#: mod/notifications.php:181 mod/notifications.php:266 -msgid "Notification type:" -msgstr "" - -#: mod/notifications.php:184 -msgid "Suggested by:" -msgstr "" - -#: mod/notifications.php:196 mod/notifications.php:283 -#: src/Module/Contact.php:615 -msgid "Hide this contact from others" -msgstr "" - -#: mod/notifications.php:198 mod/notifications.php:292 -#: src/Model/Contact.php:1270 src/Module/Admin/Users.php:286 -msgid "Approve" -msgstr "" - -#: mod/notifications.php:218 -msgid "Claims to be known to you: " -msgstr "" - -#: mod/notifications.php:219 -msgid "yes" -msgstr "" - -#: mod/notifications.php:219 -msgid "no" -msgstr "" - -#: mod/notifications.php:220 mod/notifications.php:224 -msgid "Shall your connection be bidirectional or not?" -msgstr "" - -#: mod/notifications.php:221 mod/notifications.php:225 -#, php-format -msgid "" -"Accepting %s as a friend allows %s to subscribe to your posts, and you will " -"also receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:222 -#, php-format -msgid "" -"Accepting %s as a subscriber allows them to subscribe to your posts, but you " -"will not receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:226 -#, php-format -msgid "" -"Accepting %s as a sharer allows them to subscribe to your posts, but you " -"will not receive updates from them in your news feed." -msgstr "" - -#: mod/notifications.php:237 -msgid "Friend" -msgstr "" - -#: mod/notifications.php:238 -msgid "Sharer" -msgstr "" - -#: mod/notifications.php:238 -msgid "Subscriber" -msgstr "" - -#: mod/notifications.php:278 src/Model/Profile.php:449 -#: src/Model/Profile.php:828 src/Module/Contact.php:632 -#: src/Module/Directory.php:143 -msgid "About:" -msgstr "" - -#: mod/notifications.php:282 src/Model/Profile.php:446 -#: src/Model/Profile.php:767 src/Module/Directory.php:140 -msgid "Gender:" -msgstr "" - -#: mod/notifications.php:289 src/Model/Profile.php:554 -#: src/Module/Contact.php:316 -msgid "Network:" -msgstr "" - -#: mod/notifications.php:303 -msgid "No introductions." -msgstr "" - -#: mod/notifications.php:337 -#, php-format -msgid "No more %s notifications." -msgstr "" - -#: mod/openid.php:30 -msgid "OpenID protocol error. No ID returned." -msgstr "" - -#: mod/openid.php:67 -msgid "" -"Account not found. Please login to your existing account to add the OpenID " -"to it." -msgstr "" - -#: mod/openid.php:69 -msgid "" -"Account not found. Please register a new account or login to your existing " -"account to add the OpenID to it." -msgstr "" - -#: mod/openid.php:75 src/Module/Login.php:90 src/Module/Login.php:144 -msgid "Login failed." -msgstr "" - -#: mod/photos.php:112 src/Model/Profile.php:932 -msgid "Photo Albums" -msgstr "" - -#: mod/photos.php:113 mod/photos.php:1609 -msgid "Recent Photos" -msgstr "" - -#: mod/photos.php:115 mod/photos.php:1117 mod/photos.php:1611 -msgid "Upload New Photos" -msgstr "" - -#: mod/photos.php:133 mod/settings.php:62 src/Module/BaseSettingsModule.php:18 -msgid "everybody" -msgstr "" - -#: mod/photos.php:170 -msgid "Contact information unavailable" -msgstr "" - -#: mod/photos.php:192 -msgid "Album not found." -msgstr "" - -#: mod/photos.php:250 -msgid "Album successfully deleted" -msgstr "" - -#: mod/photos.php:252 -msgid "Album was empty." -msgstr "" - -#: mod/photos.php:578 -msgid "a photo" -msgstr "" - -#: mod/photos.php:578 -#, php-format -msgid "%1$s was tagged in %2$s by %3$s" -msgstr "" - -#: mod/photos.php:680 -msgid "Image upload didn't complete, please try again" -msgstr "" - -#: mod/photos.php:683 -msgid "Image file is missing" -msgstr "" - -#: mod/photos.php:688 -msgid "" -"Server can't accept new file upload at this time, please contact your " -"administrator" -msgstr "" - -#: mod/photos.php:714 -msgid "Image file is empty." -msgstr "" - -#: mod/photos.php:846 -msgid "No photos selected" -msgstr "" - -#: mod/photos.php:912 mod/videos.php:168 -msgid "Access to this item is restricted." -msgstr "" - -#: mod/photos.php:966 -msgid "Upload Photos" -msgstr "" - -#: mod/photos.php:970 mod/photos.php:1062 -msgid "New album name: " -msgstr "" - -#: mod/photos.php:971 -msgid "or select existing album:" -msgstr "" - -#: mod/photos.php:972 -msgid "Do not show a status post for this upload" -msgstr "" - -#: mod/photos.php:988 mod/photos.php:1356 mod/settings.php:1206 -msgid "Show to Groups" -msgstr "" - -#: mod/photos.php:989 mod/photos.php:1357 mod/settings.php:1207 -msgid "Show to Contacts" -msgstr "" - -#: mod/photos.php:1044 -msgid "Do you really want to delete this photo album and all its photos?" -msgstr "" - -#: mod/photos.php:1046 mod/photos.php:1067 -msgid "Delete Album" -msgstr "" - -#: mod/photos.php:1073 -msgid "Edit Album" -msgstr "" - -#: mod/photos.php:1074 -msgid "Drop Album" -msgstr "" - -#: mod/photos.php:1079 -msgid "Show Newest First" -msgstr "" - -#: mod/photos.php:1081 -msgid "Show Oldest First" -msgstr "" - -#: mod/photos.php:1102 mod/photos.php:1594 -msgid "View Photo" -msgstr "" - -#: mod/photos.php:1139 -msgid "Permission denied. Access to this item may be restricted." -msgstr "" - -#: mod/photos.php:1141 -msgid "Photo not available" -msgstr "" - -#: mod/photos.php:1151 -msgid "Do you really want to delete this photo?" -msgstr "" - -#: mod/photos.php:1153 mod/photos.php:1353 -msgid "Delete Photo" -msgstr "" - -#: mod/photos.php:1244 -msgid "View photo" -msgstr "" - -#: mod/photos.php:1246 -msgid "Edit photo" -msgstr "" - -#: mod/photos.php:1247 -msgid "Delete photo" -msgstr "" - -#: mod/photos.php:1248 -msgid "Use as profile photo" -msgstr "" - -#: mod/photos.php:1255 -msgid "Private Photo" -msgstr "" - -#: mod/photos.php:1261 -msgid "View Full Size" -msgstr "" - -#: mod/photos.php:1321 -msgid "Tags: " -msgstr "" - -#: mod/photos.php:1324 -msgid "[Select tags to remove]" -msgstr "" - -#: mod/photos.php:1339 -msgid "New album name" -msgstr "" - -#: mod/photos.php:1340 -msgid "Caption" -msgstr "" - -#: mod/photos.php:1341 -msgid "Add a Tag" -msgstr "" - -#: mod/photos.php:1341 -msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" -msgstr "" - -#: mod/photos.php:1342 -msgid "Do not rotate" -msgstr "" - -#: mod/photos.php:1343 -msgid "Rotate CW (right)" -msgstr "" - -#: mod/photos.php:1344 -msgid "Rotate CCW (left)" -msgstr "" - -#: mod/photos.php:1378 src/Object/Post.php:310 -msgid "I like this (toggle)" -msgstr "" - -#: mod/photos.php:1379 src/Object/Post.php:311 -msgid "I don't like this (toggle)" -msgstr "" - -#: mod/photos.php:1394 mod/photos.php:1433 mod/photos.php:1498 -#: src/Module/Item/Compose.php:180 src/Module/Contact.php:1023 -#: src/Object/Post.php:881 -msgid "This is you" -msgstr "" - -#: mod/photos.php:1396 mod/photos.php:1435 mod/photos.php:1500 -#: src/Object/Post.php:420 src/Object/Post.php:883 -msgid "Comment" -msgstr "" - -#: mod/photos.php:1529 -msgid "Map" -msgstr "" - -#: mod/photos.php:1600 mod/videos.php:245 -msgid "View Album" -msgstr "" - -#: mod/poke.php:178 -msgid "Poke/Prod" -msgstr "" - -#: mod/poke.php:179 -msgid "poke, prod or do other things to somebody" -msgstr "" - -#: mod/poke.php:180 -msgid "Recipient" -msgstr "" - -#: mod/poke.php:181 -msgid "Choose what you wish to do to recipient" -msgstr "" - -#: mod/poke.php:184 -msgid "Make this post private" -msgstr "" - -#: mod/profiles.php:62 -msgid "Profile deleted." -msgstr "" - -#: mod/profiles.php:78 mod/profiles.php:114 -msgid "Profile-" -msgstr "" - -#: mod/profiles.php:97 mod/profiles.php:135 -msgid "New profile created." -msgstr "" - -#: mod/profiles.php:120 -msgid "Profile unavailable to clone." -msgstr "" - -#: mod/profiles.php:206 -msgid "Profile Name is required." -msgstr "" - -#: mod/profiles.php:346 -msgid "Marital Status" -msgstr "" - -#: mod/profiles.php:349 -msgid "Romantic Partner" -msgstr "" - -#: mod/profiles.php:358 -msgid "Work/Employment" -msgstr "" - -#: mod/profiles.php:361 -msgid "Religion" -msgstr "" - -#: mod/profiles.php:364 -msgid "Political Views" -msgstr "" - -#: mod/profiles.php:367 -msgid "Gender" -msgstr "" - -#: mod/profiles.php:370 -msgid "Sexual Preference" -msgstr "" - -#: mod/profiles.php:373 -msgid "XMPP" -msgstr "" - -#: mod/profiles.php:376 -msgid "Homepage" -msgstr "" - -#: mod/profiles.php:379 mod/profiles.php:578 -msgid "Interests" -msgstr "" - -#: mod/profiles.php:382 -msgid "Address" -msgstr "" - -#: mod/profiles.php:389 mod/profiles.php:574 -msgid "Location" -msgstr "" - -#: mod/profiles.php:469 -msgid "Profile updated." -msgstr "" - -#: mod/profiles.php:523 -msgid "Hide contacts and friends:" -msgstr "" - -#: mod/profiles.php:528 -msgid "Hide your contact/friend list from viewers of this profile?" -msgstr "" - -#: mod/profiles.php:548 -msgid "Show more profile fields:" -msgstr "" - -#: mod/profiles.php:560 -msgid "Profile Actions" -msgstr "" - -#: mod/profiles.php:561 -msgid "Edit Profile Details" -msgstr "" - -#: mod/profiles.php:563 -msgid "Change Profile Photo" -msgstr "" - -#: mod/profiles.php:565 -msgid "View this profile" -msgstr "" - -#: mod/profiles.php:566 -msgid "View all profiles" -msgstr "" - -#: mod/profiles.php:567 mod/profiles.php:662 src/Model/Profile.php:419 -msgid "Edit visibility" -msgstr "" - -#: mod/profiles.php:568 -msgid "Create a new profile using these settings" -msgstr "" - -#: mod/profiles.php:569 -msgid "Clone this profile" -msgstr "" - -#: mod/profiles.php:570 -msgid "Delete this profile" -msgstr "" - -#: mod/profiles.php:572 -msgid "Basic information" -msgstr "" - -#: mod/profiles.php:573 -msgid "Profile picture" -msgstr "" - -#: mod/profiles.php:575 -msgid "Preferences" -msgstr "" - -#: mod/profiles.php:576 -msgid "Status information" -msgstr "" - -#: mod/profiles.php:577 -msgid "Additional information" -msgstr "" - -#: mod/profiles.php:580 -msgid "Relation" -msgstr "" - -#: mod/profiles.php:581 src/Util/Temporal.php:79 src/Util/Temporal.php:81 -msgid "Miscellaneous" -msgstr "" - -#: mod/profiles.php:584 -msgid "Your Gender:" -msgstr "" - -#: mod/profiles.php:585 -msgid " Marital Status:" -msgstr "" - -#: mod/profiles.php:586 src/Model/Profile.php:804 -msgid "Sexual Preference:" -msgstr "" - -#: mod/profiles.php:587 -msgid "Example: fishing photography software" -msgstr "" - -#: mod/profiles.php:592 -msgid "Profile Name:" -msgstr "" - -#: mod/profiles.php:594 -msgid "" -"This is your public profile.
It may " -"be visible to anybody using the internet." -msgstr "" - -#: mod/profiles.php:595 -msgid "Your Full Name:" -msgstr "" - -#: mod/profiles.php:596 -msgid "Title/Description:" -msgstr "" - -#: mod/profiles.php:599 -msgid "Street Address:" -msgstr "" - -#: mod/profiles.php:600 -msgid "Locality/City:" -msgstr "" - -#: mod/profiles.php:601 -msgid "Region/State:" -msgstr "" - -#: mod/profiles.php:602 -msgid "Postal/Zip Code:" -msgstr "" - -#: mod/profiles.php:603 -msgid "Country:" -msgstr "" - -#: mod/profiles.php:604 src/Util/Temporal.php:148 -msgid "Age: " -msgstr "" - -#: mod/profiles.php:607 -msgid "Who: (if applicable)" -msgstr "" - -#: mod/profiles.php:607 -msgid "Examples: cathy123, Cathy Williams, cathy@example.com" -msgstr "" - -#: mod/profiles.php:608 -msgid "Since [date]:" -msgstr "" - -#: mod/profiles.php:610 -msgid "Tell us about yourself..." -msgstr "" - -#: mod/profiles.php:611 -msgid "XMPP (Jabber) address:" -msgstr "" - -#: mod/profiles.php:611 -msgid "" -"The XMPP address will be propagated to your contacts so that they can follow " -"you." -msgstr "" - -#: mod/profiles.php:612 -msgid "Homepage URL:" -msgstr "" - -#: mod/profiles.php:613 src/Model/Profile.php:812 -msgid "Hometown:" -msgstr "" - -#: mod/profiles.php:614 src/Model/Profile.php:820 -msgid "Political Views:" -msgstr "" - -#: mod/profiles.php:615 -msgid "Religious Views:" -msgstr "" - -#: mod/profiles.php:616 -msgid "Public Keywords:" -msgstr "" - -#: mod/profiles.php:616 -msgid "(Used for suggesting potential friends, can be seen by others)" -msgstr "" - -#: mod/profiles.php:617 -msgid "Private Keywords:" -msgstr "" - -#: mod/profiles.php:617 -msgid "(Used for searching profiles, never shown to others)" -msgstr "" - -#: mod/profiles.php:618 src/Model/Profile.php:836 -msgid "Likes:" -msgstr "" - -#: mod/profiles.php:619 src/Model/Profile.php:840 -msgid "Dislikes:" -msgstr "" - -#: mod/profiles.php:620 -msgid "Musical interests" -msgstr "" - -#: mod/profiles.php:621 -msgid "Books, literature" -msgstr "" - -#: mod/profiles.php:622 -msgid "Television" -msgstr "" - -#: mod/profiles.php:623 -msgid "Film/dance/culture/entertainment" -msgstr "" - -#: mod/profiles.php:624 -msgid "Hobbies/Interests" -msgstr "" - -#: mod/profiles.php:625 -msgid "Love/romance" -msgstr "" - -#: mod/profiles.php:626 -msgid "Work/employment" -msgstr "" - -#: mod/profiles.php:627 -msgid "School/education" -msgstr "" - -#: mod/profiles.php:628 -msgid "Contact information and Social Networks" -msgstr "" - -#: mod/profiles.php:659 src/Model/Profile.php:415 -msgid "Profile Image" -msgstr "" - -#: mod/profiles.php:661 src/Model/Profile.php:418 -msgid "visible to everybody" -msgstr "" - -#: mod/profiles.php:668 -msgid "Edit/Manage Profiles" -msgstr "" - -#: mod/profiles.php:669 src/Model/Profile.php:405 src/Model/Profile.php:426 -msgid "Change profile photo" -msgstr "" - -#: mod/profiles.php:670 src/Model/Profile.php:406 -msgid "Create New Profile" -msgstr "" - -#: mod/regmod.php:53 -msgid "Account approved." -msgstr "" - -#: mod/regmod.php:77 -#, php-format -msgid "Registration revoked for %s" -msgstr "" - -#: mod/regmod.php:84 -msgid "Please login." -msgstr "" - -#: mod/settings.php:67 src/Module/BaseSettingsModule.php:24 -msgid "Account" -msgstr "" - -#: mod/settings.php:75 src/Module/Settings/TwoFactor/Index.php:89 -#: src/Module/TwoFactor/Verify.php:62 src/Module/BaseSettingsModule.php:31 -msgid "Two-factor authentication" -msgstr "" - -#: mod/settings.php:82 src/Content/Nav.php:266 src/Model/Profile.php:398 -#: src/Module/BaseSettingsModule.php:38 -msgid "Profiles" -msgstr "" - -#: mod/settings.php:90 src/Module/BaseAdminModule.php:84 -#: src/Module/BaseSettingsModule.php:46 -msgid "Additional features" -msgstr "" - -#: mod/settings.php:98 src/Module/BaseSettingsModule.php:54 -msgid "Display" -msgstr "" - -#: mod/settings.php:105 mod/settings.php:835 -#: src/Module/BaseSettingsModule.php:61 -msgid "Social Networks" -msgstr "" - -#: mod/settings.php:112 src/Module/Admin/Addons/Details.php:100 -#: src/Module/Admin/Addons/Index.php:51 src/Module/BaseAdminModule.php:82 -#: src/Module/BaseSettingsModule.php:68 -msgid "Addons" -msgstr "" - -#: mod/settings.php:119 src/Module/BaseSettingsModule.php:75 -msgid "Delegations" -msgstr "" - -#: mod/settings.php:126 src/Module/BaseSettingsModule.php:82 -msgid "Connected apps" -msgstr "" - -#: mod/settings.php:133 src/Module/Settings/UserExport.php:52 -#: src/Module/BaseSettingsModule.php:89 -msgid "Export personal data" -msgstr "" - -#: mod/settings.php:140 src/Module/BaseSettingsModule.php:96 -msgid "Remove account" -msgstr "" - -#: mod/settings.php:149 view/theme/frio/theme.php:277 src/Content/Nav.php:263 -#: src/Module/Admin/Addons/Details.php:102 -#: src/Module/Admin/Themes/Details.php:107 src/Module/Welcome.php:33 -#: src/Module/BaseSettingsModule.php:105 -msgid "Settings" -msgstr "" - -#: mod/settings.php:192 -msgid "Missing some important data!" -msgstr "" - -#: mod/settings.php:194 mod/settings.php:695 src/Module/Contact.php:822 -msgid "Update" -msgstr "" - -#: mod/settings.php:301 -msgid "Failed to connect with email account using the settings provided." -msgstr "" - -#: mod/settings.php:306 -msgid "Email settings updated." -msgstr "" - -#: mod/settings.php:322 -msgid "Features updated" -msgstr "" - -#: mod/settings.php:383 -msgid "The theme you chose isn't available." -msgstr "" - -#: mod/settings.php:399 -msgid "Contact CSV file upload error" -msgstr "" - -#: mod/settings.php:413 -msgid "Importing Contacts done" -msgstr "" - -#: mod/settings.php:422 -msgid "Relocate message has been send to your contacts" -msgstr "" - -#: mod/settings.php:434 -msgid "Passwords do not match." -msgstr "" - -#: mod/settings.php:442 src/Console/NewPassword.php:101 -msgid "Password update failed. Please try again." -msgstr "" - -#: mod/settings.php:445 src/Console/NewPassword.php:104 -msgid "Password changed." -msgstr "" - -#: mod/settings.php:448 -msgid "Password unchanged." -msgstr "" - -#: mod/settings.php:530 -msgid " Please use a shorter name." -msgstr "" - -#: mod/settings.php:533 -msgid " Name too short." -msgstr "" - -#: mod/settings.php:540 src/Module/Settings/TwoFactor/Index.php:72 -msgid "Wrong Password" -msgstr "" - -#: mod/settings.php:545 -msgid "Invalid email." -msgstr "" - -#: mod/settings.php:551 -msgid "Cannot change to that email." -msgstr "" - -#: mod/settings.php:589 -msgid "Private forum has no privacy permissions. Using default privacy group." -msgstr "" - -#: mod/settings.php:592 -msgid "Private forum has no privacy permissions and no default privacy group." -msgstr "" - -#: mod/settings.php:609 -msgid "Settings updated." -msgstr "" - -#: mod/settings.php:668 mod/settings.php:694 mod/settings.php:728 -msgid "Add application" -msgstr "" - -#: mod/settings.php:669 mod/settings.php:776 mod/settings.php:866 -#: mod/settings.php:945 mod/settings.php:1170 -#: src/Module/Admin/Addons/Index.php:52 src/Module/Admin/Features.php:69 -#: src/Module/Admin/Logs/Settings.php:65 src/Module/Admin/Themes/Index.php:97 -#: src/Module/Admin/Tos.php:50 src/Module/Admin/Site.php:568 -#: src/Module/Settings/Delegation.php:158 -msgid "Save Settings" -msgstr "" - -#: mod/settings.php:672 mod/settings.php:698 -msgid "Consumer Key" -msgstr "" - -#: mod/settings.php:673 mod/settings.php:699 -msgid "Consumer Secret" -msgstr "" - -#: mod/settings.php:674 mod/settings.php:700 -msgid "Redirect" -msgstr "" - -#: mod/settings.php:675 mod/settings.php:701 -msgid "Icon url" -msgstr "" - -#: mod/settings.php:686 -msgid "You can't edit this application." -msgstr "" - -#: mod/settings.php:727 -msgid "Connected Apps" -msgstr "" - -#: mod/settings.php:729 src/Object/Post.php:165 src/Object/Post.php:167 -msgid "Edit" -msgstr "" - -#: mod/settings.php:731 -msgid "Client key starts with" -msgstr "" - -#: mod/settings.php:732 -msgid "No name" -msgstr "" - -#: mod/settings.php:733 -msgid "Remove authorization" -msgstr "" - -#: mod/settings.php:744 -msgid "No Addon settings configured" -msgstr "" - -#: mod/settings.php:753 -msgid "Addon Settings" -msgstr "" - -#: mod/settings.php:767 src/Module/Admin/Features.php:58 -#: src/Module/Admin/Features.php:59 -msgid "Off" -msgstr "" - -#: mod/settings.php:767 src/Module/Admin/Features.php:58 -#: src/Module/Admin/Features.php:59 -msgid "On" -msgstr "" - -#: mod/settings.php:774 -msgid "Additional Features" -msgstr "" - -#: mod/settings.php:798 src/Content/ContactSelector.php:120 -msgid "Diaspora" -msgstr "" - -#: mod/settings.php:798 mod/settings.php:799 -msgid "enabled" -msgstr "" - -#: mod/settings.php:798 mod/settings.php:799 -msgid "disabled" -msgstr "" - -#: mod/settings.php:798 mod/settings.php:799 -#, php-format -msgid "Built-in support for %s connectivity is %s" -msgstr "" - -#: mod/settings.php:799 -msgid "GNU Social (OStatus)" -msgstr "" - -#: mod/settings.php:830 -msgid "Email access is disabled on this site." -msgstr "" - -#: mod/settings.php:840 -msgid "General Social Media Settings" -msgstr "" - -#: mod/settings.php:841 -msgid "Accept only top level posts by contacts you follow" -msgstr "" - -#: mod/settings.php:841 -msgid "" -"The system does an auto completion of threads when a comment arrives. This " -"has got the side effect that you can receive posts that had been started by " -"a non-follower but had been commented by someone you follow. This setting " -"deactivates this behaviour. When activated, you strictly only will receive " -"posts from people you really do follow." -msgstr "" - -#: mod/settings.php:842 -msgid "Disable Content Warning" -msgstr "" - -#: mod/settings.php:842 -msgid "" -"Users on networks like Mastodon or Pleroma are able to set a content warning " -"field which collapse their post by default. This disables the automatic " -"collapsing and sets the content warning as the post title. Doesn't affect " -"any other content filtering you eventually set up." -msgstr "" - -#: mod/settings.php:843 -msgid "Disable intelligent shortening" -msgstr "" - -#: mod/settings.php:843 -msgid "" -"Normally the system tries to find the best link to add to shortened posts. " -"If this option is enabled then every shortened post will always point to the " -"original friendica post." -msgstr "" - -#: mod/settings.php:844 -msgid "Automatically follow any GNU Social (OStatus) followers/mentioners" -msgstr "" - -#: mod/settings.php:844 -msgid "" -"If you receive a message from an unknown OStatus user, this option decides " -"what to do. If it is checked, a new contact will be created for every " -"unknown user." -msgstr "" - -#: mod/settings.php:845 -msgid "Default group for OStatus contacts" -msgstr "" - -#: mod/settings.php:846 -msgid "Your legacy GNU Social account" -msgstr "" - -#: mod/settings.php:846 -msgid "" -"If you enter your old GNU Social/Statusnet account name here (in the format " -"user@domain.tld), your contacts will be added automatically. The field will " -"be emptied when done." -msgstr "" - -#: mod/settings.php:849 -msgid "Repair OStatus subscriptions" -msgstr "" - -#: mod/settings.php:853 -msgid "Email/Mailbox Setup" -msgstr "" - -#: mod/settings.php:854 -msgid "" -"If you wish to communicate with email contacts using this service " -"(optional), please specify how to connect to your mailbox." -msgstr "" - -#: mod/settings.php:855 -msgid "Last successful email check:" -msgstr "" - -#: mod/settings.php:857 -msgid "IMAP server name:" -msgstr "" - -#: mod/settings.php:858 -msgid "IMAP port:" -msgstr "" - -#: mod/settings.php:859 -msgid "Security:" -msgstr "" - -#: mod/settings.php:859 mod/settings.php:864 -msgid "None" -msgstr "" - -#: mod/settings.php:860 -msgid "Email login name:" -msgstr "" - -#: mod/settings.php:861 -msgid "Email password:" -msgstr "" - -#: mod/settings.php:862 -msgid "Reply-to address:" -msgstr "" - -#: mod/settings.php:863 -msgid "Send public posts to all email contacts:" -msgstr "" - -#: mod/settings.php:864 -msgid "Action after import:" -msgstr "" - -#: mod/settings.php:864 src/Content/Nav.php:251 -msgid "Mark as seen" -msgstr "" - -#: mod/settings.php:864 -msgid "Move to folder" -msgstr "" - -#: mod/settings.php:865 -msgid "Move to folder:" -msgstr "" - -#: mod/settings.php:889 src/Module/Admin/Site.php:433 -msgid "No special theme for mobile devices" -msgstr "" - -#: mod/settings.php:897 -#, php-format -msgid "%s - (Unsupported)" -msgstr "" - -#: mod/settings.php:899 src/Module/Admin/Site.php:450 -#, php-format -msgid "%s - (Experimental)" -msgstr "" - -#: mod/settings.php:927 src/Core/L10n/L10n.php:404 src/Model/Event.php:396 -msgid "Sunday" -msgstr "" - -#: mod/settings.php:927 src/Core/L10n/L10n.php:404 src/Model/Event.php:397 -msgid "Monday" -msgstr "" - -#: mod/settings.php:943 -msgid "Display Settings" -msgstr "" - -#: mod/settings.php:949 -msgid "Display Theme:" -msgstr "" - -#: mod/settings.php:950 -msgid "Mobile Theme:" -msgstr "" - -#: mod/settings.php:951 -msgid "Suppress warning of insecure networks" -msgstr "" - -#: mod/settings.php:951 -msgid "" -"Should the system suppress the warning that the current group contains " -"members of networks that can't receive non public postings." -msgstr "" - -#: mod/settings.php:952 -msgid "Update browser every xx seconds" -msgstr "" - -#: mod/settings.php:952 -msgid "Minimum of 10 seconds. Enter -1 to disable it." -msgstr "" - -#: mod/settings.php:953 -msgid "Number of items to display per page:" -msgstr "" - -#: mod/settings.php:953 mod/settings.php:954 -msgid "Maximum of 100 items" -msgstr "" - -#: mod/settings.php:954 -msgid "Number of items to display per page when viewed from mobile device:" -msgstr "" - -#: mod/settings.php:955 -msgid "Don't show emoticons" -msgstr "" - -#: mod/settings.php:956 -msgid "Calendar" -msgstr "" - -#: mod/settings.php:957 -msgid "Beginning of week:" -msgstr "" - -#: mod/settings.php:958 -msgid "Don't show notices" -msgstr "" - -#: mod/settings.php:959 -msgid "Infinite scroll" -msgstr "" - -#: mod/settings.php:960 -msgid "Automatic updates only at the top of the network page" -msgstr "" - -#: mod/settings.php:960 -msgid "" -"When disabled, the network page is updated all the time, which could be " -"confusing while reading." -msgstr "" - -#: mod/settings.php:961 -msgid "Bandwidth Saver Mode" -msgstr "" - -#: mod/settings.php:961 -msgid "" -"When enabled, embedded content is not displayed on automatic updates, they " -"only show on page reload." -msgstr "" - -#: mod/settings.php:962 -msgid "Smart Threading" -msgstr "" - -#: mod/settings.php:962 -msgid "" -"When enabled, suppress extraneous thread indentation while keeping it where " -"it matters. Only works if threading is available and enabled." -msgstr "" - -#: mod/settings.php:964 -msgid "General Theme Settings" -msgstr "" - -#: mod/settings.php:965 -msgid "Custom Theme Settings" -msgstr "" - -#: mod/settings.php:966 -msgid "Content Settings" -msgstr "" - -#: mod/settings.php:967 view/theme/duepuntozero/config.php:73 +#: view/theme/vier/config.php:123 view/theme/duepuntozero/config.php:73 #: view/theme/frio/config.php:128 view/theme/quattro/config.php:75 -#: view/theme/vier/config.php:123 +#: mod/settings.php:976 msgid "Theme settings" msgstr "" -#: mod/settings.php:981 -msgid "Unable to find your profile. Please contact your admin." +#: view/theme/vier/config.php:124 +msgid "Set style" msgstr "" -#: mod/settings.php:1020 -msgid "Account Types" +#: view/theme/vier/config.php:125 +msgid "Community Pages" msgstr "" -#: mod/settings.php:1021 -msgid "Personal Page Subtypes" +#: view/theme/vier/config.php:127 +msgid "Help or @NewHere ?" msgstr "" -#: mod/settings.php:1022 -msgid "Community Forum Subtypes" -msgstr "" - -#: mod/settings.php:1029 src/Module/Admin/Users.php:229 -msgid "Personal Page" -msgstr "" - -#: mod/settings.php:1030 -msgid "Account for a personal profile." -msgstr "" - -#: mod/settings.php:1033 src/Module/Admin/Users.php:230 -msgid "Organisation Page" -msgstr "" - -#: mod/settings.php:1034 -msgid "" -"Account for an organisation that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1037 src/Module/Admin/Users.php:231 -msgid "News Page" -msgstr "" - -#: mod/settings.php:1038 -msgid "" -"Account for a news reflector that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1041 src/Module/Admin/Users.php:232 -msgid "Community Forum" -msgstr "" - -#: mod/settings.php:1042 -msgid "Account for community discussions." -msgstr "" - -#: mod/settings.php:1045 src/Module/Admin/Users.php:222 -msgid "Normal Account Page" -msgstr "" - -#: mod/settings.php:1046 -msgid "" -"Account for a regular personal profile that requires manual approval of " -"\"Friends\" and \"Followers\"." -msgstr "" - -#: mod/settings.php:1049 src/Module/Admin/Users.php:223 -msgid "Soapbox Page" -msgstr "" - -#: mod/settings.php:1050 -msgid "" -"Account for a public profile that automatically approves contact requests as " -"\"Followers\"." -msgstr "" - -#: mod/settings.php:1053 src/Module/Admin/Users.php:224 -msgid "Public Forum" -msgstr "" - -#: mod/settings.php:1054 -msgid "Automatically approves all contact requests." -msgstr "" - -#: mod/settings.php:1057 src/Module/Admin/Users.php:225 -msgid "Automatic Friend Page" -msgstr "" - -#: mod/settings.php:1058 -msgid "" -"Account for a popular profile that automatically approves contact requests " -"as \"Friends\"." -msgstr "" - -#: mod/settings.php:1061 -msgid "Private Forum [Experimental]" -msgstr "" - -#: mod/settings.php:1062 -msgid "Requires manual approval of contact requests." -msgstr "" - -#: mod/settings.php:1073 -msgid "OpenID:" -msgstr "" - -#: mod/settings.php:1073 -msgid "(Optional) Allow this OpenID to login to this account." -msgstr "" - -#: mod/settings.php:1081 -msgid "Publish your default profile in your local site directory?" -msgstr "" - -#: mod/settings.php:1081 -#, php-format -msgid "" -"Your profile will be published in this node's local " -"directory. Your profile details may be publicly visible depending on the " -"system settings." -msgstr "" - -#: mod/settings.php:1087 -msgid "Publish your default profile in the global social directory?" -msgstr "" - -#: mod/settings.php:1087 -#, php-format -msgid "" -"Your profile will be published in the global friendica directories (e.g. %s). Your profile will be visible in public." -msgstr "" - -#: mod/settings.php:1087 -msgid "" -"This setting also determines whether Friendica will inform search engines " -"that your profile should be indexed or not. Third-party search engines may " -"or may not respect this setting." -msgstr "" - -#: mod/settings.php:1094 -msgid "Hide your contact/friend list from viewers of your default profile?" -msgstr "" - -#: mod/settings.php:1094 -msgid "" -"Your contact list won't be shown in your default profile page. You can " -"decide to show your contact list separately for each additional profile you " -"create" -msgstr "" - -#: mod/settings.php:1098 -msgid "Hide your profile details from anonymous viewers?" -msgstr "" - -#: mod/settings.php:1098 -msgid "" -"Anonymous visitors will only see your profile picture, your display name and " -"the nickname you are using on your profile page. Your public posts and " -"replies will still be accessible by other means." -msgstr "" - -#: mod/settings.php:1102 -msgid "Allow friends to post to your profile page?" -msgstr "" - -#: mod/settings.php:1102 -msgid "" -"Your contacts may write posts on your profile wall. These posts will be " -"distributed to your contacts" -msgstr "" - -#: mod/settings.php:1106 -msgid "Allow friends to tag your posts?" -msgstr "" - -#: mod/settings.php:1106 -msgid "Your contacts can add additional tags to your posts." -msgstr "" - -#: mod/settings.php:1110 -msgid "Allow us to suggest you as a potential friend to new members?" -msgstr "" - -#: mod/settings.php:1110 -msgid "If you like, Friendica may suggest new members to add you as a contact." -msgstr "" - -#: mod/settings.php:1114 -msgid "Permit unknown people to send you private mail?" -msgstr "" - -#: mod/settings.php:1114 -msgid "" -"Friendica network users may send you private messages even if they are not " -"in your contact list." -msgstr "" - -#: mod/settings.php:1118 -msgid "Profile is not published." -msgstr "" - -#: mod/settings.php:1124 -#, php-format -msgid "Your Identity Address is '%s' or '%s'." -msgstr "" - -#: mod/settings.php:1131 -msgid "Automatically expire posts after this many days:" -msgstr "" - -#: mod/settings.php:1131 -msgid "If empty, posts will not expire. Expired posts will be deleted" -msgstr "" - -#: mod/settings.php:1132 -msgid "Advanced expiration settings" -msgstr "" - -#: mod/settings.php:1133 -msgid "Advanced Expiration" -msgstr "" - -#: mod/settings.php:1134 -msgid "Expire posts:" -msgstr "" - -#: mod/settings.php:1135 -msgid "Expire personal notes:" -msgstr "" - -#: mod/settings.php:1136 -msgid "Expire starred posts:" -msgstr "" - -#: mod/settings.php:1137 -msgid "Expire photos:" -msgstr "" - -#: mod/settings.php:1138 -msgid "Only expire posts by others:" -msgstr "" - -#: mod/settings.php:1168 -msgid "Account Settings" -msgstr "" - -#: mod/settings.php:1176 -msgid "Password Settings" -msgstr "" - -#: mod/settings.php:1177 src/Module/Register.php:124 -msgid "New Password:" -msgstr "" - -#: mod/settings.php:1177 -msgid "" -"Allowed characters are a-z, A-Z, 0-9 and special characters except white " -"spaces, accentuated letters and colon (:)." -msgstr "" - -#: mod/settings.php:1178 src/Module/Register.php:125 -msgid "Confirm:" -msgstr "" - -#: mod/settings.php:1178 -msgid "Leave password fields blank unless changing" -msgstr "" - -#: mod/settings.php:1179 -msgid "Current Password:" -msgstr "" - -#: mod/settings.php:1179 mod/settings.php:1180 -msgid "Your current password to confirm the changes" -msgstr "" - -#: mod/settings.php:1180 -msgid "Password:" -msgstr "" - -#: mod/settings.php:1183 -msgid "Delete OpenID URL" -msgstr "" - -#: mod/settings.php:1185 -msgid "Basic Settings" -msgstr "" - -#: mod/settings.php:1186 src/Model/Profile.php:760 -msgid "Full Name:" -msgstr "" - -#: mod/settings.php:1187 -msgid "Email Address:" -msgstr "" - -#: mod/settings.php:1188 -msgid "Your Timezone:" -msgstr "" - -#: mod/settings.php:1189 -msgid "Your Language:" -msgstr "" - -#: mod/settings.php:1189 -msgid "" -"Set the language we use to show you friendica interface and to send you " -"emails" -msgstr "" - -#: mod/settings.php:1190 -msgid "Default Post Location:" -msgstr "" - -#: mod/settings.php:1191 -msgid "Use Browser Location:" -msgstr "" - -#: mod/settings.php:1194 -msgid "Security and Privacy Settings" -msgstr "" - -#: mod/settings.php:1196 -msgid "Maximum Friend Requests/Day:" -msgstr "" - -#: mod/settings.php:1196 mod/settings.php:1225 -msgid "(to prevent spam abuse)" -msgstr "" - -#: mod/settings.php:1197 -msgid "Default Post Permissions" -msgstr "" - -#: mod/settings.php:1198 -msgid "(click to open/close)" -msgstr "" - -#: mod/settings.php:1208 -msgid "Default Private Post" -msgstr "" - -#: mod/settings.php:1209 -msgid "Default Public Post" -msgstr "" - -#: mod/settings.php:1213 -msgid "Default Permissions for New Posts" -msgstr "" - -#: mod/settings.php:1225 -msgid "Maximum private messages per day from unknown people:" -msgstr "" - -#: mod/settings.php:1228 -msgid "Notification Settings" -msgstr "" - -#: mod/settings.php:1229 -msgid "Send a notification email when:" -msgstr "" - -#: mod/settings.php:1230 -msgid "You receive an introduction" -msgstr "" - -#: mod/settings.php:1231 -msgid "Your introductions are confirmed" -msgstr "" - -#: mod/settings.php:1232 -msgid "Someone writes on your profile wall" -msgstr "" - -#: mod/settings.php:1233 -msgid "Someone writes a followup comment" -msgstr "" - -#: mod/settings.php:1234 -msgid "You receive a private message" -msgstr "" - -#: mod/settings.php:1235 -msgid "You receive a friend suggestion" -msgstr "" - -#: mod/settings.php:1236 -msgid "You are tagged in a post" -msgstr "" - -#: mod/settings.php:1237 -msgid "You are poked/prodded/etc. in a post" -msgstr "" - -#: mod/settings.php:1239 -msgid "Activate desktop notifications" -msgstr "" - -#: mod/settings.php:1239 -msgid "Show desktop popup on new notifications" -msgstr "" - -#: mod/settings.php:1241 -msgid "Text-only notification emails" -msgstr "" - -#: mod/settings.php:1243 -msgid "Send text only notification emails, without the html part" -msgstr "" - -#: mod/settings.php:1245 -msgid "Show detailled notifications" -msgstr "" - -#: mod/settings.php:1247 -msgid "" -"Per default, notifications are condensed to a single notification per item. " -"When enabled every notification is displayed." -msgstr "" - -#: mod/settings.php:1249 -msgid "Advanced Account/Page Type Settings" -msgstr "" - -#: mod/settings.php:1250 -msgid "Change the behaviour of this account for special situations" -msgstr "" - -#: mod/settings.php:1253 -msgid "Import Contacts" -msgstr "" - -#: mod/settings.php:1254 -msgid "" -"Upload a CSV file that contains the handle of your followed accounts in the " -"first column you exported from the old account." -msgstr "" - -#: mod/settings.php:1255 -msgid "Upload File" -msgstr "" - -#: mod/settings.php:1257 -msgid "Relocate" -msgstr "" - -#: mod/settings.php:1258 -msgid "" -"If you have moved this profile from another server, and some of your " -"contacts don't receive your updates, try pushing this button." -msgstr "" - -#: mod/settings.php:1259 -msgid "Resend relocate message to contacts" -msgstr "" - -#: mod/subthread.php:107 -#, php-format -msgid "%1$s is following %2$s's %3$s" -msgstr "" - -#: mod/tagrm.php:31 -msgid "Tag(s) removed" -msgstr "" - -#: mod/tagrm.php:101 -msgid "Remove Item Tag" -msgstr "" - -#: mod/tagrm.php:103 -msgid "Select a tag to remove: " -msgstr "" - -#: mod/tagrm.php:114 src/Module/Settings/Delegation.php:167 -msgid "Remove" -msgstr "" - -#: mod/uimport.php:30 -msgid "User imports on closed servers can only be done by an administrator." -msgstr "" - -#: mod/uimport.php:39 src/Module/Register.php:60 -msgid "" -"This site has exceeded the number of allowed daily account registrations. " -"Please try again tomorrow." -msgstr "" - -#: mod/uimport.php:46 src/Module/Register.php:135 -msgid "Import" -msgstr "" - -#: mod/uimport.php:48 -msgid "Move account" -msgstr "" - -#: mod/uimport.php:49 -msgid "You can import an account from another Friendica server." -msgstr "" - -#: mod/uimport.php:50 -msgid "" -"You need to export your account from the old server and upload it here. We " -"will recreate your old account here with all your contacts. We will try also " -"to inform your friends that you moved here." -msgstr "" - -#: mod/uimport.php:51 -msgid "" -"This feature is experimental. We can't import contacts from the OStatus " -"network (GNU Social/Statusnet) or from Diaspora" -msgstr "" - -#: mod/uimport.php:52 -msgid "Account file" -msgstr "" - -#: mod/uimport.php:52 -msgid "" -"To export your account, go to \"Settings->Export your personal data\" and " -"select \"Export account\"" -msgstr "" - -#: mod/unfollow.php:36 mod/unfollow.php:92 -msgid "You aren't following this contact." -msgstr "" - -#: mod/unfollow.php:46 mod/unfollow.php:98 -msgid "Unfollowing is currently not supported by your network." -msgstr "" - -#: mod/unfollow.php:67 -msgid "Contact unfollowed" -msgstr "" - -#: mod/unfollow.php:118 -msgid "Disconnect/Unfollow" -msgstr "" - -#: mod/videos.php:120 -msgid "No videos selected" -msgstr "" - -#: mod/videos.php:238 src/Model/Item.php:3514 -msgid "View Video" -msgstr "" - -#: mod/videos.php:253 -msgid "Recent Videos" -msgstr "" - -#: mod/videos.php:255 -msgid "Upload New Videos" -msgstr "" - -#: mod/wall_attach.php:27 mod/wall_attach.php:34 mod/wall_attach.php:72 -#: mod/wall_upload.php:43 mod/wall_upload.php:59 mod/wall_upload.php:104 -#: mod/wall_upload.php:155 mod/wall_upload.php:158 -msgid "Invalid request." -msgstr "" - -#: mod/wall_attach.php:90 -msgid "Sorry, maybe your upload is bigger than the PHP configuration allows" -msgstr "" - -#: mod/wall_attach.php:90 -msgid "Or - did you try to upload an empty file?" -msgstr "" - -#: mod/wall_attach.php:101 -#, php-format -msgid "File exceeds size limit of %s" -msgstr "" - -#: mod/wall_attach.php:116 -msgid "File upload failed." -msgstr "" - -#: mod/wall_upload.php:231 -msgid "Wall Photos" -msgstr "" - -#: mod/wallmessage.php:52 mod/wallmessage.php:115 -#, php-format -msgid "Number of daily wall messages for %s exceeded. Message failed." -msgstr "" - -#: mod/wallmessage.php:63 -msgid "Unable to check your home location." -msgstr "" - -#: mod/wallmessage.php:89 mod/wallmessage.php:98 -msgid "No recipient." -msgstr "" - -#: mod/wallmessage.php:129 -#, php-format -msgid "" -"If you wish for %s to respond, please check that the privacy settings on " -"your site allow private mail from unknown senders." +#: view/theme/vier/config.php:129 +msgid "Find Friends" msgstr "" #: view/theme/duepuntozero/config.php:55 src/Model/User.php:790 @@ -4183,10 +1114,22 @@ msgstr "" msgid "Your posts and conversations" msgstr "" +#: view/theme/frio/theme.php:268 src/Content/Nav.php:161 +#: src/Model/Profile.php:885 src/Model/Profile.php:921 +#: src/Module/Welcome.php:38 src/Module/Contact.php:639 +#: src/Module/Contact.php:868 mod/profperm.php:117 +msgid "Profile" +msgstr "" + #: view/theme/frio/theme.php:268 src/Content/Nav.php:161 msgid "Your profile page" msgstr "" +#: view/theme/frio/theme.php:269 src/Content/Nav.php:162 +#: src/Model/Profile.php:929 mod/fbrowser.php:43 +msgid "Photos" +msgstr "" + #: view/theme/frio/theme.php:269 src/Content/Nav.php:162 msgid "Your photos" msgstr "" @@ -4200,6 +1143,12 @@ msgstr "" msgid "Your videos" msgstr "" +#: view/theme/frio/theme.php:271 view/theme/frio/theme.php:275 +#: src/Content/Nav.php:164 src/Content/Nav.php:228 src/Model/Profile.php:949 +#: src/Model/Profile.php:960 mod/events.php:396 mod/cal.php:261 +msgid "Events" +msgstr "" + #: view/theme/frio/theme.php:271 src/Content/Nav.php:164 msgid "Your events" msgstr "" @@ -4217,10 +1166,21 @@ msgstr "" msgid "Events and Calendar" msgstr "" +#: view/theme/frio/theme.php:276 src/Content/Nav.php:254 mod/message.php:123 +msgid "Messages" +msgstr "" + #: view/theme/frio/theme.php:276 src/Content/Nav.php:254 msgid "Private mail" msgstr "" +#: view/theme/frio/theme.php:277 src/Content/Nav.php:263 +#: src/Module/Admin/Addons/Details.php:102 +#: src/Module/Admin/Themes/Details.php:107 src/Module/Welcome.php:33 +#: src/Module/BaseSettingsModule.php:105 mod/settings.php:149 +msgid "Settings" +msgstr "" + #: view/theme/frio/theme.php:277 src/Content/Nav.php:263 msgid "Account settings" msgstr "" @@ -4336,251 +1296,2141 @@ msgstr "" msgid "Textareas font size" msgstr "" -#: view/theme/vier/config.php:78 -msgid "Comma separated list of helper forums" +#: src/Database/DBStructure.php:50 +msgid "There are no tables on MyISAM." msgstr "" -#: view/theme/vier/config.php:118 src/Core/ACL.php:303 -msgid "don't show" +#: src/Database/DBStructure.php:74 +#, php-format +msgid "" +"\n" +"Error %d occurred during database update:\n" +"%s\n" msgstr "" -#: view/theme/vier/config.php:118 src/Core/ACL.php:302 -msgid "show" +#: src/Database/DBStructure.php:77 +msgid "Errors encountered performing database changes: " msgstr "" -#: view/theme/vier/config.php:124 -msgid "Set style" +#: src/Database/DBStructure.php:266 +#, php-format +msgid "%s: Database update" msgstr "" -#: view/theme/vier/config.php:125 -msgid "Community Pages" +#: src/Database/DBStructure.php:527 +#, php-format +msgid "%s: updating %s table." msgstr "" -#: view/theme/vier/config.php:126 view/theme/vier/theme.php:128 -msgid "Community Profiles" +#: src/Object/Post.php:135 +msgid "This entry was edited" msgstr "" -#: view/theme/vier/config.php:127 -msgid "Help or @NewHere ?" +#: src/Object/Post.php:158 +msgid "Private Message" msgstr "" -#: view/theme/vier/config.php:128 view/theme/vier/theme.php:350 -msgid "Connect Services" +#: src/Object/Post.php:168 src/Object/Post.php:170 mod/settings.php:730 +msgid "Edit" msgstr "" -#: view/theme/vier/config.php:129 -msgid "Find Friends" +#: src/Object/Post.php:197 +msgid "pinned item" msgstr "" -#: view/theme/vier/config.php:130 view/theme/vier/theme.php:158 -msgid "Last users" +#: src/Object/Post.php:202 +msgid "Delete locally" msgstr "" -#: view/theme/vier/theme.php:176 src/Content/Widget.php:65 -msgid "Find People" +#: src/Object/Post.php:205 +msgid "Delete globally" msgstr "" -#: view/theme/vier/theme.php:177 src/Content/Widget.php:66 -msgid "Enter name or interest" +#: src/Object/Post.php:205 +msgid "Remove locally" msgstr "" -#: view/theme/vier/theme.php:179 src/Content/Widget.php:68 -msgid "Examples: Robert Morgenstein, Fishing" +#: src/Object/Post.php:219 +msgid "save to folder" msgstr "" -#: view/theme/vier/theme.php:180 src/Content/Widget.php:69 -#: src/Module/Contact.php:816 src/Module/Directory.php:84 -msgid "Find" +#: src/Object/Post.php:254 +msgid "I will attend" msgstr "" -#: view/theme/vier/theme.php:182 src/Content/Widget.php:71 -msgid "Similar Interests" +#: src/Object/Post.php:254 +msgid "I will not attend" msgstr "" -#: view/theme/vier/theme.php:183 src/Content/Widget.php:72 -msgid "Random Profile" +#: src/Object/Post.php:254 +msgid "I might attend" msgstr "" -#: view/theme/vier/theme.php:184 src/Content/Widget.php:73 -msgid "Invite Friends" +#: src/Object/Post.php:282 +msgid "ignore thread" msgstr "" -#: view/theme/vier/theme.php:185 src/Content/Widget.php:74 -#: src/Module/Directory.php:76 -msgid "Global Directory" +#: src/Object/Post.php:283 +msgid "unignore thread" msgstr "" -#: view/theme/vier/theme.php:187 src/Content/Widget.php:76 -msgid "Local Directory" +#: src/Object/Post.php:284 +msgid "toggle ignore status" msgstr "" -#: view/theme/vier/theme.php:227 src/Content/Text/HTML.php:926 -#: src/Content/ForumManager.php:130 src/Content/Nav.php:209 -msgid "Forums" +#: src/Object/Post.php:287 mod/ostatus_subscribe.php:89 +msgid "ignored" msgstr "" -#: view/theme/vier/theme.php:229 src/Content/ForumManager.php:132 -msgid "External link to forum" +#: src/Object/Post.php:296 +msgid "pin" msgstr "" -#: view/theme/vier/theme.php:232 src/Content/ForumManager.php:135 -#: src/Content/Widget.php:405 src/Content/Widget.php:505 -msgid "show more" +#: src/Object/Post.php:297 +msgid "unpin" msgstr "" -#: view/theme/vier/theme.php:265 -msgid "Quick Start" +#: src/Object/Post.php:298 +msgid "toggle pin status" msgstr "" -#: view/theme/vier/theme.php:271 src/Content/Nav.php:192 src/Module/Help.php:50 -#: src/Module/Settings/TwoFactor/AppSpecific.php:99 -#: src/Module/Settings/TwoFactor/Recovery.php:77 -#: src/Module/Settings/TwoFactor/Index.php:90 -#: src/Module/Settings/TwoFactor/Verify.php:117 -msgid "Help" +#: src/Object/Post.php:301 +msgid "pinned" msgstr "" -#: src/Core/L10n/L10n.php:404 src/Model/Event.php:398 -msgid "Tuesday" +#: src/Object/Post.php:308 +msgid "add star" msgstr "" -#: src/Core/L10n/L10n.php:404 src/Model/Event.php:399 -msgid "Wednesday" +#: src/Object/Post.php:309 +msgid "remove star" msgstr "" -#: src/Core/L10n/L10n.php:404 src/Model/Event.php:400 -msgid "Thursday" +#: src/Object/Post.php:310 +msgid "toggle star status" msgstr "" -#: src/Core/L10n/L10n.php:404 src/Model/Event.php:401 -msgid "Friday" +#: src/Object/Post.php:313 +msgid "starred" msgstr "" -#: src/Core/L10n/L10n.php:404 src/Model/Event.php:402 -msgid "Saturday" +#: src/Object/Post.php:317 +msgid "add tag" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:417 -msgid "January" +#: src/Object/Post.php:328 mod/photos.php:1378 +msgid "I like this (toggle)" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:418 -msgid "February" +#: src/Object/Post.php:328 +msgid "like" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:419 -msgid "March" +#: src/Object/Post.php:329 mod/photos.php:1379 +msgid "I don't like this (toggle)" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:420 -msgid "April" +#: src/Object/Post.php:329 +msgid "dislike" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Core/L10n/L10n.php:428 -#: src/Model/Event.php:408 -msgid "May" +#: src/Object/Post.php:332 +msgid "Share this" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:421 -msgid "June" +#: src/Object/Post.php:332 +msgid "share" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:422 -msgid "July" +#: src/Object/Post.php:384 +#, php-format +msgid "%s (Received %s)" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:423 -msgid "August" +#: src/Object/Post.php:409 +msgid "to" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:424 -msgid "September" +#: src/Object/Post.php:410 +msgid "via" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:425 -msgid "October" +#: src/Object/Post.php:411 +msgid "Wall-to-Wall" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:426 -msgid "November" +#: src/Object/Post.php:412 +msgid "via Wall-To-Wall:" msgstr "" -#: src/Core/L10n/L10n.php:408 src/Model/Event.php:427 -msgid "December" +#: src/Object/Post.php:447 src/Object/Post.php:910 mod/photos.php:1396 +#: mod/photos.php:1435 mod/photos.php:1500 +msgid "Comment" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:389 -msgid "Mon" +#: src/Object/Post.php:448 +#, php-format +msgid "Reply to %s" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:390 -msgid "Tue" +#: src/Object/Post.php:464 +msgid "Notifier task is pending" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:391 -msgid "Wed" +#: src/Object/Post.php:465 +msgid "Delivery to remote servers is pending" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:392 -msgid "Thu" +#: src/Object/Post.php:466 +msgid "Delivery to remote servers is underway" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:393 -msgid "Fri" +#: src/Object/Post.php:467 +msgid "Delivery to remote servers is mostly done" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:394 -msgid "Sat" +#: src/Object/Post.php:468 +msgid "Delivery to remote servers is done" msgstr "" -#: src/Core/L10n/L10n.php:424 src/Model/Event.php:388 +#: src/Object/Post.php:488 +#, php-format +msgid "%d comment" +msgid_plural "%d comments" +msgstr[0] "" +msgstr[1] "" + +#: src/Object/Post.php:489 +msgid "Show more" +msgstr "" + +#: src/Object/Post.php:490 +msgid "Show fewer" +msgstr "" + +#: src/Object/Post.php:501 src/Model/Item.php:3400 +msgid "comment" +msgid_plural "comments" +msgstr[0] "" +msgstr[1] "" + +#: src/Object/Post.php:908 src/Module/Contact.php:1023 +#: src/Module/Item/Compose.php:126 mod/photos.php:1394 mod/photos.php:1433 +#: mod/photos.php:1498 +msgid "This is you" +msgstr "" + +#: src/App.php:521 +msgid "No system theme config value set." +msgstr "" + +#: src/Content/Text/BBCode.php:490 +msgid "view full size" +msgstr "" + +#: src/Content/Text/BBCode.php:927 src/Content/Text/BBCode.php:1603 +#: src/Content/Text/BBCode.php:1604 +msgid "Image/photo" +msgstr "" + +#: src/Content/Text/BBCode.php:1045 +#, php-format +msgid "%2$s %3$s" +msgstr "" + +#: src/Content/Text/BBCode.php:1521 src/Content/Text/HTML.php:963 +msgid "Click to open/close" +msgstr "" + +#: src/Content/Text/BBCode.php:1552 +msgid "$1 wrote:" +msgstr "" + +#: src/Content/Text/BBCode.php:1606 src/Content/Text/BBCode.php:1607 +msgid "Encrypted content" +msgstr "" + +#: src/Content/Text/BBCode.php:1829 +msgid "Invalid source protocol" +msgstr "" + +#: src/Content/Text/BBCode.php:1844 +msgid "Invalid link protocol" +msgstr "" + +#: src/Content/Text/HTML.php:811 +msgid "Loading more entries..." +msgstr "" + +#: src/Content/Text/HTML.php:812 +msgid "The end" +msgstr "" + +#: src/Content/Text/HTML.php:905 src/Module/Filer/SaveTag.php:49 +#: mod/notes.php:46 mod/editpost.php:72 +msgid "Save" +msgstr "" + +#: src/Content/Text/HTML.php:905 src/Model/Profile.php:540 +#: src/Module/Contact.php:318 +msgid "Follow" +msgstr "" + +#: src/Content/Text/HTML.php:911 src/Content/Nav.php:200 +#: src/Module/Search/Index.php:80 +msgid "Search" +msgstr "" + +#: src/Content/Text/HTML.php:913 src/Content/Nav.php:79 +msgid "@name, !forum, #tags, content" +msgstr "" + +#: src/Content/Text/HTML.php:920 src/Content/Nav.php:203 +msgid "Full Text" +msgstr "" + +#: src/Content/Text/HTML.php:921 src/Content/Nav.php:204 +#: src/Content/Widget/TagCloud.php:54 +msgid "Tags" +msgstr "" + +#: src/Content/ContactSelector.php:58 +msgid "Frequently" +msgstr "" + +#: src/Content/ContactSelector.php:59 +msgid "Hourly" +msgstr "" + +#: src/Content/ContactSelector.php:60 +msgid "Twice daily" +msgstr "" + +#: src/Content/ContactSelector.php:61 +msgid "Daily" +msgstr "" + +#: src/Content/ContactSelector.php:62 +msgid "Weekly" +msgstr "" + +#: src/Content/ContactSelector.php:63 +msgid "Monthly" +msgstr "" + +#: src/Content/ContactSelector.php:116 +msgid "DFRN" +msgstr "" + +#: src/Content/ContactSelector.php:117 +msgid "OStatus" +msgstr "" + +#: src/Content/ContactSelector.php:118 +msgid "RSS/Atom" +msgstr "" + +#: src/Content/ContactSelector.php:119 src/Module/Admin/Users.php:272 +#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297 +#: src/Module/Admin/Users.php:315 +msgid "Email" +msgstr "" + +#: src/Content/ContactSelector.php:120 mod/settings.php:800 +msgid "Diaspora" +msgstr "" + +#: src/Content/ContactSelector.php:121 +msgid "Zot!" +msgstr "" + +#: src/Content/ContactSelector.php:122 +msgid "LinkedIn" +msgstr "" + +#: src/Content/ContactSelector.php:123 +msgid "XMPP/IM" +msgstr "" + +#: src/Content/ContactSelector.php:124 +msgid "MySpace" +msgstr "" + +#: src/Content/ContactSelector.php:125 +msgid "Google+" +msgstr "" + +#: src/Content/ContactSelector.php:126 +msgid "pump.io" +msgstr "" + +#: src/Content/ContactSelector.php:127 +msgid "Twitter" +msgstr "" + +#: src/Content/ContactSelector.php:128 +msgid "Discourse" +msgstr "" + +#: src/Content/ContactSelector.php:129 +msgid "Diaspora Connector" +msgstr "" + +#: src/Content/ContactSelector.php:130 +msgid "GNU Social Connector" +msgstr "" + +#: src/Content/ContactSelector.php:131 +msgid "ActivityPub" +msgstr "" + +#: src/Content/ContactSelector.php:132 +msgid "pnut" +msgstr "" + +#: src/Content/ContactSelector.php:231 src/Content/ContactSelector.php:271 +#: src/Content/ContactSelector.php:309 +msgid "No answer" +msgstr "" + +#: src/Content/ContactSelector.php:232 +msgid "Male" +msgstr "" + +#: src/Content/ContactSelector.php:233 +msgid "Female" +msgstr "" + +#: src/Content/ContactSelector.php:234 +msgid "Currently Male" +msgstr "" + +#: src/Content/ContactSelector.php:235 +msgid "Currently Female" +msgstr "" + +#: src/Content/ContactSelector.php:236 +msgid "Mostly Male" +msgstr "" + +#: src/Content/ContactSelector.php:237 +msgid "Mostly Female" +msgstr "" + +#: src/Content/ContactSelector.php:238 +msgid "Transgender" +msgstr "" + +#: src/Content/ContactSelector.php:239 +msgid "Intersex" +msgstr "" + +#: src/Content/ContactSelector.php:240 +msgid "Transsexual" +msgstr "" + +#: src/Content/ContactSelector.php:241 +msgid "Hermaphrodite" +msgstr "" + +#: src/Content/ContactSelector.php:242 +msgid "Neuter" +msgstr "" + +#: src/Content/ContactSelector.php:243 +msgid "Non-specific" +msgstr "" + +#: src/Content/ContactSelector.php:244 +msgid "Other" +msgstr "" + +#: src/Content/ContactSelector.php:272 +msgid "Males" +msgstr "" + +#: src/Content/ContactSelector.php:273 +msgid "Females" +msgstr "" + +#: src/Content/ContactSelector.php:274 +msgid "Gay" +msgstr "" + +#: src/Content/ContactSelector.php:275 +msgid "Lesbian" +msgstr "" + +#: src/Content/ContactSelector.php:276 +msgid "No Preference" +msgstr "" + +#: src/Content/ContactSelector.php:277 +msgid "Bisexual" +msgstr "" + +#: src/Content/ContactSelector.php:278 +msgid "Autosexual" +msgstr "" + +#: src/Content/ContactSelector.php:279 +msgid "Abstinent" +msgstr "" + +#: src/Content/ContactSelector.php:280 +msgid "Virgin" +msgstr "" + +#: src/Content/ContactSelector.php:281 +msgid "Deviant" +msgstr "" + +#: src/Content/ContactSelector.php:282 +msgid "Fetish" +msgstr "" + +#: src/Content/ContactSelector.php:283 +msgid "Oodles" +msgstr "" + +#: src/Content/ContactSelector.php:284 +msgid "Nonsexual" +msgstr "" + +#: src/Content/ContactSelector.php:310 +msgid "Single" +msgstr "" + +#: src/Content/ContactSelector.php:311 +msgid "Lonely" +msgstr "" + +#: src/Content/ContactSelector.php:312 +msgid "In a relation" +msgstr "" + +#: src/Content/ContactSelector.php:313 +msgid "Has crush" +msgstr "" + +#: src/Content/ContactSelector.php:314 +msgid "Infatuated" +msgstr "" + +#: src/Content/ContactSelector.php:315 +msgid "Dating" +msgstr "" + +#: src/Content/ContactSelector.php:316 +msgid "Unfaithful" +msgstr "" + +#: src/Content/ContactSelector.php:317 +msgid "Sex Addict" +msgstr "" + +#: src/Content/ContactSelector.php:318 src/Model/User.php:807 +msgid "Friends" +msgstr "" + +#: src/Content/ContactSelector.php:319 +msgid "Friends/Benefits" +msgstr "" + +#: src/Content/ContactSelector.php:320 +msgid "Casual" +msgstr "" + +#: src/Content/ContactSelector.php:321 +msgid "Engaged" +msgstr "" + +#: src/Content/ContactSelector.php:322 +msgid "Married" +msgstr "" + +#: src/Content/ContactSelector.php:323 +msgid "Imaginarily married" +msgstr "" + +#: src/Content/ContactSelector.php:324 +msgid "Partners" +msgstr "" + +#: src/Content/ContactSelector.php:325 +msgid "Cohabiting" +msgstr "" + +#: src/Content/ContactSelector.php:326 +msgid "Common law" +msgstr "" + +#: src/Content/ContactSelector.php:327 +msgid "Happy" +msgstr "" + +#: src/Content/ContactSelector.php:328 +msgid "Not looking" +msgstr "" + +#: src/Content/ContactSelector.php:329 +msgid "Swinger" +msgstr "" + +#: src/Content/ContactSelector.php:330 +msgid "Betrayed" +msgstr "" + +#: src/Content/ContactSelector.php:331 +msgid "Separated" +msgstr "" + +#: src/Content/ContactSelector.php:332 +msgid "Unstable" +msgstr "" + +#: src/Content/ContactSelector.php:333 +msgid "Divorced" +msgstr "" + +#: src/Content/ContactSelector.php:334 +msgid "Imaginarily divorced" +msgstr "" + +#: src/Content/ContactSelector.php:335 +msgid "Widowed" +msgstr "" + +#: src/Content/ContactSelector.php:336 +msgid "Uncertain" +msgstr "" + +#: src/Content/ContactSelector.php:337 +msgid "It's complicated" +msgstr "" + +#: src/Content/ContactSelector.php:338 +msgid "Don't care" +msgstr "" + +#: src/Content/ContactSelector.php:339 +msgid "Ask me" +msgstr "" + +#: src/Content/Widget.php:39 +msgid "Add New Contact" +msgstr "" + +#: src/Content/Widget.php:40 +msgid "Enter address or web location" +msgstr "" + +#: src/Content/Widget.php:41 +msgid "Example: bob@example.com, http://example.com/barbara" +msgstr "" + +#: src/Content/Widget.php:43 src/Module/BaseSearchModule.php:135 +#: src/Module/AllFriends.php:91 mod/match.php:102 mod/suggest.php:106 +msgid "Connect" +msgstr "" + +#: src/Content/Widget.php:59 +#, php-format +msgid "%d invitation available" +msgid_plural "%d invitations available" +msgstr[0] "" +msgstr[1] "" + +#: src/Content/Widget.php:197 src/Core/ACL.php:283 +#: src/Module/Profile/Contacts.php:126 src/Module/Contact.php:792 +#: mod/lockview.php:78 mod/lockview.php:113 +msgid "Followers" +msgstr "" + +#: src/Content/Widget.php:198 src/Module/Profile/Contacts.php:127 +#: src/Module/Contact.php:793 +msgid "Following" +msgstr "" + +#: src/Content/Widget.php:199 src/Module/Profile/Contacts.php:128 +#: src/Module/Contact.php:794 +msgid "Mutual friends" +msgstr "" + +#: src/Content/Widget.php:204 +msgid "Relationships" +msgstr "" + +#: src/Content/Widget.php:206 src/Module/Group.php:287 +#: src/Module/Contact.php:681 +msgid "All Contacts" +msgstr "" + +#: src/Content/Widget.php:249 +msgid "Protocols" +msgstr "" + +#: src/Content/Widget.php:251 +msgid "All Protocols" +msgstr "" + +#: src/Content/Widget.php:288 +msgid "Saved Folders" +msgstr "" + +#: src/Content/Widget.php:290 src/Content/Widget.php:329 +msgid "Everything" +msgstr "" + +#: src/Content/Widget.php:327 +msgid "Categories" +msgstr "" + +#: src/Content/Widget.php:404 +#, php-format +msgid "%d contact in common" +msgid_plural "%d contacts in common" +msgstr[0] "" +msgstr[1] "" + +#: src/Content/Widget.php:503 src/Content/Feature.php:100 +msgid "Archives" +msgstr "" + +#: src/Content/OEmbed.php:254 +msgid "Embedding disabled" +msgstr "" + +#: src/Content/OEmbed.php:377 +msgid "Embedded content" +msgstr "" + +#: src/Content/Feature.php:82 +msgid "General Features" +msgstr "" + +#: src/Content/Feature.php:84 +msgid "Multiple Profiles" +msgstr "" + +#: src/Content/Feature.php:84 +msgid "Ability to create multiple profiles" +msgstr "" + +#: src/Content/Feature.php:85 +msgid "Photo Location" +msgstr "" + +#: src/Content/Feature.php:85 +msgid "" +"Photo metadata is normally stripped. This extracts the location (if present) " +"prior to stripping metadata and links it to a map." +msgstr "" + +#: src/Content/Feature.php:86 +msgid "Export Public Calendar" +msgstr "" + +#: src/Content/Feature.php:86 +msgid "Ability for visitors to download the public calendar" +msgstr "" + +#: src/Content/Feature.php:87 +msgid "Trending Tags" +msgstr "" + +#: src/Content/Feature.php:87 +msgid "" +"Show a community page widget with a list of the most popular tags in recent " +"public posts." +msgstr "" + +#: src/Content/Feature.php:92 +msgid "Post Composition Features" +msgstr "" + +#: src/Content/Feature.php:93 +msgid "Auto-mention Forums" +msgstr "" + +#: src/Content/Feature.php:93 +msgid "" +"Add/remove mention when a forum page is selected/deselected in ACL window." +msgstr "" + +#: src/Content/Feature.php:94 +msgid "Explicit Mentions" +msgstr "" + +#: src/Content/Feature.php:94 +msgid "" +"Add explicit mentions to comment box for manual control over who gets " +"mentioned in replies." +msgstr "" + +#: src/Content/Feature.php:99 +msgid "Network Sidebar" +msgstr "" + +#: src/Content/Feature.php:100 +msgid "Ability to select posts by date ranges" +msgstr "" + +#: src/Content/Feature.php:101 +msgid "Protocol Filter" +msgstr "" + +#: src/Content/Feature.php:101 +msgid "Enable widget to display Network posts only from selected protocols" +msgstr "" + +#: src/Content/Feature.php:106 +msgid "Network Tabs" +msgstr "" + +#: src/Content/Feature.php:107 +msgid "Network New Tab" +msgstr "" + +#: src/Content/Feature.php:107 +msgid "Enable tab to display only new Network posts (from the last 12 hours)" +msgstr "" + +#: src/Content/Feature.php:108 +msgid "Network Shared Links Tab" +msgstr "" + +#: src/Content/Feature.php:108 +msgid "Enable tab to display only Network posts with links in them" +msgstr "" + +#: src/Content/Feature.php:113 +msgid "Post/Comment Tools" +msgstr "" + +#: src/Content/Feature.php:114 +msgid "Post Categories" +msgstr "" + +#: src/Content/Feature.php:114 +msgid "Add categories to your posts" +msgstr "" + +#: src/Content/Feature.php:119 +msgid "Advanced Profile Settings" +msgstr "" + +#: src/Content/Feature.php:120 +msgid "List Forums" +msgstr "" + +#: src/Content/Feature.php:120 +msgid "Show visitors public community forums at the Advanced Profile Page" +msgstr "" + +#: src/Content/Feature.php:121 +msgid "Tag Cloud" +msgstr "" + +#: src/Content/Feature.php:121 +msgid "Provide a personal tag cloud on your profile page" +msgstr "" + +#: src/Content/Feature.php:122 +msgid "Display Membership Date" +msgstr "" + +#: src/Content/Feature.php:122 +msgid "Display membership date in profile" +msgstr "" + +#: src/Content/Nav.php:74 +msgid "Nothing new here" +msgstr "" + +#: src/Content/Nav.php:78 +msgid "Clear notifications" +msgstr "" + +#: src/Content/Nav.php:153 src/Module/Login.php:136 +msgid "Logout" +msgstr "" + +#: src/Content/Nav.php:153 +msgid "End this session" +msgstr "" + +#: src/Content/Nav.php:155 src/Module/Login.php:137 +#: src/Module/Bookmarklet.php:25 +msgid "Login" +msgstr "" + +#: src/Content/Nav.php:155 +msgid "Sign in" +msgstr "" + +#: src/Content/Nav.php:165 +msgid "Personal notes" +msgstr "" + +#: src/Content/Nav.php:165 +msgid "Your personal notes" +msgstr "" + +#: src/Content/Nav.php:182 src/Content/Nav.php:244 +msgid "Home" +msgstr "" + +#: src/Content/Nav.php:182 +msgid "Home Page" +msgstr "" + +#: src/Content/Nav.php:186 src/Module/Login.php:97 src/Module/Register.php:130 +msgid "Register" +msgstr "" + +#: src/Content/Nav.php:186 +msgid "Create an account" +msgstr "" + +#: src/Content/Nav.php:192 +msgid "Help and documentation" +msgstr "" + +#: src/Content/Nav.php:196 +msgid "Apps" +msgstr "" + +#: src/Content/Nav.php:196 +msgid "Addon applications, utilities, games" +msgstr "" + +#: src/Content/Nav.php:200 +msgid "Search site content" +msgstr "" + +#: src/Content/Nav.php:224 +msgid "Community" +msgstr "" + +#: src/Content/Nav.php:224 +msgid "Conversations on this and other servers" +msgstr "" + +#: src/Content/Nav.php:231 +msgid "Directory" +msgstr "" + +#: src/Content/Nav.php:231 +msgid "People directory" +msgstr "" + +#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75 +msgid "Information" +msgstr "" + +#: src/Content/Nav.php:233 +msgid "Information about this friendica instance" +msgstr "" + +#: src/Content/Nav.php:236 src/Module/Tos.php:73 +#: src/Module/BaseAdminModule.php:85 src/Module/Admin/Tos.php:43 +#: src/Module/Register.php:138 +msgid "Terms of Service" +msgstr "" + +#: src/Content/Nav.php:236 +msgid "Terms of Service of this Friendica instance" +msgstr "" + +#: src/Content/Nav.php:242 +msgid "Network Reset" +msgstr "" + +#: src/Content/Nav.php:242 +msgid "Load Network page with no filters" +msgstr "" + +#: src/Content/Nav.php:248 +msgid "Introductions" +msgstr "" + +#: src/Content/Nav.php:248 +msgid "Friend Requests" +msgstr "" + +#: src/Content/Nav.php:249 mod/notifications.php:100 +msgid "Notifications" +msgstr "" + +#: src/Content/Nav.php:250 +msgid "See all notifications" +msgstr "" + +#: src/Content/Nav.php:251 mod/settings.php:873 +msgid "Mark as seen" +msgstr "" + +#: src/Content/Nav.php:251 +msgid "Mark all system notifications seen" +msgstr "" + +#: src/Content/Nav.php:255 +msgid "Inbox" +msgstr "" + +#: src/Content/Nav.php:256 +msgid "Outbox" +msgstr "" + +#: src/Content/Nav.php:257 mod/message.php:33 mod/message.php:116 +msgid "New Message" +msgstr "" + +#: src/Content/Nav.php:260 +msgid "Delegation" +msgstr "" + +#: src/Content/Nav.php:260 +msgid "Manage other pages" +msgstr "" + +#: src/Content/Nav.php:266 src/Model/Profile.php:398 +#: src/Module/BaseSettingsModule.php:38 mod/settings.php:82 +msgid "Profiles" +msgstr "" + +#: src/Content/Nav.php:266 +msgid "Manage/Edit Profiles" +msgstr "" + +#: src/Content/Nav.php:274 src/Module/BaseAdminModule.php:114 +msgid "Admin" +msgstr "" + +#: src/Content/Nav.php:274 +msgid "Site setup and configuration" +msgstr "" + +#: src/Content/Nav.php:277 +msgid "Navigation" +msgstr "" + +#: src/Content/Nav.php:277 +msgid "Site map" +msgstr "" + +#: src/Content/Widget/SavedSearches.php:29 +msgid "Remove term" +msgstr "" + +#: src/Content/Widget/SavedSearches.php:37 +msgid "Saved Searches" +msgstr "" + +#: src/Content/Widget/CalendarExport.php:64 +msgid "Export" +msgstr "" + +#: src/Content/Widget/CalendarExport.php:65 +msgid "Export calendar as ical" +msgstr "" + +#: src/Content/Widget/CalendarExport.php:66 +msgid "Export calendar as csv" +msgstr "" + +#: src/Content/Widget/TrendingTags.php:34 +#, php-format +msgid "Trending Tags (last %d hour)" +msgid_plural "Trending Tags (last %d hours)" +msgstr[0] "" +msgstr[1] "" + +#: src/Content/Widget/TrendingTags.php:35 +msgid "More Trending Tags" +msgstr "" + +#: src/Content/Widget/ContactBlock.php:58 +msgid "No contacts" +msgstr "" + +#: src/Content/Widget/ContactBlock.php:90 +#, php-format +msgid "%d Contact" +msgid_plural "%d Contacts" +msgstr[0] "" +msgstr[1] "" + +#: src/Content/Widget/ContactBlock.php:109 +msgid "View Contacts" +msgstr "" + +#: src/Content/Pager.php:153 +msgid "newer" +msgstr "" + +#: src/Content/Pager.php:158 +msgid "older" +msgstr "" + +#: src/Content/Pager.php:198 mod/match.php:115 +msgid "first" +msgstr "" + +#: src/Content/Pager.php:203 +msgid "prev" +msgstr "" + +#: src/Content/Pager.php:258 mod/match.php:120 +msgid "next" +msgstr "" + +#: src/Content/Pager.php:263 +msgid "last" +msgstr "" + +#: src/Model/Profile.php:213 src/Model/Profile.php:424 +#: src/Model/Profile.php:881 +msgid "Edit profile" +msgstr "" + +#: src/Model/Profile.php:398 +msgid "Manage/edit profiles" +msgstr "" + +#: src/Model/Profile.php:405 src/Model/Profile.php:426 mod/profiles.php:669 +msgid "Change profile photo" +msgstr "" + +#: src/Model/Profile.php:406 mod/profiles.php:670 +msgid "Create New Profile" +msgstr "" + +#: src/Model/Profile.php:415 mod/profiles.php:659 +msgid "Profile Image" +msgstr "" + +#: src/Model/Profile.php:418 mod/profiles.php:661 +msgid "visible to everybody" +msgstr "" + +#: src/Model/Profile.php:419 mod/profiles.php:567 mod/profiles.php:662 +msgid "Edit visibility" +msgstr "" + +#: src/Model/Profile.php:443 src/Model/Event.php:69 src/Model/Event.php:96 +#: src/Model/Event.php:438 src/Model/Event.php:934 src/Module/Directory.php:135 +#: src/Module/Contact.php:628 mod/events.php:546 mod/notifications.php:276 +msgid "Location:" +msgstr "" + +#: src/Model/Profile.php:446 src/Model/Profile.php:767 +#: src/Module/Directory.php:140 mod/notifications.php:282 +msgid "Gender:" +msgstr "" + +#: src/Model/Profile.php:447 src/Model/Profile.php:791 +#: src/Module/Directory.php:141 +msgid "Status:" +msgstr "" + +#: src/Model/Profile.php:448 src/Model/Profile.php:808 +#: src/Module/Directory.php:142 +msgid "Homepage:" +msgstr "" + +#: src/Model/Profile.php:449 src/Model/Profile.php:828 +#: src/Module/Directory.php:143 src/Module/Contact.php:632 +#: mod/notifications.php:278 +msgid "About:" +msgstr "" + +#: src/Model/Profile.php:450 src/Module/Contact.php:630 +msgid "XMPP:" +msgstr "" + +#: src/Model/Profile.php:542 src/Module/Contact.php:320 +msgid "Unfollow" +msgstr "" + +#: src/Model/Profile.php:544 +msgid "Atom feed" +msgstr "" + +#: src/Model/Profile.php:554 src/Module/Contact.php:316 +#: mod/notifications.php:289 +msgid "Network:" +msgstr "" + +#: src/Model/Profile.php:584 src/Model/Profile.php:681 +msgid "g A l F d" +msgstr "" + +#: src/Model/Profile.php:585 +msgid "F d" +msgstr "" + +#: src/Model/Profile.php:647 src/Model/Profile.php:732 +msgid "[today]" +msgstr "" + +#: src/Model/Profile.php:657 +msgid "Birthday Reminders" +msgstr "" + +#: src/Model/Profile.php:658 +msgid "Birthdays this week:" +msgstr "" + +#: src/Model/Profile.php:719 +msgid "[No description]" +msgstr "" + +#: src/Model/Profile.php:745 +msgid "Event Reminders" +msgstr "" + +#: src/Model/Profile.php:746 +msgid "Upcoming events the next 7 days:" +msgstr "" + +#: src/Model/Profile.php:760 mod/settings.php:1195 +msgid "Full Name:" +msgstr "" + +#: src/Model/Profile.php:763 +msgid "Member since:" +msgstr "" + +#: src/Model/Profile.php:771 +msgid "j F, Y" +msgstr "" + +#: src/Model/Profile.php:772 +msgid "j F" +msgstr "" + +#: src/Model/Profile.php:780 src/Util/Temporal.php:146 +msgid "Birthday:" +msgstr "" + +#: src/Model/Profile.php:787 +msgid "Age:" +msgstr "" + +#: src/Model/Profile.php:800 +#, php-format +msgid "for %1$d %2$s" +msgstr "" + +#: src/Model/Profile.php:804 mod/profiles.php:586 +msgid "Sexual Preference:" +msgstr "" + +#: src/Model/Profile.php:812 mod/profiles.php:613 +msgid "Hometown:" +msgstr "" + +#: src/Model/Profile.php:816 src/Module/Contact.php:634 +#: mod/notifications.php:280 mod/follow.php:183 +msgid "Tags:" +msgstr "" + +#: src/Model/Profile.php:820 mod/profiles.php:614 +msgid "Political Views:" +msgstr "" + +#: src/Model/Profile.php:824 +msgid "Religion:" +msgstr "" + +#: src/Model/Profile.php:832 +msgid "Hobbies/Interests:" +msgstr "" + +#: src/Model/Profile.php:836 mod/profiles.php:618 +msgid "Likes:" +msgstr "" + +#: src/Model/Profile.php:840 mod/profiles.php:619 +msgid "Dislikes:" +msgstr "" + +#: src/Model/Profile.php:844 +msgid "Contact information and Social Networks:" +msgstr "" + +#: src/Model/Profile.php:848 +msgid "Musical interests:" +msgstr "" + +#: src/Model/Profile.php:852 +msgid "Books, literature:" +msgstr "" + +#: src/Model/Profile.php:856 +msgid "Television:" +msgstr "" + +#: src/Model/Profile.php:860 +msgid "Film/dance/culture/entertainment:" +msgstr "" + +#: src/Model/Profile.php:864 +msgid "Love/Romance:" +msgstr "" + +#: src/Model/Profile.php:868 +msgid "Work/employment:" +msgstr "" + +#: src/Model/Profile.php:872 +msgid "School/education:" +msgstr "" + +#: src/Model/Profile.php:877 +msgid "Forums:" +msgstr "" + +#: src/Model/Profile.php:886 mod/events.php:559 +msgid "Basic" +msgstr "" + +#: src/Model/Profile.php:887 src/Module/Admin/Site.php:573 +#: src/Module/Contact.php:901 mod/events.php:560 +msgid "Advanced" +msgstr "" + +#: src/Model/Profile.php:916 src/Module/Contact.php:863 mod/follow.php:195 +#: mod/unfollow.php:147 +msgid "Status Messages and Posts" +msgstr "" + +#: src/Model/Profile.php:924 src/Module/Contact.php:871 +msgid "Profile Details" +msgstr "" + +#: src/Model/Profile.php:932 mod/photos.php:112 +msgid "Photo Albums" +msgstr "" + +#: src/Model/Profile.php:971 mod/notes.php:34 +msgid "Personal Notes" +msgstr "" + +#: src/Model/Profile.php:974 +msgid "Only You Can See This" +msgstr "" + +#: src/Model/Profile.php:982 src/Model/Profile.php:985 +msgid "Tips for New Members" +msgstr "" + +#: src/Model/Profile.php:1180 +#, php-format +msgid "OpenWebAuth: %1$s welcomes %2$s" +msgstr "" + +#: src/Model/Event.php:35 src/Model/Event.php:848 +#: src/Module/Debug/Localtime.php:17 +msgid "l F d, Y \\@ g:i A" +msgstr "" + +#: src/Model/Event.php:62 src/Model/Event.php:79 src/Model/Event.php:436 +#: src/Model/Event.php:916 +msgid "Starts:" +msgstr "" + +#: src/Model/Event.php:65 src/Model/Event.php:85 src/Model/Event.php:437 +#: src/Model/Event.php:920 +msgid "Finishes:" +msgstr "" + +#: src/Model/Event.php:386 +msgid "all-day" +msgstr "" + +#: src/Model/Event.php:388 src/Core/L10n/L10n.php:424 msgid "Sun" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:404 +#: src/Model/Event.php:389 src/Core/L10n/L10n.php:424 +msgid "Mon" +msgstr "" + +#: src/Model/Event.php:390 src/Core/L10n/L10n.php:424 +msgid "Tue" +msgstr "" + +#: src/Model/Event.php:391 src/Core/L10n/L10n.php:424 +msgid "Wed" +msgstr "" + +#: src/Model/Event.php:392 src/Core/L10n/L10n.php:424 +msgid "Thu" +msgstr "" + +#: src/Model/Event.php:393 src/Core/L10n/L10n.php:424 +msgid "Fri" +msgstr "" + +#: src/Model/Event.php:394 src/Core/L10n/L10n.php:424 +msgid "Sat" +msgstr "" + +#: src/Model/Event.php:396 src/Core/L10n/L10n.php:404 mod/settings.php:936 +msgid "Sunday" +msgstr "" + +#: src/Model/Event.php:397 src/Core/L10n/L10n.php:404 mod/settings.php:936 +msgid "Monday" +msgstr "" + +#: src/Model/Event.php:398 src/Core/L10n/L10n.php:404 +msgid "Tuesday" +msgstr "" + +#: src/Model/Event.php:399 src/Core/L10n/L10n.php:404 +msgid "Wednesday" +msgstr "" + +#: src/Model/Event.php:400 src/Core/L10n/L10n.php:404 +msgid "Thursday" +msgstr "" + +#: src/Model/Event.php:401 src/Core/L10n/L10n.php:404 +msgid "Friday" +msgstr "" + +#: src/Model/Event.php:402 src/Core/L10n/L10n.php:404 +msgid "Saturday" +msgstr "" + +#: src/Model/Event.php:404 src/Core/L10n/L10n.php:428 msgid "Jan" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:405 +#: src/Model/Event.php:405 src/Core/L10n/L10n.php:428 msgid "Feb" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:406 +#: src/Model/Event.php:406 src/Core/L10n/L10n.php:428 msgid "Mar" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:407 +#: src/Model/Event.php:407 src/Core/L10n/L10n.php:428 msgid "Apr" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:409 +#: src/Model/Event.php:408 src/Core/L10n/L10n.php:408 +#: src/Core/L10n/L10n.php:428 +msgid "May" +msgstr "" + +#: src/Model/Event.php:409 src/Core/L10n/L10n.php:428 msgid "Jun" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:410 +#: src/Model/Event.php:410 src/Core/L10n/L10n.php:428 msgid "Jul" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:411 +#: src/Model/Event.php:411 src/Core/L10n/L10n.php:428 msgid "Aug" msgstr "" +#: src/Model/Event.php:412 +msgid "Sept" +msgstr "" + +#: src/Model/Event.php:413 src/Core/L10n/L10n.php:428 +msgid "Oct" +msgstr "" + +#: src/Model/Event.php:414 src/Core/L10n/L10n.php:428 +msgid "Nov" +msgstr "" + +#: src/Model/Event.php:415 src/Core/L10n/L10n.php:428 +msgid "Dec" +msgstr "" + +#: src/Model/Event.php:417 src/Core/L10n/L10n.php:408 +msgid "January" +msgstr "" + +#: src/Model/Event.php:418 src/Core/L10n/L10n.php:408 +msgid "February" +msgstr "" + +#: src/Model/Event.php:419 src/Core/L10n/L10n.php:408 +msgid "March" +msgstr "" + +#: src/Model/Event.php:420 src/Core/L10n/L10n.php:408 +msgid "April" +msgstr "" + +#: src/Model/Event.php:421 src/Core/L10n/L10n.php:408 +msgid "June" +msgstr "" + +#: src/Model/Event.php:422 src/Core/L10n/L10n.php:408 +msgid "July" +msgstr "" + +#: src/Model/Event.php:423 src/Core/L10n/L10n.php:408 +msgid "August" +msgstr "" + +#: src/Model/Event.php:424 src/Core/L10n/L10n.php:408 +msgid "September" +msgstr "" + +#: src/Model/Event.php:425 src/Core/L10n/L10n.php:408 +msgid "October" +msgstr "" + +#: src/Model/Event.php:426 src/Core/L10n/L10n.php:408 +msgid "November" +msgstr "" + +#: src/Model/Event.php:427 src/Core/L10n/L10n.php:408 +msgid "December" +msgstr "" + +#: src/Model/Event.php:429 mod/events.php:405 mod/cal.php:267 +msgid "today" +msgstr "" + +#: src/Model/Event.php:430 src/Util/Temporal.php:313 mod/events.php:406 +#: mod/cal.php:268 +msgid "month" +msgstr "" + +#: src/Model/Event.php:431 src/Util/Temporal.php:314 mod/events.php:407 +#: mod/cal.php:269 +msgid "week" +msgstr "" + +#: src/Model/Event.php:432 src/Util/Temporal.php:315 mod/events.php:408 +#: mod/cal.php:270 +msgid "day" +msgstr "" + +#: src/Model/Event.php:434 +msgid "No events to display" +msgstr "" + +#: src/Model/Event.php:562 +msgid "l, F j" +msgstr "" + +#: src/Model/Event.php:593 +msgid "Edit event" +msgstr "" + +#: src/Model/Event.php:594 +msgid "Duplicate event" +msgstr "" + +#: src/Model/Event.php:595 +msgid "Delete event" +msgstr "" + +#: src/Model/Event.php:627 src/Model/Item.php:3656 src/Model/Item.php:3663 +msgid "link to source" +msgstr "" + +#: src/Model/Event.php:849 +msgid "D g:i A" +msgstr "" + +#: src/Model/Event.php:850 +msgid "g:i A" +msgstr "" + +#: src/Model/Event.php:935 src/Model/Event.php:937 +msgid "Show map" +msgstr "" + +#: src/Model/Event.php:936 +msgid "Hide map" +msgstr "" + +#: src/Model/Event.php:1028 +#, php-format +msgid "%s's birthday" +msgstr "" + +#: src/Model/Event.php:1029 +#, php-format +msgid "Happy Birthday %s" +msgstr "" + +#: src/Model/Photo.php:560 src/Model/Photo.php:569 mod/fbrowser.php:52 +#: mod/fbrowser.php:76 mod/photos.php:181 mod/photos.php:938 +#: mod/photos.php:1055 mod/photos.php:1072 mod/photos.php:1554 +#: mod/photos.php:1569 +msgid "Contact Photos" +msgstr "" + +#: src/Model/User.php:357 +msgid "Login failed" +msgstr "" + +#: src/Model/User.php:389 +msgid "Not enough information to authenticate" +msgstr "" + +#: src/Model/User.php:415 src/Console/NewPassword.php:88 mod/cal.php:284 +msgid "User not found" +msgstr "" + +#: src/Model/User.php:483 +msgid "Password can't be empty" +msgstr "" + +#: src/Model/User.php:502 +msgid "Empty passwords are not allowed." +msgstr "" + +#: src/Model/User.php:506 +msgid "" +"The new password has been exposed in a public data dump, please choose " +"another." +msgstr "" + +#: src/Model/User.php:512 +msgid "" +"The password can't contain accentuated letters, white spaces or colons (:)" +msgstr "" + +#: src/Model/User.php:612 +msgid "Passwords do not match. Password unchanged." +msgstr "" + +#: src/Model/User.php:619 +msgid "An invitation is required." +msgstr "" + +#: src/Model/User.php:623 +msgid "Invitation could not be verified." +msgstr "" + +#: src/Model/User.php:631 +msgid "Invalid OpenID url" +msgstr "" + +#: src/Model/User.php:644 src/Core/Authentication.php:190 +msgid "" +"We encountered a problem while logging in with the OpenID you provided. " +"Please check the correct spelling of the ID." +msgstr "" + +#: src/Model/User.php:644 src/Core/Authentication.php:190 +msgid "The error message was:" +msgstr "" + +#: src/Model/User.php:650 +msgid "Please enter the required information." +msgstr "" + +#: src/Model/User.php:664 +#, php-format +msgid "" +"system.username_min_length (%s) and system.username_max_length (%s) are " +"excluding each other, swapping values." +msgstr "" + +#: src/Model/User.php:671 +#, php-format +msgid "Username should be at least %s character." +msgid_plural "Username should be at least %s characters." +msgstr[0] "" +msgstr[1] "" + +#: src/Model/User.php:675 +#, php-format +msgid "Username should be at most %s character." +msgid_plural "Username should be at most %s characters." +msgstr[0] "" +msgstr[1] "" + +#: src/Model/User.php:683 +msgid "That doesn't appear to be your full (First Last) name." +msgstr "" + +#: src/Model/User.php:688 +msgid "Your email domain is not among those allowed on this site." +msgstr "" + +#: src/Model/User.php:692 +msgid "Not a valid email address." +msgstr "" + +#: src/Model/User.php:695 +msgid "The nickname was blocked from registration by the nodes admin." +msgstr "" + +#: src/Model/User.php:699 src/Model/User.php:707 +msgid "Cannot use that email." +msgstr "" + +#: src/Model/User.php:714 +msgid "Your nickname can only contain a-z, 0-9 and _." +msgstr "" + +#: src/Model/User.php:722 src/Model/User.php:779 +msgid "Nickname is already registered. Please choose another." +msgstr "" + +#: src/Model/User.php:732 +msgid "SERIOUS ERROR: Generation of security keys failed." +msgstr "" + +#: src/Model/User.php:766 src/Model/User.php:770 +msgid "An error occurred during registration. Please try again." +msgstr "" + +#: src/Model/User.php:795 +msgid "An error occurred creating your default profile. Please try again." +msgstr "" + +#: src/Model/User.php:802 +msgid "An error occurred creating your self contact. Please try again." +msgstr "" + +#: src/Model/User.php:811 +msgid "" +"An error occurred creating your default contact group. Please try again." +msgstr "" + +#: src/Model/User.php:888 +#, php-format +msgid "" +"\n" +"\t\t\tDear %1$s,\n" +"\t\t\t\tThank you for registering at %2$s. Your account is pending for " +"approval by the administrator.\n" +"\n" +"\t\t\tYour login details are as follows:\n" +"\n" +"\t\t\tSite Location:\t%3$s\n" +"\t\t\tLogin Name:\t\t%4$s\n" +"\t\t\tPassword:\t\t%5$s\n" +"\t\t" +msgstr "" + +#: src/Model/User.php:909 +#, php-format +msgid "Registration at %s" +msgstr "" + +#: src/Model/User.php:929 +#, php-format +msgid "" +"\n" +"\t\t\t\tDear %1$s,\n" +"\t\t\t\tThank you for registering at %2$s. Your account has been created.\n" +"\t\t\t" +msgstr "" + +#: src/Model/User.php:937 +#, php-format +msgid "" +"\n" +"\t\t\tThe login details are as follows:\n" +"\n" +"\t\t\tSite Location:\t%3$s\n" +"\t\t\tLogin Name:\t\t%1$s\n" +"\t\t\tPassword:\t\t%5$s\n" +"\n" +"\t\t\tYou may change your password from your account \"Settings\" page after " +"logging\n" +"\t\t\tin.\n" +"\n" +"\t\t\tPlease take a few moments to review the other account settings on that " +"page.\n" +"\n" +"\t\t\tYou may also wish to add some basic information to your default " +"profile\n" +"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" +"\n" +"\t\t\tWe recommend setting your full name, adding a profile photo,\n" +"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - " +"and\n" +"\t\t\tperhaps what country you live in; if you do not wish to be more " +"specific\n" +"\t\t\tthan that.\n" +"\n" +"\t\t\tWe fully respect your right to privacy, and none of these items are " +"necessary.\n" +"\t\t\tIf you are new and do not know anybody here, they may help\n" +"\t\t\tyou to make some new and interesting friends.\n" +"\n" +"\t\t\tIf you ever want to delete your account, you can do so at %3$s/" +"removeme\n" +"\n" +"\t\t\tThank you and welcome to %2$s." +msgstr "" + +#: src/Model/User.php:976 src/Module/Admin/Users.php:88 +#, php-format +msgid "Registration details for %s" +msgstr "" + +#: src/Model/Mail.php:114 src/Model/Mail.php:251 +msgid "[no subject]" +msgstr "" + +#: src/Model/Group.php:77 +msgid "" +"A deleted group with this name was revived. Existing item permissions " +"may apply to this group and any future members. If this is " +"not what you intended, please create another group with a different name." +msgstr "" + +#: src/Model/Group.php:426 +msgid "Default privacy group for new contacts" +msgstr "" + +#: src/Model/Group.php:458 +msgid "Everybody" +msgstr "" + +#: src/Model/Group.php:477 +msgid "edit" +msgstr "" + +#: src/Model/Group.php:502 +msgid "add" +msgstr "" + +#: src/Model/Group.php:503 src/Module/Welcome.php:57 src/Module/Contact.php:729 +msgid "Groups" +msgstr "" + +#: src/Model/Group.php:507 +msgid "Edit group" +msgstr "" + +#: src/Model/Group.php:508 src/Module/Group.php:186 +msgid "Contacts not in any group" +msgstr "" + +#: src/Model/Group.php:510 +msgid "Create a new group" +msgstr "" + +#: src/Model/Group.php:511 src/Module/Group.php:171 src/Module/Group.php:194 +#: src/Module/Group.php:271 +msgid "Group Name: " +msgstr "" + +#: src/Model/Group.php:512 +msgid "Edit groups" +msgstr "" + +#: src/Model/FileTag.php:265 +msgid "Item filed" +msgstr "" + +#: src/Model/Contact.php:1251 src/Model/Contact.php:1264 +msgid "UnFollow" +msgstr "" + +#: src/Model/Contact.php:1260 +msgid "Drop Contact" +msgstr "" + +#: src/Model/Contact.php:1270 src/Module/Admin/Users.php:286 +#: mod/notifications.php:198 mod/notifications.php:292 +msgid "Approve" +msgstr "" + +#: src/Model/Contact.php:1818 +msgid "Organisation" +msgstr "" + +#: src/Model/Contact.php:1822 +msgid "News" +msgstr "" + +#: src/Model/Contact.php:1826 +msgid "Forum" +msgstr "" + +#: src/Model/Contact.php:2216 mod/dfrn_request.php:342 +msgid "Disallowed profile URL." +msgstr "" + +#: src/Model/Contact.php:2221 src/Module/Friendica.php:59 +#: mod/dfrn_request.php:348 +msgid "Blocked domain" +msgstr "" + +#: src/Model/Contact.php:2226 +msgid "Connect URL missing." +msgstr "" + +#: src/Model/Contact.php:2235 +msgid "" +"The contact could not be added. Please check the relevant network " +"credentials in your Settings -> Social Networks page." +msgstr "" + +#: src/Model/Contact.php:2276 +msgid "" +"This site is not configured to allow communications with other networks." +msgstr "" + +#: src/Model/Contact.php:2277 src/Model/Contact.php:2290 +msgid "No compatible communication protocols or feeds were discovered." +msgstr "" + +#: src/Model/Contact.php:2288 +msgid "The profile address specified does not provide adequate information." +msgstr "" + +#: src/Model/Contact.php:2293 +msgid "An author or name was not found." +msgstr "" + +#: src/Model/Contact.php:2296 +msgid "No browser URL could be matched to this address." +msgstr "" + +#: src/Model/Contact.php:2299 +msgid "" +"Unable to match @-style Identity Address with a known protocol or email " +"contact." +msgstr "" + +#: src/Model/Contact.php:2300 +msgid "Use mailto: in front of address to force email check." +msgstr "" + +#: src/Model/Contact.php:2306 +msgid "" +"The profile address specified belongs to a network which has been disabled " +"on this site." +msgstr "" + +#: src/Model/Contact.php:2311 +msgid "" +"Limited profile. This person will be unable to receive direct/personal " +"notifications from you." +msgstr "" + +#: src/Model/Contact.php:2372 +msgid "Unable to retrieve contact information." +msgstr "" + +#: src/Model/Contact.php:2593 mod/dfrn_request.php:562 mod/dfrn_confirm.php:539 +msgid "[Name Withheld]" +msgstr "" + +#: src/Model/Item.php:3398 +msgid "activity" +msgstr "" + +#: src/Model/Item.php:3403 +msgid "post" +msgstr "" + +#: src/Model/Item.php:3526 +#, php-format +msgid "Content warning: %s" +msgstr "" + +#: src/Model/Item.php:3586 mod/videos.php:238 +msgid "View Video" +msgstr "" + +#: src/Model/Item.php:3603 +msgid "bytes" +msgstr "" + +#: src/Model/Item.php:3650 +msgid "View on separate page" +msgstr "" + +#: src/Model/Item.php:3651 +msgid "view on separate page" +msgstr "" + +#: src/Model/Storage/Database.php:36 +#, php-format +msgid "Database storage failed to update %s" +msgstr "" + +#: src/Model/Storage/Database.php:43 +msgid "Database storage failed to insert data" +msgstr "" + +#: src/Model/Storage/Filesystem.php:63 +#, php-format +msgid "" +"Filesystem storage failed to create \"%s\". Check you write permissions." +msgstr "" + +#: src/Model/Storage/Filesystem.php:105 +#, php-format +msgid "" +"Filesystem storage failed to save data to \"%s\". Check your write " +"permissions" +msgstr "" + +#: src/Model/Storage/Filesystem.php:126 +msgid "Storage base path" +msgstr "" + +#: src/Model/Storage/Filesystem.php:128 +msgid "" +"Folder where uploaded files are saved. For maximum security, This should be " +"a path outside web server folder tree" +msgstr "" + +#: src/Model/Storage/Filesystem.php:138 +msgid "Enter a valid existing folder" +msgstr "" + +#: src/Model/Notify.php:275 src/Model/Notify.php:287 +#, php-format +msgid "%s commented on %s's post" +msgstr "" + +#: src/Model/Notify.php:286 +#, php-format +msgid "%s created a new post" +msgstr "" + +#: src/Model/Notify.php:300 +#, php-format +msgid "%s liked %s's post" +msgstr "" + +#: src/Model/Notify.php:313 +#, php-format +msgid "%s disliked %s's post" +msgstr "" + +#: src/Model/Notify.php:326 +#, php-format +msgid "%s is attending %s's event" +msgstr "" + +#: src/Model/Notify.php:339 +#, php-format +msgid "%s is not attending %s's event" +msgstr "" + +#: src/Model/Notify.php:352 +#, php-format +msgid "%s may attend %s's event" +msgstr "" + +#: src/Model/Notify.php:385 +#, php-format +msgid "%s is now friends with %s" +msgstr "" + +#: src/Model/Notify.php:678 +msgid "Friend Suggestion" +msgstr "" + +#: src/Model/Notify.php:712 +msgid "Friend/Connect Request" +msgstr "" + +#: src/Model/Notify.php:712 +msgid "New Follower" +msgstr "" + +#: src/Protocol/OStatus.php:1277 src/Module/Profile.php:117 +#: src/Module/Profile.php:120 +#, php-format +msgid "%s's timeline" +msgstr "" + +#: src/Protocol/OStatus.php:1281 src/Module/Profile.php:118 +#, php-format +msgid "%s's posts" +msgstr "" + +#: src/Protocol/OStatus.php:1284 src/Module/Profile.php:119 +#, php-format +msgid "%s's comments" +msgstr "" + +#: src/Protocol/OStatus.php:1839 +#, php-format +msgid "%s is now following %s." +msgstr "" + +#: src/Protocol/OStatus.php:1840 +msgid "following" +msgstr "" + +#: src/Protocol/OStatus.php:1843 +#, php-format +msgid "%s stopped following %s." +msgstr "" + +#: src/Protocol/OStatus.php:1844 +msgid "stopped following" +msgstr "" + +#: src/Protocol/Diaspora.php:3585 +msgid "Attachments:" +msgstr "" + +#: src/LegacyModule.php:30 +#, php-format +msgid "Legacy module file not found: %s" +msgstr "" + +#: src/Core/Update.php:193 +#, php-format +msgid "Update %s failed. See error logs." +msgstr "" + +#: src/Core/Update.php:257 +#, php-format +msgid "" +"\n" +"\t\t\t\tThe friendica developers released update %s recently,\n" +"\t\t\t\tbut when I tried to install it, something went terribly wrong.\n" +"\t\t\t\tThis needs to be fixed soon and I can't do it alone. Please contact " +"a\n" +"\t\t\t\tfriendica developer if you can not help me on your own. My database " +"might be invalid." +msgstr "" + +#: src/Core/Update.php:263 +#, php-format +msgid "" +"The error message is\n" +"[pre]%s[/pre]" +msgstr "" + +#: src/Core/Update.php:269 src/Core/Update.php:308 +msgid "[Friendica Notify] Database update" +msgstr "" + +#: src/Core/Update.php:300 +#, php-format +msgid "" +"\n" +"\t\t\t\t\tThe friendica database was successfully updated from %s to %s." +msgstr "" + #: src/Core/L10n/L10n.php:428 msgid "Sep" msgstr "" -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:413 -msgid "Oct" -msgstr "" - -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:414 -msgid "Nov" -msgstr "" - -#: src/Core/L10n/L10n.php:428 src/Model/Event.php:415 -msgid "Dec" -msgstr "" - #: src/Core/L10n/L10n.php:447 msgid "poke" msgstr "" @@ -4629,39 +3479,85 @@ msgstr "" msgid "rebuffed" msgstr "" -#: src/Core/Update.php:193 -#, php-format -msgid "Update %s failed. See error logs." +#: src/Core/Authentication.php:176 src/Core/Authentication.php:228 +#: mod/openid.php:79 +msgid "Login failed." msgstr "" -#: src/Core/Update.php:257 +#: src/Core/Authentication.php:239 +msgid "Login failed. Please check your credentials." +msgstr "" + +#: src/Core/Authentication.php:355 #, php-format +msgid "Welcome %s" +msgstr "" + +#: src/Core/Authentication.php:356 +msgid "Please upload a profile photo." +msgstr "" + +#: src/Core/Authentication.php:359 +#, php-format +msgid "Welcome back %s" +msgstr "" + +#: src/Core/ACL.php:290 mod/lockview.php:84 mod/lockview.php:119 +msgid "Mutuals" +msgstr "" + +#: src/Core/ACL.php:376 +msgid "Post to Email" +msgstr "" + +#: src/Core/ACL.php:394 +msgid "Public" +msgstr "" + +#: src/Core/ACL.php:395 msgid "" -"\n" -"\t\t\t\tThe friendica developers released update %s recently,\n" -"\t\t\t\tbut when I tried to install it, something went terribly wrong.\n" -"\t\t\t\tThis needs to be fixed soon and I can't do it alone. Please contact " -"a\n" -"\t\t\t\tfriendica developer if you can not help me on your own. My database " -"might be invalid." +"This content will be shown to all your followers and can be seen in the " +"community pages and by anyone with its link." msgstr "" -#: src/Core/Update.php:263 -#, php-format +#: src/Core/ACL.php:396 +msgid "Limited/Private" +msgstr "" + +#: src/Core/ACL.php:397 msgid "" -"The error message is\n" -"[pre]%s[/pre]" +"This content will be shown only to the people in the first box, to the " +"exception of the people mentioned in the second box. It won't appear " +"anywhere public." msgstr "" -#: src/Core/Update.php:269 src/Core/Update.php:308 -msgid "[Friendica Notify] Database update" +#: src/Core/ACL.php:398 +msgid "Show to:" msgstr "" -#: src/Core/Update.php:300 +#: src/Core/ACL.php:399 +msgid "Except to:" +msgstr "" + +#: src/Core/ACL.php:400 mod/editpost.php:96 +msgid "CC: email addresses" +msgstr "" + +#: src/Core/ACL.php:401 mod/editpost.php:103 +msgid "Example: bob@example.com, mary@example.com" +msgstr "" + +#: src/Core/ACL.php:402 +msgid "Connectors" +msgstr "" + +#: src/Core/ACL.php:403 +msgid "Hide your profile details from unknown viewers?" +msgstr "" + +#: src/Core/ACL.php:403 #, php-format -msgid "" -"\n" -"\t\t\t\t\tThe friendica database was successfully updated from %s to %s." +msgid "Connectors disabled, since \"%s\" is enabled." msgstr "" #: src/Core/UserImport.php:107 @@ -4696,31 +3592,6 @@ msgstr[1] "" msgid "Done. You can now login with your username and password" msgstr "" -#: src/Core/ACL.php:289 src/Module/Item/Compose.php:143 -msgid "Post to Email" -msgstr "" - -#: src/Core/ACL.php:301 -msgid "Visible to everybody" -msgstr "" - -#: src/Core/ACL.php:312 -msgid "Connectors" -msgstr "" - -#: src/Core/ACL.php:314 -msgid "Hide your profile details from unknown viewers?" -msgstr "" - -#: src/Core/ACL.php:314 -#, php-format -msgid "Connectors disabled, since \"%s\" is enabled." -msgstr "" - -#: src/Core/ACL.php:316 -msgid "Close" -msgstr "" - #: src/Core/Installer.php:162 msgid "" "The database configuration file \"config/local.config.php\" could not be " @@ -4993,1731 +3864,567 @@ msgstr "" msgid "Could not connect to database." msgstr "" -#: src/Core/Session.php:199 +#: src/Module/Directory.php:31 src/Module/Debug/WebFinger.php:19 +#: src/Module/Debug/Probe.php:20 src/Module/Search/Index.php:31 +#: src/Module/Search/Index.php:36 mod/community.php:25 mod/display.php:169 +#: mod/dfrn_request.php:599 mod/photos.php:841 mod/videos.php:115 +msgid "Public access denied." +msgstr "" + +#: src/Module/Directory.php:59 +msgid "No entries (some entries may be hidden)." +msgstr "" + +#: src/Module/Directory.php:78 +msgid "Find on this site" +msgstr "" + +#: src/Module/Directory.php:80 +msgid "Results for:" +msgstr "" + +#: src/Module/Directory.php:82 +msgid "Site Directory" +msgstr "" + +#: src/Module/Special/HTTPException.php:32 +msgid "Bad Request" +msgstr "" + +#: src/Module/Special/HTTPException.php:33 +msgid "Unauthorized" +msgstr "" + +#: src/Module/Special/HTTPException.php:34 +msgid "Forbidden" +msgstr "" + +#: src/Module/Special/HTTPException.php:35 +msgid "Not Found" +msgstr "" + +#: src/Module/Special/HTTPException.php:36 +msgid "Internal Server Error" +msgstr "" + +#: src/Module/Special/HTTPException.php:37 +msgid "Service Unavailable" +msgstr "" + +#: src/Module/Special/HTTPException.php:44 +msgid "" +"The server cannot or will not process the request due to an apparent client " +"error." +msgstr "" + +#: src/Module/Special/HTTPException.php:45 +msgid "Authentication is required and has failed or has not yet been provided." +msgstr "" + +#: src/Module/Special/HTTPException.php:46 +msgid "" +"The request was valid, but the server is refusing action. The user might not " +"have the necessary permissions for a resource, or may need an account." +msgstr "" + +#: src/Module/Special/HTTPException.php:47 +msgid "" +"The requested resource could not be found but may be available in the future." +msgstr "" + +#: src/Module/Special/HTTPException.php:48 +msgid "" +"An unexpected condition was encountered and no more specific message is " +"suitable." +msgstr "" + +#: src/Module/Special/HTTPException.php:49 +msgid "" +"The server is currently unavailable (because it is overloaded or down for " +"maintenance). Please try again later." +msgstr "" + +#: src/Module/Special/HTTPException.php:55 +msgid "Go back" +msgstr "" + +#: src/Module/Help.php:43 +msgid "Help:" +msgstr "" + +#: src/Module/Delegation.php:130 +msgid "Manage Identities and/or Pages" +msgstr "" + +#: src/Module/Delegation.php:131 +msgid "" +"Toggle between different identities or community/group pages which share " +"your account details or which you have been granted \"manage\" permissions" +msgstr "" + +#: src/Module/Delegation.php:132 +msgid "Select an identity to manage: " +msgstr "" + +#: src/Module/Tos.php:35 src/Module/Tos.php:77 +msgid "" +"At the time of registration, and for providing communications between the " +"user account and their contacts, the user has to provide a display name (pen " +"name), an username (nickname) and a working email address. The names will be " +"accessible on the profile page of the account by any visitor of the page, " +"even if other profile details are not displayed. The email address will only " +"be used to send the user notifications about interactions, but wont be " +"visibly displayed. The listing of an account in the node's user directory or " +"the global user directory is optional and can be controlled in the user " +"settings, it is not necessary for communication." +msgstr "" + +#: src/Module/Tos.php:36 src/Module/Tos.php:78 +msgid "" +"This data is required for communication and is passed on to the nodes of the " +"communication partners and is stored there. Users can enter additional " +"private data that may be transmitted to the communication partners accounts." +msgstr "" + +#: src/Module/Tos.php:37 src/Module/Tos.php:79 #, php-format -msgid "Welcome %s" +msgid "" +"At any point in time a logged in user can export their account data from the " +"account settings. If the user wants " +"to delete their account they can do so at %1$s/" +"removeme. The deletion of the account will be permanent. Deletion of the " +"data will also be requested from the nodes of the communication partners." msgstr "" -#: src/Core/Session.php:200 -msgid "Please upload a profile photo." +#: src/Module/Tos.php:40 src/Module/Tos.php:76 +msgid "Privacy Statement" msgstr "" -#: src/Core/Session.php:203 +#: src/Module/Install.php:159 +msgid "Friendica Communications Server - Setup" +msgstr "" + +#: src/Module/Install.php:170 +msgid "System check" +msgstr "" + +#: src/Module/Install.php:174 mod/events.php:400 mod/cal.php:264 +msgid "Next" +msgstr "" + +#: src/Module/Install.php:175 +msgid "Check again" +msgstr "" + +#: src/Module/Install.php:182 src/Module/Admin/Site.php:514 +msgid "No SSL policy, links will track page SSL state" +msgstr "" + +#: src/Module/Install.php:183 src/Module/Admin/Site.php:515 +msgid "Force all links to use SSL" +msgstr "" + +#: src/Module/Install.php:184 src/Module/Admin/Site.php:516 +msgid "Self-signed certificate, use SSL for local links only (discouraged)" +msgstr "" + +#: src/Module/Install.php:190 +msgid "Base settings" +msgstr "" + +#: src/Module/Install.php:192 src/Module/Admin/Site.php:592 +msgid "SSL link policy" +msgstr "" + +#: src/Module/Install.php:194 src/Module/Admin/Site.php:592 +msgid "Determines whether generated links should be forced to use SSL" +msgstr "" + +#: src/Module/Install.php:197 +msgid "Host name" +msgstr "" + +#: src/Module/Install.php:199 +msgid "" +"Overwrite this field in case the determinated hostname isn't right, " +"otherweise leave it as is." +msgstr "" + +#: src/Module/Install.php:202 +msgid "Base path to installation" +msgstr "" + +#: src/Module/Install.php:204 +msgid "" +"If the system cannot detect the correct path to your installation, enter the " +"correct path here. This setting should only be set if you are using a " +"restricted system and symbolic links to your webroot." +msgstr "" + +#: src/Module/Install.php:207 +msgid "Sub path of the URL" +msgstr "" + +#: src/Module/Install.php:209 +msgid "" +"Overwrite this field in case the sub path determination isn't right, " +"otherwise leave it as is. Leaving this field blank means the installation is " +"at the base URL without sub path." +msgstr "" + +#: src/Module/Install.php:220 +msgid "Database connection" +msgstr "" + +#: src/Module/Install.php:221 +msgid "" +"In order to install Friendica we need to know how to connect to your " +"database." +msgstr "" + +#: src/Module/Install.php:222 +msgid "" +"Please contact your hosting provider or site administrator if you have " +"questions about these settings." +msgstr "" + +#: src/Module/Install.php:223 +msgid "" +"The database you specify below should already exist. If it does not, please " +"create it before continuing." +msgstr "" + +#: src/Module/Install.php:230 +msgid "Database Server Name" +msgstr "" + +#: src/Module/Install.php:235 +msgid "Database Login Name" +msgstr "" + +#: src/Module/Install.php:241 +msgid "Database Login Password" +msgstr "" + +#: src/Module/Install.php:243 +msgid "For security reasons the password must not be empty" +msgstr "" + +#: src/Module/Install.php:246 +msgid "Database Name" +msgstr "" + +#: src/Module/Install.php:250 src/Module/Install.php:279 +msgid "Please select a default timezone for your website" +msgstr "" + +#: src/Module/Install.php:264 +msgid "Site settings" +msgstr "" + +#: src/Module/Install.php:274 +msgid "Site administrator email address" +msgstr "" + +#: src/Module/Install.php:276 +msgid "" +"Your account email address must match this in order to use the web admin " +"panel." +msgstr "" + +#: src/Module/Install.php:283 +msgid "System Language:" +msgstr "" + +#: src/Module/Install.php:285 +msgid "" +"Set the default language for your Friendica installation interface and to " +"send emails." +msgstr "" + +#: src/Module/Install.php:297 +msgid "Your Friendica site database has been installed." +msgstr "" + +#: src/Module/Install.php:305 +msgid "Installation finished" +msgstr "" + +#: src/Module/Install.php:327 +msgid "

What next

" +msgstr "" + +#: src/Module/Install.php:328 +msgid "" +"IMPORTANT: You will need to [manually] setup a scheduled task for the worker." +msgstr "" + +#: src/Module/Install.php:331 #, php-format -msgid "Welcome back %s" +msgid "" +"Go to your new Friendica node registration page " +"and register as new user. Remember to use the same email you have entered as " +"administrator email. This will allow you to enter the site admin panel." msgstr "" -#: src/Util/Temporal.php:146 src/Model/Profile.php:780 -msgid "Birthday:" +#: src/Module/BaseAdminModule.php:56 mod/api.php:95 +msgid "Please login to continue." msgstr "" -#: src/Util/Temporal.php:150 -msgid "YYYY-MM-DD or MM-DD" +#: src/Module/BaseAdminModule.php:62 +msgid "" +"Submanaged account can't access the administation pages. Please log back in " +"as the master account." msgstr "" -#: src/Util/Temporal.php:297 -msgid "never" +#: src/Module/BaseAdminModule.php:76 +msgid "Overview" msgstr "" -#: src/Util/Temporal.php:304 -msgid "less than a second ago" +#: src/Module/BaseAdminModule.php:77 src/Module/Admin/Federation.php:188 +msgid "Federation Statistics" msgstr "" -#: src/Util/Temporal.php:312 -msgid "year" +#: src/Module/BaseAdminModule.php:79 +msgid "Configuration" msgstr "" -#: src/Util/Temporal.php:312 -msgid "years" +#: src/Module/BaseAdminModule.php:80 src/Module/Admin/Site.php:567 +msgid "Site" msgstr "" -#: src/Util/Temporal.php:313 -msgid "months" +#: src/Module/BaseAdminModule.php:81 src/Module/Admin/Users.php:278 +#: src/Module/Admin/Users.php:295 src/Module/Admin/Site.php:471 +msgid "Users" msgstr "" -#: src/Util/Temporal.php:314 -msgid "weeks" +#: src/Module/BaseAdminModule.php:82 src/Module/Admin/Addons/Details.php:100 +#: src/Module/Admin/Addons/Index.php:51 src/Module/BaseSettingsModule.php:68 +#: mod/settings.php:112 +msgid "Addons" msgstr "" -#: src/Util/Temporal.php:315 -msgid "days" +#: src/Module/BaseAdminModule.php:83 src/Module/Admin/Themes/Details.php:105 +#: src/Module/Admin/Themes/Index.php:96 +msgid "Themes" msgstr "" -#: src/Util/Temporal.php:316 -msgid "hour" +#: src/Module/BaseAdminModule.php:84 src/Module/BaseSettingsModule.php:46 +#: mod/settings.php:90 +msgid "Additional features" msgstr "" -#: src/Util/Temporal.php:316 -msgid "hours" +#: src/Module/BaseAdminModule.php:87 +msgid "Database" msgstr "" -#: src/Util/Temporal.php:317 -msgid "minute" +#: src/Module/BaseAdminModule.php:88 +msgid "DB updates" msgstr "" -#: src/Util/Temporal.php:317 -msgid "minutes" +#: src/Module/BaseAdminModule.php:89 +msgid "Inspect Deferred Workers" msgstr "" -#: src/Util/Temporal.php:318 -msgid "second" +#: src/Module/BaseAdminModule.php:90 +msgid "Inspect worker Queue" msgstr "" -#: src/Util/Temporal.php:318 -msgid "seconds" +#: src/Module/BaseAdminModule.php:92 +msgid "Tools" msgstr "" -#: src/Util/Temporal.php:328 -#, php-format -msgid "in %1$d %2$s" +#: src/Module/BaseAdminModule.php:93 +msgid "Contact Blocklist" msgstr "" -#: src/Util/Temporal.php:331 -#, php-format -msgid "%1$d %2$s ago" +#: src/Module/BaseAdminModule.php:94 +msgid "Server Blocklist" msgstr "" -#: src/Content/Text/BBCode.php:467 -msgid "view full size" +#: src/Module/BaseAdminModule.php:95 src/Module/Admin/Item/Delete.php:47 +msgid "Delete Item" msgstr "" -#: src/Content/Text/BBCode.php:913 src/Content/Text/BBCode.php:1579 -#: src/Content/Text/BBCode.php:1580 -msgid "Image/photo" +#: src/Module/BaseAdminModule.php:97 src/Module/BaseAdminModule.php:98 +#: src/Module/Admin/Logs/Settings.php:64 +msgid "Logs" msgstr "" -#: src/Content/Text/BBCode.php:1031 -#, php-format -msgid "%2$s %3$s" +#: src/Module/BaseAdminModule.php:99 src/Module/Admin/Logs/View.php:47 +msgid "View Logs" msgstr "" -#: src/Content/Text/BBCode.php:1497 src/Content/Text/HTML.php:963 -msgid "Click to open/close" +#: src/Module/BaseAdminModule.php:101 +msgid "Diagnostics" msgstr "" -#: src/Content/Text/BBCode.php:1528 -msgid "$1 wrote:" +#: src/Module/BaseAdminModule.php:102 +msgid "PHP Info" msgstr "" -#: src/Content/Text/BBCode.php:1582 src/Content/Text/BBCode.php:1583 -msgid "Encrypted content" +#: src/Module/BaseAdminModule.php:103 +msgid "probe address" msgstr "" -#: src/Content/Text/BBCode.php:1805 -msgid "Invalid source protocol" +#: src/Module/BaseAdminModule.php:104 +msgid "check webfinger" msgstr "" -#: src/Content/Text/BBCode.php:1820 -msgid "Invalid link protocol" +#: src/Module/BaseAdminModule.php:105 +msgid "Item Source" msgstr "" -#: src/Content/Text/HTML.php:811 -msgid "Loading more entries..." +#: src/Module/BaseAdminModule.php:106 +msgid "Babel" msgstr "" -#: src/Content/Text/HTML.php:812 -msgid "The end" +#: src/Module/BaseAdminModule.php:115 +msgid "Addon Features" msgstr "" -#: src/Content/Text/HTML.php:905 src/Model/Profile.php:540 -#: src/Module/Contact.php:318 -msgid "Follow" +#: src/Module/BaseAdminModule.php:116 +msgid "User registrations waiting for confirmation" msgstr "" -#: src/Content/Text/HTML.php:911 src/Content/Nav.php:200 -#: src/Module/Search/Index.php:80 -msgid "Search" +#: src/Module/Login.php:96 +msgid "Create a New Account" msgstr "" -#: src/Content/Text/HTML.php:913 src/Content/Nav.php:79 -msgid "@name, !forum, #tags, content" +#: src/Module/Login.php:121 +msgid "Your OpenID: " msgstr "" -#: src/Content/Text/HTML.php:920 src/Content/Nav.php:203 -msgid "Full Text" +#: src/Module/Login.php:124 +msgid "" +"Please enter your username and password to add the OpenID to your existing " +"account." msgstr "" -#: src/Content/Text/HTML.php:921 src/Content/Widget/TagCloud.php:54 -#: src/Content/Nav.php:204 -msgid "Tags" +#: src/Module/Login.php:126 +msgid "Or login using OpenID: " msgstr "" -#: src/Content/Widget/TrendingTags.php:34 -#, php-format -msgid "Trending Tags (last %d hour)" -msgid_plural "Trending Tags (last %d hours)" +#: src/Module/Login.php:139 mod/lostpass.php:120 +msgid "Nickname or Email: " +msgstr "" + +#: src/Module/Login.php:140 +msgid "Password: " +msgstr "" + +#: src/Module/Login.php:141 +msgid "Remember me" +msgstr "" + +#: src/Module/Login.php:150 +msgid "Forgot your password?" +msgstr "" + +#: src/Module/Login.php:151 mod/lostpass.php:136 +msgid "Password Reset" +msgstr "" + +#: src/Module/Login.php:153 +msgid "Website Terms of Service" +msgstr "" + +#: src/Module/Login.php:154 +msgid "terms of service" +msgstr "" + +#: src/Module/Login.php:156 +msgid "Website Privacy Policy" +msgstr "" + +#: src/Module/Login.php:157 +msgid "privacy policy" +msgstr "" + +#: src/Module/Profile.php:175 mod/cal.php:130 mod/display.php:265 +msgid "Access to this profile has been restricted." +msgstr "" + +#: src/Module/TwoFactor/Verify.php:46 src/Module/TwoFactor/Recovery.php:49 +#: src/Module/Settings/TwoFactor/Verify.php:67 +msgid "Invalid code, please retry." +msgstr "" + +#: src/Module/TwoFactor/Verify.php:65 +#: src/Module/Settings/TwoFactor/Index.php:89 +#: src/Module/BaseSettingsModule.php:31 mod/settings.php:75 +msgid "Two-factor authentication" +msgstr "" + +#: src/Module/TwoFactor/Verify.php:66 +msgid "" +"

Open the two-factor authentication app on your device to get an " +"authentication code and verify your identity.

" +msgstr "" + +#: src/Module/TwoFactor/Verify.php:67 mod/repair_ostatus.php:37 +msgid "Error" +msgid_plural "Errors" msgstr[0] "" msgstr[1] "" -#: src/Content/Widget/TrendingTags.php:35 -msgid "More Trending Tags" -msgstr "" - -#: src/Content/Widget/CalendarExport.php:64 -msgid "Export" -msgstr "" - -#: src/Content/Widget/CalendarExport.php:65 -msgid "Export calendar as ical" -msgstr "" - -#: src/Content/Widget/CalendarExport.php:66 -msgid "Export calendar as csv" -msgstr "" - -#: src/Content/Widget/ContactBlock.php:58 -msgid "No contacts" -msgstr "" - -#: src/Content/Widget/ContactBlock.php:90 -#, php-format -msgid "%d Contact" -msgid_plural "%d Contacts" -msgstr[0] "" -msgstr[1] "" - -#: src/Content/Widget/ContactBlock.php:109 -msgid "View Contacts" -msgstr "" - -#: src/Content/Widget/SavedSearches.php:29 -msgid "Remove term" -msgstr "" - -#: src/Content/Widget/SavedSearches.php:37 -msgid "Saved Searches" -msgstr "" - -#: src/Content/Feature.php:82 -msgid "General Features" -msgstr "" - -#: src/Content/Feature.php:84 -msgid "Multiple Profiles" -msgstr "" - -#: src/Content/Feature.php:84 -msgid "Ability to create multiple profiles" -msgstr "" - -#: src/Content/Feature.php:85 -msgid "Photo Location" -msgstr "" - -#: src/Content/Feature.php:85 -msgid "" -"Photo metadata is normally stripped. This extracts the location (if present) " -"prior to stripping metadata and links it to a map." -msgstr "" - -#: src/Content/Feature.php:86 -msgid "Export Public Calendar" -msgstr "" - -#: src/Content/Feature.php:86 -msgid "Ability for visitors to download the public calendar" -msgstr "" - -#: src/Content/Feature.php:87 -msgid "Trending Tags" -msgstr "" - -#: src/Content/Feature.php:87 -msgid "" -"Show a community page widget with a list of the most popular tags in recent " -"public posts." -msgstr "" - -#: src/Content/Feature.php:92 -msgid "Post Composition Features" -msgstr "" - -#: src/Content/Feature.php:93 -msgid "Auto-mention Forums" -msgstr "" - -#: src/Content/Feature.php:93 -msgid "" -"Add/remove mention when a forum page is selected/deselected in ACL window." -msgstr "" - -#: src/Content/Feature.php:94 -msgid "Explicit Mentions" -msgstr "" - -#: src/Content/Feature.php:94 -msgid "" -"Add explicit mentions to comment box for manual control over who gets " -"mentioned in replies." -msgstr "" - -#: src/Content/Feature.php:99 -msgid "Network Sidebar" -msgstr "" - -#: src/Content/Feature.php:100 src/Content/Widget.php:499 -msgid "Archives" -msgstr "" - -#: src/Content/Feature.php:100 -msgid "Ability to select posts by date ranges" -msgstr "" - -#: src/Content/Feature.php:101 -msgid "Protocol Filter" -msgstr "" - -#: src/Content/Feature.php:101 -msgid "Enable widget to display Network posts only from selected protocols" -msgstr "" - -#: src/Content/Feature.php:106 -msgid "Network Tabs" -msgstr "" - -#: src/Content/Feature.php:107 -msgid "Network New Tab" -msgstr "" - -#: src/Content/Feature.php:107 -msgid "Enable tab to display only new Network posts (from the last 12 hours)" -msgstr "" - -#: src/Content/Feature.php:108 -msgid "Network Shared Links Tab" -msgstr "" - -#: src/Content/Feature.php:108 -msgid "Enable tab to display only Network posts with links in them" -msgstr "" - -#: src/Content/Feature.php:113 -msgid "Post/Comment Tools" -msgstr "" - -#: src/Content/Feature.php:114 -msgid "Post Categories" -msgstr "" - -#: src/Content/Feature.php:114 -msgid "Add categories to your posts" -msgstr "" - -#: src/Content/Feature.php:119 -msgid "Advanced Profile Settings" -msgstr "" - -#: src/Content/Feature.php:120 -msgid "List Forums" -msgstr "" - -#: src/Content/Feature.php:120 -msgid "Show visitors public community forums at the Advanced Profile Page" -msgstr "" - -#: src/Content/Feature.php:121 -msgid "Tag Cloud" -msgstr "" - -#: src/Content/Feature.php:121 -msgid "Provide a personal tag cloud on your profile page" -msgstr "" - -#: src/Content/Feature.php:122 -msgid "Display Membership Date" -msgstr "" - -#: src/Content/Feature.php:122 -msgid "Display membership date in profile" -msgstr "" - -#: src/Content/OEmbed.php:254 -msgid "Embedding disabled" -msgstr "" - -#: src/Content/OEmbed.php:377 -msgid "Embedded content" -msgstr "" - -#: src/Content/ContactSelector.php:58 -msgid "Frequently" -msgstr "" - -#: src/Content/ContactSelector.php:59 -msgid "Hourly" -msgstr "" - -#: src/Content/ContactSelector.php:60 -msgid "Twice daily" -msgstr "" - -#: src/Content/ContactSelector.php:61 -msgid "Daily" -msgstr "" - -#: src/Content/ContactSelector.php:62 -msgid "Weekly" -msgstr "" - -#: src/Content/ContactSelector.php:63 -msgid "Monthly" -msgstr "" - -#: src/Content/ContactSelector.php:116 -msgid "DFRN" -msgstr "" - -#: src/Content/ContactSelector.php:117 -msgid "OStatus" -msgstr "" - -#: src/Content/ContactSelector.php:118 -msgid "RSS/Atom" -msgstr "" - -#: src/Content/ContactSelector.php:119 src/Module/Admin/Users.php:272 -#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297 -#: src/Module/Admin/Users.php:315 -msgid "Email" -msgstr "" - -#: src/Content/ContactSelector.php:121 -msgid "Zot!" -msgstr "" - -#: src/Content/ContactSelector.php:122 -msgid "LinkedIn" -msgstr "" - -#: src/Content/ContactSelector.php:123 -msgid "XMPP/IM" -msgstr "" - -#: src/Content/ContactSelector.php:124 -msgid "MySpace" -msgstr "" - -#: src/Content/ContactSelector.php:125 -msgid "Google+" -msgstr "" - -#: src/Content/ContactSelector.php:126 -msgid "pump.io" -msgstr "" - -#: src/Content/ContactSelector.php:127 -msgid "Twitter" -msgstr "" - -#: src/Content/ContactSelector.php:128 -msgid "Diaspora Connector" -msgstr "" - -#: src/Content/ContactSelector.php:129 -msgid "GNU Social Connector" -msgstr "" - -#: src/Content/ContactSelector.php:130 -msgid "ActivityPub" -msgstr "" - -#: src/Content/ContactSelector.php:131 -msgid "pnut" -msgstr "" - -#: src/Content/ContactSelector.php:229 src/Content/ContactSelector.php:269 -#: src/Content/ContactSelector.php:307 -msgid "No answer" -msgstr "" - -#: src/Content/ContactSelector.php:230 -msgid "Male" -msgstr "" - -#: src/Content/ContactSelector.php:231 -msgid "Female" -msgstr "" - -#: src/Content/ContactSelector.php:232 -msgid "Currently Male" -msgstr "" - -#: src/Content/ContactSelector.php:233 -msgid "Currently Female" -msgstr "" - -#: src/Content/ContactSelector.php:234 -msgid "Mostly Male" -msgstr "" - -#: src/Content/ContactSelector.php:235 -msgid "Mostly Female" -msgstr "" - -#: src/Content/ContactSelector.php:236 -msgid "Transgender" -msgstr "" - -#: src/Content/ContactSelector.php:237 -msgid "Intersex" -msgstr "" - -#: src/Content/ContactSelector.php:238 -msgid "Transsexual" -msgstr "" - -#: src/Content/ContactSelector.php:239 -msgid "Hermaphrodite" -msgstr "" - -#: src/Content/ContactSelector.php:240 -msgid "Neuter" -msgstr "" - -#: src/Content/ContactSelector.php:241 -msgid "Non-specific" -msgstr "" - -#: src/Content/ContactSelector.php:242 -msgid "Other" -msgstr "" - -#: src/Content/ContactSelector.php:270 -msgid "Males" -msgstr "" - -#: src/Content/ContactSelector.php:271 -msgid "Females" -msgstr "" - -#: src/Content/ContactSelector.php:272 -msgid "Gay" -msgstr "" - -#: src/Content/ContactSelector.php:273 -msgid "Lesbian" -msgstr "" - -#: src/Content/ContactSelector.php:274 -msgid "No Preference" -msgstr "" - -#: src/Content/ContactSelector.php:275 -msgid "Bisexual" -msgstr "" - -#: src/Content/ContactSelector.php:276 -msgid "Autosexual" -msgstr "" - -#: src/Content/ContactSelector.php:277 -msgid "Abstinent" -msgstr "" - -#: src/Content/ContactSelector.php:278 -msgid "Virgin" -msgstr "" - -#: src/Content/ContactSelector.php:279 -msgid "Deviant" -msgstr "" - -#: src/Content/ContactSelector.php:280 -msgid "Fetish" -msgstr "" - -#: src/Content/ContactSelector.php:281 -msgid "Oodles" -msgstr "" - -#: src/Content/ContactSelector.php:282 -msgid "Nonsexual" -msgstr "" - -#: src/Content/ContactSelector.php:308 -msgid "Single" -msgstr "" - -#: src/Content/ContactSelector.php:309 -msgid "Lonely" -msgstr "" - -#: src/Content/ContactSelector.php:310 -msgid "In a relation" -msgstr "" - -#: src/Content/ContactSelector.php:311 -msgid "Has crush" -msgstr "" - -#: src/Content/ContactSelector.php:312 -msgid "Infatuated" -msgstr "" - -#: src/Content/ContactSelector.php:313 -msgid "Dating" -msgstr "" - -#: src/Content/ContactSelector.php:314 -msgid "Unfaithful" -msgstr "" - -#: src/Content/ContactSelector.php:315 -msgid "Sex Addict" -msgstr "" - -#: src/Content/ContactSelector.php:316 src/Model/User.php:807 -msgid "Friends" -msgstr "" - -#: src/Content/ContactSelector.php:317 -msgid "Friends/Benefits" -msgstr "" - -#: src/Content/ContactSelector.php:318 -msgid "Casual" -msgstr "" - -#: src/Content/ContactSelector.php:319 -msgid "Engaged" -msgstr "" - -#: src/Content/ContactSelector.php:320 -msgid "Married" -msgstr "" - -#: src/Content/ContactSelector.php:321 -msgid "Imaginarily married" -msgstr "" - -#: src/Content/ContactSelector.php:322 -msgid "Partners" -msgstr "" - -#: src/Content/ContactSelector.php:323 -msgid "Cohabiting" -msgstr "" - -#: src/Content/ContactSelector.php:324 -msgid "Common law" -msgstr "" - -#: src/Content/ContactSelector.php:325 -msgid "Happy" -msgstr "" - -#: src/Content/ContactSelector.php:326 -msgid "Not looking" -msgstr "" - -#: src/Content/ContactSelector.php:327 -msgid "Swinger" -msgstr "" - -#: src/Content/ContactSelector.php:328 -msgid "Betrayed" -msgstr "" - -#: src/Content/ContactSelector.php:329 -msgid "Separated" -msgstr "" - -#: src/Content/ContactSelector.php:330 -msgid "Unstable" -msgstr "" - -#: src/Content/ContactSelector.php:331 -msgid "Divorced" -msgstr "" - -#: src/Content/ContactSelector.php:332 -msgid "Imaginarily divorced" -msgstr "" - -#: src/Content/ContactSelector.php:333 -msgid "Widowed" -msgstr "" - -#: src/Content/ContactSelector.php:334 -msgid "Uncertain" -msgstr "" - -#: src/Content/ContactSelector.php:335 -msgid "It's complicated" -msgstr "" - -#: src/Content/ContactSelector.php:336 -msgid "Don't care" -msgstr "" - -#: src/Content/ContactSelector.php:337 -msgid "Ask me" -msgstr "" - -#: src/Content/Nav.php:74 -msgid "Nothing new here" -msgstr "" - -#: src/Content/Nav.php:78 -msgid "Clear notifications" -msgstr "" - -#: src/Content/Nav.php:153 src/Module/Login.php:352 -msgid "Logout" -msgstr "" - -#: src/Content/Nav.php:153 -msgid "End this session" -msgstr "" - -#: src/Content/Nav.php:155 src/Module/Bookmarklet.php:25 -#: src/Module/Login.php:353 -msgid "Login" -msgstr "" - -#: src/Content/Nav.php:155 -msgid "Sign in" -msgstr "" - -#: src/Content/Nav.php:165 -msgid "Personal notes" -msgstr "" - -#: src/Content/Nav.php:165 -msgid "Your personal notes" -msgstr "" - -#: src/Content/Nav.php:182 src/Content/Nav.php:244 -msgid "Home" -msgstr "" - -#: src/Content/Nav.php:182 -msgid "Home Page" -msgstr "" - -#: src/Content/Nav.php:186 src/Module/Login.php:313 src/Module/Register.php:130 -msgid "Register" -msgstr "" - -#: src/Content/Nav.php:186 -msgid "Create an account" -msgstr "" - -#: src/Content/Nav.php:192 -msgid "Help and documentation" -msgstr "" - -#: src/Content/Nav.php:196 -msgid "Apps" -msgstr "" - -#: src/Content/Nav.php:196 -msgid "Addon applications, utilities, games" -msgstr "" - -#: src/Content/Nav.php:200 -msgid "Search site content" -msgstr "" - -#: src/Content/Nav.php:224 -msgid "Community" -msgstr "" - -#: src/Content/Nav.php:224 -msgid "Conversations on this and other servers" -msgstr "" - -#: src/Content/Nav.php:231 -msgid "Directory" -msgstr "" - -#: src/Content/Nav.php:231 -msgid "People directory" -msgstr "" - -#: src/Content/Nav.php:233 src/Module/BaseAdminModule.php:75 -msgid "Information" -msgstr "" - -#: src/Content/Nav.php:233 -msgid "Information about this friendica instance" -msgstr "" - -#: src/Content/Nav.php:236 src/Module/Admin/Tos.php:43 -#: src/Module/BaseAdminModule.php:85 src/Module/Register.php:138 -#: src/Module/Tos.php:73 -msgid "Terms of Service" -msgstr "" - -#: src/Content/Nav.php:236 -msgid "Terms of Service of this Friendica instance" -msgstr "" - -#: src/Content/Nav.php:242 -msgid "Network Reset" -msgstr "" - -#: src/Content/Nav.php:242 -msgid "Load Network page with no filters" -msgstr "" - -#: src/Content/Nav.php:248 -msgid "Introductions" -msgstr "" - -#: src/Content/Nav.php:248 -msgid "Friend Requests" -msgstr "" - -#: src/Content/Nav.php:250 -msgid "See all notifications" -msgstr "" - -#: src/Content/Nav.php:251 -msgid "Mark all system notifications seen" -msgstr "" - -#: src/Content/Nav.php:255 -msgid "Inbox" -msgstr "" - -#: src/Content/Nav.php:256 -msgid "Outbox" -msgstr "" - -#: src/Content/Nav.php:260 -msgid "Delegation" -msgstr "" - -#: src/Content/Nav.php:260 -msgid "Manage other pages" -msgstr "" - -#: src/Content/Nav.php:266 -msgid "Manage/Edit Profiles" -msgstr "" - -#: src/Content/Nav.php:274 src/Module/BaseAdminModule.php:114 -msgid "Admin" -msgstr "" - -#: src/Content/Nav.php:274 -msgid "Site setup and configuration" -msgstr "" - -#: src/Content/Nav.php:277 -msgid "Navigation" -msgstr "" - -#: src/Content/Nav.php:277 -msgid "Site map" -msgstr "" - -#: src/Content/Pager.php:153 -msgid "newer" -msgstr "" - -#: src/Content/Pager.php:158 -msgid "older" -msgstr "" - -#: src/Content/Pager.php:203 -msgid "prev" -msgstr "" - -#: src/Content/Pager.php:263 -msgid "last" -msgstr "" - -#: src/Content/Widget.php:39 -msgid "Add New Contact" -msgstr "" - -#: src/Content/Widget.php:40 -msgid "Enter address or web location" -msgstr "" - -#: src/Content/Widget.php:41 -msgid "Example: bob@example.com, http://example.com/barbara" -msgstr "" - -#: src/Content/Widget.php:59 -#, php-format -msgid "%d invitation available" -msgid_plural "%d invitations available" -msgstr[0] "" -msgstr[1] "" - -#: src/Content/Widget.php:194 src/Module/Profile/Contacts.php:127 -#: src/Module/Contact.php:793 -msgid "Following" -msgstr "" - -#: src/Content/Widget.php:195 src/Module/Profile/Contacts.php:128 -#: src/Module/Contact.php:794 -msgid "Mutual friends" -msgstr "" - -#: src/Content/Widget.php:200 -msgid "Relationships" -msgstr "" - -#: src/Content/Widget.php:202 src/Module/Group.php:287 -#: src/Module/Contact.php:681 -msgid "All Contacts" -msgstr "" - -#: src/Content/Widget.php:245 -msgid "Protocols" -msgstr "" - -#: src/Content/Widget.php:247 -msgid "All Protocols" -msgstr "" - -#: src/Content/Widget.php:284 -msgid "Saved Folders" -msgstr "" - -#: src/Content/Widget.php:286 src/Content/Widget.php:325 -msgid "Everything" -msgstr "" - -#: src/Content/Widget.php:323 -msgid "Categories" -msgstr "" - -#: src/Content/Widget.php:400 -#, php-format -msgid "%d contact in common" -msgid_plural "%d contacts in common" -msgstr[0] "" -msgstr[1] "" - -#: src/Database/DBStructure.php:50 -msgid "There are no tables on MyISAM." -msgstr "" - -#: src/Database/DBStructure.php:74 +#: src/Module/TwoFactor/Verify.php:69 src/Module/TwoFactor/Recovery.php:70 #, php-format msgid "" -"\n" -"Error %d occurred during database update:\n" -"%s\n" +"Don’t have your phone? Enter a two-factor recovery code" msgstr "" -#: src/Database/DBStructure.php:77 -msgid "Errors encountered performing database changes: " +#: src/Module/TwoFactor/Verify.php:70 +#: src/Module/Settings/TwoFactor/Verify.php:126 +msgid "Please enter a code from your authentication app" msgstr "" -#: src/Database/DBStructure.php:266 +#: src/Module/TwoFactor/Verify.php:71 +msgid "Verify code and complete login" +msgstr "" + +#: src/Module/TwoFactor/Recovery.php:42 #, php-format -msgid "%s: Database update" +msgid "Remaining recovery codes: %d" msgstr "" -#: src/Database/DBStructure.php:527 -#, php-format -msgid "%s: updating %s table." +#: src/Module/TwoFactor/Recovery.php:68 +msgid "Two-factor recovery" msgstr "" -#: src/Model/Storage/Database.php:36 -#, php-format -msgid "Database storage failed to update %s" -msgstr "" - -#: src/Model/Storage/Database.php:43 -msgid "Database storage failed to insert data" -msgstr "" - -#: src/Model/Storage/Filesystem.php:63 -#, php-format +#: src/Module/TwoFactor/Recovery.php:69 msgid "" -"Filesystem storage failed to create \"%s\". Check you write permissions." +"

You can enter one of your one-time recovery codes in case you lost access " +"to your mobile device.

" msgstr "" -#: src/Model/Storage/Filesystem.php:105 +#: src/Module/TwoFactor/Recovery.php:71 +msgid "Please enter a recovery code" +msgstr "" + +#: src/Module/TwoFactor/Recovery.php:72 +msgid "Submit recovery code and complete login" +msgstr "" + +#: src/Module/Maintenance.php:29 +msgid "System down for maintenance" +msgstr "" + +#: src/Module/Bookmarklet.php:35 +msgid "This page is missing a url parameter." +msgstr "" + +#: src/Module/Bookmarklet.php:57 +msgid "The post was created" +msgstr "" + +#: src/Module/Photo.php:87 #, php-format -msgid "" -"Filesystem storage failed to save data to \"%s\". Check your write " -"permissions" +msgid "Invalid photo with id %s." msgstr "" -#: src/Model/Storage/Filesystem.php:126 -msgid "Storage base path" -msgstr "" - -#: src/Model/Storage/Filesystem.php:128 -msgid "" -"Folder where uploaded files are saved. For maximum security, This should be " -"a path outside web server folder tree" -msgstr "" - -#: src/Model/Storage/Filesystem.php:138 -msgid "Enter a valid existing folder" -msgstr "" - -#: src/Model/FileTag.php:265 -msgid "Item filed" -msgstr "" - -#: src/Model/Contact.php:1251 src/Model/Contact.php:1264 -msgid "UnFollow" -msgstr "" - -#: src/Model/Contact.php:1260 -msgid "Drop Contact" -msgstr "" - -#: src/Model/Contact.php:1814 -msgid "Organisation" -msgstr "" - -#: src/Model/Contact.php:1818 -msgid "News" -msgstr "" - -#: src/Model/Contact.php:1822 -msgid "Forum" -msgstr "" - -#: src/Model/Contact.php:2222 -msgid "Connect URL missing." -msgstr "" - -#: src/Model/Contact.php:2231 -msgid "" -"The contact could not be added. Please check the relevant network " -"credentials in your Settings -> Social Networks page." -msgstr "" - -#: src/Model/Contact.php:2272 -msgid "" -"This site is not configured to allow communications with other networks." -msgstr "" - -#: src/Model/Contact.php:2273 src/Model/Contact.php:2286 -msgid "No compatible communication protocols or feeds were discovered." -msgstr "" - -#: src/Model/Contact.php:2284 -msgid "The profile address specified does not provide adequate information." -msgstr "" - -#: src/Model/Contact.php:2289 -msgid "An author or name was not found." -msgstr "" - -#: src/Model/Contact.php:2292 -msgid "No browser URL could be matched to this address." -msgstr "" - -#: src/Model/Contact.php:2295 -msgid "" -"Unable to match @-style Identity Address with a known protocol or email " -"contact." -msgstr "" - -#: src/Model/Contact.php:2296 -msgid "Use mailto: in front of address to force email check." -msgstr "" - -#: src/Model/Contact.php:2302 -msgid "" -"The profile address specified belongs to a network which has been disabled " -"on this site." -msgstr "" - -#: src/Model/Contact.php:2307 -msgid "" -"Limited profile. This person will be unable to receive direct/personal " -"notifications from you." -msgstr "" - -#: src/Model/Contact.php:2368 -msgid "Unable to retrieve contact information." -msgstr "" - -#: src/Model/Event.php:35 src/Model/Event.php:848 -#: src/Module/Debug/Localtime.php:17 -msgid "l F d, Y \\@ g:i A" -msgstr "" - -#: src/Model/Event.php:62 src/Model/Event.php:79 src/Model/Event.php:436 -#: src/Model/Event.php:916 -msgid "Starts:" -msgstr "" - -#: src/Model/Event.php:65 src/Model/Event.php:85 src/Model/Event.php:437 -#: src/Model/Event.php:920 -msgid "Finishes:" -msgstr "" - -#: src/Model/Event.php:386 -msgid "all-day" -msgstr "" - -#: src/Model/Event.php:412 -msgid "Sept" -msgstr "" - -#: src/Model/Event.php:434 -msgid "No events to display" -msgstr "" - -#: src/Model/Event.php:562 -msgid "l, F j" -msgstr "" - -#: src/Model/Event.php:593 -msgid "Edit event" -msgstr "" - -#: src/Model/Event.php:594 -msgid "Duplicate event" -msgstr "" - -#: src/Model/Event.php:595 -msgid "Delete event" -msgstr "" - -#: src/Model/Event.php:627 src/Model/Item.php:3584 src/Model/Item.php:3591 -msgid "link to source" -msgstr "" - -#: src/Model/Event.php:849 -msgid "D g:i A" -msgstr "" - -#: src/Model/Event.php:850 -msgid "g:i A" -msgstr "" - -#: src/Model/Event.php:935 src/Model/Event.php:937 -msgid "Show map" -msgstr "" - -#: src/Model/Event.php:936 -msgid "Hide map" -msgstr "" - -#: src/Model/Event.php:1028 -#, php-format -msgid "%s's birthday" -msgstr "" - -#: src/Model/Event.php:1029 -#, php-format -msgid "Happy Birthday %s" -msgstr "" - -#: src/Model/Group.php:77 -msgid "" -"A deleted group with this name was revived. Existing item permissions " -"may apply to this group and any future members. If this is " -"not what you intended, please create another group with a different name." -msgstr "" - -#: src/Model/Group.php:407 -msgid "Default privacy group for new contacts" -msgstr "" - -#: src/Model/Group.php:439 -msgid "Everybody" -msgstr "" - -#: src/Model/Group.php:458 -msgid "edit" -msgstr "" - -#: src/Model/Group.php:483 -msgid "add" -msgstr "" - -#: src/Model/Group.php:484 src/Module/Welcome.php:57 src/Module/Contact.php:729 -msgid "Groups" -msgstr "" - -#: src/Model/Group.php:488 -msgid "Edit group" -msgstr "" - -#: src/Model/Group.php:489 src/Module/Group.php:186 -msgid "Contacts not in any group" -msgstr "" - -#: src/Model/Group.php:491 -msgid "Create a new group" -msgstr "" - -#: src/Model/Group.php:492 src/Module/Group.php:171 src/Module/Group.php:194 -#: src/Module/Group.php:271 -msgid "Group Name: " -msgstr "" - -#: src/Model/Group.php:493 -msgid "Edit groups" -msgstr "" - -#: src/Model/Item.php:3326 -msgid "activity" -msgstr "" - -#: src/Model/Item.php:3328 src/Object/Post.php:474 -msgid "comment" -msgid_plural "comments" -msgstr[0] "" -msgstr[1] "" - -#: src/Model/Item.php:3331 -msgid "post" -msgstr "" - -#: src/Model/Item.php:3454 -#, php-format -msgid "Content warning: %s" -msgstr "" - -#: src/Model/Item.php:3531 -msgid "bytes" -msgstr "" - -#: src/Model/Item.php:3578 -msgid "View on separate page" -msgstr "" - -#: src/Model/Item.php:3579 -msgid "view on separate page" -msgstr "" - -#: src/Model/Mail.php:114 src/Model/Mail.php:251 -msgid "[no subject]" -msgstr "" - -#: src/Model/Notify.php:275 src/Model/Notify.php:287 -#, php-format -msgid "%s commented on %s's post" -msgstr "" - -#: src/Model/Notify.php:286 -#, php-format -msgid "%s created a new post" -msgstr "" - -#: src/Model/Notify.php:300 -#, php-format -msgid "%s liked %s's post" -msgstr "" - -#: src/Model/Notify.php:313 -#, php-format -msgid "%s disliked %s's post" -msgstr "" - -#: src/Model/Notify.php:326 -#, php-format -msgid "%s is attending %s's event" -msgstr "" - -#: src/Model/Notify.php:339 -#, php-format -msgid "%s is not attending %s's event" -msgstr "" - -#: src/Model/Notify.php:352 -#, php-format -msgid "%s may attend %s's event" -msgstr "" - -#: src/Model/Notify.php:385 -#, php-format -msgid "%s is now friends with %s" -msgstr "" - -#: src/Model/Notify.php:678 -msgid "Friend Suggestion" -msgstr "" - -#: src/Model/Notify.php:712 -msgid "Friend/Connect Request" -msgstr "" - -#: src/Model/Notify.php:712 -msgid "New Follower" -msgstr "" - -#: src/Model/Profile.php:213 src/Model/Profile.php:424 -#: src/Model/Profile.php:881 -msgid "Edit profile" -msgstr "" - -#: src/Model/Profile.php:398 -msgid "Manage/edit profiles" -msgstr "" - -#: src/Model/Profile.php:447 src/Model/Profile.php:791 -#: src/Module/Directory.php:141 -msgid "Status:" -msgstr "" - -#: src/Model/Profile.php:448 src/Model/Profile.php:808 -#: src/Module/Directory.php:142 -msgid "Homepage:" -msgstr "" - -#: src/Model/Profile.php:450 src/Module/Contact.php:630 -msgid "XMPP:" -msgstr "" - -#: src/Model/Profile.php:542 src/Module/Contact.php:320 -msgid "Unfollow" -msgstr "" - -#: src/Model/Profile.php:544 -msgid "Atom feed" -msgstr "" - -#: src/Model/Profile.php:584 src/Model/Profile.php:681 -msgid "g A l F d" -msgstr "" - -#: src/Model/Profile.php:585 -msgid "F d" -msgstr "" - -#: src/Model/Profile.php:647 src/Model/Profile.php:732 -msgid "[today]" -msgstr "" - -#: src/Model/Profile.php:657 -msgid "Birthday Reminders" -msgstr "" - -#: src/Model/Profile.php:658 -msgid "Birthdays this week:" -msgstr "" - -#: src/Model/Profile.php:719 -msgid "[No description]" -msgstr "" - -#: src/Model/Profile.php:745 -msgid "Event Reminders" -msgstr "" - -#: src/Model/Profile.php:746 -msgid "Upcoming events the next 7 days:" -msgstr "" - -#: src/Model/Profile.php:763 -msgid "Member since:" -msgstr "" - -#: src/Model/Profile.php:771 -msgid "j F, Y" -msgstr "" - -#: src/Model/Profile.php:772 -msgid "j F" -msgstr "" - -#: src/Model/Profile.php:787 -msgid "Age:" -msgstr "" - -#: src/Model/Profile.php:800 -#, php-format -msgid "for %1$d %2$s" -msgstr "" - -#: src/Model/Profile.php:824 -msgid "Religion:" -msgstr "" - -#: src/Model/Profile.php:832 -msgid "Hobbies/Interests:" -msgstr "" - -#: src/Model/Profile.php:844 -msgid "Contact information and Social Networks:" -msgstr "" - -#: src/Model/Profile.php:848 -msgid "Musical interests:" -msgstr "" - -#: src/Model/Profile.php:852 -msgid "Books, literature:" -msgstr "" - -#: src/Model/Profile.php:856 -msgid "Television:" -msgstr "" - -#: src/Model/Profile.php:860 -msgid "Film/dance/culture/entertainment:" -msgstr "" - -#: src/Model/Profile.php:864 -msgid "Love/Romance:" -msgstr "" - -#: src/Model/Profile.php:868 -msgid "Work/employment:" -msgstr "" - -#: src/Model/Profile.php:872 -msgid "School/education:" -msgstr "" - -#: src/Model/Profile.php:877 -msgid "Forums:" -msgstr "" - -#: src/Model/Profile.php:924 src/Module/Contact.php:871 -msgid "Profile Details" -msgstr "" - -#: src/Model/Profile.php:974 -msgid "Only You Can See This" -msgstr "" - -#: src/Model/Profile.php:982 src/Model/Profile.php:985 -msgid "Tips for New Members" -msgstr "" - -#: src/Model/Profile.php:1180 -#, php-format -msgid "OpenWebAuth: %1$s welcomes %2$s" -msgstr "" - -#: src/Model/User.php:357 -msgid "Login failed" -msgstr "" - -#: src/Model/User.php:389 -msgid "Not enough information to authenticate" -msgstr "" - -#: src/Model/User.php:483 -msgid "Password can't be empty" -msgstr "" - -#: src/Model/User.php:502 -msgid "Empty passwords are not allowed." -msgstr "" - -#: src/Model/User.php:506 -msgid "" -"The new password has been exposed in a public data dump, please choose " -"another." -msgstr "" - -#: src/Model/User.php:512 -msgid "" -"The password can't contain accentuated letters, white spaces or colons (:)" -msgstr "" - -#: src/Model/User.php:612 -msgid "Passwords do not match. Password unchanged." -msgstr "" - -#: src/Model/User.php:619 -msgid "An invitation is required." -msgstr "" - -#: src/Model/User.php:623 -msgid "Invitation could not be verified." -msgstr "" - -#: src/Model/User.php:631 -msgid "Invalid OpenID url" -msgstr "" - -#: src/Model/User.php:644 src/Module/Login.php:105 -msgid "" -"We encountered a problem while logging in with the OpenID you provided. " -"Please check the correct spelling of the ID." -msgstr "" - -#: src/Model/User.php:644 src/Module/Login.php:105 -msgid "The error message was:" -msgstr "" - -#: src/Model/User.php:650 -msgid "Please enter the required information." -msgstr "" - -#: src/Model/User.php:664 -#, php-format -msgid "" -"system.username_min_length (%s) and system.username_max_length (%s) are " -"excluding each other, swapping values." -msgstr "" - -#: src/Model/User.php:671 -#, php-format -msgid "Username should be at least %s character." -msgid_plural "Username should be at least %s characters." -msgstr[0] "" -msgstr[1] "" - -#: src/Model/User.php:675 -#, php-format -msgid "Username should be at most %s character." -msgid_plural "Username should be at most %s characters." -msgstr[0] "" -msgstr[1] "" - -#: src/Model/User.php:683 -msgid "That doesn't appear to be your full (First Last) name." -msgstr "" - -#: src/Model/User.php:688 -msgid "Your email domain is not among those allowed on this site." -msgstr "" - -#: src/Model/User.php:692 -msgid "Not a valid email address." -msgstr "" - -#: src/Model/User.php:695 -msgid "The nickname was blocked from registration by the nodes admin." -msgstr "" - -#: src/Model/User.php:699 src/Model/User.php:707 -msgid "Cannot use that email." -msgstr "" - -#: src/Model/User.php:714 -msgid "Your nickname can only contain a-z, 0-9 and _." -msgstr "" - -#: src/Model/User.php:722 src/Model/User.php:779 -msgid "Nickname is already registered. Please choose another." -msgstr "" - -#: src/Model/User.php:732 -msgid "SERIOUS ERROR: Generation of security keys failed." -msgstr "" - -#: src/Model/User.php:766 src/Model/User.php:770 -msgid "An error occurred during registration. Please try again." -msgstr "" - -#: src/Model/User.php:795 -msgid "An error occurred creating your default profile. Please try again." -msgstr "" - -#: src/Model/User.php:802 -msgid "An error occurred creating your self contact. Please try again." -msgstr "" - -#: src/Model/User.php:811 -msgid "" -"An error occurred creating your default contact group. Please try again." -msgstr "" - -#: src/Model/User.php:888 -#, php-format -msgid "" -"\n" -"\t\t\tDear %1$s,\n" -"\t\t\t\tThank you for registering at %2$s. Your account is pending for " -"approval by the administrator.\n" -"\n" -"\t\t\tYour login details are as follows:\n" -"\n" -"\t\t\tSite Location:\t%3$s\n" -"\t\t\tLogin Name:\t\t%4$s\n" -"\t\t\tPassword:\t\t%5$s\n" -"\t\t" -msgstr "" - -#: src/Model/User.php:909 -#, php-format -msgid "Registration at %s" -msgstr "" - -#: src/Model/User.php:929 -#, php-format -msgid "" -"\n" -"\t\t\t\tDear %1$s,\n" -"\t\t\t\tThank you for registering at %2$s. Your account has been created.\n" -"\t\t\t" -msgstr "" - -#: src/Model/User.php:937 -#, php-format -msgid "" -"\n" -"\t\t\tThe login details are as follows:\n" -"\n" -"\t\t\tSite Location:\t%3$s\n" -"\t\t\tLogin Name:\t\t%1$s\n" -"\t\t\tPassword:\t\t%5$s\n" -"\n" -"\t\t\tYou may change your password from your account \"Settings\" page after " -"logging\n" -"\t\t\tin.\n" -"\n" -"\t\t\tPlease take a few moments to review the other account settings on that " -"page.\n" -"\n" -"\t\t\tYou may also wish to add some basic information to your default " -"profile\n" -"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" -"\n" -"\t\t\tWe recommend setting your full name, adding a profile photo,\n" -"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - " -"and\n" -"\t\t\tperhaps what country you live in; if you do not wish to be more " -"specific\n" -"\t\t\tthan that.\n" -"\n" -"\t\t\tWe fully respect your right to privacy, and none of these items are " -"necessary.\n" -"\t\t\tIf you are new and do not know anybody here, they may help\n" -"\t\t\tyou to make some new and interesting friends.\n" -"\n" -"\t\t\tIf you ever want to delete your account, you can do so at %3$s/" -"removeme\n" -"\n" -"\t\t\tThank you and welcome to %2$s." -msgstr "" - -#: src/Model/User.php:976 src/Module/Admin/Users.php:88 -#, php-format -msgid "Registration details for %s" -msgstr "" - -#: src/Protocol/Diaspora.php:3604 -msgid "Attachments:" -msgstr "" - -#: src/Protocol/OStatus.php:1302 src/Module/Profile.php:117 -#: src/Module/Profile.php:120 -#, php-format -msgid "%s's timeline" -msgstr "" - -#: src/Protocol/OStatus.php:1306 src/Module/Profile.php:118 -#, php-format -msgid "%s's posts" -msgstr "" - -#: src/Protocol/OStatus.php:1309 src/Module/Profile.php:119 -#, php-format -msgid "%s's comments" -msgstr "" - -#: src/Protocol/OStatus.php:1864 -#, php-format -msgid "%s is now following %s." -msgstr "" - -#: src/Protocol/OStatus.php:1865 -msgid "following" -msgstr "" - -#: src/Protocol/OStatus.php:1868 -#, php-format -msgid "%s stopped following %s." -msgstr "" - -#: src/Protocol/OStatus.php:1869 -msgid "stopped following" -msgstr "" - -#: src/Worker/Delivery.php:516 -msgid "(no subject)" -msgstr "" - -#: src/Module/Apps.php:29 -msgid "No installed applications." -msgstr "" - -#: src/Module/Apps.php:34 -msgid "Applications" -msgstr "" - -#: src/Module/Credits.php:25 -msgid "Credits" -msgstr "" - -#: src/Module/Credits.php:26 -msgid "" -"Friendica is a community project, that would not be possible without the " -"help of many people. Here is a list of those who have contributed to the " -"code or the translation of Friendica. Thank you all!" -msgstr "" - -#: src/Module/Admin/Addons/Details.php:51 -msgid "Addon not found." -msgstr "" - -#: src/Module/Admin/Addons/Details.php:62 src/Module/Admin/Addons/Index.php:32 -#, php-format -msgid "Addon %s disabled." -msgstr "" - -#: src/Module/Admin/Addons/Details.php:65 src/Module/Admin/Addons/Index.php:34 -#, php-format -msgid "Addon %s enabled." -msgstr "" - -#: src/Module/Admin/Addons/Details.php:76 -#: src/Module/Admin/Themes/Details.php:60 -msgid "Disable" -msgstr "" - -#: src/Module/Admin/Addons/Details.php:79 -#: src/Module/Admin/Themes/Details.php:63 -msgid "Enable" -msgstr "" - -#: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50 -#: src/Module/Admin/Blocklist/Server.php:73 -#: src/Module/Admin/Blocklist/Contact.php:61 -#: src/Module/Admin/Federation.php:187 src/Module/Admin/Item/Delete.php:46 -#: src/Module/Admin/Logs/View.php:46 src/Module/Admin/Logs/Settings.php:63 -#: src/Module/Admin/Themes/Details.php:104 src/Module/Admin/Themes/Index.php:95 -#: src/Module/Admin/Tos.php:42 src/Module/Admin/Queue.php:56 -#: src/Module/Admin/Site.php:566 src/Module/Admin/Summary.php:192 -#: src/Module/Admin/Users.php:277 -msgid "Administration" -msgstr "" - -#: src/Module/Admin/Addons/Details.php:101 -#: src/Module/Admin/Themes/Details.php:106 -msgid "Toggle" -msgstr "" - -#: src/Module/Admin/Addons/Details.php:109 -#: src/Module/Admin/Themes/Details.php:115 -msgid "Author: " -msgstr "" - -#: src/Module/Admin/Addons/Details.php:110 -#: src/Module/Admin/Themes/Details.php:116 -msgid "Maintainer: " -msgstr "" - -#: src/Module/Admin/Addons/Index.php:36 -#, php-format -msgid "Addon %s failed to install." -msgstr "" - -#: src/Module/Admin/Addons/Index.php:53 -msgid "Reload active addons" -msgstr "" - -#: src/Module/Admin/Addons/Index.php:58 -#, php-format -msgid "" -"There are currently no addons available on your node. You can find the " -"official addon repository at %1$s and might find other interesting addons in " -"the open addon registry at %2$s" +#: src/Module/Attach.php:36 src/Module/Attach.php:48 +msgid "Item was not found." msgstr "" #: src/Module/Admin/Blocklist/Server.php:31 @@ -6746,6 +4453,17 @@ msgstr "" msgid "Check to delete this entry from the blocklist" msgstr "" +#: src/Module/Admin/Blocklist/Server.php:73 +#: src/Module/Admin/Blocklist/Contact.php:61 src/Module/Admin/Tos.php:42 +#: src/Module/Admin/Addons/Details.php:99 src/Module/Admin/Addons/Index.php:50 +#: src/Module/Admin/Themes/Details.php:104 src/Module/Admin/Themes/Index.php:95 +#: src/Module/Admin/Users.php:277 src/Module/Admin/Site.php:566 +#: src/Module/Admin/Federation.php:187 src/Module/Admin/Queue.php:56 +#: src/Module/Admin/Item/Delete.php:46 src/Module/Admin/Logs/Settings.php:63 +#: src/Module/Admin/Logs/View.php:46 src/Module/Admin/Summary.php:192 +msgid "Administration" +msgstr "" + #: src/Module/Admin/Blocklist/Server.php:74 msgid "Server Domain Pattern Blocklist" msgstr "" @@ -6879,6 +4597,13 @@ msgstr "" msgid "Photo" msgstr "" +#: src/Module/Admin/Blocklist/Contact.php:73 src/Module/Admin/Users.php:272 +#: src/Module/Admin/Users.php:283 src/Module/Admin/Users.php:297 +#: src/Module/Admin/Users.php:313 mod/crepair.php:159 mod/settings.php:672 +#: mod/settings.php:698 +msgid "Name" +msgstr "" + #: src/Module/Admin/Blocklist/Contact.php:73 msgid "Reason" msgstr "" @@ -6890,6 +4615,12 @@ msgid_plural "%s total blocked contacts" msgstr[0] "" msgstr[1] "" +#: src/Module/Admin/Blocklist/Contact.php:83 src/Module/Contact.php:624 +#: mod/notifications.php:194 mod/notifications.php:286 mod/follow.php:179 +#: mod/unfollow.php:137 +msgid "Profile URL" +msgstr "" + #: src/Module/Admin/Blocklist/Contact.php:83 msgid "URL of the remote contact to block." msgstr "" @@ -6898,263 +4629,6 @@ msgstr "" msgid "Block Reason" msgstr "" -#: src/Module/Admin/DBSync.php:32 -msgid "Update has been marked successful" -msgstr "" - -#: src/Module/Admin/DBSync.php:42 -#, php-format -msgid "Database structure update %s was successfully applied." -msgstr "" - -#: src/Module/Admin/DBSync.php:46 -#, php-format -msgid "Executing of database structure update %s failed with error: %s" -msgstr "" - -#: src/Module/Admin/DBSync.php:63 -#, php-format -msgid "Executing %s failed with error: %s" -msgstr "" - -#: src/Module/Admin/DBSync.php:65 -#, php-format -msgid "Update %s was successfully applied." -msgstr "" - -#: src/Module/Admin/DBSync.php:68 -#, php-format -msgid "Update %s did not return a status. Unknown if it succeeded." -msgstr "" - -#: src/Module/Admin/DBSync.php:71 -#, php-format -msgid "There was no additional update function %s that needed to be called." -msgstr "" - -#: src/Module/Admin/DBSync.php:91 -msgid "No failed updates." -msgstr "" - -#: src/Module/Admin/DBSync.php:92 -msgid "Check database structure" -msgstr "" - -#: src/Module/Admin/DBSync.php:97 -msgid "Failed Updates" -msgstr "" - -#: src/Module/Admin/DBSync.php:98 -msgid "" -"This does not include updates prior to 1139, which did not return a status." -msgstr "" - -#: src/Module/Admin/DBSync.php:99 -msgid "Mark success (if update was manually applied)" -msgstr "" - -#: src/Module/Admin/DBSync.php:100 -msgid "Attempt to execute this update step automatically" -msgstr "" - -#: src/Module/Admin/Features.php:59 -#, php-format -msgid "Lock feature %s" -msgstr "" - -#: src/Module/Admin/Features.php:67 -msgid "Manage Additional Features" -msgstr "" - -#: src/Module/Admin/Federation.php:76 -msgid "unknown" -msgstr "" - -#: src/Module/Admin/Federation.php:181 -msgid "" -"This page offers you some numbers to the known part of the federated social " -"network your Friendica node is part of. These numbers are not complete but " -"only reflect the part of the network your node is aware of." -msgstr "" - -#: src/Module/Admin/Federation.php:182 -msgid "" -"The Auto Discovered Contact Directory feature is not enabled, it " -"will improve the data displayed here." -msgstr "" - -#: src/Module/Admin/Federation.php:188 src/Module/BaseAdminModule.php:77 -msgid "Federation Statistics" -msgstr "" - -#: src/Module/Admin/Federation.php:194 -#, php-format -msgid "" -"Currently this node is aware of %d nodes with %d registered users from the " -"following platforms:" -msgstr "" - -#: src/Module/Admin/Item/Delete.php:35 -msgid "Item marked for deletion." -msgstr "" - -#: src/Module/Admin/Item/Delete.php:47 src/Module/BaseAdminModule.php:95 -msgid "Delete Item" -msgstr "" - -#: src/Module/Admin/Item/Delete.php:48 -msgid "Delete this Item" -msgstr "" - -#: src/Module/Admin/Item/Delete.php:49 -msgid "" -"On this page you can delete an item from your node. If the item is a top " -"level posting, the entire thread will be deleted." -msgstr "" - -#: src/Module/Admin/Item/Delete.php:50 -msgid "" -"You need to know the GUID of the item. You can find it e.g. by looking at " -"the display URL. The last part of http://example.com/display/123456 is the " -"GUID, here 123456." -msgstr "" - -#: src/Module/Admin/Item/Delete.php:51 -msgid "GUID" -msgstr "" - -#: src/Module/Admin/Item/Delete.php:51 -msgid "The GUID of the item you want to delete." -msgstr "" - -#: src/Module/Admin/Item/Source.php:47 -msgid "Item Guid" -msgstr "" - -#: src/Module/Admin/Logs/View.php:22 -#, php-format -msgid "" -"Error trying to open %1$s log file.\\r\\n
Check to see " -"if file %1$s exist and is readable." -msgstr "" - -#: src/Module/Admin/Logs/View.php:26 -#, php-format -msgid "" -"Couldn't open %1$s log file.\\r\\n
Check to see if file " -"%1$s is readable." -msgstr "" - -#: src/Module/Admin/Logs/View.php:47 src/Module/BaseAdminModule.php:99 -msgid "View Logs" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:27 -#, php-format -msgid "The logfile '%s' is not writable. No logging possible" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:36 -msgid "Log settings updated." -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:55 -msgid "PHP log currently enabled." -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:57 -msgid "PHP log currently disabled." -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:64 src/Module/BaseAdminModule.php:97 -#: src/Module/BaseAdminModule.php:98 -msgid "Logs" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:66 -msgid "Clear" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:70 -msgid "Enable Debugging" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:71 -msgid "Log file" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:71 -msgid "" -"Must be writable by web server. Relative to your Friendica top-level " -"directory." -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:72 -msgid "Log level" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:74 -msgid "PHP logging" -msgstr "" - -#: src/Module/Admin/Logs/Settings.php:75 -msgid "" -"To temporarily enable logging of PHP errors and warnings you can prepend the " -"following to the index.php file of your installation. The filename set in " -"the 'error_log' line is relative to the friendica top-level directory and " -"must be writeable by the web server. The option '1' for 'log_errors' and " -"'display_errors' is to enable these options, set to '0' to disable them." -msgstr "" - -#: src/Module/Admin/Themes/Details.php:32 src/Module/Admin/Themes/Embed.php:46 -msgid "Theme settings updated." -msgstr "" - -#: src/Module/Admin/Themes/Details.php:71 src/Module/Admin/Themes/Index.php:49 -#, php-format -msgid "Theme %s disabled." -msgstr "" - -#: src/Module/Admin/Themes/Details.php:73 src/Module/Admin/Themes/Index.php:51 -#, php-format -msgid "Theme %s successfully enabled." -msgstr "" - -#: src/Module/Admin/Themes/Details.php:75 src/Module/Admin/Themes/Index.php:53 -#, php-format -msgid "Theme %s failed to install." -msgstr "" - -#: src/Module/Admin/Themes/Details.php:97 -msgid "Screenshot" -msgstr "" - -#: src/Module/Admin/Themes/Details.php:105 src/Module/Admin/Themes/Index.php:96 -#: src/Module/BaseAdminModule.php:83 -msgid "Themes" -msgstr "" - -#: src/Module/Admin/Themes/Embed.php:67 -msgid "Unknown theme." -msgstr "" - -#: src/Module/Admin/Themes/Index.php:98 -msgid "Reload active themes" -msgstr "" - -#: src/Module/Admin/Themes/Index.php:103 -#, php-format -msgid "No themes found on the system. They should be placed in %1$s" -msgstr "" - -#: src/Module/Admin/Themes/Index.php:104 -msgid "[Experimental]" -msgstr "" - -#: src/Module/Admin/Themes/Index.php:105 -msgid "[Unsupported]" -msgstr "" - #: src/Module/Admin/Tos.php:30 msgid "The Terms of Service settings have been updated." msgstr "" @@ -7194,40 +4668,332 @@ msgid "" "of sections should be [h2] and below." msgstr "" -#: src/Module/Admin/Queue.php:34 -msgid "Inspect Deferred Worker Queue" +#: src/Module/Admin/Tos.php:50 src/Module/Admin/Addons/Index.php:52 +#: src/Module/Admin/Themes/Index.php:97 src/Module/Admin/Site.php:568 +#: src/Module/Admin/Features.php:69 src/Module/Admin/Logs/Settings.php:65 +#: src/Module/Settings/Delegation.php:158 mod/settings.php:670 +#: mod/settings.php:777 mod/settings.php:875 mod/settings.php:954 +#: mod/settings.php:1179 +msgid "Save Settings" msgstr "" -#: src/Module/Admin/Queue.php:35 +#: src/Module/Admin/Addons/Details.php:51 +msgid "Addon not found." +msgstr "" + +#: src/Module/Admin/Addons/Details.php:62 src/Module/Admin/Addons/Index.php:32 +#, php-format +msgid "Addon %s disabled." +msgstr "" + +#: src/Module/Admin/Addons/Details.php:65 src/Module/Admin/Addons/Index.php:34 +#, php-format +msgid "Addon %s enabled." +msgstr "" + +#: src/Module/Admin/Addons/Details.php:76 +#: src/Module/Admin/Themes/Details.php:60 +msgid "Disable" +msgstr "" + +#: src/Module/Admin/Addons/Details.php:79 +#: src/Module/Admin/Themes/Details.php:63 +msgid "Enable" +msgstr "" + +#: src/Module/Admin/Addons/Details.php:101 +#: src/Module/Admin/Themes/Details.php:106 +msgid "Toggle" +msgstr "" + +#: src/Module/Admin/Addons/Details.php:109 +#: src/Module/Admin/Themes/Details.php:115 +msgid "Author: " +msgstr "" + +#: src/Module/Admin/Addons/Details.php:110 +#: src/Module/Admin/Themes/Details.php:116 +msgid "Maintainer: " +msgstr "" + +#: src/Module/Admin/Addons/Index.php:36 +#, php-format +msgid "Addon %s failed to install." +msgstr "" + +#: src/Module/Admin/Addons/Index.php:53 +msgid "Reload active addons" +msgstr "" + +#: src/Module/Admin/Addons/Index.php:58 +#, php-format msgid "" -"This page lists the deferred worker jobs. This are jobs that couldn't be " -"executed at the first time." +"There are currently no addons available on your node. You can find the " +"official addon repository at %1$s and might find other interesting addons in " +"the open addon registry at %2$s" msgstr "" -#: src/Module/Admin/Queue.php:38 -msgid "Inspect Worker Queue" +#: src/Module/Admin/Themes/Embed.php:46 src/Module/Admin/Themes/Details.php:32 +msgid "Theme settings updated." msgstr "" -#: src/Module/Admin/Queue.php:39 +#: src/Module/Admin/Themes/Embed.php:67 +msgid "Unknown theme." +msgstr "" + +#: src/Module/Admin/Themes/Details.php:71 src/Module/Admin/Themes/Index.php:49 +#, php-format +msgid "Theme %s disabled." +msgstr "" + +#: src/Module/Admin/Themes/Details.php:73 src/Module/Admin/Themes/Index.php:51 +#, php-format +msgid "Theme %s successfully enabled." +msgstr "" + +#: src/Module/Admin/Themes/Details.php:75 src/Module/Admin/Themes/Index.php:53 +#, php-format +msgid "Theme %s failed to install." +msgstr "" + +#: src/Module/Admin/Themes/Details.php:97 +msgid "Screenshot" +msgstr "" + +#: src/Module/Admin/Themes/Index.php:98 +msgid "Reload active themes" +msgstr "" + +#: src/Module/Admin/Themes/Index.php:103 +#, php-format +msgid "No themes found on the system. They should be placed in %1$s" +msgstr "" + +#: src/Module/Admin/Themes/Index.php:104 +msgid "[Experimental]" +msgstr "" + +#: src/Module/Admin/Themes/Index.php:105 +msgid "[Unsupported]" +msgstr "" + +#: src/Module/Admin/Users.php:48 +#, php-format msgid "" -"This page lists the currently queued worker jobs. These jobs are handled by " -"the worker cronjob you've set up during install." +"\n" +"\t\t\tDear %1$s,\n" +"\t\t\t\tthe administrator of %2$s has set up an account for you." msgstr "" -#: src/Module/Admin/Queue.php:59 -msgid "ID" +#: src/Module/Admin/Users.php:51 +#, php-format +msgid "" +"\n" +"\t\t\tThe login details are as follows:\n" +"\n" +"\t\t\tSite Location:\t%1$s\n" +"\t\t\tLogin Name:\t\t%2$s\n" +"\t\t\tPassword:\t\t%3$s\n" +"\n" +"\t\t\tYou may change your password from your account \"Settings\" page after " +"logging\n" +"\t\t\tin.\n" +"\n" +"\t\t\tPlease take a few moments to review the other account settings on that " +"page.\n" +"\n" +"\t\t\tYou may also wish to add some basic information to your default " +"profile\n" +"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" +"\n" +"\t\t\tWe recommend setting your full name, adding a profile photo,\n" +"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - " +"and\n" +"\t\t\tperhaps what country you live in; if you do not wish to be more " +"specific\n" +"\t\t\tthan that.\n" +"\n" +"\t\t\tWe fully respect your right to privacy, and none of these items are " +"necessary.\n" +"\t\t\tIf you are new and do not know anybody here, they may help\n" +"\t\t\tyou to make some new and interesting friends.\n" +"\n" +"\t\t\tIf you ever want to delete your account, you can do so at %1$s/" +"removeme\n" +"\n" +"\t\t\tThank you and welcome to %4$s." msgstr "" -#: src/Module/Admin/Queue.php:60 -msgid "Job Parameters" +#: src/Module/Admin/Users.php:96 +#, php-format +msgid "%s user blocked" +msgid_plural "%s users blocked" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Admin/Users.php:102 +#, php-format +msgid "%s user unblocked" +msgid_plural "%s users unblocked" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Admin/Users.php:110 src/Module/Admin/Users.php:160 +msgid "You can't remove yourself" msgstr "" -#: src/Module/Admin/Queue.php:61 -msgid "Created" +#: src/Module/Admin/Users.php:114 +#, php-format +msgid "%s user deleted" +msgid_plural "%s users deleted" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Admin/Users.php:158 +#, php-format +msgid "User \"%s\" deleted" msgstr "" -#: src/Module/Admin/Queue.php:62 -msgid "Priority" +#: src/Module/Admin/Users.php:167 +#, php-format +msgid "User \"%s\" blocked" +msgstr "" + +#: src/Module/Admin/Users.php:173 +#, php-format +msgid "User \"%s\" unblocked" +msgstr "" + +#: src/Module/Admin/Users.php:222 mod/settings.php:1054 +msgid "Normal Account Page" +msgstr "" + +#: src/Module/Admin/Users.php:223 mod/settings.php:1058 +msgid "Soapbox Page" +msgstr "" + +#: src/Module/Admin/Users.php:224 mod/settings.php:1062 +msgid "Public Forum" +msgstr "" + +#: src/Module/Admin/Users.php:225 mod/settings.php:1066 +msgid "Automatic Friend Page" +msgstr "" + +#: src/Module/Admin/Users.php:226 +msgid "Private Forum" +msgstr "" + +#: src/Module/Admin/Users.php:229 mod/settings.php:1038 +msgid "Personal Page" +msgstr "" + +#: src/Module/Admin/Users.php:230 mod/settings.php:1042 +msgid "Organisation Page" +msgstr "" + +#: src/Module/Admin/Users.php:231 mod/settings.php:1046 +msgid "News Page" +msgstr "" + +#: src/Module/Admin/Users.php:232 mod/settings.php:1050 +msgid "Community Forum" +msgstr "" + +#: src/Module/Admin/Users.php:233 +msgid "Relay" +msgstr "" + +#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 +msgid "Register date" +msgstr "" + +#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 +msgid "Last login" +msgstr "" + +#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 +msgid "Last item" +msgstr "" + +#: src/Module/Admin/Users.php:272 +msgid "Type" +msgstr "" + +#: src/Module/Admin/Users.php:279 +msgid "Add User" +msgstr "" + +#: src/Module/Admin/Users.php:281 +msgid "User registrations waiting for confirm" +msgstr "" + +#: src/Module/Admin/Users.php:282 +msgid "User waiting for permanent deletion" +msgstr "" + +#: src/Module/Admin/Users.php:283 +msgid "Request date" +msgstr "" + +#: src/Module/Admin/Users.php:284 +msgid "No registrations." +msgstr "" + +#: src/Module/Admin/Users.php:285 +msgid "Note from the user" +msgstr "" + +#: src/Module/Admin/Users.php:287 +msgid "Deny" +msgstr "" + +#: src/Module/Admin/Users.php:290 +msgid "User blocked" +msgstr "" + +#: src/Module/Admin/Users.php:292 +msgid "Site admin" +msgstr "" + +#: src/Module/Admin/Users.php:293 +msgid "Account expired" +msgstr "" + +#: src/Module/Admin/Users.php:296 +msgid "New User" +msgstr "" + +#: src/Module/Admin/Users.php:297 +msgid "Permanent deletion" +msgstr "" + +#: src/Module/Admin/Users.php:302 +msgid "" +"Selected users will be deleted!\\n\\nEverything these users had posted on " +"this site will be permanently deleted!\\n\\nAre you sure?" +msgstr "" + +#: src/Module/Admin/Users.php:303 +msgid "" +"The user {0} will be deleted!\\n\\nEverything this user has posted on this " +"site will be permanently deleted!\\n\\nAre you sure?" +msgstr "" + +#: src/Module/Admin/Users.php:313 +msgid "Name of the new user." +msgstr "" + +#: src/Module/Admin/Users.php:314 +msgid "Nickname" +msgstr "" + +#: src/Module/Admin/Users.php:314 +msgid "Nickname of the new user." +msgstr "" + +#: src/Module/Admin/Users.php:315 +msgid "Email address of the new user." msgstr "" #: src/Module/Admin/Site.php:49 @@ -7242,6 +5008,15 @@ msgstr "" msgid "Site settings updated." msgstr "" +#: src/Module/Admin/Site.php:433 mod/settings.php:898 +msgid "No special theme for mobile devices" +msgstr "" + +#: src/Module/Admin/Site.php:450 mod/settings.php:908 +#, php-format +msgid "%s - (Experimental)" +msgstr "" + #: src/Module/Admin/Site.php:462 msgid "No community page for local users" msgstr "" @@ -7268,11 +5043,6 @@ msgstr "" msgid "Disabled" msgstr "" -#: src/Module/Admin/Site.php:471 src/Module/Admin/Users.php:278 -#: src/Module/Admin/Users.php:295 src/Module/BaseAdminModule.php:81 -msgid "Users" -msgstr "" - #: src/Module/Admin/Site.php:472 msgid "Users, Global Contacts" msgstr "" @@ -7313,18 +5083,6 @@ msgstr "" msgid "Open" msgstr "" -#: src/Module/Admin/Site.php:514 src/Module/Install.php:182 -msgid "No SSL policy, links will track page SSL state" -msgstr "" - -#: src/Module/Admin/Site.php:515 src/Module/Install.php:183 -msgid "Force all links to use SSL" -msgstr "" - -#: src/Module/Admin/Site.php:516 src/Module/Install.php:184 -msgid "Self-signed certificate, use SSL for local links only (discouraged)" -msgstr "" - #: src/Module/Admin/Site.php:520 msgid "Don't check" msgstr "" @@ -7341,10 +5099,6 @@ msgstr "" msgid "Database (legacy)" msgstr "" -#: src/Module/Admin/Site.php:567 src/Module/BaseAdminModule.php:80 -msgid "Site" -msgstr "" - #: src/Module/Admin/Site.php:569 msgid "Republish users to directory" msgstr "" @@ -7451,14 +5205,6 @@ msgstr "" msgid "Theme for mobile devices" msgstr "" -#: src/Module/Admin/Site.php:592 src/Module/Install.php:192 -msgid "SSL link policy" -msgstr "" - -#: src/Module/Admin/Site.php:592 src/Module/Install.php:194 -msgid "Determines whether generated links should be forced to use SSL" -msgstr "" - #: src/Module/Admin/Site.php:593 msgid "Force SSL" msgstr "" @@ -8193,6 +5939,184 @@ msgstr "" msgid "Start Relocation" msgstr "" +#: src/Module/Admin/Federation.php:76 +msgid "unknown" +msgstr "" + +#: src/Module/Admin/Federation.php:181 +msgid "" +"This page offers you some numbers to the known part of the federated social " +"network your Friendica node is part of. These numbers are not complete but " +"only reflect the part of the network your node is aware of." +msgstr "" + +#: src/Module/Admin/Federation.php:182 +msgid "" +"The Auto Discovered Contact Directory feature is not enabled, it " +"will improve the data displayed here." +msgstr "" + +#: src/Module/Admin/Federation.php:194 +#, php-format +msgid "" +"Currently this node is aware of %d nodes with %d registered users from the " +"following platforms:" +msgstr "" + +#: src/Module/Admin/Features.php:58 src/Module/Admin/Features.php:59 +#: mod/settings.php:768 +msgid "Off" +msgstr "" + +#: src/Module/Admin/Features.php:58 src/Module/Admin/Features.php:59 +#: mod/settings.php:768 +msgid "On" +msgstr "" + +#: src/Module/Admin/Features.php:59 +#, php-format +msgid "Lock feature %s" +msgstr "" + +#: src/Module/Admin/Features.php:67 +msgid "Manage Additional Features" +msgstr "" + +#: src/Module/Admin/Queue.php:34 +msgid "Inspect Deferred Worker Queue" +msgstr "" + +#: src/Module/Admin/Queue.php:35 +msgid "" +"This page lists the deferred worker jobs. This are jobs that couldn't be " +"executed at the first time." +msgstr "" + +#: src/Module/Admin/Queue.php:38 +msgid "Inspect Worker Queue" +msgstr "" + +#: src/Module/Admin/Queue.php:39 +msgid "" +"This page lists the currently queued worker jobs. These jobs are handled by " +"the worker cronjob you've set up during install." +msgstr "" + +#: src/Module/Admin/Queue.php:59 +msgid "ID" +msgstr "" + +#: src/Module/Admin/Queue.php:60 +msgid "Job Parameters" +msgstr "" + +#: src/Module/Admin/Queue.php:61 +msgid "Created" +msgstr "" + +#: src/Module/Admin/Queue.php:62 +msgid "Priority" +msgstr "" + +#: src/Module/Admin/Item/Delete.php:35 +msgid "Item marked for deletion." +msgstr "" + +#: src/Module/Admin/Item/Delete.php:48 +msgid "Delete this Item" +msgstr "" + +#: src/Module/Admin/Item/Delete.php:49 +msgid "" +"On this page you can delete an item from your node. If the item is a top " +"level posting, the entire thread will be deleted." +msgstr "" + +#: src/Module/Admin/Item/Delete.php:50 +msgid "" +"You need to know the GUID of the item. You can find it e.g. by looking at " +"the display URL. The last part of http://example.com/display/123456 is the " +"GUID, here 123456." +msgstr "" + +#: src/Module/Admin/Item/Delete.php:51 +msgid "GUID" +msgstr "" + +#: src/Module/Admin/Item/Delete.php:51 +msgid "The GUID of the item you want to delete." +msgstr "" + +#: src/Module/Admin/Item/Source.php:47 +msgid "Item Guid" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:27 +#, php-format +msgid "The logfile '%s' is not writable. No logging possible" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:36 +msgid "Log settings updated." +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:55 +msgid "PHP log currently enabled." +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:57 +msgid "PHP log currently disabled." +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:66 +msgid "Clear" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:70 +msgid "Enable Debugging" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:71 +msgid "Log file" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:71 +msgid "" +"Must be writable by web server. Relative to your Friendica top-level " +"directory." +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:72 +msgid "Log level" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:74 +msgid "PHP logging" +msgstr "" + +#: src/Module/Admin/Logs/Settings.php:75 +msgid "" +"To temporarily enable logging of PHP errors and warnings you can prepend the " +"following to the index.php file of your installation. The filename set in " +"the 'error_log' line is relative to the friendica top-level directory and " +"must be writeable by the web server. The option '1' for 'log_errors' and " +"'display_errors' is to enable these options, set to '0' to disable them." +msgstr "" + +#: src/Module/Admin/Logs/View.php:22 +#, php-format +msgid "" +"Error trying to open %1$s log file.\\r\\n
Check to see " +"if file %1$s exist and is readable." +msgstr "" + +#: src/Module/Admin/Logs/View.php:26 +#, php-format +msgid "" +"Couldn't open %1$s log file.\\r\\n
Check to see if file " +"%1$s is readable." +msgstr "" + #: src/Module/Admin/Summary.php:32 #, php-format msgid "" @@ -8345,269 +6269,619 @@ msgstr "" msgid "Active addons" msgstr "" -#: src/Module/Admin/Users.php:48 +#: src/Module/Admin/DBSync.php:32 +msgid "Update has been marked successful" +msgstr "" + +#: src/Module/Admin/DBSync.php:42 +#, php-format +msgid "Database structure update %s was successfully applied." +msgstr "" + +#: src/Module/Admin/DBSync.php:46 +#, php-format +msgid "Executing of database structure update %s failed with error: %s" +msgstr "" + +#: src/Module/Admin/DBSync.php:63 +#, php-format +msgid "Executing %s failed with error: %s" +msgstr "" + +#: src/Module/Admin/DBSync.php:65 +#, php-format +msgid "Update %s was successfully applied." +msgstr "" + +#: src/Module/Admin/DBSync.php:68 +#, php-format +msgid "Update %s did not return a status. Unknown if it succeeded." +msgstr "" + +#: src/Module/Admin/DBSync.php:71 +#, php-format +msgid "There was no additional update function %s that needed to be called." +msgstr "" + +#: src/Module/Admin/DBSync.php:91 +msgid "No failed updates." +msgstr "" + +#: src/Module/Admin/DBSync.php:92 +msgid "Check database structure" +msgstr "" + +#: src/Module/Admin/DBSync.php:97 +msgid "Failed Updates" +msgstr "" + +#: src/Module/Admin/DBSync.php:98 +msgid "" +"This does not include updates prior to 1139, which did not return a status." +msgstr "" + +#: src/Module/Admin/DBSync.php:99 +msgid "Mark success (if update was manually applied)" +msgstr "" + +#: src/Module/Admin/DBSync.php:100 +msgid "Attempt to execute this update step automatically" +msgstr "" + +#: src/Module/Settings/Delegation.php:37 +msgid "Delegation successfully granted." +msgstr "" + +#: src/Module/Settings/Delegation.php:39 +msgid "Parent user not found, unavailable or password doesn't match." +msgstr "" + +#: src/Module/Settings/Delegation.php:43 +msgid "Delegation successfully revoked." +msgstr "" + +#: src/Module/Settings/Delegation.php:66 src/Module/Settings/Delegation.php:88 +msgid "" +"Delegated administrators can view but not change delegation permissions." +msgstr "" + +#: src/Module/Settings/Delegation.php:80 +msgid "Delegate user not found." +msgstr "" + +#: src/Module/Settings/Delegation.php:137 +msgid "No parent user" +msgstr "" + +#: src/Module/Settings/Delegation.php:149 +msgid "Parent Password:" +msgstr "" + +#: src/Module/Settings/Delegation.php:149 +msgid "" +"Please enter the password of the parent account to legitimize your request." +msgstr "" + +#: src/Module/Settings/Delegation.php:154 +msgid "Parent User" +msgstr "" + +#: src/Module/Settings/Delegation.php:157 +msgid "" +"Parent users have total control about this account, including the account " +"settings. Please double check whom you give this access." +msgstr "" + +#: src/Module/Settings/Delegation.php:159 +msgid "Delegate Page Management" +msgstr "" + +#: src/Module/Settings/Delegation.php:160 +msgid "Delegates" +msgstr "" + +#: src/Module/Settings/Delegation.php:162 +msgid "" +"Delegates are able to manage all aspects of this account/page except for " +"basic account settings. Please do not delegate your personal account to " +"anybody that you do not trust completely." +msgstr "" + +#: src/Module/Settings/Delegation.php:163 +msgid "Existing Page Delegates" +msgstr "" + +#: src/Module/Settings/Delegation.php:165 +msgid "Potential Delegates" +msgstr "" + +#: src/Module/Settings/Delegation.php:167 mod/tagrm.php:114 +msgid "Remove" +msgstr "" + +#: src/Module/Settings/Delegation.php:168 +msgid "Add" +msgstr "" + +#: src/Module/Settings/Delegation.php:169 +msgid "No entries." +msgstr "" + +#: src/Module/Settings/UserExport.php:44 +msgid "Export account" +msgstr "" + +#: src/Module/Settings/UserExport.php:44 +msgid "" +"Export your account info and contacts. Use this to make a backup of your " +"account and/or to move it to another server." +msgstr "" + +#: src/Module/Settings/UserExport.php:45 +msgid "Export all" +msgstr "" + +#: src/Module/Settings/UserExport.php:45 +msgid "" +"Export your accout info, contacts and all your items as json. Could be a " +"very big file, and could take a lot of time. Use this to make a full backup " +"of your account (photos are not exported)" +msgstr "" + +#: src/Module/Settings/UserExport.php:46 +msgid "Export Contacts to CSV" +msgstr "" + +#: src/Module/Settings/UserExport.php:46 +msgid "" +"Export the list of the accounts you are following as CSV file. Compatible to " +"e.g. Mastodon." +msgstr "" + +#: src/Module/Settings/UserExport.php:52 src/Module/BaseSettingsModule.php:89 +#: mod/settings.php:133 +msgid "Export personal data" +msgstr "" + +#: src/Module/Settings/TwoFactor/Verify.php:41 +#: src/Module/Settings/TwoFactor/AppSpecific.php:36 +#: src/Module/Settings/TwoFactor/Recovery.php:34 +msgid "Please enter your password to access this page." +msgstr "" + +#: src/Module/Settings/TwoFactor/Verify.php:63 +msgid "Two-factor authentication successfully activated." +msgstr "" + +#: src/Module/Settings/TwoFactor/Verify.php:96 #, php-format msgid "" -"\n" -"\t\t\tDear %1$s,\n" -"\t\t\t\tthe administrator of %2$s has set up an account for you." +"

Or you can submit the authentication settings manually:

\n" +"
\n" +"\t
Issuer
\n" +"\t
%s
\n" +"\t
Account Name
\n" +"\t
%s
\n" +"\t
Secret Key
\n" +"\t
%s
\n" +"\t
Type
\n" +"\t
Time-based
\n" +"\t
Number of digits
\n" +"\t
6
\n" +"\t
Hashing algorithm
\n" +"\t
SHA-1
\n" +"
" msgstr "" -#: src/Module/Admin/Users.php:51 +#: src/Module/Settings/TwoFactor/Verify.php:116 +msgid "Two-factor code verification" +msgstr "" + +#: src/Module/Settings/TwoFactor/Verify.php:118 +msgid "" +"

Please scan this QR Code with your authenticator app and submit the " +"provided code.

" +msgstr "" + +#: src/Module/Settings/TwoFactor/Verify.php:120 #, php-format msgid "" -"\n" -"\t\t\tThe login details are as follows:\n" -"\n" -"\t\t\tSite Location:\t%1$s\n" -"\t\t\tLogin Name:\t\t%2$s\n" -"\t\t\tPassword:\t\t%3$s\n" -"\n" -"\t\t\tYou may change your password from your account \"Settings\" page after " -"logging\n" -"\t\t\tin.\n" -"\n" -"\t\t\tPlease take a few moments to review the other account settings on that " -"page.\n" -"\n" -"\t\t\tYou may also wish to add some basic information to your default " -"profile\n" -"\t\t\t(on the \"Profiles\" page) so that other people can easily find you.\n" -"\n" -"\t\t\tWe recommend setting your full name, adding a profile photo,\n" -"\t\t\tadding some profile \"keywords\" (very useful in making new friends) - " -"and\n" -"\t\t\tperhaps what country you live in; if you do not wish to be more " -"specific\n" -"\t\t\tthan that.\n" -"\n" -"\t\t\tWe fully respect your right to privacy, and none of these items are " -"necessary.\n" -"\t\t\tIf you are new and do not know anybody here, they may help\n" -"\t\t\tyou to make some new and interesting friends.\n" -"\n" -"\t\t\tIf you ever want to delete your account, you can do so at %1$s/" -"removeme\n" -"\n" -"\t\t\tThank you and welcome to %4$s." +"

Or you can open the following URL in your mobile devicde:

%s

" msgstr "" -#: src/Module/Admin/Users.php:96 -#, php-format -msgid "%s user blocked" -msgid_plural "%s users blocked" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Admin/Users.php:102 -#, php-format -msgid "%s user unblocked" -msgid_plural "%s users unblocked" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Admin/Users.php:110 src/Module/Admin/Users.php:160 -msgid "You can't remove yourself" +#: src/Module/Settings/TwoFactor/Verify.php:127 +msgid "Verify code and enable two-factor authentication" msgstr "" -#: src/Module/Admin/Users.php:114 -#, php-format -msgid "%s user deleted" -msgid_plural "%s users deleted" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Admin/Users.php:158 -#, php-format -msgid "User \"%s\" deleted" +#: src/Module/Settings/TwoFactor/AppSpecific.php:54 +msgid "App-specific password generation failed: The description is empty." msgstr "" -#: src/Module/Admin/Users.php:167 -#, php-format -msgid "User \"%s\" blocked" -msgstr "" - -#: src/Module/Admin/Users.php:173 -#, php-format -msgid "User \"%s\" unblocked" -msgstr "" - -#: src/Module/Admin/Users.php:226 -msgid "Private Forum" -msgstr "" - -#: src/Module/Admin/Users.php:233 -msgid "Relay" -msgstr "" - -#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 -msgid "Register date" -msgstr "" - -#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 -msgid "Last login" -msgstr "" - -#: src/Module/Admin/Users.php:272 src/Module/Admin/Users.php:297 -msgid "Last item" -msgstr "" - -#: src/Module/Admin/Users.php:272 -msgid "Type" -msgstr "" - -#: src/Module/Admin/Users.php:279 -msgid "Add User" -msgstr "" - -#: src/Module/Admin/Users.php:281 -msgid "User registrations waiting for confirm" -msgstr "" - -#: src/Module/Admin/Users.php:282 -msgid "User waiting for permanent deletion" -msgstr "" - -#: src/Module/Admin/Users.php:283 -msgid "Request date" -msgstr "" - -#: src/Module/Admin/Users.php:284 -msgid "No registrations." -msgstr "" - -#: src/Module/Admin/Users.php:285 -msgid "Note from the user" -msgstr "" - -#: src/Module/Admin/Users.php:287 -msgid "Deny" -msgstr "" - -#: src/Module/Admin/Users.php:290 -msgid "User blocked" -msgstr "" - -#: src/Module/Admin/Users.php:292 -msgid "Site admin" -msgstr "" - -#: src/Module/Admin/Users.php:293 -msgid "Account expired" -msgstr "" - -#: src/Module/Admin/Users.php:296 -msgid "New User" -msgstr "" - -#: src/Module/Admin/Users.php:297 -msgid "Permanent deletion" -msgstr "" - -#: src/Module/Admin/Users.php:302 +#: src/Module/Settings/TwoFactor/AppSpecific.php:57 msgid "" -"Selected users will be deleted!\\n\\nEverything these users had posted on " -"this site will be permanently deleted!\\n\\nAre you sure?" +"App-specific password generation failed: This description already exists." msgstr "" -#: src/Module/Admin/Users.php:303 +#: src/Module/Settings/TwoFactor/AppSpecific.php:61 +msgid "New app-specific password generated." +msgstr "" + +#: src/Module/Settings/TwoFactor/AppSpecific.php:67 +msgid "App-specific passwords successfully revoked." +msgstr "" + +#: src/Module/Settings/TwoFactor/AppSpecific.php:77 +msgid "App-specific password successfully revoked." +msgstr "" + +#: src/Module/Settings/TwoFactor/AppSpecific.php:98 +msgid "Two-factor app-specific passwords" +msgstr "" + +#: src/Module/Settings/TwoFactor/AppSpecific.php:100 msgid "" -"The user {0} will be deleted!\\n\\nEverything this user has posted on this " -"site will be permanently deleted!\\n\\nAre you sure?" +"

App-specific passwords are randomly generated passwords used instead your " +"regular password to authenticate your account on third-party applications " +"that don't support two-factor authentication.

" msgstr "" -#: src/Module/Admin/Users.php:313 -msgid "Name of the new user." -msgstr "" - -#: src/Module/Admin/Users.php:314 -msgid "Nickname" -msgstr "" - -#: src/Module/Admin/Users.php:314 -msgid "Nickname of the new user." -msgstr "" - -#: src/Module/Admin/Users.php:315 -msgid "Email address of the new user." -msgstr "" - -#: src/Module/Attach.php:36 src/Module/Attach.php:48 -msgid "Item was not found." -msgstr "" - -#: src/Module/BaseAdminModule.php:62 +#: src/Module/Settings/TwoFactor/AppSpecific.php:101 msgid "" -"Submanaged account can't access the administation pages. Please log back in " -"as the master account." +"Make sure to copy your new app-specific password now. You won’t be able to " +"see it again!" msgstr "" -#: src/Module/BaseAdminModule.php:76 -msgid "Overview" +#: src/Module/Settings/TwoFactor/AppSpecific.php:104 +msgid "Description" msgstr "" -#: src/Module/BaseAdminModule.php:79 -msgid "Configuration" +#: src/Module/Settings/TwoFactor/AppSpecific.php:105 +msgid "Last Used" msgstr "" -#: src/Module/BaseAdminModule.php:87 -msgid "Database" +#: src/Module/Settings/TwoFactor/AppSpecific.php:106 +msgid "Revoke" msgstr "" -#: src/Module/BaseAdminModule.php:88 -msgid "DB updates" +#: src/Module/Settings/TwoFactor/AppSpecific.php:107 +msgid "Revoke All" msgstr "" -#: src/Module/BaseAdminModule.php:89 -msgid "Inspect Deferred Workers" +#: src/Module/Settings/TwoFactor/AppSpecific.php:110 +msgid "" +"When you generate a new app-specific password, you must use it right away, " +"it will be shown to you once after you generate it." msgstr "" -#: src/Module/BaseAdminModule.php:90 -msgid "Inspect worker Queue" +#: src/Module/Settings/TwoFactor/AppSpecific.php:111 +msgid "Generate new app-specific password" msgstr "" -#: src/Module/BaseAdminModule.php:92 -msgid "Tools" +#: src/Module/Settings/TwoFactor/AppSpecific.php:112 +msgid "Friendiqa on my Fairphone 2..." msgstr "" -#: src/Module/BaseAdminModule.php:93 -msgid "Contact Blocklist" +#: src/Module/Settings/TwoFactor/AppSpecific.php:113 +msgid "Generate" msgstr "" -#: src/Module/BaseAdminModule.php:94 -msgid "Server Blocklist" +#: src/Module/Settings/TwoFactor/Index.php:51 +msgid "Two-factor authentication successfully disabled." msgstr "" -#: src/Module/BaseAdminModule.php:101 -msgid "Diagnostics" +#: src/Module/Settings/TwoFactor/Index.php:72 mod/settings.php:541 +msgid "Wrong Password" msgstr "" -#: src/Module/BaseAdminModule.php:102 -msgid "PHP Info" +#: src/Module/Settings/TwoFactor/Index.php:92 +msgid "" +"

Use an application on a mobile device to get two-factor authentication " +"codes when prompted on login.

" msgstr "" -#: src/Module/BaseAdminModule.php:103 -msgid "probe address" +#: src/Module/Settings/TwoFactor/Index.php:96 +msgid "Authenticator app" msgstr "" -#: src/Module/BaseAdminModule.php:104 -msgid "check webfinger" +#: src/Module/Settings/TwoFactor/Index.php:97 +msgid "Configured" msgstr "" -#: src/Module/BaseAdminModule.php:105 -msgid "Item Source" +#: src/Module/Settings/TwoFactor/Index.php:97 +msgid "Not Configured" msgstr "" -#: src/Module/BaseAdminModule.php:106 -msgid "Babel" +#: src/Module/Settings/TwoFactor/Index.php:98 +msgid "

You haven't finished configuring your authenticator app.

" msgstr "" -#: src/Module/BaseAdminModule.php:115 -msgid "Addon Features" +#: src/Module/Settings/TwoFactor/Index.php:99 +msgid "

Your authenticator app is correctly configured.

" msgstr "" -#: src/Module/BaseAdminModule.php:116 -msgid "User registrations waiting for confirmation" +#: src/Module/Settings/TwoFactor/Index.php:101 +msgid "Recovery codes" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:102 +msgid "Remaining valid codes" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:104 +msgid "" +"

These one-use codes can replace an authenticator app code in case you " +"have lost access to it.

" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:106 +msgid "App-specific passwords" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:107 +msgid "Generated app-specific passwords" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:109 +msgid "" +"

These randomly generated passwords allow you to authenticate on apps not " +"supporting two-factor authentication.

" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:111 src/Module/Contact.php:635 +msgid "Actions" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:112 +msgid "Current password:" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:112 +msgid "" +"You need to provide your current password to change two-factor " +"authentication settings." +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:113 +msgid "Enable two-factor authentication" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:114 +msgid "Disable two-factor authentication" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:115 +msgid "Show recovery codes" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:116 +msgid "Manage app-specific passwords" +msgstr "" + +#: src/Module/Settings/TwoFactor/Index.php:117 +msgid "Finish app configuration" +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:50 +msgid "New recovery codes successfully generated." +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:76 +msgid "Two-factor recovery codes" +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:78 +msgid "" +"

Recovery codes can be used to access your account in the event you lose " +"access to your device and cannot receive two-factor authentication codes.

Put these in a safe spot! If you lose your device and " +"don’t have the recovery codes you will lose access to your account.

" +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:80 +msgid "" +"When you generate new recovery codes, you must copy the new codes. Your old " +"codes won’t work anymore." +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:81 +msgid "Generate new recovery codes" +msgstr "" + +#: src/Module/Settings/TwoFactor/Recovery.php:83 +msgid "Next: Verification" +msgstr "" + +#: src/Module/HTTPException/MethodNotAllowed.php:13 +msgid "Method Not Allowed." +msgstr "" + +#: src/Module/HTTPException/PageNotFound.php:13 src/App/Router.php:186 +msgid "Page not found." +msgstr "" + +#: src/Module/BaseSearchModule.php:54 +#, php-format +msgid "People Search - %s" +msgstr "" + +#: src/Module/BaseSearchModule.php:64 +#, php-format +msgid "Forum Search - %s" +msgstr "" + +#: src/Module/BaseSearchModule.php:96 mod/match.php:130 +msgid "No matches" +msgstr "" + +#: src/Module/Apps.php:29 +msgid "No installed applications." +msgstr "" + +#: src/Module/Apps.php:34 +msgid "Applications" +msgstr "" + +#: src/Module/Credits.php:25 +msgid "Credits" +msgstr "" + +#: src/Module/Credits.php:26 +msgid "" +"Friendica is a community project, that would not be possible without the " +"help of many people. Here is a list of those who have contributed to the " +"code or the translation of Friendica. Thank you all!" +msgstr "" + +#: src/Module/Logout.php:41 +msgid "Logged out." +msgstr "" + +#: src/Module/Group.php:42 +msgid "Group created." +msgstr "" + +#: src/Module/Group.php:48 +msgid "Could not create group." +msgstr "" + +#: src/Module/Group.php:59 src/Module/Group.php:207 src/Module/Group.php:233 +msgid "Group not found." +msgstr "" + +#: src/Module/Group.php:65 +msgid "Group name changed." +msgstr "" + +#: src/Module/Group.php:87 +msgid "Unknown group." +msgstr "" + +#: src/Module/Group.php:92 src/Module/FollowConfirm.php:46 mod/fsuggest.php:32 +#: mod/fsuggest.php:75 mod/crepair.php:102 mod/dfrn_confirm.php:126 +#: mod/redir.php:32 mod/redir.php:122 mod/redir.php:137 +msgid "Contact not found." +msgstr "" + +#: src/Module/Group.php:96 +msgid "Contact is unavailable." +msgstr "" + +#: src/Module/Group.php:100 +msgid "Contact is deleted." +msgstr "" + +#: src/Module/Group.php:106 +msgid "Contact is blocked, unable to add it to a group." +msgstr "" + +#: src/Module/Group.php:110 +msgid "Unable to add the contact to the group." +msgstr "" + +#: src/Module/Group.php:112 +msgid "Contact successfully added to group." +msgstr "" + +#: src/Module/Group.php:116 +msgid "Unable to remove the contact from the group." +msgstr "" + +#: src/Module/Group.php:118 +msgid "Contact successfully removed from group." +msgstr "" + +#: src/Module/Group.php:121 +msgid "Unknown group command." +msgstr "" + +#: src/Module/Group.php:124 +msgid "Bad request." +msgstr "" + +#: src/Module/Group.php:163 +msgid "Save Group" +msgstr "" + +#: src/Module/Group.php:164 +msgid "Filter" +msgstr "" + +#: src/Module/Group.php:170 +msgid "Create a group of contacts/friends." +msgstr "" + +#: src/Module/Group.php:212 +msgid "Group removed." +msgstr "" + +#: src/Module/Group.php:214 +msgid "Unable to remove group." +msgstr "" + +#: src/Module/Group.php:265 +msgid "Delete Group" +msgstr "" + +#: src/Module/Group.php:275 +msgid "Edit Group Name" +msgstr "" + +#: src/Module/Group.php:285 +msgid "Members" +msgstr "" + +#: src/Module/Group.php:288 mod/network.php:616 +msgid "Group is empty" +msgstr "" + +#: src/Module/Group.php:301 +msgid "Remove contact from group" +msgstr "" + +#: src/Module/Group.php:321 mod/profperm.php:119 +msgid "Click on a contact to add or remove." +msgstr "" + +#: src/Module/Group.php:335 +msgid "Add contact to group" +msgstr "" + +#: src/Module/FollowConfirm.php:37 +msgid "No given contact." +msgstr "" + +#: src/Module/Debug/WebFinger.php:18 src/Module/Debug/Probe.php:19 +msgid "Only logged in users are permitted to perform a probing." +msgstr "" + +#: src/Module/Debug/Localtime.php:30 +msgid "Time Conversion" +msgstr "" + +#: src/Module/Debug/Localtime.php:31 +msgid "" +"Friendica provides this service for sharing events with other networks and " +"friends in unknown timezones." +msgstr "" + +#: src/Module/Debug/Localtime.php:32 +#, php-format +msgid "UTC time: %s" +msgstr "" + +#: src/Module/Debug/Localtime.php:35 +#, php-format +msgid "Current timezone: %s" +msgstr "" + +#: src/Module/Debug/Localtime.php:39 +#, php-format +msgid "Converted localtime: %s" +msgstr "" + +#: src/Module/Debug/Localtime.php:43 +msgid "Please select your timezone:" msgstr "" #: src/Module/Debug/Babel.php:32 @@ -8722,6 +6996,12 @@ msgstr "" msgid "HTML" msgstr "" +#: src/Module/Debug/ItemBody.php:18 src/Module/Item/Ignore.php:25 +#: src/Module/Diaspora/Receive.php:39 mod/community.php:32 mod/cal.php:31 +#: mod/cal.php:35 mod/follow.php:20 +msgid "Access denied." +msgstr "" + #: src/Module/Debug/Feed.php:20 src/Module/Filer/SaveTag.php:20 msgid "You must be logged in to use this module" msgstr "" @@ -8730,897 +7010,13 @@ msgstr "" msgid "Source URL" msgstr "" -#: src/Module/Debug/Localtime.php:30 -msgid "Time Conversion" -msgstr "" - -#: src/Module/Debug/Localtime.php:31 -msgid "" -"Friendica provides this service for sharing events with other networks and " -"friends in unknown timezones." -msgstr "" - -#: src/Module/Debug/Localtime.php:32 -#, php-format -msgid "UTC time: %s" -msgstr "" - -#: src/Module/Debug/Localtime.php:35 -#, php-format -msgid "Current timezone: %s" -msgstr "" - -#: src/Module/Debug/Localtime.php:39 -#, php-format -msgid "Converted localtime: %s" -msgstr "" - -#: src/Module/Debug/Localtime.php:43 -msgid "Please select your timezone:" -msgstr "" - -#: src/Module/Debug/Probe.php:19 src/Module/Debug/WebFinger.php:18 -msgid "Only logged in users are permitted to perform a probing." -msgstr "" - #: src/Module/Debug/Probe.php:35 msgid "Lookup address" msgstr "" -#: src/Module/Filer/SaveTag.php:39 +#: src/Module/Home.php:34 #, php-format -msgid "Filetag %s saved to item" -msgstr "" - -#: src/Module/Filer/SaveTag.php:48 -msgid "- select -" -msgstr "" - -#: src/Module/Friendica.php:40 -msgid "Installed addons/apps:" -msgstr "" - -#: src/Module/Friendica.php:45 -msgid "No installed addons/apps" -msgstr "" - -#: src/Module/Friendica.php:50 -#, php-format -msgid "Read about the Terms of Service of this node." -msgstr "" - -#: src/Module/Friendica.php:57 -msgid "On this server the following remote servers are blocked." -msgstr "" - -#: src/Module/Friendica.php:75 -#, php-format -msgid "" -"This is Friendica, version %s that is running at the web location %s. The " -"database version is %s, the post update version is %s." -msgstr "" - -#: src/Module/Friendica.php:80 -msgid "" -"Please visit Friendi.ca to learn more " -"about the Friendica project." -msgstr "" - -#: src/Module/Friendica.php:81 -msgid "Bug reports and issues: please visit" -msgstr "" - -#: src/Module/Friendica.php:81 -msgid "the bugtracker at github" -msgstr "" - -#: src/Module/Friendica.php:82 -msgid "" -"Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca" -msgstr "" - -#: src/Module/Group.php:42 -msgid "Group created." -msgstr "" - -#: src/Module/Group.php:48 -msgid "Could not create group." -msgstr "" - -#: src/Module/Group.php:59 src/Module/Group.php:207 src/Module/Group.php:233 -msgid "Group not found." -msgstr "" - -#: src/Module/Group.php:65 -msgid "Group name changed." -msgstr "" - -#: src/Module/Group.php:87 -msgid "Unknown group." -msgstr "" - -#: src/Module/Group.php:96 -msgid "Contact is unavailable." -msgstr "" - -#: src/Module/Group.php:100 -msgid "Contact is deleted." -msgstr "" - -#: src/Module/Group.php:106 -msgid "Contact is blocked, unable to add it to a group." -msgstr "" - -#: src/Module/Group.php:110 -msgid "Unable to add the contact to the group." -msgstr "" - -#: src/Module/Group.php:112 -msgid "Contact successfully added to group." -msgstr "" - -#: src/Module/Group.php:116 -msgid "Unable to remove the contact from the group." -msgstr "" - -#: src/Module/Group.php:118 -msgid "Contact successfully removed from group." -msgstr "" - -#: src/Module/Group.php:121 -msgid "Unknown group command." -msgstr "" - -#: src/Module/Group.php:124 -msgid "Bad request." -msgstr "" - -#: src/Module/Group.php:163 -msgid "Save Group" -msgstr "" - -#: src/Module/Group.php:164 -msgid "Filter" -msgstr "" - -#: src/Module/Group.php:170 -msgid "Create a group of contacts/friends." -msgstr "" - -#: src/Module/Group.php:212 -msgid "Group removed." -msgstr "" - -#: src/Module/Group.php:214 -msgid "Unable to remove group." -msgstr "" - -#: src/Module/Group.php:265 -msgid "Delete Group" -msgstr "" - -#: src/Module/Group.php:275 -msgid "Edit Group Name" -msgstr "" - -#: src/Module/Group.php:285 -msgid "Members" -msgstr "" - -#: src/Module/Group.php:301 -msgid "Remove contact from group" -msgstr "" - -#: src/Module/Group.php:335 -msgid "Add contact to group" -msgstr "" - -#: src/Module/Help.php:43 -msgid "Help:" -msgstr "" - -#: src/Module/Invite.php:37 -msgid "Total invitation limit exceeded." -msgstr "" - -#: src/Module/Invite.php:60 -#, php-format -msgid "%s : Not a valid email address." -msgstr "" - -#: src/Module/Invite.php:87 -msgid "Please join us on Friendica" -msgstr "" - -#: src/Module/Invite.php:96 -msgid "Invitation limit exceeded. Please contact your site administrator." -msgstr "" - -#: src/Module/Invite.php:100 -#, php-format -msgid "%s : Message delivery failed." -msgstr "" - -#: src/Module/Invite.php:104 -#, php-format -msgid "%d message sent." -msgid_plural "%d messages sent." -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Invite.php:122 -msgid "You have no more invitations available" -msgstr "" - -#: src/Module/Invite.php:129 -#, php-format -msgid "" -"Visit %s for a list of public sites that you can join. Friendica members on " -"other sites can all connect with each other, as well as with members of many " -"other social networks." -msgstr "" - -#: src/Module/Invite.php:131 -#, php-format -msgid "" -"To accept this invitation, please visit and register at %s or any other " -"public Friendica website." -msgstr "" - -#: src/Module/Invite.php:132 -#, php-format -msgid "" -"Friendica sites all inter-connect to create a huge privacy-enhanced social " -"web that is owned and controlled by its members. They can also connect with " -"many traditional social networks. See %s for a list of alternate Friendica " -"sites you can join." -msgstr "" - -#: src/Module/Invite.php:136 -msgid "" -"Our apologies. This system is not currently configured to connect with other " -"public sites or invite members." -msgstr "" - -#: src/Module/Invite.php:139 -msgid "" -"Friendica sites all inter-connect to create a huge privacy-enhanced social " -"web that is owned and controlled by its members. They can also connect with " -"many traditional social networks." -msgstr "" - -#: src/Module/Invite.php:138 -#, php-format -msgid "To accept this invitation, please visit and register at %s." -msgstr "" - -#: src/Module/Invite.php:146 -msgid "Send invitations" -msgstr "" - -#: src/Module/Invite.php:147 -msgid "Enter email addresses, one per line:" -msgstr "" - -#: src/Module/Invite.php:151 -msgid "" -"You are cordially invited to join me and other close friends on Friendica - " -"and help us to create a better social web." -msgstr "" - -#: src/Module/Invite.php:153 -msgid "You will need to supply this invitation code: $invite_code" -msgstr "" - -#: src/Module/Invite.php:153 -msgid "" -"Once you have registered, please connect with me via my profile page at:" -msgstr "" - -#: src/Module/Invite.php:155 -msgid "" -"For more information about the Friendica project and why we feel it is " -"important, please visit http://friendi.ca" -msgstr "" - -#: src/Module/Item/Compose.php:31 -msgid "Please enter a post body." -msgstr "" - -#: src/Module/Item/Compose.php:44 -msgid "This feature is only available with the frio theme." -msgstr "" - -#: src/Module/Item/Compose.php:67 -msgid "Compose new personal note" -msgstr "" - -#: src/Module/Item/Compose.php:74 -msgid "Compose new post" -msgstr "" - -#: src/Module/Item/Compose.php:194 -msgid "Clear the location" -msgstr "" - -#: src/Module/Item/Compose.php:195 -msgid "Location services are unavailable on your device" -msgstr "" - -#: src/Module/Item/Compose.php:196 -msgid "" -"Location services are disabled. Please check the website's permissions on " -"your device" -msgstr "" - -#: src/Module/Item/Compose.php:200 -msgid "Public" -msgstr "" - -#: src/Module/Item/Compose.php:201 -msgid "" -"This post will be sent to all your followers and can be seen in the " -"community pages and by anyone with its link." -msgstr "" - -#: src/Module/Item/Compose.php:202 -msgid "Limited/Private" -msgstr "" - -#: src/Module/Item/Compose.php:203 -msgid "" -"This post will be sent only to the people in the first box, to the exception " -"of the people mentioned in the second box. It won't appear anywhere public." -msgstr "" - -#: src/Module/Maintenance.php:29 -msgid "System down for maintenance" -msgstr "" - -#: src/Module/Photo.php:87 -#, php-format -msgid "Invalid photo with id %s." -msgstr "" - -#: src/Module/Profile/Contacts.php:24 src/Module/Profile/Contacts.php:37 -msgid "User not found." -msgstr "" - -#: src/Module/Profile/Contacts.php:78 -msgid "No contacts." -msgstr "" - -#: src/Module/Profile/Contacts.php:93 src/Module/Contact.php:590 -#: src/Module/Contact.php:1029 -#, php-format -msgid "Visit %s's profile [%s]" -msgstr "" - -#: src/Module/Profile/Contacts.php:112 -#, php-format -msgid "Follower (%s)" -msgid_plural "Followers (%s)" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Profile/Contacts.php:113 -#, php-format -msgid "Following (%s)" -msgid_plural "Following (%s)" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Profile/Contacts.php:114 -#, php-format -msgid "Mutual friend (%s)" -msgid_plural "Mutual friends (%s)" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Profile/Contacts.php:116 -#, php-format -msgid "Contact (%s)" -msgid_plural "Contacts (%s)" -msgstr[0] "" -msgstr[1] "" - -#: src/Module/Profile/Contacts.php:125 -msgid "All contacts" -msgstr "" - -#: src/Module/Search/Acl.php:37 -msgid "You must be logged in to use this module." -msgstr "" - -#: src/Module/Search/Index.php:35 -msgid "Only logged in users are permitted to perform a search." -msgstr "" - -#: src/Module/Search/Index.php:57 -msgid "Only one search per minute is permitted for not logged in users." -msgstr "" - -#: src/Module/Search/Index.php:183 -#, php-format -msgid "Items tagged with: %s" -msgstr "" - -#: src/Module/Search/Index.php:185 src/Module/Contact.php:815 -#, php-format -msgid "Results for: %s" -msgstr "" - -#: src/Module/Search/Saved.php:29 -msgid "Search term successfully saved." -msgstr "" - -#: src/Module/Search/Saved.php:31 -msgid "Search term already saved." -msgstr "" - -#: src/Module/Search/Saved.php:37 -msgid "Search term successfully removed." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:36 -#: src/Module/Settings/TwoFactor/Recovery.php:34 -#: src/Module/Settings/TwoFactor/Verify.php:41 -msgid "Please enter your password to access this page." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:54 -msgid "App-specific password generation failed: The description is empty." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:57 -msgid "" -"App-specific password generation failed: This description already exists." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:61 -msgid "New app-specific password generated." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:67 -msgid "App-specific passwords successfully revoked." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:77 -msgid "App-specific password successfully revoked." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:98 -msgid "Two-factor app-specific passwords" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:100 -msgid "" -"

App-specific passwords are randomly generated passwords used instead your " -"regular password to authenticate your account on third-party applications " -"that don't support two-factor authentication.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:101 -msgid "" -"Make sure to copy your new app-specific password now. You won’t be able to " -"see it again!" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:104 -msgid "Description" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:105 -msgid "Last Used" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:106 -msgid "Revoke" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:107 -msgid "Revoke All" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:110 -msgid "" -"When you generate a new app-specific password, you must use it right away, " -"it will be shown to you once after you generate it." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:111 -msgid "Generate new app-specific password" -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:112 -msgid "Friendiqa on my Fairphone 2..." -msgstr "" - -#: src/Module/Settings/TwoFactor/AppSpecific.php:113 -msgid "Generate" -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:50 -msgid "New recovery codes successfully generated." -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:76 -msgid "Two-factor recovery codes" -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:78 -msgid "" -"

Recovery codes can be used to access your account in the event you lose " -"access to your device and cannot receive two-factor authentication codes.

Put these in a safe spot! If you lose your device and " -"don’t have the recovery codes you will lose access to your account.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:80 -msgid "" -"When you generate new recovery codes, you must copy the new codes. Your old " -"codes won’t work anymore." -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:81 -msgid "Generate new recovery codes" -msgstr "" - -#: src/Module/Settings/TwoFactor/Recovery.php:83 -msgid "Next: Verification" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:51 -msgid "Two-factor authentication successfully disabled." -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:92 -msgid "" -"

Use an application on a mobile device to get two-factor authentication " -"codes when prompted on login.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:96 -msgid "Authenticator app" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:97 -msgid "Configured" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:97 -msgid "Not Configured" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:98 -msgid "

You haven't finished configuring your authenticator app.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:99 -msgid "

Your authenticator app is correctly configured.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:101 -msgid "Recovery codes" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:102 -msgid "Remaining valid codes" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:104 -msgid "" -"

These one-use codes can replace an authenticator app code in case you " -"have lost access to it.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:106 -msgid "App-specific passwords" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:107 -msgid "Generated app-specific passwords" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:109 -msgid "" -"

These randomly generated passwords allow you to authenticate on apps not " -"supporting two-factor authentication.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:111 src/Module/Contact.php:635 -msgid "Actions" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:112 -msgid "Current password:" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:112 -msgid "" -"You need to provide your current password to change two-factor " -"authentication settings." -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:113 -msgid "Enable two-factor authentication" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:114 -msgid "Disable two-factor authentication" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:115 -msgid "Show recovery codes" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:116 -msgid "Manage app-specific passwords" -msgstr "" - -#: src/Module/Settings/TwoFactor/Index.php:117 -msgid "Finish app configuration" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:63 -msgid "Two-factor authentication successfully activated." -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:67 -#: src/Module/TwoFactor/Verify.php:43 src/Module/TwoFactor/Recovery.php:46 -msgid "Invalid code, please retry." -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:96 -#, php-format -msgid "" -"

Or you can submit the authentication settings manually:

\n" -"
\n" -"\t
Issuer
\n" -"\t
%s
\n" -"\t
Account Name
\n" -"\t
%s
\n" -"\t
Secret Key
\n" -"\t
%s
\n" -"\t
Type
\n" -"\t
Time-based
\n" -"\t
Number of digits
\n" -"\t
6
\n" -"\t
Hashing algorithm
\n" -"\t
SHA-1
\n" -"
" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:116 -msgid "Two-factor code verification" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:118 -msgid "" -"

Please scan this QR Code with your authenticator app and submit the " -"provided code.

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:120 -#, php-format -msgid "" -"

Or you can open the following URL in your mobile devicde:

%s

" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:126 -#: src/Module/TwoFactor/Verify.php:67 -msgid "Please enter a code from your authentication app" -msgstr "" - -#: src/Module/Settings/TwoFactor/Verify.php:127 -msgid "Verify code and enable two-factor authentication" -msgstr "" - -#: src/Module/Settings/Delegation.php:37 -msgid "Delegation successfully granted." -msgstr "" - -#: src/Module/Settings/Delegation.php:39 -msgid "Parent user not found, unavailable or password doesn't match." -msgstr "" - -#: src/Module/Settings/Delegation.php:43 -msgid "Delegation successfully revoked." -msgstr "" - -#: src/Module/Settings/Delegation.php:66 src/Module/Settings/Delegation.php:88 -msgid "" -"Delegated administrators can view but not change delegation permissions." -msgstr "" - -#: src/Module/Settings/Delegation.php:80 -msgid "Delegate user not found." -msgstr "" - -#: src/Module/Settings/Delegation.php:137 -msgid "No parent user" -msgstr "" - -#: src/Module/Settings/Delegation.php:149 -msgid "Parent Password:" -msgstr "" - -#: src/Module/Settings/Delegation.php:149 -msgid "" -"Please enter the password of the parent account to legitimize your request." -msgstr "" - -#: src/Module/Settings/Delegation.php:154 -msgid "Parent User" -msgstr "" - -#: src/Module/Settings/Delegation.php:157 -msgid "" -"Parent users have total control about this account, including the account " -"settings. Please double check whom you give this access." -msgstr "" - -#: src/Module/Settings/Delegation.php:159 -msgid "Delegate Page Management" -msgstr "" - -#: src/Module/Settings/Delegation.php:160 -msgid "Delegates" -msgstr "" - -#: src/Module/Settings/Delegation.php:162 -msgid "" -"Delegates are able to manage all aspects of this account/page except for " -"basic account settings. Please do not delegate your personal account to " -"anybody that you do not trust completely." -msgstr "" - -#: src/Module/Settings/Delegation.php:163 -msgid "Existing Page Delegates" -msgstr "" - -#: src/Module/Settings/Delegation.php:165 -msgid "Potential Delegates" -msgstr "" - -#: src/Module/Settings/Delegation.php:168 -msgid "Add" -msgstr "" - -#: src/Module/Settings/Delegation.php:169 -msgid "No entries." -msgstr "" - -#: src/Module/Settings/UserExport.php:44 -msgid "Export account" -msgstr "" - -#: src/Module/Settings/UserExport.php:44 -msgid "" -"Export your account info and contacts. Use this to make a backup of your " -"account and/or to move it to another server." -msgstr "" - -#: src/Module/Settings/UserExport.php:45 -msgid "Export all" -msgstr "" - -#: src/Module/Settings/UserExport.php:45 -msgid "" -"Export your accout info, contacts and all your items as json. Could be a " -"very big file, and could take a lot of time. Use this to make a full backup " -"of your account (photos are not exported)" -msgstr "" - -#: src/Module/Settings/UserExport.php:46 -msgid "Export Contacts to CSV" -msgstr "" - -#: src/Module/Settings/UserExport.php:46 -msgid "" -"Export the list of the accounts you are following as CSV file. Compatible to " -"e.g. Mastodon." -msgstr "" - -#: src/Module/Special/HTTPException.php:32 -msgid "Bad Request" -msgstr "" - -#: src/Module/Special/HTTPException.php:33 -msgid "Unauthorized" -msgstr "" - -#: src/Module/Special/HTTPException.php:34 -msgid "Forbidden" -msgstr "" - -#: src/Module/Special/HTTPException.php:35 -msgid "Not Found" -msgstr "" - -#: src/Module/Special/HTTPException.php:36 -msgid "Internal Server Error" -msgstr "" - -#: src/Module/Special/HTTPException.php:37 -msgid "Service Unavailable" -msgstr "" - -#: src/Module/Special/HTTPException.php:44 -msgid "" -"The server cannot or will not process the request due to an apparent client " -"error." -msgstr "" - -#: src/Module/Special/HTTPException.php:45 -msgid "Authentication is required and has failed or has not yet been provided." -msgstr "" - -#: src/Module/Special/HTTPException.php:46 -msgid "" -"The request was valid, but the server is refusing action. The user might not " -"have the necessary permissions for a resource, or may need an account." -msgstr "" - -#: src/Module/Special/HTTPException.php:47 -msgid "" -"The requested resource could not be found but may be available in the future." -msgstr "" - -#: src/Module/Special/HTTPException.php:48 -msgid "" -"An unexpected condition was encountered and no more specific message is " -"suitable." -msgstr "" - -#: src/Module/Special/HTTPException.php:49 -msgid "" -"The server is currently unavailable (because it is overloaded or down for " -"maintenance). Please try again later." -msgstr "" - -#: src/Module/Special/HTTPException.php:55 -msgid "Go back" -msgstr "" - -#: src/Module/TwoFactor/Verify.php:63 -msgid "" -"

Open the two-factor authentication app on your device to get an " -"authentication code and verify your identity.

" -msgstr "" - -#: src/Module/TwoFactor/Verify.php:66 src/Module/TwoFactor/Recovery.php:67 -#, php-format -msgid "" -"Don’t have your phone? Enter a two-factor recovery code" -msgstr "" - -#: src/Module/TwoFactor/Verify.php:68 -msgid "Verify code and complete login" -msgstr "" - -#: src/Module/TwoFactor/Recovery.php:41 -#, php-format -msgid "Remaining recovery codes: %d" -msgstr "" - -#: src/Module/TwoFactor/Recovery.php:65 -msgid "Two-factor recovery" -msgstr "" - -#: src/Module/TwoFactor/Recovery.php:66 -msgid "" -"

You can enter one of your one-time recovery codes in case you lost access " -"to your mobile device.

" -msgstr "" - -#: src/Module/TwoFactor/Recovery.php:68 -msgid "Please enter a recovery code" -msgstr "" - -#: src/Module/TwoFactor/Recovery.php:69 -msgid "Submit recovery code and complete login" +msgid "Welcome to %s" msgstr "" #: src/Module/Welcome.php:25 @@ -9673,6 +7069,10 @@ msgid "" "potential friends know exactly how to find you." msgstr "" +#: src/Module/Welcome.php:39 mod/profile_photo.php:246 mod/profiles.php:583 +msgid "Upload Profile Photo" +msgstr "" + #: src/Module/Welcome.php:40 msgid "" "Upload a profile photo if you have not done so already. Studies have shown " @@ -9788,28 +7188,70 @@ msgid "" "features and resources." msgstr "" +#: src/Module/Profile/Contacts.php:24 src/Module/Profile/Contacts.php:37 +msgid "User not found." +msgstr "" + +#: src/Module/Profile/Contacts.php:78 +msgid "No contacts." +msgstr "" + +#: src/Module/Profile/Contacts.php:93 src/Module/Contact.php:590 +#: src/Module/Contact.php:1029 +#, php-format +msgid "Visit %s's profile [%s]" +msgstr "" + +#: src/Module/Profile/Contacts.php:112 +#, php-format +msgid "Follower (%s)" +msgid_plural "Followers (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Profile/Contacts.php:113 +#, php-format +msgid "Following (%s)" +msgid_plural "Following (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Profile/Contacts.php:114 +#, php-format +msgid "Mutual friend (%s)" +msgid_plural "Mutual friends (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Profile/Contacts.php:116 +#, php-format +msgid "Contact (%s)" +msgid_plural "Contacts (%s)" +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Profile/Contacts.php:125 +msgid "All contacts" +msgstr "" + +#: src/Module/Filer/SaveTag.php:39 +#, php-format +msgid "Filetag %s saved to item" +msgstr "" + +#: src/Module/Filer/SaveTag.php:48 +msgid "- select -" +msgstr "" + +#: src/Module/AllFriends.php:35 src/Module/AllFriends.php:43 +#: mod/network.php:649 +msgid "Invalid contact." +msgstr "" + #: src/Module/AllFriends.php:55 msgid "No friends to display." msgstr "" -#: src/Module/BaseSearchModule.php:54 -#, php-format -msgid "People Search - %s" -msgstr "" - -#: src/Module/BaseSearchModule.php:64 -#, php-format -msgid "Forum Search - %s" -msgstr "" - -#: src/Module/Bookmarklet.php:35 -msgid "This page is missing a url parameter." -msgstr "" - -#: src/Module/Bookmarklet.php:57 -msgid "The post was created" -msgstr "" - #: src/Module/Contact.php:72 #, php-format msgid "%d contact edited." @@ -9829,6 +7271,10 @@ msgstr "" msgid "Contact updated." msgstr "" +#: src/Module/Contact.php:143 mod/dfrn_request.php:415 +msgid "Failed to update contact record." +msgstr "" + #: src/Module/Contact.php:376 msgid "Contact not found" msgstr "" @@ -10016,6 +7462,11 @@ msgstr "" msgid "Awaiting connection acknowledge" msgstr "" +#: src/Module/Contact.php:615 mod/notifications.php:196 +#: mod/notifications.php:283 +msgid "Hide this contact from others" +msgstr "" + #: src/Module/Contact.php:615 msgid "" "Replies/likes to your public posts may still be visible" @@ -10091,6 +7542,15 @@ msgstr "" msgid "Search your contacts" msgstr "" +#: src/Module/Contact.php:815 src/Module/Search/Index.php:185 +#, php-format +msgid "Results for: %s" +msgstr "" + +#: src/Module/Contact.php:822 mod/settings.php:194 mod/settings.php:696 +msgid "Update" +msgstr "" + #: src/Module/Contact.php:825 src/Module/Contact.php:1099 msgid "Archive" msgstr "" @@ -10115,6 +7575,10 @@ msgstr "" msgid "View all contacts" msgstr "" +#: src/Module/Contact.php:891 mod/common.php:141 +msgid "Common Friends" +msgstr "" + #: src/Module/Contact.php:894 msgid "View all common friends" msgstr "" @@ -10163,244 +7627,225 @@ msgstr "" msgid "Delete contact" msgstr "" -#: src/Module/Delegation.php:127 -msgid "Manage Identities and/or Pages" +#: src/Module/Invite.php:37 +msgid "Total invitation limit exceeded." msgstr "" -#: src/Module/Delegation.php:128 -msgid "" -"Toggle between different identities or community/group pages which share " -"your account details or which you have been granted \"manage\" permissions" -msgstr "" - -#: src/Module/Delegation.php:129 -msgid "Select an identity to manage: " -msgstr "" - -#: src/Module/Directory.php:59 -msgid "No entries (some entries may be hidden)." -msgstr "" - -#: src/Module/Directory.php:78 -msgid "Find on this site" -msgstr "" - -#: src/Module/Directory.php:80 -msgid "Results for:" -msgstr "" - -#: src/Module/Directory.php:82 -msgid "Site Directory" -msgstr "" - -#: src/Module/FollowConfirm.php:37 -msgid "No given contact." -msgstr "" - -#: src/Module/HTTPException/MethodNotAllowed.php:13 -msgid "Method Not Allowed." -msgstr "" - -#: src/Module/HTTPException/PageNotFound.php:13 src/App/Router.php:182 -msgid "Page not found." -msgstr "" - -#: src/Module/Home.php:34 +#: src/Module/Invite.php:60 #, php-format -msgid "Welcome to %s" +msgid "%s : Not a valid email address." msgstr "" -#: src/Module/Install.php:159 -msgid "Friendica Communications Server - Setup" +#: src/Module/Invite.php:87 +msgid "Please join us on Friendica" msgstr "" -#: src/Module/Install.php:170 -msgid "System check" +#: src/Module/Invite.php:96 +msgid "Invitation limit exceeded. Please contact your site administrator." msgstr "" -#: src/Module/Install.php:175 -msgid "Check again" +#: src/Module/Invite.php:100 +#, php-format +msgid "%s : Message delivery failed." msgstr "" -#: src/Module/Install.php:190 -msgid "Base settings" +#: src/Module/Invite.php:104 +#, php-format +msgid "%d message sent." +msgid_plural "%d messages sent." +msgstr[0] "" +msgstr[1] "" + +#: src/Module/Invite.php:122 +msgid "You have no more invitations available" msgstr "" -#: src/Module/Install.php:197 -msgid "Host name" -msgstr "" - -#: src/Module/Install.php:199 -msgid "" -"Overwrite this field in case the determinated hostname isn't right, " -"otherweise leave it as is." -msgstr "" - -#: src/Module/Install.php:202 -msgid "Base path to installation" -msgstr "" - -#: src/Module/Install.php:204 -msgid "" -"If the system cannot detect the correct path to your installation, enter the " -"correct path here. This setting should only be set if you are using a " -"restricted system and symbolic links to your webroot." -msgstr "" - -#: src/Module/Install.php:207 -msgid "Sub path of the URL" -msgstr "" - -#: src/Module/Install.php:209 -msgid "" -"Overwrite this field in case the sub path determination isn't right, " -"otherwise leave it as is. Leaving this field blank means the installation is " -"at the base URL without sub path." -msgstr "" - -#: src/Module/Install.php:220 -msgid "Database connection" -msgstr "" - -#: src/Module/Install.php:221 -msgid "" -"In order to install Friendica we need to know how to connect to your " -"database." -msgstr "" - -#: src/Module/Install.php:222 -msgid "" -"Please contact your hosting provider or site administrator if you have " -"questions about these settings." -msgstr "" - -#: src/Module/Install.php:223 -msgid "" -"The database you specify below should already exist. If it does not, please " -"create it before continuing." -msgstr "" - -#: src/Module/Install.php:230 -msgid "Database Server Name" -msgstr "" - -#: src/Module/Install.php:235 -msgid "Database Login Name" -msgstr "" - -#: src/Module/Install.php:241 -msgid "Database Login Password" -msgstr "" - -#: src/Module/Install.php:243 -msgid "For security reasons the password must not be empty" -msgstr "" - -#: src/Module/Install.php:246 -msgid "Database Name" -msgstr "" - -#: src/Module/Install.php:250 src/Module/Install.php:279 -msgid "Please select a default timezone for your website" -msgstr "" - -#: src/Module/Install.php:264 -msgid "Site settings" -msgstr "" - -#: src/Module/Install.php:274 -msgid "Site administrator email address" -msgstr "" - -#: src/Module/Install.php:276 -msgid "" -"Your account email address must match this in order to use the web admin " -"panel." -msgstr "" - -#: src/Module/Install.php:283 -msgid "System Language:" -msgstr "" - -#: src/Module/Install.php:285 -msgid "" -"Set the default language for your Friendica installation interface and to " -"send emails." -msgstr "" - -#: src/Module/Install.php:297 -msgid "Your Friendica site database has been installed." -msgstr "" - -#: src/Module/Install.php:305 -msgid "Installation finished" -msgstr "" - -#: src/Module/Install.php:327 -msgid "

What next

" -msgstr "" - -#: src/Module/Install.php:328 -msgid "" -"IMPORTANT: You will need to [manually] setup a scheduled task for the worker." -msgstr "" - -#: src/Module/Install.php:331 +#: src/Module/Invite.php:129 #, php-format msgid "" -"Go to your new Friendica node registration page " -"and register as new user. Remember to use the same email you have entered as " -"administrator email. This will allow you to enter the site admin panel." +"Visit %s for a list of public sites that you can join. Friendica members on " +"other sites can all connect with each other, as well as with members of many " +"other social networks." msgstr "" -#: src/Module/Login.php:312 -msgid "Create a New Account" -msgstr "" - -#: src/Module/Login.php:337 -msgid "Your OpenID: " -msgstr "" - -#: src/Module/Login.php:340 +#: src/Module/Invite.php:131 +#, php-format msgid "" -"Please enter your username and password to add the OpenID to your existing " -"account." +"To accept this invitation, please visit and register at %s or any other " +"public Friendica website." msgstr "" -#: src/Module/Login.php:342 -msgid "Or login using OpenID: " +#: src/Module/Invite.php:132 +#, php-format +msgid "" +"Friendica sites all inter-connect to create a huge privacy-enhanced social " +"web that is owned and controlled by its members. They can also connect with " +"many traditional social networks. See %s for a list of alternate Friendica " +"sites you can join." msgstr "" -#: src/Module/Login.php:356 -msgid "Password: " +#: src/Module/Invite.php:136 +msgid "" +"Our apologies. This system is not currently configured to connect with other " +"public sites or invite members." msgstr "" -#: src/Module/Login.php:357 -msgid "Remember me" +#: src/Module/Invite.php:139 +msgid "" +"Friendica sites all inter-connect to create a huge privacy-enhanced social " +"web that is owned and controlled by its members. They can also connect with " +"many traditional social networks." msgstr "" -#: src/Module/Login.php:366 -msgid "Forgot your password?" +#: src/Module/Invite.php:138 +#, php-format +msgid "To accept this invitation, please visit and register at %s." msgstr "" -#: src/Module/Login.php:369 -msgid "Website Terms of Service" +#: src/Module/Invite.php:146 +msgid "Send invitations" msgstr "" -#: src/Module/Login.php:370 -msgid "terms of service" +#: src/Module/Invite.php:147 +msgid "Enter email addresses, one per line:" msgstr "" -#: src/Module/Login.php:372 -msgid "Website Privacy Policy" +#: src/Module/Invite.php:150 mod/wallmessage.php:137 mod/message.php:255 +#: mod/message.php:435 +msgid "Your message:" msgstr "" -#: src/Module/Login.php:373 -msgid "privacy policy" +#: src/Module/Invite.php:151 +msgid "" +"You are cordially invited to join me and other close friends on Friendica - " +"and help us to create a better social web." msgstr "" -#: src/Module/Logout.php:40 -msgid "Logged out." +#: src/Module/Invite.php:153 +msgid "You will need to supply this invitation code: $invite_code" +msgstr "" + +#: src/Module/Invite.php:153 +msgid "" +"Once you have registered, please connect with me via my profile page at:" +msgstr "" + +#: src/Module/Invite.php:155 +msgid "" +"For more information about the Friendica project and why we feel it is " +"important, please visit http://friendi.ca" +msgstr "" + +#: src/Module/BaseSettingsModule.php:18 mod/photos.php:133 mod/settings.php:62 +msgid "everybody" +msgstr "" + +#: src/Module/BaseSettingsModule.php:24 mod/settings.php:67 +msgid "Account" +msgstr "" + +#: src/Module/BaseSettingsModule.php:54 mod/settings.php:98 +msgid "Display" +msgstr "" + +#: src/Module/BaseSettingsModule.php:61 mod/settings.php:105 +#: mod/settings.php:843 +msgid "Social Networks" +msgstr "" + +#: src/Module/BaseSettingsModule.php:75 mod/settings.php:119 +msgid "Delegations" +msgstr "" + +#: src/Module/BaseSettingsModule.php:82 mod/settings.php:126 +msgid "Connected apps" +msgstr "" + +#: src/Module/BaseSettingsModule.php:96 mod/settings.php:140 +msgid "Remove account" +msgstr "" + +#: src/Module/Item/Compose.php:34 +msgid "Please enter a post body." +msgstr "" + +#: src/Module/Item/Compose.php:47 +msgid "This feature is only available with the frio theme." +msgstr "" + +#: src/Module/Item/Compose.php:75 +msgid "Compose new personal note" +msgstr "" + +#: src/Module/Item/Compose.php:84 +msgid "Compose new post" +msgstr "" + +#: src/Module/Item/Compose.php:119 +msgid "Visibility" +msgstr "" + +#: src/Module/Item/Compose.php:140 +msgid "Clear the location" +msgstr "" + +#: src/Module/Item/Compose.php:141 +msgid "Location services are unavailable on your device" +msgstr "" + +#: src/Module/Item/Compose.php:142 +msgid "" +"Location services are disabled. Please check the website's permissions on " +"your device" +msgstr "" + +#: src/Module/Friendica.php:40 +msgid "Installed addons/apps:" +msgstr "" + +#: src/Module/Friendica.php:45 +msgid "No installed addons/apps" +msgstr "" + +#: src/Module/Friendica.php:50 +#, php-format +msgid "Read about the Terms of Service of this node." +msgstr "" + +#: src/Module/Friendica.php:57 +msgid "On this server the following remote servers are blocked." +msgstr "" + +#: src/Module/Friendica.php:75 +#, php-format +msgid "" +"This is Friendica, version %s that is running at the web location %s. The " +"database version is %s, the post update version is %s." +msgstr "" + +#: src/Module/Friendica.php:80 +msgid "" +"Please visit Friendi.ca to learn more " +"about the Friendica project." +msgstr "" + +#: src/Module/Friendica.php:81 +msgid "Bug reports and issues: please visit" +msgstr "" + +#: src/Module/Friendica.php:81 +msgid "the bugtracker at github" +msgstr "" + +#: src/Module/Friendica.php:82 +msgid "" +"Suggestions, praise, etc. - please email \"info\" at \"friendi - dot - ca" +msgstr "" + +#: src/Module/Register.php:60 mod/uimport.php:39 +msgid "" +"This site has exceeded the number of allowed daily account registrations. " +"Please try again tomorrow." msgstr "" #: src/Module/Register.php:77 @@ -10423,6 +7868,16 @@ msgstr "" msgid "Include your profile in member directory?" msgstr "" +#: src/Module/Register.php:92 mod/api.php:111 mod/dfrn_request.php:642 +#: mod/follow.php:163 mod/profiles.php:526 mod/profiles.php:530 +#: mod/profiles.php:551 mod/settings.php:1090 mod/settings.php:1096 +#: mod/settings.php:1103 mod/settings.php:1107 mod/settings.php:1111 +#: mod/settings.php:1115 mod/settings.php:1119 mod/settings.php:1123 +#: mod/settings.php:1143 mod/settings.php:1144 mod/settings.php:1145 +#: mod/settings.php:1146 mod/settings.php:1147 +msgid "No" +msgstr "" + #: src/Module/Register.php:111 msgid "Note for the admin" msgstr "" @@ -10449,10 +7904,18 @@ msgid "" "be an existing address.)" msgstr "" +#: src/Module/Register.php:124 mod/settings.php:1186 +msgid "New Password:" +msgstr "" + #: src/Module/Register.php:124 msgid "Leave empty for an auto generated password." msgstr "" +#: src/Module/Register.php:125 mod/settings.php:1187 +msgid "Confirm:" +msgstr "" + #: src/Module/Register.php:126 #, php-format msgid "" @@ -10464,6 +7927,10 @@ msgstr "" msgid "Choose a nickname: " msgstr "" +#: src/Module/Register.php:135 mod/uimport.php:46 +msgid "Import" +msgstr "" + #: src/Module/Register.php:136 msgid "Import your profile to this friendica instance" msgstr "" @@ -10496,217 +7963,146 @@ msgstr "" msgid "You have to leave a request note for the admin." msgstr "" -#: src/Module/Register.php:307 +#: src/Module/Register.php:266 +msgid "You have entered too much information." +msgstr "" + +#: src/Module/Register.php:312 msgid "Your registration is pending approval by the site owner." msgstr "" -#: src/Module/Tos.php:35 src/Module/Tos.php:77 -msgid "" -"At the time of registration, and for providing communications between the " -"user account and their contacts, the user has to provide a display name (pen " -"name), an username (nickname) and a working email address. The names will be " -"accessible on the profile page of the account by any visitor of the page, " -"even if other profile details are not displayed. The email address will only " -"be used to send the user notifications about interactions, but wont be " -"visibly displayed. The listing of an account in the node's user directory or " -"the global user directory is optional and can be controlled in the user " -"settings, it is not necessary for communication." +#: src/Module/Search/Saved.php:29 +msgid "Search term successfully saved." msgstr "" -#: src/Module/Tos.php:36 src/Module/Tos.php:78 -msgid "" -"This data is required for communication and is passed on to the nodes of the " -"communication partners and is stored there. Users can enter additional " -"private data that may be transmitted to the communication partners accounts." +#: src/Module/Search/Saved.php:31 +msgid "Search term already saved." msgstr "" -#: src/Module/Tos.php:37 src/Module/Tos.php:79 +#: src/Module/Search/Saved.php:37 +msgid "Search term successfully removed." +msgstr "" + +#: src/Module/Search/Index.php:35 +msgid "Only logged in users are permitted to perform a search." +msgstr "" + +#: src/Module/Search/Index.php:57 +msgid "Only one search per minute is permitted for not logged in users." +msgstr "" + +#: src/Module/Search/Index.php:178 mod/community.php:155 +msgid "No results." +msgstr "" + +#: src/Module/Search/Index.php:183 #, php-format +msgid "Items tagged with: %s" +msgstr "" + +#: src/Module/Search/Acl.php:37 +msgid "You must be logged in to use this module." +msgstr "" + +#: src/BaseModule.php:133 msgid "" -"At any point in time a logged in user can export their account data from the " -"account settings. If the user wants " -"to delete their account they can do so at %1$s/" -"removeme. The deletion of the account will be permanent. Deletion of the " -"data will also be requested from the nodes of the communication partners." +"The form security token was not correct. This probably happened because the " +"form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: src/Module/Tos.php:40 src/Module/Tos.php:76 -msgid "Privacy Statement" -msgstr "" - -#: src/Object/Post.php:135 -msgid "This entry was edited" -msgstr "" - -#: src/Object/Post.php:155 -msgid "Private Message" -msgstr "" - -#: src/Object/Post.php:197 -msgid "Delete locally" -msgstr "" - -#: src/Object/Post.php:200 -msgid "Delete globally" -msgstr "" - -#: src/Object/Post.php:200 -msgid "Remove locally" -msgstr "" - -#: src/Object/Post.php:214 -msgid "save to folder" -msgstr "" - -#: src/Object/Post.php:249 -msgid "I will attend" -msgstr "" - -#: src/Object/Post.php:249 -msgid "I will not attend" -msgstr "" - -#: src/Object/Post.php:249 -msgid "I might attend" -msgstr "" - -#: src/Object/Post.php:277 -msgid "ignore thread" -msgstr "" - -#: src/Object/Post.php:278 -msgid "unignore thread" -msgstr "" - -#: src/Object/Post.php:279 -msgid "toggle ignore status" -msgstr "" - -#: src/Object/Post.php:290 -msgid "add star" -msgstr "" - -#: src/Object/Post.php:291 -msgid "remove star" -msgstr "" - -#: src/Object/Post.php:292 -msgid "toggle star status" -msgstr "" - -#: src/Object/Post.php:295 -msgid "starred" -msgstr "" - -#: src/Object/Post.php:299 -msgid "add tag" -msgstr "" - -#: src/Object/Post.php:310 -msgid "like" -msgstr "" - -#: src/Object/Post.php:311 -msgid "dislike" -msgstr "" - -#: src/Object/Post.php:314 -msgid "Share this" -msgstr "" - -#: src/Object/Post.php:314 -msgid "share" -msgstr "" - -#: src/Object/Post.php:385 -msgid "to" -msgstr "" - -#: src/Object/Post.php:386 -msgid "via" -msgstr "" - -#: src/Object/Post.php:387 -msgid "Wall-to-Wall" -msgstr "" - -#: src/Object/Post.php:388 -msgid "via Wall-To-Wall:" -msgstr "" - -#: src/Object/Post.php:421 -#, php-format -msgid "Reply to %s" -msgstr "" - -#: src/Object/Post.php:437 -msgid "Notifier task is pending" -msgstr "" - -#: src/Object/Post.php:438 -msgid "Delivery to remote servers is pending" -msgstr "" - -#: src/Object/Post.php:439 -msgid "Delivery to remote servers is underway" -msgstr "" - -#: src/Object/Post.php:440 -msgid "Delivery to remote servers is mostly done" -msgstr "" - -#: src/Object/Post.php:441 -msgid "Delivery to remote servers is done" -msgstr "" - -#: src/Object/Post.php:461 -#, php-format -msgid "%d comment" -msgid_plural "%d comments" -msgstr[0] "" -msgstr[1] "" - -#: src/Object/Post.php:462 -msgid "Show more" -msgstr "" - -#: src/Object/Post.php:463 -msgid "Show fewer" -msgstr "" - -#: src/App/Module.php:205 -msgid "You must be logged in to use addons. " -msgstr "" - -#: src/App/Page.php:229 +#: src/App/Page.php:228 msgid "Delete this item?" msgstr "" -#: src/App/Page.php:277 +#: src/App/Page.php:276 msgid "toggle mobile" msgstr "" -#: src/App/Router.php:180 +#: src/App/Router.php:184 #, php-format msgid "Method not allowed for this module. Allowed method(s): %s" msgstr "" -#: src/LegacyModule.php:30 +#: src/App/Module.php:221 +msgid "You must be logged in to use addons. " +msgstr "" + +#: src/Util/Temporal.php:79 src/Util/Temporal.php:81 mod/profiles.php:581 +msgid "Miscellaneous" +msgstr "" + +#: src/Util/Temporal.php:148 mod/profiles.php:604 +msgid "Age: " +msgstr "" + +#: src/Util/Temporal.php:150 +msgid "YYYY-MM-DD or MM-DD" +msgstr "" + +#: src/Util/Temporal.php:297 +msgid "never" +msgstr "" + +#: src/Util/Temporal.php:304 +msgid "less than a second ago" +msgstr "" + +#: src/Util/Temporal.php:312 +msgid "year" +msgstr "" + +#: src/Util/Temporal.php:312 +msgid "years" +msgstr "" + +#: src/Util/Temporal.php:313 +msgid "months" +msgstr "" + +#: src/Util/Temporal.php:314 +msgid "weeks" +msgstr "" + +#: src/Util/Temporal.php:315 +msgid "days" +msgstr "" + +#: src/Util/Temporal.php:316 +msgid "hour" +msgstr "" + +#: src/Util/Temporal.php:316 +msgid "hours" +msgstr "" + +#: src/Util/Temporal.php:317 +msgid "minute" +msgstr "" + +#: src/Util/Temporal.php:317 +msgid "minutes" +msgstr "" + +#: src/Util/Temporal.php:318 +msgid "second" +msgstr "" + +#: src/Util/Temporal.php:318 +msgid "seconds" +msgstr "" + +#: src/Util/Temporal.php:328 #, php-format -msgid "Legacy module file not found: %s" +msgid "in %1$d %2$s" msgstr "" -#: src/Console/ArchiveContact.php:86 +#: src/Util/Temporal.php:331 #, php-format -msgid "Could not find any unarchived contact entry for this URL (%s)" +msgid "%1$d %2$s ago" msgstr "" -#: src/Console/ArchiveContact.php:89 -msgid "The contact entries have been archived" -msgstr "" - -#: src/Console/NewPassword.php:93 -msgid "Enter new password: " +#: src/Worker/Delivery.php:532 +msgid "(no subject)" msgstr "" #: src/Console/PostUpdate.php:73 @@ -10730,22 +8126,2678 @@ msgstr "" msgid "All pending post updates are done." msgstr "" -#: src/App.php:519 -msgid "No system theme config value set." +#: src/Console/NewPassword.php:93 +msgid "Enter new password: " msgstr "" -#: src/BaseModule.php:134 +#: src/Console/NewPassword.php:101 mod/settings.php:443 +msgid "Password update failed. Please try again." +msgstr "" + +#: src/Console/NewPassword.php:104 mod/settings.php:446 +msgid "Password changed." +msgstr "" + +#: src/Console/ArchiveContact.php:86 +#, php-format +msgid "Could not find any unarchived contact entry for this URL (%s)" +msgstr "" + +#: src/Console/ArchiveContact.php:89 +msgid "The contact entries have been archived" +msgstr "" + +#: mod/lostpass.php:27 +msgid "No valid account found." +msgstr "" + +#: mod/lostpass.php:39 +msgid "Password reset request issued. Check your email." +msgstr "" + +#: mod/lostpass.php:45 +#, php-format msgid "" -"The form security token was not correct. This probably happened because the " -"form has been opened for too long (>3 hours) before submitting it." +"\n" +"\t\tDear %1$s,\n" +"\t\t\tA request was recently received at \"%2$s\" to reset your account\n" +"\t\tpassword. In order to confirm this request, please select the " +"verification link\n" +"\t\tbelow or paste it into your web browser address bar.\n" +"\n" +"\t\tIf you did NOT request this change, please DO NOT follow the link\n" +"\t\tprovided and ignore and/or delete this email, the request will expire " +"shortly.\n" +"\n" +"\t\tYour password will not be changed unless we can verify that you\n" +"\t\tissued this request." msgstr "" -#: update.php:218 +#: mod/lostpass.php:56 #, php-format -msgid "%s: Updating author-id and owner-id in item and thread table. " +msgid "" +"\n" +"\t\tFollow this link soon to verify your identity:\n" +"\n" +"\t\t%1$s\n" +"\n" +"\t\tYou will then receive a follow-up message containing the new password.\n" +"\t\tYou may change that password from your account settings page after " +"logging in.\n" +"\n" +"\t\tThe login details are as follows:\n" +"\n" +"\t\tSite Location:\t%2$s\n" +"\t\tLogin Name:\t%3$s" msgstr "" -#: update.php:273 +#: mod/lostpass.php:75 #, php-format -msgid "%s: Updating post-type." +msgid "Password reset requested at %s" +msgstr "" + +#: mod/lostpass.php:90 +msgid "" +"Request could not be verified. (You may have previously submitted it.) " +"Password reset failed." +msgstr "" + +#: mod/lostpass.php:103 +msgid "Request has expired, please make a new one." +msgstr "" + +#: mod/lostpass.php:118 +msgid "Forgot your Password?" +msgstr "" + +#: mod/lostpass.php:119 +msgid "" +"Enter your email address and submit to have your password reset. Then check " +"your email for further instructions." +msgstr "" + +#: mod/lostpass.php:121 +msgid "Reset" +msgstr "" + +#: mod/lostpass.php:137 +msgid "Your password has been reset as requested." +msgstr "" + +#: mod/lostpass.php:138 +msgid "Your new password is" +msgstr "" + +#: mod/lostpass.php:139 +msgid "Save or copy your new password - and then" +msgstr "" + +#: mod/lostpass.php:140 +msgid "click here to login" +msgstr "" + +#: mod/lostpass.php:141 +msgid "" +"Your password may be changed from the Settings page after " +"successful login." +msgstr "" + +#: mod/lostpass.php:148 +#, php-format +msgid "" +"\n" +"\t\t\tDear %1$s,\n" +"\t\t\t\tYour password has been changed as requested. Please retain this\n" +"\t\t\tinformation for your records (or change your password immediately to\n" +"\t\t\tsomething that you will remember).\n" +"\t\t" +msgstr "" + +#: mod/lostpass.php:154 +#, php-format +msgid "" +"\n" +"\t\t\tYour login details are as follows:\n" +"\n" +"\t\t\tSite Location:\t%1$s\n" +"\t\t\tLogin Name:\t%2$s\n" +"\t\t\tPassword:\t%3$s\n" +"\n" +"\t\t\tYou may change that password from your account settings page after " +"logging in.\n" +"\t\t" +msgstr "" + +#: mod/lostpass.php:170 +#, php-format +msgid "Your password has been changed at %s" +msgstr "" + +#: mod/update_contact.php:23 mod/update_profile.php:34 mod/update_notes.php:36 +#: mod/update_community.php:23 mod/update_display.php:24 +#: mod/update_network.php:33 +msgid "[Embedded content - reload page to view]" +msgstr "" + +#: mod/uimport.php:30 +msgid "User imports on closed servers can only be done by an administrator." +msgstr "" + +#: mod/uimport.php:48 +msgid "Move account" +msgstr "" + +#: mod/uimport.php:49 +msgid "You can import an account from another Friendica server." +msgstr "" + +#: mod/uimport.php:50 +msgid "" +"You need to export your account from the old server and upload it here. We " +"will recreate your old account here with all your contacts. We will try also " +"to inform your friends that you moved here." +msgstr "" + +#: mod/uimport.php:51 +msgid "" +"This feature is experimental. We can't import contacts from the OStatus " +"network (GNU Social/Statusnet) or from Diaspora" +msgstr "" + +#: mod/uimport.php:52 +msgid "Account file" +msgstr "" + +#: mod/uimport.php:52 +msgid "" +"To export your account, go to \"Settings->Export your personal data\" and " +"select \"Export account\"" +msgstr "" + +#: mod/community.php:68 +msgid "Community option not available." +msgstr "" + +#: mod/community.php:85 +msgid "Not available." +msgstr "" + +#: mod/community.php:95 +msgid "Local Community" +msgstr "" + +#: mod/community.php:98 +msgid "Posts from local users on this server" +msgstr "" + +#: mod/community.php:106 +msgid "Global Community" +msgstr "" + +#: mod/community.php:109 +msgid "Posts from users of the whole federated network" +msgstr "" + +#: mod/community.php:207 +msgid "" +"This community stream shows all public posts received by this node. They may " +"not reflect the opinions of this node’s users." +msgstr "" + +#: mod/fsuggest.php:44 +msgid "Suggested contact not found." +msgstr "" + +#: mod/fsuggest.php:57 +msgid "Friend suggestion sent." +msgstr "" + +#: mod/fsuggest.php:79 +msgid "Suggest Friends" +msgstr "" + +#: mod/fsuggest.php:81 +#, php-format +msgid "Suggest a friend for %s" +msgstr "" + +#: mod/common.php:90 +msgid "No contacts in common." +msgstr "" + +#: mod/ping.php:272 +msgid "{0} wants to be your friend" +msgstr "" + +#: mod/ping.php:288 +msgid "{0} requested registration" +msgstr "" + +#: mod/lockview.php:49 mod/lockview.php:60 +msgid "Remote privacy information not available." +msgstr "" + +#: mod/lockview.php:72 +msgid "Visible to:" +msgstr "" + +#: mod/events.php:121 mod/events.php:123 +msgid "Event can not end before it has started." +msgstr "" + +#: mod/events.php:130 mod/events.php:132 +msgid "Event title and start time are required." +msgstr "" + +#: mod/events.php:397 mod/cal.php:262 +msgid "View" +msgstr "" + +#: mod/events.php:398 +msgid "Create New Event" +msgstr "" + +#: mod/events.php:399 mod/cal.php:263 +msgid "Previous" +msgstr "" + +#: mod/events.php:409 mod/cal.php:271 +msgid "list" +msgstr "" + +#: mod/events.php:514 +msgid "Event details" +msgstr "" + +#: mod/events.php:515 +msgid "Starting date and Title are required." +msgstr "" + +#: mod/events.php:516 mod/events.php:521 +msgid "Event Starts:" +msgstr "" + +#: mod/events.php:516 mod/events.php:548 mod/profiles.php:592 +msgid "Required" +msgstr "" + +#: mod/events.php:529 mod/events.php:554 +msgid "Finish date/time is not known or not relevant" +msgstr "" + +#: mod/events.php:531 mod/events.php:536 +msgid "Event Finishes:" +msgstr "" + +#: mod/events.php:542 mod/events.php:555 +msgid "Adjust for viewer timezone" +msgstr "" + +#: mod/events.php:544 +msgid "Description:" +msgstr "" + +#: mod/events.php:548 mod/events.php:550 +msgid "Title:" +msgstr "" + +#: mod/events.php:551 mod/events.php:552 +msgid "Share this event" +msgstr "" + +#: mod/events.php:561 mod/photos.php:974 mod/photos.php:1348 +msgid "Permissions" +msgstr "" + +#: mod/events.php:577 +msgid "Failed to remove event" +msgstr "" + +#: mod/events.php:579 +msgid "Event removed" +msgstr "" + +#: mod/api.php:85 mod/api.php:107 +msgid "Authorize application connection" +msgstr "" + +#: mod/api.php:86 +msgid "Return to your app and insert this Securty Code:" +msgstr "" + +#: mod/api.php:109 +msgid "" +"Do you want to authorize this application to access your posts and contacts, " +"and/or create new posts for you?" +msgstr "" + +#: mod/dfrn_poll.php:127 mod/dfrn_poll.php:530 +#, php-format +msgid "%1$s welcomes %2$s" +msgstr "" + +#: mod/cal.php:300 +msgid "This calendar format is not supported" +msgstr "" + +#: mod/cal.php:302 +msgid "No exportable data found" +msgstr "" + +#: mod/cal.php:319 +msgid "calendar" +msgstr "" + +#: mod/display.php:224 mod/display.php:301 +msgid "The requested item doesn't exist or has been deleted." +msgstr "" + +#: mod/display.php:379 +msgid "The feed for this item is unavailable." +msgstr "" + +#: mod/dfrn_request.php:100 +msgid "This introduction has already been accepted." +msgstr "" + +#: mod/dfrn_request.php:118 mod/dfrn_request.php:356 +msgid "Profile location is not valid or does not contain profile information." +msgstr "" + +#: mod/dfrn_request.php:122 mod/dfrn_request.php:360 +msgid "Warning: profile location has no identifiable owner name." +msgstr "" + +#: mod/dfrn_request.php:125 mod/dfrn_request.php:363 +msgid "Warning: profile location has no profile photo." +msgstr "" + +#: mod/dfrn_request.php:129 mod/dfrn_request.php:367 +#, php-format +msgid "%d required parameter was not found at the given location" +msgid_plural "%d required parameters were not found at the given location" +msgstr[0] "" +msgstr[1] "" + +#: mod/dfrn_request.php:167 +msgid "Introduction complete." +msgstr "" + +#: mod/dfrn_request.php:203 +msgid "Unrecoverable protocol error." +msgstr "" + +#: mod/dfrn_request.php:230 +msgid "Profile unavailable." +msgstr "" + +#: mod/dfrn_request.php:251 +#, php-format +msgid "%s has received too many connection requests today." +msgstr "" + +#: mod/dfrn_request.php:252 +msgid "Spam protection measures have been invoked." +msgstr "" + +#: mod/dfrn_request.php:253 +msgid "Friends are advised to please try again in 24 hours." +msgstr "" + +#: mod/dfrn_request.php:277 +msgid "Invalid locator" +msgstr "" + +#: mod/dfrn_request.php:313 +msgid "You have already introduced yourself here." +msgstr "" + +#: mod/dfrn_request.php:316 +#, php-format +msgid "Apparently you are already friends with %s." +msgstr "" + +#: mod/dfrn_request.php:336 +msgid "Invalid profile URL." +msgstr "" + +#: mod/dfrn_request.php:435 +msgid "Your introduction has been sent." +msgstr "" + +#: mod/dfrn_request.php:473 +msgid "" +"Remote subscription can't be done for your network. Please subscribe " +"directly on your system." +msgstr "" + +#: mod/dfrn_request.php:489 +msgid "Please login to confirm introduction." +msgstr "" + +#: mod/dfrn_request.php:497 +msgid "" +"Incorrect identity currently logged in. Please login to this profile." +msgstr "" + +#: mod/dfrn_request.php:511 mod/dfrn_request.php:526 +msgid "Confirm" +msgstr "" + +#: mod/dfrn_request.php:522 +msgid "Hide this contact" +msgstr "" + +#: mod/dfrn_request.php:524 +#, php-format +msgid "Welcome home %s." +msgstr "" + +#: mod/dfrn_request.php:525 +#, php-format +msgid "Please confirm your introduction/connection request to %s." +msgstr "" + +#: mod/dfrn_request.php:634 +msgid "" +"Please enter your 'Identity Address' from one of the following supported " +"communications networks:" +msgstr "" + +#: mod/dfrn_request.php:636 +#, php-format +msgid "" +"If you are not yet a member of the free social web, follow " +"this link to find a public Friendica site and join us today." +msgstr "" + +#: mod/dfrn_request.php:639 +msgid "Friend/Connection Request" +msgstr "" + +#: mod/dfrn_request.php:640 +msgid "" +"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, " +"testuser@gnusocial.de" +msgstr "" + +#: mod/dfrn_request.php:641 mod/follow.php:162 +msgid "Please answer the following:" +msgstr "" + +#: mod/dfrn_request.php:642 mod/follow.php:163 +#, php-format +msgid "Does %s know you?" +msgstr "" + +#: mod/dfrn_request.php:643 mod/follow.php:164 +msgid "Add a personal note:" +msgstr "" + +#: mod/dfrn_request.php:645 +msgid "Friendica" +msgstr "" + +#: mod/dfrn_request.php:646 +msgid "GNU Social (Pleroma, Mastodon)" +msgstr "" + +#: mod/dfrn_request.php:647 +msgid "Diaspora (Socialhome, Hubzilla)" +msgstr "" + +#: mod/dfrn_request.php:648 +#, php-format +msgid "" +" - please do not use this form. Instead, enter %s into your Diaspora search " +"bar." +msgstr "" + +#: mod/dfrn_request.php:649 mod/follow.php:170 mod/unfollow.php:128 +msgid "Your Identity Address:" +msgstr "" + +#: mod/dfrn_request.php:651 mod/follow.php:76 mod/unfollow.php:131 +msgid "Submit Request" +msgstr "" + +#: mod/crepair.php:79 +msgid "Contact settings applied." +msgstr "" + +#: mod/crepair.php:81 +msgid "Contact update failed." +msgstr "" + +#: mod/crepair.php:115 +msgid "" +"WARNING: This is highly advanced and if you enter incorrect " +"information your communications with this contact may stop working." +msgstr "" + +#: mod/crepair.php:116 +msgid "" +"Please use your browser 'Back' button now if you are " +"uncertain what to do on this page." +msgstr "" + +#: mod/crepair.php:130 mod/crepair.php:132 +msgid "No mirroring" +msgstr "" + +#: mod/crepair.php:130 +msgid "Mirror as forwarded posting" +msgstr "" + +#: mod/crepair.php:130 mod/crepair.php:132 +msgid "Mirror as my own posting" +msgstr "" + +#: mod/crepair.php:145 +msgid "Return to contact editor" +msgstr "" + +#: mod/crepair.php:147 +msgid "Refetch contact data" +msgstr "" + +#: mod/crepair.php:150 +msgid "Remote Self" +msgstr "" + +#: mod/crepair.php:153 +msgid "Mirror postings from this contact" +msgstr "" + +#: mod/crepair.php:155 +msgid "" +"Mark this contact as remote_self, this will cause friendica to repost new " +"entries from this contact." +msgstr "" + +#: mod/crepair.php:160 +msgid "Account Nickname" +msgstr "" + +#: mod/crepair.php:161 +msgid "@Tagname - overrides Name/Nickname" +msgstr "" + +#: mod/crepair.php:162 +msgid "Account URL" +msgstr "" + +#: mod/crepair.php:163 +msgid "Account URL Alias" +msgstr "" + +#: mod/crepair.php:164 +msgid "Friend Request URL" +msgstr "" + +#: mod/crepair.php:165 +msgid "Friend Confirm URL" +msgstr "" + +#: mod/crepair.php:166 +msgid "Notification Endpoint URL" +msgstr "" + +#: mod/crepair.php:167 +msgid "Poll/Feed URL" +msgstr "" + +#: mod/crepair.php:168 +msgid "New photo from this URL" +msgstr "" + +#: mod/openid.php:32 +msgid "OpenID protocol error. No ID returned." +msgstr "" + +#: mod/openid.php:71 +msgid "" +"Account not found. Please login to your existing account to add the OpenID " +"to it." +msgstr "" + +#: mod/openid.php:73 +msgid "" +"Account not found. Please register a new account or login to your existing " +"account to add the OpenID to it." +msgstr "" + +#: mod/notifications.php:39 +msgid "Invalid request identifier." +msgstr "" + +#: mod/notifications.php:48 mod/notifications.php:202 mod/notifications.php:258 +#: mod/message.php:110 +msgid "Discard" +msgstr "" + +#: mod/notifications.php:119 +msgid "Network Notifications" +msgstr "" + +#: mod/notifications.php:124 +msgid "System Notifications" +msgstr "" + +#: mod/notifications.php:129 +msgid "Personal Notifications" +msgstr "" + +#: mod/notifications.php:134 +msgid "Home Notifications" +msgstr "" + +#: mod/notifications.php:157 +msgid "Show unread" +msgstr "" + +#: mod/notifications.php:157 +msgid "Show all" +msgstr "" + +#: mod/notifications.php:168 +msgid "Show Ignored Requests" +msgstr "" + +#: mod/notifications.php:168 +msgid "Hide Ignored Requests" +msgstr "" + +#: mod/notifications.php:181 mod/notifications.php:266 +msgid "Notification type:" +msgstr "" + +#: mod/notifications.php:184 +msgid "Suggested by:" +msgstr "" + +#: mod/notifications.php:218 +msgid "Claims to be known to you: " +msgstr "" + +#: mod/notifications.php:219 +msgid "yes" +msgstr "" + +#: mod/notifications.php:219 +msgid "no" +msgstr "" + +#: mod/notifications.php:220 mod/notifications.php:224 +msgid "Shall your connection be bidirectional or not?" +msgstr "" + +#: mod/notifications.php:221 mod/notifications.php:225 +#, php-format +msgid "" +"Accepting %s as a friend allows %s to subscribe to your posts, and you will " +"also receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:222 +#, php-format +msgid "" +"Accepting %s as a subscriber allows them to subscribe to your posts, but you " +"will not receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:226 +#, php-format +msgid "" +"Accepting %s as a sharer allows them to subscribe to your posts, but you " +"will not receive updates from them in your news feed." +msgstr "" + +#: mod/notifications.php:237 +msgid "Friend" +msgstr "" + +#: mod/notifications.php:238 +msgid "Sharer" +msgstr "" + +#: mod/notifications.php:238 +msgid "Subscriber" +msgstr "" + +#: mod/notifications.php:303 +msgid "No introductions." +msgstr "" + +#: mod/notifications.php:337 +#, php-format +msgid "No more %s notifications." +msgstr "" + +#: mod/wallmessage.php:52 mod/wallmessage.php:115 +#, php-format +msgid "Number of daily wall messages for %s exceeded. Message failed." +msgstr "" + +#: mod/wallmessage.php:60 mod/message.php:70 +msgid "No recipient selected." +msgstr "" + +#: mod/wallmessage.php:63 +msgid "Unable to check your home location." +msgstr "" + +#: mod/wallmessage.php:66 mod/message.php:77 +msgid "Message could not be sent." +msgstr "" + +#: mod/wallmessage.php:69 mod/message.php:80 +msgid "Message collection failure." +msgstr "" + +#: mod/wallmessage.php:72 mod/message.php:83 +msgid "Message sent." +msgstr "" + +#: mod/wallmessage.php:89 mod/wallmessage.php:98 +msgid "No recipient." +msgstr "" + +#: mod/wallmessage.php:123 mod/message.php:204 mod/message.php:360 +msgid "Please enter a link URL:" +msgstr "" + +#: mod/wallmessage.php:128 mod/message.php:246 +msgid "Send Private Message" +msgstr "" + +#: mod/wallmessage.php:129 +#, php-format +msgid "" +"If you wish for %s to respond, please check that the privacy settings on " +"your site allow private mail from unknown senders." +msgstr "" + +#: mod/wallmessage.php:130 mod/message.php:247 mod/message.php:430 +msgid "To:" +msgstr "" + +#: mod/wallmessage.php:131 mod/message.php:251 mod/message.php:432 +msgid "Subject:" +msgstr "" + +#: mod/wallmessage.php:140 mod/editpost.php:77 mod/message.php:259 +#: mod/message.php:440 +msgid "Insert web link" +msgstr "" + +#: mod/ostatus_subscribe.php:23 +msgid "Subscribing to OStatus contacts" +msgstr "" + +#: mod/ostatus_subscribe.php:35 +msgid "No contact provided." +msgstr "" + +#: mod/ostatus_subscribe.php:42 +msgid "Couldn't fetch information for contact." +msgstr "" + +#: mod/ostatus_subscribe.php:52 +msgid "Couldn't fetch friends for contact." +msgstr "" + +#: mod/ostatus_subscribe.php:70 mod/repair_ostatus.php:52 +msgid "Done" +msgstr "" + +#: mod/ostatus_subscribe.php:84 +msgid "success" +msgstr "" + +#: mod/ostatus_subscribe.php:86 +msgid "failed" +msgstr "" + +#: mod/ostatus_subscribe.php:94 mod/repair_ostatus.php:58 +msgid "Keep this window open until done." +msgstr "" + +#: mod/follow.php:46 +msgid "The contact could not be added." +msgstr "" + +#: mod/follow.php:87 +msgid "You already added this contact." +msgstr "" + +#: mod/follow.php:99 +msgid "Diaspora support isn't enabled. Contact can't be added." +msgstr "" + +#: mod/follow.php:106 +msgid "OStatus support is disabled. Contact can't be added." +msgstr "" + +#: mod/follow.php:113 +msgid "The network type couldn't be detected. Contact can't be added." +msgstr "" + +#: mod/fbrowser.php:112 mod/fbrowser.php:141 mod/profile_photo.php:247 +msgid "Upload" +msgstr "" + +#: mod/fbrowser.php:136 +msgid "Files" +msgstr "" + +#: mod/network.php:525 +#, php-format +msgid "" +"Warning: This group contains %s member from a network that doesn't allow non " +"public messages." +msgid_plural "" +"Warning: This group contains %s members from a network that doesn't allow " +"non public messages." +msgstr[0] "" +msgstr[1] "" + +#: mod/network.php:528 +msgid "Messages in this group won't be send to these receivers." +msgstr "" + +#: mod/network.php:595 +msgid "No such group" +msgstr "" + +#: mod/network.php:620 +#, php-format +msgid "Group: %s" +msgstr "" + +#: mod/network.php:646 +msgid "Private messages to this person are at risk of public disclosure." +msgstr "" + +#: mod/network.php:928 +msgid "Latest Activity" +msgstr "" + +#: mod/network.php:931 +msgid "Sort by latest activity" +msgstr "" + +#: mod/network.php:936 +msgid "Latest Posts" +msgstr "" + +#: mod/network.php:939 +msgid "Sort by post received date" +msgstr "" + +#: mod/network.php:946 mod/profiles.php:579 +msgid "Personal" +msgstr "" + +#: mod/network.php:949 +msgid "Posts that mention or involve you" +msgstr "" + +#: mod/network.php:956 +msgid "New" +msgstr "" + +#: mod/network.php:959 +msgid "Activity Stream - by date" +msgstr "" + +#: mod/network.php:967 +msgid "Shared Links" +msgstr "" + +#: mod/network.php:970 +msgid "Interesting Links" +msgstr "" + +#: mod/network.php:977 +msgid "Starred" +msgstr "" + +#: mod/network.php:980 +msgid "Favourite Posts" +msgstr "" + +#: mod/unfollow.php:36 mod/unfollow.php:92 +msgid "You aren't following this contact." +msgstr "" + +#: mod/unfollow.php:46 mod/unfollow.php:98 +msgid "Unfollowing is currently not supported by your network." +msgstr "" + +#: mod/unfollow.php:67 +msgid "Contact unfollowed" +msgstr "" + +#: mod/unfollow.php:118 +msgid "Disconnect/Unfollow" +msgstr "" + +#: mod/profile_photo.php:58 +msgid "Image uploaded but image cropping failed." +msgstr "" + +#: mod/profile_photo.php:88 mod/profile_photo.php:97 mod/profile_photo.php:106 +#: mod/profile_photo.php:311 +#, php-format +msgid "Image size reduction [%s] failed." +msgstr "" + +#: mod/profile_photo.php:125 +msgid "" +"Shift-reload the page or clear browser cache if the new photo does not " +"display immediately." +msgstr "" + +#: mod/profile_photo.php:133 +msgid "Unable to process image" +msgstr "" + +#: mod/profile_photo.php:152 mod/photos.php:674 mod/photos.php:677 +#: mod/photos.php:706 mod/wall_upload.php:186 +#, php-format +msgid "Image exceeds size limit of %s" +msgstr "" + +#: mod/profile_photo.php:161 mod/photos.php:729 mod/wall_upload.php:200 +msgid "Unable to process image." +msgstr "" + +#: mod/profile_photo.php:244 +msgid "Upload File:" +msgstr "" + +#: mod/profile_photo.php:245 +msgid "Select a profile:" +msgstr "" + +#: mod/profile_photo.php:250 +msgid "or" +msgstr "" + +#: mod/profile_photo.php:251 +msgid "skip this step" +msgstr "" + +#: mod/profile_photo.php:251 +msgid "select a photo from your photo albums" +msgstr "" + +#: mod/profile_photo.php:264 +msgid "Crop Image" +msgstr "" + +#: mod/profile_photo.php:265 +msgid "Please adjust the image cropping for optimum viewing." +msgstr "" + +#: mod/profile_photo.php:267 +msgid "Done Editing" +msgstr "" + +#: mod/profile_photo.php:301 +msgid "Image uploaded successfully." +msgstr "" + +#: mod/profile_photo.php:303 mod/photos.php:758 mod/wall_upload.php:239 +msgid "Image upload failed." +msgstr "" + +#: mod/poke.php:178 +msgid "Poke/Prod" +msgstr "" + +#: mod/poke.php:179 +msgid "poke, prod or do other things to somebody" +msgstr "" + +#: mod/poke.php:180 +msgid "Recipient" +msgstr "" + +#: mod/poke.php:181 +msgid "Choose what you wish to do to recipient" +msgstr "" + +#: mod/poke.php:184 +msgid "Make this post private" +msgstr "" + +#: mod/photos.php:113 mod/photos.php:1609 +msgid "Recent Photos" +msgstr "" + +#: mod/photos.php:115 mod/photos.php:1117 mod/photos.php:1611 +msgid "Upload New Photos" +msgstr "" + +#: mod/photos.php:170 +msgid "Contact information unavailable" +msgstr "" + +#: mod/photos.php:192 +msgid "Album not found." +msgstr "" + +#: mod/photos.php:250 +msgid "Album successfully deleted" +msgstr "" + +#: mod/photos.php:252 +msgid "Album was empty." +msgstr "" + +#: mod/photos.php:578 +msgid "a photo" +msgstr "" + +#: mod/photos.php:578 +#, php-format +msgid "%1$s was tagged in %2$s by %3$s" +msgstr "" + +#: mod/photos.php:680 +msgid "Image upload didn't complete, please try again" +msgstr "" + +#: mod/photos.php:683 +msgid "Image file is missing" +msgstr "" + +#: mod/photos.php:688 +msgid "" +"Server can't accept new file upload at this time, please contact your " +"administrator" +msgstr "" + +#: mod/photos.php:714 +msgid "Image file is empty." +msgstr "" + +#: mod/photos.php:846 +msgid "No photos selected" +msgstr "" + +#: mod/photos.php:912 mod/videos.php:168 +msgid "Access to this item is restricted." +msgstr "" + +#: mod/photos.php:966 +msgid "Upload Photos" +msgstr "" + +#: mod/photos.php:970 mod/photos.php:1062 +msgid "New album name: " +msgstr "" + +#: mod/photos.php:971 +msgid "or select existing album:" +msgstr "" + +#: mod/photos.php:972 +msgid "Do not show a status post for this upload" +msgstr "" + +#: mod/photos.php:988 mod/photos.php:1356 mod/settings.php:1215 +msgid "Show to Groups" +msgstr "" + +#: mod/photos.php:989 mod/photos.php:1357 mod/settings.php:1216 +msgid "Show to Contacts" +msgstr "" + +#: mod/photos.php:1044 +msgid "Do you really want to delete this photo album and all its photos?" +msgstr "" + +#: mod/photos.php:1046 mod/photos.php:1067 +msgid "Delete Album" +msgstr "" + +#: mod/photos.php:1073 +msgid "Edit Album" +msgstr "" + +#: mod/photos.php:1074 +msgid "Drop Album" +msgstr "" + +#: mod/photos.php:1079 +msgid "Show Newest First" +msgstr "" + +#: mod/photos.php:1081 +msgid "Show Oldest First" +msgstr "" + +#: mod/photos.php:1102 mod/photos.php:1594 +msgid "View Photo" +msgstr "" + +#: mod/photos.php:1139 +msgid "Permission denied. Access to this item may be restricted." +msgstr "" + +#: mod/photos.php:1141 +msgid "Photo not available" +msgstr "" + +#: mod/photos.php:1151 +msgid "Do you really want to delete this photo?" +msgstr "" + +#: mod/photos.php:1153 mod/photos.php:1353 +msgid "Delete Photo" +msgstr "" + +#: mod/photos.php:1244 +msgid "View photo" +msgstr "" + +#: mod/photos.php:1246 +msgid "Edit photo" +msgstr "" + +#: mod/photos.php:1247 +msgid "Delete photo" +msgstr "" + +#: mod/photos.php:1248 +msgid "Use as profile photo" +msgstr "" + +#: mod/photos.php:1255 +msgid "Private Photo" +msgstr "" + +#: mod/photos.php:1261 +msgid "View Full Size" +msgstr "" + +#: mod/photos.php:1321 +msgid "Tags: " +msgstr "" + +#: mod/photos.php:1324 +msgid "[Select tags to remove]" +msgstr "" + +#: mod/photos.php:1339 +msgid "New album name" +msgstr "" + +#: mod/photos.php:1340 +msgid "Caption" +msgstr "" + +#: mod/photos.php:1341 +msgid "Add a Tag" +msgstr "" + +#: mod/photos.php:1341 +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping" +msgstr "" + +#: mod/photos.php:1342 +msgid "Do not rotate" +msgstr "" + +#: mod/photos.php:1343 +msgid "Rotate CW (right)" +msgstr "" + +#: mod/photos.php:1344 +msgid "Rotate CCW (left)" +msgstr "" + +#: mod/photos.php:1529 +msgid "Map" +msgstr "" + +#: mod/photos.php:1600 mod/videos.php:245 +msgid "View Album" +msgstr "" + +#: mod/profiles.php:43 mod/profiles.php:152 mod/profiles.php:196 +#: mod/profiles.php:511 mod/dfrn_confirm.php:71 +msgid "Profile not found." +msgstr "" + +#: mod/profiles.php:62 +msgid "Profile deleted." +msgstr "" + +#: mod/profiles.php:78 mod/profiles.php:114 +msgid "Profile-" +msgstr "" + +#: mod/profiles.php:97 mod/profiles.php:135 +msgid "New profile created." +msgstr "" + +#: mod/profiles.php:120 +msgid "Profile unavailable to clone." +msgstr "" + +#: mod/profiles.php:206 +msgid "Profile Name is required." +msgstr "" + +#: mod/profiles.php:346 +msgid "Marital Status" +msgstr "" + +#: mod/profiles.php:349 +msgid "Romantic Partner" +msgstr "" + +#: mod/profiles.php:358 +msgid "Work/Employment" +msgstr "" + +#: mod/profiles.php:361 +msgid "Religion" +msgstr "" + +#: mod/profiles.php:364 +msgid "Political Views" +msgstr "" + +#: mod/profiles.php:367 +msgid "Gender" +msgstr "" + +#: mod/profiles.php:370 +msgid "Sexual Preference" +msgstr "" + +#: mod/profiles.php:373 +msgid "XMPP" +msgstr "" + +#: mod/profiles.php:376 +msgid "Homepage" +msgstr "" + +#: mod/profiles.php:379 mod/profiles.php:578 +msgid "Interests" +msgstr "" + +#: mod/profiles.php:382 +msgid "Address" +msgstr "" + +#: mod/profiles.php:389 mod/profiles.php:574 +msgid "Location" +msgstr "" + +#: mod/profiles.php:469 +msgid "Profile updated." +msgstr "" + +#: mod/profiles.php:523 +msgid "Hide contacts and friends:" +msgstr "" + +#: mod/profiles.php:528 +msgid "Hide your contact/friend list from viewers of this profile?" +msgstr "" + +#: mod/profiles.php:548 +msgid "Show more profile fields:" +msgstr "" + +#: mod/profiles.php:560 +msgid "Profile Actions" +msgstr "" + +#: mod/profiles.php:561 +msgid "Edit Profile Details" +msgstr "" + +#: mod/profiles.php:563 +msgid "Change Profile Photo" +msgstr "" + +#: mod/profiles.php:565 +msgid "View this profile" +msgstr "" + +#: mod/profiles.php:566 +msgid "View all profiles" +msgstr "" + +#: mod/profiles.php:568 +msgid "Create a new profile using these settings" +msgstr "" + +#: mod/profiles.php:569 +msgid "Clone this profile" +msgstr "" + +#: mod/profiles.php:570 +msgid "Delete this profile" +msgstr "" + +#: mod/profiles.php:572 +msgid "Basic information" +msgstr "" + +#: mod/profiles.php:573 +msgid "Profile picture" +msgstr "" + +#: mod/profiles.php:575 +msgid "Preferences" +msgstr "" + +#: mod/profiles.php:576 +msgid "Status information" +msgstr "" + +#: mod/profiles.php:577 +msgid "Additional information" +msgstr "" + +#: mod/profiles.php:580 +msgid "Relation" +msgstr "" + +#: mod/profiles.php:584 +msgid "Your Gender:" +msgstr "" + +#: mod/profiles.php:585 +msgid " Marital Status:" +msgstr "" + +#: mod/profiles.php:587 +msgid "Example: fishing photography software" +msgstr "" + +#: mod/profiles.php:592 +msgid "Profile Name:" +msgstr "" + +#: mod/profiles.php:594 +msgid "" +"This is your public profile.
It may " +"be visible to anybody using the internet." +msgstr "" + +#: mod/profiles.php:595 +msgid "Your Full Name:" +msgstr "" + +#: mod/profiles.php:596 +msgid "Title/Description:" +msgstr "" + +#: mod/profiles.php:599 +msgid "Street Address:" +msgstr "" + +#: mod/profiles.php:600 +msgid "Locality/City:" +msgstr "" + +#: mod/profiles.php:601 +msgid "Region/State:" +msgstr "" + +#: mod/profiles.php:602 +msgid "Postal/Zip Code:" +msgstr "" + +#: mod/profiles.php:603 +msgid "Country:" +msgstr "" + +#: mod/profiles.php:607 +msgid "Who: (if applicable)" +msgstr "" + +#: mod/profiles.php:607 +msgid "Examples: cathy123, Cathy Williams, cathy@example.com" +msgstr "" + +#: mod/profiles.php:608 +msgid "Since [date]:" +msgstr "" + +#: mod/profiles.php:610 +msgid "Tell us about yourself..." +msgstr "" + +#: mod/profiles.php:611 +msgid "XMPP (Jabber) address:" +msgstr "" + +#: mod/profiles.php:611 +msgid "" +"The XMPP address will be propagated to your contacts so that they can follow " +"you." +msgstr "" + +#: mod/profiles.php:612 +msgid "Homepage URL:" +msgstr "" + +#: mod/profiles.php:615 +msgid "Religious Views:" +msgstr "" + +#: mod/profiles.php:616 +msgid "Public Keywords:" +msgstr "" + +#: mod/profiles.php:616 +msgid "(Used for suggesting potential friends, can be seen by others)" +msgstr "" + +#: mod/profiles.php:617 +msgid "Private Keywords:" +msgstr "" + +#: mod/profiles.php:617 +msgid "(Used for searching profiles, never shown to others)" +msgstr "" + +#: mod/profiles.php:620 +msgid "Musical interests" +msgstr "" + +#: mod/profiles.php:621 +msgid "Books, literature" +msgstr "" + +#: mod/profiles.php:622 +msgid "Television" +msgstr "" + +#: mod/profiles.php:623 +msgid "Film/dance/culture/entertainment" +msgstr "" + +#: mod/profiles.php:624 +msgid "Hobbies/Interests" +msgstr "" + +#: mod/profiles.php:625 +msgid "Love/romance" +msgstr "" + +#: mod/profiles.php:626 +msgid "Work/employment" +msgstr "" + +#: mod/profiles.php:627 +msgid "School/education" +msgstr "" + +#: mod/profiles.php:628 +msgid "Contact information and Social Networks" +msgstr "" + +#: mod/profiles.php:668 +msgid "Edit/Manage Profiles" +msgstr "" + +#: mod/wall_attach.php:27 mod/wall_attach.php:34 mod/wall_attach.php:72 +#: mod/wall_upload.php:43 mod/wall_upload.php:59 mod/wall_upload.php:104 +#: mod/wall_upload.php:155 mod/wall_upload.php:158 +msgid "Invalid request." +msgstr "" + +#: mod/wall_attach.php:90 +msgid "Sorry, maybe your upload is bigger than the PHP configuration allows" +msgstr "" + +#: mod/wall_attach.php:90 +msgid "Or - did you try to upload an empty file?" +msgstr "" + +#: mod/wall_attach.php:101 +#, php-format +msgid "File exceeds size limit of %s" +msgstr "" + +#: mod/wall_attach.php:116 +msgid "File upload failed." +msgstr "" + +#: mod/item.php:127 +msgid "Unable to locate original post." +msgstr "" + +#: mod/item.php:330 +msgid "Empty post discarded." +msgstr "" + +#: mod/item.php:804 +#, php-format +msgid "" +"This message was sent to you by %s, a member of the Friendica social network." +msgstr "" + +#: mod/item.php:806 +#, php-format +msgid "You may visit them online at %s" +msgstr "" + +#: mod/item.php:807 +msgid "" +"Please contact the sender by replying to this post if you do not wish to " +"receive these messages." +msgstr "" + +#: mod/item.php:811 +#, php-format +msgid "%s posted an update." +msgstr "" + +#: mod/oexchange.php:32 +msgid "Post successful." +msgstr "" + +#: mod/regmod.php:53 +msgid "Account approved." +msgstr "" + +#: mod/regmod.php:77 +#, php-format +msgid "Registration revoked for %s" +msgstr "" + +#: mod/regmod.php:84 +msgid "Please login." +msgstr "" + +#: mod/match.php:49 +msgid "No keywords to match. Please add keywords to your default profile." +msgstr "" + +#: mod/match.php:135 +msgid "Profile Match" +msgstr "" + +#: mod/settings.php:192 +msgid "Missing some important data!" +msgstr "" + +#: mod/settings.php:302 +msgid "Failed to connect with email account using the settings provided." +msgstr "" + +#: mod/settings.php:307 +msgid "Email settings updated." +msgstr "" + +#: mod/settings.php:323 +msgid "Features updated" +msgstr "" + +#: mod/settings.php:384 +msgid "The theme you chose isn't available." +msgstr "" + +#: mod/settings.php:400 +msgid "Contact CSV file upload error" +msgstr "" + +#: mod/settings.php:414 +msgid "Importing Contacts done" +msgstr "" + +#: mod/settings.php:423 +msgid "Relocate message has been send to your contacts" +msgstr "" + +#: mod/settings.php:435 +msgid "Passwords do not match." +msgstr "" + +#: mod/settings.php:449 +msgid "Password unchanged." +msgstr "" + +#: mod/settings.php:531 +msgid " Please use a shorter name." +msgstr "" + +#: mod/settings.php:534 +msgid " Name too short." +msgstr "" + +#: mod/settings.php:546 +msgid "Invalid email." +msgstr "" + +#: mod/settings.php:552 +msgid "Cannot change to that email." +msgstr "" + +#: mod/settings.php:590 +msgid "Private forum has no privacy permissions. Using default privacy group." +msgstr "" + +#: mod/settings.php:593 +msgid "Private forum has no privacy permissions and no default privacy group." +msgstr "" + +#: mod/settings.php:610 +msgid "Settings updated." +msgstr "" + +#: mod/settings.php:669 mod/settings.php:695 mod/settings.php:729 +msgid "Add application" +msgstr "" + +#: mod/settings.php:673 mod/settings.php:699 +msgid "Consumer Key" +msgstr "" + +#: mod/settings.php:674 mod/settings.php:700 +msgid "Consumer Secret" +msgstr "" + +#: mod/settings.php:675 mod/settings.php:701 +msgid "Redirect" +msgstr "" + +#: mod/settings.php:676 mod/settings.php:702 +msgid "Icon url" +msgstr "" + +#: mod/settings.php:687 +msgid "You can't edit this application." +msgstr "" + +#: mod/settings.php:728 +msgid "Connected Apps" +msgstr "" + +#: mod/settings.php:732 +msgid "Client key starts with" +msgstr "" + +#: mod/settings.php:733 +msgid "No name" +msgstr "" + +#: mod/settings.php:734 +msgid "Remove authorization" +msgstr "" + +#: mod/settings.php:745 +msgid "No Addon settings configured" +msgstr "" + +#: mod/settings.php:754 +msgid "Addon Settings" +msgstr "" + +#: mod/settings.php:775 +msgid "Additional Features" +msgstr "" + +#: mod/settings.php:800 mod/settings.php:801 +msgid "enabled" +msgstr "" + +#: mod/settings.php:800 mod/settings.php:801 +msgid "disabled" +msgstr "" + +#: mod/settings.php:800 mod/settings.php:801 +#, php-format +msgid "Built-in support for %s connectivity is %s" +msgstr "" + +#: mod/settings.php:801 +msgid "GNU Social (OStatus)" +msgstr "" + +#: mod/settings.php:832 +msgid "Email access is disabled on this site." +msgstr "" + +#: mod/settings.php:837 mod/settings.php:873 +msgid "None" +msgstr "" + +#: mod/settings.php:848 +msgid "General Social Media Settings" +msgstr "" + +#: mod/settings.php:849 +msgid "Accept only top level posts by contacts you follow" +msgstr "" + +#: mod/settings.php:849 +msgid "" +"The system does an auto completion of threads when a comment arrives. This " +"has got the side effect that you can receive posts that had been started by " +"a non-follower but had been commented by someone you follow. This setting " +"deactivates this behaviour. When activated, you strictly only will receive " +"posts from people you really do follow." +msgstr "" + +#: mod/settings.php:850 +msgid "Disable Content Warning" +msgstr "" + +#: mod/settings.php:850 +msgid "" +"Users on networks like Mastodon or Pleroma are able to set a content warning " +"field which collapse their post by default. This disables the automatic " +"collapsing and sets the content warning as the post title. Doesn't affect " +"any other content filtering you eventually set up." +msgstr "" + +#: mod/settings.php:851 +msgid "Disable intelligent shortening" +msgstr "" + +#: mod/settings.php:851 +msgid "" +"Normally the system tries to find the best link to add to shortened posts. " +"If this option is enabled then every shortened post will always point to the " +"original friendica post." +msgstr "" + +#: mod/settings.php:852 +msgid "Attach the link title" +msgstr "" + +#: mod/settings.php:852 +msgid "" +"When activated, the title of the attached link will be added as a title on " +"posts to Diaspora. This is mostly helpful with \"remote-self\" contacts that " +"share feed content." +msgstr "" + +#: mod/settings.php:853 +msgid "Automatically follow any GNU Social (OStatus) followers/mentioners" +msgstr "" + +#: mod/settings.php:853 +msgid "" +"If you receive a message from an unknown OStatus user, this option decides " +"what to do. If it is checked, a new contact will be created for every " +"unknown user." +msgstr "" + +#: mod/settings.php:854 +msgid "Default group for OStatus contacts" +msgstr "" + +#: mod/settings.php:855 +msgid "Your legacy GNU Social account" +msgstr "" + +#: mod/settings.php:855 +msgid "" +"If you enter your old GNU Social/Statusnet account name here (in the format " +"user@domain.tld), your contacts will be added automatically. The field will " +"be emptied when done." +msgstr "" + +#: mod/settings.php:858 +msgid "Repair OStatus subscriptions" +msgstr "" + +#: mod/settings.php:862 +msgid "Email/Mailbox Setup" +msgstr "" + +#: mod/settings.php:863 +msgid "" +"If you wish to communicate with email contacts using this service " +"(optional), please specify how to connect to your mailbox." +msgstr "" + +#: mod/settings.php:864 +msgid "Last successful email check:" +msgstr "" + +#: mod/settings.php:866 +msgid "IMAP server name:" +msgstr "" + +#: mod/settings.php:867 +msgid "IMAP port:" +msgstr "" + +#: mod/settings.php:868 +msgid "Security:" +msgstr "" + +#: mod/settings.php:869 +msgid "Email login name:" +msgstr "" + +#: mod/settings.php:870 +msgid "Email password:" +msgstr "" + +#: mod/settings.php:871 +msgid "Reply-to address:" +msgstr "" + +#: mod/settings.php:872 +msgid "Send public posts to all email contacts:" +msgstr "" + +#: mod/settings.php:873 +msgid "Action after import:" +msgstr "" + +#: mod/settings.php:873 +msgid "Move to folder" +msgstr "" + +#: mod/settings.php:874 +msgid "Move to folder:" +msgstr "" + +#: mod/settings.php:906 +#, php-format +msgid "%s - (Unsupported)" +msgstr "" + +#: mod/settings.php:952 +msgid "Display Settings" +msgstr "" + +#: mod/settings.php:958 +msgid "Display Theme:" +msgstr "" + +#: mod/settings.php:959 +msgid "Mobile Theme:" +msgstr "" + +#: mod/settings.php:960 +msgid "Suppress warning of insecure networks" +msgstr "" + +#: mod/settings.php:960 +msgid "" +"Should the system suppress the warning that the current group contains " +"members of networks that can't receive non public postings." +msgstr "" + +#: mod/settings.php:961 +msgid "Update browser every xx seconds" +msgstr "" + +#: mod/settings.php:961 +msgid "Minimum of 10 seconds. Enter -1 to disable it." +msgstr "" + +#: mod/settings.php:962 +msgid "Number of items to display per page:" +msgstr "" + +#: mod/settings.php:962 mod/settings.php:963 +msgid "Maximum of 100 items" +msgstr "" + +#: mod/settings.php:963 +msgid "Number of items to display per page when viewed from mobile device:" +msgstr "" + +#: mod/settings.php:964 +msgid "Don't show emoticons" +msgstr "" + +#: mod/settings.php:965 +msgid "Calendar" +msgstr "" + +#: mod/settings.php:966 +msgid "Beginning of week:" +msgstr "" + +#: mod/settings.php:967 +msgid "Don't show notices" +msgstr "" + +#: mod/settings.php:968 +msgid "Infinite scroll" +msgstr "" + +#: mod/settings.php:969 +msgid "Automatic updates only at the top of the network page" +msgstr "" + +#: mod/settings.php:969 +msgid "" +"When disabled, the network page is updated all the time, which could be " +"confusing while reading." +msgstr "" + +#: mod/settings.php:970 +msgid "Bandwidth Saver Mode" +msgstr "" + +#: mod/settings.php:970 +msgid "" +"When enabled, embedded content is not displayed on automatic updates, they " +"only show on page reload." +msgstr "" + +#: mod/settings.php:971 +msgid "Disable Smart Threading" +msgstr "" + +#: mod/settings.php:971 +msgid "Disable the automatic suppression of extraneous thread indentation." +msgstr "" + +#: mod/settings.php:973 +msgid "General Theme Settings" +msgstr "" + +#: mod/settings.php:974 +msgid "Custom Theme Settings" +msgstr "" + +#: mod/settings.php:975 +msgid "Content Settings" +msgstr "" + +#: mod/settings.php:990 +msgid "Unable to find your profile. Please contact your admin." +msgstr "" + +#: mod/settings.php:1029 +msgid "Account Types" +msgstr "" + +#: mod/settings.php:1030 +msgid "Personal Page Subtypes" +msgstr "" + +#: mod/settings.php:1031 +msgid "Community Forum Subtypes" +msgstr "" + +#: mod/settings.php:1039 +msgid "Account for a personal profile." +msgstr "" + +#: mod/settings.php:1043 +msgid "" +"Account for an organisation that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1047 +msgid "" +"Account for a news reflector that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1051 +msgid "Account for community discussions." +msgstr "" + +#: mod/settings.php:1055 +msgid "" +"Account for a regular personal profile that requires manual approval of " +"\"Friends\" and \"Followers\"." +msgstr "" + +#: mod/settings.php:1059 +msgid "" +"Account for a public profile that automatically approves contact requests as " +"\"Followers\"." +msgstr "" + +#: mod/settings.php:1063 +msgid "Automatically approves all contact requests." +msgstr "" + +#: mod/settings.php:1067 +msgid "" +"Account for a popular profile that automatically approves contact requests " +"as \"Friends\"." +msgstr "" + +#: mod/settings.php:1070 +msgid "Private Forum [Experimental]" +msgstr "" + +#: mod/settings.php:1071 +msgid "Requires manual approval of contact requests." +msgstr "" + +#: mod/settings.php:1082 +msgid "OpenID:" +msgstr "" + +#: mod/settings.php:1082 +msgid "(Optional) Allow this OpenID to login to this account." +msgstr "" + +#: mod/settings.php:1090 +msgid "Publish your default profile in your local site directory?" +msgstr "" + +#: mod/settings.php:1090 +#, php-format +msgid "" +"Your profile will be published in this node's local " +"directory. Your profile details may be publicly visible depending on the " +"system settings." +msgstr "" + +#: mod/settings.php:1096 +msgid "Publish your default profile in the global social directory?" +msgstr "" + +#: mod/settings.php:1096 +#, php-format +msgid "" +"Your profile will be published in the global friendica directories (e.g. %s). Your profile will be visible in public." +msgstr "" + +#: mod/settings.php:1096 +msgid "" +"This setting also determines whether Friendica will inform search engines " +"that your profile should be indexed or not. Third-party search engines may " +"or may not respect this setting." +msgstr "" + +#: mod/settings.php:1103 +msgid "Hide your contact/friend list from viewers of your default profile?" +msgstr "" + +#: mod/settings.php:1103 +msgid "" +"Your contact list won't be shown in your default profile page. You can " +"decide to show your contact list separately for each additional profile you " +"create" +msgstr "" + +#: mod/settings.php:1107 +msgid "Hide your profile details from anonymous viewers?" +msgstr "" + +#: mod/settings.php:1107 +msgid "" +"Anonymous visitors will only see your profile picture, your display name and " +"the nickname you are using on your profile page. Your public posts and " +"replies will still be accessible by other means." +msgstr "" + +#: mod/settings.php:1111 +msgid "Allow friends to post to your profile page?" +msgstr "" + +#: mod/settings.php:1111 +msgid "" +"Your contacts may write posts on your profile wall. These posts will be " +"distributed to your contacts" +msgstr "" + +#: mod/settings.php:1115 +msgid "Allow friends to tag your posts?" +msgstr "" + +#: mod/settings.php:1115 +msgid "Your contacts can add additional tags to your posts." +msgstr "" + +#: mod/settings.php:1119 +msgid "Allow us to suggest you as a potential friend to new members?" +msgstr "" + +#: mod/settings.php:1119 +msgid "If you like, Friendica may suggest new members to add you as a contact." +msgstr "" + +#: mod/settings.php:1123 +msgid "Permit unknown people to send you private mail?" +msgstr "" + +#: mod/settings.php:1123 +msgid "" +"Friendica network users may send you private messages even if they are not " +"in your contact list." +msgstr "" + +#: mod/settings.php:1127 +msgid "Profile is not published." +msgstr "" + +#: mod/settings.php:1133 +#, php-format +msgid "Your Identity Address is '%s' or '%s'." +msgstr "" + +#: mod/settings.php:1140 +msgid "Automatically expire posts after this many days:" +msgstr "" + +#: mod/settings.php:1140 +msgid "If empty, posts will not expire. Expired posts will be deleted" +msgstr "" + +#: mod/settings.php:1141 +msgid "Advanced expiration settings" +msgstr "" + +#: mod/settings.php:1142 +msgid "Advanced Expiration" +msgstr "" + +#: mod/settings.php:1143 +msgid "Expire posts:" +msgstr "" + +#: mod/settings.php:1144 +msgid "Expire personal notes:" +msgstr "" + +#: mod/settings.php:1145 +msgid "Expire starred posts:" +msgstr "" + +#: mod/settings.php:1146 +msgid "Expire photos:" +msgstr "" + +#: mod/settings.php:1147 +msgid "Only expire posts by others:" +msgstr "" + +#: mod/settings.php:1177 +msgid "Account Settings" +msgstr "" + +#: mod/settings.php:1185 +msgid "Password Settings" +msgstr "" + +#: mod/settings.php:1186 +msgid "" +"Allowed characters are a-z, A-Z, 0-9 and special characters except white " +"spaces, accentuated letters and colon (:)." +msgstr "" + +#: mod/settings.php:1187 +msgid "Leave password fields blank unless changing" +msgstr "" + +#: mod/settings.php:1188 +msgid "Current Password:" +msgstr "" + +#: mod/settings.php:1188 mod/settings.php:1189 +msgid "Your current password to confirm the changes" +msgstr "" + +#: mod/settings.php:1189 +msgid "Password:" +msgstr "" + +#: mod/settings.php:1192 +msgid "Delete OpenID URL" +msgstr "" + +#: mod/settings.php:1194 +msgid "Basic Settings" +msgstr "" + +#: mod/settings.php:1196 +msgid "Email Address:" +msgstr "" + +#: mod/settings.php:1197 +msgid "Your Timezone:" +msgstr "" + +#: mod/settings.php:1198 +msgid "Your Language:" +msgstr "" + +#: mod/settings.php:1198 +msgid "" +"Set the language we use to show you friendica interface and to send you " +"emails" +msgstr "" + +#: mod/settings.php:1199 +msgid "Default Post Location:" +msgstr "" + +#: mod/settings.php:1200 +msgid "Use Browser Location:" +msgstr "" + +#: mod/settings.php:1203 +msgid "Security and Privacy Settings" +msgstr "" + +#: mod/settings.php:1205 +msgid "Maximum Friend Requests/Day:" +msgstr "" + +#: mod/settings.php:1205 mod/settings.php:1234 +msgid "(to prevent spam abuse)" +msgstr "" + +#: mod/settings.php:1206 +msgid "Default Post Permissions" +msgstr "" + +#: mod/settings.php:1207 +msgid "(click to open/close)" +msgstr "" + +#: mod/settings.php:1217 +msgid "Default Private Post" +msgstr "" + +#: mod/settings.php:1218 +msgid "Default Public Post" +msgstr "" + +#: mod/settings.php:1222 +msgid "Default Permissions for New Posts" +msgstr "" + +#: mod/settings.php:1234 +msgid "Maximum private messages per day from unknown people:" +msgstr "" + +#: mod/settings.php:1237 +msgid "Notification Settings" +msgstr "" + +#: mod/settings.php:1238 +msgid "Send a notification email when:" +msgstr "" + +#: mod/settings.php:1239 +msgid "You receive an introduction" +msgstr "" + +#: mod/settings.php:1240 +msgid "Your introductions are confirmed" +msgstr "" + +#: mod/settings.php:1241 +msgid "Someone writes on your profile wall" +msgstr "" + +#: mod/settings.php:1242 +msgid "Someone writes a followup comment" +msgstr "" + +#: mod/settings.php:1243 +msgid "You receive a private message" +msgstr "" + +#: mod/settings.php:1244 +msgid "You receive a friend suggestion" +msgstr "" + +#: mod/settings.php:1245 +msgid "You are tagged in a post" +msgstr "" + +#: mod/settings.php:1246 +msgid "You are poked/prodded/etc. in a post" +msgstr "" + +#: mod/settings.php:1248 +msgid "Activate desktop notifications" +msgstr "" + +#: mod/settings.php:1248 +msgid "Show desktop popup on new notifications" +msgstr "" + +#: mod/settings.php:1250 +msgid "Text-only notification emails" +msgstr "" + +#: mod/settings.php:1252 +msgid "Send text only notification emails, without the html part" +msgstr "" + +#: mod/settings.php:1254 +msgid "Show detailled notifications" +msgstr "" + +#: mod/settings.php:1256 +msgid "" +"Per default, notifications are condensed to a single notification per item. " +"When enabled every notification is displayed." +msgstr "" + +#: mod/settings.php:1258 +msgid "Advanced Account/Page Type Settings" +msgstr "" + +#: mod/settings.php:1259 +msgid "Change the behaviour of this account for special situations" +msgstr "" + +#: mod/settings.php:1262 +msgid "Import Contacts" +msgstr "" + +#: mod/settings.php:1263 +msgid "" +"Upload a CSV file that contains the handle of your followed accounts in the " +"first column you exported from the old account." +msgstr "" + +#: mod/settings.php:1264 +msgid "Upload File" +msgstr "" + +#: mod/settings.php:1266 +msgid "Relocate" +msgstr "" + +#: mod/settings.php:1267 +msgid "" +"If you have moved this profile from another server, and some of your " +"contacts don't receive your updates, try pushing this button." +msgstr "" + +#: mod/settings.php:1268 +msgid "Resend relocate message to contacts" +msgstr "" + +#: mod/suggest.php:28 +msgid "Contact suggestion successfully ignored." +msgstr "" + +#: mod/suggest.php:52 +msgid "" +"No suggestions available. If this is a new site, please try again in 24 " +"hours." +msgstr "" + +#: mod/suggest.php:71 +msgid "Do you really want to delete this suggestion?" +msgstr "" + +#: mod/suggest.php:89 mod/suggest.php:109 +msgid "Ignore/Hide" +msgstr "" + +#: mod/dfrn_confirm.php:127 +msgid "" +"This may occasionally happen if contact was requested by both persons and it " +"has already been approved." +msgstr "" + +#: mod/dfrn_confirm.php:228 +msgid "Response from remote site was not understood." +msgstr "" + +#: mod/dfrn_confirm.php:235 mod/dfrn_confirm.php:241 +msgid "Unexpected response from remote site: " +msgstr "" + +#: mod/dfrn_confirm.php:250 +msgid "Confirmation completed successfully." +msgstr "" + +#: mod/dfrn_confirm.php:262 +msgid "Temporary failure. Please wait and try again." +msgstr "" + +#: mod/dfrn_confirm.php:265 +msgid "Introduction failed or was revoked." +msgstr "" + +#: mod/dfrn_confirm.php:270 +msgid "Remote site reported: " +msgstr "" + +#: mod/dfrn_confirm.php:375 +#, php-format +msgid "No user record found for '%s' " +msgstr "" + +#: mod/dfrn_confirm.php:385 +msgid "Our site encryption key is apparently messed up." +msgstr "" + +#: mod/dfrn_confirm.php:396 +msgid "Empty site URL was provided or URL could not be decrypted by us." +msgstr "" + +#: mod/dfrn_confirm.php:412 +msgid "Contact record was not found for you on our site." +msgstr "" + +#: mod/dfrn_confirm.php:426 +#, php-format +msgid "Site public key not available in contact record for URL %s." +msgstr "" + +#: mod/dfrn_confirm.php:442 +msgid "" +"The ID provided by your system is a duplicate on our system. It should work " +"if you try again." +msgstr "" + +#: mod/dfrn_confirm.php:453 +msgid "Unable to set your contact credentials on our system." +msgstr "" + +#: mod/dfrn_confirm.php:509 +msgid "Unable to update your contact profile details on our system" +msgstr "" + +#: mod/removeme.php:46 +msgid "User deleted their account" +msgstr "" + +#: mod/removeme.php:47 +msgid "" +"On your Friendica node an user deleted their account. Please ensure that " +"their data is removed from the backups." +msgstr "" + +#: mod/removeme.php:48 +#, php-format +msgid "The user id is %d" +msgstr "" + +#: mod/removeme.php:84 mod/removeme.php:87 +msgid "Remove My Account" +msgstr "" + +#: mod/removeme.php:85 +msgid "" +"This will completely remove your account. Once this has been done it is not " +"recoverable." +msgstr "" + +#: mod/removeme.php:86 +msgid "Please enter your password for verification:" +msgstr "" + +#: mod/wall_upload.php:231 +msgid "Wall Photos" +msgstr "" + +#: mod/editpost.php:29 mod/editpost.php:39 +msgid "Item not found" +msgstr "" + +#: mod/editpost.php:46 +msgid "Edit post" +msgstr "" + +#: mod/editpost.php:78 +msgid "web link" +msgstr "" + +#: mod/editpost.php:79 +msgid "Insert video link" +msgstr "" + +#: mod/editpost.php:80 +msgid "video link" +msgstr "" + +#: mod/editpost.php:81 +msgid "Insert audio link" +msgstr "" + +#: mod/editpost.php:82 +msgid "audio link" +msgstr "" + +#: mod/subthread.php:107 +#, php-format +msgid "%1$s is following %2$s's %3$s" +msgstr "" + +#: mod/message.php:74 +msgid "Unable to locate contact information." +msgstr "" + +#: mod/message.php:148 +msgid "Do you really want to delete this message?" +msgstr "" + +#: mod/message.php:166 +msgid "Conversation not found." +msgstr "" + +#: mod/message.php:171 +msgid "Message deleted." +msgstr "" + +#: mod/message.php:176 mod/message.php:190 +msgid "Conversation removed." +msgstr "" + +#: mod/message.php:289 +msgid "No messages." +msgstr "" + +#: mod/message.php:352 +msgid "Message not available." +msgstr "" + +#: mod/message.php:406 +msgid "Delete message" +msgstr "" + +#: mod/message.php:408 mod/message.php:540 +msgid "D, d M Y - g:i A" +msgstr "" + +#: mod/message.php:423 mod/message.php:537 +msgid "Delete conversation" +msgstr "" + +#: mod/message.php:425 +msgid "" +"No secure communications available. You may be able to " +"respond from the sender's profile page." +msgstr "" + +#: mod/message.php:429 +msgid "Send Reply" +msgstr "" + +#: mod/message.php:512 +#, php-format +msgid "Unknown sender - %s" +msgstr "" + +#: mod/message.php:514 +#, php-format +msgid "You and %s" +msgstr "" + +#: mod/message.php:516 +#, php-format +msgid "%s and You" +msgstr "" + +#: mod/message.php:543 +#, php-format +msgid "%d message" +msgid_plural "%d messages" +msgstr[0] "" +msgstr[1] "" + +#: mod/repair_ostatus.php:21 +msgid "Resubscribing to OStatus contacts" +msgstr "" + +#: mod/hcard.php:21 +msgid "No profile" +msgstr "" + +#: mod/profperm.php:30 +msgid "Permission denied" +msgstr "" + +#: mod/profperm.php:36 mod/profperm.php:69 +msgid "Invalid profile identifier." +msgstr "" + +#: mod/profperm.php:115 +msgid "Profile Visibility Editor" +msgstr "" + +#: mod/profperm.php:128 +msgid "Visible To" +msgstr "" + +#: mod/profperm.php:144 +msgid "All Contacts (with secure profile access)" +msgstr "" + +#: mod/tagrm.php:31 +msgid "Tag(s) removed" +msgstr "" + +#: mod/tagrm.php:101 +msgid "Remove Item Tag" +msgstr "" + +#: mod/tagrm.php:103 +msgid "Select a tag to remove: " +msgstr "" + +#: mod/videos.php:120 +msgid "No videos selected" +msgstr "" + +#: mod/videos.php:253 +msgid "Recent Videos" +msgstr "" + +#: mod/videos.php:255 +msgid "Upload New Videos" msgstr "" From 54392fab817a1a65175936b6c49c85ad054ff0fb Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Sun, 8 Dec 2019 22:45:34 +0100 Subject: [PATCH 06/21] Move Cookie to own class (with tests) Move Authentication to App namespace --- include/api.php | 2 +- index.php | 2 +- mod/dfrn_poll.php | 4 +- mod/openid.php | 2 +- src/App.php | 4 +- src/{Core => App}/Authentication.php | 79 +++++++------ src/Core/Session.php | 68 +---------- src/Model/User.php | 2 + src/Model/User/Cookie.php | 159 +++++++++++++++++++++++++ src/Module/Delegation.php | 2 +- src/Module/Login.php | 2 +- src/Module/Logout.php | 2 +- src/Module/TwoFactor/Recovery.php | 2 +- src/Module/TwoFactor/Verify.php | 2 +- src/Network/FKOAuth1.php | 2 +- tests/src/Model/User/CookieTest.php | 171 +++++++++++++++++++++++++++ 16 files changed, 393 insertions(+), 112 deletions(-) rename src/{Core => App}/Authentication.php (89%) create mode 100644 src/Model/User/Cookie.php create mode 100644 tests/src/Model/User/CookieTest.php diff --git a/include/api.php b/include/api.php index f4b95733e..77bce65a3 100644 --- a/include/api.php +++ b/include/api.php @@ -12,7 +12,7 @@ use Friendica\Content\ContactSelector; use Friendica\Content\Feature; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; diff --git a/index.php b/index.php index 00ec0edb7..dbdac5fcb 100644 --- a/index.php +++ b/index.php @@ -23,5 +23,5 @@ $a->runFrontend( $dice->create(\Friendica\App\Module::class), $dice->create(\Friendica\App\Router::class), $dice->create(\Friendica\Core\Config\PConfiguration::class), - $dice->create(\Friendica\Core\Authentication::class) + $dice->create(\Friendica\App\Authentication::class) ); diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 892aecacb..847921719 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -6,7 +6,7 @@ use Friendica\App; use Friendica\BaseObject; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\Logger; @@ -24,7 +24,7 @@ function dfrn_poll_init(App $a) { /** @var Authentication $authentication */ $authentication = BaseObject::getClass(Authentication::class); - $authentication->withSession($a, $_COOKIE); + $authentication->withSession($a); $dfrn_id = $_GET['dfrn_id'] ?? ''; $type = ($_GET['type'] ?? '') ?: 'data'; diff --git a/mod/openid.php b/mod/openid.php index 0c21f7a31..fc7336a54 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -5,7 +5,7 @@ use Friendica\App; use Friendica\BaseObject; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\Logger; diff --git a/src/App.php b/src/App.php index 243f5ba07..7a52139d6 100644 --- a/src/App.php +++ b/src/App.php @@ -8,7 +8,7 @@ use Exception; use Friendica\App\Arguments; use Friendica\App\BaseURL; use Friendica\App\Page; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Config\Cache\ConfigCache; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; @@ -720,7 +720,7 @@ class App Model\Profile::openWebAuthInit($token); } - $auth->withSession($this, $_COOKIE); + $auth->withSession($this); if (empty($_SESSION['authenticated'])) { header('X-Account-Management-Status: none'); diff --git a/src/Core/Authentication.php b/src/App/Authentication.php similarity index 89% rename from src/Core/Authentication.php rename to src/App/Authentication.php index 39de73ce0..99231cb77 100644 --- a/src/Core/Authentication.php +++ b/src/App/Authentication.php @@ -4,11 +4,15 @@ * @file /src/Core/Authentication.php */ -namespace Friendica\Core; +namespace Friendica\App; use Exception; use Friendica\App; use Friendica\Core\Config\Configuration; +use Friendica\Core\Hook; +use Friendica\Core\PConfig; +use Friendica\Core\Session; +use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Model\User; @@ -35,6 +39,8 @@ class Authentication private $dba; /** @var LoggerInterface */ private $logger; + /** @var User\Cookie */ + private $cookie; /** * Authentication constructor. @@ -44,63 +50,62 @@ class Authentication * @param L10n $l10n * @param Database $dba * @param LoggerInterface $logger + * @param User\Cookie $cookie */ - public function __construct(Configuration $config, App\BaseURL $baseUrl, L10n $l10n, Database $dba, LoggerInterface $logger) + public function __construct(Configuration $config, App\BaseURL $baseUrl, L10n $l10n, Database $dba, LoggerInterface $logger, User\Cookie $cookie) { $this->config = $config; $this->baseUrl = $baseUrl; $this->l10n = $l10n; $this->dba = $dba; $this->logger = $logger; + $this->cookie = $cookie; } /** * @brief Tries to auth the user from the cookie or session * * @param App $a The Friendica Application context - * @param array $cookie The $_COOKIE array * * @throws HttpException\InternalServerErrorException In case of Friendica internal exceptions * @throws Exception In case of general exceptions (like SQL Grammar) */ - public function withSession(App $a, array $cookie) + public function withSession(App $a) { + $data = $this->cookie->getData(); + // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. - if (isset($cookie["Friendica"])) { - $data = json_decode($cookie["Friendica"]); - if (isset($data->uid)) { + if (isset($data) && isset($data->uid)) { - $user = $this->dba->selectFirst( - 'user', - [], - [ - 'uid' => $data->uid, - 'blocked' => false, - 'account_expired' => false, - 'account_removed' => false, - 'verified' => true, - ] - ); - if (DBA::isResult($user)) { - if (!Session::checkCookie($data->hash, $user)) { - $this->logger->notice("Hash doesn't fit.", ['user' => $data->uid]); - Session::delete(); - $this->baseUrl->redirect(); - } + $user = $this->dba->selectFirst( + 'user', + [], + [ + 'uid' => $data->uid, + 'blocked' => false, + 'account_expired' => false, + 'account_removed' => false, + 'verified' => true, + ] + ); + if (DBA::isResult($user)) { + if (!$this->cookie->check($data->hash, + $user['password'] ?? '', + $user['prvKey'] ?? '')) { + $this->logger->notice("Hash doesn't fit.", ['user' => $data->uid]); + Session::delete(); + $this->baseUrl->redirect(); + } - // Renew the cookie - // Expires after 7 days by default, - // can be set via system.auth_cookie_lifetime - $authcookiedays = $this->config->get('system', 'auth_cookie_lifetime', 7); - Session::setCookie($authcookiedays * 24 * 60 * 60, $user); + // Renew the cookie + $this->cookie->set($user['uid'], $user['password'], $user['prvKey']); - // Do the authentification if not done by now - if (!Session::get('authenticated')) { - $this->setForUser($a, $user); + // Do the authentification if not done by now + if (!Session::get('authenticated')) { + $this->setForUser($a, $user); - if ($this->config->get('system', 'paranoia')) { - Session::set('addr', $data->ip); - } + if ($this->config->get('system', 'paranoia')) { + Session::set('addr', $data->ip); } } } @@ -241,7 +246,7 @@ class Authentication } if (!$remember) { - Session::setCookie(0); // 0 means delete on browser exit + $this->cookie->clear(); } // if we haven't failed up this point, log them in. @@ -343,7 +348,7 @@ class Authentication */; if (Session::get('remember')) { $a->getLogger()->info('Injecting cookie for remembered user ' . $user_record['nickname']); - Session::setCookie(604800, $user_record); + $this->cookie->set($user_record['uid'], $user_record['password'], $user_record['prvKey']); Session::remove('remember'); } } diff --git a/src/Core/Session.php b/src/Core/Session.php index 02e10482d..542307a5c 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -6,10 +6,12 @@ namespace Friendica\Core; use Friendica\App; +use Friendica\BaseObject; use Friendica\Core\Session\CacheSessionHandler; use Friendica\Core\Session\DatabaseSessionHandler; use Friendica\Database\DBA; use Friendica\Model\Contact; +use Friendica\Model\User; use Friendica\Util\Strings; /** @@ -171,73 +173,15 @@ class Session return $_SESSION['authenticated']; } - /** - * @brief Calculate the hash that is needed for the "Friendica" cookie - * - * @param array $user Record from "user" table - * - * @return string Hashed data - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - private static function getCookieHashForUser($user) - { - return hash_hmac( - "sha256", - hash_hmac("sha256", $user["password"], $user["prvkey"]), - Config::get("system", "site_prvkey") - ); - } - - /** - * @brief Set the "Friendica" cookie - * - * @param int $time - * @param array $user Record from "user" table - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public static function setCookie($time, $user = []) - { - if ($time != 0) { - $time = $time + time(); - } - - if ($user) { - $value = json_encode([ - "uid" => $user["uid"], - "hash" => self::getCookieHashForUser($user), - "ip" => ($_SERVER['REMOTE_ADDR'] ?? '') ?: '0.0.0.0' - ]); - } else { - $value = ""; - } - - setcookie("Friendica", $value, $time, "/", "", (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL), true); - } - - /** - * @brief Checks if the "Friendica" cookie is set - * - * @param string $hash - * @param array $user Record from "user" table - * - * @return boolean True, if the cookie is set - * - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ - public static function checkCookie(string $hash, array $user) - { - return hash_equals( - self::getCookieHashForUser($user), - $hash - ); - } - /** * @brief Kills the "Friendica" cookie and all session data */ public static function delete() { - self::setCookie(-3600); // make sure cookie is deleted on browser close, as a security measure + /** @var User\Cookie $cookie */ + $cookie = BaseObject::getClass(User\Cookie::class); + $cookie->clear(); + $_SESSION = []; session_unset(); session_destroy(); } diff --git a/src/Model/User.php b/src/Model/User.php index 7ecf4a576..14cb09207 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -9,12 +9,14 @@ namespace Friendica\Model; use DivineOmega\PasswordExposed; use Exception; +use Friendica\App; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; +use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; diff --git a/src/Model/User/Cookie.php b/src/Model/User/Cookie.php new file mode 100644 index 000000000..d8404e41e --- /dev/null +++ b/src/Model/User/Cookie.php @@ -0,0 +1,159 @@ +remoteAddr = $server['REMOTE_ADDR']; + } + + $this->sslEnabled = $config->get('system', 'ssl_policy') === App\BaseURL::SSL_POLICY_FULL; + $this->sitePrivateKey = $config->get('system', 'site_prvkey'); + + $authCookieDays = $config->get('system', 'auth_cookie_lifetime', + self::DEFAULT_EXPIRE); + $this->lifetime = $authCookieDays * 24 * 60 * 60; + $this->cookie = $cookie; + } + + /** + * Checks if the Friendica cookie is set for a user + * + * @param string $hash The cookie hash + * @param string $password The user password + * @param string $privateKey The private Key of the user + * + * @return boolean True, if the cookie is set + * + */ + public function check(string $hash, string $password, string $privateKey) + { + return hash_equals( + $this->getHash($password, $privateKey), + $hash + ); + } + + /** + * Set the Friendica cookie for a user + * + * @param int $uid The user id + * @param string $password The user password + * @param string $privateKey The user private key + * @param int|null $seconds optional the seconds + * + * @return bool + */ + public function set(int $uid, string $password, string $privateKey, int $seconds = null) + { + if (!isset($seconds)) { + $seconds = $this->lifetime; + } elseif (isset($seconds) && $seconds != 0) { + $seconds = $seconds + time(); + } + + $value = json_encode([ + 'uid' => $uid, + 'hash' => $this->getHash($password, $privateKey), + 'ip' => $this->remoteAddr, + ]); + + return $this->setCookie(self::NAME, $value, $seconds, + '/', '', $this->sslEnabled, true); + } + + /** + * Returns the data of the Friendicas user cookie + * + * @return mixed|null The JSON data, null if not set + */ + public function getData() + { + // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. + if (isset($this->cookie[self::NAME])) { + $data = json_decode($this->cookie[self::NAME]); + if (!empty($data)) { + return $data; + } + } + + return null; + } + + /** + * Clears the Friendica cookie of this user after leaving the page + */ + public function clear() + { + // make sure cookie is deleted on browser close, as a security measure + return $this->setCookie(self::NAME, '', -3600, + '/', '', $this->sslEnabled, true); + } + + /** + * Calculate the hash that is needed for the Friendica cookie + * + * @param string $password The user password + * @param string $privateKey The private key of the user + * + * @return string Hashed data + */ + private function getHash(string $password, string $privateKey) + { + return hash_hmac( + 'sha256', + hash_hmac('sha256', $password, $privateKey), + $this->sitePrivateKey + ); + } + + /** + * Send a cookie - protected, internal function for test-mocking possibility + * + * @link https://php.net/manual/en/function.setcookie.php + * + * @param string $name + * @param string $value [optional] + * @param int $expire [optional] + * @param string $path [optional] + * @param string $domain [optional] + * @param bool $secure [optional] + * @param bool $httponly [optional]

+ * + * @return bool If output exists prior to calling this function, + * + * @since 4.0 + * @since 5.0 + */ + protected function setCookie(string $name, string $value = null, int $expire = null, + string $path = null, string $domain = null, + bool $secure = null, bool $httponly = null) + { + return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); + } +} diff --git a/src/Module/Delegation.php b/src/Module/Delegation.php index 2e3a5cafe..7d2e68672 100644 --- a/src/Module/Delegation.php +++ b/src/Module/Delegation.php @@ -3,7 +3,7 @@ namespace Friendica\Module; use Friendica\BaseModule; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Renderer; diff --git a/src/Module/Login.php b/src/Module/Login.php index 8ecf3e40c..d7c537839 100644 --- a/src/Module/Login.php +++ b/src/Module/Login.php @@ -7,7 +7,7 @@ namespace Friendica\Module; use Friendica\BaseModule; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; diff --git a/src/Module/Logout.php b/src/Module/Logout.php index 877a8cda0..89910107d 100644 --- a/src/Module/Logout.php +++ b/src/Module/Logout.php @@ -6,7 +6,7 @@ namespace Friendica\Module; use Friendica\BaseModule; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Cache; use Friendica\Core\Hook; use Friendica\Core\L10n; diff --git a/src/Module/TwoFactor/Recovery.php b/src/Module/TwoFactor/Recovery.php index f1454469f..371b7d7d5 100644 --- a/src/Module/TwoFactor/Recovery.php +++ b/src/Module/TwoFactor/Recovery.php @@ -3,7 +3,7 @@ namespace Friendica\Module\TwoFactor; use Friendica\BaseModule; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\L10n; use Friendica\Core\Renderer; use Friendica\Core\Session; diff --git a/src/Module/TwoFactor/Verify.php b/src/Module/TwoFactor/Verify.php index e4a0b2ff1..62b988ef9 100644 --- a/src/Module/TwoFactor/Verify.php +++ b/src/Module/TwoFactor/Verify.php @@ -3,7 +3,7 @@ namespace Friendica\Module\TwoFactor; use Friendica\BaseModule; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\Renderer; diff --git a/src/Network/FKOAuth1.php b/src/Network/FKOAuth1.php index 81c0c1b29..a3dde38d2 100644 --- a/src/Network/FKOAuth1.php +++ b/src/Network/FKOAuth1.php @@ -5,7 +5,7 @@ namespace Friendica\Network; use Friendica\BaseObject; -use Friendica\Core\Authentication; +use Friendica\App\Authentication; use Friendica\Core\Logger; use Friendica\Core\Session; use Friendica\Database\DBA; diff --git a/tests/src/Model/User/CookieTest.php b/tests/src/Model/User/CookieTest.php new file mode 100644 index 000000000..05fc26c2a --- /dev/null +++ b/tests/src/Model/User/CookieTest.php @@ -0,0 +1,171 @@ +config = \Mockery::mock(Configuration::class); + } + + public function testInstance() + { + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn('1235')->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); + + $cookie = new Cookie($this->config, []); + $this->assertInstanceOf(Cookie::class, $cookie); + } + + public function dataGet() + { + return [ + 'default' => [ + 'cookieData' => [ + Cookie::NAME => json_encode([ + 'uid' => -1, + 'hash' => 12345, + 'ip' => '127.0.0.1', + ]) + ], + 'hasValues' => true, + 'uid' => -1, + 'hash' => 12345, + 'ip' => '127.0.0.1', + ], + 'missing' => [ + 'cookieData' => [ + + ], + 'hasValues' => false, + 'uid' => null, + 'hash' => null, + 'ip' => null, + ], + 'invalid' => [ + 'cookieData' => [ + Cookie::NAME => 'test', + ], + 'hasValues' => false, + 'uid' => null, + 'hash' => null, + 'ip' => null, + ], + 'incomplete' => [ + 'cookieData' => [ + Cookie::NAME => json_encode([ + 'uid' => -1, + 'hash' => 12345, + ]) + ], + 'hasValues' => true, + 'uid' => -1, + 'hash' => 12345, + 'ip' => null, + ], + ]; + } + + /** + * @dataProvider dataGet + */ + public function testGet(array $cookieData, bool $hasValues, $uid, $hash, $ip) + { + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn('1235')->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); + + $cookie = new Cookie($this->config, [], $cookieData); + $this->assertInstanceOf(Cookie::class, $cookie); + + $assertData = $cookie->getData(); + + if (!$hasValues) { + $this->assertEmpty($assertData); + } else { + $this->assertNotEmpty($assertData); + if (isset($uid)) { + $this->assertObjectHasAttribute('uid', $assertData); + $this->assertEquals($uid, $assertData->uid); + } else { + $this->assertObjectNotHasAttribute('uid', $assertData); + } + if (isset($hash)) { + $this->assertObjectHasAttribute('hash', $assertData); + $this->assertEquals($hash, $assertData->hash); + } else { + $this->assertObjectNotHasAttribute('hash', $assertData); + } + if (isset($ip)) { + $this->assertObjectHasAttribute('ip', $assertData); + $this->assertEquals($ip, $assertData->ip); + } else { + $this->assertObjectNotHasAttribute('ip', $assertData); + } + } + } + + public function dataCheck() + { + return [ + 'default' => [ + 'serverPrivateKey' => 'serverkey', + 'userPrivateKey' => 'userkey', + 'password' => 'test', + 'assertHash' => 'e9b4eb16275a2907b5659d22905b248221d0517dde4a9d5c320b8fe051b1267b', + 'assertTrue' => true, + ], + 'emptyUser' => [ + 'serverPrivateKey' => 'serverkey', + 'userPrivateKey' => '', + 'password' => '', + 'assertHash' => '', + 'assertTrue' => false, + ], + 'invalid' => [ + 'serverPrivateKey' => 'serverkey', + 'userPrivateKey' => 'bla', + 'password' => 'nope', + 'assertHash' => 'real wrong!', + 'assertTrue' => false, + ] + ]; + } + + /** + * @dataProvider dataCheck + */ + public function testCheck(string $serverPrivateKey, string $userPrivateKey, string $password, string $assertHash, bool $assertTrue) + { + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverPrivateKey)->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); + + $cookie = new Cookie($this->config, []); + $this->assertInstanceOf(Cookie::class, $cookie); + + $this->assertEquals($assertTrue, $cookie->check($assertHash, $password, $userPrivateKey)); + } + + public function testSet() + { + $this->markTestIncomplete('Needs mocking of setcookie() first.'); + } + + public function testClear() + { + $this->markTestIncomplete('Needs mocking of setcookie() first.'); + } +} From f7e1cfd41616424a145facf57823c66a093c27d8 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Mon, 9 Dec 2019 21:55:25 +0100 Subject: [PATCH 07/21] revert wrong import --- src/Model/User.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Model/User.php b/src/Model/User.php index 14cb09207..7ecf4a576 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -9,14 +9,12 @@ namespace Friendica\Model; use DivineOmega\PasswordExposed; use Exception; -use Friendica\App; use Friendica\Core\Config; use Friendica\Core\Hook; use Friendica\Core\L10n; use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; -use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; From a8b89dc48666505a39b4906ff7764906104c6dac Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Mon, 9 Dec 2019 21:55:51 +0100 Subject: [PATCH 08/21] Remove copy&paste failure --- src/Model/User/Cookie.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Model/User/Cookie.php b/src/Model/User/Cookie.php index d8404e41e..b6e20dfed 100644 --- a/src/Model/User/Cookie.php +++ b/src/Model/User/Cookie.php @@ -143,12 +143,10 @@ class Cookie * @param string $path [optional] * @param string $domain [optional] * @param bool $secure [optional] - * @param bool $httponly [optional]

+ * @param bool $httponly [optional] * * @return bool If output exists prior to calling this function, * - * @since 4.0 - * @since 5.0 */ protected function setCookie(string $name, string $value = null, int $expire = null, string $path = null, string $domain = null, From 94a8a6084199e6851ca83c7008070e6b50aa36b0 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Mon, 9 Dec 2019 22:47:08 +0100 Subject: [PATCH 09/21] Add more Cookie tests (create new StaticCookie class for mocking setcookie()) --- src/App/Authentication.php | 2 +- src/Model/User/Cookie.php | 22 ++--- tests/Util/StaticCookie.php | 28 ++++++ tests/src/Model/User/CookieTest.php | 147 +++++++++++++++++++++++++++- 4 files changed, 182 insertions(+), 17 deletions(-) create mode 100644 tests/Util/StaticCookie.php diff --git a/src/App/Authentication.php b/src/App/Authentication.php index 99231cb77..bf62cf8a4 100644 --- a/src/App/Authentication.php +++ b/src/App/Authentication.php @@ -75,7 +75,7 @@ class Authentication $data = $this->cookie->getData(); // When the "Friendica" cookie is set, take the value to authenticate and renew the cookie. - if (isset($data) && isset($data->uid)) { + if (isset($data->uid)) { $user = $this->dba->selectFirst( 'user', diff --git a/src/Model/User/Cookie.php b/src/Model/User/Cookie.php index b6e20dfed..79882d641 100644 --- a/src/Model/User/Cookie.php +++ b/src/Model/User/Cookie.php @@ -14,6 +14,12 @@ class Cookie const DEFAULT_EXPIRE = 7; /** @var string The name of the Friendica cookie */ const NAME = 'Friendica'; + /** @var string The path of the Friendica cookie */ + const PATH = '/'; + /** @var string The domain name of the Friendica cookie */ + const DOMAIN = ''; + /** @var bool True, if the cookie should only be accessable through HTTP */ + const HTTPONLY = true; /** @var string The remote address of this node */ private $remoteAddr = '0.0.0.0'; @@ -72,7 +78,7 @@ class Cookie public function set(int $uid, string $password, string $privateKey, int $seconds = null) { if (!isset($seconds)) { - $seconds = $this->lifetime; + $seconds = $this->lifetime + time(); } elseif (isset($seconds) && $seconds != 0) { $seconds = $seconds + time(); } @@ -83,8 +89,7 @@ class Cookie 'ip' => $this->remoteAddr, ]); - return $this->setCookie(self::NAME, $value, $seconds, - '/', '', $this->sslEnabled, true); + return $this->setCookie(self::NAME, $value, $seconds, $this->sslEnabled); } /** @@ -111,8 +116,7 @@ class Cookie public function clear() { // make sure cookie is deleted on browser close, as a security measure - return $this->setCookie(self::NAME, '', -3600, - '/', '', $this->sslEnabled, true); + return $this->setCookie(self::NAME, '', -3600, $this->sslEnabled); } /** @@ -140,18 +144,14 @@ class Cookie * @param string $name * @param string $value [optional] * @param int $expire [optional] - * @param string $path [optional] - * @param string $domain [optional] * @param bool $secure [optional] - * @param bool $httponly [optional] * * @return bool If output exists prior to calling this function, * */ protected function setCookie(string $name, string $value = null, int $expire = null, - string $path = null, string $domain = null, - bool $secure = null, bool $httponly = null) + bool $secure = null) { - return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); + return setcookie($name, $value, $expire, self::PATH, self::DOMAIN, $secure, self::HTTPONLY); } } diff --git a/tests/Util/StaticCookie.php b/tests/Util/StaticCookie.php new file mode 100644 index 000000000..01a8c49be --- /dev/null +++ b/tests/Util/StaticCookie.php @@ -0,0 +1,28 @@ +config = \Mockery::mock(Configuration::class); } + protected function tearDown() + { + StaticCookie::clearStatic(); + } + + /** + * Test if we can create a basic cookie instance + */ public function testInstance() { $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); @@ -79,6 +90,8 @@ class CookieTest extends DatabaseTest } /** + * Test the get() method of the cookie class + * * @dataProvider dataGet */ public function testGet(array $cookieData, bool $hasValues, $uid, $hash, $ip) @@ -134,7 +147,7 @@ class CookieTest extends DatabaseTest 'assertHash' => '', 'assertTrue' => false, ], - 'invalid' => [ + 'invalid' => [ 'serverPrivateKey' => 'serverkey', 'userPrivateKey' => 'bla', 'password' => 'nope', @@ -145,6 +158,8 @@ class CookieTest extends DatabaseTest } /** + * Test the check() method of the cookie class + * * @dataProvider dataCheck */ public function testCheck(string $serverPrivateKey, string $userPrivateKey, string $password, string $assertHash, bool $assertTrue) @@ -159,13 +174,135 @@ class CookieTest extends DatabaseTest $this->assertEquals($assertTrue, $cookie->check($assertHash, $password, $userPrivateKey)); } - public function testSet() + public function dataSet() { - $this->markTestIncomplete('Needs mocking of setcookie() first.'); + return [ + 'default' => [ + 'serverKey' => 23, + 'uid' => 0, + 'password' => '234', + 'privateKey' => '124', + 'assertHash' => 'b657a15cfe7ed1f7289c9aa51af14a9a26c966f4ddd74e495fba103d8e872a39', + 'remoteIp' => '0.0.0.0', + 'serverArray' => [], + 'lifetime' => null, + ], + 'withServerArray' => [ + 'serverKey' => 23, + 'uid' => 0, + 'password' => '234', + 'privateKey' => '124', + 'assertHash' => 'b657a15cfe7ed1f7289c9aa51af14a9a26c966f4ddd74e495fba103d8e872a39', + 'remoteIp' => '1.2.3.4', + 'serverArray' => ['REMOTE_ADDR' => '1.2.3.4',], + 'lifetime' => null, + ], + 'withLifetime0' => [ + 'serverKey' => 23, + 'uid' => 0, + 'password' => '234', + 'privateKey' => '124', + 'assertHash' => 'b657a15cfe7ed1f7289c9aa51af14a9a26c966f4ddd74e495fba103d8e872a39', + 'remoteIp' => '1.2.3.4', + 'serverArray' => ['REMOTE_ADDR' => '1.2.3.4',], + 'lifetime' => 0, + ], + 'withLifetime' => [ + 'serverKey' => 23, + 'uid' => 0, + 'password' => '234', + 'privateKey' => '124', + 'assertHash' => 'b657a15cfe7ed1f7289c9aa51af14a9a26c966f4ddd74e495fba103d8e872a39', + 'remoteIp' => '1.2.3.4', + 'serverArray' => ['REMOTE_ADDR' => '1.2.3.4',], + 'lifetime' => 2 * 24 * 60 * 60, + ], + ]; } + public function assertCookie($uid, $hash, $remoteIp, $lifetime) + { + $this->assertArrayHasKey(Cookie::NAME, StaticCookie::$_COOKIE); + + $data = json_decode(StaticCookie::$_COOKIE[Cookie::NAME]); + + $this->assertObjectHasAttribute('uid', $data); + $this->assertEquals($uid, $data->uid); + $this->assertObjectHasAttribute('hash', $data); + $this->assertEquals($hash, $data->hash); + $this->assertObjectHasAttribute('ip', $data); + $this->assertEquals($remoteIp, $data->ip); + + if (isset($lifetime) && $lifetime !== 0) { + $this->assertLessThanOrEqual(time() + $lifetime, StaticCookie::$_EXPIRE); + } else { + $this->assertLessThanOrEqual(time() + Cookie::DEFAULT_EXPIRE * 24 * 60 * 60, StaticCookie::$_EXPIRE); + } + } + + /** + * Test the set() method of the cookie class + * + * @dataProvider dataSet + */ + public function testSet($serverKey, $uid, $password, $privateKey, $assertHash, $remoteIp, $serverArray, $lifetime) + { + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverKey)->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); + + $cookie = new StaticCookie($this->config, $serverArray); + $this->assertInstanceOf(Cookie::class, $cookie); + + $cookie->set($uid, $password, $privateKey, $lifetime); + + $this->assertCookie($uid, $assertHash, $remoteIp, $lifetime); + } + + /** + * Test two different set() of the cookie class (first set is invalid) + * + * @dataProvider dataSet + */ + public function testDoubleSet($serverKey, $uid, $password, $privateKey, $assertHash, $remoteIp, $serverArray, $lifetime) + { + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverKey)->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); + + $cookie = new StaticCookie($this->config, $serverArray); + $this->assertInstanceOf(Cookie::class, $cookie); + + // Invalid set, should get overwritten + $cookie->set(-1, 'invalid', 'nothing', -234); + + $cookie->set($uid, $password, $privateKey, $lifetime); + + $this->assertCookie($uid, $assertHash, $remoteIp, $lifetime); + } + + /** + * Test the clear() method of the cookie class + */ public function testClear() { - $this->markTestIncomplete('Needs mocking of setcookie() first.'); + StaticCookie::$_COOKIE = [ + Cookie::NAME => 'test' + ]; + + $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn(24)->once(); + $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); + + $cookie = new StaticCookie($this->config, []); + $this->assertInstanceOf(Cookie::class, $cookie); + + $this->assertEquals('test', StaticCookie::$_COOKIE[Cookie::NAME]); + $this->assertEquals(null, StaticCookie::$_EXPIRE); + + $cookie->clear(); + + $this->assertEmpty(StaticCookie::$_COOKIE[Cookie::NAME]); + $this->assertEquals(-3600, StaticCookie::$_EXPIRE); } } From 009a8bb939554270a1a2d42bb770baf81e39bd99 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Mon, 9 Dec 2019 23:09:18 +0100 Subject: [PATCH 10/21] Initializing SessionHandlers with Dependency Injection --- src/Core/Session.php | 15 ++++++- src/Core/Session/CacheSessionHandler.php | 40 +++++++++++++------ src/Core/Session/DatabaseSessionHandler.php | 44 +++++++++++++++------ src/Model/User/Cookie.php | 16 ++++---- 4 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/Core/Session.php b/src/Core/Session.php index 542307a5c..140781d1c 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -7,12 +7,15 @@ namespace Friendica\Core; use Friendica\App; use Friendica\BaseObject; +use Friendica\Core\Cache\ICache; use Friendica\Core\Session\CacheSessionHandler; use Friendica\Core\Session\DatabaseSessionHandler; +use Friendica\Database\Database; use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\User; use Friendica\Util\Strings; +use Psr\Log\LoggerInterface; /** * High-level Session service class @@ -37,9 +40,17 @@ class Session $session_handler = Config::get('system', 'session_handler', 'database'); if ($session_handler != 'native') { if ($session_handler == 'cache' && Config::get('system', 'cache_driver', 'database') != 'database') { - $SessionHandler = new CacheSessionHandler(); + $SessionHandler = new CacheSessionHandler( + BaseObject::getClass(ICache::class), + BaseObject::getClass(LoggerInterface::class), + $_SERVER + ); } else { - $SessionHandler = new DatabaseSessionHandler(); + $SessionHandler = new DatabaseSessionHandler( + BaseObject::getClass(Database::class), + BaseObject::getClass(LoggerInterface::class), + $_SERVER + ); } session_set_save_handler($SessionHandler); diff --git a/src/Core/Session/CacheSessionHandler.php b/src/Core/Session/CacheSessionHandler.php index 6a1b32bfb..218ec1440 100644 --- a/src/Core/Session/CacheSessionHandler.php +++ b/src/Core/Session/CacheSessionHandler.php @@ -2,10 +2,9 @@ namespace Friendica\Core\Session; -use Friendica\BaseObject; -use Friendica\Core\Cache; -use Friendica\Core\Logger; +use Friendica\Core\Cache\ICache; use Friendica\Core\Session; +use Psr\Log\LoggerInterface; use SessionHandlerInterface; /** @@ -13,8 +12,29 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -class CacheSessionHandler extends BaseObject implements SessionHandlerInterface +class CacheSessionHandler implements SessionHandlerInterface { + /** @var ICache */ + private $cache; + /** @var LoggerInterface */ + private $logger; + /** @var array The $_SERVER array */ + private $server; + + /** + * CacheSessionHandler constructor. + * + * @param ICache $cache + * @param LoggerInterface $logger + * @param array $server + */ + public function __construct(ICache $cache, LoggerInterface $logger, array $server) + { + $this->cache = $cache; + $this->logger = $logger; + $this->server = $server; + } + public function open($save_path, $session_name) { return true; @@ -26,13 +46,13 @@ class CacheSessionHandler extends BaseObject implements SessionHandlerInterface return ''; } - $data = Cache::get('session:' . $session_id); + $data = $this->cache->get('session:' . $session_id); if (!empty($data)) { Session::$exists = true; return $data; } - Logger::notice('no data for session', ['session_id' => $session_id, 'uri' => $_SERVER['REQUEST_URI']]); + $this->logger->notice('no data for session', ['session_id' => $session_id, 'uri' => $this->server['REQUEST_URI'] ?? '']); return ''; } @@ -59,9 +79,7 @@ class CacheSessionHandler extends BaseObject implements SessionHandlerInterface return true; } - $return = Cache::set('session:' . $session_id, $session_data, Session::$expire); - - return $return; + return $this->cache->set('session:' . $session_id, $session_data, Session::$expire); } public function close() @@ -71,9 +89,7 @@ class CacheSessionHandler extends BaseObject implements SessionHandlerInterface public function destroy($id) { - $return = Cache::delete('session:' . $id); - - return $return; + return $this->cache->delete('session:' . $id); } public function gc($maxlifetime) diff --git a/src/Core/Session/DatabaseSessionHandler.php b/src/Core/Session/DatabaseSessionHandler.php index e3e95f9ed..5d8441e35 100644 --- a/src/Core/Session/DatabaseSessionHandler.php +++ b/src/Core/Session/DatabaseSessionHandler.php @@ -2,10 +2,9 @@ namespace Friendica\Core\Session; -use Friendica\BaseObject; -use Friendica\Core\Logger; use Friendica\Core\Session; -use Friendica\Database\DBA; +use Friendica\Database\Database; +use Psr\Log\LoggerInterface; use SessionHandlerInterface; /** @@ -13,8 +12,29 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -class DatabaseSessionHandler extends BaseObject implements SessionHandlerInterface +class DatabaseSessionHandler implements SessionHandlerInterface { + /** @var Database */ + private $dba; + /** @var LoggerInterface */ + private $logger; + /** @var array The $_SERVER variable */ + private $server; + + /** + * DatabaseSessionHandler constructor. + * + * @param Database $dba + * @param LoggerInterface $logger + * @param array $server + */ + public function __construct(Database $dba, LoggerInterface $logger, array $server) + { + $this->dba = $dba; + $this->logger = $logger; + $this->server = $server; + } + public function open($save_path, $session_name) { return true; @@ -26,13 +46,13 @@ class DatabaseSessionHandler extends BaseObject implements SessionHandlerInterfa return ''; } - $session = DBA::selectFirst('session', ['data'], ['sid' => $session_id]); - if (DBA::isResult($session)) { + $session = $this->dba->selectFirst('session', ['data'], ['sid' => $session_id]); + if ($this->dba->isResult($session)) { Session::$exists = true; return $session['data']; } - Logger::notice('no data for session', ['session_id' => $session_id, 'uri' => $_SERVER['REQUEST_URI']]); + $this->logger->notice('no data for session', ['session_id' => $session_id, 'uri' => $this->server['REQUEST_URI'] ?? '']); return ''; } @@ -65,10 +85,10 @@ class DatabaseSessionHandler extends BaseObject implements SessionHandlerInterfa if (Session::$exists) { $fields = ['data' => $session_data, 'expire' => $expire]; $condition = ["`sid` = ? AND (`data` != ? OR `expire` != ?)", $session_id, $session_data, $expire]; - DBA::update('session', $fields, $condition); + $this->dba->update('session', $fields, $condition); } else { $fields = ['sid' => $session_id, 'expire' => $default_expire, 'data' => $session_data]; - DBA::insert('session', $fields); + $this->dba->insert('session', $fields); } return true; @@ -81,13 +101,11 @@ class DatabaseSessionHandler extends BaseObject implements SessionHandlerInterfa public function destroy($id) { - DBA::delete('session', ['sid' => $id]); - return true; + return $this->dba->delete('session', ['sid' => $id]); } public function gc($maxlifetime) { - DBA::delete('session', ["`expire` < ?", time()]); - return true; + return $this->dba->delete('session', ["`expire` < ?", time()]); } } diff --git a/src/Model/User/Cookie.php b/src/Model/User/Cookie.php index 79882d641..f85d81868 100644 --- a/src/Model/User/Cookie.php +++ b/src/Model/User/Cookie.php @@ -18,7 +18,7 @@ class Cookie const PATH = '/'; /** @var string The domain name of the Friendica cookie */ const DOMAIN = ''; - /** @var bool True, if the cookie should only be accessable through HTTP */ + /** @var bool True, if the cookie should only be accessible through HTTP */ const HTTPONLY = true; /** @var string The remote address of this node */ @@ -68,10 +68,10 @@ class Cookie /** * Set the Friendica cookie for a user * - * @param int $uid The user id - * @param string $password The user password - * @param string $privateKey The user private key - * @param int|null $seconds optional the seconds + * @param int $uid The user id + * @param string $password The user password + * @param string $privateKey The user private key + * @param int|null $seconds optional the seconds * * @return bool */ @@ -142,9 +142,9 @@ class Cookie * @link https://php.net/manual/en/function.setcookie.php * * @param string $name - * @param string $value [optional] - * @param int $expire [optional] - * @param bool $secure [optional] + * @param string $value [optional] + * @param int $expire [optional] + * @param bool $secure [optional] * * @return bool If output exists prior to calling this function, * From 555513e4b48e948bdfd64bba833e0ccf222c0b2b Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 00:44:56 +0100 Subject: [PATCH 11/21] Add Session Management instances (including Depenency Injection) - Prerequesite for mocking Sessions - Reduce "App" class complexity --- src/App.php | 4 - src/App/Authentication.php | 76 ++++++++------- src/Core/Session.php | 95 ++----------------- ...cheSessionHandler.php => CacheSession.php} | 22 ++--- ...SessionHandler.php => DatabaseSession.php} | 19 ++-- src/Core/Session/ISession.php | 70 ++++++++++++++ src/Core/Session/MemorySession.php | 84 ++++++++++++++++ src/Core/Session/NativeSession.php | 94 ++++++++++++++++++ src/Factory/SessionFactory.php | 79 +++++++++++++++ static/dependencies.config.php | 8 ++ 10 files changed, 408 insertions(+), 143 deletions(-) rename src/Core/Session/{CacheSessionHandler.php => CacheSession.php} (77%) rename src/Core/Session/{DatabaseSessionHandler.php => DatabaseSession.php} (79%) create mode 100644 src/Core/Session/ISession.php create mode 100644 src/Core/Session/MemorySession.php create mode 100644 src/Core/Session/NativeSession.php create mode 100644 src/Factory/SessionFactory.php diff --git a/src/App.php b/src/App.php index 7a52139d6..eed91769f 100644 --- a/src/App.php +++ b/src/App.php @@ -670,15 +670,11 @@ class App System::externalRedirect($this->baseURL->get() . '/' . $this->args->getQueryString()); } - Core\Session::init(); Core\Hook::callAll('init_1'); } // Exclude the backend processes from the session management if (!$this->mode->isBackend()) { - $stamp1 = microtime(true); - session_start(); - $this->profiler->saveTimestamp($stamp1, 'parser', Core\System::callstack()); $this->l10n->setSessionVariable(); $this->l10n->setLangFromSession(); } else { diff --git a/src/App/Authentication.php b/src/App/Authentication.php index bf62cf8a4..5da0f875b 100644 --- a/src/App/Authentication.php +++ b/src/App/Authentication.php @@ -41,6 +41,8 @@ class Authentication private $logger; /** @var User\Cookie */ private $cookie; + /** @var Session\ISession */ + private $session; /** * Authentication constructor. @@ -51,8 +53,9 @@ class Authentication * @param Database $dba * @param LoggerInterface $logger * @param User\Cookie $cookie + * @param Session\ISession $session */ - public function __construct(Configuration $config, App\BaseURL $baseUrl, L10n $l10n, Database $dba, LoggerInterface $logger, User\Cookie $cookie) + public function __construct(Configuration $config, App\BaseURL $baseUrl, L10n $l10n, Database $dba, LoggerInterface $logger, User\Cookie $cookie, Session\ISession $session) { $this->config = $config; $this->baseUrl = $baseUrl; @@ -60,6 +63,7 @@ class Authentication $this->dba = $dba; $this->logger = $logger; $this->cookie = $cookie; + $this->session = $session; } /** @@ -88,12 +92,12 @@ class Authentication 'verified' => true, ] ); - if (DBA::isResult($user)) { + if ($this->dba->isResult($user)) { if (!$this->cookie->check($data->hash, $user['password'] ?? '', $user['prvKey'] ?? '')) { $this->logger->notice("Hash doesn't fit.", ['user' => $data->uid]); - Session::delete(); + $this->session->delete(); $this->baseUrl->redirect(); } @@ -101,34 +105,34 @@ class Authentication $this->cookie->set($user['uid'], $user['password'], $user['prvKey']); // Do the authentification if not done by now - if (!Session::get('authenticated')) { + if (!$this->session->get('authenticated')) { $this->setForUser($a, $user); if ($this->config->get('system', 'paranoia')) { - Session::set('addr', $data->ip); + $this->session->set('addr', $data->ip); } } } } - if (Session::get('authenticated')) { - if (Session::get('visitor_id') && !Session::get('uid')) { - $contact = $this->dba->selectFirst('contact', [], ['id' => Session::get('visitor_id')]); + if ($this->session->get('authenticated')) { + if ($this->session->get('visitor_id') && !$this->session->get('uid')) { + $contact = $this->dba->selectFirst('contact', [], ['id' => $this->session->get('visitor_id')]); if ($this->dba->isResult($contact)) { $a->contact = $contact; } } - if (Session::get('uid')) { + if ($this->session->get('uid')) { // already logged in user returning $check = $this->config->get('system', 'paranoia'); // extra paranoia - if the IP changed, log them out - if ($check && (Session::get('addr') != $_SERVER['REMOTE_ADDR'])) { + if ($check && ($this->session->get('addr') != $_SERVER['REMOTE_ADDR'])) { $this->logger->notice('Session address changed. Paranoid setting in effect, blocking session. ', [ - 'addr' => Session::get('addr'), + 'addr' => $this->session->get('addr'), 'remote_addr' => $_SERVER['REMOTE_ADDR']] ); - Session::delete(); + $this->session->delete(); $this->baseUrl->redirect(); } @@ -136,7 +140,7 @@ class Authentication 'user', [], [ - 'uid' => Session::get('uid'), + 'uid' => $this->session->get('uid'), 'blocked' => false, 'account_expired' => false, 'account_removed' => false, @@ -144,18 +148,18 @@ class Authentication ] ); if (!$this->dba->isResult($user)) { - Session::delete(); + $this->session->delete(); $this->baseUrl->redirect(); } // Make sure to refresh the last login time for the user if the user // stays logged in for a long time, e.g. with "Remember Me" $login_refresh = false; - if (!Session::get('last_login_date')) { - Session::set('last_login_date', DateTimeFormat::utcNow()); + if (!$this->session->get('last_login_date')) { + $this->session->set('last_login_date', DateTimeFormat::utcNow()); } - if (strcmp(DateTimeFormat::utc('now - 12 hours'), Session::get('last_login_date')) > 0) { - Session::set('last_login_date', DateTimeFormat::utcNow()); + if (strcmp(DateTimeFormat::utc('now - 12 hours'), $this->session->get('last_login_date')) > 0) { + $this->session->set('last_login_date', DateTimeFormat::utcNow()); $login_refresh = true; } @@ -186,8 +190,8 @@ class Authentication try { $openid = new LightOpenID($this->baseUrl->getHostname()); $openid->identity = $openid_url; - Session::set('openid', $openid_url); - Session::set('remember', $remember); + $this->session->set('openid', $openid_url); + $this->session->set('remember', $remember); $openid->returnUrl = $this->baseUrl->get(true) . '/openid'; $openid->optional = ['namePerson/friendly', 'contact/email', 'namePerson', 'namePerson/first', 'media/image/aspect11', 'media/image/default']; System::externalRedirect($openid->authUrl()); @@ -250,11 +254,11 @@ class Authentication } // if we haven't failed up this point, log them in. - Session::set('remember', $remember); - Session::set('last_login_date', DateTimeFormat::utcNow()); + $this->session->set('remember', $remember); + $this->session->set('last_login_date', DateTimeFormat::utcNow()); - $openid_identity = Session::get('openid_identity'); - $openid_server = Session::get('openid_server'); + $openid_identity = $this->session->get('openid_identity'); + $openid_server = $this->session->get('openid_server'); if (!empty($openid_identity) || !empty($openid_server)) { $this->dba->update('user', ['openid' => $openid_identity, 'openidserver' => $openid_server], ['uid' => $record['uid']]); @@ -262,8 +266,8 @@ class Authentication $this->setForUser($a, $record, true, true); - $return_path = Session::get('return_path', ''); - Session::remove('return_path'); + $return_path = $this->session->get('return_path', ''); + $this->session->remove('return_path'); $this->baseUrl->redirect($return_path); } @@ -282,7 +286,7 @@ class Authentication */ public function setForUser(App $a, array $user_record, bool $login_initial = false, bool $interactive = false, bool $login_refresh = false) { - Session::setMultiple([ + $this->session->setMultiple([ 'uid' => $user_record['uid'], 'theme' => $user_record['theme'], 'mobile-theme' => PConfig::get($user_record['uid'], 'system', 'mobile_theme'), @@ -296,7 +300,7 @@ class Authentication Session::setVisitorsContacts(); $member_since = strtotime($user_record['register_date']); - Session::set('new_member', time() < ($member_since + (60 * 60 * 24 * 14))); + $this->session->set('new_member', time() < ($member_since + (60 * 60 * 24 * 14))); if (strlen($user_record['timezone'])) { date_default_timezone_set($user_record['timezone']); @@ -305,8 +309,8 @@ class Authentication $masterUid = $user_record['uid']; - if (Session::get('submanage')) { - $user = $this->dba->selectFirst('user', ['uid'], ['uid' => Session::get('submanage')]); + if ($this->session->get('submanage')) { + $user = $this->dba->selectFirst('user', ['uid'], ['uid' => $this->session->get('submanage')]); if ($this->dba->isResult($user)) { $masterUid = $user['uid']; } @@ -326,7 +330,7 @@ class Authentication if ($this->dba->isResult($contact)) { $a->contact = $contact; $a->cid = $contact['id']; - Session::set('cid', $a->cid); + $this->session->set('cid', $a->cid); } header('X-Account-Management-Status: active; name="' . $user_record['username'] . '"; id="' . $user_record['nickname'] . '"'); @@ -346,10 +350,10 @@ class Authentication * The cookie will be renewed automatically. * The week ensures that sessions will expire after some inactivity. */; - if (Session::get('remember')) { + if ($this->session->get('remember')) { $a->getLogger()->info('Injecting cookie for remembered user ' . $user_record['nickname']); $this->cookie->set($user_record['uid'], $user_record['password'], $user_record['prvKey']); - Session::remove('remember'); + $this->session->remove('remember'); } } @@ -370,8 +374,8 @@ class Authentication if ($login_initial) { Hook::callAll('logged_in', $a->user); - if ($a->module !== 'home' && Session::exists('return_path')) { - $this->baseUrl->redirect(Session::get('return_path')); + if ($a->module !== 'home' && $this->session->exists('return_path')) { + $this->baseUrl->redirect($this->session->get('return_path')); } } } @@ -395,7 +399,7 @@ class Authentication } // Case 1: 2FA session present and valid: return - if (Session::get('2fa')) { + if ($this->session->get('2fa')) { return; } diff --git a/src/Core/Session.php b/src/Core/Session.php index 140781d1c..ef26cd929 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -5,119 +5,50 @@ */ namespace Friendica\Core; -use Friendica\App; use Friendica\BaseObject; -use Friendica\Core\Cache\ICache; -use Friendica\Core\Session\CacheSessionHandler; -use Friendica\Core\Session\DatabaseSessionHandler; -use Friendica\Database\Database; +use Friendica\Core\Session\ISession; use Friendica\Database\DBA; use Friendica\Model\Contact; -use Friendica\Model\User; use Friendica\Util\Strings; -use Psr\Log\LoggerInterface; /** * High-level Session service class * * @author Hypolite Petovan */ -class Session +class Session extends BaseObject { public static $exists = false; public static $expire = 180000; - public static function init() - { - ini_set('session.gc_probability', 50); - ini_set('session.use_only_cookies', 1); - ini_set('session.cookie_httponly', 1); - - if (Config::get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) { - ini_set('session.cookie_secure', 1); - } - - $session_handler = Config::get('system', 'session_handler', 'database'); - if ($session_handler != 'native') { - if ($session_handler == 'cache' && Config::get('system', 'cache_driver', 'database') != 'database') { - $SessionHandler = new CacheSessionHandler( - BaseObject::getClass(ICache::class), - BaseObject::getClass(LoggerInterface::class), - $_SERVER - ); - } else { - $SessionHandler = new DatabaseSessionHandler( - BaseObject::getClass(Database::class), - BaseObject::getClass(LoggerInterface::class), - $_SERVER - ); - } - - session_set_save_handler($SessionHandler); - } - } - public static function exists($name) { - return isset($_SESSION[$name]); + return self::getClass(ISession::class)->exists($name); } - /** - * Retrieves a key from the session super global or the defaults if the key is missing or the value is falsy. - * - * Handle the case where session_start() hasn't been called and the super global isn't available. - * - * @param string $name - * @param mixed $defaults - * @return mixed - */ public static function get($name, $defaults = null) { - return $_SESSION[$name] ?? $defaults; + return self::getClass(ISession::class)->get($name, $defaults); } - /** - * Sets a single session variable. - * Overrides value of existing key. - * - * @param string $name - * @param mixed $value - */ public static function set($name, $value) { - $_SESSION[$name] = $value; + self::getClass(ISession::class)->set($name, $value); } - /** - * Sets multiple session variables. - * Overrides values for existing keys. - * - * @param array $values - */ public static function setMultiple(array $values) { - $_SESSION = $values + $_SESSION; + self::getClass(ISession::class)->setMultiple($values); } - /** - * Removes a session variable. - * Ignores missing keys. - * - * @param $name - */ public static function remove($name) { - unset($_SESSION[$name]); + self::getClass(ISession::class)->remove($name); } - /** - * Clears the current session array - */ public static function clear() { - session_unset(); - session_start(); - $_SESSION = []; + self::getClass(ISession::class)->clear(); } /** @@ -184,16 +115,8 @@ class Session return $_SESSION['authenticated']; } - /** - * @brief Kills the "Friendica" cookie and all session data - */ public static function delete() { - /** @var User\Cookie $cookie */ - $cookie = BaseObject::getClass(User\Cookie::class); - $cookie->clear(); - $_SESSION = []; - session_unset(); - session_destroy(); + self::getClass(ISession::class)->delete(); } } diff --git a/src/Core/Session/CacheSessionHandler.php b/src/Core/Session/CacheSession.php similarity index 77% rename from src/Core/Session/CacheSessionHandler.php rename to src/Core/Session/CacheSession.php index 218ec1440..fdf9aa6d4 100644 --- a/src/Core/Session/CacheSessionHandler.php +++ b/src/Core/Session/CacheSession.php @@ -3,7 +3,9 @@ namespace Friendica\Core\Session; use Friendica\Core\Cache\ICache; +use Friendica\Core\Config\Configuration; use Friendica\Core\Session; +use Friendica\Model\User\Cookie; use Psr\Log\LoggerInterface; use SessionHandlerInterface; @@ -12,7 +14,7 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -class CacheSessionHandler implements SessionHandlerInterface +final class CacheSession extends NativeSession implements SessionHandlerInterface { /** @var ICache */ private $cache; @@ -21,18 +23,15 @@ class CacheSessionHandler implements SessionHandlerInterface /** @var array The $_SERVER array */ private $server; - /** - * CacheSessionHandler constructor. - * - * @param ICache $cache - * @param LoggerInterface $logger - * @param array $server - */ - public function __construct(ICache $cache, LoggerInterface $logger, array $server) + public function __construct(Configuration $config, Cookie $cookie, ICache $cache, LoggerInterface $logger, array $server) { + parent::__construct($config, $cookie); + $this->cache = $cache; $this->logger = $logger; $this->server = $server; + + session_set_save_handler($this); } public function open($save_path, $session_name) @@ -64,8 +63,9 @@ class CacheSessionHandler implements SessionHandlerInterface * on the case. Uses the Session::expire for existing session, 5 minutes * for newly created session. * - * @param string $session_id Session ID with format: [a-z0-9]{26} - * @param string $session_data Serialized session data + * @param string $session_id Session ID with format: [a-z0-9]{26} + * @param string $session_data Serialized session data + * * @return boolean Returns false if parameters are missing, true otherwise * @throws \Exception */ diff --git a/src/Core/Session/DatabaseSessionHandler.php b/src/Core/Session/DatabaseSession.php similarity index 79% rename from src/Core/Session/DatabaseSessionHandler.php rename to src/Core/Session/DatabaseSession.php index 5d8441e35..c431be9aa 100644 --- a/src/Core/Session/DatabaseSessionHandler.php +++ b/src/Core/Session/DatabaseSession.php @@ -2,8 +2,10 @@ namespace Friendica\Core\Session; +use Friendica\Core\Config\Configuration; use Friendica\Core\Session; use Friendica\Database\Database; +use Friendica\Model\User\Cookie; use Psr\Log\LoggerInterface; use SessionHandlerInterface; @@ -12,7 +14,7 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -class DatabaseSessionHandler implements SessionHandlerInterface +final class DatabaseSession extends NativeSession implements SessionHandlerInterface { /** @var Database */ private $dba; @@ -28,11 +30,15 @@ class DatabaseSessionHandler implements SessionHandlerInterface * @param LoggerInterface $logger * @param array $server */ - public function __construct(Database $dba, LoggerInterface $logger, array $server) + public function __construct(Configuration $config, Cookie $cookie, Database $dba, LoggerInterface $logger, array $server) { + parent::__construct($config, $cookie); + $this->dba = $dba; $this->logger = $logger; $this->server = $server; + + session_set_save_handler($this); } public function open($save_path, $session_name) @@ -64,8 +70,9 @@ class DatabaseSessionHandler implements SessionHandlerInterface * on the case. Uses the Session::expire global for existing session, 5 minutes * for newly created session. * - * @param string $session_id Session ID with format: [a-z0-9]{26} - * @param string $session_data Serialized session data + * @param string $session_id Session ID with format: [a-z0-9]{26} + * @param string $session_data Serialized session data + * * @return boolean Returns false if parameters are missing, true otherwise * @throws \Exception */ @@ -79,11 +86,11 @@ class DatabaseSessionHandler implements SessionHandlerInterface return true; } - $expire = time() + Session::$expire; + $expire = time() + Session::$expire; $default_expire = time() + 300; if (Session::$exists) { - $fields = ['data' => $session_data, 'expire' => $expire]; + $fields = ['data' => $session_data, 'expire' => $expire]; $condition = ["`sid` = ? AND (`data` != ? OR `expire` != ?)", $session_id, $session_data, $expire]; $this->dba->update('session', $fields, $condition); } else { diff --git a/src/Core/Session/ISession.php b/src/Core/Session/ISession.php new file mode 100644 index 000000000..006cc6ce6 --- /dev/null +++ b/src/Core/Session/ISession.php @@ -0,0 +1,70 @@ +clear(); + return $this; + } + + /** + * @inheritDoc + */ + public function exists(string $name) + { + return isset($this->data[$name]); + } + + /** + * @inheritDoc + */ + public function get(string $name, $defaults = null) + { + return $this->data[$name] ?? $defaults; + } + + /** + * @inheritDoc + */ + public function set(string $name, $value) + { + $this->data[$name] = $value; + } + + /** + * @inheritDoc + */ + public function setMultiple(array $values) + { + foreach ($values as $key => $value) { + $this->data[$key] = $value; + } + } + + /** + * @inheritDoc + */ + public function remove(string $name) + { + if ($this->exists($name)) { + unset($this->data[$name]); + return true; + } + + return false; + } + + /** + * @inheritDoc + */ + public function clear() + { + $this->data = []; + return true; + } + + /** + * @inheritDoc + */ + public function delete() + { + $this->data = []; + return true; + } +} \ No newline at end of file diff --git a/src/Core/Session/NativeSession.php b/src/Core/Session/NativeSession.php new file mode 100644 index 000000000..2c1507dd1 --- /dev/null +++ b/src/Core/Session/NativeSession.php @@ -0,0 +1,94 @@ +get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) { + ini_set('session.cookie_secure', 1); + } + + $this->cookie = $cookie; + } + + /** + * {@inheritDoc} + */ + public function start() + { + session_start(); + return $this; + } + + /** + * {@inheritDoc}} + */ + public function exists(string $name) + { + return isset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function get(string $name, $defaults = null) + { + return $_SESSION[$name] ?? $defaults; + } + + /** + * {@inheritDoc} + */ + public function set(string $name, $value) + { + $_SESSION[$name] = $value; + } + + /** + * {@inheritDoc} + */ + public function setMultiple(array $values) + { + $_SESSION = $values + $_SESSION; + } + + /** + * {@inheritDoc} + */ + public function remove(string $name) + { + unset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function clear() + { + $_SESSION = []; + } + + /** + * @brief Kills the "Friendica" cookie and all session data + */ + public function delete() + { + $this->cookie->clear(); + $_SESSION = []; + session_unset(); + session_destroy(); + } +} diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php new file mode 100644 index 000000000..ed2f787b4 --- /dev/null +++ b/src/Factory/SessionFactory.php @@ -0,0 +1,79 @@ +isInstall() || $mode->isBackend()) { + $session = new MemorySession(); + } else { + $session_handler = $config->get('system', 'session_handler', self::DEFAULT); + + switch ($session_handler) { + case self::INTERNAL: + $session = new NativeSession($config, $cookie); + break; + case self::DATABASE: + default: + $session = new DatabaseSession($config, $cookie, $dba, $logger, $server); + break; + case self::CACHE: + // In case we're using the db as cache driver, use the native db session, not the cache + if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) { + $session = new DatabaseSession($config, $cookie, $dba, $logger, $server); + } else { + $session = new CacheSession($config, $cookie, $cache, $logger, $server); + } + break; + } + } + } finally { + $profiler->saveTimestamp($stamp1, 'parser', System::callstack()); + return $session; + } + } +} diff --git a/static/dependencies.config.php b/static/dependencies.config.php index fbc085f4b..ea9830679 100644 --- a/static/dependencies.config.php +++ b/static/dependencies.config.php @@ -6,6 +6,7 @@ use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Core\L10n\L10n; use Friendica\Core\Lock\ILock; +use Friendica\Core\Session\ISession; use Friendica\Database\Database; use Friendica\Factory; use Friendica\Util; @@ -179,4 +180,11 @@ return [ $_SERVER, $_GET ], ], + ISession::class => [ + 'instanceOf' => Factory\SessionFactory::class, + 'call' => [ + ['createSession', [$_SERVER], Dice::CHAIN_CALL], + ['start', [], Dice::CHAIN_CALL], + ], + ], ]; From cad7e534a42219f277928dfa53ac0a2b9a31a562 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 00:50:05 +0100 Subject: [PATCH 12/21] Add phpdoc --- src/Core/Session/ISession.php | 5 +++-- src/Core/Session/MemorySession.php | 2 -- src/Core/Session/NativeSession.php | 5 +++-- src/Factory/SessionFactory.php | 3 +++ 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Core/Session/ISession.php b/src/Core/Session/ISession.php index 006cc6ce6..a2046e915 100644 --- a/src/Core/Session/ISession.php +++ b/src/Core/Session/ISession.php @@ -2,8 +2,9 @@ namespace Friendica\Core\Session; -use Friendica\BaseObject; - +/** + * Contains all global supported Session methods + */ interface ISession { /** diff --git a/src/Core/Session/MemorySession.php b/src/Core/Session/MemorySession.php index 08838c433..eee481d3b 100644 --- a/src/Core/Session/MemorySession.php +++ b/src/Core/Session/MemorySession.php @@ -3,8 +3,6 @@ namespace Friendica\Core\Session; /** - * Native Session functions for internal Session usage. - * * Usable for backend processes (daemon/worker) and testing */ final class MemorySession implements ISession diff --git a/src/Core/Session/NativeSession.php b/src/Core/Session/NativeSession.php index 2c1507dd1..49278ed4a 100644 --- a/src/Core/Session/NativeSession.php +++ b/src/Core/Session/NativeSession.php @@ -6,6 +6,9 @@ use Friendica\Core\Config\Configuration; use Friendica\App; use Friendica\Model\User\Cookie; +/** + * The native Session class which uses the PHP internal Session function + */ class NativeSession implements ISession { /** @var Cookie */ @@ -88,7 +91,5 @@ class NativeSession implements ISession { $this->cookie->clear(); $_SESSION = []; - session_unset(); - session_destroy(); } } diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index ed2f787b4..999c424c9 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -18,6 +18,9 @@ use Friendica\Model\User\Cookie; use Friendica\Util\Profiler; use Psr\Log\LoggerInterface; +/** + * Factory for creating a valid Session for this run + */ class SessionFactory { /** @var string The plain, PHP internal session management */ From 26bd9569126a0f393b77013c99af066e236fb3ef Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 00:56:49 +0100 Subject: [PATCH 13/21] Optimize L10n usage for Session (reduce "App" complexity even more) --- src/App.php | 6 +----- src/Core/L10n/L10n.php | 24 +++++++++++++----------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/App.php b/src/App.php index eed91769f..06eea7a8a 100644 --- a/src/App.php +++ b/src/App.php @@ -674,11 +674,7 @@ class App } // Exclude the backend processes from the session management - if (!$this->mode->isBackend()) { - $this->l10n->setSessionVariable(); - $this->l10n->setLangFromSession(); - } else { - $_SESSION = []; + if ($this->mode->isBackend()) { Core\Worker::executeIfIdle(); } diff --git a/src/Core/L10n/L10n.php b/src/Core/L10n/L10n.php index ce930b402..28b788e26 100644 --- a/src/Core/L10n/L10n.php +++ b/src/Core/L10n/L10n.php @@ -4,7 +4,7 @@ namespace Friendica\Core\L10n; use Friendica\Core\Config\Configuration; use Friendica\Core\Hook; -use Friendica\Core\Session; +use Friendica\Core\Session\ISession; use Friendica\Database\Database; use Friendica\Util\Strings; use Psr\Log\LoggerInterface; @@ -53,12 +53,14 @@ class L10n */ private $logger; - public function __construct(Configuration $config, Database $dba, LoggerInterface $logger, array $server, array $get) + public function __construct(Configuration $config, Database $dba, LoggerInterface $logger, ISession $session, array $server, array $get) { $this->dba = $dba; $this->logger = $logger; $this->loadTranslationTable(L10n::detectLanguage($server, $get, $config->get('system', 'language', 'en'))); + $this->setSessionVariable($session); + $this->setLangFromSession($session); } /** @@ -74,28 +76,28 @@ class L10n /** * Sets the language session variable */ - public function setSessionVariable() + private function setSessionVariable(ISession $session) { - if (Session::get('authenticated') && !Session::get('language')) { - $_SESSION['language'] = $this->lang; + if ($session->get('authenticated') && !$session->get('language')) { + $session->set('language', $this->lang); // we haven't loaded user data yet, but we need user language - if (Session::get('uid')) { + if ($session->get('uid')) { $user = $this->dba->selectFirst('user', ['language'], ['uid' => $_SESSION['uid']]); if ($this->dba->isResult($user)) { - $_SESSION['language'] = $user['language']; + $session->set('language', $user['language']); } } } if (isset($_GET['lang'])) { - Session::set('language', $_GET['lang']); + $session->set('language', $_GET['lang']); } } - public function setLangFromSession() + private function setLangFromSession(ISession $session) { - if (Session::get('language') !== $this->lang) { - $this->loadTranslationTable(Session::get('language')); + if ($session->get('language') !== $this->lang) { + $this->loadTranslationTable($session->get('language')); } } From ce2610000b8602fadec8fa1f71a94a815f2cba20 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 08:49:33 +0100 Subject: [PATCH 14/21] Renaming class --- .../Session/{CacheSession.php => Cache.php} | 2 +- .../{DatabaseSession.php => Database.php} | 2 +- .../Session/{MemorySession.php => Memory.php} | 5 ++++- .../Session/{NativeSession.php => Native.php} | 2 +- src/Factory/SessionFactory.php | 18 +++++++++--------- 5 files changed, 16 insertions(+), 13 deletions(-) rename src/Core/Session/{CacheSession.php => Cache.php} (96%) rename src/Core/Session/{DatabaseSession.php => Database.php} (97%) rename src/Core/Session/{MemorySession.php => Memory.php} (87%) rename src/Core/Session/{NativeSession.php => Native.php} (97%) diff --git a/src/Core/Session/CacheSession.php b/src/Core/Session/Cache.php similarity index 96% rename from src/Core/Session/CacheSession.php rename to src/Core/Session/Cache.php index fdf9aa6d4..f5dee0fab 100644 --- a/src/Core/Session/CacheSession.php +++ b/src/Core/Session/Cache.php @@ -14,7 +14,7 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -final class CacheSession extends NativeSession implements SessionHandlerInterface +final class Cache extends Native implements SessionHandlerInterface { /** @var ICache */ private $cache; diff --git a/src/Core/Session/DatabaseSession.php b/src/Core/Session/Database.php similarity index 97% rename from src/Core/Session/DatabaseSession.php rename to src/Core/Session/Database.php index c431be9aa..5874c5d4f 100644 --- a/src/Core/Session/DatabaseSession.php +++ b/src/Core/Session/Database.php @@ -14,7 +14,7 @@ use SessionHandlerInterface; * * @author Hypolite Petovan */ -final class DatabaseSession extends NativeSession implements SessionHandlerInterface +final class Database extends Native implements SessionHandlerInterface { /** @var Database */ private $dba; diff --git a/src/Core/Session/MemorySession.php b/src/Core/Session/Memory.php similarity index 87% rename from src/Core/Session/MemorySession.php rename to src/Core/Session/Memory.php index eee481d3b..a7e336627 100644 --- a/src/Core/Session/MemorySession.php +++ b/src/Core/Session/Memory.php @@ -5,12 +5,15 @@ namespace Friendica\Core\Session; /** * Usable for backend processes (daemon/worker) and testing */ -final class MemorySession implements ISession +final class Memory implements ISession { private $data = []; public function start() { + // Backward compatibility until all Session variables are replaced + // with the Session class + $_SESSION = []; $this->clear(); return $this; } diff --git a/src/Core/Session/NativeSession.php b/src/Core/Session/Native.php similarity index 97% rename from src/Core/Session/NativeSession.php rename to src/Core/Session/Native.php index 49278ed4a..b7f992b27 100644 --- a/src/Core/Session/NativeSession.php +++ b/src/Core/Session/Native.php @@ -9,7 +9,7 @@ use Friendica\Model\User\Cookie; /** * The native Session class which uses the PHP internal Session function */ -class NativeSession implements ISession +class Native implements ISession { /** @var Cookie */ protected $cookie; diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index 999c424c9..47baa7470 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -6,12 +6,12 @@ use Friendica\App; use Friendica\Core\Cache\Cache; use Friendica\Core\Cache\ICache; use Friendica\Core\Config\Configuration; -use Friendica\Core\Session\CacheSession; -use Friendica\Core\Session\DatabaseSession; +use Friendica\Core\Session\Cache; +use Friendica\Core\Session\Database; use Friendica\Core\Session\ISession; use Friendica\Core\Session\Memory; -use Friendica\Core\Session\MemorySession; -use Friendica\Core\Session\NativeSession; +use Friendica\Core\Session\Memory; +use Friendica\Core\Session\Native; use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Model\User\Cookie; @@ -52,24 +52,24 @@ class SessionFactory try { if ($mode->isInstall() || $mode->isBackend()) { - $session = new MemorySession(); + $session = new Memory(); } else { $session_handler = $config->get('system', 'session_handler', self::DEFAULT); switch ($session_handler) { case self::INTERNAL: - $session = new NativeSession($config, $cookie); + $session = new Native($config, $cookie); break; case self::DATABASE: default: - $session = new DatabaseSession($config, $cookie, $dba, $logger, $server); + $session = new Database($config, $cookie, $dba, $logger, $server); break; case self::CACHE: // In case we're using the db as cache driver, use the native db session, not the cache if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) { - $session = new DatabaseSession($config, $cookie, $dba, $logger, $server); + $session = new Database($config, $cookie, $dba, $logger, $server); } else { - $session = new CacheSession($config, $cookie, $cache, $logger, $server); + $session = new Cache($config, $cookie, $cache, $logger, $server); } break; } From 07d290992772184518e853b97668c8075246e524 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 21:51:06 +0100 Subject: [PATCH 15/21] double use --- src/Factory/SessionFactory.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index 47baa7470..f2bfd10d4 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -6,11 +6,8 @@ use Friendica\App; use Friendica\Core\Cache\Cache; use Friendica\Core\Cache\ICache; use Friendica\Core\Config\Configuration; -use Friendica\Core\Session\Cache; -use Friendica\Core\Session\Database; use Friendica\Core\Session\ISession; use Friendica\Core\Session\Memory; -use Friendica\Core\Session\Memory; use Friendica\Core\Session\Native; use Friendica\Core\System; use Friendica\Database\Database; From eca3396851ab71f218d6f47cca89444164acde9a Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 21:52:23 +0100 Subject: [PATCH 16/21] rename usage --- src/Factory/SessionFactory.php | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index f2bfd10d4..e87f8bd2b 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -6,9 +6,7 @@ use Friendica\App; use Friendica\Core\Cache\Cache; use Friendica\Core\Cache\ICache; use Friendica\Core\Config\Configuration; -use Friendica\Core\Session\ISession; -use Friendica\Core\Session\Memory; -use Friendica\Core\Session\Native; +use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Model\User\Cookie; @@ -40,7 +38,7 @@ class SessionFactory * @param LoggerInterface $logger * @param array $server * - * @return ISession + * @return Session\ISession */ public function createSession(App\Mode $mode, Configuration $config, Cookie $cookie, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = []) { @@ -49,24 +47,24 @@ class SessionFactory try { if ($mode->isInstall() || $mode->isBackend()) { - $session = new Memory(); + $session = new Session\Memory(); } else { $session_handler = $config->get('system', 'session_handler', self::DEFAULT); switch ($session_handler) { case self::INTERNAL: - $session = new Native($config, $cookie); + $session = new Session\Native($config, $cookie); break; case self::DATABASE: default: - $session = new Database($config, $cookie, $dba, $logger, $server); + $session = new Session\Database($config, $cookie, $dba, $logger, $server); break; case self::CACHE: // In case we're using the db as cache driver, use the native db session, not the cache if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) { - $session = new Database($config, $cookie, $dba, $logger, $server); + $session = new Session\Database($config, $cookie, $dba, $logger, $server); } else { - $session = new Cache($config, $cookie, $cache, $logger, $server); + $session = new Session\Cache($config, $cookie, $cache, $logger, $server); } break; } From b9f8762eb3b4f125dcdf5335cd992466b79a5ef6 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 22:29:49 +0100 Subject: [PATCH 17/21] Use Native Session functions (global "$_SESSION" variable) for Memory class because of the direct usage of the $_SESSION class all around the codebase --- src/Core/Session/Database.php | 6 +-- src/Core/Session/Memory.php | 73 ++-------------------------------- src/Factory/SessionFactory.php | 2 +- tests/include/ApiTest.php | 5 +++ 4 files changed, 13 insertions(+), 73 deletions(-) diff --git a/src/Core/Session/Database.php b/src/Core/Session/Database.php index 5874c5d4f..105110022 100644 --- a/src/Core/Session/Database.php +++ b/src/Core/Session/Database.php @@ -4,7 +4,7 @@ namespace Friendica\Core\Session; use Friendica\Core\Config\Configuration; use Friendica\Core\Session; -use Friendica\Database\Database; +use Friendica\Database\Database as DBA; use Friendica\Model\User\Cookie; use Psr\Log\LoggerInterface; use SessionHandlerInterface; @@ -16,7 +16,7 @@ use SessionHandlerInterface; */ final class Database extends Native implements SessionHandlerInterface { - /** @var Database */ + /** @var DBA */ private $dba; /** @var LoggerInterface */ private $logger; @@ -30,7 +30,7 @@ final class Database extends Native implements SessionHandlerInterface * @param LoggerInterface $logger * @param array $server */ - public function __construct(Configuration $config, Cookie $cookie, Database $dba, LoggerInterface $logger, array $server) + public function __construct(Configuration $config, Cookie $cookie, DBA $dba, LoggerInterface $logger, array $server) { parent::__construct($config, $cookie); diff --git a/src/Core/Session/Memory.php b/src/Core/Session/Memory.php index a7e336627..b39234db2 100644 --- a/src/Core/Session/Memory.php +++ b/src/Core/Session/Memory.php @@ -4,11 +4,11 @@ namespace Friendica\Core\Session; /** * Usable for backend processes (daemon/worker) and testing + * + * @todo after replacing the last direct $_SESSION call, use a internal array instead of the global variable */ -final class Memory implements ISession +final class Memory extends Native { - private $data = []; - public function start() { // Backward compatibility until all Session variables are replaced @@ -17,69 +17,4 @@ final class Memory implements ISession $this->clear(); return $this; } - - /** - * @inheritDoc - */ - public function exists(string $name) - { - return isset($this->data[$name]); - } - - /** - * @inheritDoc - */ - public function get(string $name, $defaults = null) - { - return $this->data[$name] ?? $defaults; - } - - /** - * @inheritDoc - */ - public function set(string $name, $value) - { - $this->data[$name] = $value; - } - - /** - * @inheritDoc - */ - public function setMultiple(array $values) - { - foreach ($values as $key => $value) { - $this->data[$key] = $value; - } - } - - /** - * @inheritDoc - */ - public function remove(string $name) - { - if ($this->exists($name)) { - unset($this->data[$name]); - return true; - } - - return false; - } - - /** - * @inheritDoc - */ - public function clear() - { - $this->data = []; - return true; - } - - /** - * @inheritDoc - */ - public function delete() - { - $this->data = []; - return true; - } -} \ No newline at end of file +} diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index e87f8bd2b..f4268a2b9 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -47,7 +47,7 @@ class SessionFactory try { if ($mode->isInstall() || $mode->isBackend()) { - $session = new Session\Memory(); + $session = new Session\Memory($config, $cookie); } else { $session_handler = $config->get('system', 'session_handler', self::DEFAULT); diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index 245529fb2..1419f7d7f 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -11,6 +11,7 @@ use Friendica\BaseObject; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; use Friendica\Core\Protocol; +use Friendica\Core\Session\ISession; use Friendica\Core\System; use Friendica\Database\Database; use Friendica\Network\HTTPException; @@ -111,6 +112,10 @@ class ApiTest extends DatabaseTest // User ID that we know is not in the database $this->wrongUserId = 666; + /** @var ISession $session */ + $session = BaseObject::getClass(ISession::class); + $session->start(); + // Most API require login so we force the session $_SESSION = [ 'allow_api' => true, From af1299c69758594b0e36f55b1a431f9531be23d3 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 22:56:56 +0100 Subject: [PATCH 18/21] Add memory session for API tests --- tests/include/ApiTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index 1419f7d7f..63e8d2345 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -11,6 +11,7 @@ use Friendica\BaseObject; use Friendica\Core\Config\Configuration; use Friendica\Core\Config\PConfiguration; use Friendica\Core\Protocol; +use Friendica\Core\Session; use Friendica\Core\Session\ISession; use Friendica\Core\System; use Friendica\Database\Database; @@ -60,7 +61,8 @@ class ApiTest extends DatabaseTest $this->dice = (new Dice()) ->addRules(include __DIR__ . '/../../static/dependencies.config.php') - ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]); + ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]) + ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true]); BaseObject::setDependencyInjection($this->dice); /** @var Database $dba */ From 02c40ad1cbc66cadea77180b8b9340521381cce5 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Tue, 10 Dec 2019 23:35:16 +0100 Subject: [PATCH 19/21] Overwrite constructor of Memory session handling so no session ini-setting in backend/testing environments are possible --- src/Core/Session/Memory.php | 8 ++++++++ tests/include/ApiTest.php | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Core/Session/Memory.php b/src/Core/Session/Memory.php index b39234db2..f8d02b553 100644 --- a/src/Core/Session/Memory.php +++ b/src/Core/Session/Memory.php @@ -2,6 +2,9 @@ namespace Friendica\Core\Session; +use Friendica\Core\Config\Configuration; +use Friendica\Model\User\Cookie; + /** * Usable for backend processes (daemon/worker) and testing * @@ -9,6 +12,11 @@ namespace Friendica\Core\Session; */ final class Memory extends Native { + public function __construct(Configuration $config, Cookie $cookie) + { + $this->cookie = $cookie; + } + public function start() { // Backward compatibility until all Session variables are replaced diff --git a/tests/include/ApiTest.php b/tests/include/ApiTest.php index 63e8d2345..ef46a4d44 100644 --- a/tests/include/ApiTest.php +++ b/tests/include/ApiTest.php @@ -62,7 +62,7 @@ class ApiTest extends DatabaseTest $this->dice = (new Dice()) ->addRules(include __DIR__ . '/../../static/dependencies.config.php') ->addRule(Database::class, ['instanceOf' => StaticDatabase::class, 'shared' => true]) - ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true]); + ->addRule(ISession::class, ['instanceOf' => Session\Memory::class, 'shared' => true, 'call' => null]); BaseObject::setDependencyInjection($this->dice); /** @var Database $dba */ From 1408908c845adbdd0dd5a1f63849844142c3aff1 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Wed, 11 Dec 2019 20:30:31 +0100 Subject: [PATCH 20/21] Refactor Session Handling (make it more simple & handler are now handler again) --- src/Core/Session.php | 35 ++++----- src/Core/Session/AbstractSession.php | 76 ++++++++++++++++++++ src/Core/Session/{ => Handler}/Cache.php | 12 +--- src/Core/Session/{ => Handler}/Database.php | 14 ++-- src/Core/Session/ISession.php | 10 +-- src/Core/Session/Memory.php | 12 +--- src/Core/Session/Native.php | 78 +++------------------ src/Factory/SessionFactory.php | 36 +++++----- src/Model/User/Cookie.php | 4 +- src/Module/Logout.php | 2 +- tests/functional/DependencyCheckTest.php | 4 ++ 11 files changed, 143 insertions(+), 140 deletions(-) create mode 100644 src/Core/Session/AbstractSession.php rename src/Core/Session/{ => Handler}/Cache.php (82%) rename src/Core/Session/{ => Handler}/Database.php (85%) diff --git a/src/Core/Session.php b/src/Core/Session.php index ef26cd929..0557ce81b 100644 --- a/src/Core/Session.php +++ b/src/Core/Session.php @@ -59,11 +59,14 @@ class Session extends BaseObject */ public static function getRemoteContactID($uid) { - if (empty($_SESSION['remote'][$uid])) { + /** @var ISession $session */ + $session = self::getClass(ISession::class); + + if (empty($session->get('remote')[$uid])) { return false; } - return $_SESSION['remote'][$uid]; + return $session->get('remote')[$uid]; } /** @@ -74,11 +77,14 @@ class Session extends BaseObject */ public static function getUserIDForVisitorContactID($cid) { - if (empty($_SESSION['remote'])) { + /** @var ISession $session */ + $session = self::getClass(ISession::class); + + if (empty($session->get('remote'))) { return false; } - return array_search($cid, $_SESSION['remote']); + return array_search($cid, $session->get('remote')); } /** @@ -88,15 +94,18 @@ class Session extends BaseObject */ public static function setVisitorsContacts() { - $_SESSION['remote'] = []; + /** @var ISession $session */ + $session = self::getClass(ISession::class); - $remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($_SESSION['my_url']), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]); + $session->set('remote', []); + + $remote_contacts = DBA::select('contact', ['id', 'uid'], ['nurl' => Strings::normaliseLink($session->get('my_url')), 'rel' => [Contact::FOLLOWER, Contact::FRIEND], 'self' => false]); while ($contact = DBA::fetch($remote_contacts)) { if (($contact['uid'] == 0) || Contact::isBlockedByUser($contact['id'], $contact['uid'])) { continue; } - $_SESSION['remote'][$contact['uid']] = $contact['id']; + $session->set('remote', [$contact['uid'] => $contact['id']]); } DBA::close($remote_contacts); } @@ -108,15 +117,9 @@ class Session extends BaseObject */ public static function isAuthenticated() { - if (empty($_SESSION['authenticated'])) { - return false; - } + /** @var ISession $session */ + $session = self::getClass(ISession::class); - return $_SESSION['authenticated']; - } - - public static function delete() - { - self::getClass(ISession::class)->delete(); + return $session->get('authenticated', false); } } diff --git a/src/Core/Session/AbstractSession.php b/src/Core/Session/AbstractSession.php new file mode 100644 index 000000000..58649a6bd --- /dev/null +++ b/src/Core/Session/AbstractSession.php @@ -0,0 +1,76 @@ +cookie = $cookie; + } + + /** + * {@inheritDoc} + */ + public function start() + { + return $this; + } + + /** + * {@inheritDoc}} + */ + public function exists(string $name) + { + return isset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function get(string $name, $defaults = null) + { + return $_SESSION[$name] ?? $defaults; + } + + /** + * {@inheritDoc} + */ + public function set(string $name, $value) + { + $_SESSION[$name] = $value; + } + + /** + * {@inheritDoc} + */ + public function setMultiple(array $values) + { + $_SESSION = $values + $_SESSION; + } + + /** + * {@inheritDoc} + */ + public function remove(string $name) + { + unset($_SESSION[$name]); + } + + /** + * {@inheritDoc} + */ + public function clear() + { + $_SESSION = []; + } +} diff --git a/src/Core/Session/Cache.php b/src/Core/Session/Handler/Cache.php similarity index 82% rename from src/Core/Session/Cache.php rename to src/Core/Session/Handler/Cache.php index f5dee0fab..ecd266adb 100644 --- a/src/Core/Session/Cache.php +++ b/src/Core/Session/Handler/Cache.php @@ -1,11 +1,9 @@ */ -final class Cache extends Native implements SessionHandlerInterface +final class Cache implements SessionHandlerInterface { /** @var ICache */ private $cache; @@ -23,15 +21,11 @@ final class Cache extends Native implements SessionHandlerInterface /** @var array The $_SERVER array */ private $server; - public function __construct(Configuration $config, Cookie $cookie, ICache $cache, LoggerInterface $logger, array $server) + public function __construct(ICache $cache, LoggerInterface $logger, array $server) { - parent::__construct($config, $cookie); - $this->cache = $cache; $this->logger = $logger; $this->server = $server; - - session_set_save_handler($this); } public function open($save_path, $session_name) diff --git a/src/Core/Session/Database.php b/src/Core/Session/Handler/Database.php similarity index 85% rename from src/Core/Session/Database.php rename to src/Core/Session/Handler/Database.php index 105110022..e8151dddc 100644 --- a/src/Core/Session/Database.php +++ b/src/Core/Session/Handler/Database.php @@ -1,11 +1,9 @@ */ -final class Database extends Native implements SessionHandlerInterface +final class Database implements SessionHandlerInterface { /** @var DBA */ private $dba; @@ -26,19 +24,15 @@ final class Database extends Native implements SessionHandlerInterface /** * DatabaseSessionHandler constructor. * - * @param Database $dba + * @param DBA $dba * @param LoggerInterface $logger * @param array $server */ - public function __construct(Configuration $config, Cookie $cookie, DBA $dba, LoggerInterface $logger, array $server) + public function __construct(DBA $dba, LoggerInterface $logger, array $server) { - parent::__construct($config, $cookie); - $this->dba = $dba; $this->logger = $logger; $this->server = $server; - - session_set_save_handler($this); } public function open($save_path, $session_name) diff --git a/src/Core/Session/ISession.php b/src/Core/Session/ISession.php index a2046e915..dbc7fd85b 100644 --- a/src/Core/Session/ISession.php +++ b/src/Core/Session/ISession.php @@ -29,7 +29,8 @@ interface ISession * Handle the case where session_start() hasn't been called and the super global isn't available. * * @param string $name - * @param mixed $defaults + * @param mixed $defaults + * * @return mixed */ public function get(string $name, $defaults = null); @@ -39,7 +40,7 @@ interface ISession * Overrides value of existing key. * * @param string $name - * @param mixed $value + * @param mixed $value */ public function set(string $name, $value); @@ -63,9 +64,4 @@ interface ISession * Clears the current session array */ public function clear(); - - /** - * Kills the "Friendica" cookie and all session data - */ - public function delete(); } diff --git a/src/Core/Session/Memory.php b/src/Core/Session/Memory.php index f8d02b553..de03ea15c 100644 --- a/src/Core/Session/Memory.php +++ b/src/Core/Session/Memory.php @@ -2,7 +2,6 @@ namespace Friendica\Core\Session; -use Friendica\Core\Config\Configuration; use Friendica\Model\User\Cookie; /** @@ -10,19 +9,14 @@ use Friendica\Model\User\Cookie; * * @todo after replacing the last direct $_SESSION call, use a internal array instead of the global variable */ -final class Memory extends Native +final class Memory extends AbstractSession implements ISession { - public function __construct(Configuration $config, Cookie $cookie) + public function __construct(Cookie $cookie) { - $this->cookie = $cookie; - } + parent::__construct($cookie); - public function start() - { // Backward compatibility until all Session variables are replaced // with the Session class $_SESSION = []; - $this->clear(); - return $this; } } diff --git a/src/Core/Session/Native.php b/src/Core/Session/Native.php index b7f992b27..997ac43f6 100644 --- a/src/Core/Session/Native.php +++ b/src/Core/Session/Native.php @@ -2,29 +2,30 @@ namespace Friendica\Core\Session; -use Friendica\Core\Config\Configuration; use Friendica\App; use Friendica\Model\User\Cookie; +use SessionHandlerInterface; /** - * The native Session class which uses the PHP internal Session function + * The native Session class which uses the PHP internal Session functions */ -class Native implements ISession +final class Native extends AbstractSession implements ISession { - /** @var Cookie */ - protected $cookie; - - public function __construct(Configuration $config, Cookie $cookie) + public function __construct(App\BaseURL $baseURL, Cookie $cookie, SessionHandlerInterface $handler = null) { + parent::__construct($cookie); + ini_set('session.gc_probability', 50); ini_set('session.use_only_cookies', 1); - ini_set('session.cookie_httponly', 1); + ini_set('session.cookie_httponly', (int)Cookie::HTTPONLY); - if ($config->get('system', 'ssl_policy') == App\BaseURL::SSL_POLICY_FULL) { + if ($baseURL->getSSLPolicy() == App\BaseURL::SSL_POLICY_FULL) { ini_set('session.cookie_secure', 1); } - $this->cookie = $cookie; + if (isset($handler)) { + session_set_save_handler($handler); + } } /** @@ -35,61 +36,4 @@ class Native implements ISession session_start(); return $this; } - - /** - * {@inheritDoc}} - */ - public function exists(string $name) - { - return isset($_SESSION[$name]); - } - - /** - * {@inheritDoc} - */ - public function get(string $name, $defaults = null) - { - return $_SESSION[$name] ?? $defaults; - } - - /** - * {@inheritDoc} - */ - public function set(string $name, $value) - { - $_SESSION[$name] = $value; - } - - /** - * {@inheritDoc} - */ - public function setMultiple(array $values) - { - $_SESSION = $values + $_SESSION; - } - - /** - * {@inheritDoc} - */ - public function remove(string $name) - { - unset($_SESSION[$name]); - } - - /** - * {@inheritDoc} - */ - public function clear() - { - $_SESSION = []; - } - - /** - * @brief Kills the "Friendica" cookie and all session data - */ - public function delete() - { - $this->cookie->clear(); - $_SESSION = []; - } } diff --git a/src/Factory/SessionFactory.php b/src/Factory/SessionFactory.php index f4268a2b9..017eab0ad 100644 --- a/src/Factory/SessionFactory.php +++ b/src/Factory/SessionFactory.php @@ -19,18 +19,17 @@ use Psr\Log\LoggerInterface; class SessionFactory { /** @var string The plain, PHP internal session management */ - const INTERNAL = 'native'; + const HANDLER_NATIVE = 'native'; /** @var string Using the database for session management */ - const DATABASE = 'database'; + const HANDLER_DATABASE = 'database'; /** @var string Using the cache for session management */ - const CACHE = 'cache'; - /** @var string A temporary cached session */ - const MEMORY = 'memory'; - /** @var string The default type for Session management in case of no config */ - const DEFAULT = self::DATABASE; + const HANDLER_CACHE = 'cache'; + + const HANDLER_DEFAULT = self::HANDLER_DATABASE; /** * @param App\Mode $mode + * @param App\BaseURL $baseURL * @param Configuration $config * @param Cookie $cookie * @param Database $dba @@ -40,34 +39,33 @@ class SessionFactory * * @return Session\ISession */ - public function createSession(App\Mode $mode, Configuration $config, Cookie $cookie, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = []) + public function createSession(App\Mode $mode, App\BaseURL $baseURL, Configuration $config, Cookie $cookie, Database $dba, ICache $cache, LoggerInterface $logger, Profiler $profiler, array $server = []) { $stamp1 = microtime(true); $session = null; try { if ($mode->isInstall() || $mode->isBackend()) { - $session = new Session\Memory($config, $cookie); + $session = new Session\Memory($cookie); } else { - $session_handler = $config->get('system', 'session_handler', self::DEFAULT); + $session_handler = $config->get('system', 'session_handler', self::HANDLER_DEFAULT); + $handler = null; switch ($session_handler) { - case self::INTERNAL: - $session = new Session\Native($config, $cookie); + case self::HANDLER_DATABASE: + $handler = new Session\Handler\Database($dba, $logger, $server); break; - case self::DATABASE: - default: - $session = new Session\Database($config, $cookie, $dba, $logger, $server); - break; - case self::CACHE: + case self::HANDLER_CACHE: // In case we're using the db as cache driver, use the native db session, not the cache if ($config->get('system', 'cache_driver') === Cache::TYPE_DATABASE) { - $session = new Session\Database($config, $cookie, $dba, $logger, $server); + $handler = new Session\Handler\Database($dba, $logger, $server); } else { - $session = new Session\Cache($config, $cookie, $cache, $logger, $server); + $handler = new Session\Handler\Cache($cache, $logger, $server); } break; } + + $session = new Session\Native($baseURL, $cookie, $handler); } } finally { $profiler->saveTimestamp($stamp1, 'parser', System::callstack()); diff --git a/src/Model/User/Cookie.php b/src/Model/User/Cookie.php index f85d81868..0fc90222f 100644 --- a/src/Model/User/Cookie.php +++ b/src/Model/User/Cookie.php @@ -32,13 +32,13 @@ class Cookie /** @var array The $_COOKIE array */ private $cookie; - public function __construct(Configuration $config, array $server = [], array $cookie = []) + public function __construct(Configuration $config, App\BaseURL $baseURL, array $server = [], array $cookie = []) { if (!empty($server['REMOTE_ADDR'])) { $this->remoteAddr = $server['REMOTE_ADDR']; } - $this->sslEnabled = $config->get('system', 'ssl_policy') === App\BaseURL::SSL_POLICY_FULL; + $this->sslEnabled = $baseURL->getSSLPolicy() === App\BaseURL::SSL_POLICY_FULL; $this->sitePrivateKey = $config->get('system', 'site_prvkey'); $authCookieDays = $config->get('system', 'auth_cookie_lifetime', diff --git a/src/Module/Logout.php b/src/Module/Logout.php index 89910107d..9e6c674b3 100644 --- a/src/Module/Logout.php +++ b/src/Module/Logout.php @@ -33,7 +33,7 @@ class Logout extends BaseModule } Hook::callAll("logging_out"); - Session::delete(); + Session::clear(); if ($visitor_home) { System::externalRedirect($visitor_home); diff --git a/tests/functional/DependencyCheckTest.php b/tests/functional/DependencyCheckTest.php index 6de2dc647..336a34c34 100644 --- a/tests/functional/DependencyCheckTest.php +++ b/tests/functional/DependencyCheckTest.php @@ -133,6 +133,10 @@ class dependencyCheck extends TestCase public function testDevLogger() { + /** @var Configuration $config */ + $config = $this->dice->create(Configuration::class); + $config->set('system', 'dlogfile', $this->root->url() . '/friendica.log'); + /** @var LoggerInterface $logger */ $logger = $this->dice->create('$devLogger', ['dev']); From b82294826d8503aaf9514b3de693349f5a9260d6 Mon Sep 17 00:00:00 2001 From: nupplaPhil Date: Wed, 11 Dec 2019 20:49:53 +0100 Subject: [PATCH 21/21] fix CookieTest --- tests/src/Model/User/CookieTest.php | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/tests/src/Model/User/CookieTest.php b/tests/src/Model/User/CookieTest.php index bff1698e8..b689fc97c 100644 --- a/tests/src/Model/User/CookieTest.php +++ b/tests/src/Model/User/CookieTest.php @@ -2,6 +2,7 @@ namespace Friendica\Testsrc\Model\User; +use Friendica\App\BaseURL; use Friendica\Core\Config\Configuration; use Friendica\Model\User\Cookie; use Friendica\Test\DatabaseTest; @@ -12,6 +13,8 @@ class CookieTest extends DatabaseTest { /** @var MockInterface|Configuration */ private $config; + /** @var MockInterface|BaseURL */ + private $baseUrl; protected function setUp() { @@ -20,6 +23,7 @@ class CookieTest extends DatabaseTest parent::setUp(); $this->config = \Mockery::mock(Configuration::class); + $this->baseUrl = \Mockery::mock(BaseURL::class); } protected function tearDown() @@ -32,11 +36,11 @@ class CookieTest extends DatabaseTest */ public function testInstance() { - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn('1235')->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); - $cookie = new Cookie($this->config, []); + $cookie = new Cookie($this->config, $this->baseUrl); $this->assertInstanceOf(Cookie::class, $cookie); } @@ -96,11 +100,11 @@ class CookieTest extends DatabaseTest */ public function testGet(array $cookieData, bool $hasValues, $uid, $hash, $ip) { - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn('1235')->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); - $cookie = new Cookie($this->config, [], $cookieData); + $cookie = new Cookie($this->config, $this->baseUrl, [], $cookieData); $this->assertInstanceOf(Cookie::class, $cookie); $assertData = $cookie->getData(); @@ -164,11 +168,11 @@ class CookieTest extends DatabaseTest */ public function testCheck(string $serverPrivateKey, string $userPrivateKey, string $password, string $assertHash, bool $assertTrue) { - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverPrivateKey)->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn('7')->once(); - $cookie = new Cookie($this->config, []); + $cookie = new Cookie($this->config, $this->baseUrl); $this->assertInstanceOf(Cookie::class, $cookie); $this->assertEquals($assertTrue, $cookie->check($assertHash, $password, $userPrivateKey)); @@ -247,11 +251,11 @@ class CookieTest extends DatabaseTest */ public function testSet($serverKey, $uid, $password, $privateKey, $assertHash, $remoteIp, $serverArray, $lifetime) { - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverKey)->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); - $cookie = new StaticCookie($this->config, $serverArray); + $cookie = new StaticCookie($this->config, $this->baseUrl, $serverArray); $this->assertInstanceOf(Cookie::class, $cookie); $cookie->set($uid, $password, $privateKey, $lifetime); @@ -266,11 +270,11 @@ class CookieTest extends DatabaseTest */ public function testDoubleSet($serverKey, $uid, $password, $privateKey, $assertHash, $remoteIp, $serverArray, $lifetime) { - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn($serverKey)->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); - $cookie = new StaticCookie($this->config, $serverArray); + $cookie = new StaticCookie($this->config, $this->baseUrl, $serverArray); $this->assertInstanceOf(Cookie::class, $cookie); // Invalid set, should get overwritten @@ -290,11 +294,11 @@ class CookieTest extends DatabaseTest Cookie::NAME => 'test' ]; - $this->config->shouldReceive('get')->with('system', 'ssl_policy')->andReturn(1)->once(); + $this->baseUrl->shouldReceive('getSSLPolicy')->andReturn(true)->once(); $this->config->shouldReceive('get')->with('system', 'site_prvkey')->andReturn(24)->once(); $this->config->shouldReceive('get')->with('system', 'auth_cookie_lifetime', Cookie::DEFAULT_EXPIRE)->andReturn(Cookie::DEFAULT_EXPIRE)->once(); - $cookie = new StaticCookie($this->config, []); + $cookie = new StaticCookie($this->config, $this->baseUrl); $this->assertInstanceOf(Cookie::class, $cookie); $this->assertEquals('test', StaticCookie::$_COOKIE[Cookie::NAME]);