Merge branch 'master' into develop

This commit is contained in:
Hypolite Petovan 2018-03-23 06:15:55 -04:00
commit 27d94023ee
70 changed files with 27138 additions and 26508 deletions

128
CHANGELOG
View file

@ -1,3 +1,129 @@
Version 3.6 (2018-03-23)
Friendica Core:
Updates to the translations (DE, EN_GB, EN_US, ES, FR, IT, ZH_CN) [translation teams]
Updates for the Danish and French regions [Alkarex]
Update for the documentation [andyhee, annando, rabuzarus, ratten, rudlof, silke, tobiasd]
Updates to the themes [Andi-K, annando, fabrixxm, hoergen, rebeka-catalina, rabuzarus]
Enhancements to the ARIA support in frio [rabuzarus]
Enhancements to the DB handling and structure [annando]
Enhancements to the API [annando, fabrixxm, MrPetovan, rudlof]
Enhancements to the support of Open Graph with images [hoergen]
Enhancements to the Diaspora federation (participation signal, relay of dislikes, basic forum support for D*, Birthdays) [annando]
Enhancements to the OStatus federation [annando]
Enhancements to the handling of feed contacts [MrPetovan]
Enhancements to the display of threaded discussions (optional) [MrPetovan]
Enhancements to the display of events [hoergen]
Enhancements to the ACL dialog (selection of forums) [rabuzarus]
Enhancements to the handling of new connections [annando]
Enhancements to the vitality check of contacts [annando]
Enhancements to the daemon script [annando]
Enhancements to the federation stats [annando, tobiasd]
Enhancements to the interaction with public posts [annando]
Enhancements to the structure of the admin panel [tobiasd]
Enhancements to the community page [annando]
Enhancements to the delegation of accounts [annando, MrPetovan]
Enhancements to the user import and server relocation functionality [annando]
Enhancements to the menu layout in the admin panel [tobiasd]
Enhancements to the extraction of strings to be translated [fabrixxm, MrPetovan]
Enhancements to the installation wizard [annando, tobias]
Enhancements to the events [annando, hoergen, MrPetovan, rabuzarus]
Enhancements to the handling of email contacts [annando]
Enhancements to the Vagrant configuration of the development VM [tobias]
Enhancements to the probing of pump.io profiles [annando]
Enhancements to the handling of BBCode tags [MrPetovan]
Enhancements to the OEmbed handling [MrPetovan]
Fixed a bug that triggered the display of activities on the cummunity page [annando]
Fixed a bug with personal notes [annando]
Fixed a display issue of long postings when using the showmore option [annando]
Fixed a bug that caused Twidere to crash on reload [annando]
Fixed a bug in the exported data to the-federation.info [annando]
Fixed a bug in URL completion for feed fragments [annando]
Fixed a bug in the notification system about new registrations [annando]
Fixed the display of dislikes [annando]
Fixed the display of orphans childs in threads [MrPetovan]
Fixed some SQL problems [annando]
Fixed the CLI config script [tobiasd]
Fixed the forum selection on the network display [annando]
Fixed a bug during the import of accounts [annando]
Fixed a problem with UTF8 encoding during account export [annando]
Fixed a problem with archiving "self" contacts [annando]
Fixes to file permissions lintian reported [tobiasd]
Fixed a session problem leading to double login problem [MrPetovan]
Fixed a bug that caused code blocks on Diaspora being displayed wrongly [MrPetovan]
Fixed a bug that suggested it was possible to use some bridges without an account on the other side [annando]
Fixed the situation that an OStatus activity was triggered when publishing a image without sending out a posting for it [annando]
Fixed some issues with the display of exported events on GNU social and diaspora [annando]
Fixed the issue that Atom feeds of forums had no postings listed [annando]
Fixed a problem with the expiration of accounts [annando]
Added Atom feed for conversations [annando]
Added the possibility to address forums with !forumname [annando]
Added option to compare version against upstream version [tobiasd]
Added an optional hint that a global community page is global [tobiasd]
Added an option to always display the preview image in shared articles even if larger ones exist [annando]
Added CLI script to silence accounts on the community page [tobiasd]
Added CLI script to block postings to a node from accounts [tobiasd]
Added account block interface to the admin panel [MrPetovan]
Added browser bookmarklet code snippet [hoergen]
Added an additional feature to display a tag cloud on the profile page [rabuzarus]
Added retrieval of Mastodon server statistics [annando]
Added Atom feed that only contains top level postings of a user [annando]
Added tag following via saved search for #hashtag [annando]
Added PHP version information to the admin panel [MrPetovan]
Added the possibility to change relationships between Friendica contacts [annando]
Added the membersince functionality from the addon to the core [rabuzarus]
Added support of nodeinfo 2.0 [annando]
Removed the long deprecated internal templating engine [annando]
Removed the obsolete mysql support, you have to use MySQLI or PDO [annando]
Removed the unused mood module [annando]
Removed connect link from side panel when it should not be there [annando]
Removed very old updating routines [annando]
Dependencies are now (mostly) handled by composer [MrPetovan, zeroadam]
General code refactoring and beautification work [annando, MrPetovan, tobiasd, zeroadam]
ejabberd logs are now handled by syslog [annando]
Moved the poller script to the "scripts" directory and renamed it to worker [annando]
Threaded display of conversations is now always enabled [annando]
Images send to public forums are now always public as well [annando]
The DB cleanup option now includes the conversation table [annando]
Hash tags now always search locally [annando]
Consistent naming of addons (instead of plugins and addons) [zeroadam]
Community page is split between local and global and always visible for local users [annando]
Updated the credits to include new contributors [tobiasd]
Friendica Addons:
Updates to the translations (DE, EN_GB, ES, FR, IT, NL, ZH_CN) [translation teams]
all bridges don't relay postings anymore that are posted to a public forum [annando]
DAV addon marked unsupported [tobiasd]
Current Weather: fixing a problem with the weathermap link [zeroadam]
NSFW added config examples, reworked the description, now ignores the CW from Mastodon [andyhee, annando, rebeka-catalina]
Twitter support 280 chars limit [annando]
OpenWeatherMap fix broken map link [zeroadam]
CommunityHome added settings to admin panel, removed active users feature [annando, fabrixxm]
General code refactoring and beautification work [annando, MrPetovan, tobiasd, zeroadam]
Public Server reworked [annando]
pageheader settings beautifications [tobiasd]
mailstream settings beautifications [tobiasd]
Membersince is now part of the core [rabuzarus]
Forum posts are not transmitted over the connectors anymore [annando]
Friendica Dir:
Fixed a problem with the maintenance cron [MrPetovan]
Fixed a problem with the location widget [MrPetovan]
Work on the UI [MrPetovan]
Closed Issues:
929, 1050, 1056, 1125, 1215, 1251, 1289, 1312, 1429, 1488, 1540,
1610, 1858, 2786, 2845, 3020, 3039, 3337, 3379, 3394, 3396, 3566,
3583, 3661, 3671, 3680, 3801, 3822, 3824, 3828, 3839, 3855, 3857,
3860, 3863, 3867, 3905, 3911, 3916, 3942, 3946, 3999, 4013, 4020,
4023, 4041, 4042, 4061, 4069, 4070, 4071, 4075, 4078, 4082, 4094,
4105, 4115, 4116, 4137, 4141, 4144, 4150, 4155, 4161, 4163, 4173,
4184, 4199, 4200, 4207, 4227, 4228, 4236, 4251, 4272, 4273, 4278,
4279, 4281, 4290, 4294, 4295, 4296, 4304, 4306, 4319, 4348, 4362,
4368, 4369, 4377, 4390, 4395, 4396, 4409, 4412, 4426, 4431, 4445,
4450, 4452, 4458, 4463, 4481, 4482, 4495, 4497, 4498, 4508, 4518,
4520, 4522, 4535, 4543, 4550, 4555, 4556, 4571, 4575, 4610, 4611,
4620
Version 3.5.4 (2017-10-16)
Friendica Core:
Updates to the translations (DE) [translation teams]
@ -90,7 +216,7 @@ Version 3.5.2 (2017-06-06)
Updates to the translations (DE, EN-GB, EN-US, ES, IT, PT-BR, RU) [translation teams]
Updates to the documentation [annando, beardyunixer, rabuzarus, tobiasd]
Updated the nginx example configuration [beardyunixer]
Code revision and refactoring [annando, hypolite, Quix0r, rebeka-catalina]
Code revision and refactoring [annando, MrPetovan, Quix0r, rebeka-catalina]
Background process is now done by the new worker process [annando]
Added support of Composer for dependencies [Hypolite]
Added support of Web app manifests [Rudloff]

View file

@ -37,10 +37,12 @@ local .htaccess file
- PHP *command line* access with register_argc_argv set to true in the
php.ini file [or see 'poormancron' in section 8]
- curl, gd (with at least jpeg support), mysql, mbstring, xml and openssl extensions
- curl, gd (with at least jpeg support), mysql, mbstring, xml, zip and openssl extensions
- some form of email server or email gateway such that PHP mail() works
- The POSIX module of PHP needs to be activated (e.g. RHEL, CentOS have disabled it)
- Mysql 5.5.3+ or an equivalant alternative for MySQL (MariaDB, Percona Server etc.)
- ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
@ -129,24 +131,16 @@ assistance. Friendica will not work correctly if you cannot perform this step.
You should also be sure that $a->config['php_path'] is set correctly, it should
look like (changing it to the correct PHP location)
$a->config['php_path'] = '/usr/local/php53/bin/php'
Alternative: You may be able to use the 'poormancron' addon to perform this
step if you are using a recent Friendica release. 'poormancron' may result in
perfomance and memory issues and is only suitable for small sites with one or
two users and a handful of contacts. To do this, edit the file
".htconfig.php" and look for a line describing your addons. On a fresh
installation, it will look like
$a->config['php_path'] = '/usr/local/php56/bin/php'
$a->config['system']['addon'] = 'js_upload';
Alternative: If you cannot use a cron job as described above, you can use
the frontend worker and an external cron service to trigger the execution
of the worker script. You can enable the frontend worker after the installation
from the admin panel of your node and call
This indicates the "js_upload" addon module is enabled. You may add additional
addons using this same line in the configuration file. Change it to
read
https://example.com/worker
$a->config['system']['addon'] = 'js_upload,poormancron';
and save your changes.
with the service of your choice.
9. (Recommended) Set up a backup plan

View file

@ -1 +1 @@
3.6-dev
3.6

View file

@ -39,7 +39,7 @@ Config::load();
check_db(true);
// Quit when in maintenance
if (Config::get('system', 'maintenance', true)) {
if (Config::get('system', 'maintenance', false, true)) {
return;
}

View file

@ -38,8 +38,8 @@ use Friendica\Util\DateTimeFormat;
require_once 'include/text.php';
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Asparagus');
define('FRIENDICA_VERSION', '3.6-dev');
define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily');
define('FRIENDICA_VERSION', '3.6');
define('DFRN_PROTOCOL_VERSION', '2.23');
define('DB_UPDATE_VERSION', 1256);
define('NEW_UPDATE_ROUTINE_VERSION', 1170);

View file

@ -1,5 +1,5 @@
-- ------------------------------------------
-- Friendica 3.6-dev (Asparagus)
-- Friendica 2018-05-dev (Tazmans Flax-lilly)
-- DB_UPDATE_VERSION 1256
-- ------------------------------------------
@ -466,6 +466,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`author-link` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`author-avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`title` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`body` mediumtext COMMENT '',
`app` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`verb` varchar(100) NOT NULL DEFAULT '' COMMENT '',

View file

@ -16,7 +16,6 @@ Whether you feel like an expert or like a newbie - join us with your ideas!
The discussion of Friendica development takes place in the following Friendica forums:
* The main [forum for Friendica development](https://forum.friendi.ca/profile/developers)
* The [forum for Friendica theme development](https://friendica.eu/profile/ftdevs)
## Help other users
@ -141,7 +140,7 @@ If you want to get involved here:
* Look at the first steps that were made (e.g. the clean theme).
Ask us to find out whom to talk to about their experiences.
* Talk to design people if you know any.
* Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers) or the [theme developer forum](https://friendica.eu/profile/ftdevs).
* Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers)
Do not worry about cross-posting.
### Client software

View file

@ -70,7 +70,8 @@ See Wikipedia for more of them ([video](http://en.wikipedia.org/wiki/HTML5_video
<a name="avatars"></a>
### Is it possible to have different avatars per profile?
Yes. On your Edit/Manage Profiles page, you will find a "change profile photo" link.
Yes.
On your Edit/Manage Profiles page, you will find a "change profile photo" link.
Clicking this will take you to a page where you can upload a photograph and select which profile it will be associated with.
To avoid privacy leakage, we only display the photograph associated with your default profile as the avatar in your posts.
@ -111,15 +112,9 @@ After that, your account is deleted.
<a name="hashtag"></a>
### Can I follow a hashtag?
No. The act of 'following' a hashtags is an interesting technology, but presents a few issues.
1. Posts would have to be copied to all sites on the network that are "listening" to that hashtag. This would increase the storage demands to the detriment of small sites. It would make the use of shared hosting practically impossible.
2. Making spam easy (tag spam is a serious issue on Twitter for instance)
3. It creates a natural bias towards large sites which hold more tagged content - if your network uses tagging instead of other conversation federation mechanisms such as groups/forums.
Instead, we offer other mechanisms for wide-area conversations while retaining a 'level playing ground' for both large and small sites, such as forums and community pages and shared tags.
Yes. Simply add the hash tag to your saved searches.
The posts will appear on your network page.
For technical reasons, your answers to such posts won't appear on the "personal" tab in the network page and the whole thread isn't accessible via the API.
<a name="rss"></a>
### How to create a RSS feed of the stream?
@ -171,10 +166,15 @@ Depending on the features of the client you might encounter some glitches in usa
### Where I can find help?
If you have problems with your Friendica page, you can ask the community at the [Friendica Support Group](https://forum.friendi.ca/profile/helpers).
If you can't use your default profile you can use an account at a public site [list](https://dir.friendica.social/servers) or you can use the Librelist mailing list.
If you want to use the mailing list, please just send a mail to friendica AT librelist DOT com.
If you can't use your default profile you can use an account at a public site [list](https://dir.friendica.social/servers).
If you are a theme developer, you will find help at this forum: [Friendica Theme Developers](https://friendica.eu/profile/ftdevs).
In case you do not want to set up another account on Friendica, you can also use one of the following channels to reach out for help:
* [Friendica Support Forum](https://forum.friendi.ca/~helpers)
* [Mailing List Archive](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca) you can subscribe to the list by sending an email to ``support-request(at)friendi.ca?subject=subscribe``
* XMPP/Jabber MUC: support(at)forum.friendi.ca
* IRC: #friendica at irc.freenode.net
* Matrix: #friendi.ca or #friendica at matrix.org
Admin
--------

View file

@ -28,7 +28,8 @@ Requirements
* Apache with mod-rewrite enabled and "Options All" so you can use a local .htaccess file
* PHP 5.6+ (PHP 7 is recommended for performance)
* PHP *command line* access with register_argc_argv set to true in the php.ini file
* Curl, GD, PDO, MySQLi, hash, xml and OpenSSL extensions
* Curl, GD, PDO, MySQLi, hash, xml, zip and OpenSSL extensions
* The POSIX module of PHP needs to be activated (e.g. [RHEL, CentOS](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) have disabled it)
* some form of email server or email gateway such that PHP mail() works
* Mysql 5.5.3+ or an equivalant alternative for MySQL (MariaDB, Percona Server etc.)
* the ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks (Windows) (Note: other options are presented in Section 7 of this document.)
@ -38,7 +39,7 @@ Requirements
Installation procedure
---
###Get Friendica
### Get Friendica
Unpack the Friendica files into the root of your web server document area.
If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file.
@ -64,7 +65,7 @@ Clone the addon repository (separately):
If you copy the directory tree to your webserver, make sure that you also copy .htaccess - as "dot" files are often hidden and aren't normally copied.
###Create a database
### Create a database
Create an empty database and note the access details (hostname, username, password, database name).
@ -79,7 +80,7 @@ In this case find the [mysqld] section in your my.cnf file and add the line :
Restart mysql and you should be fine.
###Run the installer
### Run the installer
Point your web browser to the new site and follow the instructions.
Please note any error messages and correct these before continuing.
@ -96,7 +97,7 @@ Registration errors should all be recoverable automatically.
If you get any *critical* failure at this point, it generally indicates the database was not installed correctly.
You might wish to move/rename .htconfig.php to another name and empty (called 'dropping') the database tables, so that you can start fresh.
###Set up the worker
### Set up the worker
Set up a cron job or scheduled task to run the worker once every 5-10 minutes in order to perform background processing.
Example:
@ -118,7 +119,8 @@ If it is not possible to set up a cron job then please activate the "frontend wo
Once you have installed Friendica and created an admin account as part of the process, you can access the admin panel of your installation and do most of the server wide configuration from there
###Set up a backup plan
### Set up a backup plan
Bad things will happen.
Let there be a hardware failure, a corrupted database or whatever you can think of.
So once the installation of your Friendica node is done, you should make yourself a backup plan.

View file

@ -57,6 +57,21 @@ The `vier` theme for instance is mobile friendly.
### Registration
#### Register policy
With this drop down selector you can set the nodes registration policy.
You can chose between the following modes:
* **open**: Everybody can register a new account and start using it right away.
* **requires approval**: Everybody can register a new account, but the admin has to approve it before it can be used.
* **closed**: No new registrations are possible.
##### Invitation based registry
Additionally to the setting in the admin panel, you can devide if registrations are only possible using an invitation code or not.
To enable invitation based registration, you have to set the `invitation_only` setting in the [.htconfig.php](/help/htconfig) file.
If you want to use this method, the registration policy has to be set to either *open* or *requires approval*.
#### Check Full Names
You may find a lot of spammers trying to register on your site.
@ -111,6 +126,14 @@ Unauthorised persons will also not be able to request friendship with site membe
Default is false.
Available in version 2.2 or greater.
#### Community pages for Visitors
The community pages show all public postings, separated by their origin being local or the entire network.
With this setting you can select which community pages will be shown to visitors of your Friendica node.
Your local users will always have access to both pages.
**Note**: Several settings, like users hiding their contacts from the public will prevent the postings to show up on the global community page.
#### Allowed Friend Domains
Comma separated list of domains which are allowed to establish friendships with this site.

View file

@ -10,7 +10,7 @@ Nutzer
* **[Ist es möglich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben?](help/FAQ#avatars)**
* **[Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten?](help/FAQ#contacts)**
* **[Was passiert, wenn ein Account gelöscht ist? Ist dieser richtig gelöscht?](help/FAQ#removed)**
* **[Kann ich einem hashtag folgen?](help/FAQ#hashtag)**
* **[Kann ich einem Hashtag folgen?](help/FAQ#hashtag)**
* **[Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen?](help/FAQ#rss)**
* **[Gibt es Clients für Friendica?](help/FAQ#clients)**
* **[Wo finde ich Hilfe?](help/FAQ#help)**
@ -85,9 +85,9 @@ Zum Konvertieren von Videos in das lizenfreie Videoformat WebM gibt es unter Win
### Ist es möglich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben?
Ja.
Auf Deiner ["Profile verwalten/editieren"-Seite](../profiles) wählst Du zunächst das gewünschte Profil aus.
Anschließend siehst Du eine Seite mit allen Infos zu diesem Profil.
Klicke nun oben auf den Link "Profilbild ändern" und lade im nächsten Fenster ein Bild von Deinem PC hoch.
Auf Deiner ["Profile verwalten/editieren"-Seite](../profiles) wählst Du zunächst das gewünschte Profil aus.
Anschließend siehst Du eine Seite mit allen Infos zu diesem Profil.
Klicke nun oben auf den Link "Profilbild ändern" und lade im nächsten Fenster ein Bild von Deinem PC hoch.
Um Deine privaten Daten zu schützen, wird in Beiträgen nur das Bild aus Deinem öffentlichen Profil angezeigt.
<a name="contacts"></a>
@ -122,19 +122,11 @@ Dieses Vorgehen setzt voraus, dass Dein Profil für 24 Stunden weiterhin "teilwe
Wir können also Dein Profil blockieren und es so erscheinen lassen, als wären alle Daten sofort gelöscht, allerdings warten wir 24 Stunden (bzw. bis alle Deine Kontakte informiert wurden), bevor wir die Daten auch physikalisch löschen.
<a name="hashtag"></a>
### Kann ich einem hashtag folgen?
### Kann ich einem Hashtag folgen?
Nein.
Die Möglichkeit, einem hashtag zu folgen, ist eine interessante Technik, führt aber zu einigen Schwierigkeiten.
1.) Alle Beiträge, die diesen tag nutzen, müssten zu allen Seiten im Netzwerk kopiert werden. Das erhöht den Speicherbedarf und beeinträchtigt kleine Seiten. Die Nutzung von geteilten Hosting-Angeboten (Shared Hosting) wäre praktisch unmöglich.
2.) Die Verbreitung von Spam wäre vereinfacht (tag-Spam ist z.B. bei Twitter ein schwerwiegendes Problem)
3.) Der wichtigste Grund der gegen diese Technik spricht ist, dass sie eine natürliche Ausrichtung auf größere Seiten mit mehr getaggten Inhalten zur Folge hat. Dies kann z.B. aufkommen, wenn Dein Netzwerk tags anstelle von anderen Kommunikationsmitteln wie Gruppen oder Foren nutzt.
Stattdessen bieten wir andere Mechanismen, um globale Unterhaltungen zu erreichen, dabei aber eine angemesse Basis für kleine und große Seiten zu bieten.
Hierzu gehören Foren, Gruppen und geteilte tags.
Ja.
Füge die Tags zu Deinen gespeicherten Suchen hinzu, sie werden automatisch auf der Netzwerk-Seite auftauchen.
Bitte beachte, dass Deine Antworten auf solche Posts aus technischen Gründen nicht unter dem "Persönlich"-Reiter auf der Netzwerk-Seite und der gesamte Thread nicht per API zu sehen sind.
<a name="rss"></a>
### Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen?
@ -188,11 +180,16 @@ Hier ist eine Liste von Clients bei denen dies möglich ist, bzw. die speziell f
<a name="help"></a>
### Wo finde ich Hilfe?
Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der [Friendica-Support-Gruppe](https://forum.friendi.ca/profile/helpers) oder im [deutschen Friendica-Support-Forum](http://toktan.org/profile/wiki) fragen oder Dir das [deutsche Wiki](http://wiki.toktan.org/doku.php) anschauen.
Wenn Du Deinen Account nicht nutzen kannst, kannst Du entweder einen [Testaccount](https://tryfriendica.de) bzw. einen Account auf einer öffentlichen Seite ([Liste](https://dir.friendica.social/servers)) nutzen, oder Du wählst die Librelist-mailing-Liste.
Wenn Du die Mailing-Liste nutzen willst, schicke eine Mail an friendica AT librelist PUNKT com.
Wenn Du Probleme mit Deiner Friendica-Seite hast, dann kannst Du die Community in der [Friendica-Support-Gruppe](https://forum.friendi.ca/profile/helpers) oder im [deutschen Friendica-Support-Forum](http://toktan.org/profile/wiki) fragen oder Dir das [deutsche Wiki](http://wiki.toktan.org/doku.php) anschauen.
Wenn Du Deinen Account nicht nutzen kannst, kannst Du entweder einen [Testaccount](https://tryfriendica.de) bzw. einen Account auf einer öffentlichen Seite ([Liste](https://dir.friendica.social/servers)) nutzen.
Wenn Du ein Theme-Entwickler bist, wirst Du in diesem Forum Hilfe finden: [Friendica Theme Developers](https://friendica.eu/profile/ftdevs).
Wenn du dir keinen weiteren Friendica Account einrichten willst, kannst du auch gerne über einen der folgenden alternativen Kanäle Hilfe suchen:
* [Friendica Support Forum](https://forum.friendi.ca/~helpers)
* [Mailing List Archive](http://mailman.friendi.ca/mailman/listinfo/support-friendi.ca) you can subscribe to the list by sending an email to ``support-request(at)friendi.ca?subject=subscribe``
* XMPP/Jabber MUC: support(at)forum.friendi.ca
* IRC: #friendica at irc.freenode.net
* Matrix: #friendi.ca or #friendica at matrix.org.
Admin
--------

View file

@ -24,8 +24,9 @@ Wir planen, diese Einschränkung in einer zukünftigen Version zu beheben.
- Apache mit einer aktiverten mod-rewrite-Funktion und dem Eintrag "Options All", so dass du die lokale .htaccess-Datei nutzen kannst
- PHP 5.6+. Je neuer, desto besser.
- PHP *Kommandozeilen*-Zugang mit register_argc_argv auf "true" gesetzt in der php.ini-Datei
- Curl, GD, PDO, MySQLi, xml und OpenSSL-Erweiterung
- Curl, GD, PDO, MySQLi, xml, zip und OpenSSL-Erweiterung
- etwas in der Art eines Email-Servers oder eines Gateways wie PHP mail()
- Das POSIX Modul muss aktiviert sein ([CentOS, RHEL](http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7http://www.bigsoft.co.uk/blog/index.php/2014/12/08/posix-php-commands-not-working-under-centos-7) haben dies z.B. deaktiviert)
- Mysql 5.5.3+
- die Möglichkeit, wiederkehrende Aufgaben mit cron (Linux/Mac) oder "Scheduled Tasks" einzustellen (Windows) [Beachte: andere Optionen sind in Abschnitt 7 dieser Dokumentation zu finden]
- Installation in einer Top-Level-Domain oder Subdomain (ohne eine Verzeichnis/Pfad-Komponente in der URL) wird bevorzugt. Verzeichnispfade sind für diesen Zweck nicht so günstig und wurden auch nicht ausführlich getestet.

View file

@ -54,6 +54,20 @@ Das `vier` Theme z.B. unterstützt kleine Anzeigen und benötigt kein zusätzlic
### Registrierung
#### Registrierungsmethode
Diese Einstellung regelt die Art der Registrierung.
Dabei kannst du zwischen den folgenden Optionen wählen:
* **Offen**: Jeder kann ein neues Nutzerkonto anlegen und es sofort benutzen.
* **Bedarf der Zustimmung**: Jeder kann ein Nutzerkonto anlegen. Dieses muss allerdings durch den Admin freigeschaltet werden, bevor es verwendet werden kann.
* **Geschlossen**: Es können keine weiteren Nutzerkonten angelegt werden.
##### Einladungen
Zusätzlich zu den oben genannten Möglichkeiten, kann die Registrierung eines neuen Nutzerkontos an eine Einladung durch einen bestehenden Nutzer gekoppelt werden.
Hierzu muss in der [.htconfig.php](/help/htconfig) Datei die Option `invitation_only` aktiviert und als Registrierungsmethode entweder *Offen* oder *Bedarf der Zustimmung* gewählt werden.
#### Namen auf Vollständigkeit überprüfen
Es kann vorkommen, dass viele Spammer versuchen, sich auf deiner Seite zu registrieren.
@ -108,6 +122,15 @@ Unautorisierte Personen haben ebenfalls nicht die Möglichkeit, Freundschaftsanf
Die Standardeinstellung ist deaktiviert.
Verfügbar in Version 2.2 und höher.
#### Für Besucher verfügbare Gemeinschaftsseiten
Die Gemeinschaftsseiten zeigen all öffentlichen Beiträge.
Es gibt zwei Gemeinschaftsseiten, eine lokale auf der die Beiträge der Nutzer des Knotens gesammelt werden und eine globale auf der alle bekannten Beiträge aus dem gesamten Netzwerk erscheinen.
Mit dieser Einstellung kann geregelt werden, welche dieser beiden Seiten Besucher aufrufen können.
Angemeldete Nutzer des Knotens können grundsätzlich beide Seiten verwenden.
**Hinweis**: Einige Einstellungen, wie z.B. das Verbergen von Kontakten auf der Profilseite, können die Sichtbarkeit der Beiträge auf der Gemeinschaftsseiten beeinflussen.
#### Erlaubte Domains für Kontakte
Kommagetrennte Liste von Domains, welche eine Freundschaft mit dieser Seite eingehen dürfen.

View file

@ -49,6 +49,7 @@ Example: To set the automatic database cleanup process add this line to your .ht
* **ignore_cache** (Boolean) - For development only. Disables the item cache.
* **instances_social_key** - Key to the API of https://instances.social which retrieves data about mastodon servers. See https://instances.social/api/token to get an API key.
* **ipv4_resolve** (Boolean) - Resolve IPV4 addresses only. Don't resolve to IPV6. Default value is false.
* **invitation_only** (Boolean) - If set true registration is only possible after a current member of the node has send an invitation. Default is false.
* **like_no_comment** (Boolean) - Don't update the "commented" value of an item when it is liked.
* **local_block** (Boolean) - Used in conjunction with "block_public".
* **local_search** (Boolean) - Blocks search for users who are not logged in to prevent crawlers from blocking your system.

View file

@ -6,7 +6,6 @@ To change the look of friendica you have to touch the themes.
The current default theme is [Vier](https://github.com/friendica/friendica/tree/master/view/theme/vier) but there are numerous others.
Have a look at [friendica-themes.com](http://friendica-themes.com) for an overview of the existing themes.
In case none of them suits your needs, there are several ways to change a theme.
If you need help theming, there is a forum @[ftdevs@friendica.eu](https://friendica.eu/profile/ftdevs) where you can ask theme specific questions and present your themes.
So, how to work on the UI of friendica.
@ -206,7 +205,7 @@ Basically what you have to do is identify which template you have to change so i
Adopt the CSS of the theme accordingly.
And iterate the process until you have the theme the way you want it.
*Use the source Luke.* and don't hesitate to ask in @[ftdevs](https://friendica.eu/profile/ftdevs) or @[helpers](https://forum.friendi.ca/profile/helpers).
*Use the source Luke.* and don't hesitate to ask in @[developers](https://forum.friendi.ca/profile/developers) or @[helpers](https://forum.friendi.ca/profile/helpers).
## Special Files

View file

@ -5931,10 +5931,12 @@ function api_saved_searches_list($type)
$result = [];
while ($term = $terms->fetch()) {
$result[] = [
'name' => $term['term'],
'query' => $term['term'],
'created_at' => api_date(time()),
'id' => intval($term['id']),
'id_str' => $term['id'],
'id' => intval($term['id'])
'name' => $term['term'],
'position' => null,
'query' => $term['term']
];
}

View file

@ -443,7 +443,7 @@ These Fields are not added below (yet). They are here to for bug search.
return "`item`.`author-id`, `item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
`item`.`owner-id`, `item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
`item`.`contact-id`, `item`.`uid`, `item`.`id`, `item`.`parent`,
`item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`,
`item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`, `item`.`content-warning`,
`item`.`commented`, `item`.`created`, `item`.`edited`, `item`.`received`,
`item`.`verb`, `item`.`object-type`, `item`.`postopts`, `item`.`plink`,
`item`.`guid`, `item`.`wall`, `item`.`private`, `item`.`starred`,
@ -1245,7 +1245,7 @@ function format_like($cnt, array $arr, $type, $id) {
break;
case 'attendmaybe':
$phrase = L10n::t('<span %1$s>%2$d people</span> attend maybe', $spanatts, $cnt);
$explikers = L10n::t('%s anttend maybe.', $likers);
$explikers = L10n::t('%s attend maybe.', $likers);
break;
}
@ -1643,7 +1643,7 @@ function get_responses($conv_responses, $response_verbs, $ob, $item) {
foreach ($response_verbs as $v) {
$ret[$v] = [];
$ret[$v]['count'] = defaults($conv_responses[$v], $item['uri'], '');
$ret[$v]['list'] = defaults($conv_responses[$v], $item['uri'] . '-l', '');
$ret[$v]['list'] = defaults($conv_responses[$v], $item['uri'] . '-l', []);
$ret[$v]['self'] = defaults($conv_responses[$v], $item['uri'] . '-self', '0');
if (count($ret[$v]['list']) > MAX_LIKERS) {
$ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS);

View file

@ -16,10 +16,10 @@ use Friendica\Util\Emailer;
* @brief Creates a notification entry and possibly sends a mail
*
* @param array $params Array with the elements:
uid, item, parent, type, otype, verb, event,
link, subject, body, to_name, to_email, source_name,
source_link, activity, preamble, notify_flags,
language, show_in_notification_page
* uid, item, parent, type, otype, verb, event,
* link, subject, body, to_name, to_email, source_name,
* source_link, activity, preamble, notify_flags,
* language, show_in_notification_page
*/
function notification($params)
{
@ -368,7 +368,7 @@ function notification($params)
'[url='.$params['source_link'].']'.$params['source_name'].'[/url]'
);
$body = L10n::t('Full Name: %1$s\nSite Location: %2$s\nLogin Name: %3$s ' . "\x28" . '%4$s' . "\x28",
$body = L10n::t('Full Name: %1$s\nSite Location: %2$s\nLogin Name: %3$s ' . "\x28" . '%4$s' . "\x29",
$params['source_name'],
$siteurl, $params['source_mail'],
$params['source_nick']

View file

@ -38,9 +38,9 @@ function format_event_html($ev, $simple = false) {
);
if ($simple) {
$o = "<h3>" . BBCode::convert($ev['summary']) . "</h3>";
$o = "<h3>" . BBCode::convert($ev['summary'], false, $simple) . "</h3>";
$o .= "<div>" . BBCode::convert($ev['desc']) . "</div>";
$o .= "<p>" . BBCode::convert($ev['desc'], false, $simple) . "</p>";
$o .= "<h4>" . L10n::t('Starts:') . "</h4><p>" . $event_start . "</p>";
@ -49,7 +49,7 @@ function format_event_html($ev, $simple = false) {
}
if (strlen($ev['location'])) {
$o .= "<h4>" . L10n::t('Location:') . "</h4><p>" . $ev['location'] . "</p>";
$o .= "<h4>" . L10n::t('Location:') . "</h4><p>" . BBCode::convert($ev['location'], false, $simple) . "</p>";
}
return $o;
@ -57,7 +57,7 @@ function format_event_html($ev, $simple = false) {
$o = '<div class="vevent">' . "\r\n";
$o .= '<div class="summary event-summary">' . BBCode::convert($ev['summary']) . '</div>' . "\r\n";
$o .= '<div class="summary event-summary">' . BBCode::convert($ev['summary'], false, $simple) . '</div>' . "\r\n";
$o .= '<div class="event-start"><span class="event-label">' . L10n::t('Starts:') . '</span>&nbsp;<span class="dtstart" title="'
. DateTimeFormat::utc($ev['start'], (($ev['adjust']) ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s' ))
@ -71,16 +71,16 @@ function format_event_html($ev, $simple = false) {
. '</span></div>' . "\r\n";
}
$o .= '<div class="description event-description">' . BBCode::convert($ev['desc']) . '</div>' . "\r\n";
$o .= '<div class="description event-description">' . BBCode::convert($ev['desc'], false, $simple) . '</div>' . "\r\n";
if (strlen($ev['location'])) {
$o .= '<div class="event-location"><span class="event-label">' . L10n::t('Location:') . '</span>&nbsp;<span class="location">'
. BBCode::convert($ev['location'])
. BBCode::convert($ev['location'], false, $simple)
. '</span></div>' . "\r\n";
// Include a map of the location if the [map] BBCode is used.
if (strpos($ev['location'], "[map") !== false) {
$map = Map::byLocation($ev['location']);
$map = Map::byLocation($ev['location'], $simple);
if ($map !== $ev['location']) {
$o.= $map;
}
@ -241,14 +241,20 @@ function event_store($arr) {
$a = get_app();
$arr['created'] = (($arr['created']) ? $arr['created'] : DateTimeFormat::utcNow());
$arr['edited'] = (($arr['edited']) ? $arr['edited'] : DateTimeFormat::utcNow());
$arr['created'] = (($arr['created']) ? DateTimeFormat::utc($arr['created']) : DateTimeFormat::utcNow());
$arr['edited'] = (($arr['edited']) ? DateTimeFormat::utc($arr['edited']) : DateTimeFormat::utcNow());
$arr['start'] = (($arr['start']) ? DateTimeFormat::utc($arr['start']) : NULL_DATE);
$arr['finish'] = (($arr['finish']) ? DateTimeFormat::utc($arr['finish']) : NULL_DATE);
$arr['type'] = (($arr['type']) ? $arr['type'] : 'event' );
$arr['cid'] = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
$arr['uri'] = (x($arr, 'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(), $arr['uid']));
$arr['private'] = ((x($arr, 'private')) ? intval($arr['private']) : 0);
$arr['guid'] = get_guid(32);
if ($arr['finish'] < NULL_DATE) {
$arr['finish'] = NULL_DATE;
}
if ($arr['cid']) {
$c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($arr['cid']),

View file

@ -228,7 +228,7 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
*
* @TODO find proper type-hints
*/
function consume_feed($xml, $importer, &$contact, &$hub, $datedir = 0, $pass = 0) {
function consume_feed($xml, $importer, $contact, &$hub, $datedir = 0, $pass = 0) {
if ($contact['network'] === NETWORK_OSTATUS) {
if ($pass < 2) {
// Test - remove before flight
@ -290,7 +290,7 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
return;
}
$push_url = Config::get('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
$push_url = System::baseUrl() . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
// Use a single verify token, even if multiple hubs
$verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string());

View file

@ -1062,7 +1062,7 @@ function linkify($s) {
* Load poke verbs
*
* @return array index is present tense verb
value is array containing past tense verb, translation of present, translation of past
* value is array containing past tense verb, translation of present, translation of past
* @hook poke_verbs pokes array
*/
function get_poke_verbs() {
@ -1169,8 +1169,25 @@ function redir_private_images($a, &$item)
}
}
/**
* Sets the "rendered-html" field of the provided item
*
* Body is preserved to avoid side-effects as we modify it just-in-time for spoilers and private image links
*
* @param array $item
* @param bool $update
*
* @todo Remove reference, simply return "rendered-html" and "rendered-hash"
*/
function put_item_in_cache(&$item, $update = false)
{
$body = $item["body"];
// Add the content warning
if (!empty($item['content-warning'])) {
$item["body"] = $item['content-warning'] . '[spoiler]' . $item["body"] . '[/spoiler]';
}
$rendered_hash = defaults($item, 'rendered-hash', '');
if ($rendered_hash == ''
@ -1178,22 +1195,19 @@ function put_item_in_cache(&$item, $update = false)
|| $rendered_hash != hash("md5", $item["body"])
|| Config::get("system", "ignore_cache")
) {
// The function "redir_private_images" changes the body.
// I'm not sure if we should store it permanently, so we save the old value.
$body = $item["body"];
$a = get_app();
redir_private_images($a, $item);
$item["rendered-html"] = prepare_text($item["body"]);
$item["rendered-hash"] = hash("md5", $item["body"]);
$item["body"] = $body;
if ($update && ($item["id"] > 0)) {
dba::update('item', ['rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]],
['id' => $item["id"]], false);
}
}
$item["body"] = $body;
}
/**
@ -1281,62 +1295,55 @@ function prepare_body(&$item, $attach = false, $preview = false) {
$as = '';
$vhead = false;
$arr = explode('[/attach],', $item['attach']);
if (count($arr)) {
foreach ($arr as $r) {
$matches = false;
$icon = '';
$cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"|',$r ,$matches, PREG_SET_ORDER);
if ($cnt) {
foreach ($matches as $mtch) {
$mime = $mtch[3];
$matches = [];
preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\"(?: title=\"(.*?)\")?|', $item['attach'], $matches, PREG_SET_ORDER);
foreach ($matches as $mtch) {
$mime = $mtch[3];
if ((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) {
$the_url = 'redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1];
} else {
$the_url = $mtch[1];
}
if (strpos($mime, 'video') !== false) {
if (!$vhead) {
$vhead = true;
$a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
'$baseurl' => System::baseUrl(),
]);
$a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [
'$baseurl' => System::baseUrl(),
]);
}
$id = end(explode('/', $the_url));
$as .= replace_macros(get_markup_template('video_top.tpl'), [
'$video' => [
'id' => $id,
'title' => L10n::t('View Video'),
'src' => $the_url,
'mime' => $mime,
],
]);
}
$filetype = strtolower(substr($mime, 0, strpos($mime, '/')));
if ($filetype) {
$filesubtype = strtolower(substr($mime, strpos($mime, '/') + 1));
$filesubtype = str_replace('.', '-', $filesubtype);
} else {
$filetype = 'unkn';
$filesubtype = 'unkn';
}
$title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1]));
$title .= ' ' . $mtch[2] . ' ' . L10n::t('bytes');
$icon = '<div class="attachtype icon s22 type-' . $filetype . ' subtype-' . $filesubtype . '"></div>';
$as .= '<a href="' . strip_tags($the_url) . '" title="' . $title . '" class="attachlink" target="_blank" >' . $icon . '</a>';
}
}
if ((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) {
$the_url = 'redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1];
} else {
$the_url = $mtch[1];
}
if (strpos($mime, 'video') !== false) {
if (!$vhead) {
$vhead = true;
$a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
'$baseurl' => System::baseUrl(),
]);
$a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [
'$baseurl' => System::baseUrl(),
]);
}
$id = end(explode('/', $the_url));
$as .= replace_macros(get_markup_template('video_top.tpl'), [
'$video' => [
'id' => $id,
'title' => L10n::t('View Video'),
'src' => $the_url,
'mime' => $mime,
],
]);
}
$filetype = strtolower(substr($mime, 0, strpos($mime, '/')));
if ($filetype) {
$filesubtype = strtolower(substr($mime, strpos($mime, '/') + 1));
$filesubtype = str_replace('.', '-', $filesubtype);
} else {
$filetype = 'unkn';
$filesubtype = 'unkn';
}
$title = escape_tags(trim(!empty($mtch[4]) ? $mtch[4] : $mtch[1]));
$title .= ' ' . $mtch[2] . ' ' . L10n::t('bytes');
$icon = '<div class="attachtype icon s22 type-' . $filetype . ' subtype-' . $filesubtype . '"></div>';
$as .= '<a href="' . strip_tags($the_url) . '" title="' . $title . '" class="attachlink" target="_blank" >' . $icon . '</a>';
}
if ($as != '') {
$s .= '<div class="body-attach">'.$as.'<div class="clear"></div></div>';
}

View file

@ -74,7 +74,7 @@ if (!$install) {
if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http")
&& (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL)
&& (substr(System::baseUrl(), 0, 8) == "https://")
) {
&& ($_SERVER['REQUEST_METHOD'] == 'GET')) {
header("HTTP/1.1 302 Moved Temporarily");
header("Location: " . System::baseUrl() . "/" . $a->query_string);
exit();

View file

@ -1568,7 +1568,7 @@ function admin_page_users(App $a)
if ($a->argc > 2) {
$uid = $a->argv[3];
$user = dba::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
if (DBM::is_result($user)) {
if (!DBM::is_result($user)) {
notice('User not found' . EOL);
goaway('admin/users');
return ''; // NOTREACHED

View file

@ -45,6 +45,14 @@ function contacts_init(App $a)
}
if (DBM::is_result($contact)) {
if ($contact['self']) {
if (($a->argc == 3) && intval($a->argv[1]) && ($a->argv[2] == "posts")) {
goaway('profile/' . $contact['nick']);
} else {
goaway('profile/' . $contact['nick'] . '?tab=profile');
}
}
$a->data['contact'] = $contact;
if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != NETWORK_DFRN)) {
@ -579,9 +587,10 @@ function contacts_content(App $a)
$profile_select = ContactSelector::profileAssign($contact['profile-id'], (($contact['network'] !== NETWORK_DFRN) ? true : false));
}
/// @todo Only show the following link with DFRN when the remote version supports it
$follow = '';
$follow_text = '';
if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) {
if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
if ($contact['rel'] == CONTACT_IS_FOLLOWER) {
$follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]);
$follow_text = L10n::t("Connect/Follow");
@ -939,6 +948,13 @@ function _contact_detail_for_template($rr)
$sparkle = '';
}
if ($rr['self']) {
$dir_icon = 'images/larrow.gif';
$alt_text = L10n::t('This is you');
$url = $rr['url'];
$sparkle = '';
}
return [
'img_hover' => L10n::t('Visit %s\'s profile [%s]', $rr['name'], $rr['url']),
'edit_hover' => L10n::t('Edit contact'),

View file

@ -6,6 +6,7 @@ use Friendica\App;
use Friendica\Core\L10n;
use Friendica\Core\System;
use Friendica\Database\DBM;
use Friendica\Model\User;
require_once 'mod/settings.php';
@ -28,6 +29,21 @@ function delegate_post(App $a)
check_form_security_token_redirectOnErr('/delegate', 'delegate');
$parent_uid = defaults($_POST, 'parent_user', 0);
$parent_password = defaults($_POST, 'parent_password', '');
if ($parent_uid != 0) {
$user = dba::selectFirst('user', ['nickname'], ['uid' => $parent_uid]);
if (!DBM::is_result($user)) {
notice(L10n::t('Parent user not found.') . EOL);
return;
}
$success = User::authenticate($user['nickname'], trim($parent_password));
if (!$success) {
notice(L10n::t('Permission denied.') . EOL);
return;
}
}
dba::update('user', ['parent-uid' => $parent_uid], ['uid' => local_user()]);
}
@ -70,16 +86,6 @@ function delegate_content(App $a)
goaway(System::baseUrl() . '/delegate');
}
// These people can manage this account/page with full privilege
$full_managers = [];
$r = q("SELECT * FROM `user` WHERE `email` = '%s' AND `password` = '%s' ",
dbesc($a->user['email']),
dbesc($a->user['password'])
);
if (DBM::is_result($r)) {
$full_managers = $r;
}
// find everybody that currently has delegated management to this account/page
$delegates = [];
$r = q("SELECT * FROM `user` WHERE `uid` IN (SELECT `uid` FROM `manage` WHERE `mid` = %d)",
@ -90,10 +96,6 @@ function delegate_content(App $a)
}
$uids = [];
foreach ($full_managers as $rr) {
$uids[] = $rr['uid'];
}
foreach ($delegates as $rr) {
$uids[] = $rr['uid'];
}
@ -153,18 +155,21 @@ function delegate_content(App $a)
}
}
if (!is_null($parent_user)) {
$parent_password = ['parent_password', L10n::t('Parent Password:'), '', L10n::t('Please enter the password of the parent account to legitimize your request.')];
}
$o = replace_macros(get_markup_template('delegate.tpl'), [
'$form_security_token' => get_form_security_token('delegate'),
'$parent_header' => L10n::t('Parent User'),
'$parent_user' => $parent_user,
'$parent_password' => $parent_password,
'$parent_desc' => L10n::t('Parent users have total control about this account, including the account settings. Please double check whom you give this access.'),
'$submit' => L10n::t('Save Settings'),
'$header' => L10n::t('Delegate Page Management'),
'$delegates_header' => L10n::t('Delegates'),
'$base' => System::baseUrl(),
'$desc' => L10n::t('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.'),
'$head_managers' => L10n::t('Existing Page Managers'),
'$managers' => $full_managers,
'$head_delegates' => L10n::t('Existing Page Delegates'),
'$delegates' => $delegates,
'$head_potentials' => L10n::t('Potential Delegates'),

View file

@ -18,6 +18,12 @@ require_once 'include/event.php';
function dfrn_notify_post(App $a) {
logger(__function__, LOGGER_TRACE);
if (empty($_POST)) {
require_once 'mod/salmon.php';
salmon_post($a);
}
$dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : '');
$dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0);
$challenge = ((x($_POST,'challenge')) ? notags(trim($_POST['challenge'])) : '');

View file

@ -12,12 +12,12 @@ use Friendica\Database\DBM;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
function directory_init(App $a) {
function directory_init(App $a)
{
$a->set_pager_itemspage(60);
if(local_user()) {
if (local_user()) {
$a->page['aside'] .= Widget::findPeople();
$a->page['aside'] .= Widget::follow();
} else {
unset($_SESSION['theme']);
@ -25,16 +25,20 @@ function directory_init(App $a) {
}
}
function directory_post(App $a) {
if(x($_POST,'search'))
function directory_post(App $a)
{
if (x($_POST, 'search')) {
$a->data['search'] = $_POST['search'];
}
}
function directory_content(App $a) {
function directory_content(App $a)
{
require_once("mod/proxy.php");
if((Config::get('system','block_public')) && (! local_user()) && (! remote_user()) ||
(Config::get('system','block_local_dir')) && (! local_user()) && (! remote_user())) {
if ((Config::get('system', 'block_public') && !local_user() && !remote_user())
|| (Config::get('system', 'block_local_dir') && !local_user() && !remote_user())
) {
notice(L10n::t('Public access denied.') . EOL);
return;
}
@ -42,18 +46,19 @@ function directory_content(App $a) {
$o = '';
Nav::setSelected('directory');
if(x($a->data,'search'))
if (x($a->data, 'search')) {
$search = notags(trim($a->data['search']));
else
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
$gdirpath = '';
$dirurl = Config::get('system','directory');
if(strlen($dirurl)) {
$gdirpath = Profile::zrl($dirurl,true);
} else {
$search = ((x($_GET, 'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
}
if($search) {
$gdirpath = '';
$dirurl = Config::get('system', 'directory');
if (strlen($dirurl)) {
$gdirpath = Profile::zrl($dirurl, true);
}
if ($search) {
$search = dbesc($search);
$sql_extra = " AND ((`profile`.`name` LIKE '%$search%') OR
@ -73,35 +78,35 @@ function directory_content(App $a) {
(`profile`.`prv_keywords` LIKE '%$search%'))";
}
$publish = ((Config::get('system','publish_all')) ? '' : " AND `publish` = 1 " );
$publish = ((Config::get('system', 'publish_all')) ? '' : " AND `publish` = 1 " );
$r = q("SELECT COUNT(*) AS `total` FROM `profile`
LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra ");
if (DBM::is_result($r))
$a->set_pager_total($r[0]['total']);
$cnt = dba::selectFirst("SELECT COUNT(*) AS `total` FROM `profile`
LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` = 1 $publish AND `user`.`blocked` = 0 $sql_extra "
);
if (DBM::is_result($cnt)) {
$a->set_pager_total($cnt['total']);
}
$order = " ORDER BY `name` ASC ";
$limit = intval($a->pager['start']).",".intval($a->pager['itemspage']);
$limit = intval($a->pager['start'])."," . intval($a->pager['itemspage']);
$r = q("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`,
$r = dba::p("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`,
`contact`.`addr`, `contact`.`url` AS profile_url FROM `profile`
LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid`
WHERE `is-default` $publish AND `user`.`blocked` = 0 AND `contact`.`self` $sql_extra $order LIMIT ".$limit);
WHERE `is-default` $publish AND `user`.`blocked` = 0 AND `contact`.`self` $sql_extra $order LIMIT ".$limit
);
if (DBM::is_result($r)) {
if (in_array('small', $a->argv)) {
$photo = 'thumb';
}
else {
} else {
$photo = 'photo';
}
foreach ($r as $rr) {
while ($rr = dba::fetch($r)) {
$itemurl= '';
$itemurl = (($rr['addr'] != "") ? $rr['addr'] : $rr['profile_url']);
@ -111,16 +116,19 @@ function directory_content(App $a) {
$pdesc = (($rr['pdesc']) ? $rr['pdesc'] . '<br />' : '');
$details = '';
if(strlen($rr['locality']))
if (strlen($rr['locality'])) {
$details .= $rr['locality'];
if(strlen($rr['region'])) {
if(strlen($rr['locality']))
}
if (strlen($rr['region'])) {
if (strlen($rr['locality'])) {
$details .= ', ';
}
$details .= $rr['region'];
}
if(strlen($rr['country-name'])) {
if(strlen($details))
if (strlen($rr['country-name'])) {
if (strlen($details)) {
$details .= ', ';
}
$details .= $rr['country-name'];
}
// if(strlen($rr['dob'])) {
@ -132,20 +140,19 @@ function directory_content(App $a) {
$profile = $rr;
if((x($profile,'address') == 1)
|| (x($profile,'locality') == 1)
|| (x($profile,'region') == 1)
|| (x($profile,'postal-code') == 1)
|| (x($profile,'country-name') == 1))
$location = L10n::t('Location:');
if ((x($profile, 'address') == 1)
|| (x($profile, 'locality') == 1)
|| (x($profile, 'region') == 1)
|| (x($profile, 'postal-code') == 1)
|| (x($profile, 'country-name') == 1)
) {
$location = L10n::t('Location:');
}
$gender = ((x($profile,'gender') == 1) ? L10n::t('Gender:') : False);
$marital = ((x($profile,'marital') == 1) ? L10n::t('Status:') : False);
$homepage = ((x($profile,'homepage') == 1) ? L10n::t('Homepage:') : False);
$about = ((x($profile,'about') == 1) ? L10n::t('About:') : False);
$gender = ((x($profile, 'gender') == 1) ? L10n::t('Gender:') : false);
$marital = ((x($profile, 'marital') == 1) ? L10n::t('Status:') : false);
$homepage = ((x($profile, 'homepage') == 1) ? L10n::t('Homepage:') : false);
$about = ((x($profile, 'about') == 1) ? L10n::t('About:') : false);
$location_e = $location;
@ -154,23 +161,23 @@ function directory_content(App $a) {
];
$entry = [
'id' => $rr['id'],
'url' => $profile_link,
'itemurl' => $itemurl,
'thumb' => proxy_url($rr[$photo], false, PROXY_SIZE_THUMB),
'img_hover' => $rr['name'],
'name' => $rr['name'],
'details' => $details,
'id' => $rr['id'],
'url' => $profile_link,
'itemurl' => $itemurl,
'thumb' => proxy_url($rr[$photo], false, PROXY_SIZE_THUMB),
'img_hover' => $rr['name'],
'name' => $rr['name'],
'details' => $details,
'account_type' => Contact::getAccountType($rr),
'profile' => $profile,
'location' => $location_e,
'tags' => $rr['pub_keywords'],
'gender' => $gender,
'pdesc' => $pdesc,
'marital' => $marital,
'homepage' => $homepage,
'about' => $about,
'photo_menu' => $photo_menu,
'profile' => $profile,
'location' => $location_e,
'tags' => $rr['pub_keywords'],
'gender' => $gender,
'pdesc' => $pdesc,
'marital' => $marital,
'homepage' => $homepage,
'about' => $about,
'photo_menu' => $photo_menu,
];
@ -187,20 +194,21 @@ function directory_content(App $a) {
$entries[] = $arr['entry'];
}
dba::close($r);
$tpl = get_markup_template('directory_header.tpl');
$o .= replace_macros($tpl, [
'$search' => $search,
'$search' => $search,
'$globaldir' => L10n::t('Global Directory'),
'$gdirpath' => $gdirpath,
'$desc' => L10n::t('Find on this site'),
'$contacts' => $entries,
'$finding' => L10n::t('Results for:'),
'$findterm' => (strlen($search) ? $search : ""),
'$title' => L10n::t('Site Directory'),
'$submit' => L10n::t('Find'),
'$paginate' => paginate($a),
'$gdirpath' => $gdirpath,
'$desc' => L10n::t('Find on this site'),
'$contacts' => $entries,
'$finding' => L10n::t('Results for:'),
'$findterm' => (strlen($search) ? $search : ""),
'$title' => L10n::t('Site Directory'),
'$submit' => L10n::t('Find'),
'$paginate' => paginate($a),
]);
} else {
info(L10n::t("No entries \x28some entries may be hidden\x29.") . EOL);

View file

@ -15,6 +15,7 @@ use Friendica\Model\Profile;
use Friendica\Network\Probe;
use Friendica\Protocol\PortableContact;
use Friendica\Util\Network;
use Friendica\Database\DBM;
require_once 'mod/contacts.php';
@ -113,32 +114,22 @@ function dirfind_content(App $a, $prefix = "") {
/// @TODO These 2 SELECTs are not checked on validity with DBM::is_result()
$count = q("SELECT count(*) AS `total` FROM `gcontact`
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
AND `contact`.`network` = `gcontact`.`network`
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
(`gcontact`.`url` LIKE '%s' OR `gcontact`.`name` LIKE '%s' OR `gcontact`.`location` LIKE '%s' OR
`gcontact`.`addr` LIKE '%s' OR `gcontact`.`about` LIKE '%s' OR `gcontact`.`keywords` LIKE '%s') $extra_sql",
intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND),
WHERE NOT `hide` AND `network` IN ('%s', '%s', '%s') AND
((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND
(`url` LIKE '%s' OR `name` LIKE '%s' OR `location` LIKE '%s' OR
`addr` LIKE '%s' OR `about` LIKE '%s' OR `keywords` LIKE '%s') $extra_sql",
dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora),
dbesc(escape_tags($search2)), dbesc(escape_tags($search2)), dbesc(escape_tags($search2)),
dbesc(escape_tags($search2)), dbesc(escape_tags($search2)), dbesc(escape_tags($search2)));
$results = q("SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`photo`, `gcontact`.`network`, `gcontact`.`keywords`, `gcontact`.`addr`
$results = q("SELECT `nurl`
FROM `gcontact`
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
AND `contact`.`network` = `gcontact`.`network`
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
(`gcontact`.`url` LIKE '%s' OR `gcontact`.`name` LIKE '%s' OR `gcontact`.`location` LIKE '%s' OR
`gcontact`.`addr` LIKE '%s' OR `gcontact`.`about` LIKE '%s' OR `gcontact`.`keywords` LIKE '%s') $extra_sql
GROUP BY `gcontact`.`nurl`
ORDER BY `gcontact`.`updated` DESC LIMIT %d, %d",
intval(local_user()), dbesc(CONTACT_IS_SHARING), dbesc(CONTACT_IS_FRIEND),
WHERE NOT `hide` AND `network` IN ('%s', '%s', '%s') AND
((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND
(`url` LIKE '%s' OR `name` LIKE '%s' OR `location` LIKE '%s' OR
`addr` LIKE '%s' OR `about` LIKE '%s' OR `keywords` LIKE '%s') $extra_sql
GROUP BY `nurl`
ORDER BY `updated` DESC LIMIT %d, %d",
dbesc(NETWORK_DFRN), dbesc($ostatus), dbesc($diaspora),
dbesc(escape_tags($search2)), dbesc(escape_tags($search2)), dbesc(escape_tags($search2)),
dbesc(escape_tags($search2)), dbesc(escape_tags($search2)), dbesc(escape_tags($search2)),
@ -148,14 +139,21 @@ function dirfind_content(App $a, $prefix = "") {
$j->items_page = $perpage;
$j->page = $a->pager['page'];
foreach ($results AS $result) {
if (PortableContact::alternateOStatusUrl($result["url"])) {
if (PortableContact::alternateOStatusUrl($result["nurl"])) {
continue;
}
$result = Contact::getDetailsByURL($result["url"], local_user(), $result);
$urlparts = parse_url($result["nurl"]);
// Ignore results that look strange.
// For historic reasons the gcontact table does contain some garbage.
if (!empty($urlparts['query']) || !empty($urlparts['fragment'])) {
continue;
}
$result = Contact::getDetailsByURL($result["nurl"], local_user());
if ($result["name"] == "") {
$urlparts = parse_url($result["url"]);
$result["name"] = end(explode("/", $urlparts["path"]));
}
@ -204,11 +202,10 @@ function dirfind_content(App $a, $prefix = "") {
if ($jj->cid > 0) {
$connlnk = "";
$conntxt = "";
$contact = q("SELECT * FROM `contact` WHERE `id` = %d",
intval($jj->cid));
if ($contact) {
$photo_menu = Contact::photoMenu($contact[0]);
$details = _contact_detail_for_template($contact[0]);
$contact = dba::selectFirst('contact', [], ['id' => $jj->cid]);
if (DBM::is_result($contact)) {
$photo_menu = Contact::photoMenu($contact);
$details = _contact_detail_for_template($contact);
$alt_text = $details['alt_text'];
} else {
$photo_menu = [];

View file

@ -212,7 +212,11 @@ function display_content(App $a, $update = false, $update_uid = 0) {
if ($update) {
$item_id = $_REQUEST['item_id'];
$item = dba::selectFirst('item', ['uid', 'parent'], ['id' => $item_id]);
$a->profile = ['uid' => intval($item['uid']), 'profile_uid' => intval($item['uid'])];
if ($item['uid'] != 0) {
$a->profile = ['uid' => intval($item['uid']), 'profile_uid' => intval($item['uid'])];
} else {
$a->profile = ['uid' => intval($update_uid), 'profile_uid' => intval($update_uid)];
}
$item_parent = $item['parent'];
} else {
$item_id = (($a->argc > 2) ? $a->argv[2] : 0);

View file

@ -9,6 +9,7 @@ use Friendica\Core\System;
use Friendica\Model\Contact;
use Friendica\Model\Profile;
use Friendica\Network\Probe;
use Friendica\Database\DBM;
function follow_post(App $a) {
@ -60,19 +61,20 @@ function follow_content(App $a) {
$submit = L10n::t('Submit Request');
// There is a current issue. It seems as if you can't start following a Friendica that is following you
// With Diaspora this works - but Friendica is special, it seems ...
$r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
// Don't try to add a pending contact
$r = q("SELECT `pending` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
(`nurl` = '%s' OR `alias` = '%s' OR `alias` = '%s') AND
`network` != '%s' LIMIT 1",
intval(local_user()), dbesc(CONTACT_IS_FOLLOWER), dbesc(NETWORK_DFRN), dbesc(normalise_link($url)),
dbesc(normalise_link($url)), dbesc($url), dbesc(NETWORK_STATUSNET));
if ($r) {
notice(L10n::t('You already added this contact.').EOL);
$submit = "";
//goaway($_SESSION['return_url']);
// NOTREACHED
if ($r[0]['pending']) {
notice(L10n::t('You already added this contact.').EOL);
$submit = "";
//goaway($_SESSION['return_url']);
// NOTREACHED
}
}
$ret = Probe::uri($url);
@ -102,7 +104,7 @@ function follow_content(App $a) {
$ret["url"] = $ret["addr"];
}
if ($ret['network'] === NETWORK_DFRN) {
if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
$request = $ret["request"];
$tpl = get_markup_template('dfrn_request.tpl');
} else {

View file

@ -397,7 +397,8 @@ function check_funcs(&$checks) {
check_add($ck_funcs, L10n::t('PDO or MySQLi PHP module'), true, true, "");
check_add($ck_funcs, L10n::t('mb_string PHP module'), true, true, "");
check_add($ck_funcs, L10n::t('XML PHP module'), true, true, "");
check_add($ck_funcs, L10n::t('iconv module'), true, true, "");
check_add($ck_funcs, L10n::t('iconv PHP module'), true, true, "");
check_add($ck_funcs, L10n::t('POSIX PHP module'), true, true, "");
if (function_exists('apache_get_modules')) {
if (! in_array('mod_rewrite',apache_get_modules())) {
@ -432,8 +433,12 @@ function check_funcs(&$checks) {
$ck_funcs[4]['help'] = L10n::t('Error: mb_string PHP module required but not installed.');
}
if (! function_exists('iconv_strlen')) {
$ck_funcs[6]['status'] = false;
$ck_funcs[6]['help'] = L10n::t('Error: iconv PHP module required but not installed.');
}
if (! function_exists('posix_kill')) {
$ck_funcs[7]['status'] = false;
$ck_funcs[7]['help'] = L10n::t('Error: iconv PHP module required but not installed.');
$ck_funcs[7]['help'] = L10n::t('Error: POSIX PHP module required but not installed.');
}
$checks = array_merge($checks, $ck_funcs);
@ -442,8 +447,8 @@ function check_funcs(&$checks) {
try {
$xml = new DOMDocument();
} catch (Exception $e) {
$ck_funcs[6]['status'] = false;
$ck_funcs[6]['help'] = L10n::t('Error, XML PHP module required but not installed.');
$ck_funcs[5]['status'] = false;
$ck_funcs[5]['help'] = L10n::t('Error, XML PHP module required but not installed.');
}
}
@ -540,7 +545,7 @@ function load_database_rem($v, $i) {
}
function load_database() {
$errors = DBStructure::update(false, true);
$errors = DBStructure::update(false, true, true);
return $errors;
}

View file

@ -29,12 +29,14 @@ function ostatus_subscribe_content(App $a) {
if (PConfig::get($uid, "ostatus", "legacy_friends") == "") {
if ($_REQUEST["url"] == "") {
PConfig::delete($uid, "ostatus", "legacy_contact");
return $o.L10n::t("No contact provided.");
}
$contact = Probe::uri($_REQUEST["url"]);
if (!$contact) {
PConfig::delete($uid, "ostatus", "legacy_contact");
return $o.L10n::t("Couldn't fetch information for contact.");
}
@ -44,6 +46,7 @@ function ostatus_subscribe_content(App $a) {
$data = Network::curl($api."statuses/friends.json?screen_name=".$contact["nick"]);
if (!$data["success"]) {
PConfig::delete($uid, "ostatus", "legacy_contact");
return $o.L10n::t("Couldn't fetch friends for contact.");
}

View file

@ -2,162 +2,136 @@
use Friendica\App;
use Friendica\Database\DBM;
use Friendica\Protocol\OStatus;
function hub_return($valid,$body) {
require_once('include/security.php');
require_once('include/items.php');
if($valid) {
header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
function hub_return($valid, $body)
{
if ($valid) {
header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
echo $body;
killme();
} else {
header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}
else {
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . 'Not Found');
killme();
}
// NOTREACHED
killme();
}
// when receiving an XML feed, always return OK
function hub_post_return() {
header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
function hub_post_return()
{
header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
killme();
}
function pubsub_init(App $a) {
function pubsub_init(App $a)
{
$nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
$contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0 );
if($_SERVER['REQUEST_METHOD'] === 'GET') {
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$hub_mode = notags(trim(defaults($_GET, 'hub_mode', '')));
$hub_topic = notags(trim(defaults($_GET, 'hub_topic', '')));
$hub_challenge = notags(trim(defaults($_GET, 'hub_challenge', '')));
$hub_lease = notags(trim(defaults($_GET, 'hub_lease_seconds', '')));
$hub_verify = notags(trim(defaults($_GET, 'hub_verify_token', '')));
$hub_mode = ((x($_GET,'hub_mode')) ? notags(trim($_GET['hub_mode'])) : '');
$hub_topic = ((x($_GET,'hub_topic')) ? notags(trim($_GET['hub_topic'])) : '');
$hub_challenge = ((x($_GET,'hub_challenge')) ? notags(trim($_GET['hub_challenge'])) : '');
$hub_lease = ((x($_GET,'hub_lease_seconds')) ? notags(trim($_GET['hub_lease_seconds'])) : '');
$hub_verify = ((x($_GET,'hub_verify_token')) ? notags(trim($_GET['hub_verify_token'])) : '');
logger('pubsub: Subscription from ' . $_SERVER['REMOTE_ADDR']);
logger('pubsub: data: ' . print_r($_GET,true), LOGGER_DATA);
logger('Subscription from ' . $_SERVER['REMOTE_ADDR'] . ' Mode: ' . $hub_mode . ' Nick: ' . $nick);
logger('Data: ' . print_r($_GET,true), LOGGER_DATA);
$subscribe = (($hub_mode === 'subscribe') ? 1 : 0);
$r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
dbesc($nick)
);
if (! DBM::is_result($r)) {
logger('pubsub: local account not found: ' . $nick);
$owner = dba::selectFirst('user', ['uid'], ['nickname' => $nick, 'account_expired' => false, 'account_removed' => false]);
if (!DBM::is_result($owner)) {
logger('Local account not found: ' . $nick);
hub_return(false, '');
}
$condition = ['uid' => $owner['uid'], 'id' => $contact_id, 'blocked' => false, 'pending' => false];
$owner = $r[0];
if (!empty($hub_verify)) {
$condition['hub-verify'] = $hub_verify;
}
$sql_extra = ((strlen($hub_verify)) ? sprintf(" AND `hub-verify` = '%s' ", dbesc($hub_verify)) : '');
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d
AND `blocked` = 0 AND `pending` = 0 $sql_extra LIMIT 1",
intval($contact_id),
intval($owner['uid'])
);
if (! DBM::is_result($r)) {
logger('pubsub: contact '.$contact_id.' not found.');
$contact = dba::selectFirst('contact', ['id', 'poll'], $condition);
if (!DBM::is_result($contact)) {
logger('Contact ' . $contact_id . ' not found.');
hub_return(false, '');
}
if ($hub_topic)
if(! link_compare($hub_topic,$r[0]['poll'])) {
logger('pubsub: hub topic ' . $hub_topic . ' != ' . $r[0]['poll']);
// should abort but let's humour them.
}
$contact = $r[0];
if (!empty($hub_topic) && !link_compare($hub_topic, $contact['poll'])) {
logger('Hub topic ' . $hub_topic . ' != ' . $contact['poll']);
hub_return(false, '');
}
// We must initiate an unsubscribe request with a verify_token.
// Don't allow outsiders to unsubscribe us.
if($hub_mode === 'unsubscribe') {
if(! strlen($hub_verify)) {
logger('pubsub: bogus unsubscribe');
hub_return(false, '');
}
logger('pubsub: unsubscribe success');
if (($hub_mode === 'unsubscribe') && empty($hub_verify)) {
logger('Bogus unsubscribe');
hub_return(false, '');
}
if ($hub_mode)
$r = q("UPDATE `contact` SET `subhub` = %d WHERE `id` = %d",
intval($subscribe),
intval($contact['id'])
);
if (!empty($hub_mode)) {
dba::update('contact', ['subhub' => $subscribe], ['id' => $contact['id']]);
logger($hub_mode . ' success for contact ' . $contact_id . '.');
}
hub_return(true, $hub_challenge);
}
}
require_once('include/security.php');
function pubsub_post(App $a) {
function pubsub_post(App $a)
{
$xml = file_get_contents('php://input');
logger('pubsub: feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $a->cmd );
logger('pubsub: user-agent: ' . $_SERVER['HTTP_USER_AGENT'] );
logger('pubsub: data: ' . $xml, LOGGER_DATA);
// if(! stristr($xml,'<?xml')) {
// logger('pubsub_post: bad xml');
// hub_post_return();
// }
logger('Feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $a->cmd . ' with user-agent: ' . $_SERVER['HTTP_USER_AGENT']);
logger('Data: ' . $xml, LOGGER_DATA);
$nick = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
$contact_id = (($a->argc > 2) ? intval($a->argv[2]) : 0 );
$r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
dbesc($nick)
);
if (! DBM::is_result($r)) {
$importer = dba::selectFirst('user', [], ['nickname' => $nick, 'account_expired' => false, 'account_removed' => false]);
if (!DBM::is_result($importer)) {
hub_post_return();
}
$importer = $r[0];
$condition = ['id' => $contact_id, 'uid' => $importer['uid'], 'subhub' => true, 'blocked' => false];
$contact = dba::selectFirst('contact', [], $condition);
$r = q("SELECT * FROM `contact` WHERE `subhub` AND `id` = %d AND `uid` = %d
AND (`rel` = %d OR `rel` = %d OR network = '%s') AND NOT `blocked` LIMIT 1",
intval($contact_id),
intval($importer['uid']),
intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND),
dbesc(NETWORK_FEED)
);
if (!DBM::is_result($contact)) {
$author = OStatus::salmonAuthor($xml, $importer);
if (!empty($author['contact-id'])) {
$condition = ['id' => $author['contact-id'], 'uid' => $importer['uid'], 'subhub' => true, 'blocked' => false];
$contact = dba::selectFirst('contact', [], $condition);
logger('No record for ' . $nick .' with contact id ' . $contact_id . ' - using '.$author['contact-id'].' instead.');
}
if (!DBM::is_result($contact)) {
logger('Contact ' . $author["author-link"] . ' (' . $contact_id . ') for user ' . $nick . " wasn't found - ignored. XML: " . $xml);
hub_post_return();
}
}
if (! DBM::is_result($r)) {
logger('pubsub: no contact record for "'.$nick.' ('.$contact_id.')" - ignored. '.$xml);
if (!in_array($contact['rel'], [CONTACT_IS_SHARING, CONTACT_IS_FRIEND]) && ($contact['network'] != NETWORK_FEED)) {
logger('Contact ' . $contact['id'] . ' is not expected to share with us - ignored.');
hub_post_return();
}
$contact = $r[0];
// we have no way to match Diaspora guid's with atom post id's and could get duplicates.
// we'll assume that direct delivery is robust (and this is a bad assumption, but the duplicates are messy).
if($r[0]['network'] === NETWORK_DIASPORA)
// We import feeds from OStatus, Friendica and ATOM/RSS.
/// @todo Check if Friendica posts really arrive here - otherwise we can discard some stuff
if (!in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN, NETWORK_FEED])) {
hub_post_return();
}
logger('Import item for ' . $nick . ' from ' . $contact['nick'] . ' (' . $contact['id'] . ')');
$feedhub = '';
consume_feed($xml, $importer, $contact, $feedhub);
require_once('include/items.php');
consume_feed($xml,$importer,$contact,$feedhub,1,1);
// do it a second time so that any children find their parents.
consume_feed($xml,$importer,$contact,$feedhub,1,2);
// do it a second time for DFRN so that any children find their parents.
if ($contact['network'] === NETWORK_DFRN) {
consume_feed($xml, $importer, $contact, $feedhub);
}
hub_post_return();
}

View file

@ -208,8 +208,7 @@ function settings_post(App $a)
return;
}
if (($a->argc > 1) && ($a->argv[1] == 'connectors'))
{
if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
if (x($_POST, 'general-submit')) {
@ -1116,7 +1115,7 @@ function settings_content(App $a)
if (strlen(Config::get('system', 'directory'))) {
$profile_in_net_dir = replace_macros($opt_tpl, [
'$field' => ['profile_in_netdirectory', L10n::t('Publish your default profile in the global social directory?'), $profile['net-publish'], L10n::t('Your profile will be publishedin this node\'s <a href="%s">local directory</a>. Your profile details may be publicly visible depending on the system settings.', System::baseUrl().'/directory'), [L10n::t('No'), L10n::t('Yes')]]
'$field' => ['profile_in_netdirectory', L10n::t('Publish your default profile in the global social directory?'), $profile['net-publish'], L10n::t('Your profile will be published in this node\'s <a href="%s">local directory</a>. Your profile details may be publicly visible depending on the system settings.', System::baseUrl().'/directory'), [L10n::t('No'), L10n::t('Yes')]]
]);
} else {
$profile_in_net_dir = '';

View file

@ -33,7 +33,7 @@ function unfollow_post(App $a)
if (!DBM::is_result($contact)) {
notice(L10n::t("Contact wasn't found or can't be unfollowed."));
} else {
if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA])) {
if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_DFRN])) {
$r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1",
intval($uid)
@ -75,7 +75,7 @@ function unfollow_content(App $a)
// NOTREACHED
}
if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) {
if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
notice(L10n::t("Unfollowing is currently not supported by your network.").EOL);
$submit = "";
// NOTREACHED

View file

@ -7,7 +7,7 @@
namespace Friendica\Content\Text;
use DOMDocument;
use DomXPath;
use DOMXPath;
use Exception;
use Friendica\BaseObject;
use Friendica\Content\OEmbed;
@ -680,7 +680,7 @@ class BBCode extends BaseObject
$return = '';
if ($simplehtml == 7) {
$return = self::convertUrlForMastodon($data["url"]);
$return = self::convertUrlForOStatus($data["url"]);
} elseif (($simplehtml != 4) && ($simplehtml != 0)) {
$return = sprintf('<a href="%s" target="_blank">%s</a><br>', $data["url"], $data["title"]);
} else {
@ -708,9 +708,10 @@ class BBCode extends BaseObject
}
if ($data["description"] != "" && $data["description"] != $data["title"]) {
$return .= sprintf('<blockquote>%s</blockquote>', trim(self::convert($data["description"])));
// Sanitize the HTML by converting it to BBCode
$bbcode = HTML::toBBCode($data["description"]);
$return .= sprintf('<blockquote>%s</blockquote>', trim(self::convert($bbcode)));
}
if ($data["type"] == "link") {
$return .= sprintf('<sup><a href="%s">%s</a></sup>', $data['url'], parse_url($data['url'], PHP_URL_HOST));
}
@ -757,7 +758,7 @@ class BBCode extends BaseObject
if (($data["url"] != "") && ($data["title"] != "")) {
$text .= "\n[url=" . $data["url"] . "]" . $data["title"] . "[/url]";
} elseif (($data["url"] != "")) {
$text .= "\n" . $data["url"];
$text .= "\n[url]" . $data["url"] . "[/url]";
}
return $text . "\n" . $data["after"];
@ -770,7 +771,7 @@ class BBCode extends BaseObject
* @param array $match Array with the matching values
* @return string reformatted link including HTML codes
*/
private static function convertUrlForMastodonCallback($match)
private static function convertUrlForOStatusCallback($match)
{
$url = $match[1];
@ -783,34 +784,27 @@ class BBCode extends BaseObject
return $match[0];
}
return self::convertUrlForMastodon($url);
return self::convertUrlForOStatus($url);
}
/**
* @brief Converts [url] BBCodes in a format that looks fine on Mastodon and GNU Social.
* @brief Converts [url] BBCodes in a format that looks fine on OStatus systems.
* @param string $url URL that is about to be reformatted
* @return string reformatted link including HTML codes
*/
private static function convertUrlForMastodon($url)
private static function convertUrlForOStatus($url)
{
$parts = parse_url($url);
$scheme = $parts['scheme'] . '://';
$styled_url = str_replace($scheme, '', $url);
$html = '<a href="%s" class="attachment" rel="nofollow noopener" target="_blank">' .
'<span class="invisible">%s</span>';
if (strlen($styled_url) > 30) {
$html .= '<span class="ellipsis">%s</span>' .
'<span class="invisible">%s</span></a>';
$ellipsis = substr($styled_url, 0, 30);
$rest = substr($styled_url, 30);
return sprintf($html, $url, $scheme, $ellipsis, $rest);
} else {
$html .= '%s</a>';
return sprintf($html, $url, $scheme, $styled_url);
$styled_url = substr($styled_url, 0, 30) . "";
}
$html = '<a href="%s" target="_blank">%s</a>';
return sprintf($html, $url, $styled_url);
}
/*
@ -1105,13 +1099,13 @@ class BBCode extends BaseObject
}
if (stripos(normalise_link($link), 'http://twitter.com/') === 0) {
$text .= '<br /><a href="' . $link . '">' . $link . '</a>';
} else {
$text .= $headline . '<blockquote>' . trim($share[3]) . "</blockquote><br />";
if ($link != "") {
$text .= '<br /><a href="' . $link . '">[l]</a>';
}
} else {
$text .= '<br /><a href="' . $link . '">' . $link . '</a>';
}
break;
@ -1207,7 +1201,7 @@ class BBCode extends BaseObject
$doc = new DOMDocument();
@$doc->loadHTML($body);
$xpath = new DomXPath($doc);
$xpath = new DOMXPath($doc);
$list = $xpath->query("//meta[@name]");
foreach ($list as $node) {
$attr = [];
@ -1439,8 +1433,8 @@ class BBCode extends BaseObject
$autolink_regex = "/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism";
$text = preg_replace($autolink_regex, '$1[url]$2[/url]', $text);
if ($simple_html == 7) {
$text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'self::convertUrlForMastodonCallback', $text);
$text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'self::convertUrlForMastodonCallback', $text);
$text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);
$text = preg_replace_callback("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", 'self::convertUrlForOStatusCallback', $text);
}
} else {
$text = preg_replace("(\[url\]([$URLSearchString]*)\[\/url\])ism", " $1 ", $text);
@ -1540,10 +1534,8 @@ class BBCode extends BaseObject
if (strpos($text, '[/map]') !== false) {
$text = preg_replace_callback(
"/\[map\](.*?)\[\/map\]/ism",
function ($match) {
// the extra space in the following line is intentional
// Whyyy? - @MrPetovan
return str_replace($match[0], '<div class="map" >' . Map::byLocation($match[1]) . '</div>', $match[0]);
function ($match) use ($simple_html) {
return str_replace($match[0], '<p class="map">' . Map::byLocation($match[1], $simple_html) . '</p>', $match[0]);
},
$text
);
@ -1551,16 +1543,14 @@ class BBCode extends BaseObject
if (strpos($text, '[map=') !== false) {
$text = preg_replace_callback(
"/\[map=(.*?)\]/ism",
function ($match) {
// the extra space in the following line is intentional
// Whyyy? - @MrPetovan
return str_replace($match[0], '<div class="map" >' . Map::byCoordinates(str_replace('/', ' ', $match[1])) . '</div>', $match[0]);
function ($match) use ($simple_html) {
return str_replace($match[0], '<p class="map">' . Map::byCoordinates(str_replace('/', ' ', $match[1]), $simple_html) . '</p>', $match[0]);
},
$text
);
}
if (strpos($text, '[map]') !== false) {
$text = preg_replace("/\[map\]/", '<div class="map"></div>', $text);
$text = preg_replace("/\[map\]/", '<p class="map"></p>', $text);
}
// Check for headers

View file

@ -135,7 +135,7 @@ class NotificationsManager extends BaseObject
public function setSeen($note, $seen = true)
{
return q(
"UPDATE `notify` SET `seen` = %d WHERE ( `link` = '%s' OR ( `parent` != 0 AND `parent` = %d AND `otype` = '%s' )) AND `uid` = %d",
"UPDATE `notify` SET `seen` = %d WHERE (`link` = '%s' OR (`parent` != 0 AND `parent` = %d AND `otype` = '%s')) AND `uid` = %d",
intval($seen),
dbesc($note['link']),
intval($note['parent']),
@ -384,16 +384,18 @@ class NotificationsManager extends BaseObject
private function networkTotal($seen = 0)
{
$sql_seen = "";
$index_hint = "";
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT COUNT(*) AS `total`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` = 1 AND `pitem`.`parent` != 0 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0
FROM `item` $index_hint STRAIGHT_JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` AND `pitem`.`parent` != 0 AND
NOT `item`.`deleted` AND `item`.`uid` = %d AND NOT `item`.`wall`
$sql_seen",
intval(local_user())
);
@ -423,18 +425,20 @@ class NotificationsManager extends BaseObject
$total = $this->networkTotal($seen);
$notifs = [];
$sql_seen = "";
$index_hint = "";
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` AS `object`,
`pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink`, `pitem`.`guid` AS `pguid`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` = 1 AND `pitem`.`parent` != 0 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0
FROM `item` $index_hint STRAIGHT_JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` AND `pitem`.`parent` != 0 AND
NOT `item`.`deleted` AND `item`.`uid` = %d AND NOT `item`.`wall`
$sql_seen
ORDER BY `item`.`created` DESC LIMIT %d, %d ",
intval(local_user()),
@ -466,7 +470,7 @@ class NotificationsManager extends BaseObject
$sql_seen = "";
if ($seen === 0) {
$sql_seen = " AND `seen` = 0 ";
$sql_seen = " AND NOT `seen` ";
}
$r = q(
@ -501,7 +505,7 @@ class NotificationsManager extends BaseObject
$sql_seen = "";
if ($seen === 0) {
$sql_seen = " AND `seen` = 0 ";
$sql_seen = " AND NOT `seen` ";
}
$r = q(
@ -536,7 +540,7 @@ class NotificationsManager extends BaseObject
$myurl = str_replace(['www.', '.'], ['', '\\.'], $myurl);
$diasp_url = str_replace('/profile/', '/u/', $myurl);
$sql_extra = sprintf(
" AND ( `item`.`author-link` regexp '%s' OR `item`.`tag` regexp '%s' OR `item`.`tag` regexp '%s' ) ",
" AND (`item`.`author-link` REGEXP '%s' OR `item`.`tag` REGEXP '%s' OR `item`.`tag` REGEXP '%s') ",
dbesc($myurl . '$'),
dbesc($myurl . '\\]'),
dbesc($diasp_url . '\\]')
@ -555,19 +559,21 @@ class NotificationsManager extends BaseObject
private function personalTotal($seen = 0)
{
$sql_seen = "";
$index_hint = "";
$sql_extra = $this->personalSqlExtra();
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT COUNT(*) AS `total`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` = 1
FROM `item` $index_hint
WHERE `item`.`visible`
$sql_extra
$sql_seen
AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ",
AND NOT `item`.`deleted` AND `item`.`uid` = %d AND NOT `item`.`wall`",
intval(local_user())
);
if (DBM::is_result($r)) {
@ -597,20 +603,22 @@ class NotificationsManager extends BaseObject
$sql_extra = $this->personalSqlExtra();
$notifs = [];
$sql_seen = "";
$index_hint = "";
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` AS `object`,
`pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink`, `pitem`.`guid` AS `pguid`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` = 1
FROM `item` $index_hint STRAIGHT_JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible`
$sql_extra
$sql_seen
AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0
AND NOT `item`.`deleted` AND `item`.`uid` = %d AND NOT `item`.`wall`
ORDER BY `item`.`created` DESC LIMIT %d, %d ",
intval(local_user()),
intval($start),
@ -639,13 +647,15 @@ class NotificationsManager extends BaseObject
private function homeTotal($seen = 0)
{
$sql_seen = "";
$index_hint = "";
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT COUNT(*) AS `total` FROM `item`
"SELECT COUNT(*) AS `total` FROM `item` $index_hint
WHERE `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1
$sql_seen",
@ -677,18 +687,20 @@ class NotificationsManager extends BaseObject
$total = $this->homeTotal($seen);
$notifs = [];
$sql_seen = "";
$index_hint = "";
if ($seen === 0) {
$sql_seen = " AND `item`.`unseen` = 1 ";
$sql_seen = " AND `item`.`unseen` ";
$index_hint = "USE INDEX (`uid_unseen_contactid`)";
}
$r = q(
"SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`, `item`.`unseen`,
`item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` AS `object`,
`pitem`.`author-name` AS `pname`, `pitem`.`author-link` AS `plink`, `pitem`.`guid` AS `pguid`
FROM `item` INNER JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` = 1 AND
`item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1
FROM `item` $index_hint STRAIGHT_JOIN `item` AS `pitem` ON `pitem`.`id`=`item`.`parent`
WHERE `item`.`visible` AND
NOT `item`.`deleted` AND `item`.`uid` = %d AND `item`.`wall`
$sql_seen
ORDER BY `item`.`created` DESC LIMIT %d, %d ",
intval(local_user()),

View file

@ -201,7 +201,7 @@ class Worker
$mypid = getmypid();
// Quit when in maintenance
if (Config::get('system', 'maintenance', true)) {
if (Config::get('system', 'maintenance', false, true)) {
logger("Maintenance mode - quit process ".$mypid, LOGGER_DEBUG);
return false;
}

View file

@ -199,12 +199,13 @@ class DBStructure
*
* @param bool $verbose
* @param bool $action Whether to actually apply the update
* @param bool $install Is this the initial update during the installation?
* @param array $tables An array of the database tables
* @param array $definition An array of the definition tables
* @return string Empty string if the update is successful, error messages otherwise
*/
public static function update($verbose, $action, array $tables = null, array $definition = null) {
if ($action) {
public static function update($verbose, $action, $install = false, array $tables = null, array $definition = null) {
if ($action && !$install) {
Config::set('system', 'maintenance', 1);
Config::set('system', 'maintenance_reason', L10n::t(': Database update', DBM::date().' '.date('e')));
}
@ -455,7 +456,9 @@ class DBStructure
}
if ($action) {
Config::set('system', 'maintenance_reason', L10n::t('%s: updating %s table.', DBM::date().' '.date('e'), $name));
if (!$install) {
Config::set('system', 'maintenance_reason', L10n::t('%s: updating %s table.', DBM::date().' '.date('e'), $name));
}
// Ensure index conversion to unique removes duplicates
if ($is_unique && ($temp_name != $name)) {
@ -505,15 +508,15 @@ class DBStructure
}
}
if ($action) {
if ($action && !$install) {
Config::set('system', 'maintenance', 0);
Config::set('system', 'maintenance_reason', '');
}
if ($errors) {
Config::set('system', 'dbupdate', DB_UPDATE_FAILED);
} else {
Config::set('system', 'dbupdate', DB_UPDATE_SUCCESSFUL);
if ($errors) {
Config::set('system', 'dbupdate', DB_UPDATE_FAILED);
} else {
Config::set('system', 'dbupdate', DB_UPDATE_SUCCESSFUL);
}
}
return $errors;
@ -1143,6 +1146,7 @@ class DBStructure
"author-link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"author-avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"body" => ["type" => "mediumtext", "comment" => ""],
"app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
"verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],

View file

@ -173,20 +173,18 @@ class Contact extends BaseObject
*/
public static function terminateFriendship(array $user, array $contact)
{
if ($contact['network'] === NETWORK_OSTATUS) {
if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
// create an unfollow slap
$item = [];
$item['verb'] = NAMESPACE_OSTATUS . "/unfollow";
$item['follow'] = $contact["url"];
$slap = OStatus::salmon($item, $user);
if ((x($contact, 'notify')) && (strlen($contact['notify']))) {
if (!empty($contact['notify'])) {
Salmon::slapper($user, $contact['notify'], $slap);
}
} elseif ($contact['network'] === NETWORK_DIASPORA) {
} elseif ($contact['network'] == NETWORK_DIASPORA) {
Diaspora::sendUnshare($user, $contact);
} elseif ($contact['network'] === NETWORK_DFRN) {
DFRN::deliver($user, $contact, 'placeholder', 1);
}
}
@ -516,7 +514,7 @@ class Contact extends BaseObject
}
$sparkle = false;
if ($contact['network'] === NETWORK_DFRN) {
if (($contact['network'] === NETWORK_DFRN) && !$contact['self']) {
$sparkle = true;
$profile_link = System::baseUrl() . '/redir/' . $contact['id'];
} else {
@ -533,18 +531,21 @@ class Contact extends BaseObject
$profile_link = $profile_link . '?url=profile';
}
if (in_array($contact['network'], [NETWORK_DFRN, NETWORK_DIASPORA])) {
if (in_array($contact['network'], [NETWORK_DFRN, NETWORK_DIASPORA]) && !$contact['self']) {
$pm_url = System::baseUrl() . '/message/new/' . $contact['id'];
}
if ($contact['network'] == NETWORK_DFRN) {
if (($contact['network'] == NETWORK_DFRN) && !$contact['self']) {
$poke_link = System::baseUrl() . '/poke/?f=&c=' . $contact['id'];
}
$contact_url = System::baseUrl() . '/contacts/' . $contact['id'];
$posts_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/posts';
$contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1';
if (!$contact['self']) {
$contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1';
}
/**
* Menu array:
@ -1168,7 +1169,26 @@ class Contact extends BaseObject
return result;
}
if ($ret['network'] === NETWORK_DFRN) {
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' AND NOT `pending` LIMIT 1",
intval($uid),
dbesc($ret['poll']),
dbesc(normalise_link($ret['poll'])),
dbesc($ret['network'])
);
if (!DBM::is_result($r)) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' AND NOT `pending` LIMIT 1",
intval($uid),
dbesc(normalise_link($url)),
dbesc($ret['network'])
);
}
if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
if ($interactive) {
if (strlen($a->path)) {
$myaddr = bin2hex(System::baseUrl() . '/profile/' . $a->user['nickname']);
@ -1180,7 +1200,7 @@ class Contact extends BaseObject
// NOTREACHED
}
} elseif (Config::get('system', 'dfrn_only')) {
} elseif (Config::get('system', 'dfrn_only') && ($ret['network'] != NETWORK_DFRN)) {
$result['message'] = L10n::t('This site is not configured to allow communications with other networks.') . EOL;
$result['message'] != L10n::t('No compatible communication protocols or feeds were discovered.') . EOL;
return $result;
@ -1230,25 +1250,6 @@ class Contact extends BaseObject
$writeable = 1;
}
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' LIMIT 1",
intval($uid),
dbesc($ret['poll']),
dbesc(normalise_link($ret['poll'])),
dbesc($ret['network'])
);
if (!DBM::is_result($r)) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' LIMIT 1",
intval($uid),
dbesc(normalise_link($url)),
dbesc($ret['network'])
);
}
if (DBM::is_result($r)) {
// update contact
$new_relation = (($r[0]['rel'] == CONTACT_IS_FOLLOWER) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
@ -1309,16 +1310,16 @@ class Contact extends BaseObject
);
if (DBM::is_result($r)) {
if (($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) {
if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
// create a follow slap
$item = [];
$item['verb'] = ACTIVITY_FOLLOW;
$item['follow'] = $contact["url"];
$slap = OStatus::salmon($item, $r[0]);
Salmon::slapper($r[0], $contact['notify'], $slap);
}
if ($contact['network'] == NETWORK_DIASPORA) {
if (!empty($contact['notify'])) {
Salmon::slapper($r[0], $contact['notify'], $slap);
}
} elseif ($contact['network'] == NETWORK_DIASPORA) {
$ret = Diaspora::sendShare($a->user, $contact);
logger('share returns: ' . $ret);
}
@ -1377,7 +1378,7 @@ class Contact extends BaseObject
}
if (is_array($contact)) {
if (($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
if (($contact['rel'] == CONTACT_IS_SHARING)
|| ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
dba::update('contact', ['rel' => CONTACT_IS_FRIEND, 'writable' => true],
['id' => $contact['id'], 'uid' => $importer['uid']]);

View file

@ -36,56 +36,53 @@ class GContact
*/
public static function searchByName($search, $mode = '')
{
if ($search) {
// check supported networks
if (Config::get('system', 'diaspora_enabled')) {
$diaspora = NETWORK_DIASPORA;
} else {
$diaspora = NETWORK_DFRN;
}
if (!Config::get('system', 'ostatus_disabled')) {
$ostatus = NETWORK_OSTATUS;
} else {
$ostatus = NETWORK_DFRN;
}
// check if we search only communities or every contact
if ($mode === "community") {
$extra_sql = " AND `community`";
} else {
$extra_sql = "";
}
$search .= "%";
$results = q(
"SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`nick`, `gcontact`.`photo`,
`gcontact`.`network`, `gcontact`.`keywords`, `gcontact`.`addr`, `gcontact`.`community`
FROM `gcontact`
LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR
(`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
(`gcontact`.`addr` LIKE '%s' OR `gcontact`.`name` LIKE '%s' OR `gcontact`.`nick` LIKE '%s') $extra_sql
GROUP BY `gcontact`.`nurl`
ORDER BY `gcontact`.`nurl` DESC
LIMIT 1000",
intval(local_user()),
dbesc(CONTACT_IS_SHARING),
dbesc(CONTACT_IS_FRIEND),
dbesc(NETWORK_DFRN),
dbesc($ostatus),
dbesc($diaspora),
dbesc(escape_tags($search)),
dbesc(escape_tags($search)),
dbesc(escape_tags($search))
);
return $results;
if (empty($search)) {
return [];
}
// check supported networks
if (Config::get('system', 'diaspora_enabled')) {
$diaspora = NETWORK_DIASPORA;
} else {
$diaspora = NETWORK_DFRN;
}
if (!Config::get('system', 'ostatus_disabled')) {
$ostatus = NETWORK_OSTATUS;
} else {
$ostatus = NETWORK_DFRN;
}
// check if we search only communities or every contact
if ($mode === "community") {
$extra_sql = " AND `community`";
} else {
$extra_sql = "";
}
$search .= "%";
$results = dba::p("SELECT `nurl` FROM `gcontact`
WHERE NOT `hide` AND `network` IN (?, ?, ?) AND
((`last_contact` >= `last_failure`) OR (`updated` >= `last_failure`)) AND
(`addr` LIKE ? OR `name` LIKE ? OR `nick` LIKE ?) $extra_sql
GROUP BY `nurl` ORDER BY `nurl` DESC LIMIT 1000",
NETWORK_DFRN, $ostatus, $diaspora, $search, $search, $search
);
$gcontacts = [];
while ($result = dba::fetch($results)) {
$urlparts = parse_url($result["nurl"]);
// Ignore results that look strange.
// For historic reasons the gcontact table does contain some garbage.
if (!empty($urlparts['query']) || !empty($urlparts['fragment'])) {
continue;
}
$gcontacts[] = Contact::getDetailsByURL($result["nurl"], local_user());
}
return $gcontacts;
}
/**

View file

@ -22,6 +22,7 @@ use Friendica\Object\Image;
use Friendica\Protocol\Diaspora;
use Friendica\Protocol\OStatus;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\XML;
use dba;
use Text_LanguageDetect;
@ -355,6 +356,10 @@ class Item extends BaseObject
}
}
if (!empty($item['thr-parent'])) {
$item['parent-uri'] = $item['thr-parent'];
}
if (x($item, 'gravity')) {
$item['gravity'] = intval($item['gravity']);
} elseif ($item['parent-uri'] === $item['uri']) {
@ -897,7 +902,11 @@ class Item extends BaseObject
$item['uid'] = 0;
$item['origin'] = 0;
$item['wall'] = 0;
$item['contact-id'] = Contact::getIdForURL($item['author-link']);
if ($item['uri'] == $item['parent-uri']) {
$item['contact-id'] = Contact::getIdForURL($item['owner-link']);
} else {
$item['contact-id'] = Contact::getIdForURL($item['author-link']);
}
if (in_array($item['type'], ["net-comment", "wall-comment"])) {
$item['type'] = 'remote-comment';
@ -1264,21 +1273,23 @@ class Item extends BaseObject
}
// now change this copy of the post to a forum head message and deliver to all the tgroup members
$self = dba::selectFirst('contact', ['name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]);
$self = dba::selectFirst('contact', ['id', 'name', 'url', 'thumb'], ['uid' => $uid, 'self' => true]);
if (!DBM::is_result($self)) {
return;
}
$owner_id = Contact::getIdForURL($self['url']);
// also reset all the privacy bits to the forum default permissions
$private = ($user['allow_cid'] || $user['allow_gid'] || $user['deny_cid'] || $user['deny_gid']) ? 1 : 0;
$forum_mode = ($prvgroup ? 2 : 1);
$fields = ['wall' => true, 'origin' => true, 'forum_mode' => $forum_mode,
'owner-name' => $self['name'], 'owner-link' => $self['url'], 'owner-avatar' => $self['thumb'],
'private' => $private, 'allow_cid' => $user['allow_cid'], 'allow_gid' => $user['allow_gid'],
'deny_cid' => $user['deny_cid'], 'deny_gid' => $user['deny_gid']];
$fields = ['wall' => true, 'origin' => true, 'forum_mode' => $forum_mode, 'contact-id' => $self['id'],
'owner-id' => $owner_id, 'owner-name' => $self['name'], 'owner-link' => $self['url'],
'owner-avatar' => $self['thumb'], 'private' => $private, 'allow_cid' => $user['allow_cid'],
'allow_gid' => $user['allow_gid'], 'deny_cid' => $user['deny_cid'], 'deny_gid' => $user['deny_gid']];
dba::update('item', $fields, ['id' => $item_id]);
self::updateThread($item_id);

View file

@ -395,7 +395,7 @@ class User
throw new Exception(L10n::t('Not a valid email address.'));
}
if (dba::exists('user', ['email' => $email])) {
if (Config::get('system', 'block_extended_register', false) && dba::exists('user', ['email' => $email])) {
throw new Exception(L10n::t('Cannot use that email.'));
}

View file

@ -2079,8 +2079,8 @@ class DFRN
return false;
}
$fields = ['title' => $item["title"], 'body' => $item["body"],
'tag' => $item["tag"], 'changed' => DateTimeFormat::utcNow(),
$fields = ['title' => defaults($item, 'title', ''), 'body' => defaults($item, 'body', ''),
'tag' => defaults($item, 'tag', ''), 'changed' => DateTimeFormat::utcNow(),
'edited' => DateTimeFormat::utc($item["edited"])];
$condition = ["`uri` = ? AND `uid` IN (0, ?)", $item["uri"], $importer["importer_uid"]];

View file

@ -31,6 +31,7 @@ use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\XML;
use Friendica\Util\Map;
use dba;
use SimpleXMLElement;
@ -222,11 +223,20 @@ class Diaspora
$signable_data = $msg.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg);
if ($handle == '') {
logger('No author could be decoded. Discarding. Message: ' . $envelope);
return false;
}
$key = self::key($handle);
if ($key == '') {
logger("Couldn't get a key for handle " . $handle . ". Discarding.");
return false;
}
$verify = Crypto::rsaVerify($signable_data, $sig, $key);
if (!$verify) {
logger('Message did not verify. Discarding.');
logger('Message from ' . $handle . ' did not verify. Discarding.');
return false;
}
@ -322,7 +332,16 @@ class Diaspora
// Get the senders' public key
$key_id = $base->sig[0]->attributes()->key_id[0];
$author_addr = base64_decode($key_id);
if ($author_addr == '') {
logger('No author could be decoded. Discarding. Message: ' . $xml);
System::httpExit(400);
}
$key = self::key($author_addr);
if ($key == '') {
logger("Couldn't get a key for handle " . $author_addr . ". Discarding.");
System::httpExit(400);
}
$verify = Crypto::rsaVerify($signed_data, $signature, $key);
if (!$verify) {
@ -2212,7 +2231,10 @@ class Diaspora
}
logger('Received participation for ID: '.$item['id'].' - Contact: '.$contact_id.' - Server: '.$server, LOGGER_DEBUG);
dba::insert('participation', ['iid' => $item['id'], 'cid' => $contact_id, 'fid' => $person['id'], 'server' => $server]);
if (!dba::exists('participation', ['iid' => $item['id'], 'server' => $server])) {
dba::insert('participation', ['iid' => $item['id'], 'cid' => $contact_id, 'fid' => $person['id'], 'server' => $server]);
}
// Send all existing comments and likes to the requesting server
$comments = dba::p("SELECT `item`.`id`, `item`.`verb`, `contact`.`self`
@ -3197,13 +3219,14 @@ class Diaspora
}
$logid = random_string(4);
$dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
// Fetch the fcontact entry when there is missing data
// Will possibly happen when data is transmitted to a DFRN contact
if (empty($dest_url) && !empty($contact['addr'])) {
// We always try to use the data from the fcontact table.
// This is important for transmitting data to Friendica servers.
if (!empty($contact['addr'])) {
$fcontact = self::personByHandle($contact['addr']);
$dest_url = ($public_batch ? $fcontact["batch"] : $fcontact["notify"]);
} else {
$dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
}
if (!$dest_url) {
@ -3597,10 +3620,18 @@ class Diaspora
$eventdata['description'] = html_entity_decode(BBCode::toMarkdown($event['desc']));
}
if ($event['location']) {
$event['location'] = preg_replace("/\[map\](.*?)\[\/map\]/ism", '$1', $event['location']);
$coord = Map::getCoordinates($event['location']);
$location = [];
$location["address"] = html_entity_decode(BBCode::toMarkdown($event['location']));
$location["lat"] = 0;
$location["lng"] = 0;
if (!empty($coord['lat']) && !empty($coord['lon'])) {
$location["lat"] = $coord['lat'];
$location["lng"] = $coord['lon'];
} else {
$location["lat"] = 0;
$location["lng"] = 0;
}
$eventdata['location'] = $location;
}
@ -3694,7 +3725,13 @@ class Diaspora
if (count($event)) {
$message['event'] = $event;
/// @todo Once Diaspora supports it, we will remove the body
if (!empty($event['location']['address']) &&
!empty($event['location']['lat']) &&
!empty($event['location']['lng'])) {
$message['location'] = $event['location'];
}
/// @todo Once Diaspora supports it, we will remove the body and the location hack above
// $message['text'] = '';
}
}

View file

@ -86,9 +86,9 @@ class Feed {
if ($xpath->query('/atom:feed')->length > 0) {
$alternate = $xpath->query("atom:link[@rel='alternate']")->item(0)->attributes;
if (is_object($alternate)) {
foreach ($alternate AS $attributes) {
if ($attributes->name == "href") {
$author["author-link"] = $attributes->textContent;
foreach ($alternate AS $attribute) {
if ($attribute->name == "href") {
$author["author-link"] = $attribute->textContent;
}
}
}
@ -99,9 +99,9 @@ class Feed {
if ($author["author-link"] == "") {
$self = $xpath->query("atom:link[@rel='self']")->item(0)->attributes;
if (is_object($self)) {
foreach ($self AS $attributes) {
if ($attributes->name == "href") {
$author["author-link"] = $attributes->textContent;
foreach ($self AS $attribute) {
if ($attribute->name == "href") {
$author["author-link"] = $attribute->textContent;
}
}
}
@ -141,9 +141,9 @@ class Feed {
}
$avatar = $xpath->evaluate("atom:author/atom:link[@rel='avatar']")->item(0)->attributes;
if (is_object($avatar)) {
foreach ($avatar AS $attributes) {
if ($attributes->name == "href") {
$author["author-avatar"] = $attributes->textContent;
foreach ($avatar AS $attribute) {
if ($attribute->name == "href") {
$author["author-avatar"] = $attribute->textContent;
}
}
}
@ -208,13 +208,10 @@ class Feed {
}
$items = [];
// Importing older entries first
for($i = $entries->length - 1; $i >= 0;--$i) {
$entry = $entries->item($i);
$entrylist = [];
foreach ($entries AS $entry) {
$entrylist[] = $entry;
}
foreach (array_reverse($entrylist) AS $entry) {
$item = array_merge($header, $author);
$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
@ -222,9 +219,9 @@ class Feed {
$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
}
if (is_object($alternate)) {
foreach ($alternate AS $attributes) {
if ($attributes->name == "href") {
$item["plink"] = $attributes->textContent;
foreach ($alternate AS $attribute) {
if ($attribute->name == "href") {
$item["plink"] = $attribute->textContent;
}
}
}
@ -310,20 +307,20 @@ class Feed {
$attachments = [];
$enclosures = $xpath->query("enclosure", $entry);
$enclosures = $xpath->query("enclosure|atom:link[@rel='enclosure']", $entry);
foreach ($enclosures AS $enclosure) {
$href = "";
$length = "";
$type = "";
$title = "";
foreach ($enclosure->attributes AS $attributes) {
if ($attributes->name == "url") {
$href = $attributes->textContent;
} elseif ($attributes->name == "length") {
$length = $attributes->textContent;
} elseif ($attributes->name == "type") {
$type = $attributes->textContent;
foreach ($enclosure->attributes AS $attribute) {
if (in_array($attribute->name, ["url", "href"])) {
$href = $attribute->textContent;
} elseif ($attribute->name == "length") {
$length = $attribute->textContent;
} elseif ($attribute->name == "type") {
$type = $attribute->textContent;
}
}
if (strlen($item["attach"])) {

View file

@ -72,8 +72,9 @@ class OStatus
$contact = null;
if ($aliaslink != '') {
$condition = ["`uid` = ? AND `alias` = ? AND `network` != ?",
$importer["uid"], $aliaslink, NETWORK_STATUSNET];
$condition = ["`uid` = ? AND `alias` = ? AND `network` != ? AND `rel` IN (?, ?)",
$importer["uid"], $aliaslink, NETWORK_STATUSNET,
CONTACT_IS_SHARING, CONTACT_IS_FRIEND];
$contact = dba::selectFirst('contact', [], $condition);
}
@ -82,14 +83,16 @@ class OStatus
$aliaslink = $author["author-link"];
}
$condition = ["`uid` = ? AND `nurl` IN (?, ?) AND `network` != ?", $importer["uid"],
normalise_link($author["author-link"]), normalise_link($aliaslink), NETWORK_STATUSNET];
$condition = ["`uid` = ? AND `nurl` IN (?, ?) AND `network` != ? AND `rel` IN (?, ?)",
$importer["uid"], normalise_link($author["author-link"]), normalise_link($aliaslink),
NETWORK_STATUSNET, CONTACT_IS_SHARING, CONTACT_IS_FRIEND];
$contact = dba::selectFirst('contact', [], $condition);
}
if (!DBM::is_result($contact) && ($addr != '')) {
$condition = ["`uid` = ? AND `addr` = ? AND `network` != ?",
$importer["uid"], $addr, NETWORK_STATUSNET];
$condition = ["`uid` = ? AND `addr` = ? AND `network` != ? AND `rel` IN (?, ?)",
$importer["uid"], $addr, NETWORK_STATUSNET,
CONTACT_IS_SHARING, CONTACT_IS_FRIEND];
$contact = dba::selectFirst('contact', [], $condition);
}
@ -243,13 +246,12 @@ class OStatus
$xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
$xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
$entries = $xpath->query('/atom:entry');
$contact = ["id" => 0];
foreach ($entries as $entry) {
// fetch the author
$author = self::fetchAuthor($xpath, $entry, $importer, $contact, true);
return $author;
}
// Fetch the first author
$authordata = $xpath->query('//author')->item(0);
$author = self::fetchAuthor($xpath, $authordata, $importer, $contact, true);
return $author;
}
/**
@ -658,8 +660,9 @@ class OStatus
// Mastodon Content Warning
if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) {
$clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue;
$item["body"] = HTML::toBBCode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]';
if (!empty($clear_text)) {
$item['content-warning'] = HTML::toBBCode($clear_text);
}
}
if (($self != '') && empty($item['protocol'])) {
@ -670,9 +673,11 @@ class OStatus
self::fetchConversation($item['conversation-href'], $item['conversation-uri']);
}
if (isset($item["parent-uri"]) && ($related != '')) {
if (isset($item["parent-uri"])) {
if (!dba::exists('item', ['uid' => $importer["uid"], 'uri' => $item['parent-uri']])) {
self::fetchRelated($related, $item["parent-uri"], $importer);
if ($related != '') {
self::fetchRelated($related, $item["parent-uri"], $importer);
}
} else {
logger('Reply with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', LOGGER_DEBUG);
}
@ -1283,6 +1288,13 @@ class OStatus
"rel" => "self", "type" => "application/atom+xml"];
XML::addElement($doc, $root, "link", "", $attributes);
if ($owner['account-type'] == ACCOUNT_TYPE_COMMUNITY) {
$condition = ['uid' => $owner['uid'], 'self' => false, 'pending' => false,
'archive' => false, 'hidden' => false, 'blocked' => false];
$members = dba::count('contact', $condition);
XML::addElement($doc, $root, "statusnet:group_info", "", ["member_count" => $members]);
}
return $root;
}
@ -1374,16 +1386,22 @@ class OStatus
*
* @return object author element
*/
private static function addAuthor($doc, $owner)
private static function addAuthor($doc, $owner, $show_profile = true)
{
$profile = dba::selectFirst('profile', ['homepage', 'publish'], ['uid' => $owner['uid'], 'is-default' => true]);
$author = $doc->createElement("author");
XML::addElement($doc, $author, "id", $owner["url"]);
XML::addElement($doc, $author, "activity:object-type", ACTIVITY_OBJ_PERSON);
if ($owner['account-type'] == ACCOUNT_TYPE_COMMUNITY) {
XML::addElement($doc, $author, "activity:object-type", ACTIVITY_OBJ_GROUP);
} else {
XML::addElement($doc, $author, "activity:object-type", ACTIVITY_OBJ_PERSON);
}
XML::addElement($doc, $author, "uri", $owner["url"]);
XML::addElement($doc, $author, "name", $owner["nick"]);
XML::addElement($doc, $author, "email", $owner["addr"]);
XML::addElement($doc, $author, "summary", BBCode::convert($owner["about"], false, 7));
if ($show_profile) {
XML::addElement($doc, $author, "summary", BBCode::convert($owner["about"], false, 7));
}
$attributes = ["rel" => "alternate", "type" => "text/html", "href" => $owner["url"]];
XML::addElement($doc, $author, "link", "", $attributes);
@ -1408,15 +1426,17 @@ class OStatus
XML::addElement($doc, $author, "poco:preferredUsername", $owner["nick"]);
XML::addElement($doc, $author, "poco:displayName", $owner["name"]);
XML::addElement($doc, $author, "poco:note", BBCode::convert($owner["about"], false, 7));
if ($show_profile) {
XML::addElement($doc, $author, "poco:note", BBCode::convert($owner["about"], false, 7));
if (trim($owner["location"]) != "") {
$element = $doc->createElement("poco:address");
XML::addElement($doc, $element, "poco:formatted", $owner["location"]);
$author->appendChild($element);
if (trim($owner["location"]) != "") {
$element = $doc->createElement("poco:address");
XML::addElement($doc, $element, "poco:formatted", $owner["location"]);
$author->appendChild($element);
}
}
if (DBM::is_result($profile)) {
if (DBM::is_result($profile) && !$show_profile) {
if (trim($profile["homepage"]) != "") {
$urls = $doc->createElement("poco:urls");
XML::addElement($doc, $urls, "poco:type", "homepage");
@ -1427,11 +1447,12 @@ class OStatus
XML::addElement($doc, $author, "followers", "", ["url" => System::baseUrl()."/viewcontacts/".$owner["nick"]]);
XML::addElement($doc, $author, "statusnet:profile_info", "", ["local_id" => $owner["uid"]]);
if ($profile["publish"]) {
XML::addElement($doc, $author, "mastodon:scope", "public");
}
}
if ($profile["publish"]) {
XML::addElement($doc, $author, "mastodon:scope", "public");
}
return $author;
}
@ -1593,7 +1614,7 @@ class OStatus
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
}
$title = self::entryHeader($doc, $entry, $owner, $toplevel);
$title = self::entryHeader($doc, $entry, $owner, $item, $toplevel);
$r = q(
"SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' AND NOT `private` AND `network` IN ('%s', '%s', '%s') LIMIT 1",
@ -1622,7 +1643,7 @@ class OStatus
self::entryContent($doc, $as_object, $repeated_item, $owner, "", "", false);
$author = self::addAuthor($doc, $contact);
$author = self::addAuthor($doc, $contact, false);
$as_object->appendChild($author);
$as_object2 = $doc->createElement("activity:object");
@ -1664,7 +1685,7 @@ class OStatus
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
}
$title = self::entryHeader($doc, $entry, $owner, $toplevel);
$title = self::entryHeader($doc, $entry, $owner, $item, $toplevel);
$verb = NAMESPACE_ACTIVITY_SCHEMA."favorite";
self::entryContent($doc, $entry, $item, $owner, "Favorite", $verb, false);
@ -1787,7 +1808,7 @@ class OStatus
$item["body"] = sprintf($message, $owner["nick"], $contact["nick"]);
self::entryHeader($doc, $entry, $owner, $toplevel);
self::entryHeader($doc, $entry, $owner, $item, $toplevel);
self::entryContent($doc, $entry, $item, $owner, $title);
@ -1815,7 +1836,7 @@ class OStatus
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
}
$title = self::entryHeader($doc, $entry, $owner, $toplevel);
$title = self::entryHeader($doc, $entry, $owner, $item, $toplevel);
XML::addElement($doc, $entry, "activity:object-type", ACTIVITY_OBJ_NOTE);
@ -1836,12 +1857,18 @@ class OStatus
*
* @return string The title for the element
*/
private static function entryHeader($doc, &$entry, $owner, $toplevel)
private static function entryHeader($doc, &$entry, $owner, $item, $toplevel)
{
/// @todo Check if this title stuff is really needed (I guess not)
if (!$toplevel) {
$entry = $doc->createElement("entry");
$title = sprintf("New note by %s", $owner["nick"]);
if ($owner['account-type'] == ACCOUNT_TYPE_COMMUNITY) {
$contact = self::contactEntry($item['author-link'], $owner);
$author = self::addAuthor($doc, $contact, false);
$entry->appendChild($author);
}
} else {
$entry = $doc->createElementNS(NAMESPACE_ATOM1, "entry");
@ -1996,12 +2023,10 @@ class OStatus
$mentioned = $newmentions;
foreach ($mentioned as $mention) {
$r = q(
"SELECT `forum`, `prv` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s'",
intval($owner["uid"]),
dbesc(normalise_link($mention))
);
if ($r[0]["forum"] || $r[0]["prv"]) {
$condition = ['uid' => $owner['uid'], 'nurl' => normalise_link($mention)];
$contact = dba::selectFirst('contact', ['forum', 'prv', 'self', 'contact-type'], $condition);
if ($contact["forum"] || $contact["prv"] || ($owner['contact-type'] == ACCOUNT_TYPE_COMMUNITY) ||
($contact['self'] && ($owner['account-type'] == ACCOUNT_TYPE_COMMUNITY))) {
XML::addElement($doc, $entry, "link", "",
[
"rel" => "mentioned",
@ -2018,6 +2043,12 @@ class OStatus
}
}
if ($owner['account-type'] == ACCOUNT_TYPE_COMMUNITY) {
XML::addElement($doc, $entry, "link", "", ["rel" => "mentioned",
"ostatus:object-type" => "http://activitystrea.ms/schema/1.0/group",
"href" => $owner['url']]);
}
if (!$item["private"]) {
XML::addElement($doc, $entry, "link", "", ["rel" => "ostatus:attention",
"href" => "http://activityschema.org/collection/public"]);
@ -2094,7 +2125,7 @@ class OStatus
}
$owner = dba::fetch_first(
"SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
"SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`, `user`.`account-type`
FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE `contact`.`self` AND `user`.`nickname` = ? LIMIT 1",
$owner_nick
@ -2119,22 +2150,23 @@ class OStatus
$sql_extra .= sprintf(" AND `item`.`object-type` = '%s' ", dbesc(ACTIVITY_OBJ_COMMENT));
}
if ($owner['account-type'] != ACCOUNT_TYPE_COMMUNITY) {
$sql_extra .= sprintf(" AND `item`.`contact-id` = %d AND `item`.`author-id` = %d ", intval($owner["id"]), intval($authorid));
}
$items = q(
"SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`)
STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent`
WHERE `item`.`uid` = %d
AND `item`.`contact-id` = %d
AND `item`.`author-id` = %d
AND `item`.`created` > '%s'
AND NOT `item`.`deleted`
AND NOT `item`.`private`
AND `item`.`visible`
AND `item`.`wall`
AND `thread`.`network` IN ('%s', '%s')
$sql_extra
ORDER BY `item`.`created` DESC LIMIT %d",
intval($owner["uid"]),
intval($owner["id"]),
intval($authorid),
dbesc($check_date),
dbesc(NETWORK_OSTATUS),
dbesc(NETWORK_DFRN),

View file

@ -945,6 +945,15 @@ class PortableContact
$register_policy = $gserver["register_policy"];
$registered_users = $gserver["registered-users"];
// See discussion under https://forum.friendi.ca/display/0b6b25a8135aabc37a5a0f5684081633
// It can happen that a zero date is in the database, but storing it again is forbidden.
if ($last_contact < NULL_DATE) {
$last_contact = NULL_DATE;
}
if ($last_failure < NULL_DATE) {
$last_failure = NULL_DATE;
}
if (!$force && !self::updateNeeded($gserver["created"], "", $last_failure, $last_contact)) {
logger("Use cached data for server ".$server_url, LOGGER_DEBUG);
return ($last_contact >= $last_failure);
@ -1302,7 +1311,7 @@ class PortableContact
if (isset($data->version)) {
$network = NETWORK_DFRN;
$noscrape = $data->no_scrape_url;
$noscrape = defaults($data->no_scrape_url, '');
$version = $data->version;
$site_name = $data->site_name;
$info = $data->info;

View file

@ -10,17 +10,23 @@ use Friendica\Core\Addon;
* Leaflet Map related functions
*/
class Map {
public static function byCoordinates($coord) {
public static function byCoordinates($coord, $html_mode = 0) {
$coord = trim($coord);
$coord = str_replace([',','/',' '],[' ',' ',' '],$coord);
$arr = ['lat' => trim(substr($coord,0,strpos($coord,' '))), 'lon' => trim(substr($coord,strpos($coord,' ')+1)), 'html' => ''];
$arr = ['lat' => trim(substr($coord,0,strpos($coord,' '))), 'lon' => trim(substr($coord,strpos($coord,' ')+1)), 'mode' => $html_mode, 'html' => ''];
Addon::callHooks('generate_map',$arr);
return ($arr['html']) ? $arr['html'] : $coord;
}
public static function byLocation($location) {
$arr = ['location' => $location, 'html' => ''];
public static function byLocation($location, $html_mode = 0) {
$arr = ['location' => $location, 'mode' => $html_mode, 'html' => ''];
Addon::callHooks('generate_named_map',$arr);
return ($arr['html']) ? $arr['html'] : $location;
}
public static function getCoordinates($location) {
$arr = ['location' => $location, 'lat' => false, 'lon' => false];
Addon::callHooks('Map::getCoordinates', $arr);
return $arr;
}
}

View file

@ -217,7 +217,7 @@ class Network
$newurl = $curl_info['redirect_url'];
if (($new_location_info['path'] == '') && ( $new_location_info['host'] != '')) {
if (($new_location_info['path'] == '') && ($new_location_info['host'] != '')) {
$newurl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path'];
}
@ -229,6 +229,11 @@ class Network
if (strpos($newurl, '/') === 0) {
$newurl = $old_location_info["scheme"]."://".$old_location_info["host"].$newurl;
}
$old_location_query = @parse_url($url, PHP_URL_QUERY);
if ($old_location_query != '') {
$newurl .= '?' . $old_location_query;
}
if (filter_var($newurl, FILTER_VALIDATE_URL)) {
$redirects++;

View file

@ -582,11 +582,12 @@ class OnePoll
logger("Consume feed of contact ".$contact['id']);
consume_feed($xml, $importer, $contact, $hub, 1, 1);
consume_feed($xml, $importer, $contact, $hub);
// do it twice. Ensures that children of parents which may be later in the stream aren't tossed
consume_feed($xml, $importer, $contact, $hub, 1, 2);
// do it a second time for DFRN so that any children find their parents.
if ($contact['network'] === NETWORK_DFRN) {
consume_feed($xml, $importer, $contact, $hub);
}
$hubmode = 'subscribe';
if ($contact['network'] === NETWORK_DFRN || $contact['blocked'] || $contact['readonly']) {

View file

@ -16,6 +16,7 @@ Andrej Stieben
André Alves
André Lohan
Andy H3
Andy Hee
AndyHee
Anthronaut
Arian - Cazare Muncitori
@ -75,6 +76,7 @@ Frederico Gonçalves Guimarães
Gerhard Seeber
gerhard6380
Gert Cauwenberg
GLComo
greeneyedred
Gregory Smith
Haakon Meland Eriksen
@ -91,7 +93,6 @@ Jak
Jakob
Jens Tautenhahn
jensp
Jeroen S
jeroenpraat
Johannes Schwab
John Brazil
@ -169,6 +170,7 @@ Silke Meyer
Simon L'nu
Simó Albert i Beltran
soko1
St John Karp
Stanislav N.
StefOfficiel
Sveinn í Felli
@ -206,4 +208,5 @@ Zered
zotlabs
zottel
Zvi ben Yaakov (a.k.a rdc)
Михаил
Михаил
朱陈锬

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-02 12:02+0100\n"
"POT-Creation-Date: 2018-03-05 16:37+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,11 +18,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#: include/dba.php:59
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: include/security.php:81
msgid "Welcome "
msgstr ""
@ -41,98 +36,6 @@ msgid ""
"form has been opened for too long (>3 hours) before submitting it."
msgstr ""
#: include/acl_selectors.php:355
msgid "Post to Email"
msgstr ""
#: include/acl_selectors.php:360
msgid "Hide your profile details from unknown viewers?"
msgstr ""
#: include/acl_selectors.php:360
#, php-format
msgid "Connectors disabled, since \"%s\" is enabled."
msgstr ""
#: include/acl_selectors.php:366
msgid "Visible to everybody"
msgstr ""
#: include/acl_selectors.php:367 view/theme/vier/config.php:115
msgid "show"
msgstr ""
#: include/acl_selectors.php:368 view/theme/vier/config.php:115
msgid "don't show"
msgstr ""
#: include/acl_selectors.php:374 mod/editpost.php:136
msgid "CC: email addresses"
msgstr ""
#: include/acl_selectors.php:375 mod/editpost.php:143
msgid "Example: bob@example.com, mary@example.com"
msgstr ""
#: include/acl_selectors.php:377 mod/events.php:536 mod/photos.php:1098
#: mod/photos.php:1441
msgid "Permissions"
msgstr ""
#: include/acl_selectors.php:378
msgid "Close"
msgstr ""
#: include/api.php:1181
#, 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:1205
#, 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:1229
#, php-format
msgid "Monthly posting limit of %d post reached. The post was rejected."
msgstr ""
#: include/api.php:4382 mod/photos.php:88 mod/photos.php:194 mod/photos.php:722
#: mod/photos.php:1149 mod/photos.php:1166 mod/photos.php:1684
#: mod/profile_photo.php:84 mod/profile_photo.php:92 mod/profile_photo.php:100
#: mod/profile_photo.php:223 mod/profile_photo.php:317
#: mod/profile_photo.php:327 src/Model/User.php:526 src/Model/User.php:534
#: src/Model/User.php:542
msgid "Profile Photos"
msgstr ""
#: include/bb2diaspora.php:238 include/event.php:26 include/event.php:914
#: mod/localtime.php:19
msgid "l F d, Y \\@ g:i A"
msgstr ""
#: include/bb2diaspora.php:245 include/event.php:45 include/event.php:62
#: include/event.php:471 include/event.php:992
msgid "Starts:"
msgstr ""
#: include/bb2diaspora.php:251 include/event.php:48 include/event.php:68
#: include/event.php:472 include/event.php:996
msgid "Finishes:"
msgstr ""
#: include/bb2diaspora.php:258 include/event.php:52 include/event.php:77
#: include/event.php:473 include/event.php:1010 mod/directory.php:140
#: mod/notifications.php:247 mod/contacts.php:651 mod/events.php:521
#: src/Model/Profile.php:417
msgid "Location:"
msgstr ""
#: include/enotify.php:33
msgid "Friendica Notification"
msgstr ""
@ -424,6 +327,28 @@ msgstr ""
msgid "Please visit %s to approve or reject the request."
msgstr ""
#: include/event.php:26 include/event.php:914 include/bb2diaspora.php:238
#: mod/localtime.php:19
msgid "l F d, Y \\@ g:i A"
msgstr ""
#: include/event.php:45 include/event.php:62 include/event.php:471
#: include/event.php:992 include/bb2diaspora.php:245
msgid "Starts:"
msgstr ""
#: include/event.php:48 include/event.php:68 include/event.php:472
#: include/event.php:996 include/bb2diaspora.php:251
msgid "Finishes:"
msgstr ""
#: include/event.php:52 include/event.php:77 include/event.php:473
#: include/event.php:1010 include/bb2diaspora.php:258 mod/notifications.php:247
#: mod/contacts.php:651 mod/directory.php:149 mod/events.php:521
#: src/Model/Profile.php:417
msgid "Location:"
msgstr ""
#: include/event.php:420
msgid "all-day"
msgstr ""
@ -648,9 +573,9 @@ msgstr ""
msgid "Hide map"
msgstr ""
#: include/items.php:342 mod/notice.php:22 mod/display.php:70
#: mod/display.php:247 mod/display.php:349 mod/viewsrc.php:21 mod/admin.php:269
#: mod/admin.php:1762 mod/admin.php:2010
#: include/items.php:342 mod/notice.php:22 mod/viewsrc.php:21 mod/admin.php:269
#: mod/admin.php:1762 mod/admin.php:2010 mod/display.php:70 mod/display.php:247
#: mod/display.php:349
msgid "Item not found."
msgstr ""
@ -661,41 +586,41 @@ msgstr ""
#: include/items.php:384 mod/api.php:110 mod/suggest.php:38
#: mod/profiles.php:649 mod/profiles.php:652 mod/profiles.php:674
#: mod/contacts.php:464 mod/dfrn_request.php:653 mod/follow.php:148
#: mod/message.php:138 mod/settings.php:1109 mod/settings.php:1115
#: mod/settings.php:1122 mod/settings.php:1126 mod/settings.php:1130
#: mod/settings.php:1134 mod/settings.php:1138 mod/settings.php:1142
#: mod/settings.php:1162 mod/settings.php:1163 mod/settings.php:1164
#: mod/settings.php:1165 mod/settings.php:1166 mod/register.php:237
#: mod/register.php:237 mod/message.php:138 mod/settings.php:1109
#: mod/settings.php:1115 mod/settings.php:1122 mod/settings.php:1126
#: mod/settings.php:1130 mod/settings.php:1134 mod/settings.php:1138
#: mod/settings.php:1142 mod/settings.php:1162 mod/settings.php:1163
#: mod/settings.php:1164 mod/settings.php:1165 mod/settings.php:1166
msgid "Yes"
msgstr ""
#: include/items.php:387 include/conversation.php:1373 mod/fbrowser.php:103
#: mod/fbrowser.php:134 mod/suggest.php:41 mod/unfollow.php:117
#: mod/contacts.php:467 mod/dfrn_request.php:663 mod/editpost.php:151
#: mod/follow.php:159 mod/message.php:141 mod/photos.php:248 mod/photos.php:324
#: mod/settings.php:680 mod/settings.php:706 mod/tagrm.php:19 mod/tagrm.php:99
#: mod/videos.php:148
#: mod/contacts.php:467 mod/dfrn_request.php:663 mod/follow.php:159
#: mod/tagrm.php:19 mod/tagrm.php:99 mod/editpost.php:151 mod/message.php:141
#: mod/photos.php:248 mod/photos.php:324 mod/settings.php:680
#: mod/settings.php:706 mod/videos.php:148
msgid "Cancel"
msgstr ""
#: include/items.php:401 mod/allfriends.php:21 mod/api.php:35 mod/api.php:40
#: mod/attach.php:38 mod/common.php:26 mod/crepair.php:98 mod/group.php:26
#: mod/nogroup.php:28 mod/repair_ostatus.php:13 mod/suggest.php:60
#: mod/unfollow.php:15 mod/unfollow.php:57 mod/unfollow.php:90
#: mod/uimport.php:28 mod/dirfind.php:24 mod/notifications.php:73
#: mod/ostatus_subscribe.php:16 mod/cal.php:304 mod/dfrn_confirm.php:68
#: mod/fsuggest.php:81 mod/invite.php:20 mod/invite.php:106 mod/manage.php:131
#: mod/profiles.php:181 mod/profiles.php:619 mod/wall_attach.php:74
#: mod/wall_attach.php:77 mod/contacts.php:378 mod/delegate.php:24
#: mod/delegate.php:38 mod/editpost.php:20 mod/events.php:195 mod/follow.php:16
#: mod/follow.php:53 mod/follow.php:116 mod/message.php:59 mod/message.php:104
#: mod/notes.php:30 mod/photos.php:174 mod/photos.php:1051 mod/poke.php:150
#: mod/profile_photo.php:29 mod/profile_photo.php:188 mod/profile_photo.php:199
#: mod/profile_photo.php:212 mod/regmod.php:108 mod/settings.php:41
#: mod/settings.php:140 mod/settings.php:669 mod/viewcontacts.php:57
#: mod/attach.php:38 mod/common.php:26 mod/crepair.php:98 mod/nogroup.php:28
#: mod/repair_ostatus.php:13 mod/suggest.php:60 mod/unfollow.php:15
#: mod/unfollow.php:57 mod/unfollow.php:90 mod/uimport.php:28
#: mod/dirfind.php:24 mod/notifications.php:73 mod/ostatus_subscribe.php:16
#: mod/cal.php:304 mod/dfrn_confirm.php:68 mod/invite.php:20 mod/invite.php:106
#: mod/manage.php:131 mod/profiles.php:181 mod/profiles.php:619
#: mod/wall_attach.php:74 mod/wall_attach.php:77 mod/contacts.php:378
#: mod/delegate.php:24 mod/delegate.php:38 mod/follow.php:16 mod/follow.php:53
#: mod/follow.php:116 mod/poke.php:150 mod/profile_photo.php:29
#: mod/profile_photo.php:188 mod/profile_photo.php:199
#: mod/profile_photo.php:212 mod/regmod.php:108 mod/viewcontacts.php:57
#: mod/wall_upload.php:103 mod/wall_upload.php:106 mod/wallmessage.php:16
#: mod/wallmessage.php:40 mod/wallmessage.php:79 mod/wallmessage.php:103
#: mod/item.php:160 mod/network.php:32 mod/register.php:53 index.php:413
#: mod/item.php:160 mod/register.php:53 mod/editpost.php:20 mod/events.php:195
#: mod/fsuggest.php:81 mod/group.php:26 mod/message.php:59 mod/message.php:104
#: mod/network.php:32 mod/notes.php:30 mod/photos.php:174 mod/photos.php:1051
#: mod/settings.php:41 mod/settings.php:140 mod/settings.php:669 index.php:413
msgid "Permission denied."
msgstr ""
@ -756,7 +681,7 @@ msgstr[1] ""
msgid "View Contacts"
msgstr ""
#: include/text.php:1010 mod/editpost.php:112 mod/filer.php:35 mod/notes.php:68
#: include/text.php:1010 mod/filer.php:35 mod/editpost.php:112 mod/notes.php:68
msgid "Save"
msgstr ""
@ -894,6 +819,76 @@ msgstr ""
msgid "Item filed"
msgstr ""
#: include/acl_selectors.php:355
msgid "Post to Email"
msgstr ""
#: include/acl_selectors.php:360
msgid "Hide your profile details from unknown viewers?"
msgstr ""
#: include/acl_selectors.php:360
#, php-format
msgid "Connectors disabled, since \"%s\" is enabled."
msgstr ""
#: include/acl_selectors.php:366
msgid "Visible to everybody"
msgstr ""
#: include/acl_selectors.php:367 view/theme/vier/config.php:115
msgid "show"
msgstr ""
#: include/acl_selectors.php:368 view/theme/vier/config.php:115
msgid "don't show"
msgstr ""
#: include/acl_selectors.php:374 mod/editpost.php:136
msgid "CC: email addresses"
msgstr ""
#: include/acl_selectors.php:375 mod/editpost.php:143
msgid "Example: bob@example.com, mary@example.com"
msgstr ""
#: include/acl_selectors.php:377 mod/events.php:536 mod/photos.php:1098
#: mod/photos.php:1441
msgid "Permissions"
msgstr ""
#: include/acl_selectors.php:378
msgid "Close"
msgstr ""
#: include/api.php:1181
#, 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:1205
#, 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:1229
#, php-format
msgid "Monthly posting limit of %d post reached. The post was rejected."
msgstr ""
#: include/api.php:4382 mod/profile_photo.php:84 mod/profile_photo.php:92
#: mod/profile_photo.php:100 mod/profile_photo.php:223
#: mod/profile_photo.php:317 mod/profile_photo.php:327 mod/photos.php:88
#: mod/photos.php:194 mod/photos.php:722 mod/photos.php:1149
#: mod/photos.php:1166 mod/photos.php:1684 src/Model/User.php:526
#: src/Model/User.php:534 src/Model/User.php:542
msgid "Profile Photos"
msgstr ""
#: include/conversation.php:149 include/conversation.php:159
#: include/conversation.php:287 include/conversation.php:296
#: mod/subthread.php:97 mod/tagger.php:72 src/Model/Item.php:1783
@ -980,7 +975,7 @@ msgid "Select"
msgstr ""
#: include/conversation.php:747 mod/contacts.php:821 mod/contacts.php:1019
#: mod/photos.php:1570 mod/settings.php:742 mod/admin.php:1706
#: mod/admin.php:1706 mod/photos.php:1570 mod/settings.php:742
#: src/Object/Post.php:178
msgid "Delete"
msgstr ""
@ -1008,8 +1003,8 @@ msgid "View in context"
msgstr ""
#: include/conversation.php:816 include/conversation.php:1355
#: mod/editpost.php:127 mod/message.php:264 mod/message.php:433
#: mod/photos.php:1473 mod/wallmessage.php:145 src/Object/Post.php:394
#: mod/wallmessage.php:145 mod/editpost.php:127 mod/message.php:264
#: mod/message.php:433 mod/photos.php:1473 src/Object/Post.php:394
msgid "Please wait"
msgstr ""
@ -1030,8 +1025,8 @@ msgid "View Status"
msgstr ""
#: include/conversation.php:1063 include/conversation.php:1079
#: mod/allfriends.php:73 mod/directory.php:153 mod/suggest.php:82
#: mod/dirfind.php:220 mod/match.php:89 src/Model/Contact.php:497
#: mod/allfriends.php:73 mod/suggest.php:82 mod/dirfind.php:220
#: mod/match.php:89 mod/directory.php:160 src/Model/Contact.php:497
#: src/Model/Contact.php:510 src/Model/Contact.php:555
msgid "View Profile"
msgstr ""
@ -1143,7 +1138,7 @@ msgstr ""
#: include/conversation.php:1250
#, php-format
msgid "%s anttend maybe."
msgid "%s attend maybe."
msgstr ""
#: include/conversation.php:1280 include/conversation.php:1296
@ -1151,8 +1146,8 @@ msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: include/conversation.php:1281 include/conversation.php:1297
#: mod/message.php:200 mod/message.php:207 mod/message.php:343
#: mod/message.php:350 mod/wallmessage.php:120 mod/wallmessage.php:127
#: mod/wallmessage.php:120 mod/wallmessage.php:127 mod/message.php:200
#: mod/message.php:207 mod/message.php:343 mod/message.php:350
msgid "Please enter a link URL:"
msgstr ""
@ -1184,8 +1179,8 @@ msgstr ""
msgid "Share"
msgstr ""
#: include/conversation.php:1337 mod/editpost.php:113 mod/message.php:262
#: mod/message.php:430 mod/wallmessage.php:143
#: include/conversation.php:1337 mod/wallmessage.php:143 mod/editpost.php:113
#: mod/message.php:262 mod/message.php:430
msgid "Upload photo"
msgstr ""
@ -1201,8 +1196,8 @@ msgstr ""
msgid "attach file"
msgstr ""
#: include/conversation.php:1341 mod/editpost.php:117 mod/message.php:263
#: mod/message.php:431 mod/wallmessage.php:144
#: include/conversation.php:1341 mod/wallmessage.php:144 mod/editpost.php:117
#: mod/message.php:263 mod/message.php:431
msgid "Insert web link"
msgstr ""
@ -1316,6 +1311,11 @@ msgid_plural "Undecided"
msgstr[0] ""
msgstr[1] ""
#: include/dba.php:59
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: mod/allfriends.php:51
msgid "No friends to display."
msgstr ""
@ -1345,11 +1345,11 @@ msgstr ""
#: mod/api.php:111 mod/profiles.php:649 mod/profiles.php:653
#: mod/profiles.php:674 mod/dfrn_request.php:653 mod/follow.php:148
#: mod/settings.php:1109 mod/settings.php:1115 mod/settings.php:1122
#: mod/settings.php:1126 mod/settings.php:1130 mod/settings.php:1134
#: mod/settings.php:1138 mod/settings.php:1142 mod/settings.php:1162
#: mod/settings.php:1163 mod/settings.php:1164 mod/settings.php:1165
#: mod/settings.php:1166 mod/register.php:238
#: mod/register.php:238 mod/settings.php:1109 mod/settings.php:1115
#: mod/settings.php:1122 mod/settings.php:1126 mod/settings.php:1130
#: mod/settings.php:1134 mod/settings.php:1138 mod/settings.php:1142
#: mod/settings.php:1162 mod/settings.php:1163 mod/settings.php:1164
#: mod/settings.php:1165 mod/settings.php:1166
msgid "No"
msgstr ""
@ -1373,14 +1373,6 @@ msgstr ""
msgid "Item was not found."
msgstr ""
#: mod/bookmarklet.php:21 src/Content/Nav.php:114 src/Module/Login.php:312
msgid "Login"
msgstr ""
#: mod/bookmarklet.php:49
msgid "The post was created"
msgstr ""
#: mod/common.php:91
msgid "No contacts in common."
msgstr ""
@ -1445,12 +1437,12 @@ msgstr ""
msgid "Refetch contact data"
msgstr ""
#: mod/crepair.php:148 mod/fsuggest.php:116 mod/invite.php:150
#: mod/manage.php:184 mod/profiles.php:685 mod/contacts.php:601
#: mod/events.php:533 mod/install.php:251 mod/install.php:290
#: mod/localtime.php:56 mod/message.php:265 mod/message.php:432
#: mod/crepair.php:148 mod/invite.php:150 mod/manage.php:184
#: mod/profiles.php:685 mod/contacts.php:601 mod/install.php:251
#: mod/install.php:290 mod/localtime.php:56 mod/poke.php:199 mod/events.php:533
#: mod/fsuggest.php:116 mod/message.php:265 mod/message.php:432
#: mod/photos.php:1080 mod/photos.php:1160 mod/photos.php:1445
#: mod/photos.php:1491 mod/photos.php:1530 mod/photos.php:1603 mod/poke.php:199
#: mod/photos.php:1491 mod/photos.php:1530 mod/photos.php:1603
#: view/theme/duepuntozero/config.php:71 view/theme/frio/config.php:113
#: view/theme/quattro/config.php:73 view/theme/vier/config.php:119
#: src/Object/Post.php:788
@ -1471,9 +1463,9 @@ msgid ""
"entries from this contact."
msgstr ""
#: mod/crepair.php:158 mod/settings.php:681 mod/settings.php:707
#: mod/admin.php:439 mod/admin.php:1689 mod/admin.php:1701 mod/admin.php:1714
#: mod/admin.php:1730
#: mod/crepair.php:158 mod/admin.php:439 mod/admin.php:1689 mod/admin.php:1701
#: mod/admin.php:1714 mod/admin.php:1730 mod/settings.php:681
#: mod/settings.php:707
msgid "Name"
msgstr ""
@ -1509,55 +1501,6 @@ msgstr ""
msgid "New photo from this URL"
msgstr ""
#: mod/directory.php:38 mod/community.php:25 mod/dfrn_request.php:607
#: mod/display.php:201 mod/photos.php:932 mod/probe.php:13 mod/search.php:98
#: mod/search.php:104 mod/videos.php:200 mod/viewcontacts.php:45
#: mod/webfinger.php:16
msgid "Public access denied."
msgstr ""
#: mod/directory.php:142 mod/notifications.php:253 src/Model/Profile.php:420
#: src/Model/Profile.php:745
msgid "Gender:"
msgstr ""
#: mod/directory.php:144 src/Model/Profile.php:421 src/Model/Profile.php:769
msgid "Status:"
msgstr ""
#: mod/directory.php:146 src/Model/Profile.php:422 src/Model/Profile.php:786
msgid "Homepage:"
msgstr ""
#: mod/directory.php:148 mod/notifications.php:249 mod/contacts.php:655
#: src/Model/Profile.php:423 src/Model/Profile.php:806
msgid "About:"
msgstr ""
#: mod/directory.php:195 view/theme/vier/theme.php:201
msgid "Global Directory"
msgstr ""
#: mod/directory.php:197
msgid "Find on this site"
msgstr ""
#: mod/directory.php:199
msgid "Results for:"
msgstr ""
#: mod/directory.php:201
msgid "Site Directory"
msgstr ""
#: mod/directory.php:202 mod/contacts.php:811 src/Content/Widget.php:63
msgid "Find"
msgstr ""
#: mod/directory.php:206
msgid "No entries (some entries may be hidden)."
msgstr ""
#: mod/fbrowser.php:34 view/theme/frio/theme.php:261 src/Content/Nav.php:102
#: src/Model/Profile.php:904
msgid "Photos"
@ -1583,82 +1526,6 @@ msgstr ""
msgid "Not Found"
msgstr ""
#: mod/group.php:36
msgid "Group created."
msgstr ""
#: mod/group.php:42
msgid "Could not create group."
msgstr ""
#: mod/group.php:56 mod/group.php:158
msgid "Group not found."
msgstr ""
#: mod/group.php:70
msgid "Group name changed."
msgstr ""
#: mod/group.php:83 mod/profperm.php:28 index.php:412
msgid "Permission denied"
msgstr ""
#: mod/group.php:97
msgid "Save Group"
msgstr ""
#: mod/group.php:102
msgid "Create a group of contacts/friends."
msgstr ""
#: mod/group.php:103 mod/group.php:200 src/Model/Group.php:409
msgid "Group Name: "
msgstr ""
#: mod/group.php:127
msgid "Group removed."
msgstr ""
#: mod/group.php:129
msgid "Unable to remove group."
msgstr ""
#: mod/group.php:193
msgid "Delete Group"
msgstr ""
#: mod/group.php:199
msgid "Group Editor"
msgstr ""
#: mod/group.php:204
msgid "Edit Group Name"
msgstr ""
#: mod/group.php:214
msgid "Members"
msgstr ""
#: mod/group.php:216 mod/contacts.php:710
msgid "All Contacts"
msgstr ""
#: mod/group.php:217 mod/network.php:639
msgid "Group is empty"
msgstr ""
#: mod/group.php:230
msgid "Remove Contact"
msgstr ""
#: mod/group.php:254
msgid "Add Contact"
msgstr ""
#: mod/group.php:266 mod/profperm.php:115
msgid "Click on a contact to add or remove."
msgstr ""
#: mod/hcard.php:18
msgid "No profile"
msgstr ""
@ -1723,8 +1590,8 @@ msgid ""
"join."
msgstr ""
#: mod/newmember.php:19 mod/settings.php:122 mod/admin.php:1814
#: mod/admin.php:2083 view/theme/frio/theme.php:269 src/Content/Nav.php:206
#: mod/newmember.php:19 mod/admin.php:1814 mod/admin.php:2083
#: mod/settings.php:122 view/theme/frio/theme.php:269 src/Content/Nav.php:206
msgid "Settings"
msgstr ""
@ -2208,11 +2075,21 @@ msgstr ""
msgid "Subscriber"
msgstr ""
#: mod/notifications.php:249 mod/contacts.php:655 mod/directory.php:155
#: src/Model/Profile.php:423 src/Model/Profile.php:806
msgid "About:"
msgstr ""
#: mod/notifications.php:251 mod/contacts.php:657 mod/follow.php:172
#: src/Model/Profile.php:794
msgid "Tags:"
msgstr ""
#: mod/notifications.php:253 mod/directory.php:152 src/Model/Profile.php:420
#: src/Model/Profile.php:745
msgid "Gender:"
msgstr ""
#: mod/notifications.php:261 mod/contacts.php:63 src/Model/Profile.php:518
msgid "Network:"
msgstr ""
@ -2297,7 +2174,7 @@ msgstr ""
msgid "Previous"
msgstr ""
#: mod/cal.php:277 mod/events.php:396 mod/install.php:209
#: mod/cal.php:277 mod/install.php:209 mod/events.php:396
msgid "Next"
msgstr ""
@ -2405,19 +2282,6 @@ msgstr ""
msgid "%1$s has joined %2$s"
msgstr ""
#: mod/fsuggest.php:71
msgid "Friend suggestion sent."
msgstr ""
#: mod/fsuggest.php:102
msgid "Suggest Friends"
msgstr ""
#: mod/fsuggest.php:104
#, php-format
msgid "Suggest a friend for %s"
msgstr ""
#: mod/invite.php:33
msgid "Total invitation limit exceeded."
msgstr ""
@ -2501,8 +2365,8 @@ msgstr ""
msgid "Enter email addresses, one per line:"
msgstr ""
#: mod/invite.php:144 mod/message.php:259 mod/message.php:426
#: mod/wallmessage.php:141
#: mod/invite.php:144 mod/wallmessage.php:141 mod/message.php:259
#: mod/message.php:426
msgid "Your message:"
msgstr ""
@ -2920,84 +2784,6 @@ msgstr ""
msgid "File upload failed."
msgstr ""
#: mod/babel.php:23
msgid "Source (bbcode) text:"
msgstr ""
#: mod/babel.php:30
msgid "Source (Diaspora) text to convert to BBcode:"
msgstr ""
#: mod/babel.php:38
msgid "Source input: "
msgstr ""
#: mod/babel.php:42
msgid "bbcode (raw HTML(: "
msgstr ""
#: mod/babel.php:45
msgid "bbcode: "
msgstr ""
#: mod/babel.php:49 mod/babel.php:65
msgid "bbcode => html2bbcode: "
msgstr ""
#: mod/babel.php:53
msgid "bb2diaspora: "
msgstr ""
#: mod/babel.php:57
msgid "bb2diaspora => Markdown: "
msgstr ""
#: mod/babel.php:61
msgid "bb2diaspora => diaspora2bb: "
msgstr ""
#: mod/babel.php:71
msgid "Source input (Diaspora format): "
msgstr ""
#: mod/babel.php:75
msgid "diaspora2bb: "
msgstr ""
#: mod/community.php:44
msgid "Community option not available."
msgstr ""
#: mod/community.php:61
msgid "Not available."
msgstr ""
#: mod/community.php:74
msgid "Local Community"
msgstr ""
#: mod/community.php:77
msgid "Posts from local users on this server"
msgstr ""
#: mod/community.php:85
msgid "Global Community"
msgstr ""
#: mod/community.php:88
msgid "Posts from users of the whole federated network"
msgstr ""
#: mod/community.php:134 mod/search.php:228
msgid "No results."
msgstr ""
#: mod/community.php:178
msgid ""
"This community stream shows all public posts received by this node. They may "
"not reflect the opinions of this nodes users."
msgstr ""
#: mod/contacts.php:149
#, php-format
msgid "%d contact edited."
@ -3261,6 +3047,10 @@ msgstr ""
msgid "Suggest potential friends"
msgstr ""
#: mod/contacts.php:710 mod/group.php:216
msgid "All Contacts"
msgstr ""
#: mod/contacts.php:713
msgid "Show all contacts"
msgstr ""
@ -3314,6 +3104,10 @@ msgstr ""
msgid "Results for: %s"
msgstr ""
#: mod/contacts.php:811 mod/directory.php:210 src/Content/Widget.php:63
msgid "Find"
msgstr ""
#: mod/contacts.php:817 mod/settings.php:169 mod/settings.php:705
msgid "Update"
msgstr ""
@ -3342,7 +3136,7 @@ msgstr ""
msgid "View all common friends"
msgstr ""
#: mod/contacts.php:886 mod/events.php:535 mod/admin.php:1269
#: mod/contacts.php:886 mod/admin.php:1269 mod/events.php:535
#: src/Model/Profile.php:865
msgid "Advanced"
msgstr ""
@ -3393,10 +3187,10 @@ msgid ""
"settings. Please double check whom you give this access."
msgstr ""
#: mod/delegate.php:161 mod/settings.php:679 mod/settings.php:788
#: mod/settings.php:874 mod/settings.php:963 mod/settings.php:1198
#: mod/admin.php:1264 mod/admin.php:1873 mod/admin.php:2126 mod/admin.php:2200
#: mod/admin.php:2347
#: mod/delegate.php:161 mod/admin.php:1264 mod/admin.php:1873
#: mod/admin.php:2126 mod/admin.php:2200 mod/admin.php:2347
#: mod/settings.php:679 mod/settings.php:788 mod/settings.php:874
#: mod/settings.php:963 mod/settings.php:1198
msgid "Save Settings"
msgstr ""
@ -3546,6 +3340,13 @@ msgstr ""
msgid "Please confirm your introduction/connection request to %s."
msgstr ""
#: mod/dfrn_request.php:607 mod/probe.php:13 mod/search.php:98
#: mod/search.php:104 mod/viewcontacts.php:45 mod/webfinger.php:16
#: mod/community.php:25 mod/directory.php:42 mod/display.php:201
#: mod/photos.php:932 mod/videos.php:200
msgid "Public access denied."
msgstr ""
#: mod/dfrn_request.php:642
msgid ""
"Please enter your 'Identity Address' from one of the following supported "
@ -3601,74 +3402,6 @@ msgid ""
"bar."
msgstr ""
#: mod/editpost.php:27 mod/editpost.php:37
msgid "Item not found"
msgstr ""
#: mod/editpost.php:44
msgid "Edit post"
msgstr ""
#: mod/events.php:103 mod/events.php:105
msgid "Event can not end before it has started."
msgstr ""
#: mod/events.php:112 mod/events.php:114
msgid "Event title and start time are required."
msgstr ""
#: mod/events.php:394
msgid "Create New Event"
msgstr ""
#: mod/events.php:509
msgid "Event details"
msgstr ""
#: mod/events.php:510
msgid "Starting date and Title are required."
msgstr ""
#: mod/events.php:511 mod/events.php:512
msgid "Event Starts:"
msgstr ""
#: mod/events.php:513 mod/events.php:529
msgid "Finish date/time is not known or not relevant"
msgstr ""
#: mod/events.php:515 mod/events.php:516
msgid "Event Finishes:"
msgstr ""
#: mod/events.php:517 mod/events.php:530
msgid "Adjust for viewer timezone"
msgstr ""
#: mod/events.php:519
msgid "Description:"
msgstr ""
#: mod/events.php:523 mod/events.php:525
msgid "Title:"
msgstr ""
#: mod/events.php:526 mod/events.php:527
msgid "Share this event"
msgstr ""
#: mod/events.php:534 src/Model/Profile.php:864
msgid "Basic"
msgstr ""
#: mod/events.php:556
msgid "Failed to remove event"
msgstr ""
#: mod/events.php:558
msgid "Event removed"
msgstr ""
#: mod/filer.php:34
msgid "- select -"
msgstr ""
@ -4204,337 +3937,10 @@ msgstr ""
msgid "Your password has been changed at %s"
msgstr ""
#: mod/message.php:30 src/Content/Nav.php:198
msgid "New Message"
msgstr ""
#: mod/message.php:73 mod/wallmessage.php:57
msgid "No recipient selected."
msgstr ""
#: mod/message.php:77
msgid "Unable to locate contact information."
msgstr ""
#: mod/message.php:80 mod/wallmessage.php:63
msgid "Message could not be sent."
msgstr ""
#: mod/message.php:83 mod/wallmessage.php:66
msgid "Message collection failure."
msgstr ""
#: mod/message.php:86 mod/wallmessage.php:69
msgid "Message sent."
msgstr ""
#: mod/message.php:112 view/theme/frio/theme.php:268 src/Content/Nav.php:195
msgid "Messages"
msgstr ""
#: mod/message.php:136
msgid "Do you really want to delete this message?"
msgstr ""
#: mod/message.php:156
msgid "Message deleted."
msgstr ""
#: mod/message.php:185
msgid "Conversation removed."
msgstr ""
#: mod/message.php:250 mod/wallmessage.php:132
msgid "Send Private Message"
msgstr ""
#: mod/message.php:251 mod/message.php:421 mod/wallmessage.php:134
msgid "To:"
msgstr ""
#: mod/message.php:255 mod/message.php:423 mod/wallmessage.php:135
msgid "Subject:"
msgstr ""
#: mod/message.php:291
msgid "No messages."
msgstr ""
#: mod/message.php:330
msgid "Message not available."
msgstr ""
#: mod/message.php:397
msgid "Delete message"
msgstr ""
#: mod/message.php:399 mod/message.php:500
msgid "D, d M Y - g:i A"
msgstr ""
#: mod/message.php:414 mod/message.php:497
msgid "Delete conversation"
msgstr ""
#: mod/message.php:416
msgid ""
"No secure communications available. You <strong>may</strong> be able to "
"respond from the sender's profile page."
msgstr ""
#: mod/message.php:420
msgid "Send Reply"
msgstr ""
#: mod/message.php:471
#, php-format
msgid "Unknown sender - %s"
msgstr ""
#: mod/message.php:473
#, php-format
msgid "You and %s"
msgstr ""
#: mod/message.php:475
#, php-format
msgid "%s and You"
msgstr ""
#: mod/message.php:503
#, php-format
msgid "%d message"
msgid_plural "%d messages"
msgstr[0] ""
msgstr[1] ""
#: mod/notes.php:53 src/Model/Profile.php:946
msgid "Personal Notes"
msgstr ""
#: mod/notify.php:77
msgid "No more system notifications."
msgstr ""
#: mod/photos.php:108 src/Model/Profile.php:907
msgid "Photo Albums"
msgstr ""
#: mod/photos.php:109 mod/photos.php:1713
msgid "Recent Photos"
msgstr ""
#: mod/photos.php:112 mod/photos.php:1210 mod/photos.php:1715
msgid "Upload New Photos"
msgstr ""
#: mod/photos.php:126 mod/settings.php:49
msgid "everybody"
msgstr ""
#: mod/photos.php:184
msgid "Contact information unavailable"
msgstr ""
#: mod/photos.php:204
msgid "Album not found."
msgstr ""
#: mod/photos.php:234 mod/photos.php:245 mod/photos.php:1161
msgid "Delete Album"
msgstr ""
#: mod/photos.php:243
msgid "Do you really want to delete this photo album and all its photos?"
msgstr ""
#: mod/photos.php:310 mod/photos.php:321 mod/photos.php:1446
msgid "Delete Photo"
msgstr ""
#: mod/photos.php:319
msgid "Do you really want to delete this photo?"
msgstr ""
#: mod/photos.php:667
msgid "a photo"
msgstr ""
#: mod/photos.php:667
#, php-format
msgid "%1$s was tagged in %2$s by %3$s"
msgstr ""
#: mod/photos.php:763 mod/photos.php:766 mod/photos.php:795
#: mod/profile_photo.php:165 mod/wall_upload.php:186
#, php-format
msgid "Image exceeds size limit of %s"
msgstr ""
#: mod/photos.php:769
msgid "Image upload didn't complete, please try again"
msgstr ""
#: mod/photos.php:772
msgid "Image file is missing"
msgstr ""
#: mod/photos.php:777
msgid ""
"Server can't accept new file upload at this time, please contact your "
"administrator"
msgstr ""
#: mod/photos.php:803
msgid "Image file is empty."
msgstr ""
#: mod/photos.php:818 mod/profile_photo.php:174 mod/wall_upload.php:200
msgid "Unable to process image."
msgstr ""
#: mod/photos.php:847 mod/profile_photo.php:322 mod/wall_upload.php:239
msgid "Image upload failed."
msgstr ""
#: mod/photos.php:940
msgid "No photos selected"
msgstr ""
#: mod/photos.php:1036 mod/videos.php:310
msgid "Access to this item is restricted."
msgstr ""
#: mod/photos.php:1090
msgid "Upload Photos"
msgstr ""
#: mod/photos.php:1094 mod/photos.php:1156
msgid "New album name: "
msgstr ""
#: mod/photos.php:1095
msgid "or existing album name: "
msgstr ""
#: mod/photos.php:1096
msgid "Do not show a status post for this upload"
msgstr ""
#: mod/photos.php:1106 mod/photos.php:1449 mod/settings.php:1233
msgid "Show to Groups"
msgstr ""
#: mod/photos.php:1107 mod/photos.php:1450 mod/settings.php:1234
msgid "Show to Contacts"
msgstr ""
#: mod/photos.php:1167
msgid "Edit Album"
msgstr ""
#: mod/photos.php:1172
msgid "Show Newest First"
msgstr ""
#: mod/photos.php:1174
msgid "Show Oldest First"
msgstr ""
#: mod/photos.php:1195 mod/photos.php:1698
msgid "View Photo"
msgstr ""
#: mod/photos.php:1236
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
#: mod/photos.php:1238
msgid "Photo not available"
msgstr ""
#: mod/photos.php:1301
msgid "View photo"
msgstr ""
#: mod/photos.php:1301
msgid "Edit photo"
msgstr ""
#: mod/photos.php:1302
msgid "Use as profile photo"
msgstr ""
#: mod/photos.php:1308 src/Object/Post.php:148
msgid "Private Message"
msgstr ""
#: mod/photos.php:1327
msgid "View Full Size"
msgstr ""
#: mod/photos.php:1414
msgid "Tags: "
msgstr ""
#: mod/photos.php:1417
msgid "[Remove any tag]"
msgstr ""
#: mod/photos.php:1432
msgid "New album name"
msgstr ""
#: mod/photos.php:1433
msgid "Caption"
msgstr ""
#: mod/photos.php:1434
msgid "Add a Tag"
msgstr ""
#: mod/photos.php:1434
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
#: mod/photos.php:1435
msgid "Do not rotate"
msgstr ""
#: mod/photos.php:1436
msgid "Rotate CW (right)"
msgstr ""
#: mod/photos.php:1437
msgid "Rotate CCW (left)"
msgstr ""
#: mod/photos.php:1471 src/Object/Post.php:295
msgid "I like this (toggle)"
msgstr ""
#: mod/photos.php:1472 src/Object/Post.php:296
msgid "I don't like this (toggle)"
msgstr ""
#: mod/photos.php:1488 mod/photos.php:1527 mod/photos.php:1600
#: src/Object/Post.php:785
msgid "This is you"
msgstr ""
#: mod/photos.php:1490 mod/photos.php:1529 mod/photos.php:1602
#: src/Object/Post.php:391 src/Object/Post.php:787
msgid "Comment"
msgstr ""
#: mod/photos.php:1634
msgid "Map"
msgstr ""
#: mod/photos.php:1704 mod/videos.php:388
msgid "View Album"
msgstr ""
#: mod/ping.php:292
msgid "{0} wants to be your friend"
msgstr ""
@ -4591,6 +3997,16 @@ msgstr ""
msgid "Unable to process image"
msgstr ""
#: mod/profile_photo.php:165 mod/wall_upload.php:186 mod/photos.php:763
#: mod/photos.php:766 mod/photos.php:795
#, php-format
msgid "Image exceeds size limit of %s"
msgstr ""
#: mod/profile_photo.php:174 mod/wall_upload.php:200 mod/photos.php:818
msgid "Unable to process image."
msgstr ""
#: mod/profile_photo.php:262
msgid "Upload File:"
msgstr ""
@ -4627,6 +4043,14 @@ msgstr ""
msgid "Image uploaded successfully."
msgstr ""
#: mod/profile_photo.php:322 mod/wall_upload.php:239 mod/photos.php:847
msgid "Image upload failed."
msgstr ""
#: mod/profperm.php:28 mod/group.php:83 index.php:412
msgid "Permission denied"
msgstr ""
#: mod/profperm.php:34 mod/profperm.php:65
msgid "Invalid profile identifier."
msgstr ""
@ -4635,6 +4059,10 @@ msgstr ""
msgid "Profile Visibility Editor"
msgstr ""
#: mod/profperm.php:115 mod/group.php:266
msgid "Click on a contact to add or remove."
msgstr ""
#: mod/profperm.php:124
msgid "Visible To"
msgstr ""
@ -4690,877 +4118,15 @@ msgstr ""
msgid "Only one search per minute is permitted for not logged in users."
msgstr ""
#: mod/search.php:228 mod/community.php:134
msgid "No results."
msgstr ""
#: mod/search.php:234
#, php-format
msgid "Items tagged with: %s"
msgstr ""
#: mod/settings.php:54 mod/admin.php:1689
msgid "Account"
msgstr ""
#: mod/settings.php:63 mod/admin.php:184
msgid "Additional features"
msgstr ""
#: mod/settings.php:71
msgid "Display"
msgstr ""
#: mod/settings.php:78 mod/settings.php:845
msgid "Social Networks"
msgstr ""
#: mod/settings.php:85 mod/admin.php:182 mod/admin.php:1812 mod/admin.php:1872
msgid "Addons"
msgstr ""
#: mod/settings.php:92 src/Content/Nav.php:204
msgid "Delegations"
msgstr ""
#: mod/settings.php:99
msgid "Connected apps"
msgstr ""
#: mod/settings.php:106 mod/uexport.php:52
msgid "Export personal data"
msgstr ""
#: mod/settings.php:113
msgid "Remove account"
msgstr ""
#: mod/settings.php:167
msgid "Missing some important data!"
msgstr ""
#: mod/settings.php:278
msgid "Failed to connect with email account using the settings provided."
msgstr ""
#: mod/settings.php:283
msgid "Email settings updated."
msgstr ""
#: mod/settings.php:299
msgid "Features updated"
msgstr ""
#: mod/settings.php:371
msgid "Relocate message has been send to your contacts"
msgstr ""
#: mod/settings.php:383 src/Model/User.php:312
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: mod/settings.php:388
msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
#: mod/settings.php:394
msgid "Wrong password."
msgstr ""
#: mod/settings.php:401
msgid "Password changed."
msgstr ""
#: mod/settings.php:403
msgid "Password update failed. Please try again."
msgstr ""
#: mod/settings.php:493
msgid " Please use a shorter name."
msgstr ""
#: mod/settings.php:496
msgid " Name too short."
msgstr ""
#: mod/settings.php:504
msgid "Wrong Password"
msgstr ""
#: mod/settings.php:509
msgid "Invalid email."
msgstr ""
#: mod/settings.php:516
msgid "Cannot change to that email."
msgstr ""
#: mod/settings.php:569
msgid "Private forum has no privacy permissions. Using default privacy group."
msgstr ""
#: mod/settings.php:572
msgid "Private forum has no privacy permissions and no default privacy group."
msgstr ""
#: mod/settings.php:612
msgid "Settings updated."
msgstr ""
#: mod/settings.php:678 mod/settings.php:704 mod/settings.php:740
msgid "Add application"
msgstr ""
#: mod/settings.php:682 mod/settings.php:708
msgid "Consumer Key"
msgstr ""
#: mod/settings.php:683 mod/settings.php:709
msgid "Consumer Secret"
msgstr ""
#: mod/settings.php:684 mod/settings.php:710
msgid "Redirect"
msgstr ""
#: mod/settings.php:685 mod/settings.php:711
msgid "Icon url"
msgstr ""
#: mod/settings.php:696
msgid "You can't edit this application."
msgstr ""
#: mod/settings.php:739
msgid "Connected Apps"
msgstr ""
#: mod/settings.php:741 src/Object/Post.php:154 src/Object/Post.php:156
msgid "Edit"
msgstr ""
#: mod/settings.php:743
msgid "Client key starts with"
msgstr ""
#: mod/settings.php:744
msgid "No name"
msgstr ""
#: mod/settings.php:745
msgid "Remove authorization"
msgstr ""
#: mod/settings.php:756
msgid "No Addon settings configured"
msgstr ""
#: mod/settings.php:765
msgid "Addon Settings"
msgstr ""
#: mod/settings.php:779 mod/admin.php:2336 mod/admin.php:2337
msgid "Off"
msgstr ""
#: mod/settings.php:779 mod/admin.php:2336 mod/admin.php:2337
msgid "On"
msgstr ""
#: mod/settings.php:786
msgid "Additional Features"
msgstr ""
#: mod/settings.php:808 src/Content/ContactSelector.php:83
msgid "Diaspora"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
msgid "enabled"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
msgid "disabled"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr ""
#: mod/settings.php:809
msgid "GNU Social (OStatus)"
msgstr ""
#: mod/settings.php:840
msgid "Email access is disabled on this site."
msgstr ""
#: mod/settings.php:850
msgid "General Social Media Settings"
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 "Automatically follow any GNU Social (OStatus) followers/mentioners"
msgstr ""
#: mod/settings.php:852
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:853
msgid "Default group for OStatus contacts"
msgstr ""
#: mod/settings.php:854
msgid "Your legacy GNU Social account"
msgstr ""
#: mod/settings.php:854
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:857
msgid "Repair OStatus subscriptions"
msgstr ""
#: mod/settings.php:861
msgid "Email/Mailbox Setup"
msgstr ""
#: mod/settings.php:862
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:863
msgid "Last successful email check:"
msgstr ""
#: mod/settings.php:865
msgid "IMAP server name:"
msgstr ""
#: mod/settings.php:866
msgid "IMAP port:"
msgstr ""
#: mod/settings.php:867
msgid "Security:"
msgstr ""
#: mod/settings.php:867 mod/settings.php:872
msgid "None"
msgstr ""
#: mod/settings.php:868
msgid "Email login name:"
msgstr ""
#: mod/settings.php:869
msgid "Email password:"
msgstr ""
#: mod/settings.php:870
msgid "Reply-to address:"
msgstr ""
#: mod/settings.php:871
msgid "Send public posts to all email contacts:"
msgstr ""
#: mod/settings.php:872
msgid "Action after import:"
msgstr ""
#: mod/settings.php:872 src/Content/Nav.php:191
msgid "Mark as seen"
msgstr ""
#: mod/settings.php:872
msgid "Move to folder"
msgstr ""
#: mod/settings.php:873
msgid "Move to folder:"
msgstr ""
#: mod/settings.php:907 mod/admin.php:1154
msgid "No special theme for mobile devices"
msgstr ""
#: mod/settings.php:916
#, php-format
msgid "%s - (Unsupported)"
msgstr ""
#: mod/settings.php:918
#, php-format
msgid "%s - (Experimental)"
msgstr ""
#: mod/settings.php:961
msgid "Display Settings"
msgstr ""
#: mod/settings.php:967 mod/settings.php:991
msgid "Display Theme:"
msgstr ""
#: mod/settings.php:968
msgid "Mobile Theme:"
msgstr ""
#: mod/settings.php:969
msgid "Suppress warning of insecure networks"
msgstr ""
#: mod/settings.php:969
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:970
msgid "Update browser every xx seconds"
msgstr ""
#: mod/settings.php:970
msgid "Minimum of 10 seconds. Enter -1 to disable it."
msgstr ""
#: mod/settings.php:971
msgid "Number of items to display per page:"
msgstr ""
#: mod/settings.php:971 mod/settings.php:972
msgid "Maximum of 100 items"
msgstr ""
#: mod/settings.php:972
msgid "Number of items to display per page when viewed from mobile device:"
msgstr ""
#: mod/settings.php:973
msgid "Don't show emoticons"
msgstr ""
#: mod/settings.php:974
msgid "Calendar"
msgstr ""
#: mod/settings.php:975
msgid "Beginning of week:"
msgstr ""
#: mod/settings.php:976
msgid "Don't show notices"
msgstr ""
#: mod/settings.php:977
msgid "Infinite scroll"
msgstr ""
#: mod/settings.php:978
msgid "Automatic updates only at the top of the network page"
msgstr ""
#: mod/settings.php:978
msgid ""
"When disabled, the network page is updated all the time, which could be "
"confusing while reading."
msgstr ""
#: mod/settings.php:979
msgid "Bandwith Saver Mode"
msgstr ""
#: mod/settings.php:979
msgid ""
"When enabled, embedded content is not displayed on automatic updates, they "
"only show on page reload."
msgstr ""
#: mod/settings.php:980
msgid "Smart Threading"
msgstr ""
#: mod/settings.php:980
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:982
msgid "General Theme Settings"
msgstr ""
#: mod/settings.php:983
msgid "Custom Theme Settings"
msgstr ""
#: mod/settings.php:984
msgid "Content Settings"
msgstr ""
#: mod/settings.php:985 view/theme/duepuntozero/config.php:73
#: view/theme/frio/config.php:115 view/theme/quattro/config.php:75
#: view/theme/vier/config.php:121
msgid "Theme settings"
msgstr ""
#: mod/settings.php:1006
msgid "Unable to find your profile. Please contact your admin."
msgstr ""
#: mod/settings.php:1048
msgid "Account Types"
msgstr ""
#: mod/settings.php:1049
msgid "Personal Page Subtypes"
msgstr ""
#: mod/settings.php:1050
msgid "Community Forum Subtypes"
msgstr ""
#: mod/settings.php:1057
msgid "Personal Page"
msgstr ""
#: mod/settings.php:1058
msgid "Account for a personal profile."
msgstr ""
#: mod/settings.php:1061
msgid "Organisation Page"
msgstr ""
#: mod/settings.php:1062
msgid ""
"Account for an organisation that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1065
msgid "News Page"
msgstr ""
#: mod/settings.php:1066
msgid ""
"Account for a news reflector that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1069
msgid "Community Forum"
msgstr ""
#: mod/settings.php:1070
msgid "Account for community discussions."
msgstr ""
#: mod/settings.php:1073
msgid "Normal Account Page"
msgstr ""
#: mod/settings.php:1074
msgid ""
"Account for a regular personal profile that requires manual approval of "
"\"Friends\" and \"Followers\"."
msgstr ""
#: mod/settings.php:1077
msgid "Soapbox Page"
msgstr ""
#: mod/settings.php:1078
msgid ""
"Account for a public profile that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1081
msgid "Public Forum"
msgstr ""
#: mod/settings.php:1082
msgid "Automatically approves all contact requests."
msgstr ""
#: mod/settings.php:1085
msgid "Automatic Friend Page"
msgstr ""
#: mod/settings.php:1086
msgid ""
"Account for a popular profile that automatically approves contact requests "
"as \"Friends\"."
msgstr ""
#: mod/settings.php:1089
msgid "Private Forum [Experimental]"
msgstr ""
#: mod/settings.php:1090
msgid "Requires manual approval of contact requests."
msgstr ""
#: mod/settings.php:1101
msgid "OpenID:"
msgstr ""
#: mod/settings.php:1101
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
#: mod/settings.php:1109
msgid "Publish your default profile in your local site directory?"
msgstr ""
#: mod/settings.php:1109
#, php-format
msgid ""
"Your profile will be published in the global friendica directories (e.g. <a "
"href=\"%s\">%s</a>). Your profile will be visible in public."
msgstr ""
#: mod/settings.php:1115
msgid "Publish your default profile in the global social directory?"
msgstr ""
#: mod/settings.php:1115
#, php-format
msgid ""
"Your profile will be publishedin this node's <a href=\"%s\">local directory</"
"a>. Your profile details may be publicly visible depending on the system "
"settings."
msgstr ""
#: mod/settings.php:1122
msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
#: mod/settings.php:1122
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:1126
msgid "Hide your profile details from anonymous viewers?"
msgstr ""
#: mod/settings.php:1126
msgid ""
"Anonymous visitors will only see your profile picture, your display name and "
"the nickname you are using on your profile page. Disables posting public "
"messages to Diaspora and other networks."
msgstr ""
#: mod/settings.php:1130
msgid "Allow friends to post to your profile page?"
msgstr ""
#: mod/settings.php:1130
msgid ""
"Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts"
msgstr ""
#: mod/settings.php:1134
msgid "Allow friends to tag your posts?"
msgstr ""
#: mod/settings.php:1134
msgid "Your contacts can add additional tags to your posts."
msgstr ""
#: mod/settings.php:1138
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
#: mod/settings.php:1138
msgid "If you like, Friendica may suggest new members to add you as a contact."
msgstr ""
#: mod/settings.php:1142
msgid "Permit unknown people to send you private mail?"
msgstr ""
#: mod/settings.php:1142
msgid ""
"Friendica network users may send you private messages even if they are not "
"in your contact list."
msgstr ""
#: mod/settings.php:1146
msgid "Profile is <strong>not published</strong>."
msgstr ""
#: mod/settings.php:1152
#, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr ""
#: mod/settings.php:1159
msgid "Automatically expire posts after this many days:"
msgstr ""
#: mod/settings.php:1159
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
#: mod/settings.php:1160
msgid "Advanced expiration settings"
msgstr ""
#: mod/settings.php:1161
msgid "Advanced Expiration"
msgstr ""
#: mod/settings.php:1162
msgid "Expire posts:"
msgstr ""
#: mod/settings.php:1163
msgid "Expire personal notes:"
msgstr ""
#: mod/settings.php:1164
msgid "Expire starred posts:"
msgstr ""
#: mod/settings.php:1165
msgid "Expire photos:"
msgstr ""
#: mod/settings.php:1166
msgid "Only expire posts by others:"
msgstr ""
#: mod/settings.php:1196
msgid "Account Settings"
msgstr ""
#: mod/settings.php:1204
msgid "Password Settings"
msgstr ""
#: mod/settings.php:1205 mod/register.php:273
msgid "New Password:"
msgstr ""
#: mod/settings.php:1206 mod/register.php:274
msgid "Confirm:"
msgstr ""
#: mod/settings.php:1206
msgid "Leave password fields blank unless changing"
msgstr ""
#: mod/settings.php:1207
msgid "Current Password:"
msgstr ""
#: mod/settings.php:1207 mod/settings.php:1208
msgid "Your current password to confirm the changes"
msgstr ""
#: mod/settings.php:1208
msgid "Password:"
msgstr ""
#: mod/settings.php:1212
msgid "Basic Settings"
msgstr ""
#: mod/settings.php:1213 src/Model/Profile.php:738
msgid "Full Name:"
msgstr ""
#: mod/settings.php:1214
msgid "Email Address:"
msgstr ""
#: mod/settings.php:1215
msgid "Your Timezone:"
msgstr ""
#: mod/settings.php:1216
msgid "Your Language:"
msgstr ""
#: mod/settings.php:1216
msgid ""
"Set the language we use to show you friendica interface and to send you "
"emails"
msgstr ""
#: mod/settings.php:1217
msgid "Default Post Location:"
msgstr ""
#: mod/settings.php:1218
msgid "Use Browser Location:"
msgstr ""
#: mod/settings.php:1221
msgid "Security and Privacy Settings"
msgstr ""
#: mod/settings.php:1223
msgid "Maximum Friend Requests/Day:"
msgstr ""
#: mod/settings.php:1223 mod/settings.php:1252
msgid "(to prevent spam abuse)"
msgstr ""
#: mod/settings.php:1224
msgid "Default Post Permissions"
msgstr ""
#: mod/settings.php:1225
msgid "(click to open/close)"
msgstr ""
#: mod/settings.php:1235
msgid "Default Private Post"
msgstr ""
#: mod/settings.php:1236
msgid "Default Public Post"
msgstr ""
#: mod/settings.php:1240
msgid "Default Permissions for New Posts"
msgstr ""
#: mod/settings.php:1252
msgid "Maximum private messages per day from unknown people:"
msgstr ""
#: mod/settings.php:1255
msgid "Notification Settings"
msgstr ""
#: mod/settings.php:1256
msgid "By default post a status message when:"
msgstr ""
#: mod/settings.php:1257
msgid "accepting a friend request"
msgstr ""
#: mod/settings.php:1258
msgid "joining a forum/community"
msgstr ""
#: mod/settings.php:1259
msgid "making an <em>interesting</em> profile change"
msgstr ""
#: mod/settings.php:1260
msgid "Send a notification email when:"
msgstr ""
#: mod/settings.php:1261
msgid "You receive an introduction"
msgstr ""
#: mod/settings.php:1262
msgid "Your introductions are confirmed"
msgstr ""
#: mod/settings.php:1263
msgid "Someone writes on your profile wall"
msgstr ""
#: mod/settings.php:1264
msgid "Someone writes a followup comment"
msgstr ""
#: mod/settings.php:1265
msgid "You receive a private message"
msgstr ""
#: mod/settings.php:1266
msgid "You receive a friend suggestion"
msgstr ""
#: mod/settings.php:1267
msgid "You are tagged in a post"
msgstr ""
#: mod/settings.php:1268
msgid "You are poked/prodded/etc. in a post"
msgstr ""
#: mod/settings.php:1270
msgid "Activate desktop notifications"
msgstr ""
#: mod/settings.php:1270
msgid "Show desktop popup on new notifications"
msgstr ""
#: mod/settings.php:1272
msgid "Text-only notification emails"
msgstr ""
#: mod/settings.php:1274
msgid "Send text only notification emails, without the html part"
msgstr ""
#: mod/settings.php:1276
msgid "Show detailled notifications"
msgstr ""
#: mod/settings.php:1278
msgid ""
"Per default the notificiation are condensed to a single notification per "
"item. When enabled, every notification is displayed."
msgstr ""
#: mod/settings.php:1280
msgid "Advanced Account/Page Type Settings"
msgstr ""
#: mod/settings.php:1281
msgid "Change the behaviour of this account for special situations"
msgstr ""
#: mod/settings.php:1284
msgid "Relocate"
msgstr ""
#: mod/settings.php:1285
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:1286
msgid "Resend relocate message to contacts"
msgstr ""
#: mod/subthread.php:113
#, php-format
msgid "%1$s is following %2$s's %3$s"
@ -5599,24 +4165,8 @@ msgid ""
"of your account (photos are not exported)"
msgstr ""
#: mod/videos.php:140
msgid "Do you really want to delete this video?"
msgstr ""
#: mod/videos.php:145
msgid "Delete Video"
msgstr ""
#: mod/videos.php:208
msgid "No videos selected"
msgstr ""
#: mod/videos.php:397
msgid "Recent Videos"
msgstr ""
#: mod/videos.php:399
msgid "Upload New Videos"
#: mod/uexport.php:52 mod/settings.php:106
msgid "Export personal data"
msgstr ""
#: mod/viewcontacts.php:87
@ -5637,14 +4187,34 @@ msgstr ""
msgid "Number of daily wall messages for %s exceeded. Message failed."
msgstr ""
#: mod/wallmessage.php:57 mod/message.php:73
msgid "No recipient selected."
msgstr ""
#: mod/wallmessage.php:60
msgid "Unable to check your home location."
msgstr ""
#: mod/wallmessage.php:63 mod/message.php:80
msgid "Message could not be sent."
msgstr ""
#: mod/wallmessage.php:66 mod/message.php:83
msgid "Message collection failure."
msgstr ""
#: mod/wallmessage.php:69 mod/message.php:86
msgid "Message sent."
msgstr ""
#: mod/wallmessage.php:86 mod/wallmessage.php:95
msgid "No recipient."
msgstr ""
#: mod/wallmessage.php:132 mod/message.php:250
msgid "Send Private Message"
msgstr ""
#: mod/wallmessage.php:133
#, php-format
msgid ""
@ -5652,6 +4222,149 @@ msgid ""
"your site allow private mail from unknown senders."
msgstr ""
#: mod/wallmessage.php:134 mod/message.php:251 mod/message.php:421
msgid "To:"
msgstr ""
#: mod/wallmessage.php:135 mod/message.php:255 mod/message.php:423
msgid "Subject:"
msgstr ""
#: mod/item.php:114
msgid "Unable to locate original post."
msgstr ""
#: mod/item.php:274
msgid "Empty post discarded."
msgstr ""
#: mod/item.php:799
#, php-format
msgid ""
"This message was sent to you by %s, a member of the Friendica social network."
msgstr ""
#: mod/item.php:801
#, php-format
msgid "You may visit them online at %s"
msgstr ""
#: mod/item.php:802
msgid ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
msgstr ""
#: mod/item.php:806
#, php-format
msgid "%s posted an update."
msgstr ""
#: mod/register.php:99
msgid ""
"Registration successful. Please check your email for further instructions."
msgstr ""
#: mod/register.php:103
#, php-format
msgid ""
"Failed to send email message. Here your accout details:<br> login: %s<br> "
"password: %s<br><br>You can change your password after login."
msgstr ""
#: mod/register.php:110
msgid "Registration successful."
msgstr ""
#: mod/register.php:115
msgid "Your registration can not be processed."
msgstr ""
#: mod/register.php:162
msgid "Your registration is pending approval by the site owner."
msgstr ""
#: mod/register.php:220
msgid ""
"You may (optionally) fill in this form via OpenID by supplying your OpenID "
"and clicking 'Register'."
msgstr ""
#: mod/register.php:221
msgid ""
"If you are not familiar with OpenID, please leave that field blank and fill "
"in the rest of the items."
msgstr ""
#: mod/register.php:222
msgid "Your OpenID (optional): "
msgstr ""
#: mod/register.php:234
msgid "Include your profile in member directory?"
msgstr ""
#: mod/register.php:259
msgid "Note for the admin"
msgstr ""
#: mod/register.php:259
msgid "Leave a message for the admin, why you want to join this node"
msgstr ""
#: mod/register.php:260
msgid "Membership on this site is by invitation only."
msgstr ""
#: mod/register.php:261
msgid "Your invitation code: "
msgstr ""
#: mod/register.php:264 mod/admin.php:1266
msgid "Registration"
msgstr ""
#: mod/register.php:270
msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
msgstr ""
#: mod/register.php:271
msgid ""
"Your Email Address: (Initial information will be send there, so this has to "
"be an existing address.)"
msgstr ""
#: mod/register.php:273 mod/settings.php:1205
msgid "New Password:"
msgstr ""
#: mod/register.php:273
msgid "Leave empty for an auto generated password."
msgstr ""
#: mod/register.php:274 mod/settings.php:1206
msgid "Confirm:"
msgstr ""
#: mod/register.php:275
#, php-format
msgid ""
"Choose a profile nickname. This must begin with a text character. Your "
"profile address on this site will then be '<strong>nickname@%s</strong>'."
msgstr ""
#: mod/register.php:276
msgid "Choose a nickname: "
msgstr ""
#: mod/register.php:279 src/Content/Nav.php:128 src/Module/Login.php:283
msgid "Register"
msgstr ""
#: mod/register.php:286
msgid "Import your profile to this friendica instance"
msgstr ""
#: mod/admin.php:106
msgid "Theme settings updated."
msgstr ""
@ -5680,10 +4393,18 @@ msgstr ""
msgid "Users"
msgstr ""
#: mod/admin.php:182 mod/admin.php:1812 mod/admin.php:1872 mod/settings.php:85
msgid "Addons"
msgstr ""
#: mod/admin.php:183 mod/admin.php:2081 mod/admin.php:2125
msgid "Themes"
msgstr ""
#: mod/admin.php:184 mod/settings.php:63
msgid "Additional features"
msgstr ""
#: mod/admin.php:185
msgid "Database"
msgstr ""
@ -6072,6 +4793,10 @@ msgstr ""
msgid "Site settings updated."
msgstr ""
#: mod/admin.php:1154 mod/settings.php:907
msgid "No special theme for mobile devices"
msgstr ""
#: mod/admin.php:1183
msgid "No community page"
msgstr ""
@ -6156,10 +4881,6 @@ msgstr ""
msgid "Republish users to directory"
msgstr ""
#: mod/admin.php:1266 mod/register.php:264
msgid "Registration"
msgstr ""
#: mod/admin.php:1267
msgid "File upload"
msgstr ""
@ -7011,6 +5732,10 @@ msgstr ""
msgid "Last item"
msgstr ""
#: mod/admin.php:1689 mod/settings.php:54
msgid "Account"
msgstr ""
#: mod/admin.php:1697
msgid "Add User"
msgstr ""
@ -7211,6 +5936,14 @@ msgid ""
"%1$s is readable."
msgstr ""
#: mod/admin.php:2336 mod/admin.php:2337 mod/settings.php:779
msgid "Off"
msgstr ""
#: mod/admin.php:2336 mod/admin.php:2337 mod/settings.php:779
msgid "On"
msgstr ""
#: mod/admin.php:2337
#, php-format
msgid "Lock feature %s"
@ -7220,36 +5953,337 @@ msgstr ""
msgid "Manage Additional Features"
msgstr ""
#: mod/item.php:114
msgid "Unable to locate original post."
#: mod/babel.php:23
msgid "Source (bbcode) text:"
msgstr ""
#: mod/item.php:274
msgid "Empty post discarded."
#: mod/babel.php:30
msgid "Source (Diaspora) text to convert to BBcode:"
msgstr ""
#: mod/item.php:799
#, php-format
#: mod/babel.php:38
msgid "Source input: "
msgstr ""
#: mod/babel.php:42
msgid "bbcode (raw HTML(: "
msgstr ""
#: mod/babel.php:45
msgid "bbcode: "
msgstr ""
#: mod/babel.php:49 mod/babel.php:65
msgid "bbcode => html2bbcode: "
msgstr ""
#: mod/babel.php:53
msgid "bb2diaspora: "
msgstr ""
#: mod/babel.php:57
msgid "bb2diaspora => Markdown: "
msgstr ""
#: mod/babel.php:61
msgid "bb2diaspora => diaspora2bb: "
msgstr ""
#: mod/babel.php:71
msgid "Source input (Diaspora format): "
msgstr ""
#: mod/babel.php:75
msgid "diaspora2bb: "
msgstr ""
#: mod/bookmarklet.php:21 src/Content/Nav.php:114 src/Module/Login.php:312
msgid "Login"
msgstr ""
#: mod/bookmarklet.php:49
msgid "The post was created"
msgstr ""
#: mod/community.php:44
msgid "Community option not available."
msgstr ""
#: mod/community.php:61
msgid "Not available."
msgstr ""
#: mod/community.php:74
msgid "Local Community"
msgstr ""
#: mod/community.php:77
msgid "Posts from local users on this server"
msgstr ""
#: mod/community.php:85
msgid "Global Community"
msgstr ""
#: mod/community.php:88
msgid "Posts from users of the whole federated network"
msgstr ""
#: mod/community.php:178
msgid ""
"This message was sent to you by %s, a member of the Friendica social network."
"This community stream shows all public posts received by this node. They may "
"not reflect the opinions of this nodes users."
msgstr ""
#: mod/item.php:801
#: mod/directory.php:153 src/Model/Profile.php:421 src/Model/Profile.php:769
msgid "Status:"
msgstr ""
#: mod/directory.php:154 src/Model/Profile.php:422 src/Model/Profile.php:786
msgid "Homepage:"
msgstr ""
#: mod/directory.php:203 view/theme/vier/theme.php:201
msgid "Global Directory"
msgstr ""
#: mod/directory.php:205
msgid "Find on this site"
msgstr ""
#: mod/directory.php:207
msgid "Results for:"
msgstr ""
#: mod/directory.php:209
msgid "Site Directory"
msgstr ""
#: mod/directory.php:214
msgid "No entries (some entries may be hidden)."
msgstr ""
#: mod/editpost.php:27 mod/editpost.php:37
msgid "Item not found"
msgstr ""
#: mod/editpost.php:44
msgid "Edit post"
msgstr ""
#: mod/events.php:103 mod/events.php:105
msgid "Event can not end before it has started."
msgstr ""
#: mod/events.php:112 mod/events.php:114
msgid "Event title and start time are required."
msgstr ""
#: mod/events.php:394
msgid "Create New Event"
msgstr ""
#: mod/events.php:509
msgid "Event details"
msgstr ""
#: mod/events.php:510
msgid "Starting date and Title are required."
msgstr ""
#: mod/events.php:511 mod/events.php:512
msgid "Event Starts:"
msgstr ""
#: mod/events.php:513 mod/events.php:529
msgid "Finish date/time is not known or not relevant"
msgstr ""
#: mod/events.php:515 mod/events.php:516
msgid "Event Finishes:"
msgstr ""
#: mod/events.php:517 mod/events.php:530
msgid "Adjust for viewer timezone"
msgstr ""
#: mod/events.php:519
msgid "Description:"
msgstr ""
#: mod/events.php:523 mod/events.php:525
msgid "Title:"
msgstr ""
#: mod/events.php:526 mod/events.php:527
msgid "Share this event"
msgstr ""
#: mod/events.php:534 src/Model/Profile.php:864
msgid "Basic"
msgstr ""
#: mod/events.php:556
msgid "Failed to remove event"
msgstr ""
#: mod/events.php:558
msgid "Event removed"
msgstr ""
#: mod/fsuggest.php:71
msgid "Friend suggestion sent."
msgstr ""
#: mod/fsuggest.php:102
msgid "Suggest Friends"
msgstr ""
#: mod/fsuggest.php:104
#, php-format
msgid "You may visit them online at %s"
msgid "Suggest a friend for %s"
msgstr ""
#: mod/item.php:802
#: mod/group.php:36
msgid "Group created."
msgstr ""
#: mod/group.php:42
msgid "Could not create group."
msgstr ""
#: mod/group.php:56 mod/group.php:158
msgid "Group not found."
msgstr ""
#: mod/group.php:70
msgid "Group name changed."
msgstr ""
#: mod/group.php:97
msgid "Save Group"
msgstr ""
#: mod/group.php:102
msgid "Create a group of contacts/friends."
msgstr ""
#: mod/group.php:103 mod/group.php:200 src/Model/Group.php:409
msgid "Group Name: "
msgstr ""
#: mod/group.php:127
msgid "Group removed."
msgstr ""
#: mod/group.php:129
msgid "Unable to remove group."
msgstr ""
#: mod/group.php:193
msgid "Delete Group"
msgstr ""
#: mod/group.php:199
msgid "Group Editor"
msgstr ""
#: mod/group.php:204
msgid "Edit Group Name"
msgstr ""
#: mod/group.php:214
msgid "Members"
msgstr ""
#: mod/group.php:217 mod/network.php:639
msgid "Group is empty"
msgstr ""
#: mod/group.php:230
msgid "Remove Contact"
msgstr ""
#: mod/group.php:254
msgid "Add Contact"
msgstr ""
#: mod/message.php:30 src/Content/Nav.php:198
msgid "New Message"
msgstr ""
#: mod/message.php:77
msgid "Unable to locate contact information."
msgstr ""
#: mod/message.php:112 view/theme/frio/theme.php:268 src/Content/Nav.php:195
msgid "Messages"
msgstr ""
#: mod/message.php:136
msgid "Do you really want to delete this message?"
msgstr ""
#: mod/message.php:156
msgid "Message deleted."
msgstr ""
#: mod/message.php:185
msgid "Conversation removed."
msgstr ""
#: mod/message.php:291
msgid "No messages."
msgstr ""
#: mod/message.php:330
msgid "Message not available."
msgstr ""
#: mod/message.php:397
msgid "Delete message"
msgstr ""
#: mod/message.php:399 mod/message.php:500
msgid "D, d M Y - g:i A"
msgstr ""
#: mod/message.php:414 mod/message.php:497
msgid "Delete conversation"
msgstr ""
#: mod/message.php:416
msgid ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
"No secure communications available. You <strong>may</strong> be able to "
"respond from the sender's profile page."
msgstr ""
#: mod/item.php:806
#, php-format
msgid "%s posted an update."
#: mod/message.php:420
msgid "Send Reply"
msgstr ""
#: mod/message.php:471
#, php-format
msgid "Unknown sender - %s"
msgstr ""
#: mod/message.php:473
#, php-format
msgid "You and %s"
msgstr ""
#: mod/message.php:475
#, php-format
msgid "%s and You"
msgstr ""
#: mod/message.php:503
#, php-format
msgid "%d message"
msgid_plural "%d messages"
msgstr[0] ""
msgstr[1] ""
#: mod/network.php:202 src/Model/Group.php:401
msgid "add"
msgstr ""
@ -7330,6 +6364,215 @@ msgstr ""
msgid "Favourite Posts"
msgstr ""
#: mod/notes.php:53 src/Model/Profile.php:946
msgid "Personal Notes"
msgstr ""
#: mod/photos.php:108 src/Model/Profile.php:907
msgid "Photo Albums"
msgstr ""
#: mod/photos.php:109 mod/photos.php:1713
msgid "Recent Photos"
msgstr ""
#: mod/photos.php:112 mod/photos.php:1210 mod/photos.php:1715
msgid "Upload New Photos"
msgstr ""
#: mod/photos.php:126 mod/settings.php:49
msgid "everybody"
msgstr ""
#: mod/photos.php:184
msgid "Contact information unavailable"
msgstr ""
#: mod/photos.php:204
msgid "Album not found."
msgstr ""
#: mod/photos.php:234 mod/photos.php:245 mod/photos.php:1161
msgid "Delete Album"
msgstr ""
#: mod/photos.php:243
msgid "Do you really want to delete this photo album and all its photos?"
msgstr ""
#: mod/photos.php:310 mod/photos.php:321 mod/photos.php:1446
msgid "Delete Photo"
msgstr ""
#: mod/photos.php:319
msgid "Do you really want to delete this photo?"
msgstr ""
#: mod/photos.php:667
msgid "a photo"
msgstr ""
#: mod/photos.php:667
#, php-format
msgid "%1$s was tagged in %2$s by %3$s"
msgstr ""
#: mod/photos.php:769
msgid "Image upload didn't complete, please try again"
msgstr ""
#: mod/photos.php:772
msgid "Image file is missing"
msgstr ""
#: mod/photos.php:777
msgid ""
"Server can't accept new file upload at this time, please contact your "
"administrator"
msgstr ""
#: mod/photos.php:803
msgid "Image file is empty."
msgstr ""
#: mod/photos.php:940
msgid "No photos selected"
msgstr ""
#: mod/photos.php:1036 mod/videos.php:310
msgid "Access to this item is restricted."
msgstr ""
#: mod/photos.php:1090
msgid "Upload Photos"
msgstr ""
#: mod/photos.php:1094 mod/photos.php:1156
msgid "New album name: "
msgstr ""
#: mod/photos.php:1095
msgid "or existing album name: "
msgstr ""
#: mod/photos.php:1096
msgid "Do not show a status post for this upload"
msgstr ""
#: mod/photos.php:1106 mod/photos.php:1449 mod/settings.php:1233
msgid "Show to Groups"
msgstr ""
#: mod/photos.php:1107 mod/photos.php:1450 mod/settings.php:1234
msgid "Show to Contacts"
msgstr ""
#: mod/photos.php:1167
msgid "Edit Album"
msgstr ""
#: mod/photos.php:1172
msgid "Show Newest First"
msgstr ""
#: mod/photos.php:1174
msgid "Show Oldest First"
msgstr ""
#: mod/photos.php:1195 mod/photos.php:1698
msgid "View Photo"
msgstr ""
#: mod/photos.php:1236
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
#: mod/photos.php:1238
msgid "Photo not available"
msgstr ""
#: mod/photos.php:1301
msgid "View photo"
msgstr ""
#: mod/photos.php:1301
msgid "Edit photo"
msgstr ""
#: mod/photos.php:1302
msgid "Use as profile photo"
msgstr ""
#: mod/photos.php:1308 src/Object/Post.php:148
msgid "Private Message"
msgstr ""
#: mod/photos.php:1327
msgid "View Full Size"
msgstr ""
#: mod/photos.php:1414
msgid "Tags: "
msgstr ""
#: mod/photos.php:1417
msgid "[Remove any tag]"
msgstr ""
#: mod/photos.php:1432
msgid "New album name"
msgstr ""
#: mod/photos.php:1433
msgid "Caption"
msgstr ""
#: mod/photos.php:1434
msgid "Add a Tag"
msgstr ""
#: mod/photos.php:1434
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
#: mod/photos.php:1435
msgid "Do not rotate"
msgstr ""
#: mod/photos.php:1436
msgid "Rotate CW (right)"
msgstr ""
#: mod/photos.php:1437
msgid "Rotate CCW (left)"
msgstr ""
#: mod/photos.php:1471 src/Object/Post.php:295
msgid "I like this (toggle)"
msgstr ""
#: mod/photos.php:1472 src/Object/Post.php:296
msgid "I don't like this (toggle)"
msgstr ""
#: mod/photos.php:1488 mod/photos.php:1527 mod/photos.php:1600
#: src/Object/Post.php:785
msgid "This is you"
msgstr ""
#: mod/photos.php:1490 mod/photos.php:1529 mod/photos.php:1602
#: src/Object/Post.php:391 src/Object/Post.php:787
msgid "Comment"
msgstr ""
#: mod/photos.php:1634
msgid "Map"
msgstr ""
#: mod/photos.php:1704 mod/videos.php:388
msgid "View Album"
msgstr ""
#: mod/profile.php:36 src/Model/Profile.php:118
msgid "Requested profile is not available."
msgstr ""
@ -7353,97 +6596,854 @@ msgstr ""
msgid "Tips for New Members"
msgstr ""
#: mod/register.php:99
msgid ""
"Registration successful. Please check your email for further instructions."
#: mod/settings.php:71
msgid "Display"
msgstr ""
#: mod/register.php:103
#: mod/settings.php:78 mod/settings.php:845
msgid "Social Networks"
msgstr ""
#: mod/settings.php:92 src/Content/Nav.php:204
msgid "Delegations"
msgstr ""
#: mod/settings.php:99
msgid "Connected apps"
msgstr ""
#: mod/settings.php:113
msgid "Remove account"
msgstr ""
#: mod/settings.php:167
msgid "Missing some important data!"
msgstr ""
#: mod/settings.php:278
msgid "Failed to connect with email account using the settings provided."
msgstr ""
#: mod/settings.php:283
msgid "Email settings updated."
msgstr ""
#: mod/settings.php:299
msgid "Features updated"
msgstr ""
#: mod/settings.php:371
msgid "Relocate message has been send to your contacts"
msgstr ""
#: mod/settings.php:383 src/Model/User.php:312
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: mod/settings.php:388
msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
#: mod/settings.php:394
msgid "Wrong password."
msgstr ""
#: mod/settings.php:401
msgid "Password changed."
msgstr ""
#: mod/settings.php:403
msgid "Password update failed. Please try again."
msgstr ""
#: mod/settings.php:493
msgid " Please use a shorter name."
msgstr ""
#: mod/settings.php:496
msgid " Name too short."
msgstr ""
#: mod/settings.php:504
msgid "Wrong Password"
msgstr ""
#: mod/settings.php:509
msgid "Invalid email."
msgstr ""
#: mod/settings.php:516
msgid "Cannot change to that email."
msgstr ""
#: mod/settings.php:569
msgid "Private forum has no privacy permissions. Using default privacy group."
msgstr ""
#: mod/settings.php:572
msgid "Private forum has no privacy permissions and no default privacy group."
msgstr ""
#: mod/settings.php:612
msgid "Settings updated."
msgstr ""
#: mod/settings.php:678 mod/settings.php:704 mod/settings.php:740
msgid "Add application"
msgstr ""
#: mod/settings.php:682 mod/settings.php:708
msgid "Consumer Key"
msgstr ""
#: mod/settings.php:683 mod/settings.php:709
msgid "Consumer Secret"
msgstr ""
#: mod/settings.php:684 mod/settings.php:710
msgid "Redirect"
msgstr ""
#: mod/settings.php:685 mod/settings.php:711
msgid "Icon url"
msgstr ""
#: mod/settings.php:696
msgid "You can't edit this application."
msgstr ""
#: mod/settings.php:739
msgid "Connected Apps"
msgstr ""
#: mod/settings.php:741 src/Object/Post.php:154 src/Object/Post.php:156
msgid "Edit"
msgstr ""
#: mod/settings.php:743
msgid "Client key starts with"
msgstr ""
#: mod/settings.php:744
msgid "No name"
msgstr ""
#: mod/settings.php:745
msgid "Remove authorization"
msgstr ""
#: mod/settings.php:756
msgid "No Addon settings configured"
msgstr ""
#: mod/settings.php:765
msgid "Addon Settings"
msgstr ""
#: mod/settings.php:786
msgid "Additional Features"
msgstr ""
#: mod/settings.php:808 src/Content/ContactSelector.php:83
msgid "Diaspora"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
msgid "enabled"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
msgid "disabled"
msgstr ""
#: mod/settings.php:808 mod/settings.php:809
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr ""
#: mod/settings.php:809
msgid "GNU Social (OStatus)"
msgstr ""
#: mod/settings.php:840
msgid "Email access is disabled on this site."
msgstr ""
#: mod/settings.php:850
msgid "General Social Media Settings"
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 "Automatically follow any GNU Social (OStatus) followers/mentioners"
msgstr ""
#: mod/settings.php:852
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:853
msgid "Default group for OStatus contacts"
msgstr ""
#: mod/settings.php:854
msgid "Your legacy GNU Social account"
msgstr ""
#: mod/settings.php:854
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:857
msgid "Repair OStatus subscriptions"
msgstr ""
#: mod/settings.php:861
msgid "Email/Mailbox Setup"
msgstr ""
#: mod/settings.php:862
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:863
msgid "Last successful email check:"
msgstr ""
#: mod/settings.php:865
msgid "IMAP server name:"
msgstr ""
#: mod/settings.php:866
msgid "IMAP port:"
msgstr ""
#: mod/settings.php:867
msgid "Security:"
msgstr ""
#: mod/settings.php:867 mod/settings.php:872
msgid "None"
msgstr ""
#: mod/settings.php:868
msgid "Email login name:"
msgstr ""
#: mod/settings.php:869
msgid "Email password:"
msgstr ""
#: mod/settings.php:870
msgid "Reply-to address:"
msgstr ""
#: mod/settings.php:871
msgid "Send public posts to all email contacts:"
msgstr ""
#: mod/settings.php:872
msgid "Action after import:"
msgstr ""
#: mod/settings.php:872 src/Content/Nav.php:191
msgid "Mark as seen"
msgstr ""
#: mod/settings.php:872
msgid "Move to folder"
msgstr ""
#: mod/settings.php:873
msgid "Move to folder:"
msgstr ""
#: mod/settings.php:916
#, php-format
msgid "%s - (Unsupported)"
msgstr ""
#: mod/settings.php:918
#, php-format
msgid "%s - (Experimental)"
msgstr ""
#: mod/settings.php:961
msgid "Display Settings"
msgstr ""
#: mod/settings.php:967 mod/settings.php:991
msgid "Display Theme:"
msgstr ""
#: mod/settings.php:968
msgid "Mobile Theme:"
msgstr ""
#: mod/settings.php:969
msgid "Suppress warning of insecure networks"
msgstr ""
#: mod/settings.php:969
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:970
msgid "Update browser every xx seconds"
msgstr ""
#: mod/settings.php:970
msgid "Minimum of 10 seconds. Enter -1 to disable it."
msgstr ""
#: mod/settings.php:971
msgid "Number of items to display per page:"
msgstr ""
#: mod/settings.php:971 mod/settings.php:972
msgid "Maximum of 100 items"
msgstr ""
#: mod/settings.php:972
msgid "Number of items to display per page when viewed from mobile device:"
msgstr ""
#: mod/settings.php:973
msgid "Don't show emoticons"
msgstr ""
#: mod/settings.php:974
msgid "Calendar"
msgstr ""
#: mod/settings.php:975
msgid "Beginning of week:"
msgstr ""
#: mod/settings.php:976
msgid "Don't show notices"
msgstr ""
#: mod/settings.php:977
msgid "Infinite scroll"
msgstr ""
#: mod/settings.php:978
msgid "Automatic updates only at the top of the network page"
msgstr ""
#: mod/settings.php:978
msgid ""
"When disabled, the network page is updated all the time, which could be "
"confusing while reading."
msgstr ""
#: mod/settings.php:979
msgid "Bandwith Saver Mode"
msgstr ""
#: mod/settings.php:979
msgid ""
"When enabled, embedded content is not displayed on automatic updates, they "
"only show on page reload."
msgstr ""
#: mod/settings.php:980
msgid "Smart Threading"
msgstr ""
#: mod/settings.php:980
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:982
msgid "General Theme Settings"
msgstr ""
#: mod/settings.php:983
msgid "Custom Theme Settings"
msgstr ""
#: mod/settings.php:984
msgid "Content Settings"
msgstr ""
#: mod/settings.php:985 view/theme/duepuntozero/config.php:73
#: view/theme/frio/config.php:115 view/theme/quattro/config.php:75
#: view/theme/vier/config.php:121
msgid "Theme settings"
msgstr ""
#: mod/settings.php:1006
msgid "Unable to find your profile. Please contact your admin."
msgstr ""
#: mod/settings.php:1048
msgid "Account Types"
msgstr ""
#: mod/settings.php:1049
msgid "Personal Page Subtypes"
msgstr ""
#: mod/settings.php:1050
msgid "Community Forum Subtypes"
msgstr ""
#: mod/settings.php:1057
msgid "Personal Page"
msgstr ""
#: mod/settings.php:1058
msgid "Account for a personal profile."
msgstr ""
#: mod/settings.php:1061
msgid "Organisation Page"
msgstr ""
#: mod/settings.php:1062
msgid ""
"Account for an organisation that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1065
msgid "News Page"
msgstr ""
#: mod/settings.php:1066
msgid ""
"Account for a news reflector that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1069
msgid "Community Forum"
msgstr ""
#: mod/settings.php:1070
msgid "Account for community discussions."
msgstr ""
#: mod/settings.php:1073
msgid "Normal Account Page"
msgstr ""
#: mod/settings.php:1074
msgid ""
"Account for a regular personal profile that requires manual approval of "
"\"Friends\" and \"Followers\"."
msgstr ""
#: mod/settings.php:1077
msgid "Soapbox Page"
msgstr ""
#: mod/settings.php:1078
msgid ""
"Account for a public profile that automatically approves contact requests as "
"\"Followers\"."
msgstr ""
#: mod/settings.php:1081
msgid "Public Forum"
msgstr ""
#: mod/settings.php:1082
msgid "Automatically approves all contact requests."
msgstr ""
#: mod/settings.php:1085
msgid "Automatic Friend Page"
msgstr ""
#: mod/settings.php:1086
msgid ""
"Account for a popular profile that automatically approves contact requests "
"as \"Friends\"."
msgstr ""
#: mod/settings.php:1089
msgid "Private Forum [Experimental]"
msgstr ""
#: mod/settings.php:1090
msgid "Requires manual approval of contact requests."
msgstr ""
#: mod/settings.php:1101
msgid "OpenID:"
msgstr ""
#: mod/settings.php:1101
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
#: mod/settings.php:1109
msgid "Publish your default profile in your local site directory?"
msgstr ""
#: mod/settings.php:1109
#, php-format
msgid ""
"Failed to send email message. Here your accout details:<br> login: %s<br> "
"password: %s<br><br>You can change your password after login."
"Your profile will be published in the global friendica directories (e.g. <a "
"href=\"%s\">%s</a>). Your profile will be visible in public."
msgstr ""
#: mod/register.php:110
msgid "Registration successful."
#: mod/settings.php:1115
msgid "Publish your default profile in the global social directory?"
msgstr ""
#: mod/register.php:115
msgid "Your registration can not be processed."
msgstr ""
#: mod/register.php:162
msgid "Your registration is pending approval by the site owner."
msgstr ""
#: mod/register.php:220
msgid ""
"You may (optionally) fill in this form via OpenID by supplying your OpenID "
"and clicking 'Register'."
msgstr ""
#: mod/register.php:221
msgid ""
"If you are not familiar with OpenID, please leave that field blank and fill "
"in the rest of the items."
msgstr ""
#: mod/register.php:222
msgid "Your OpenID (optional): "
msgstr ""
#: mod/register.php:234
msgid "Include your profile in member directory?"
msgstr ""
#: mod/register.php:259
msgid "Note for the admin"
msgstr ""
#: mod/register.php:259
msgid "Leave a message for the admin, why you want to join this node"
msgstr ""
#: mod/register.php:260
msgid "Membership on this site is by invitation only."
msgstr ""
#: mod/register.php:261
msgid "Your invitation code: "
msgstr ""
#: mod/register.php:270
msgid "Your Full Name (e.g. Joe Smith, real or real-looking): "
msgstr ""
#: mod/register.php:271
msgid ""
"Your Email Address: (Initial information will be send there, so this has to "
"be an existing address.)"
msgstr ""
#: mod/register.php:273
msgid "Leave empty for an auto generated password."
msgstr ""
#: mod/register.php:275
#: mod/settings.php:1115
#, php-format
msgid ""
"Choose a profile nickname. This must begin with a text character. Your "
"profile address on this site will then be '<strong>nickname@%s</strong>'."
"Your profile will be published in this node's <a href=\"%s\">local "
"directory</a>. Your profile details may be publicly visible depending on the "
"system settings."
msgstr ""
#: mod/register.php:276
msgid "Choose a nickname: "
#: mod/settings.php:1122
msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
#: mod/register.php:279 src/Content/Nav.php:128 src/Module/Login.php:283
msgid "Register"
#: mod/settings.php:1122
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/register.php:286
msgid "Import your profile to this friendica instance"
#: mod/settings.php:1126
msgid "Hide your profile details from anonymous viewers?"
msgstr ""
#: mod/settings.php:1126
msgid ""
"Anonymous visitors will only see your profile picture, your display name and "
"the nickname you are using on your profile page. Disables posting public "
"messages to Diaspora and other networks."
msgstr ""
#: mod/settings.php:1130
msgid "Allow friends to post to your profile page?"
msgstr ""
#: mod/settings.php:1130
msgid ""
"Your contacts may write posts on your profile wall. These posts will be "
"distributed to your contacts"
msgstr ""
#: mod/settings.php:1134
msgid "Allow friends to tag your posts?"
msgstr ""
#: mod/settings.php:1134
msgid "Your contacts can add additional tags to your posts."
msgstr ""
#: mod/settings.php:1138
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
#: mod/settings.php:1138
msgid "If you like, Friendica may suggest new members to add you as a contact."
msgstr ""
#: mod/settings.php:1142
msgid "Permit unknown people to send you private mail?"
msgstr ""
#: mod/settings.php:1142
msgid ""
"Friendica network users may send you private messages even if they are not "
"in your contact list."
msgstr ""
#: mod/settings.php:1146
msgid "Profile is <strong>not published</strong>."
msgstr ""
#: mod/settings.php:1152
#, php-format
msgid "Your Identity Address is <strong>'%s'</strong> or '%s'."
msgstr ""
#: mod/settings.php:1159
msgid "Automatically expire posts after this many days:"
msgstr ""
#: mod/settings.php:1159
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
#: mod/settings.php:1160
msgid "Advanced expiration settings"
msgstr ""
#: mod/settings.php:1161
msgid "Advanced Expiration"
msgstr ""
#: mod/settings.php:1162
msgid "Expire posts:"
msgstr ""
#: mod/settings.php:1163
msgid "Expire personal notes:"
msgstr ""
#: mod/settings.php:1164
msgid "Expire starred posts:"
msgstr ""
#: mod/settings.php:1165
msgid "Expire photos:"
msgstr ""
#: mod/settings.php:1166
msgid "Only expire posts by others:"
msgstr ""
#: mod/settings.php:1196
msgid "Account Settings"
msgstr ""
#: mod/settings.php:1204
msgid "Password Settings"
msgstr ""
#: mod/settings.php:1206
msgid "Leave password fields blank unless changing"
msgstr ""
#: mod/settings.php:1207
msgid "Current Password:"
msgstr ""
#: mod/settings.php:1207 mod/settings.php:1208
msgid "Your current password to confirm the changes"
msgstr ""
#: mod/settings.php:1208
msgid "Password:"
msgstr ""
#: mod/settings.php:1212
msgid "Basic Settings"
msgstr ""
#: mod/settings.php:1213 src/Model/Profile.php:738
msgid "Full Name:"
msgstr ""
#: mod/settings.php:1214
msgid "Email Address:"
msgstr ""
#: mod/settings.php:1215
msgid "Your Timezone:"
msgstr ""
#: mod/settings.php:1216
msgid "Your Language:"
msgstr ""
#: mod/settings.php:1216
msgid ""
"Set the language we use to show you friendica interface and to send you "
"emails"
msgstr ""
#: mod/settings.php:1217
msgid "Default Post Location:"
msgstr ""
#: mod/settings.php:1218
msgid "Use Browser Location:"
msgstr ""
#: mod/settings.php:1221
msgid "Security and Privacy Settings"
msgstr ""
#: mod/settings.php:1223
msgid "Maximum Friend Requests/Day:"
msgstr ""
#: mod/settings.php:1223 mod/settings.php:1252
msgid "(to prevent spam abuse)"
msgstr ""
#: mod/settings.php:1224
msgid "Default Post Permissions"
msgstr ""
#: mod/settings.php:1225
msgid "(click to open/close)"
msgstr ""
#: mod/settings.php:1235
msgid "Default Private Post"
msgstr ""
#: mod/settings.php:1236
msgid "Default Public Post"
msgstr ""
#: mod/settings.php:1240
msgid "Default Permissions for New Posts"
msgstr ""
#: mod/settings.php:1252
msgid "Maximum private messages per day from unknown people:"
msgstr ""
#: mod/settings.php:1255
msgid "Notification Settings"
msgstr ""
#: mod/settings.php:1256
msgid "By default post a status message when:"
msgstr ""
#: mod/settings.php:1257
msgid "accepting a friend request"
msgstr ""
#: mod/settings.php:1258
msgid "joining a forum/community"
msgstr ""
#: mod/settings.php:1259
msgid "making an <em>interesting</em> profile change"
msgstr ""
#: mod/settings.php:1260
msgid "Send a notification email when:"
msgstr ""
#: mod/settings.php:1261
msgid "You receive an introduction"
msgstr ""
#: mod/settings.php:1262
msgid "Your introductions are confirmed"
msgstr ""
#: mod/settings.php:1263
msgid "Someone writes on your profile wall"
msgstr ""
#: mod/settings.php:1264
msgid "Someone writes a followup comment"
msgstr ""
#: mod/settings.php:1265
msgid "You receive a private message"
msgstr ""
#: mod/settings.php:1266
msgid "You receive a friend suggestion"
msgstr ""
#: mod/settings.php:1267
msgid "You are tagged in a post"
msgstr ""
#: mod/settings.php:1268
msgid "You are poked/prodded/etc. in a post"
msgstr ""
#: mod/settings.php:1270
msgid "Activate desktop notifications"
msgstr ""
#: mod/settings.php:1270
msgid "Show desktop popup on new notifications"
msgstr ""
#: mod/settings.php:1272
msgid "Text-only notification emails"
msgstr ""
#: mod/settings.php:1274
msgid "Send text only notification emails, without the html part"
msgstr ""
#: mod/settings.php:1276
msgid "Show detailled notifications"
msgstr ""
#: mod/settings.php:1278
msgid ""
"Per default the notificiation are condensed to a single notification per "
"item. When enabled, every notification is displayed."
msgstr ""
#: mod/settings.php:1280
msgid "Advanced Account/Page Type Settings"
msgstr ""
#: mod/settings.php:1281
msgid "Change the behaviour of this account for special situations"
msgstr ""
#: mod/settings.php:1284
msgid "Relocate"
msgstr ""
#: mod/settings.php:1285
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:1286
msgid "Resend relocate message to contacts"
msgstr ""
#: mod/videos.php:140
msgid "Do you really want to delete this video?"
msgstr ""
#: mod/videos.php:145
msgid "Delete Video"
msgstr ""
#: mod/videos.php:208
msgid "No videos selected"
msgstr ""
#: mod/videos.php:397
msgid "Recent Videos"
msgstr ""
#: mod/videos.php:399
msgid "Upload New Videos"
msgstr ""
#: view/theme/duepuntozero/config.php:54 src/Model/User.php:475
@ -8647,6 +8647,226 @@ msgstr ""
msgid "%s: updating %s table."
msgstr ""
#: src/Model/Mail.php:40 src/Model/Mail.php:174
msgid "[no subject]"
msgstr ""
#: src/Model/Item.php:1666
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr ""
#: src/Model/Item.php:1671
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
#: src/Model/Item.php:1676
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr ""
#: src/Model/Profile.php:97
msgid "Requested account is not available."
msgstr ""
#: src/Model/Profile.php:168 src/Model/Profile.php:399
#: src/Model/Profile.php:859
msgid "Edit profile"
msgstr ""
#: src/Model/Profile.php:336
msgid "Atom feed"
msgstr ""
#: src/Model/Profile.php:372
msgid "Manage/edit profiles"
msgstr ""
#: src/Model/Profile.php:548 src/Model/Profile.php:641
msgid "g A l F d"
msgstr ""
#: src/Model/Profile.php:549
msgid "F d"
msgstr ""
#: src/Model/Profile.php:606 src/Model/Profile.php:703
msgid "[today]"
msgstr ""
#: src/Model/Profile.php:617
msgid "Birthday Reminders"
msgstr ""
#: src/Model/Profile.php:618
msgid "Birthdays this week:"
msgstr ""
#: src/Model/Profile.php:690
msgid "[No description]"
msgstr ""
#: src/Model/Profile.php:717
msgid "Event Reminders"
msgstr ""
#: src/Model/Profile.php:718
msgid "Events this week:"
msgstr ""
#: src/Model/Profile.php:741
msgid "Member since:"
msgstr ""
#: src/Model/Profile.php:749
msgid "j F, Y"
msgstr ""
#: src/Model/Profile.php:750
msgid "j F"
msgstr ""
#: src/Model/Profile.php:765
msgid "Age:"
msgstr ""
#: src/Model/Profile.php:778
#, php-format
msgid "for %1$d %2$s"
msgstr ""
#: src/Model/Profile.php:802
msgid "Religion:"
msgstr ""
#: src/Model/Profile.php:810
msgid "Hobbies/Interests:"
msgstr ""
#: src/Model/Profile.php:822
msgid "Contact information and Social Networks:"
msgstr ""
#: src/Model/Profile.php:826
msgid "Musical interests:"
msgstr ""
#: src/Model/Profile.php:830
msgid "Books, literature:"
msgstr ""
#: src/Model/Profile.php:834
msgid "Television:"
msgstr ""
#: src/Model/Profile.php:838
msgid "Film/dance/culture/entertainment:"
msgstr ""
#: src/Model/Profile.php:842
msgid "Love/Romance:"
msgstr ""
#: src/Model/Profile.php:846
msgid "Work/employment:"
msgstr ""
#: src/Model/Profile.php:850
msgid "School/education:"
msgstr ""
#: src/Model/Profile.php:855
msgid "Forums:"
msgstr ""
#: src/Model/Profile.php:949
msgid "Only You Can See This"
msgstr ""
#: src/Model/Contact.php:559
msgid "Drop Contact"
msgstr ""
#: src/Model/Contact.php:962
msgid "Organisation"
msgstr ""
#: src/Model/Contact.php:965
msgid "News"
msgstr ""
#: src/Model/Contact.php:968
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:1147
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:1156
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:1184
msgid ""
"This site is not configured to allow communications with other networks."
msgstr ""
#: src/Model/Contact.php:1185 src/Model/Contact.php:1199
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:1197
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:1202
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:1205
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:1208
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:1209
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:1215
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:1220
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:1290
msgid "Unable to retrieve contact information."
msgstr ""
#: src/Model/Contact.php:1502
#, php-format
msgid "%s's birthday"
msgstr ""
#: src/Model/Contact.php:1503 src/Protocol/DFRN.php:1398
#, php-format
msgid "Happy Birthday %s"
msgstr ""
#: src/Model/Group.php:44
msgid ""
"A deleted group with this name was revived. Existing item permissions "
@ -8682,10 +8902,6 @@ msgstr ""
msgid "Edit groups"
msgstr ""
#: src/Model/Mail.php:40 src/Model/Mail.php:174
msgid "[no subject]"
msgstr ""
#: src/Model/User.php:142
msgid "Login failed"
msgstr ""
@ -8833,230 +9049,6 @@ msgid ""
"\t\t\tThank you and welcome to %2$s."
msgstr ""
#: src/Model/Contact.php:559
msgid "Drop Contact"
msgstr ""
#: src/Model/Contact.php:962
msgid "Organisation"
msgstr ""
#: src/Model/Contact.php:965
msgid "News"
msgstr ""
#: src/Model/Contact.php:968
msgid "Forum"
msgstr ""
#: src/Model/Contact.php:1147
msgid "Connect URL missing."
msgstr ""
#: src/Model/Contact.php:1156
msgid ""
"The contact could not be added. Please check the relevant network "
"credentials in your Settings -> Social Networks page."
msgstr ""
#: src/Model/Contact.php:1184
msgid ""
"This site is not configured to allow communications with other networks."
msgstr ""
#: src/Model/Contact.php:1185 src/Model/Contact.php:1199
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: src/Model/Contact.php:1197
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: src/Model/Contact.php:1202
msgid "An author or name was not found."
msgstr ""
#: src/Model/Contact.php:1205
msgid "No browser URL could be matched to this address."
msgstr ""
#: src/Model/Contact.php:1208
msgid ""
"Unable to match @-style Identity Address with a known protocol or email "
"contact."
msgstr ""
#: src/Model/Contact.php:1209
msgid "Use mailto: in front of address to force email check."
msgstr ""
#: src/Model/Contact.php:1215
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: src/Model/Contact.php:1220
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: src/Model/Contact.php:1290
msgid "Unable to retrieve contact information."
msgstr ""
#: src/Model/Contact.php:1502
#, php-format
msgid "%s's birthday"
msgstr ""
#: src/Model/Contact.php:1503 src/Protocol/DFRN.php:1398
#, php-format
msgid "Happy Birthday %s"
msgstr ""
#: src/Model/Item.php:1666
#, php-format
msgid "%1$s is attending %2$s's %3$s"
msgstr ""
#: src/Model/Item.php:1671
#, php-format
msgid "%1$s is not attending %2$s's %3$s"
msgstr ""
#: src/Model/Item.php:1676
#, php-format
msgid "%1$s may attend %2$s's %3$s"
msgstr ""
#: src/Model/Profile.php:97
msgid "Requested account is not available."
msgstr ""
#: src/Model/Profile.php:168 src/Model/Profile.php:399
#: src/Model/Profile.php:859
msgid "Edit profile"
msgstr ""
#: src/Model/Profile.php:336
msgid "Atom feed"
msgstr ""
#: src/Model/Profile.php:372
msgid "Manage/edit profiles"
msgstr ""
#: src/Model/Profile.php:548 src/Model/Profile.php:641
msgid "g A l F d"
msgstr ""
#: src/Model/Profile.php:549
msgid "F d"
msgstr ""
#: src/Model/Profile.php:606 src/Model/Profile.php:703
msgid "[today]"
msgstr ""
#: src/Model/Profile.php:617
msgid "Birthday Reminders"
msgstr ""
#: src/Model/Profile.php:618
msgid "Birthdays this week:"
msgstr ""
#: src/Model/Profile.php:690
msgid "[No description]"
msgstr ""
#: src/Model/Profile.php:717
msgid "Event Reminders"
msgstr ""
#: src/Model/Profile.php:718
msgid "Events this week:"
msgstr ""
#: src/Model/Profile.php:741
msgid "Member since:"
msgstr ""
#: src/Model/Profile.php:749
msgid "j F, Y"
msgstr ""
#: src/Model/Profile.php:750
msgid "j F"
msgstr ""
#: src/Model/Profile.php:765
msgid "Age:"
msgstr ""
#: src/Model/Profile.php:778
#, php-format
msgid "for %1$d %2$s"
msgstr ""
#: src/Model/Profile.php:802
msgid "Religion:"
msgstr ""
#: src/Model/Profile.php:810
msgid "Hobbies/Interests:"
msgstr ""
#: src/Model/Profile.php:822
msgid "Contact information and Social Networks:"
msgstr ""
#: src/Model/Profile.php:826
msgid "Musical interests:"
msgstr ""
#: src/Model/Profile.php:830
msgid "Books, literature:"
msgstr ""
#: src/Model/Profile.php:834
msgid "Television:"
msgstr ""
#: src/Model/Profile.php:838
msgid "Film/dance/culture/entertainment:"
msgstr ""
#: src/Model/Profile.php:842
msgid "Love/Romance:"
msgstr ""
#: src/Model/Profile.php:846
msgid "Work/employment:"
msgstr ""
#: src/Model/Profile.php:850
msgid "School/education:"
msgstr ""
#: src/Model/Profile.php:855
msgid "Forums:"
msgstr ""
#: src/Model/Profile.php:949
msgid "Only You Can See This"
msgstr ""
#: src/Protocol/Diaspora.php:2584
msgid "Sharing notification from Diaspora network"
msgstr ""
#: src/Protocol/Diaspora.php:3660
msgid "Attachments:"
msgstr ""
#: src/Protocol/DFRN.php:1397
#, php-format
msgid "%s\\'s birthday"
@ -9080,6 +9072,14 @@ msgstr ""
msgid "stopped following"
msgstr ""