]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #169 from michal-s/master
authorFriendika <info@friendika.com>
Sat, 3 Sep 2011 05:20:47 +0000 (22:20 -0700)
committerFriendika <info@friendika.com>
Sat, 3 Sep 2011 05:20:47 +0000 (22:20 -0700)
minor changes of czech translations

55 files changed:
INSTALL.txt
addon/facebook/README
addon/facebook/facebook.php
addon/impressum/README
addon/statusnet/README
addon/statusnet/statusnet.php
addon/twitter/README
addon/widgets/widget_like.php
boot.php
database.sql
doc/Installing-Connectors.md
include/Contact.php
include/Photo.php
include/acl_selectors.php
include/api.php
include/auth.php
include/bb2diaspora.php [new file with mode: 0644]
include/bbcode.php
include/contact_selectors.php
include/conversation.php
include/crypto.php
include/delivery.php [new file with mode: 0644]
include/diaspora.php
include/group.php
include/items.php
include/network.php
include/notifier.php
include/poller.php
include/queue.php
include/salmon.php
mod/admin.php
mod/contacts.php
mod/follow.php
mod/item.php
mod/network.php
mod/openid.php
mod/photos.php
mod/pubsub.php
mod/receive.php
update.php
view/admin_site.tpl
view/api_timeline_atom.tpl
view/contact_edit.tpl
view/contact_template.tpl
view/de/strings.php
view/diaspora_photo.tpl [new file with mode: 0644]
view/fr/messages.po
view/fr/strings.php
view/it/messages.po
view/it/strings.php
view/theme/dispy/photo-menu.jpg [new file with mode: 0644]
view/theme/dispy/style.css
view/theme/duepuntozero/style.css
view/theme/loozah/style.css
zot.txt [new file with mode: 0644]

index dd4c747e2ae4be2068ae791a37153d8144808e37..053c339028c9f5bda2e55639003d8c6d449cd4ee 100644 (file)
@@ -15,20 +15,32 @@ hosting provider prior to installation.
 Before you begin: Choose a domain name or subdomain name for your server.
 Put some thought into this - because changing it is currently not-supported.
 Things will break, and some of your friends may have difficulty communicating
-with you. We plan to address this limitation in a future release. 
+with you. We plan to address this limitation in a future release. Also decide
+if you wish to connect with members of the Diaspora network, as this will 
+impact the installation requirements.
+
+Decide if you will use SSL and obtain an SSL cert. Communications with the
+Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is 
+recognised by the major browsers. Friendika will work with self-signed certs
+but Diaspora communication may not. For best results, install your cert PRIOR
+to installing Friendika and when visiting your site for the initial 
+installation in step 5, please use the https: link. (Use the http: or non-SSL 
+link if your cert is self-signed). 
  
 
 1. Requirements
        - Apache with mod-rewrite enabled and "Options All" so you can use a 
 local .htaccess file
 
-       - PHP 5.2+. The later the better. You'll need 5.3 for encryption of key
-exchange conversations
+       - PHP 5.2+. The later the better. PHP 5.3 is required for communications 
+with the Diaspora network and improved security.
+
                - PHP *command line* access with register_argc_argv set to true in the 
-php.ini file
-               - curl, gd, mysql, mbstring, and openssl extensions
+php.ini file [or see 'poormancron' in section 8]
+
+               - curl, gd, mysql, mbstring, mcrypt, and openssl extensions
+
                - some form of email server or email gateway such that PHP mail() works
-               - mcrypt (optional; used for end-to-end message encryption)
 
        - Mysql 5.x
 
@@ -36,12 +48,8 @@ php.ini file
 (Windows) [Note: other options are presented in Section 8 of this document]
 
        - Installation into a top-level domain or sub-domain (without a 
-directory/path component in the URL) is preferred. Directory paths will
-not be as convenient to use and have not been thoroughly tested.  
-
-       [Dreamhost.com offers all of the necessary hosting features at a 
-reasonable price. If your hosting provider doesn't allow Unix shell access, 
-you might have trouble getting everything to work.] 
+directory/path component in the URL) is preferred. This is REQUIRED if
+you wish to communicate with the Diaspora network.
 
 2. Unpack the Friendika files into the root of your web server document area.
 
@@ -58,7 +66,9 @@ write or create files in your web directory, create an empty file called
 .htconfig.php and make it writable by the web server.
 
 5. Visit your website with a web browser and follow the instructions. Please 
-note any error messages and correct these before continuing.
+note any error messages and correct these before continuing. If you are using
+SSL with a known signature authority (recommended), use the https: link to your
+website. If you are using a self-signed cert or no cert, use the http: link. 
 
 6. *If* the automated installation fails for any reason, check the following:
 
@@ -99,7 +109,9 @@ have troubles with this section please contact your hosting provider for
 assistance. Friendika will not work correctly if you cannot perform this step.
   
 Alternative: You may be able to use the 'poormancron' plugin to perform this
-step if you are using a recent Friendika release. To do this, edit the file 
+step if you are using a recent Friendika 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 plugins. On a fresh 
 installation, it will look like
 
@@ -114,7 +126,7 @@ $a->config['system']['addon'] = 'js_upload,poormancron';
 and save your changes.
 
 
-
 #####################################################################
 
                If things don't work...
index 19c5948866f2bd535bdf31e9cd759282ba2afbcc..325f18dd1252acad753c11067a68de6cde2f156e 100644 (file)
@@ -33,3 +33,7 @@ long posts truncated - with a link to view the full post.
 Facebook contacts will not be able to view private photos, as they are not able to
 authenticate to your site to establish identity. We will address this 
 in a future release.
+
+Info: please make sure that you understand all aspects due to Friendika's 
+default licence which is: Creative Commons Attribution 3.0 (further info:
+http://creativecommons.org/licenses/by/3.0/ )
index ed59daff61d8cfa23d2be99fa3e31b42b75822b4..33895f80d77bda7a414bad2e7a62dea85b2b75e3 100644 (file)
@@ -151,6 +151,8 @@ function fb_get_friends($uid) {
                logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
                $j = json_decode($s);
                logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
+               if(! $j->data)
+                       return;
                foreach($j->data as $person) {
                        $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token);
                        if($s) {
index 9a38c0becca1b289973c9eaaffa3201167792e74..8e4255bd116a212309b70a734ee3417a839d2804 100644 (file)
@@ -7,7 +7,7 @@ License: 3-clause BSD license (same as Friendika)
 
 About
   This plugin adds an Impressum block to the /friendika page with informations
-  about the page operator/owner and how to countact you in case of any questions.
+  about the page operator/owner and how to contact you in case of any questions.
 
   In the notes and postal fields you can use HTML tags for formatting.
 
index 8d5e272976fa6a55b98f6ce3b2eb246259398ff8..6ace482845d080c9d232f09744ea011f12e4f544 100644 (file)
@@ -3,30 +3,30 @@ by Tobias Diekershoff
    tobias.diekershoff(at)gmx.net
 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! This addon is currently in under development. If you have any problem    !!
+!! This addon is currently under development. If you have any problem       !!
 !! with it, please contact the Author.                                      !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 With this addon to Friendika you can give your user the possibility to post
-their public messages to any StatusNet instance like identi.ca for example. The
-messages will be strapped their rich context and shortened to to the character
+their public messages to any StatusNet instance (like identi.ca for example). 
+The messages will be strapped their rich context and shortened to to the character
 limit of the StatusNet instance in question if necessary. If shortening of the
 message was performed a link will be added to the notice pointing to the
 original message on your server.
 
-There is a similar plugin to forward public messages to Twitter Twitter Plugin.
+There is a similar plugin to forward public messages to Twitter: Twitter Plugin.
 
 Online version of this document: http://ur1.ca/35mpb
 
 ___ Requirements ___
 
 Due to the distributed nature of the StatusNet network, each user who wishes to
-forward public messages to a StatusNet account has get the OAuth credentials
-for themselves, which makes this addon a little bit more user unfriendly then
-the Twitter Plugin is. Nothing to geeky though!
+forward public messages to a StatusNet account has to get the OAuth credentials
+for themselves, which makes this addon a little bit more user unfriendly than
+the Twitter Plugin is. Nothing too geeky though!
 
 The inclusion of a shorturl for the original posting in cases when the message
-was longer then the maximal allowed notice length requires it, that you have
+was longer than the maximal allowed notice length requires it, that you have
 PHP5+ and curl on your server.
 Where to find
 
@@ -58,7 +58,7 @@ To get the OAuth Consumer key pair the user has to (a) ask her Friendika admin
 if a pair already exists or (b) has to register the Friendika server as a
 client application on the StatusNet server. This can be done from the account
 settings under "Connect -> Connections -> Register an OAuth client application
--> Register new application".
+-> Register new application".
 
 During the registration of the OAuth client remember the following:
  * there is no callback url
@@ -69,7 +69,7 @@ During the registration of the OAuth client remember the following:
 After the required credentials for the application are stored in the
 configuration you have to actually connect your Friendika account with
 StatusNet. To do so follow the Sign in with StatusNet button, allow the access
-and copy the security code into the addon configuration. Friendika will then
+and copy the security code into the plugin configuration. Friendika will then
 try to acquire the final OAuth credentials from the API, if successful the
-addon settings will allow you to select to post your public messages to your
+plugin settings will allow you to select to post your public messages to your
 StatusNet account.
index 2f02ded54b12e1f45ce7c8881a2d404c7c9f60b9..f1b35d6c04ff4248d797490919c0d6ff22b400d2 100644 (file)
@@ -355,7 +355,10 @@ function statusnet_post_hook(&$a,&$b) {
 
         logger('StatusNet post invoked');
 
-       if((local_user()) && (local_user() == $b['uid']) && (! $b['private']) && (!$b['parent']) ) {
+       if((local_user()) && (local_user() == $b['uid']) && (! $b['private'])) {
+
+               // mike 2-9-11 there was a restriction to only allow this for top level posts
+               // now relaxed so should allow one's own comments to be forwarded through the connector as well. 
 
                // Status.Net is not considered a private network
                if($b['prvnets'])
index a49fa5cdaf0bd311bb8359500e5b37f16eefd6de..e6d5f12c9bc928d99e64a836cfe390de2c5ca653 100644 (file)
@@ -3,7 +3,7 @@ By Tobias Diekershoff
    tobias.diekershoff(at)gmx.net
 
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!!   This addon is currently in under development. If you have any problem  !!
+!!   This addon is currently under development. If you have any problem     !!
 !!   with it, please contact the Author.                                    !!
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -29,7 +29,7 @@ After you registered the application you get an OAuth consumer key / secret
 pair that identifies your app, you will need them for configuration.
 
 The inclusion of a shorturl for the original posting in cases when the
-message was longer then 140 characters requires it, that you have *PHP5+* and
+message was longer than 140 characters requires it, that you have *PHP5+* and
 *curl* on your server.
 
 ___ Where to find ___
@@ -51,19 +51,19 @@ To activate this addon add @twitter@ to the list of active addons in your
 .htconfig.php file 
     $a->config['system']['addon'] = "twitter, ..."
 Afterwards you need to add your OAuth consumer key / secret pair to it by
-adding the following to lines
+adding the following two lines
 
 $a->config['twitter']['consumerkey'] = 'your consumer KEY here';
 $a->config['twitter']['consumersecret'] = 'your consumer SECRET here';
 
 When this is done your user can now configure their Twitter connection at
-"Settings -> Addon Settings" and enable the forwarding of their *public*
+"Settings -> Plugin Settings" and enable the forwarding of their *public*
 messages to Twitter.
 
 __ User Configuration __
 
 When the OAuth consumer informations are correctly placed into the
-configuration file and a user visits the "Addon Settings" page they can now
+configuration file and a user visits the "Plugin Settings" page they can now
 connect to Twitter. To do so one has to follow the _Sign in with Twitter_
 button (the page will be opened in a new browser window/tab) and get a PIN from
 Twitter. This PIN has to be entered on the settings page. After submitting the
@@ -71,7 +71,7 @@ PIN the plugin will get OAuth credentials identifying this user from the
 Friendika account.
 
 If this first step was successful the Twitter configuration will be changed
-on the "Addon Settings" page displaying two check boxes. One to enable/disable
+on the "Plugin Settings" page displaying two check boxes. One to enable/disable
 the forwarding of *all public* postings to Twitter and one to clear the
 personal configuration from the Twitter credentials.
 
index 9b54212a80cc7b13004ed1c4161b9cd30cd5912c..6927d43241390a35e064b20e987839884ddeedcf 100644 (file)
@@ -4,7 +4,7 @@ function like_widget_name() {
        return "Shows likes";
 }
 function like_widget_help() {
-       return "Search first item wich contains <em>KEY</em> and print like/dislike count";
+       return "Search first item which contains <em>KEY</em> and print like/dislike count";
 }
 
 function like_widget_args(){
index ae3c04b77cd42499577aa701071fb9c448821b9e..e8b3d7ac1826268043a7c77e0912e8fb03a25a65 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -7,9 +7,9 @@ require_once('include/text.php');
 require_once("include/pgettext.php");
 
 
-define ( 'FRIENDIKA_VERSION',      '2.2.1079' );
+define ( 'FRIENDIKA_VERSION',      '2.2.1090' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.21'    );
-define ( 'DB_UPDATE_VERSION',      1081      );
+define ( 'DB_UPDATE_VERSION',      1085      );
 
 define ( 'EOL',                    "<br />\r\n"     );
 define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
@@ -674,6 +674,8 @@ function login($register = false) {
                '$lostlink'      => $lostlink 
        ));
 
+       call_hooks('login_hook',$o);
+
        return $o;
 }}
 
index 605433e6e2044b75491484ff80be8f2f05408099..432ce76938d4e9f254a3091fc31402ed7e523fa4 100644 (file)
@@ -38,7 +38,7 @@ CREATE TABLE IF NOT EXISTS `config` (
   `k` char(255) NOT NULL,
   `v` text NOT NULL,
   PRIMARY KEY (`id`)
-) ENGINE=MYISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 
 
@@ -58,6 +58,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
   `network` char(255) NOT NULL,
   `name` char(255) NOT NULL,
   `nick` char(255) NOT NULL,
+  `attag` char(255) NOT NULL,
   `photo` text NOT NULL, 
   `thumb` text NOT NULL,
   `micro` text NOT NULL,
@@ -267,6 +268,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `uid` int(10) unsigned NOT NULL,
   `contact-id` int(10) unsigned NOT NULL,
+  `guid` char(64) NOT NULL, 
   `resource-id` char(255) NOT NULL,
   `created` datetime NOT NULL,
   `edited` datetime NOT NULL,
@@ -288,7 +290,8 @@ CREATE TABLE IF NOT EXISTS `photo` (
   KEY `resource-id` (`resource-id`),
   KEY `album` (`album`),
   KEY `scale` (`scale`),
-  KEY `profile` (`profile`)
+  KEY `profile` (`profile`),
+  KEY `guid` (`guid`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
 -- --------------------------------------------------------
@@ -426,7 +429,7 @@ CREATE TABLE IF NOT EXISTS `register` (
   `password` CHAR(255) NOT NULL,
   `language` CHAR(16) NOT NULL,
   PRIMARY KEY (`id`)
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `clients` (
@@ -434,7 +437,7 @@ CREATE TABLE IF NOT EXISTS `clients` (
 `pw` VARCHAR( 20 ) NOT NULL ,
 `redirect_uri` VARCHAR( 200 ) NOT NULL ,
 PRIMARY KEY ( `client_id` )
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `tokens` (
 `id` VARCHAR( 40 ) NOT NULL ,
@@ -442,7 +445,7 @@ CREATE TABLE IF NOT EXISTS `tokens` (
 `expires` INT NOT NULL ,
 `scope` VARCHAR( 200 ) NOT NULL ,
 PRIMARY KEY ( `id` )
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `auth_codes` (
 `id` VARCHAR( 40 ) NOT NULL ,
@@ -451,7 +454,7 @@ CREATE TABLE IF NOT EXISTS `auth_codes` (
 `expires` INT NOT NULL ,
 `scope` VARCHAR( 250 ) NOT NULL ,
 PRIMARY KEY ( `id` )
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `queue` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@@ -460,7 +463,7 @@ CREATE TABLE IF NOT EXISTS `queue` (
 `created` DATETIME NOT NULL ,
 `last` DATETIME NOT NULL ,
 `content` MEDIUMTEXT NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `pconfig` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@@ -468,7 +471,7 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
 `cat` CHAR( 255 ) NOT NULL ,
 `k` CHAR( 255 ) NOT NULL ,
 `v` MEDIUMTEXT NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `hook` (
@@ -476,7 +479,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
 `hook` CHAR( 255 ) NOT NULL ,
 `file` CHAR( 255 ) NOT NULL ,
 `function` CHAR( 255 ) NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `addon` (
@@ -486,7 +489,7 @@ CREATE TABLE IF NOT EXISTS `addon` (
 `installed` TINYINT( 1 ) NOT NULL DEFAULT '0' ,
 `timestamp` BIGINT NOT NULL DEFAULT '0' ,
 `plugin_admin` TINYINT( 1 ) NOT NULL DEFAULT '0'
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `event` (
@@ -507,13 +510,13 @@ CREATE TABLE IF NOT EXISTS `event` (
 `allow_gid` MEDIUMTEXT NOT NULL ,
 `deny_cid` MEDIUMTEXT NOT NULL ,
 `deny_gid` MEDIUMTEXT NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `cache` (
  `k` CHAR( 255 ) NOT NULL PRIMARY KEY ,
  `v` TEXT NOT NULL,
  `updated` DATETIME NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `fcontact` (
@@ -534,14 +537,14 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
 `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
 INDEX ( `addr` ),
 INDEX ( `network` )
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `ffinder` (
 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `uid` INT UNSIGNED NOT NULL ,
 `cid` INT UNSIGNED NOT NULL ,
 `fid` INT UNSIGNED NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `fsuggest` (
@@ -554,7 +557,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
 `photo` CHAR( 255 ) NOT NULL ,
 `note` TEXT NOT NULL ,
 `created` DATETIME NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
  
 
 CREATE TABLE IF NOT EXISTS `mailacct` (
@@ -569,7 +572,7 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
 `reply_to` CHAR( 255 ) NOT NULL ,
 `pubmail` TINYINT(1) NOT NULL DEFAULT '0',
 `last_check` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `attach` (
 `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@@ -585,13 +588,13 @@ CREATE TABLE IF NOT EXISTS `attach` (
 `allow_gid` MEDIUMTEXT NOT NULL ,
 `deny_cid` MEDIUMTEXT NOT NULL ,
 `deny_gid` MEDIUMTEXT NOT NULL
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE IF NOT EXISTS `guid` (
 `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `guid` CHAR( 64 ) NOT NULL ,
 INDEX ( `guid` )
-) ENGINE = MYISAM  DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM  DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE IF NOT EXISTS `sign` (
@@ -601,6 +604,12 @@ CREATE TABLE IF NOT EXISTS `sign` (
 `signature` TEXT NOT NULL ,
 `signer` CHAR( 255 ) NOT NULL ,
 INDEX ( `iid` )
-) ENGINE = MYISAM DEFAULT CHARSET=utf8;
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
 
 
+CREATE TABLE IF NOT EXISTS `deliverq` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`cmd` CHAR( 32 ) NOT NULL ,
+`item` INT NOT NULL ,
+`contact` INT NOT NULL
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
index c8fc8e790577ce551c4d4ae5d2feb35b71f01536..cb56383ce4fdc921db7e12077098ccec2e4b479a 100644 (file)
@@ -12,7 +12,7 @@ All three of these plugins require an account on the target network. In addition
 
 **Site Configuration**
 
-Plugins must be installed by the site administrator before they can be use. This is accomplished through the site
+Plugins must be installed by the site administrator before they can be used. This is accomplished through the site
 configuration file ".htconfig.php".
 
 The configuration directive looks like:
@@ -84,7 +84,7 @@ To get the OAuth Consumer key pair the user has to
 (a) ask her Friendika admin if a pair already exists or 
 (b) has to register the Friendika server as a client application on the StatusNet server. 
 
-This can be done from the account settings under "Settings -> Connections -> Register an OAuth client application -> Register new application".
+This can be done from the account settings under "Settings -> Connections -> Register an OAuth client application -> Register new application".
 
 During the registration of the OAuth client remember the following:
 
@@ -133,8 +133,8 @@ d. Navigate to Set Web->Site URL & Domain -> Website Settings.  Set Site URL
 to yoursubdomain.yourdomain.com.  Set Site Domain to your yourdomain.com.
 
 
-Visit the Facebook Settings section of the "Settings->Plugin Settings" page.
-and click 'Install Facebook Connector'.
+Visit the Facebook Settings section of the "Settings->Plugin Settings" page. 
+And click 'Install Facebook Connector'.
 
 This will ask you to login to Facebook and grant permission to the
 plugin to do its stuff. Allow it to do so.
index 4ca77d065175c58bc0f02d3b2f7239cc20fadb73..7524c0cea063946ed0c1b9ba04ee76a27954f8c0 100644 (file)
@@ -85,3 +85,55 @@ function unmark_for_death($contact) {
        );
 }}
 
+if(! function_exists('contact_photo_menu')){
+function contact_photo_menu($contact) {
+
+       $a = get_app();
+       
+       $contact_url="";
+       $pm_url="";
+       $status_link="";
+       $photos_link="";
+       $posts_link="";
+
+       $sparkle = false;
+       if($contact['network'] === NETWORK_DFRN) {
+               $sparkle = true;
+               $profile_link = $a->get_baseurl() . '/redir/' . $contact['id'];
+       }
+       else
+               $profile_link = $contact['url'];
+
+       if($profile_link === 'mailbox')
+               $profile_link = '';
+
+       if($sparkle) {
+               $status_link = $profile_link . "?url=status";
+               $photos_link = $profile_link . "?url=photos";
+               $profile_link = $profile_link . "?url=profile";
+               $pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
+       }
+
+       $contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
+       $posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['id'];
+
+       $menu = Array(
+               t("View status") => $status_link,
+               t("View profile") => $profile_link,
+               t("View photos") => $photos_link,               
+               t("View recent") => $posts_link, 
+               t("Edit contact") => $contact_url,
+               t("Send PM") => $pm_url,
+       );
+       
+       
+       $args = array('contact' => $contact, 'menu' => $menu);
+       
+       call_hooks('contact_photo_menu', $args);
+       
+       $o = "";
+       foreach($menu as $k=>$v){
+               if ($v!="") $o .= "<li><a href='$v'>$k</a></li>\n";
+       }
+       return $o;
+}}
index de4c3d9e0439c11aa30dbbc3ad32b5f6e15c7d6f..1450374ffc27971fd91b20d325c5593d3ac33413 100644 (file)
@@ -185,11 +185,20 @@ class Photo {
 
        public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
 
+               $r = q("select `guid` from photo where `resource-id` = '%s' and `guid` != '' limit 1",
+                       dbesc($rid)
+               );
+               if(count($r))
+                       $guid = $r[0]['guid'];
+               else
+                       $guid = get_guid();
+
                $r = q("INSERT INTO `photo`
-                       ( `uid`, `contact-id`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
-                       VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
+                       ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+                       VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
                        intval($uid),
                        intval($cid),
+                       dbesc($guid),
                        dbesc($rid),
                        dbesc(datetime_convert()),
                        dbesc(datetime_convert()),
index 48ba77a88866aa49b4b801f48e29ceca1f0b56ed..66fe104eaab2aee3acc1901564cb2064ea6b756f 100644 (file)
@@ -170,7 +170,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
                $sql_extra .= " AND `network` IN ( 'dfrn' ) ";
        }
        elseif($privatenet) {   
-               $sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face' ) ";
+               $sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face', 'dspr' ) ";
        }
 
 
index aa42313b2a15387c7488a0730c42b603a2812754..1f58a6baae3e77a264789d754ebe95003bc1949e 100644 (file)
@@ -1,6 +1,7 @@
 <?php
        require_once("bbcode.php");
        require_once("datetime.php");
+       require_once("conversation.php");
        
        /* 
         * Twitter-Like API
@@ -8,7 +9,7 @@
         */
 
        $API = Array();
-        
+       $called_api = Null; 
 
        function api_date($str){
                //Wed May 23 06:01:13 +0000 2007
         *  MAIN API ENTRY POINT  *
         **************************/
        function api_call(&$a){
-               GLOBAL $API;
+               GLOBAL $API, $called_api;
                foreach ($API as $p=>$info){
                        if (strpos($a->query_string, $p)===0){
+                               $called_api= explode("/",$p);
                                #unset($_SERVER['PHP_AUTH_USER']);
                                if ($info['auth']===true && local_user()===false) {
                                                api_login($a);
                                                return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
                                                break;
                                        case "json": 
-                                               header ("Content-Type: application/json");  
+                                               //header ("Content-Type: application/json");  
                                                foreach($r as $rr)
                                                    return json_encode($rr);
                                                break;
         * Returns user info array.
         */
        function api_get_user(&$a, $contact_id = Null){
+               global $called_api;
                $user = null;
                $extra_query = "";
 
                if(is_null($user) && x($_GET, 'screen_name')) {
                        $user = dbesc($_GET['screen_name']);    
                        $extra_query = "AND `contact`.`nick` = '%s' ";
+                       if (local_user()!==false)  $extra_query .= "AND `contact`.`uid`=".intval(local_user());
+                       
                }
                
-               if (is_null($user) && $a->argc > 3){
-                       list($user, $null) = explode(".",$a->argv[3]);
+               if (is_null($user) && $a->argc > (count($called_api)-1)){
+                       $argid = count($called_api);
+                       list($user, $null) = explode(".",$a->argv[$argid]);
                        if(is_numeric($user)){
                                $user = intval($user);
                                $extra_query = "AND `contact`.`id` = %d ";
                        } else {
                                $user = dbesc($user);
                                $extra_query = "AND `contact`.`nick` = '%s' ";
+                               if (local_user()!==false)  $extra_query .= "AND `contact`.`uid`=".intval(local_user());
                        }
                }
                
                }
 
                $ret = Array(
+                       'self' => intval($uinfo[0]['self']),
                        'uid' => intval($uinfo[0]['uid']),
                        'id' => intval($uinfo[0]['cid']),
                        'name' => $uinfo[0]['name'],
                        'followers_count' => intval($countfollowers),
                        'favourites_count' => intval($starred),
                        'contributors_enabled' => false,
-                       'follow_request_sent' => false,
+                       'follow_request_sent' => true,
                        'profile_background_color' => 'cfe8f6',
                        'profile_text_color' => '000000',
                        'profile_link_color' => 'FF8500',
                $user_info = api_get_user($a);
                // get last newtork messages
 
+
                // params
                $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
                $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
                $user_info = api_get_user($a);
                // get last newtork messages
 
+
+               logger("api_statuses_user_timeline: local_user: ". local_user() .
+                          "\nuser_info: ".print_r($user_info, true) .
+                          "\n_REQUEST:  ".print_r($_REQUEST, true),
+                          LOGGER_DEBUG);
+
                // params
                $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
                $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
                
                $start = $page*$count;
 
+               if ($user_info['self']==1) $sql_extra = "AND `item`.`wall` = 1 ";
 
                $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
                        `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
                        `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
                        FROM `item`, `contact`
                        WHERE `item`.`uid` = %d
+                       AND `item`.`contact-id` = %d
                        AND `item`.`visible` = 1 AND `item`.`deleted` = 0
-                       AND `item`.`wall` = 1
                        AND `contact`.`id` = `item`.`contact-id`
                        AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
                        $sql_extra
                        AND `item`.`id`>%d
                        ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
-                       intval($user_info['uid']),
+                       intval(local_user()),
+                       intval($user_info['id']),
                        intval($since_id),
                        intval($start), intval($count)
                );
                if (local_user()===false) return false;
                
                $user_info = api_get_user($a);
-               // get last newtork messages
-               
-               // params
-               $count = (x($_GET,'count')?$_GET['count']:20);
-               $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
-               if ($page<0) $page=0;
+               // in friendika starred item are private
+               // return favorites only for self
+               logger('api_favorites: self:' . $user_info['self']);
                
-               $start = $page*$count;
-
-               $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
-                       `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
-                       `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
-                       `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
-                       FROM `item`, `contact`
-                       WHERE `item`.`uid` = %d
-                       AND `item`.`visible` = 1 AND `item`.`deleted` = 0
-                       AND `item`.`starred` = 1
-                       AND `contact`.`id` = `item`.`contact-id`
-                       AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
-                       $sql_extra
-                       ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
-                       intval($user_info['uid']),
-                       intval($start), intval($count)
-               );
-
-               $ret = api_format_items($r,$user_info);
+               if ($user_info['self']==0) {
+                       $ret = array();
+               } else {
+                       
+                       
+                       // params
+                       $count = (x($_GET,'count')?$_GET['count']:20);
+                       $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
+                       if ($page<0) $page=0;
+                       
+                       $start = $page*$count;
+
+                       $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
+                               `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+                               `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+                               `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+                               FROM `item`, `contact`
+                               WHERE `item`.`uid` = %d
+                               AND `item`.`visible` = 1 AND `item`.`deleted` = 0
+                               AND `item`.`starred` = 1
+                               AND `contact`.`id` = `item`.`contact-id`
+                               AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+                               $sql_extra
+                               ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+                               intval($user_info['uid']),
+                               intval($start), intval($count)
+                       );
 
+                       $ret = api_format_items($r,$user_info);
+               
+               }
                
                $data = array('$statuses' => $ret);
                switch($type){
                $ret = Array();
 
                foreach($r as $item) {
+                       localize_item($item);
                        $status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item));
                        $status = array(
                                'created_at'=> api_date($item['created']),
                if (local_user()===false) return false;
                $user_info = api_get_user($a);
                
+               
+               // friends and followers only for self
+               if ($user_info['self']==0){
+                       return false;
+               }
+               
                if (x($_GET,'cursor') && $_GET['cursor']=='undefined'){
                        /* this is to stop Hotot to load friends multiple times
                        *  I'm not sure if I'm missing return something or
                        *  is a bug in hotot. Workaround, meantime
                        */
                        
-                       $ret=Array();
-                       $data = array('$users' => $ret);
-                       return  api_apply_template("friends", $type, $data);
+                       /*$ret=Array();
+                       return array('$users' => $ret);*/
+                       return false;
                }
                
                if($qtype == 'friends')
                }
 
                
-               $data = array('$users' => $ret);
-               return  api_apply_template("friends", $type, $data);
+               return array('$users' => $ret);
 
        }
        function api_statuses_friends(&$a, $type){
-               return api_statuses_f($a,$type,"friends");
+               $data =  api_statuses_f($a,$type,"friends");
+               if ($data===false) return false;
+               return  api_apply_template("friends", $type, $data);
        }
        function api_statuses_followers(&$a, $type){
-               return api_statuses_f($a,$type,"followers");
+               $data = api_statuses_f($a,$type,"followers");
+               if ($data===false) return false;
+               return  api_apply_template("friends", $type, $data);
        }
        api_register_func('api/statuses/friends','api_statuses_friends',true);
        api_register_func('api/statuses/followers','api_statuses_followers',true);
index 768af626fb5863a697e358cda29a793d82cf76e1..b7b96bdc0bb7f3f047c2ede73dd29a8eeb3a075e 100644 (file)
@@ -48,7 +48,8 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
                        goaway(z_root());
                }
 
-               $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
+               $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` 
+               FROM `user` WHERE `uid` = %d LIMIT 1",
                        intval($_SESSION['uid'])
                );
 
@@ -183,7 +184,8 @@ else {
 
                        // process normal login request
 
-                       $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) 
+                       $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`  
+                               FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) 
                                AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
                                dbesc(trim($_POST['openid_url'])),
                                dbesc(trim($_POST['openid_url'])),
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
new file mode 100644 (file)
index 0000000..2eeea32
--- /dev/null
@@ -0,0 +1,182 @@
+<?php
+
+require_once("include/oembed.php");
+require_once('include/event.php');
+
+
+
+
+function diaspora2bb($s) {
+
+       $s = str_replace(array('\\**','\\__','\\*','\\_'), array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'),$s);
+       $s = preg_replace("/\*\*\*(.+?)\*\*\*/", '[b][i]$1[/i][/b]', $s);
+       $s = preg_replace("/\_\_\_(.+?)\_\_\_/", '[b][i]$1[/i][/b]', $s);
+       $s = preg_replace("/\*\*(.+?)\*\*/", '[b]$1[/b]', $s);
+       $s = preg_replace("/\_\_(.+?)\_\_/", '[b]$1[/b]', $s);
+       $s = preg_replace("/\*(.+?)\*/", '[i]$1[/i]', $s);
+       $s = preg_replace("/\_(.+?)\_/", '[i]$1[/i]', $s);
+       $s = str_replace(array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'), array('**','__','*','_'), $s);
+       $s = preg_replace('/\!\[(.+?)\]\((.+?)\)/','[img]$2[/img]',$s);
+       $s = preg_replace('/\[(.+?)\]\((.+?)\)/','[url=$2]$1[/url]',$s);
+       $s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
+
+
+       $s = escape_tags($s);
+       return $s;
+
+}
+
+
+function stripdcode_br_cb($s) {
+       return '[code]' . str_replace('<br />', '', $s[1]) . '[/code]';
+}
+
+
+       // BBcode 2 HTML was written by WAY2WEB.net
+       // extended to work with Mistpark/Friendika - Mike Macgirvin
+
+function bb2diaspora($Text,$preserve_nl = false) {
+
+       // Replace any html brackets with HTML Entities to prevent executing HTML or script
+       // Don't use strip_tags here because it breaks [url] search by replacing & with amp
+
+       $Text = str_replace("<", "&lt;", $Text);
+       $Text = str_replace(">", "&gt;", $Text);
+
+
+       if($preserve_nl)
+               $Text = str_replace(array("\n","\r"), array('',''),$Text);
+
+       // Set up the parameters for a URL search string
+       $URLSearchString = "^\[\]";
+       // Set up the parameters for a MAIL search string
+       $MAILSearchString = $URLSearchString;
+
+       // Perform URL Search
+
+       // [img]pathtoimage[/img]
+
+
+       $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($1)', $Text);
+       $Text = preg_replace("/\#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/", '[#$2]($1)', $Text);
+       $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/", '[$2]($1)', $Text);
+
+//     $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text);
+//     $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('image/photo'), $Text);
+
+       // Perform MAIL Search
+       $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text);
+       $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '[$2](mailto:$1)', $Text);
+         
+       $Text = str_replace('*', '\\*', $Text);
+       $Text = str_replace('_', '\\_', $Text);
+
+       $Text = str_replace('`','\\`', $Text);
+
+       // Check for bold text
+       $Text = preg_replace("(\[b\](.*?)\[\/b\])is",'**$1**',$Text);
+
+       // Check for Italics text
+       $Text = preg_replace("(\[i\](.*?)\[\/i\])is",'_$1_',$Text);
+
+       // Check for Underline text
+//     $Text = preg_replace("(\[u\](.*?)\[\/u\])is",'<u>$1</u>',$Text);
+
+       // Check for strike-through text
+//     $Text = preg_replace("(\[s\](.*?)\[\/s\])is",'<strike>$1</strike>',$Text);
+
+       // Check for over-line text
+//     $Text = preg_replace("(\[o\](.*?)\[\/o\])is",'<span class="overline">$1</span>',$Text);
+
+       // Check for colored text
+//     $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","<span style=\"color: $1;\">$2</span>",$Text);
+
+       // Check for sized text
+//     $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","<span style=\"font-size: $1;\">$2</span>",$Text);
+
+       // Check for list text
+//     $Text = preg_replace("/\[list\](.*?)\[\/list\]/is", '<ul class="listbullet">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/is", '<ul class="listdecimal">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/s",'<ul class="listlowerroman">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/s", '<ul class="listupperroman">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/s", '<ul class="listloweralpha">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/s", '<ul class="listupperalpha">$1</ul>' ,$Text);
+//     $Text = preg_replace("/\[li\](.*?)\[\/li\]/s", '<li>$1</li>' ,$Text);
+
+//     $Text = preg_replace("/\[td\](.*?)\[\/td\]/s", '<td>$1</td>' ,$Text);
+//     $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/s", '<tr>$1</tr>' ,$Text);
+//     $Text = preg_replace("/\[table\](.*?)\[\/table\]/s", '<table>$1</table>' ,$Text);
+
+//     $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/s", '<table border="1" >$1</table>' ,$Text);
+//     $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/s", '<table border="0" >$1</table>' ,$Text);
+
+       
+//     $Text = str_replace("[*]", "<li>", $Text);
+
+       // Check for font change text
+//     $Text = preg_replace("(\[font=(.*?)\](.*?)\[\/font\])","<span style=\"font-family: $1;\">$2</span>",$Text);
+
+       // Declare the format for [code] layout
+
+       $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/is",'stripdcode_br_cb',$Text);
+
+//     $CodeLayout = '<code>$1</code>';
+       // Check for [code] text
+       $Text = preg_replace("/\[code\](.*?)\[\/code\]/is","```$1```", $Text);
+
+
+
+
+       // Declare the format for [quote] layout
+//     $QuoteLayout = '<blockquote>$1</blockquote>';                     
+       // Check for [quote] text
+//     $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is","$QuoteLayout", $Text);
+         
+       // Images
+
+       // html5 video and audio
+
+//     $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<video src="$1" controls="controls" width="425" height="350"><a href="$1">$1</a></video>', $Text);
+
+//     $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
+
+//     $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/", '<iframe src="$1" width="425" height="350"><a href="$1">$1</a></iframe>', $Text);
+         
+       // [img=widthxheight]image source[/img]
+//     $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/", '<img src="$3" style="height:{$2}px; width:{$1}px;" >', $Text);
+
+//     if (get_pconfig(local_user(), 'oembed', 'use_for_youtube' )==1){
+//             // use oembed for youtube links
+//             $Text = preg_replace("/\[youtube\]/",'[embed]',$Text); 
+//             $Text = preg_replace("/\[\/youtube\]/",'[/embed]',$Text); 
+//     } else {
+//             // Youtube extensions
+ //       $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); 
+  //      $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); 
+//             $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<iframe width="425" height="349" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $Text);
+//     }
+//     $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
+
+
+
+       // oembed tag
+//     $Text = oembed_bbcode2html($Text);
+
+       // If we found an event earlier, strip out all the event code and replace with a reformatted version.
+
+//     if(x($ev,'desc') && x($ev,'start')) {
+//             $sub = format_event_html($ev);
+
+       //      $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/is",$sub,$Text);
+               //$Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/is",'',$Text);
+//             $Text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/is",'',$Text);
+//             $Text = preg_replace("/\[event\-location\](.*?)\[\/event\-location\]/is",'',$Text);
+//             $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",'',$Text);
+//     }
+
+
+       
+       call_hooks('bb2diaspora',$Text);
+
+       return $Text;
+}
index 3619015ca9f8c6fa0734ff0af8c6f932c65f34b3..9ee8b7b36ceecb7b14538fcf183d67ed370b80c9 100644 (file)
@@ -41,7 +41,7 @@ function bbcode($Text,$preserve_nl = false) {
        // Perform URL Search
 
 
-       $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+\,]+)/", ' <a href="$2" target="external-link">$2</a>', $Text);
+       $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\%\$\!\+\,]+)/", '$1<a href="$2" target="external-link">$2</a>', $Text);
 
        $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '<a href="$1" target="external-link">$1</a>', $Text);
        $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '<a href="$1" target="external-link">$2</a>', $Text);
@@ -133,12 +133,14 @@ function bbcode($Text,$preserve_nl = false) {
        } else {
                // Youtube extensions
         $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); 
+        $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); 
         $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); 
-               $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<iframe width="425" height="349" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $Text);
+               $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/", '<iframe width="425" height="350" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
        }
-//     $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
 
 
+//     $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
+
 
        // oembed tag
        $Text = oembed_bbcode2html($Text);
index ac1e38e4fe2666cb600d79ffa8f8ffce7925433a..1303acf74a13a1788930997dd8953c61e8752a79 100644 (file)
@@ -46,10 +46,11 @@ function contact_reputation($current) {
 }
 
 
-function contact_poll_interval($current) {
+function contact_poll_interval($current, $disabled = false) {
 
+       $dis = (($disabled) ? ' disabled="disabled" ' : '');
        $o = '';
-       $o .= '<select id="contact-poll-interval" name="poll" />' . "\r\n";
+       $o .= "<select id=\"contact-poll-interval\" name=\"poll\" $dis />" . "\r\n";
 
        $rep = array(
                0 => t('Frequently'),
@@ -67,3 +68,13 @@ function contact_poll_interval($current) {
        $o .= "</select>\r\n";
        return $o;
 }
+
+
+function network_to_name($s) {
+
+       call_hooks('network_to_name', $s);
+
+       return str_replace(array(NETWORK_DFRN,NETWORK_OSTATUS,NETWORK_FEED,NETWORK_MAIL,NETWORK_DIASPORA,NETWORK_FACEBOOK,NETWORK_ZOT),
+               array(t('Friendika'),t('OStatus'),t('RSS/Atom'),t('Email'),t('Diaspora'),t('Facebook'),t('Zot!')),$s);
+
+}
index 0d901a3c06d6204eb076bf926d9cd585253393e1..6b5bf8d7c61acd61e6974bc630e2f083734b0a71 100644 (file)
@@ -80,6 +80,7 @@ function localize_item(&$item){
 
        }
         
+
 }
 
 /**
index a20606db540a5313b67b7dcb67e147df74e33a62..0feb45c2474b58edbb0f27e066d7c382eaf2e992 100644 (file)
@@ -225,3 +225,71 @@ function pkcs5_unpad($text)
     if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
     return substr($text, 0, -1 * $pad);
 } 
+
+function AES256CBC_encrypt($data,$key,$iv) {
+       return mcrypt_encrypt(
+               MCRYPT_RIJNDAEL_128, 
+               str_pad($key,32,"\0"), 
+               pkcs5_pad($data,16), 
+               MCRYPT_MODE_CBC, 
+               str_pad($iv,16,"\0"));
+}
+
+function AES256CBC_decrypt($data,$key,$iv) {
+       return pkcs5_unpad(mcrypt_decrypt(
+               MCRYPT_RIJNDAEL_128, 
+               str_pad($key,32,"\0"), 
+               $data, 
+               MCRYPT_MODE_CBC, 
+               str_pad($iv,16,"\0")));
+}
+
+function aes_encapsulate($data,$pubkey) {
+       $key = random_string(32,RANDOM_STRING_TEXT);
+       $iv  = random_string(16,RANDOM_STRING_TEXT);
+       $result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true);
+       openssl_public_encrypt($key,$k,$pubkey);
+       $result['key'] = base64url_encode($k,true);
+       openssl_public_encrypt($iv,$i,$pubkey);
+       $result['iv'] = base64url_encode($i,true);
+       return $result;
+}
+
+function aes_unencapsulate($data,$prvkey) {
+       openssl_private_decrypt(base64url_decode($data['key']),$k,$prvkey);
+       openssl_private_decrypt(base64url_decode($data['iv']),$i,$prvkey);
+       return AES256CBC_decrypt(base64url_decode($data['data']),$k,$i);
+}
+
+
+// This has been superceded.
+
+function zot_encapsulate($data,$envelope,$pubkey) {
+$res = aes_encapsulate($data,$pubkey);
+
+return <<< EOT
+<?xml version='1.0' encoding='UTF-8'?>
+<zot:msg xmlns:zot='http://purl.org/zot/1.0'>
+ <zot:key>{$res['key']}</zot:key>
+ <zot:iv>{$res['iv']}</zot:iv>
+ <zot:env>$s1</zot:env>
+ <zot:sig key_id="$keyid">$sig</zot:sig>
+ <zot:alg>AES-256-CBC</zot:alg>
+ <zot:data type='application/magic-envelope+xml'>{$res['data']}</zot:data>
+</zot:msg>
+EOT;
+
+}
+
+// so has this
+
+function zot_unencapsulate($data,$prvkey) {
+       $ret = array();
+       $c = array();
+       $x = parse_xml_string($data);
+       $c = array('key' => $x->key,'iv' => $x->iv,'data' => $x->data);
+       openssl_private_decrypt(base64url_decode($x->sender),$s,$prvkey);
+       $ret['sender'] = $s;
+       $ret['data'] = aes_unencapsulate($x,$prvkey);
+       return $ret;
+}
\ No newline at end of file
diff --git a/include/delivery.php b/include/delivery.php
new file mode 100644 (file)
index 0000000..5d81228
--- /dev/null
@@ -0,0 +1,444 @@
+<?php
+require_once("boot.php");
+
+function delivery_run($argv, $argc){
+       global $a, $db;
+
+       if(is_null($a)){
+               $a = new App;
+       }
+  
+       if(is_null($db)) {
+               @include(".htconfig.php");
+               require_once("dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+                       unset($db_host, $db_user, $db_pass, $db_data);
+       }
+
+       require_once("session.php");
+       require_once("datetime.php");
+       require_once('include/items.php');
+       require_once('include/bbcode.php');
+       require_once('include/diaspora.php');
+
+       load_config('config');
+       load_config('system');
+
+       load_hooks();
+
+       if($argc < 3)
+               return;
+
+       $a->set_baseurl(get_config('system','url'));
+
+       logger('delivery: invoked: ' . print_r($argv,true));
+
+       $cmd        = $argv[1];
+       $item_id    = intval($argv[2]);
+       $contact_id = intval($argv[3]);
+
+       // Some other process may have delivered this item already.
+
+       $r = q("select * from deliverq where cmd = '%s' and item = %d and contact = %d limit 1",
+               dbesc($cmd),
+               dbesc($item_id),
+               dbesc($contact_id)
+       );
+       if(! count($r)) {
+               return;
+       }       
+
+       // It's ours to deliver. Remove it from the queue.
+
+       q("delete from deliverq where cmd = '%s' and item = %d and contact = %d limit 1",
+               dbesc($cmd),
+               dbesc($item_id),
+               dbesc($contact_id)
+       );
+
+       if((! $item_id) || (! $contact_id))
+               return;
+
+       $expire = false;
+       $top_level = false;
+       $recipients = array();
+       $url_recipients = array();
+
+       $normal_mode = true;
+
+       $recipients[] = $contact_id;
+
+       if($cmd === 'expire') {
+               $normal_mode = false;
+               $expire = true;
+               $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1 
+                       AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP - INTERVAL 30 MINUTE",
+                       intval($item_id)
+               );
+               $uid = $item_id;
+               $item_id = 0;
+               if(! count($items))
+                       return;
+       }
+       else {
+
+               // find ancestors
+               $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+                       intval($item_id)
+               );
+
+               if((! count($r)) || (! intval($r[0]['parent']))) {
+                       return;
+               }
+
+               $target_item = $r[0];
+               $parent_id = intval($r[0]['parent']);
+               $uid = $r[0]['uid'];
+               $updated = $r[0]['edited'];
+
+
+
+               $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` 
+                       FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d ORDER BY `id` ASC",
+                       intval($parent_id)
+               );
+
+               if(! count($items)) {
+                       return;
+               }
+
+               $icontacts = q("SELECT * FROM `contact` WHERE `id` IN ( SELECT distinct(`contact-id`) FROM `item` where `parent` = %d ) ",
+                       intval($parent_id)
+               );
+               if(! count($icontacts))
+                       return;
+
+
+               // avoid race condition with deleting entries
+
+               if($items[0]['deleted']) {
+                       foreach($items as $item)
+                               $item['deleted'] = 1;
+               }
+
+               if((count($items) == 1) && ($items[0]['uri'] === $items[0]['parent-uri'])) {
+                       logger('delivery: top level post');
+                       $top_level = true;
+               }
+       }
+
+       $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, 
+               `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, 
+               `user`.`page-flags`, `user`.`prvnets`
+               FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` 
+               WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1",
+               intval($uid)
+       );
+
+       if(! count($r))
+               return;
+
+       $owner = $r[0];
+
+       $public_message = true;
+
+       // fill this in with a single salmon slap if applicable
+       $slap = '';
+
+       require_once('include/group.php');
+
+       $parent = $items[0];
+
+               // This is IMPORTANT!!!!
+
+               // We will only send a "notify owner to relay" or followup message if the referenced post
+               // originated on our system by virtue of having our hostname somewhere
+               // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere.
+               // if $parent['wall'] == 1 we will already have the parent message in our array
+               // and we will relay the whole lot.
+               // expire sends an entire group of expire messages and cannot be forwarded.
+               // However the conversation owner will be a part of the conversation and will 
+               // be notified during this run.
+               // Other DFRN conversation members will be alerted during polled updates.
+
+               // Diaspora members currently are not notified of expirations, and other networks have
+               // either limited or no ability to process deletions. We should at least fix Diaspora 
+               // by stringing togther an array of retractions and sending them onward.
+                
+       
+       $localhost = $a->get_hostname();
+       if(strpos($localhost,':'))
+               $localhost = substr($localhost,0,strpos($localhost,':'));
+
+               /**
+                *
+                * Be VERY CAREFUL if you make any changes to the following line. Seemingly innocuous changes 
+                * have been known to cause runaway conditions which affected several servers, along with 
+                * permissions issues. 
+                *
+                */
+       if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) {
+               logger('relay denied for delivery agent.');
+
+               /* no relay allowed for direct contact delivery */
+               return;
+       }
+
+       if((strlen($parent['allow_cid'])) 
+               || (strlen($parent['allow_gid'])) 
+               || (strlen($parent['deny_cid'])) 
+               || (strlen($parent['deny_gid']))) {
+               $public_message = false; // private recipients, not public
+       }
+
+       $conversant_str = intval($contact_id);
+
+       $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0",
+               intval($contact_id)
+       );
+
+       if(count($r))
+               $contact = $r[0];
+       
+
+       $feed_template = get_markup_template('atom_feed.tpl');
+       $mail_template = get_markup_template('atom_mail.tpl');
+
+       $atom = '';
+       $slaps = array();
+
+       $hubxml = feed_hublinks();
+
+       $birthday = feed_birthday($owner['uid'],$owner['timezone']);
+
+       if(strlen($birthday))
+               $birthday = '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>';
+
+       $atom .= replace_macros($feed_template, array(
+                       '$version'      => xmlify(FRIENDIKA_VERSION),
+                       '$feed_id'      => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ),
+                       '$feed_title'   => xmlify($owner['name']),
+                       '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) ,
+                       '$hub'          => $hubxml,
+                       '$salmon'       => '',  // private feed, we don't use salmon here
+                       '$name'         => xmlify($owner['name']),
+                       '$profile_page' => xmlify($owner['url']),
+                       '$photo'        => xmlify($owner['photo']),
+                       '$thumb'        => xmlify($owner['thumb']),
+                       '$picdate'      => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) ,
+                       '$uridate'      => xmlify(datetime_convert('UTC','UTC',$owner['uri-date']    . '+00:00' , ATOM_TIME)) ,
+                       '$namdate'      => xmlify(datetime_convert('UTC','UTC',$owner['name-date']   . '+00:00' , ATOM_TIME)) ,
+                       '$birthday'     => $birthday
+       ));
+
+       foreach($items as $item) {
+               if(! $item['parent'])
+                       continue;
+
+               // private emails may be in included in public conversations. Filter them.
+               if(($public_message) && $item['private'])
+                       continue;
+
+               $item_contact = get_item_contact($item,$icontacts);
+               if(! $item_contact)
+                       continue;
+
+               $atom .= atom_entry($item,'text',$item_contact,$owner,true);
+
+               if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) 
+                       $slaps[] = atom_entry($item,'html',$item_contact,$owner,true);
+       }
+
+       $atom .= '</feed>' . "\r\n";
+
+       logger('notifier: ' . $atom, LOGGER_DATA);
+
+       logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA);
+
+
+       require_once('include/salmon.php');
+
+       if($contact['self'])
+               return;
+
+       $deliver_status = 0;
+
+       switch($contact['network']) {
+
+               case NETWORK_DFRN :
+                       logger('notifier: dfrndelivery: ' . $contact['name']);
+                       $deliver_status = dfrn_deliver($owner,$contact,$atom);
+
+                       logger('notifier: dfrn_delivery returns ' . $deliver_status);
+       
+                       if($deliver_status == (-1)) {
+                               logger('notifier: delivery failed: queuing message');
+                               // queue message for redelivery
+                               q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+                                       VALUES ( %d, '%s', '%s', '%s') ",
+                                       intval($contact['id']),
+                                       dbesc(datetime_convert()),
+                                       dbesc(datetime_convert()),
+                                       dbesc($atom)
+                               );
+                       }
+                       break;
+
+               case NETWORK_OSTATUS :
+
+                       // Do not send to otatus if we are not configured to send to public networks
+                       if($owner['prvnets'])
+                               break;
+                       if(get_config('system','ostatus_disabled') || get_config('system','dfrn_only'))
+                               break;
+
+                       // only send salmon if public - e.g. if it's ok to notify
+                       // a public hub, it's ok to send a salmon
+
+                       if((count($slaps)) && ($public_message) && (! $expire)) {
+                               logger('notifier: slapdelivery: ' . $contact['name']);
+                               foreach($slaps as $slappy) {
+                                       if($contact['notify']) {
+                                               $deliver_status = slapper($owner,$contact['notify'],$slappy);
+                                               if($deliver_status == (-1)) {
+                                                       // queue message for redelivery
+                                                       q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+                                                               VALUES ( %d, '%s', '%s', '%s') ",
+                                                               intval($contact['id']),
+                                                               dbesc(datetime_convert()),
+                                                               dbesc(datetime_convert()),
+                                                               dbesc($slappy)
+                                                       );                                                              
+                                               }
+                                       }
+                               }
+                       }
+
+                       break;
+
+               case NETWORK_MAIL :
+                                               
+                       if(get_config('system','dfrn_only'))
+                               break;
+                       // WARNING: does not currently convert to RFC2047 header encodings, etc.
+
+                       $addr = $contact['addr'];
+                       if(! strlen($addr))
+                               break;
+
+                       if($cmd === 'wall-new' || $cmd === 'comment-new') {
+
+                               $it = null;
+                               if($cmd === 'wall-new') 
+                                       $it = $items[0];
+                               else {
+                                       $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", 
+                                               intval($argv[2]),
+                                               intval($uid)
+                                       );
+                                       if(count($r))
+                                               $it = $r[0];
+                               }
+                               if(! $it)
+                                       break;
+                                       
+
+                               $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
+                                       intval($uid)
+                               );
+                               if(! count($local_user))
+                                       break;
+                                       
+                               $reply_to = '';
+                               $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
+                                       intval($uid)
+                               );
+                               if($r1 && $r1[0]['reply_to'])
+                                       $reply_to = $r1[0]['reply_to'];
+
+                               $subject  = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
+                               $headers  = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
+                               if($reply_to)
+                                       $headers .= 'Reply-to: ' . $reply_to . "\n";
+                               $headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
+                               if($it['uri'] !== $it['parent-uri']) {
+                                       $header .= 'References: <' . $it['parent-uri'] . '>' . "\n";
+                                       if(! strlen($it['title'])) {
+                                               $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1",
+                                                       dbesc($it['parent-uri'])
+                                               );
+                                               if(count($r)) {
+                                                       $subtitle = $r[0]['title'];
+                                                       if($subtitle) {
+                                                               if(strncasecmp($subtitle,'RE:',3))
+                                                                       $subject = $subtitle;
+                                                               else
+                                                                       $subject = 'Re: ' . $subtitle;
+                                                       }
+                                               }
+                                       }
+                               }
+                               $headers .= 'MIME-Version: 1.0' . "\n";
+                               $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+                               $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
+                               $html    = prepare_body($it);
+                               $message = '<html><body>' . $html . '</body></html>';
+                               logger('notifier: email delivery to ' . $addr);
+                               mail($addr, $subject, $message, $headers);
+                       }
+                       break;
+
+               case NETWORK_DIASPORA :
+                       logger('delivery: diaspora deliver: ' . $contact['name']);
+
+                       if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
+                               break;
+
+                       if(! $contact['pubkey'])
+                               break;
+                                       
+                       if($target_item['verb'] === ACTIVITY_DISLIKE) {
+                               // unsupported
+                               break;
+                       }
+                       elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
+                       logger('delivery: diaspora retract: ' . $contact['name']);
+                               // diaspora delete, 
+                               diaspora_send_retraction($target_item,$owner,$contact);
+                               break;
+                       }
+                       elseif($target_item['parent'] != $target_item['id']) {
+
+                       logger('delivery: diaspora relay: ' . $contact['name']);
+
+                               // we are the relay - send comments, likes and unlikes to our conversants
+                               diaspora_send_relay($target_item,$owner,$contact);
+                               break;
+                       }               
+                       elseif($top_level) {
+                               logger('delivery: diaspora status: ' . $contact['name']);
+                               diaspora_send_status($target_item,$owner,$contact);
+                               break;
+                       }
+
+                       logger('delivery: diaspora unknown mode: ' . $contact['name']);
+
+                       break;
+
+               case NETWORK_FEED :
+               case NETWORK_FACEBOOK :
+                       if(get_config('system','dfrn_only'))
+                               break;
+               default:
+                       break;
+       }
+
+       return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+  delivery_run($argv,$argc);
+  killme();
+}
index faededa6a4789f6b1136b535a6c14442a92bd7ee..89afc46f90cdb0821682778b3b136993e6433f3a 100644 (file)
@@ -2,6 +2,75 @@
 
 require_once('include/crypto.php');
 require_once('include/items.php');
+require_once('include/bb2diaspora.php');
+require_once('include/contact_selectors.php');
+
+function diaspora_dispatch($importer,$msg) {
+
+       $parsed_xml = parse_xml_string($msg['message'],false);
+
+       $xmlbase = $parsed_xml->post;
+
+       if($xmlbase->request) {
+               diaspora_request($importer,$xmlbase->request);
+       }
+       elseif($xmlbase->status_message) {
+               diaspora_post($importer,$xmlbase->status_message);
+       }
+       elseif($xmlbase->comment) {
+               diaspora_comment($importer,$xmlbase->comment,$msg);
+       }
+       elseif($xmlbase->like) {
+               diaspora_like($importer,$xmlbase->like,$msg);
+       }
+       elseif($xmlbase->retraction) {
+               diaspora_retraction($importer,$xmlbase->retraction,$msg);
+       }
+       elseif($xmlbase->photo) {
+               diaspora_photo($importer,$xmlbase->photo,$msg);
+       }
+       else {
+               logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
+       }
+       return;
+}
+
+function diaspora_get_contact_by_handle($uid,$handle) {
+       $r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
+               dbesc(NETWORK_DIASPORA),
+               intval($uid),
+               dbesc($handle)
+       );
+       if($r && count($r))
+               return $r[0];
+       return false;
+}
+
+function find_diaspora_person_by_handle($handle) {
+       $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
+               dbesc(NETWORK_DIASPORA),
+               dbesc($handle)
+       );
+       if(count($r)) {
+               // update record occasionally so it doesn't get stale
+               $d = strtotime($r[0]['updated'] . ' +00:00');
+               if($d < strtotime('now - 14 days')) {
+                       q("delete from fcontact where id = %d limit 1",
+                               intval($r[0]['id'])
+                       );
+               }
+               else
+                       return $r[0];
+       }
+       require_once('include/Scrape.php');
+       $r = probe_url($handle, PROBE_DIASPORA);
+       if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
+               add_fcontact($r);
+               return ($r);
+       }
+       return false;
+}
+
 
 function get_diaspora_key($uri) {
        logger('Fetching diaspora key for: ' . $uri);
@@ -13,16 +82,6 @@ function get_diaspora_key($uri) {
 }
 
 
-function diaspora_base_message($type,$data) {
-
-       $tpl = get_markup_template('diaspora_' . $type . '.tpl');
-       if(! $tpl) 
-               return '';
-       return replace_macros($tpl,$data);
-
-}
-
-
 function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
        $a = get_app();
 
@@ -77,10 +136,14 @@ EOT;
        $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $outer_aes_key, $decrypted_header, MCRYPT_MODE_CBC, $outer_iv);
 
        $outer_json = json_encode(array('iv' => $b_outer_iv,'key' => $b_outer_aes_key));
+
        $encrypted_outer_key_bundle = '';
        openssl_public_encrypt($outer_json,$encrypted_outer_key_bundle,$pubkey);
-       
+
        $b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle);
+
+       logger('outer_bundle: ' . $b64_encrypted_outer_key_bundle . ' key: ' . $pubkey, LOGGER_DATA);
+
        $encrypted_header_json_object = json_encode(array('aes_key' => base64_encode($encrypted_outer_key_bundle), 
                'ciphertext' => base64_encode($ciphertext)));
        $cipher_json = base64_encode($encrypted_header_json_object);
@@ -159,7 +222,7 @@ function diaspora_decode($importer,$xml) {
         *  </decrypted_header>
         */
 
-       logger('decrypted: ' . $decrypted);
+       logger('decrypted: ' . $decrypted, LOGGER_DEBUG);
        $idom = parse_xml_string($decrypted,false);
 
        $inner_iv = base64_decode($idom->iv);
@@ -257,42 +320,6 @@ function diaspora_decode($importer,$xml) {
 
 }
 
-function diaspora_get_contact_by_handle($uid,$handle) {
-       $r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
-               dbesc(NETWORK_DIASPORA),
-               intval($uid),
-               dbesc($handle)
-       );
-       if($r && count($r))
-               return $r[0];
-       return false;
-}
-
-function find_diaspora_person_by_handle($handle) {
-       $r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
-               dbesc(NETWORK_DIASPORA),
-               dbesc($handle)
-       );
-       if(count($r)) {
-               // update record occasionally so it doesn't get stale
-               $d = strtotime($r[0]['updated'] . ' +00:00');
-               if($d < strtotime('now - 14 days')) {
-                       q("delete from fcontact where id = %d limit 1",
-                               intval($r[0]['id'])
-                       );
-               }
-               else
-                       return $r[0];
-       }
-       require_once('include/Scrape.php');
-       $r = probe_url($handle, PROBE_DIASPORA);
-       if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
-               add_fcontact($r);
-               return ($r);
-       }
-       return false;
-}
-
        
 
 function diaspora_request($importer,$xml) {
@@ -390,8 +417,10 @@ function diaspora_post($importer,$xml) {
                dbesc($message_id),
                dbesc($guid)
        );
-       if(count($r))
+       if(count($r)) {
+               logger('diaspora_post: message exists: ' . $guid);
                return;
+       }
 
     // allocate a guid on our system - we aren't fixing any collisions.
        // we're ignoring them
@@ -408,32 +437,7 @@ function diaspora_post($importer,$xml) {
        $created = unxmlify($xml->created_at);
        $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
 
-       $body = unxmlify($xml->raw_message);
-
-       require_once('library/HTMLPurifier.auto.php');
-       require_once('include/html2bbcode.php');
-
-       $maxlen = get_max_import_size();
-       if($maxlen && (strlen($body) > $maxlen))
-               $body = substr($body,0, $maxlen);
-
-       if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
-
-               $body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
-                       '[youtube]$1[/youtube]', $body);
-
-               $body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
-                       '[youtube]$1[/youtube]', $body);
-
-               $body = oembed_html2bbcode($body);
-
-               $config = HTMLPurifier_Config::createDefault();
-               $config->set('Cache.DefinitionImpl', null);
-               $purifier = new HTMLPurifier($config);
-               $body = $purifier->purify($body);
-
-               $body = html2bbcode($body);
-       }
+       $body = diaspora2bb($xml->raw_message);
 
        $datarray = array();
        $datarray['uid'] = $importer['uid'];
@@ -451,8 +455,16 @@ function diaspora_post($importer,$xml) {
        $datarray['author-link'] = $contact['url'];
        $datarray['author-avatar'] = $contact['thumb'];
        $datarray['body'] = $body;
+       $datarray['app']  = 'Diaspora';
 
-       item_store($datarray);
+       $message_id = item_store($datarray);
+
+       if($message_id) {
+               q("update item set plink = '%s' where id = %d limit 1",
+                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+                       intval($message_id)
+               );
+       }
 
        return;
 
@@ -472,8 +484,10 @@ function diaspora_comment($importer,$xml,$msg) {
        $text = $xml->text;
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
-       if(! $contact)
+       if(! $contact) {
+               logger('diaspora_comment: cannot find contact: ' . $msg['author']);
                return;
+       }
 
        if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
                logger('diaspora_comment: Ignoring this author.');
@@ -481,6 +495,15 @@ function diaspora_comment($importer,$xml,$msg) {
                // NOTREACHED
        }
 
+       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+               intval($importer['uid']),
+               dbesc($guid)
+       );
+       if(count($r)) {
+               logger('diaspora_comment: our comment just got relayed back to us (or there was a guid collision) : ' . $guid);
+               return;
+       }
+
        $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
                intval($importer['uid']),
                dbesc($parent_guid)
@@ -517,7 +540,7 @@ function diaspora_comment($importer,$xml,$msg) {
 
 
        if($parent_author_signature) {
-               $owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $msg['author'];
+               $owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
 
                $parent_author_signature = base64_decode($parent_author_signature);
 
@@ -531,32 +554,7 @@ function diaspora_comment($importer,$xml,$msg) {
 
        // Phew! Everything checks out. Now create an item.
 
-       require_once('library/HTMLPurifier.auto.php');
-       require_once('include/html2bbcode.php');
-
-       $body = $text;
-
-       $maxlen = get_max_import_size();
-       if($maxlen && (strlen($body) > $maxlen))
-               $body = substr($body,0, $maxlen);
-
-       if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
-
-               $body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
-                       '[youtube]$1[/youtube]', $body);
-
-               $body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
-                       '[youtube]$1[/youtube]', $body);
-
-               $body = oembed_html2bbcode($body);
-
-               $config = HTMLPurifier_Config::createDefault();
-               $config->set('Cache.DefinitionImpl', null);
-               $purifier = new HTMLPurifier($config);
-               $body = $purifier->purify($body);
-
-               $body = html2bbcode($body);
-       }
+       $body = diaspora2bb($text);
 
        $message_id = $diaspora_handle . ':' . $guid;
 
@@ -581,9 +579,17 @@ function diaspora_comment($importer,$xml,$msg) {
        $datarray['author-link'] = $person['url'];
        $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
        $datarray['body'] = $body;
+       $datarray['app']  = 'Diaspora';
 
        $message_id = item_store($datarray);
 
+       if($message_id) {
+               q("update item set plink = '%s' where id = %d limit 1",
+                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+                       intval($message_id)
+               );
+       }
+
        if(! $parent_author_signature) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
                        intval($message_id),
@@ -591,13 +597,67 @@ function diaspora_comment($importer,$xml,$msg) {
                        dbesc(base64_encode($author_signature)),
                        dbesc($diaspora_handle)
                );
-       }
 
-       // notify others
+               // if the message isn't already being relayed, notify others
+               // the existence of parent_author_signature means the parent_author or owner
+               // is already relaying.
+
+               proc_run('php','include/notifier.php','comment',$message_id);
+       }
        return;
+}
+
+function diaspora_photo($importer,$xml,$msg) {
 
+       $remote_photo_path = notags(unxmlify($xml->remote_photo_path));
+
+       $remote_photo_name = notags(unxmlify($xml->remote_photo_name));
+
+       $status_message_guid = notags(unxmlify($xml->status_message_guid));
+
+       $guid = notags(unxmlify($xml->guid));
+
+       $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+       $public = notags(unxmlify($xml->public));
+
+       $created_at = notags(unxmlify($xml_created_at));
+
+
+       $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
+       if(! $contact)
+               return;
+
+       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
+               logger('diaspora_photo: Ignoring this author.');
+               http_status_exit(202);
+               // NOTREACHED
+       }
+
+       $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
+               intval($importer['uid']),
+               dbesc($status_message_guid)
+       );
+       if(! count($r)) {
+               logger('diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
+               return;
+       }
+       $parent_item = $r[0];
+
+       $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
+
+       $r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1",
+               dbesc($link_text . $parent_item['body']),
+               intval($parent_item['id']),
+               intval($parent_item['uid'])
+       );
+
+       return;
 }
 
+
+
+
 function diaspora_like($importer,$xml,$msg) {
 
        $a = get_app();
@@ -616,8 +676,10 @@ function diaspora_like($importer,$xml,$msg) {
                return;
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
-       if(! $contact)
+       if(! $contact) {
+               logger('diaspora_like: cannot find contact: ' . $msg['author']);
                return;
+       }
 
        if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
                logger('diaspora_like: Ignoring this author.');
@@ -660,7 +722,7 @@ function diaspora_like($importer,$xml,$msg) {
                return; 
        }
 
-       $author_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $diaspora_handle;
+       $author_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
 
        $author_signature = base64_decode($author_signature);
 
@@ -680,11 +742,12 @@ function diaspora_like($importer,$xml,$msg) {
 
        if(! rsa_verify($author_signed_data,$author_signature,$key,'sha')) {
                logger('diaspora_like: verification failed.');
-//             return;
+               return;
        }
 
        if($parent_author_signature) {
-               $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author'];
+
+               $owner_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
 
                $parent_author_signature = base64_decode($parent_author_signature);
 
@@ -692,7 +755,7 @@ function diaspora_like($importer,$xml,$msg) {
 
                if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha')) {
                        logger('diaspora_like: owner verification failed.');
-//                     return;
+                       return;
                }
        }
 
@@ -744,6 +807,8 @@ EOT;
        $plink = '[url=' . $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $parent_item['id'] . ']' . $post_type . '[/url]';
        $arr['body'] =  sprintf( $bodyverb, $ulink, $alink, $plink );
 
+       $arr['app']  = 'Diaspora';
+
        $arr['private'] = $parent_item['private'];
        $arr['verb'] = $activity;
        $arr['object-type'] = $objtype;
@@ -754,6 +819,14 @@ EOT;
 
        $message_id = item_store($arr);
 
+
+       if($message_id) {
+               q("update item set plink = '%s' where id = %d limit 1",
+                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+                       intval($message_id)
+               );
+       }
+
        if(! $parent_author_signature) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
                        intval($message_id),
@@ -763,7 +836,12 @@ EOT;
                );
        }
 
-       // FIXME send notification
+       // if the message isn't already being relayed, notify others
+       // the existence of parent_author_signature means the parent_author or owner
+       // is already relaying.
+
+       if(! $parent_author_signature)
+               proc_run('php','include/notifier.php','comment',$message_id);
 
        return;
 }
@@ -772,19 +850,32 @@ function diaspora_retraction($importer,$xml) {
 
        $guid = notags(unxmlify($xml->guid));
        $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+       $type = notags(unxmlify($xml->type));
 
        $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
        if(! $contact)
                return;
 
-//     if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
-//             logger('diaspora_retraction: Ignoring this author.');
-//             http_status_exit(202);
-//             // NOTREACHED
-//     }
-
-
+       if($type === 'Person') {
+               contact_remove($contact['id']);
+       }
+       elseif($type === 'Post') {
+               $r = q("select * from item where guid = '%s' and uid = %d limit 1",
+                       dbesc('guid'),
+                       intval($importer['uid'])
+               );
+               if(count($r)) {
+                       if(link_compare($r[0]['author-link'],$contact['url'])) {
+                               q("update item set `deleted` = 1, `changed` = '%s' where `id` = %d limit 1",
+                                       dbesc(datetime_convert()),                      
+                                       intval($r[0]['id'])
+                               );
+                       }
+               }
+       }
 
+       http_exit_status(202);
+       // NOTREACHED
 }
 
 function diaspora_share($me,$contact) {
@@ -800,24 +891,59 @@ function diaspora_share($me,$contact) {
 
        $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])));
 
-       post_url($contact['notify'] . '/',$slap);
-       $return_code = $a->get_curl_code();
-       logger('diaspora_send_share: returns: ' . $return_code);
-       return $return_code;
+       return(diaspora_transmit($owner,$contact,$slap));
 }
 
+function diaspora_unshare($me,$contact) {
+
+       $a = get_app();
+       $myaddr = $me['nickname'] . '@' .  substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+
+       $tpl = get_markup_template('diaspora_retract.tpl');
+       $msg = replace_macros($tpl, array(
+               '$guid'   => $me['guid'],
+               '$type'   => 'Person',
+               '$handle' => $myaddr
+       ));
+
+       $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])));
+
+       return(diaspora_transmit($owner,$contact,$slap));
+
+}
+
+
+
 function diaspora_send_status($item,$owner,$contact) {
 
        $a = get_app();
        $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
        $theiraddr = $contact['addr'];
-       require_once('include/bbcode.php');
 
-       $body = xmlify(bbcode($item['body']));
+       $images = array();
+
+       $body = $item['body'];
+
+       $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER);
+       if($cnt) {
+               foreach($matches as $mtch) {
+                       $detail = array();
+                       $detail['str'] = $mtch[0];
+                       $detail['path'] = dirname($mtch[1]) . '/';
+                       $detail['file'] = basename($mtch[1]);
+                       $detail['guid'] = $item['guid'];
+                       $detail['handle'] = $myaddr;
+                       $images[] = $detail;
+                       $body = str_replace($detail['str'],t('link'),$body);
+               }
+       }       
+
+       $body = xmlify(html_entity_decode(bb2diaspora($body)));
+
        $public = (($item['private']) ? 'false' : 'true');
 
        require_once('include/datetime.php');
-       $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d h:i:s \U\T\C');
+       $created = datetime_convert('UTC','UTC',$item['created'],'Y-m-d H:i:s \U\T\C');
 
        $tpl = get_markup_template('diaspora_post.tpl');
        $msg = replace_macros($tpl, array(
@@ -828,17 +954,59 @@ function diaspora_send_status($item,$owner,$contact) {
                '$created' => $created
        ));
 
-       logger('diaspora_send_status: base message: ' . $msg, LOGGER_DATA);
+       logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA);
 
        $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
 
-       post_url($contact['notify'] . '/',$slap);
-       $return_code = $a->get_curl_code();
-       logger('diaspora_send_status: returns: ' . $return_code);
+       $return_code = diaspora_transmit($owner,$contact,$slap);
+
+       if(count($images)) {
+               diaspora_send_images($item,$owner,$contact,$images);
+       }
+
        return $return_code;
 }
 
 
+function diaspora_send_images($item,$owner,$contact,$images) {
+       $a = get_app();
+       if(! count($images))
+               return;
+       $mysite = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://') + 3) . '/photo';
+
+       $tpl = get_markup_template('diaspora_photo.tpl');
+       foreach($images as $image) {
+               if(! stristr($image['path'],$mysite))
+                       continue;
+               $resource = str_replace('.jpg','',$image['file']);
+               $resource = substr($resource,0,strpos($resource,'-'));
+
+               $r = q("select * from photo where `resource-id` = '%s' and `uid` = %d limit 1",
+                       dbesc($resource),
+                       intval($owner['uid'])
+               );
+               if(! count($r))
+                       continue;
+               $public = (($r[0]['allow_cid'] || $r[0]['allow_gid'] || $r[0]['deny_cid'] || $r[0]['deny_gid']) ? 'false' : 'true' );
+               $msg = replace_macros($tpl,array(               
+                       '$path' => xmlify($image['path']),
+                       '$filename' => xmlify($image['file']),
+                       '$msg_guid' => xmlify($image['guid']),
+                       '$guid' => xmlify($r[0]['guid']),
+                       '$handle' => xmlify($image['handle']),
+                       '$public' => xmlify($public),
+                       '$created_at' => xmlify(datetime_convert('UTC','UTC',$r[0]['created'],'Y-m-d H:i:s \U\T\C'))
+               ));
+
+
+               logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA);
+               $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+
+               diaspora_transmit($owner,$contact,$slap);
+       }
+
+}
+
 function diaspora_send_followup($item,$owner,$contact) {
 
        $a = get_app();
@@ -864,16 +1032,16 @@ function diaspora_send_followup($item,$owner,$contact) {
                $like = false;
        }
 
-       $text = bbcode($item['body']);
+       $text = html_entity_decode(bb2diaspora($item['body']));
 
        // sign it
 
        if($like)
-               $signed_text = $item['guid'] . ';' . $target_type . ';' . $positive . ';' . $myaddr;
+               $signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
        else
                $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
 
-       $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey']),'sha');
+       $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
 
        $msg = replace_macros($tpl,array(
                '$guid' => xmlify($item['guid']),
@@ -889,11 +1057,7 @@ function diaspora_send_followup($item,$owner,$contact) {
 
        $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
 
-       post_url($contact['notify'] . '/',$slap);
-       $return_code = $a->get_curl_code();
-       logger('diaspora_send_followup: returns: ' . $return_code);
-       return $return_code;
-
+       return(diaspora_transmit($owner,$contact,$slap));
 }
 
 
@@ -913,14 +1077,6 @@ function diaspora_send_relay($item,$owner,$contact) {
        else
                return;
 
-       // fetch the original signature 
-       $r = q("select * from sign where iid = %d limit 1",
-               intval($item['id'])
-       );
-       if(! count($r)) 
-               return;
-       $orig_sign = $r[0];
-
        if($item['verb'] === ACTIVITY_LIKE) {
                $tpl = get_markup_template('diaspora_like_relay.tpl');
                $like = true;
@@ -932,14 +1088,59 @@ function diaspora_send_relay($item,$owner,$contact) {
                $like = false;
        }
 
-       $text = bbcode($item['body']);
+       $body = $item['body'];
 
-       // sign it
+       $text = html_entity_decode(bb2diaspora($body));
 
-       if($like)
-               $parent_signed_text = $orig_sign['signed_text'];
-       else
-               $parent_signed_text = $orig_sign['signed_text'];
+       // fetch the original signature if somebody sent the post to us to relay
+       // If we are relaying for a reply originating on our own account, there wasn't a 'send to relay'
+       // action. It wasn't needed. In that case create the original signature and the 
+       // owner (parent author) signature
+       // comments from other networks will be relayed under our name, with a brief 
+       // preamble to describe what's happening and noting the real author
+
+       $r = q("select * from sign where iid = %d limit 1",
+               intval($item['id'])
+       );
+       if(count($r)) { 
+               $orig_sign = $r[0];
+               $signed_text = $orig_sign['signed_text'];
+               $authorsig = $orig_sign['signature'];
+               $handle = $orig_sign['signer'];
+       }
+       else {
+
+               $itemcontact = q("select * from contact where `id` = %d limit 1",
+                       intval($item['contact-id'])
+               );
+               if(count($itemcontact)) {
+                       if(! $itemcontact[0]['self']) {
+                               $prefix = sprintf( t('[Relayed] Comment authored by %s from network %s'),
+                                       '['. $item['author-name'] . ']' . '(' . $item['author-link'] . ')',  
+                                       network_to_name($itemcontact['network'])) . "\n";
+                               $body = $prefix . $body;
+                       }
+               }
+               else {
+
+                       if($like)
+                               $signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
+                       else
+                               $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
+
+                       $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
+
+                       q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+                               intval($item['id']),
+                               dbesc($signed_text),
+                               dbesc(base64_encode($authorsig)),
+                               dbesc($myaddr)
+                       );
+                       $handle = $myaddr;
+               }
+       }
+
+       // sign it
 
        $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
 
@@ -949,26 +1150,16 @@ function diaspora_send_relay($item,$owner,$contact) {
                '$target_type' =>xmlify($target_type),
                '$authorsig' => xmlify($orig_sign['signature']),
                '$parentsig' => xmlify($parentauthorsig),
-               '$text' => xmlify($text),
+               '$body' => xmlify($text),
                '$positive' => xmlify($positive),
-               '$diaspora_handle' => xmlify($myaddr)
+               '$handle' => xmlify($handle)
        ));
 
-       // fetch the original signature 
-       $r = q("select * from sign where iid = %d limit 1",
-               intval($item['id'])
-       );
-       if(! count($r)) 
-               return;
-
        logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA);
 
        $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
 
-       post_url($contact['notify'] . '/',$slap);
-       $return_code = $a->get_curl_code();
-       logger('diaspora_send_relay: returns: ' . $return_code);
-       return $return_code;
+       return(diaspora_transmit($owner,$contact,$slap));
 
 }
 
@@ -976,8 +1167,42 @@ function diaspora_send_relay($item,$owner,$contact) {
 
 function diaspora_send_retraction($item,$owner,$contact) {
 
+       $a = get_app();
+       $myaddr = $owner['nickname'] . '@' .  substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+
+       $tpl = get_markup_template('diaspora_retract.tpl');
+       $msg = replace_macros($tpl, array(
+               '$guid'   => $item['guid'],
+               '$type'   => 'Post',
+               '$handle' => $myaddr
+       ));
+
+       $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
+
+       return(diaspora_transmit($owner,$contact,$slap));
+}
 
 
 
+function diaspora_transmit($owner,$contact,$slap) {
 
-}
\ No newline at end of file
+       $a = get_app();
+
+       post_url($contact['notify'] . '/',$slap);
+       $return_code = $a->get_curl_code();
+       logger('diaspora_transmit: returns: ' . $return_code);
+
+       if(! $return_code) {
+               logger('diaspora_transmit: queue message');
+               // queue message for redelivery
+               q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
+                       VALUES ( %d, '%s', '%s', '%s') ",
+                       intval($contact['id']),
+                       dbesc(datetime_convert()),
+                       dbesc(datetime_convert()),
+                       dbesc($slap)
+               );
+       }
+
+       return(($return_code) ? $return_code : (-1));
+}
index 1ebae7b7b07f8a02e2e674f2cc133def7d94bb3a..f21ce42e09f95ff89c223a0007dbf43a10852cc3 100644 (file)
@@ -124,9 +124,10 @@ function group_public_members($gid) {
                $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member` 
                        LEFT JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id` 
                        WHERE `gid` = %d AND `group_member`.`uid` = %d 
-                       AND `contact`.`network` != 'dfrn' AND `contact`.`network` != 'mail' AND `contact`.`network` != 'face' ",
+                       AND ( `contact`.`network` = '%s' OR `contact`.`notify` = '' )",
                        intval($gid),
-                       intval(local_user())
+                       intval(local_user()),
+                       dbesc(NETWORK_OSTATUS)
                );              
                if(count($r))
                        $ret = count($r);
index 746e3b2944fc2769ec5090afc83042fe091c0238..6ded6f87c4cf8f0b01e0797e50e9e445d3a8a827 100644 (file)
@@ -12,6 +12,20 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
        if(! strlen($owner_nick))
                killme();
 
+       $public_feed = (($dfrn_id) ? false : true);
+       $starred = false;
+       $converse = false;
+
+       if($public_feed && $a->argc > 2) {
+               for($x = 2; $x < $a->argc; $x++) {
+                       if($a->argv[$x] == 'converse')
+                               $converse = true;
+                       if($a->argv[$x] == 'starred')
+                               $starred = true;
+               }
+       }
+
+
        $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid`  = '' AND `deny_gid`  = '' ";
 
        $r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`
@@ -29,7 +43,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
 
        $birthday = feed_birthday($owner_id,$owner['timezone']);
 
-       if(strlen($dfrn_id)) {
+       if(! $public_feed) {
 
                $sql_extra = '';
                switch($direction) {
@@ -81,7 +95,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
                );
        }
 
-       if($dfrn_id === '' || $dfrn_id === '*')
+       if($public_feed)
                $sort = 'DESC';
        else
                $sort = 'ASC';
@@ -89,14 +103,21 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
        if(! strlen($last_update))
                $last_update = 'now -30 days';
 
+       if($public_feed) {
+               if(! $converse)
+                       $sql_extra .= " AND `contact`.`self` = 1 ";
+       }
+
        $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');
 
        $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, 
                `contact`.`name`, `contact`.`photo`, `contact`.`url`, 
                `contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
                `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, 
-               `contact`.`id` AS `contact-id`, `contact`.`uid` AS `contact-uid`
+               `contact`.`id` AS `contact-id`, `contact`.`uid` AS `contact-uid`,
+               `sign`.`signed_text`, `sign`.`signature`, `sign`.`signer`
                FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
+               LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
                WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`parent` != 0 
                AND `item`.`wall` = 1 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
                AND ( `item`.`edited` > '%s' OR `item`.`changed` > '%s' )
@@ -152,7 +173,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
 
                // public feeds get html, our own nodes use bbcode
 
-               if($dfrn_id === '') {
+               if($public_feed) {
                        $type = 'html';
                        // catch any email that's in a public conversation and make sure it doesn't leak
                        if($item['private'])
@@ -346,6 +367,18 @@ function get_atom_elements($feed,$item) {
                        $res['app'] = 'OStatus';
        }                  
 
+       // base64 encoded json structure representing Diaspora signature
+
+       $dsig = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_signature');
+       if($dsig) {
+               $res['dsprsig'] = unxmlify($dsig[0]['data']);
+       }
+
+       $dguid = $item->get_item_tags(NAMESPACE_DFRN,'diaspora_guid');
+       if($dguid)
+               $res['guid'] = unxmlify($dguid[0]['data']);
+
+
        /**
         * If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it.
         */
@@ -642,6 +675,15 @@ function encode_rel_links($links) {
 
 function item_store($arr,$force_parent = false) {
 
+       // If a Diaspora signature structure was passed in, pull it out of the 
+       // item array and set it aside for later storage.
+
+       $dsprsig = null;
+       if(x($arr,'dsprsig')) {
+               $dsprsig = json_decode(base64_decode($arr['dsprsig']));
+               unset($arr['dsprsig']);
+       }
+
        if($arr['gravity'])
                $arr['gravity'] = intval($arr['gravity']);
        elseif($arr['parent-uri'] == $arr['uri'])
@@ -818,6 +860,16 @@ function item_store($arr,$force_parent = false) {
                intval($current_post)
        );
 
+       if($dsprsig) {
+               q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+                       intval($current_post),
+                       dbesc($dsprsig->signed_text),
+                       dbesc($dsprsig->signature),
+                       dbesc($dsprsig->signer)
+               );
+       }
+
+
        /**
         * If this is now the last-child, force all _other_ children of this parent to *not* be last-child
         */
@@ -877,7 +929,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
        if(! $curl_stat)
                return(-1); // timed out
 
-       logger('dfrn_deliver: ' . $xml);
+       logger('dfrn_deliver: ' . $xml, LOGGER_DATA);
 
        if(! $xml)
                return 3;
@@ -941,7 +993,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
                $key = substr(random_string(),0,16);
                $data = bin2hex(aes_encrypt($postvars['data'],$key));
                $postvars['data'] = $data;
-               logger('rino: sent key = ' . $key);     
+               logger('rino: sent key = ' . $key, LOGGER_DEBUG);       
 
 
                if($dfrn_version >= 2.1) {      
@@ -1556,7 +1608,7 @@ function subscribe_to_hub($url,$importer,$contact) {
                        intval($importer['uid'])
                );
        }
-       if(! count($r))
+       if((! count($r)) || $contact['network'] === NETWORK_DIASPORA)
                return;
 
        $push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
@@ -1653,10 +1705,19 @@ function atom_entry($item,$type,$author,$owner,$comment = false) {
                $o .= '<dfrn:private>1</dfrn:private>' . "\r\n";
 
        if($item['extid'])
-               $o .= '<dfrn:extid>' . $item['extid'] . '</dfrn:extid>' . "\r\n";
+               $o .= '<dfrn:extid>' . xmlify($item['extid']) . '</dfrn:extid>' . "\r\n";
 
        if($item['app'])
-               $o .= '<statusnet:notice_info local_id="' . $item['id'] . '" source="' . $item['app'] . '" ></statusnet:notice_info>';
+               $o .= '<statusnet:notice_info local_id="' . $item['id'] . '" source="' . xmlify($item['app']) . '" ></statusnet:notice_info>' . "\r\n";
+
+       if($item['guid'])
+               $o .= '<dfrn:diaspora_guid>' . $item['guid'] . '</dfrn:diaspora_guid>' . "\r\n";
+
+       if($item['signed_text']) {
+               $sign = base64_encode(json_encode(array('signed_text' => $item['signed_text'],'signature' => $item['signature'],'signer' => $item['signer'])));
+               $o .= '<dfrn:diaspora_signature>' . xmlify($sign) . '</dfrn:diaspora_signature>' . "\r\n";
+       }
+
        $verb = construct_verb($item);
        $o .= '<as:verb>' . xmlify($verb) . '</as:verb>' . "\r\n";
        $actobj = construct_activity_object($item);
index d4f0d8aa76ba359d590c21a564c5ba932640f685..2832ae2d33660e75c27c8ed30bb302bea9ccd329 100644 (file)
@@ -9,37 +9,37 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
 
        $a = get_app();
 
-       $ch = curl_init($url);
+       $ch = @curl_init($url);
        if(($redirects > 8) || (! $ch)) 
                return false;
 
-       curl_setopt($ch, CURLOPT_HEADER, true);
-       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
-       curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+       @curl_setopt($ch, CURLOPT_HEADER, true);
+       @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+       @curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
 
        if(intval($timeout)) {
-               curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+               @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        }
        else {
                $curl_time = intval(get_config('system','curl_timeout'));
-               curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+               @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
        }
        // by default we will allow self-signed certs
        // but you can override this
 
        $check_cert = get_config('system','verifyssl');
-       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+       @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
 
        $prx = get_config('system','proxy');
        if(strlen($prx)) {
-               curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
-               curl_setopt($ch, CURLOPT_PROXY, $prx);
-               $prxusr = get_config('system','proxyuser');
+               @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+               @curl_setopt($ch, CURLOPT_PROXY, $prx);
+               $prxusr = @get_config('system','proxyuser');
                if(strlen($prxusr))
-                       curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+                       @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
        }
        if($binary)
-               curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
+               @curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
 
        $a->set_curl_code(0);
 
@@ -49,7 +49,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
        $s = @curl_exec($ch);
 
        $base = $s;
-       $curl_info = curl_getinfo($ch);
+       $curl_info = @curl_getinfo($ch);
        $http_code = $curl_info['http_code'];
 
        $header = '';
@@ -80,7 +80,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
 
        $a->set_curl_headers($header);
 
-       curl_close($ch);
+       @curl_close($ch);
        return($body);
 }}
 
@@ -508,7 +508,7 @@ function fetch_xrd_links($url) {
 
        $xrd_timeout = intval(get_config('system','xrd_timeout'));
        $redirects = 0;
-       $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30));
+       $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 20));
 
        logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
 
@@ -536,7 +536,7 @@ function fetch_xrd_links($url) {
                        $aliases = array($alias);
                else
                        $aliases = $alias;
-               if($aliases && count($aliases)) {
+               if(is_array($aliases) && count($aliases)) {
                        foreach($aliases as $alias) {
                                $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
                        }
index cf8871fb9db6db03546101dc9a29539bffaaf350..8d2aa961cf2fb41330a26fc2b392bde53be68fb4 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 require_once("boot.php");
 
 function notifier_run($argv, $argc){
@@ -35,7 +36,6 @@ function notifier_run($argv, $argc){
        $cmd = $argv[1];
 
        switch($cmd) {
-
                case 'mail':
                default:
                        $item_id = intval($argv[2]);
@@ -46,6 +46,8 @@ function notifier_run($argv, $argc){
        }
 
        $expire = false;
+       $mail = false;
+       $fsuggest = false;
        $top_level = false;
        $recipients = array();
        $url_recipients = array();
@@ -54,6 +56,7 @@ function notifier_run($argv, $argc){
 
        if($cmd === 'mail') {
                $normal_mode = false;
+               $mail = true;
                $message = q("SELECT * FROM `mail` WHERE `id` = %d LIMIT 1",
                                intval($item_id)
                );
@@ -79,6 +82,8 @@ function notifier_run($argv, $argc){
        }
        elseif($cmd === 'suggest') {
                $normal_mode = false;
+               $fsuggest = true;
+
                $suggest = q("SELECT * FROM `fsuggest` WHERE `id` = %d LIMIT 1",
                        intval($item_id)
                );
@@ -104,7 +109,8 @@ function notifier_run($argv, $argc){
                $uid = $r[0]['uid'];
                $updated = $r[0]['edited'];
 
-               $items = q("SELECT * FROM `item` WHERE `parent` = %d ORDER BY `id` ASC",
+               $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` 
+                       FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d ORDER BY `id` ASC",
                        intval($parent_id)
                );
 
@@ -119,8 +125,10 @@ function notifier_run($argv, $argc){
                                $item['deleted'] = 1;
                }
 
-               if(count($items) == 1 && $items[0]['uri'] === $items[0]['parent-uri'])
+               if((count($items) == 1) && ($items[0]['uri'] === $items[0]['parent-uri'])) {
+                       logger('notifier: top level post');
                        $top_level = true;
+               }
        }
 
        $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, 
@@ -139,21 +147,51 @@ function notifier_run($argv, $argc){
        $hub = get_config('system','huburl');
 
        // If this is a public conversation, notify the feed hub
-       $notify_hub = true;
+       $public_message = true;
 
        // fill this in with a single salmon slap if applicable
        $slap = '';
 
-       if($cmd != 'mail' && $cmd != 'suggest') {
+       if(! ($mail || $fsuggest)) {
 
                require_once('include/group.php');
 
                $parent = $items[0];
 
-               if($parent['wall'] == 0 && (! $expire)) {
+               // This is IMPORTANT!!!!
+
+               // We will only send a "notify owner to relay" or followup message if the referenced post
+               // originated on our system by virtue of having our hostname somewhere
+               // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere.
+               // if $parent['wall'] == 1 we will already have the parent message in our array
+               // and we will relay the whole lot.
+               // expire sends an entire group of expire messages and cannot be forwarded.
+               // However the conversation owner will be a part of the conversation and will 
+               // be notified during this run.
+               // Other DFRN conversation members will be alerted during polled updates.
+
+               // Diaspora members currently are not notified of expirations, and other networks have
+               // either limited or no ability to process deletions. We should at least fix Diaspora 
+               // by stringing togther an array of retractions and sending them onward.
+                
+       
+               $localhost = $a->get_hostname();
+               if(strpos($localhost,':'))
+                       $localhost = substr($localhost,0,strpos($localhost,':'));
+
+               /**
+                *
+                * Be VERY CAREFUL if you make any changes to the following line. Seemingly innocuous changes 
+                * have been known to cause runaway conditions which affected several servers, along with 
+                * permissions issues. 
+                *
+                */
+               if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) {
                        // local followup to remote post
                        $followup = true;
-                       $notify_hub = false; // not public
+                       $public_message = false; // not public
                        $conversant_str = dbesc($parent['contact-id']);
                }
                else {
@@ -163,7 +201,7 @@ function notifier_run($argv, $argc){
                                || (strlen($parent['allow_gid'])) 
                                || (strlen($parent['deny_cid'])) 
                                || (strlen($parent['deny_gid']))) {
-                               $notify_hub = false; // private recipients, not public
+                               $public_message = false; // private recipients, not public
                        }
 
                        $allow_people = expand_acl($parent['allow_cid']);
@@ -177,7 +215,7 @@ function notifier_run($argv, $argc){
                                $recipients[] = $item['contact-id'];
                                $conversants[] = $item['contact-id'];
                                // pull out additional tagged people to notify (if public message)
-                               if($notify_hub && strlen($item['inform'])) {
+                               if($public_message && strlen($item['inform'])) {
                                        $people = explode(',',$item['inform']);
                                        foreach($people as $person) {
                                                if(substr($person,0,4) === 'cid:') {
@@ -205,7 +243,6 @@ function notifier_run($argv, $argc){
 
                $r = q("SELECT * FROM `contact` WHERE `id` IN ( $conversant_str ) AND `blocked` = 0 AND `pending` = 0");
 
-
                if(count($r))
                        $contacts = $r;
        }
@@ -240,8 +277,8 @@ function notifier_run($argv, $argc){
                        '$birthday'     => $birthday
        ));
 
-       if($cmd === 'mail') {
-               $notify_hub = false;  // mail is  not public
+       if($mail) {
+               $public_message = false;  // mail is  not public
 
                $body = fix_private_photos($item['body'],$owner['uid']);
 
@@ -256,8 +293,8 @@ function notifier_run($argv, $argc){
                        '$parent_id'    => xmlify($item['parent-uri'])
                ));
        }
-       elseif($cmd === 'suggest') {
-               $notify_hub = false;  // suggestions are not public
+       elseif($fsuggest) {
+               $public_message = false;  // suggestions are not public
 
                $sugg_template = get_markup_template('atom_suggest.tpl');
 
@@ -296,7 +333,7 @@ function notifier_run($argv, $argc){
 
                                // private emails may be in included in public conversations. Filter them.
 
-                               if(($notify_hub) && $item['private'])
+                               if(($public_message) && $item['private'])
                                        continue;
 
                                $contact = get_item_contact($item,$contacts);
@@ -305,7 +342,7 @@ function notifier_run($argv, $argc){
 
                                $atom .= atom_entry($item,'text',$contact,$owner,true);
 
-                               if(($top_level) && ($notify_hub) && ($item['author-link'] === $item['owner-link']) && (! $expire)) 
+                               if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) 
                                        $slaps[] = atom_entry($item,'html',$contact,$owner,true);
                        }
                }
@@ -344,17 +381,43 @@ function notifier_run($argv, $argc){
                dbesc($recip_str)
        );
 
-       // delivery loop
 
        require_once('include/salmon.php');
 
+       $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
+
+       // delivery loop
+
        if(count($r)) {
+
+               foreach($r as $contact) {
+                       if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) {
+                               q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )",
+                                       dbesc($cmd),
+                                       intval($item_id),
+                                       intval($contact['id'])
+                               );
+                       }
+               }
+
                foreach($r as $contact) {
                        if($contact['self'])
                                continue;
 
+                       // potentially more than one recipient. Start a new process and space them out a bit.
+                       // we will deliver single recipient types of message and email receipients here. 
+
+                       if((! $mail) && (! $fsuggest) && (! $followup)) {
+                               proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']);
+                               if($interval)
+                                       @time_sleep_until(microtime(true) + (float) $interval);
+                               continue;
+                       }
+
                        $deliver_status = 0;
 
+                       logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest");
+
                        switch($contact['network']) {
                                case NETWORK_DFRN:
                                        logger('notifier: dfrndelivery: ' . $contact['name']);
@@ -403,7 +466,7 @@ function notifier_run($argv, $argc){
                                                // only send salmon if public - e.g. if it's ok to notify
                                                // a public hub, it's ok to send a salmon
 
-                                               if((count($slaps)) && ($notify_hub) && (! $expire)) {
+                                               if((count($slaps)) && ($public_message) && (! $expire)) {
                                                        logger('notifier: slapdelivery: ' . $contact['name']);
                                                        foreach($slaps as $slappy) {
                                                                if($contact['notify']) {
@@ -505,12 +568,15 @@ function notifier_run($argv, $argc){
                                        require_once('include/diaspora.php');
                                        if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
                                                break;
+
+                                       if(! $contact['pubkey'])
+                                               break;
                                        
                                        if($target_item['verb'] === ACTIVITY_DISLIKE) {
                                                // unsupported
                                                break;
                                        }
-                                       elseif($target_item['deleted'] && (! $parent_item['verb'] === ACTIVITY_LIKE)) {
+                                       elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
                                                // diaspora delete, 
                                                diaspora_send_retraction($target_item,$owner,$contact);
                                                break;
@@ -544,7 +610,7 @@ function notifier_run($argv, $argc){
                
        // send additional slaps to mentioned remote tags (@foo@example.com)
 
-       if($slap && count($url_recipients) && ($followup || $top_level) && $notify_hub && (! $expire)) {
+       if($slap && count($url_recipients) && ($followup || $top_level) && $public_message && (! $expire)) {
                if(! get_config('system','dfrn_only')) {
                        foreach($url_recipients as $url) {
                                if($url) {
@@ -556,72 +622,68 @@ function notifier_run($argv, $argc){
                }
        }
 
-       if((strlen($hub)) && ($notify_hub)) {
-               $hubs = explode(',', $hub);
-               if(count($hubs)) {
-                       foreach($hubs as $h) {
-                               $h = trim($h);
-                               if(! strlen($h))
-                                       continue;
-                               $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] );
-                               post_url($h,$params);
-                               logger('pubsub: publish: ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code());
-                               if(count($hubs) > 1)
-                                       sleep(7);                               // try and avoid multiple hubs responding at precisely the same time
-                       }
-               }
-       }
-
-       if($notify_hub) {
 
-               /**
-                *
-                * If you have less than 999 dfrn friends and it's a public message,
-                * we'll just go ahead and push them out securely with dfrn/rino.
-                * If you've got more than that, you'll have to rely on PuSH delivery.
-                *
-                */
-
-               $max_allowed = ((get_config('system','maxpubdeliver') === false) ? 999 : intval(get_config('system','maxpubdeliver')));
-                               
-               /**
-                *
-                * Only get the bare essentials and go back for the full record. 
-                * If you've got a lot of friends and we grab all the details at once it could exhaust memory. 
-                *
-                */
+       if($public_message) {
 
                $r = q("SELECT `id`, `name` FROM `contact` 
-                       WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
-                       AND `rel` != %d ",
+                       WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+                       AND `rel` != %d order by rand() ",
                        dbesc(NETWORK_DFRN),
+                       dbesc(NETWORK_DIASPORA),
                        intval($owner['uid']),
                        intval(CONTACT_IS_SHARING)
                );
 
-               if((count($r)) && (($max_allowed == 0) || (count($r) < $max_allowed))) {
-
+               if(count($r)) {
                        logger('pubdeliver: ' . print_r($r,true));
 
+                       // throw everything into the queue in case we get killed
+
+                       foreach($r as $rr) {
+                               if((! $mail) && (! $fsuggest) && (! $followup)) {
+                                       q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )",
+                                               dbesc($cmd),
+                                               intval($item_id),
+                                               intval($rr['id'])
+                                       );
+                               }
+                       }
+
                        foreach($r as $rr) {
 
                                /* Don't deliver to folks who have already been delivered to */
 
-                               if(! in_array($rr['id'], $conversants)) {
-                                       $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
-                                                       intval($rr['id'])
-                                       );
+                               if(in_array($rr['id'],$conversants)) {
+                                       logger('notifier: already delivered id=' . $rr['id']);
+                                       continue;
+                               }
 
-                                       if(count($n)) {
-                                       
-                                               logger('notifier: dfrnpubdelivery: ' . $n[0]['name']);
-                                               $deliver_status = dfrn_deliver($owner,$n[0],$atom);
-                                       }
+                               if((! $mail) && (! $fsuggest) && (! $followup)) {
+                                       logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); 
+                                       proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']);
+                                       if($interval)
+                                               @time_sleep_until(microtime(true) + (float) $interval);
                                }
-                               else
-                                       logger('notifier: dfrnpubdelivery: ignoring ' . $rr['name']);
                        }
                }
+
+
+               if(strlen($hub)) {
+                       $hubs = explode(',', $hub);
+                       if(count($hubs)) {
+                               foreach($hubs as $h) {
+                                       $h = trim($h);
+                                       if(! strlen($h))
+                                               continue;
+                                       $params = 'hub.mode=publish&hub.url=' . urlencode($a->get_baseurl() . '/dfrn_poll/' . $owner['nickname'] );
+                                       post_url($h,$params);
+                                       logger('pubsub: publish: ' . $h . ' ' . $params . ' returned ' . $a->get_curl_code());
+                                       if(count($hubs) > 1)
+                                               sleep(7);                               // try and avoid multiple hubs responding at precisely the same time
+                               }
+                       }
+               }
+
        }
 
        return;
index 651736a99a82844c317e3e7fd7bb7bedfa780131..e80b696bf8615f9ca89df7963f01a76f1cd4d9c1 100644 (file)
@@ -82,12 +82,18 @@ function poller_run($argv, $argc){
        if(! $restart)
                proc_run('php','include/cronhooks.php');
 
+       // Only poll from those with suitable relationships,
+       // and which have a polling address and ignore Diaspora since 
+       // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
+
        $contacts = q("SELECT `id` FROM `contact` 
                WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
+               AND `network` != '%s'
                $sql_extra 
                AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()",
                intval(CONTACT_IS_SHARING),
-               intval(CONTACT_IS_FRIEND)
+               intval(CONTACT_IS_FRIEND),
+               dbesc(NETWORK_DIASPORA)
        );
 
        if(! count($contacts)) {
index fb65d5c25bcbaf88e91815a98c2f9a11259a0473..5119a65d8cebaee58cbb8cd007d734541180203a 100644 (file)
@@ -3,18 +3,18 @@ require_once("boot.php");
 require_once('include/queue_fn.php');
 
 function queue_run($argv, $argc){
-  global $a, $db;
+       global $a, $db;
 
-  if(is_null($a)){
-    $a = new App;
-  }
+       if(is_null($a)){
+               $a = new App;
+       }
   
-  if(is_null($db)){
-    @include(".htconfig.php");
-    require_once("dba.php");
-    $db = new dba($db_host, $db_user, $db_pass, $db_data);
-    unset($db_host, $db_user, $db_pass, $db_data);
-  };
+       if(is_null($db)){
+               @include(".htconfig.php");
+               require_once("dba.php");
+               $db = new dba($db_host, $db_user, $db_pass, $db_data);
+               unset($db_host, $db_user, $db_pass, $db_data);
+       };
 
 
        require_once("session.php");
@@ -29,10 +29,27 @@ function queue_run($argv, $argc){
 
        load_hooks();
 
+       if($argc > 1)
+               $queue_id = intval($argv[1]);
+       else
+               $queue_id = 0;
+
        $deadguys = array();
 
        logger('queue: start');
 
+       $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
+
+       $r = q("select * from deliverq where 1");
+       if(count($r)) {
+               foreach($r as $rr) {
+                       logger('queue: deliverq');
+                       proc_run('php','include/delivery.php',$rr['cmd'],$rr['item'],$rr['contact']);
+                       if($interval)
+                               @time_sleep_until(microtime(true) + (float) $interval);
+               }
+       }
+
        $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue` 
                LEFT JOIN `contact` ON `queue`.`cid` = `contact`.`id` 
                WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
@@ -44,27 +61,41 @@ function queue_run($argv, $argc){
                q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
        }
                
-       $r = q("SELECT `id` FROM `queue` WHERE `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ");
+       if($queue_id)
+               $r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1",
+                       intval($queue_id)
+               );
+       else
+               $r = q("SELECT `id` FROM `queue` WHERE `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ");
 
        if(! count($r)){
                return;
        }
 
-       call_hooks('queue_predeliver', $a, $r);
+       if(! $queue_id)
+               call_hooks('queue_predeliver', $a, $r);
 
 
        // delivery loop
 
        require_once('include/salmon.php');
+       require_once('include/diaspora.php');
 
        foreach($r as $q_item) {
 
                // queue_predeliver hooks may have changed the queue db details, 
                // so check again if this entry still needs processing
 
-               $qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
-                       intval($q_item['id'])
-               );
+               if($queue_id) {
+                       $qi = q("select * from queue where `id` = %d limit 1",
+                               intval($queue_id)
+                       );
+               }
+               else {
+                       $qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
+                               intval($q_item['id'])
+                       );
+               }
                if(! count($qi))
                        continue;
 
@@ -82,7 +113,8 @@ function queue_run($argv, $argc){
                                continue;
                }
 
-               $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
+               $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey` 
+                       FROM `user` WHERE `uid` = %d LIMIT 1",
                        intval($c[0]['uid'])
                );
                if(! count($u)) {
@@ -120,6 +152,18 @@ function queue_run($argv, $argc){
                                                remove_queue_item($q_item['id']);
                                }
                                break;
+                       case NETWORK_DIASPORA:
+                               if($contact['notify']) {
+                                       logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
+                                       $deliver_status = diaspora_transmit($owner,$contact,$data);
+
+                                       if($deliver_status == (-1))
+                                               update_queue_time($q_item['id']);
+                                       else
+                                               remove_queue_item($q_item['id']);
+                               }
+                               break;
+
                        default:
                                $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
                                call_hooks('queue_deliver', $a, $params);
index 4043b4f1d93f0c1f243b564e86b9cc1f0453c5c8..9153f8994ce9ccff52c4d546e41fb65795df7de0 100644 (file)
@@ -73,6 +73,13 @@ function slapper($owner,$url,$slap) {
        if(! strlen($url))
                return;
 
+
+       if(! $owner['sprvkey']) {
+               logger(sprintf("slapper: user '%s' (%d) does not have a salmon private key. Send failed.",
+               $owner['username'],$owner['uid']));
+               return;
+       }
+
        // add all namespaces to item
 
 $namespaces = <<< EOT
@@ -102,11 +109,11 @@ EOT;
 
        $precomputed = '.YXBwbGljYXRpb24vYXRvbSt4bWw=.YmFzZTY0dXJs.UlNBLVNIQTI1Ng==';
 
-       $signature   = base64url_encode(rsa_sign(str_replace('=','',$data . $precomputed),true),$owner['sprvkey']);
+       $signature   = base64url_encode(rsa_sign(str_replace('=','',$data . $precomputed),$owner['sprvkey']));
 
-       $signature2  = base64url_encode(rsa_sign($data . $precomputed),$owner['sprvkey']);
+       $signature2  = base64url_encode(rsa_sign($data . $precomputed,$owner['sprvkey']));
 
-       $signature3  = base64url_encode(rsa_sign($data),$owner['sprvkey']);
+       $signature3  = base64url_encode(rsa_sign($data,$owner['sprvkey']));
 
        $salmon_tpl = get_markup_template('magicsig.tpl');
 
index 1a926443f8b4f08f96d6ba4c6d6e5f06b1039258..e42fe93f6497b1ec296b61cae0993fb4038b1b1e 100644 (file)
@@ -197,6 +197,7 @@ function admin_page_site_post(&$a){
        $timeout                        =       ((x($_POST,'timeout'))                  ? intval(trim($_POST['timeout']))               : 60);
        $dfrn_only          =   ((x($_POST,'dfrn_only'))            ? True      :       False);
     $ostatus_disabled   =   !((x($_POST,'ostatus_disabled')) ? True  :   False);
+       $diaspora_enabled   =   ((x($_POST,'diaspora_enabled')) ? True   :  False);
 
 
        set_config('config','sitename',$sitename);
@@ -241,6 +242,7 @@ function admin_page_site_post(&$a){
        set_config('system','curl_timeout', $timeout);
        set_config('system','dfrn_only', $dfrn_only);
        set_config('system','ostatus_disabled', $ostatus_disabled);
+       set_config('system','diaspora_enabled', $diaspora_enabled);
 
        info( t('Site settings updated.') . EOL);
        goaway($a->get_baseurl() . '/admin/site' );
@@ -325,6 +327,7 @@ function admin_page_site(&$a) {
                '$no_utf'                       => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), "Use PHP UTF8 regular expressions"),
                '$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), "Display a Community page showing all recent public postings on this site."),
                '$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disable'), "Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."),    
+               '$diaspora_enabled' => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), "Provide built-in Diaspora network compatibility."),    
                '$dfrn_only'        => array('dfrn_only', t('Only allow Friendika contacts'), get_config('system','dfrn_only'), "All contacts must use Friendika protocols. All other built-in communication protocols disabled."),
                '$verifyssl'            => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), "If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."),
                '$proxyuser'            => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
@@ -341,7 +344,7 @@ function admin_page_site(&$a) {
  * Users admin page
  */
 function admin_page_users_post(&$a){
-       $pending = ( x(£_POST, 'pending') ? $_POST['pending'] : Array() );
+       $pending = ( x($_POST, 'pending') ? $_POST['pending'] : Array() );
        $users = ( x($_POST, 'user') ? $_POST['user'] : Array() );
        
        if (x($_POST,'page_users_block')){
@@ -629,7 +632,7 @@ function admin_page_logs(&$a){
 
        $f = get_config('system','logfile');
        $size = filesize($f);
-       if($size > 5000000)
+       if($size > 5000000 || $size < 0)
                $size = 5000000;
 
        $data = '';
index efb0dc75b2b22e51a105c7e0d73d77767f67e1d8..307e9b15bce6899d835bb137605b8569698cf9bc 100644 (file)
@@ -87,25 +87,15 @@ function contacts_post(&$a) {
 
 
        $priority = intval($_POST['poll']);
-       if($priority == (-1))
-               
        if($priority > 5 || $priority < 0)
                $priority = 0;
 
-       $rating = intval($_POST['reputation']);
-       if($rating > 5 || $rating < 0)
-               $rating = 0;
-
-       $reason = notags(trim($_POST['reason']));
-
        $info = escape_tags(trim($_POST['info']));
 
-       $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `rating` = %d, `reason` = '%s', `info` = '%s'
+       $r = q("UPDATE `contact` SET `profile-id` = %d, `priority` = %d , `info` = '%s'
                WHERE `id` = %d AND `uid` = %d LIMIT 1",
                intval($profile_id),
                intval($priority),
-               intval($rating),
-               dbesc($reason),
                dbesc($info),
                intval($contact_id),
                intval(local_user())
@@ -163,9 +153,9 @@ function contacts_content(&$a) {
                if($cmd === 'block') {
                        $blocked = (($orig_record[0]['blocked']) ? 0 : 1);
                        $r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                                       intval($blocked),
-                                       intval($contact_id),
-                                       intval(local_user())
+                               intval($blocked),
+                               intval($contact_id),
+                               intval(local_user())
                        );
                        if($r) {
                                //notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL );
@@ -178,9 +168,9 @@ function contacts_content(&$a) {
                if($cmd === 'ignore') {
                        $readonly = (($orig_record[0]['readonly']) ? 0 : 1);
                        $r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                                       intval($readonly),
-                                       intval($contact_id),
-                                       intval(local_user())
+                               intval($readonly),
+                               intval($contact_id),
+                               intval(local_user())
                        );
                        if($r) {
                                info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL );
@@ -193,7 +183,7 @@ function contacts_content(&$a) {
 
                        // create an unfollow slap
 
-                       if($orig_record[0]['network'] === 'stat') {
+                       if($orig_record[0]['network'] === NETWORK_OSTATUS) {
                                $tpl = get_markup_template('follow_slap.tpl');
                                $slap = replace_macros($tpl, array(
                                        '$name' => $a->user['username'],
@@ -215,13 +205,15 @@ function contacts_content(&$a) {
                                        slapper($a->user,$orig_record[0]['notify'],$slap);
                                }
                        }
-
-                       if($orig_record[0]['network'] === 'dfrn') {
+                       elseif($orig_record[0]['network'] === NETWORK_DIASPORA) {
+                               require_once('include/diaspora.php');
+                               diaspora_unshare($a->user,$orig_record[0]);
+                       }
+                       elseif($orig_record[0]['network'] === NETWORK_DFRN) {
                                require_once('include/items.php');
                                dfrn_deliver($a->user,$orig_record[0],'placeholder', 1);
                        }
 
-
                        contact_remove($orig_record[0]['id']);
                        info( t('Contact has been removed.') . EOL );
                        goaway($a->get_baseurl() . '/contacts');
@@ -275,8 +267,6 @@ function contacts_content(&$a) {
                        $sparkle = '';
                }
 
-               $grps = '';
-
                $insecure = '<div id="profile-edit-insecure"><p><img src="images/unlock_icon.gif" alt="' . t('Privacy Unavailable') . '" />&nbsp;'
                        . t('Private communications are not available for this contact.') . '</p></div>';
 
@@ -290,6 +280,9 @@ function contacts_content(&$a) {
                $lblsuggest = (($r[0]['network'] === NETWORK_DFRN) 
                        ? '<div id="contact-suggest-wrapper"><a href="fsuggest/' . $r[0]['id'] . '" id="contact-suggest">' . t('Suggest friends') . '</a></div>' : '');
 
+               $poll_enabled = (($r[0]['network'] !== NETWORK_DIASPORA) ? true : false);
+
+               $nettype = '<div id="contact-edit-nettype">' . sprintf( t('Network type: %s'),network_to_name($r[0]['network'])) . '</div>';
 
                $o .= replace_macros($tpl,array(
                        '$header' => t('Contact Editor'),
@@ -308,9 +301,10 @@ function contacts_content(&$a) {
                        '$lblcrepair' => t("Repair contact URL settings \x28WARNING: Advanced\x29"),
                        '$lblrecent' => t('View conversations'),
                        '$lblsuggest' => $lblsuggest,
-                       '$grps' => $grps,
                        '$delete' => t('Delete contact'),
-                       '$poll_interval' => contact_poll_interval($r[0]['priority']),
+                       '$nettype' => $nettype,
+                       '$poll_interval' => contact_poll_interval($r[0]['priority'],(! $poll_enabled)),
+                       '$poll_enabled' => $poll_enabled,
                        '$lastupdtext' => t('Last updated: '),
                        '$updpub' => t('Update public posts: '),
                        '$last_update' => $last_update,
@@ -323,9 +317,6 @@ function contacts_content(&$a) {
                        '$info' => $r[0]['info'],
                        '$blocked' => (($r[0]['blocked']) ? '<div id="block-message">' . t('Currently blocked') . '</div>' : ''),
                        '$ignored' => (($r[0]['readonly']) ? '<div id="ignore-message">' . t('Currently ignored') . '</div>' : ''),
-                       '$rating' => contact_reputation($r[0]['rating']),
-                       '$reason' => $r[0]['reason'],
-                       '$groups' => '', // group_selector(),
                        '$photo' => $r[0]['photo'],
                        '$name' => $r[0]['name'],
                        '$dir_icon' => $dir_icon,
@@ -420,11 +411,12 @@ function contacts_content(&$a) {
                        $o .= replace_macros($tpl, array(
                                '$img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
                                '$edit_hover' => t('Edit contact'),
+                               '$contact_photo_menu' => contact_photo_menu($rr),
                                '$id' => $rr['id'],
                                '$alt_text' => $alt_text,
                                '$dir_icon' => $dir_icon,
                                '$thumb' => $rr['thumb'], 
-                               '$name' => substr($rr['name'],0,20),
+                               '$name' => $rr['name'],
                                '$username' => $rr['name'],
                                '$sparkle' => $sparkle,
                                '$url' => $url
index 009fe4e9a1cee691d0c76eb5f929cd0221423c4e..df4d2e630a9fb57d22e522a80cea8675c709267d 100644 (file)
@@ -100,9 +100,9 @@ function follow_post(&$a) {
                        $new_relation = CONTACT_IS_FOLLOWER;
 
                // create contact record 
-               $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`,
+               $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
                        `writable`, `blocked`, `readonly`, `pending` )
-                       VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
+                       VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
                        intval(local_user()),
                        dbesc(datetime_convert()),
                        dbesc($ret['url']),
@@ -114,6 +114,7 @@ function follow_post(&$a) {
                        dbesc($ret['nick']),
                        dbesc($ret['photo']),
                        dbesc($ret['network']),
+                       dbesc($ret['pubkey']),
                        intval($new_relation),
                        intval($ret['priority']),
                        intval($writeable)
index ef0b232d56b12b96374f3c2356fed80be5b24afa..6ecca8f4a1d7df82c35a832dc481b0537b964a60 100644 (file)
@@ -15,6 +15,8 @@
  *
  */  
 
+require_once('include/crypto.php');
+
 function item_post(&$a) {
 
        if((! local_user()) && (! remote_user()))
@@ -351,7 +353,7 @@ function item_post(&$a) {
         * and we are replying, and there isn't one already
         */
 
-       if(($parent_contact) && ($parent_contact['network'] === 'stat'
+       if(($parent_contact) && ($parent_contact['network'] === NETWORK_OSTATUS
                && ($parent_contact['nick']) && (! in_array('@' . $parent_contact['nick'],$tags))) {
                $body = '@' . $parent_contact['nick'] . ' ' . $body;
                $tags[] = '@' . $parent_contact['nick'];
@@ -402,7 +404,8 @@ function item_post(&$a) {
                                                );
                                        }
                                        else {
-                                               $r = q("SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1",
+                                               $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
+                                                       dbesc($name),
                                                        dbesc($name),
                                                        intval($profile_uid)
                                                );
@@ -674,6 +677,27 @@ function item_post(&$a) {
 
                                pop_lang();
                        }
+
+                       // We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key
+
+                       if($self) {
+                               require_once('include/bb2diaspora.php');
+                               $signed_body = html_entity_decode(bb2diaspora($datarray['body']));
+                               $myaddr = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
+                               if($datarray['verb'] === ACTIVITY_LIKE) 
+                                       $signed_text = $datarray['guid'] . ';' . 'Post' . ';' . $parent_item['guid'] . ';' . 'true' . ';' . $myaddr;
+                               else
+                               $signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr;
+
+                               $authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha'));
+
+                               q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
+                                       intval($post_id),
+                       dbesc($signed_text),
+                       dbesc(base64_encode($authorsig)),
+                       dbesc($myaddr)
+                       );
+                       }
                }
                else {
                        $parent = $post_id;
@@ -799,6 +823,12 @@ function item_post(&$a) {
                }
        }
 
+
+
+
+
+
+
        logger('post_complete');
 
        // figure out how to return, depending on from whence we came
index 05b74b50a4252782c7a9c410ea97cdfae4c46bea..54fb2a0a4ce490b080649fcff7296fcc4552ec73 100644 (file)
@@ -188,7 +188,7 @@ function network_content(&$a, $update = 0) {
                if(count($r)) {
                        $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` $star_sql AND `contact-id` IN ( " . intval($cid) . " )) ";
                        $o = '<h2>' . t('Contact: ') . $r[0]['name'] . '</h2>' . $o;
-                       if($r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_FACEBOOK && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
+                       if($r[0]['network'] !== NETWORK_MAIL && $r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_FACEBOOK && $r[0]['network'] !== NETWORK_DIASPORA && $r[0]['writable'] && (! get_pconfig(local_user(),'system','nowarn_insecure'))) {
                                notice( t('Private messages to this person are at risk of public disclosure.') . EOL);
                        }
 
index 6fbd013b8d8756d27091a9f26bd5c450d1c2c154..3c32931471025ee3ca2ecf4d257151ffcdebbdde 100644 (file)
@@ -55,7 +55,8 @@ function openid_content(&$a) {
                        } 
 
 
-                       $r = q("SELECT * FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
+                       $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey` 
+                               FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
                                dbesc($_SESSION['openid'])
                        );
                        if(! count($r)) {
index cb13b760364e72df276db5c3db5dc8eeeef0e074..b74ca85d71b5b1272b277f92c872614a5bb0be7a 100644 (file)
@@ -414,7 +414,8 @@ function photos_post(&$a) {
                                                                );
                                                        }
                                                        else {
-                                                               $r = q("SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1",
+                                                               $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
+                                                                       dbesc($name),
                                                                        dbesc($name),
                                                                        intval($page_owner_uid)
                                                                );
index d6e3d378fcbdb7c7af7cb324b7e301e026e8e1c9..4dff5d531ab27a9450ebe2b37c6c37a7645ad0e1 100644 (file)
@@ -122,6 +122,12 @@ function pubsub_post(&$a) {
 
        $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)
+               hub_post_return();
+
        $feedhub = '';
 
        require_once('include/items.php');
index c3738c1431c20e28221e24ad79bdc31cf96648e3..34128518b55014e287f3f5fc9b4f398b8625af8a 100644 (file)
@@ -15,8 +15,6 @@ function receive_post(&$a) {
        if($a->argc != 3 || $a->argv[1] !== 'users')
                http_status_exit(500);
 
-       logger('receive: raw input: ' . file_get_contents('php://input'), LOGGER_DATA);
-
        $guid = $a->argv[2];
 
        $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1",
@@ -43,29 +41,7 @@ function receive_post(&$a) {
        if(! is_array($msg))
                http_status_exit(500);
 
-
-       $parsed_xml = parse_xml_string($msg['message'],false);
-
-       $xmlbase = $parsed_xml->post;
-
-       if($xmlbase->request) {
-               diaspora_request($importer,$xmlbase->request);
-       }
-       elseif($xmlbase->status_message) {
-               diaspora_post($importer,$xmlbase->status_message);
-       }
-       elseif($xmlbase->comment) {
-               diaspora_comment($importer,$xmlbase->comment,$msg);
-       }
-       elseif($xmlbase->like) {
-               diaspora_like($importer,$xmlbase->like,$msg);
-       }
-       elseif($xmlbase->retraction) {
-               diaspora_retraction($importer,$xmlbase->retraction,$msg);
-       }
-       else {
-               logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true));
-       }
+       diaspora_dispatch($importer,$msg);
 
        http_status_exit(200);
        // NOTREACHED
index adfb5fe0288e74a6989a640df11b3afb59760d53..80761cce45168a73582ab2f9735a3118d715d263 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-define( 'UPDATE_VERSION' , 1081 );
+define( 'UPDATE_VERSION' , 1085 );
 
 /**
  *
@@ -673,4 +673,41 @@ function update_1079() {
 
 function update_1080() {
        q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'");
-}
\ No newline at end of file
+}
+
+function update_1081() {
+       // there was a typo in update 1081 so it was corrected and moved up to 1082
+}
+
+function update_1082() {
+       q("ALTER TABLE `photo` ADD `guid` CHAR( 64 ) NOT NULL AFTER `contact-id`,
+               ADD INDEX ( `guid` )  ");
+       // make certain the following code is only executed once
+       $r = q("select `id` from `photo` where `guid` != '' limit 1");
+       if($r && count($r))
+               return;
+       $r = q("SELECT distinct(`resource-id`) FROM `photo` WHERE 1 group by `id`");
+       if(count($r)) {
+               foreach($r as $rr) {
+                       $guid = get_guid();
+                       q("update `photo` set `guid` = '%s' where `resource-id` = '%s'",
+                               dbesc($guid),
+                               dbesc($rr['resource-id'])
+                       );
+               }
+       }
+}
+
+function update_1083() {
+       q("CREATE TABLE IF NOT EXISTS `deliverq` (
+       `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+       `cmd` CHAR( 32 ) NOT NULL ,
+       `item` INT NOT NULL ,
+       `contact` INT NOT NULL
+       ) ENGINE = MYISAM ;");
+
+}
+
+function update_1084() {
+       q("ALTER TABLE `contact` ADD `attag` CHAR( 255 ) NOT NULL AFTER `nick` ");
+}
index 5ee0125de6aa8455bb831f239df38211cae9886a..061656df760c8d558fa1c90ba40227785b92d2f0 100644 (file)
@@ -31,6 +31,7 @@
        {{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }}
        {{ inc field_checkbox.tpl with $field=$no_community_page }}{{ endinc }}
        {{ inc field_checkbox.tpl with $field=$ostatus_disabled }}{{ endinc }}
+       {{ inc field_checkbox.tpl with $field=$diaspora_enabled }}{{ endinc }}
        {{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }}
        {{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
        
index 0e427feaaaf83b9907a5ceb6bf34304ccb7266c0..fb4f51f591c87cb7ea07ce8acb6988846f555fc9 100644 (file)
@@ -83,7 +83,7 @@
                                <poco:primary>true</poco:primary>
                        </poco:urls>
                </author>
-               <link rel="ostatus:conversation" href="$status.url"/> 
+               <link rel="ostatus:conversation" type="text/html" href="$status.url"/> 
 
        </entry>    
     {{ endfor }}
index 66479210ff9c16d76b5847fd99a95aa0491dc770..86ebb56089d35348b7b8dd4125ef0ff158e75fa2 100644 (file)
@@ -3,6 +3,8 @@
 
 <div id="contact-edit-banner-name">$name</div>
 
+$nettype
+
 <form action="contacts/$contact_id" method="post" >
 <input type="hidden" name="contact_id" value="$contact_id">
 
                </div>
                <div id="contact-edit-nav-end"></div>
 
-
+               {{ if $poll_enabled }}
                <div id="contact-edit-poll-wrapper">
                        <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span></div>
                        <div id="contact-edit-poll-text">$updpub</div>
                        $poll_interval
-                       <div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div>
+                       <div id="contact-edit-update-now"><a href="contacts/$contact_id/update" >$udnow</a></div>
                </div>
+               {{ endif }}
        </div>
        <div id="contact-edit-end" ></div>
 
@@ -42,8 +45,6 @@ $insecure
 $blocked
 $ignored
 
-$grps
-
 <div id="view-recent-wrapper"><a href="network/?cid=$contact_id" id="contact-view-recent">$lblrecent</a></div>
 $lblsuggest
 
@@ -65,24 +66,5 @@ $profile_select
 
 <input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
 
-
-<div id="contact-edit-rating-wrapper">
-<h4>$lbl_rep1</h4>
-<p>
-$lbl_rep2 $lbl_rep3
-</p>
-<div id="contact-edit-rating-select-wrapper">
-$rating
-</div>
-<div id="contact-edit-rating-explain">
-<p>
-$lbl_rep4
-</p>
-<textarea id="contact-edit-rating-text" name="reason" rows="3" cols="64" >$reason</textarea>
-</div>
-</div>
-$groups
-
-<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
 </form>
 </div>
index e9f616760d47d1487a16bb7c64257ecdd10542d1..2fa167febbce3c65193fa3bde248130cb3eb2467 100644 (file)
@@ -1,19 +1,18 @@
 
 <div class="contact-entry-wrapper" id="contact-entry-wrapper-$id" >
        <div class="contact-entry-photo-wrapper" >
-               <div class="contact-entry-nav-wrapper" >
-                       <div class="contact-entry-direction-wrapper" >
-                               <img class="contact-entry-direction-icon" src="$dir_icon" alt="$alt_text" title="$alt_text" />
-                       </div>
-                       <div class="contact-entry-direction-end" ></div>
-                       <div class="contact-entry-edit-links" >
-                               <a class="icon pencil" href="contacts/$id" class="contact-entry-edit-link" title="$edit_hover"></a>
-                       </div>
-                       <div class="contact-entry-edit-end"></div>
-               </div>
-               <div class="contact-entry-nav-end"></div>
-               <div class="contact-entry-photo" id="contact-entry-photo-$id" >
+               <div class="contact-entry-photo" id="contact-entry-photo-$id"
+               onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('contact-photo-menu-button-$id')" onmouseout="t$id=setTimeout('closeMenu(\'contact-photo-menu-button-$id\'); closeMenu(\'contact-photo-menu-$id\');',200)" >
+
                        <a href="$url" title="$img_hover" /><img src="$thumb" $sparkle alt="$name" /></a>
+
+                       <span onclick="openClose('contact-photo-menu-$id');" class="fakelink contact-photo-menu-button" id="contact-photo-menu-button-$id">menu</span>
+                <div class="contact-photo-menu" id="contact-photo-menu-$id">
+                    <ul>
+                        $contact_photo_menu
+                    </ul>
+                </div>
+
                </div>
                        
        </div>
index db53b0784f5d7fbf8d3f4f9954082b7adfc93c75..affae0bfe7a1b865f1c5546c76aaa64a56d1c459 100644 (file)
@@ -380,8 +380,8 @@ $a->strings["View New Items"] = "Neue Einträge anzeigen";
 $a->strings["View Any Items"] = "Alle Einträge anzeigen";
 $a->strings["View Starred Items"] = "Gesternte Einträge anzeigen";
 $a->strings["Warning: This group contains %s member from an insecure network."] = array(
-       0 => "",
-       1 => "",
+       0 => "Warnung: Diese Gruppe beinhaltet %s Mitglied aus unsicheren Netzwerken.",
+       1 => "Warnung: Diese Gruppe beinhaltet %s Mitglieder aus unsicheren Netzwerken.",
 );
 $a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
 $a->strings["No such group"] = "Es gibt keine solche Gruppe";
@@ -603,7 +603,7 @@ $a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
 $a->strings["Clear"] = "löschen";
 $a->strings["Debugging"] = "Protokoll führen";
 $a->strings["Log file"] = "Protokolldatei";
-$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas indes.php.";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Muss schreibbar durch den Webserver sein. Angabe relativ zu Friendikas index.php.";
 $a->strings["Log level"] = "Protokollevel";
 $a->strings["Close"] = "Schließen";
 $a->strings["FTP Host"] = "FTP Host";
diff --git a/view/diaspora_photo.tpl b/view/diaspora_photo.tpl
new file mode 100644 (file)
index 0000000..75ca7f1
--- /dev/null
@@ -0,0 +1,13 @@
+<XML>
+  <post>
+    <photo>
+      <remote_photo_path>$path</remote_photo_path>
+      <remote_photo_name>$filename</remote_photo_name>
+      <status_message_guid>$msg_guid</status_message_guid>
+      <guid>$guid</guid>
+      <diaspora_handle>$handle</diaspora_handle>
+      <public>$public</public>
+      <created_at>$created_at</created_at>
+    </photo>
+  </post>
+</XML>
\ No newline at end of file
index e1dc4b8671148bdaf82346270eb72598ef420867..d6bd55f00a6c7ecbe37b97edf90db47048745b94 100644 (file)
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: 2.1.947\n"
+"Project-Id-Version: 2.2.1081\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-13 07:15+0000\n"
+"POT-Creation-Date: 2011-08-24 15:28+0200\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"
@@ -16,7 +16,8 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n>1;\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+
 
 #: ../../include/auth.php:27
 msgid "Logged out."
@@ -24,10 +25,16 @@ msgstr "Déconnecté."
 
 #: ../../include/auth.php:105 ../../include/auth.php:130
 #: ../../include/auth.php:183 ../../mod/openid.php:62 ../../mod/openid.php:109
+#: ../../include/auth.php:114 ../../include/auth.php:139
+#: ../../include/auth.php:192 ../../mod/openid.php:118
+#: ../../include/auth.php:120 ../../include/auth.php:145
+#: ../../include/auth.php:198 ../../mod/openid.php:122
 msgid "Login failed."
 msgstr "Échec de connexion."
 
 #: ../../include/auth.php:194 ../../mod/openid.php:73
+#: ../../include/auth.php:212 ../../mod/openid.php:82
+#: ../../include/auth.php:218
 msgid "Welcome back "
 msgstr "Bienvenue à nouveau, "
 
@@ -42,15 +49,24 @@ msgstr "Bienvenue à nouveau, "
 #: ../../include/items.php:1026 ../../include/items.php:1029
 #: ../../include/items.php:1032 ../../mod/photos.php:785
 #: ../../mod/photos.php:854 ../../mod/photos.php:869 ../../mod/photos.php:1238
-#: ../../mod/photos.php:1249
+#: ../../mod/photos.php:1249 ../../include/Photo.php:233
+#: ../../include/Photo.php:240 ../../include/Photo.php:247
+#: ../../include/items.php:1027 ../../include/items.php:1030
+#: ../../include/items.php:1033 ../../mod/photos.php:38
+#: ../../mod/photos.php:110 ../../mod/photos.php:806 ../../mod/photos.php:875
+#: ../../mod/photos.php:890 ../../mod/photos.php:1278
+#: ../../mod/photos.php:1289 ../../mod/photos.php:45 ../../mod/photos.php:143
+#: ../../mod/photos.php:857 ../../mod/photos.php:926 ../../mod/photos.php:941
+#: ../../mod/photos.php:1332 ../../mod/photos.php:1344
 msgid "Contact Photos"
 msgstr "Photos du contact"
 
-#: ../../include/acl_selectors.php:132
+#: ../../include/acl_selectors.php:132 ../../include/acl_selectors.php:133
 msgid "Visible To:"
 msgstr "Visible par:"
 
 #: ../../include/acl_selectors.php:136 ../../include/acl_selectors.php:151
+#: ../../include/acl_selectors.php:137 ../../include/acl_selectors.php:152
 msgid "Groups"
 msgstr "Groupes"
 
@@ -58,10 +74,14 @@ msgstr "Groupes"
 #: ../../include/nav.php:111 ../../mod/contacts.php:306 ../../boot.php:2022
 #: ../../mod/contacts.php:311 ../../include/nav.php:112
 #: ../../mod/contacts.php:319 ../../include/nav.php:118
+#: ../../include/nav.php:117 ../../mod/contacts.php:321
+#: ../../include/acl_selectors.php:141 ../../include/acl_selectors.php:156
+#: ../../include/nav.php:110 ../../mod/contacts.php:322
+#: ../../mod/contacts.php:358
 msgid "Contacts"
 msgstr "Contacts"
 
-#: ../../include/acl_selectors.php:147
+#: ../../include/acl_selectors.php:147 ../../include/acl_selectors.php:148
 msgid "Except For:"
 msgstr "Sauf pour:"
 
@@ -326,14 +346,16 @@ msgid "Monthly"
 msgstr "Chaque mois"
 
 #: ../../include/group.php:130 ../../include/group.php:145
+#: ../../include/group.php:146 ../../include/group.php:147
 msgid "Create a new group"
 msgstr "Créer un nouveau groupe"
 
 #: ../../include/group.php:131 ../../include/group.php:146
+#: ../../include/group.php:147 ../../include/group.php:148
 msgid "Everybody"
 msgstr "Tout le monde"
 
-#: ../../include/oembed.php:57
+#: ../../include/oembed.php:57 ../../include/oembed.php:99
 #, fuzzy
 msgid "Embedding disabled"
 msgstr "Incorporation désactivée"
@@ -342,84 +364,92 @@ msgstr "Incorporation désactivée"
 msgid "Miscellaneous"
 msgstr "Divers"
 
-#: ../../include/datetime.php:148
+#: ../../include/datetime.php:148 ../../include/datetime.php:234
 msgid "less than a second ago"
 msgstr "il y a moins d'une seconde"
 
-#: ../../include/datetime.php:151
+#: ../../include/datetime.php:151 ../../include/datetime.php:105
+#: ../../include/datetime.php:237
 msgid "year"
 msgstr "an"
 
-#: ../../include/datetime.php:151
+#: ../../include/datetime.php:151 ../../include/datetime.php:237
 msgid "years"
 msgstr "ans"
 
-#: ../../include/datetime.php:152
+#: ../../include/datetime.php:152 ../../include/datetime.php:110
+#: ../../include/datetime.php:238
 msgid "month"
 msgstr "mois"
 
-#: ../../include/datetime.php:152
+#: ../../include/datetime.php:152 ../../include/datetime.php:238
 msgid "months"
 msgstr "mois"
 
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:153 ../../include/datetime.php:239
 msgid "week"
 msgstr "semaine"
 
-#: ../../include/datetime.php:153
+#: ../../include/datetime.php:153 ../../include/datetime.php:239
 msgid "weeks"
 msgstr "semaines"
 
-#: ../../include/datetime.php:154
+#: ../../include/datetime.php:154 ../../include/datetime.php:115
+#: ../../include/datetime.php:240
 msgid "day"
 msgstr "jour"
 
 #: ../../include/datetime.php:154 ../../mod/settings.php:370
+#: ../../mod/settings.php:432 ../../include/datetime.php:240
 msgid "days"
 msgstr "jours"
 
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:155 ../../include/datetime.php:241
 msgid "hour"
 msgstr "heure"
 
-#: ../../include/datetime.php:155
+#: ../../include/datetime.php:155 ../../include/datetime.php:241
 msgid "hours"
 msgstr "heures"
 
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:156 ../../include/datetime.php:242
 msgid "minute"
 msgstr "minute"
 
-#: ../../include/datetime.php:156
+#: ../../include/datetime.php:156 ../../include/datetime.php:242
 msgid "minutes"
 msgstr "minutes"
 
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:157 ../../include/datetime.php:243
 msgid "second"
 msgstr "seconde"
 
-#: ../../include/datetime.php:157
+#: ../../include/datetime.php:157 ../../include/datetime.php:243
 msgid "seconds"
 msgstr "secondes"
 
-#: ../../include/datetime.php:164
+#: ../../include/datetime.php:164 ../../include/datetime.php:250
 msgid " ago"
 msgstr " auparavant"
 
 #: ../../include/items.php:1027 ../../include/items.php:1073
 #: ../../include/profile_advanced.php:36 ../../include/items.php:1071
+#: ../../include/items.php:1072 ../../include/items.php:1155
 msgid "Birthday:"
 msgstr "Anniversaire:"
 
 #: ../../include/items.php:1364 ../../mod/dfrn_request.php:536
 #: ../../include/items.php:1411 ../../mod/dfrn_request.php:538
-#: ../../include/items.php:1409
+#: ../../include/items.php:1409 ../../include/items.php:1426
+#: ../../mod/dfrn_request.php:542 ../../include/items.php:1537
+#: ../../mod/dfrn_request.php:539
 #, fuzzy
 msgid "[Name Withheld]"
 msgstr "[Nom non-publié]"
 
 #: ../../include/items.php:1371 ../../include/items.php:1418
-#: ../../include/items.php:1416
+#: ../../include/items.php:1416 ../../include/items.php:1433
+#: ../../include/items.php:1544
 #, fuzzy
 msgid "You have a new follower at "
 msgstr "Vous avez un nouvel abonné à "
@@ -435,41 +465,57 @@ msgstr "Vous avez un nouvel abonné à "
 #: ../../mod/dfrn_request.php:547 ../../include/items.php:1418
 #: ../../mod/dfrn_confirm.php:654 ../../mod/dfrn_notify.php:189
 #: ../../mod/dfrn_notify.php:404 ../../mod/dfrn_notify.php:490
+#: ../../mod/register.php:332 ../../mod/register.php:369
+#: ../../include/items.php:1435 ../../mod/register.php:333
+#: ../../mod/register.php:373 ../../mod/dfrn_confirm.php:657
+#: ../../mod/lostpass.php:40 ../../mod/lostpass.php:102 ../../mod/item.php:480
+#: ../../mod/item.php:506 ../../mod/regmod.php:94
+#: ../../mod/dfrn_notify.php:405 ../../mod/dfrn_notify.php:495
+#: ../../mod/dfrn_request.php:551 ../../include/items.php:1546
+#: ../../mod/register.php:423 ../../mod/dfrn_confirm.php:697
+#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
+#: ../../mod/regmod.php:54 ../../mod/dfrn_notify.php:294
+#: ../../mod/dfrn_notify.php:552 ../../mod/dfrn_request.php:548
 msgid "Administrator"
 msgstr "Administrateur"
 
 #: ../../include/dba.php:31
 #, fuzzy, php-format
 msgid "Cannot locate DNS info for database server '%s'"
-msgstr ""
-"Impossible de localiser les informations DNS pour le serveur de base de "
-"données '%s'"
+msgstr "Impossible de localiser les informations DNS pour le serveur de base de données '%s'"
 
 #: ../../include/nav.php:38 ../../boot.php:837 ../../boot.php:839
 #: ../../include/nav.php:39 ../../boot.php:842 ../../boot.php:854
-#: ../../boot.php:855
+#: ../../boot.php:855 ../../include/nav.php:41 ../../boot.php:865
+#: ../../boot.php:667
 msgid "Logout"
 msgstr "Se déconnecter"
 
 #: ../../include/nav.php:44 ../../boot.php:817 ../../boot.php:823
 #: ../../boot.php:819 ../../boot.php:825 ../../include/nav.php:45
 #: ../../boot.php:822 ../../boot.php:828 ../../boot.php:834 ../../boot.php:840
-#: ../../boot.php:835 ../../boot.php:841
+#: ../../boot.php:835 ../../boot.php:841 ../../boot.php:843 ../../boot.php:849
+#: ../../boot.php:645 ../../boot.php:651
 msgid "Login"
 msgstr "Connexion"
 
 #: ../../include/nav.php:56 ../../include/nav.php:91 ../../include/nav.php:57
-#: ../../include/nav.php:92 ../../include/nav.php:98
+#: ../../include/nav.php:92 ../../include/nav.php:98 ../../include/nav.php:97
+#: ../../include/nav.php:55 ../../include/nav.php:93
 msgid "Home"
 msgstr "Accueil"
 
 #: ../../include/nav.php:61 ../../mod/register.php:445 ../../boot.php:809
 #: ../../mod/register.php:463 ../../boot.php:811 ../../include/nav.php:62
 #: ../../boot.php:814 ../../boot.php:826 ../../boot.php:827
+#: ../../mod/register.php:466 ../../include/nav.php:59
+#: ../../mod/register.php:471 ../../boot.php:835 ../../mod/register.php:529
+#: ../../boot.php:637
 msgid "Register"
 msgstr "S'inscrire"
 
 #: ../../include/nav.php:64 ../../include/nav.php:65 ../../include/nav.php:71
+#: ../../include/nav.php:70 ../../include/nav.php:68 ../../include/nav.php:67
 #, fuzzy
 msgid "Apps"
 msgstr "Applications"
@@ -478,39 +524,47 @@ msgstr "Applications"
 #: ../../boot.php:2056 ../../boot.php:2058 ../../include/nav.php:68
 #: ../../boot.php:2066 ../../include/nav.php:74 ../../boot.php:2078
 #: ../../boot.php:2093 ../../mod/search.php:21 ../../boot.php:2042
+#: ../../include/nav.php:73 ../../include/nav.php:71 ../../mod/search.php:26
+#: ../../boot.php:2060 ../../include/text.php:610 ../../include/nav.php:69
 msgid "Search"
 msgstr "Recherche"
 
 #: ../../include/nav.php:77 ../../include/nav.php:78 ../../include/nav.php:84
+#: ../../include/nav.php:83 ../../include/nav.php:81
 msgid "Directory"
 msgstr "Annuaire"
 
 #: ../../include/nav.php:87 ../../include/nav.php:88 ../../include/nav.php:94
+#: ../../include/nav.php:93 ../../include/nav.php:91
 msgid "Network"
 msgstr "Réseau"
 
 #: ../../include/nav.php:96 ../../include/nav.php:97 ../../include/nav.php:103
+#: ../../include/nav.php:102 ../../include/nav.php:99
 msgid "Notifications"
 msgstr "Notifications"
 
 #: ../../include/nav.php:100 ../../mod/message.php:125
 #: ../../include/nav.php:101 ../../include/nav.php:107
+#: ../../include/nav.php:106 ../../include/nav.php:102
+#: ../../mod/message.php:51
 msgid "Messages"
 msgstr "Messages"
 
 #: ../../include/nav.php:104 ../../include/nav.php:105
-#: ../../include/nav.php:111
+#: ../../include/nav.php:111 ../../include/nav.php:110
 #, fuzzy
 msgid "Manage"
 msgstr "Gérer"
 
 #: ../../include/nav.php:107 ../../include/nav.php:108
-#: ../../include/nav.php:114
+#: ../../include/nav.php:114 ../../include/nav.php:113 ../../mod/admin.php:554
 msgid "Settings"
 msgstr "Réglages"
 
 #: ../../include/nav.php:109 ../../include/nav.php:110
 #: ../../mod/profiles.php:456 ../../include/nav.php:116
+#: ../../include/nav.php:115 ../../mod/profiles.php:458
 msgid "Profiles"
 msgstr "Profils"
 
@@ -543,21 +597,40 @@ msgstr ""
 #: ../../mod/settings.php:211 ../../mod/contacts.php:106
 #: ../../mod/display.php:311 ../../index.php:265 ../../mod/display.php:126
 #: ../../mod/display.php:131 ../../mod/display.php:133
-#: ../../mod/photos.php:777
+#: ../../mod/photos.php:777 ../../mod/crepair.php:54
+#: ../../addon/facebook/facebook.php:246 ../../mod/display.php:138
+#: ../../mod/settings.php:251 ../../mod/item.php:680
+#: ../../mod/profile_photo.php:144 ../../mod/profile_photo.php:155
+#: ../../mod/viewcontacts.php:21 ../../mod/invite.php:54
+#: ../../mod/photos.php:89 ../../mod/photos.php:798 ../../index.php:267
+#: ../../include/items.php:1948 ../../addon/facebook/facebook.php:310
+#: ../../mod/profiles.php:226 ../../mod/notes.php:20 ../../mod/register.php:27
+#: ../../mod/display.php:108 ../../mod/admin.php:10 ../../mod/message.php:9
+#: ../../mod/message.php:42 ../../mod/install.php:96 ../../mod/settings.php:41
+#: ../../mod/settings.php:46 ../../mod/settings.php:305
+#: ../../mod/events.php:102 ../../mod/item.php:110
+#: ../../mod/wall_attach.php:43 ../../mod/regmod.php:111
+#: ../../mod/invite.php:81 ../../mod/fsuggest.php:78 ../../mod/attach.php:33
+#: ../../mod/photos.php:122 ../../mod/photos.php:849
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:132
+#: ../../index.php:266
 msgid "Permission denied."
 msgstr "Permission refusée."
 
-#: ../../addon/facebook/facebook.php:116
+#: ../../addon/facebook/facebook.php:116 ../../addon/facebook/facebook.php:252
+#: ../../addon/facebook/facebook.php:316
 #, fuzzy
 msgid "Facebook disabled"
 msgstr "Connecteur Facebook désactivé"
 
-#: ../../addon/facebook/facebook.php:124
+#: ../../addon/facebook/facebook.php:124 ../../addon/facebook/facebook.php:266
+#: ../../addon/facebook/facebook.php:330
 #, fuzzy
 msgid "Facebook API key is missing."
 msgstr "Clé d'API Facebook manquante."
 
-#: ../../addon/facebook/facebook.php:131
+#: ../../addon/facebook/facebook.php:131 ../../addon/facebook/facebook.php:273
+#: ../../addon/facebook/facebook.php:337
 #, fuzzy
 msgid "Facebook Connect"
 msgstr "Connecteur Facebook"
@@ -572,7 +645,8 @@ msgstr "Installer le connecteur Facebook"
 msgid "Remove Facebook post connector"
 msgstr "Retirer le connecteur Facebook"
 
-#: ../../addon/facebook/facebook.php:150
+#: ../../addon/facebook/facebook.php:150 ../../addon/facebook/facebook.php:292
+#: ../../addon/facebook/facebook.php:356
 #, fuzzy
 msgid "Post to Facebook by default"
 msgstr "Poster sur Facebook par défaut"
@@ -592,51 +666,79 @@ msgstr "Poster sur Facebook par défaut"
 #: ../../include/conversation.php:307 ../../include/conversation.php:317
 #: ../../mod/group.php:76 ../../mod/group.php:159 ../../mod/photos.php:805
 #: ../../mod/photos.php:862 ../../mod/photos.php:1069
-#: ../../mod/photos.php:1112
+#: ../../mod/photos.php:1112 ../../mod/crepair.php:100
+#: ../../include/conversation.php:376 ../../addon/facebook/facebook.php:293
+#: ../../mod/settings.php:426 ../../mod/invite.php:68 ../../mod/photos.php:826
+#: ../../mod/photos.php:883 ../../mod/photos.php:1091
+#: ../../mod/photos.php:1131 ../../mod/photos.php:1170
+#: ../../mod/photos.php:1201 ../../include/conversation.php:409
+#: ../../addon/piwik/piwik.php:81 ../../addon/facebook/facebook.php:368
+#: ../../addon/randplace/randplace.php:178 ../../addon/oembed/oembed.php:41
+#: ../../addon/twitter/twitter.php:171 ../../addon/twitter/twitter.php:194
+#: ../../addon/twitter/twitter.php:280 ../../addon/impressum/impressum.php:69
+#: ../../addon/statusnet/statusnet.php:274
+#: ../../addon/statusnet/statusnet.php:288
+#: ../../addon/statusnet/statusnet.php:314
+#: ../../addon/statusnet/statusnet.php:321
+#: ../../addon/statusnet/statusnet.php:343
+#: ../../addon/statusnet/statusnet.php:468 ../../mod/profiles.php:372
+#: ../../mod/admin.php:300 ../../mod/admin.php:464 ../../mod/admin.php:590
+#: ../../mod/admin.php:655 ../../mod/install.php:137
+#: ../../mod/settings.php:482 ../../mod/events.php:333 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/invite.php:106 ../../mod/fsuggest.php:107
+#: ../../mod/photos.php:877 ../../mod/photos.php:934 ../../mod/photos.php:1144
+#: ../../mod/photos.php:1184 ../../mod/photos.php:1223
+#: ../../mod/photos.php:1254 ../../mod/contacts.php:298
 msgid "Submit"
 msgstr "Envoyer"
 
-#: ../../addon/facebook/facebook.php:174
+#: ../../addon/facebook/facebook.php:174 ../../addon/facebook/facebook.php:354
+#: ../../addon/facebook/facebook.php:423
 #, fuzzy
 msgid "Facebook"
 msgstr "Facebook"
 
-#: ../../addon/facebook/facebook.php:175
+#: ../../addon/facebook/facebook.php:175 ../../addon/facebook/facebook.php:355
+#: ../../addon/facebook/facebook.php:424
 #, fuzzy
 msgid "Facebook Connector Settings"
 msgstr "Réglages du connecteur Facebook"
 
-#: ../../addon/facebook/facebook.php:189
+#: ../../addon/facebook/facebook.php:189 ../../addon/facebook/facebook.php:369
+#: ../../addon/facebook/facebook.php:438
 #, fuzzy
 msgid "Post to Facebook"
 msgstr "Poster sur Facebook"
 
-#: ../../addon/facebook/facebook.php:230
+#: ../../addon/facebook/facebook.php:230 ../../addon/facebook/facebook.php:491
+#: ../../addon/facebook/facebook.php:584
 #, fuzzy
 msgid "Image: "
 msgstr "Image: "
 
 #: ../../addon/randplace/randplace.php:171
+#: ../../addon/randplace/randplace.php:170
 #, fuzzy
 msgid "Randplace Settings"
 msgstr "Réglages de Randplace"
 
 #: ../../addon/randplace/randplace.php:173
+#: ../../addon/randplace/randplace.php:172
 #, fuzzy
 msgid "Enable Randplace Plugin"
 msgstr "Activer l'extension Randplace"
 
-#: ../../addon/twitter/twitter.php:64
+#: ../../addon/twitter/twitter.php:64 ../../addon/twitter/twitter.php:70
 #, fuzzy
 msgid "Post to Twitter"
 msgstr "Poster sur Twitter"
 
-#: ../../addon/twitter/twitter.php:122
+#: ../../addon/twitter/twitter.php:122 ../../addon/twitter/twitter.php:137
 #, fuzzy
 msgid "Twitter Posting Settings"
 msgstr "Réglages du connecteur Twitter"
 
-#: ../../addon/twitter/twitter.php:129
+#: ../../addon/twitter/twitter.php:129 ../../addon/twitter/twitter.php:144
 #, fuzzy
 msgid ""
 "No consumer key pair for Twitter found. Please contact your site "
@@ -645,7 +747,7 @@ msgstr ""
 "Pas de paire de clés pour Twitter. Merci de contacter l'administrateur du "
 "site."
 
-#: ../../addon/twitter/twitter.php:148
+#: ../../addon/twitter/twitter.php:148 ../../addon/twitter/twitter.php:163
 #, fuzzy
 msgid ""
 "At this Friendika instance the Twitter plugin was enabled but you have not "
@@ -660,17 +762,18 @@ msgstr ""
 "aurez à coller dans la boîte ci-dessous. Ensuite, validez le formulaire. "
 "Seuls vos articles <strong>publics</strong> seront postés sur Twitter."
 
-#: ../../addon/twitter/twitter.php:149
+#: ../../addon/twitter/twitter.php:149 ../../addon/twitter/twitter.php:164
 #, fuzzy
 msgid "Log in with Twitter"
 msgstr "Se connecter à Twitter"
 
-#: ../../addon/twitter/twitter.php:151
+#: ../../addon/twitter/twitter.php:151 ../../addon/twitter/twitter.php:166
 #, fuzzy
 msgid "Copy the PIN from Twitter here"
 msgstr "Copiez le PIN de Twitter ici"
 
 #: ../../addon/twitter/twitter.php:165 ../../addon/statusnet/statusnet.php:197
+#: ../../addon/twitter/twitter.php:180 ../../addon/statusnet/statusnet.php:329
 #, fuzzy
 msgid "Currently connected to: "
 msgstr "Actuellement connecté à: "
@@ -690,31 +793,32 @@ msgid "Send public postings to Twitter"
 msgstr "Envoyer les articles publics à Twitter"
 
 #: ../../addon/twitter/twitter.php:172 ../../addon/statusnet/statusnet.php:204
+#: ../../addon/twitter/twitter.php:191 ../../addon/statusnet/statusnet.php:340
 #, fuzzy
 msgid "Clear OAuth configuration"
 msgstr "Effacer la configuration OAuth"
 
-#: ../../addon/tictac/tictac.php:14
+#: ../../addon/tictac/tictac.php:14 ../../addon/tictac/tictac.php:20
 #, fuzzy
 msgid "Three Dimensional Tic-Tac-Toe"
 msgstr "Morpion en trois dimensions"
 
-#: ../../addon/tictac/tictac.php:47
+#: ../../addon/tictac/tictac.php:47 ../../addon/tictac/tictac.php:53
 #, fuzzy
 msgid "3D Tic-Tac-Toe"
 msgstr "Morpion 3D"
 
-#: ../../addon/tictac/tictac.php:52
+#: ../../addon/tictac/tictac.php:52 ../../addon/tictac/tictac.php:58
 #, fuzzy
 msgid "New game"
 msgstr "Nouvelle partie"
 
-#: ../../addon/tictac/tictac.php:53
+#: ../../addon/tictac/tictac.php:53 ../../addon/tictac/tictac.php:59
 #, fuzzy
 msgid "New game with handicap"
 msgstr "Nouvelle partie avec handicap"
 
-#: ../../addon/tictac/tictac.php:54
+#: ../../addon/tictac/tictac.php:54 ../../addon/tictac/tictac.php:60
 #, fuzzy
 msgid ""
 "Three dimensional tic-tac-toe is just like the traditional game except that "
@@ -723,7 +827,7 @@ msgstr ""
 "Le morpion 3D, c'est comme la version traditionnelle. Sauf qu'on joue sur "
 "plusieurs étages en même temps."
 
-#: ../../addon/tictac/tictac.php:55
+#: ../../addon/tictac/tictac.php:55 ../../addon/tictac/tictac.php:61
 #, fuzzy
 msgid ""
 "In this case there are three levels. You win by getting three in a row on "
@@ -733,7 +837,7 @@ msgstr ""
 "trois coups dans n'importe quel étage, ainsi que verticalement ou en "
 "diagonale entre les étages."
 
-#: ../../addon/tictac/tictac.php:57
+#: ../../addon/tictac/tictac.php:57 ../../addon/tictac/tictac.php:63
 #, fuzzy
 msgid ""
 "The handicap game disables the center position on the middle level because "
@@ -742,42 +846,46 @@ msgstr ""
 "Le handicap interdit la position centrale de l'étage du milieu, parce que le "
 "joueur qui prend cette case obtient souvent un avantage."
 
-#: ../../addon/tictac/tictac.php:176
+#: ../../addon/tictac/tictac.php:176 ../../addon/tictac/tictac.php:182
 #, fuzzy
 msgid "You go first..."
 msgstr "À vous de jouer..."
 
-#: ../../addon/tictac/tictac.php:181
+#: ../../addon/tictac/tictac.php:181 ../../addon/tictac/tictac.php:187
 #, fuzzy
 msgid "I'm going first this time..."
 msgstr "Je commence..."
 
-#: ../../addon/tictac/tictac.php:187
+#: ../../addon/tictac/tictac.php:187 ../../addon/tictac/tictac.php:193
 #, fuzzy
 msgid "You won!"
 msgstr "Vous avez gagné!"
 
 #: ../../addon/tictac/tictac.php:193 ../../addon/tictac/tictac.php:218
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
 #, fuzzy
 msgid "\"Cat\" game!"
 msgstr "Match nul!"
 
-#: ../../addon/tictac/tictac.php:216
+#: ../../addon/tictac/tictac.php:216 ../../addon/tictac/tictac.php:222
 #, fuzzy
 msgid "I won!"
 msgstr "J'ai gagné!"
 
 #: ../../addon/statusnet/statusnet.php:78
+#: ../../addon/statusnet/statusnet.php:133
 #, fuzzy
 msgid "Post to StatusNet"
 msgstr "Poster sur StatusNet"
 
 #: ../../addon/statusnet/statusnet.php:146
+#: ../../addon/statusnet/statusnet.php:253
 #, fuzzy
 msgid "StatusNet Posting Settings"
 msgstr "Réglages du connecteur StatusNet"
 
 #: ../../addon/statusnet/statusnet.php:152
+#: ../../addon/statusnet/statusnet.php:277
 #, fuzzy
 msgid ""
 "No consumer key pair for StatusNet found. Register your Friendika Account as "
@@ -794,21 +902,25 @@ msgstr ""
 "fournisseur StatusNet."
 
 #: ../../addon/statusnet/statusnet.php:154
+#: ../../addon/statusnet/statusnet.php:279
 #, fuzzy
 msgid "OAuth Consumer Key"
 msgstr "Clé de consommateur OAuth"
 
 #: ../../addon/statusnet/statusnet.php:157
+#: ../../addon/statusnet/statusnet.php:282
 #, fuzzy
 msgid "OAuth Consumer Secret"
 msgstr "Secret de consommateur OAuth"
 
 #: ../../addon/statusnet/statusnet.php:160
+#: ../../addon/statusnet/statusnet.php:285
 #, fuzzy
 msgid "Base API Path (remember the trailing /)"
 msgstr "Chemin de base de l'API (n'oubliez pas le / final)"
 
 #: ../../addon/statusnet/statusnet.php:181
+#: ../../addon/statusnet/statusnet.php:306
 #, fuzzy
 msgid ""
 "To connect to your StatusNet account click the button below to get a "
@@ -822,11 +934,13 @@ msgstr ""
 "articles <strong>publics</strong> seront postés sur StatusNet."
 
 #: ../../addon/statusnet/statusnet.php:182
+#: ../../addon/statusnet/statusnet.php:307
 #, fuzzy
 msgid "Log in with StatusNet"
 msgstr "Se connecter à StatusNet"
 
 #: ../../addon/statusnet/statusnet.php:184
+#: ../../addon/statusnet/statusnet.php:309
 #, fuzzy
 msgid "Copy the security code from StatusNet here"
 msgstr "Collez le code de sécurité de StatusNet ici"
@@ -846,32 +960,38 @@ msgid "Send public postings to StatusNet"
 msgstr "Envoyer les contenus publics à StatusNet"
 
 #: ../../addon/js_upload/js_upload.php:39
+#: ../../addon/js_upload/js_upload.php:43
 #, fuzzy
 msgid "Upload a file"
 msgstr "Téléverser un fichier"
 
 #: ../../addon/js_upload/js_upload.php:40
+#: ../../addon/js_upload/js_upload.php:44
 #, fuzzy
 msgid "Drop files here to upload"
 msgstr "Déposer des fichiers ici pour les téléverser"
 
 #: ../../addon/js_upload/js_upload.php:41 ../../mod/tagrm.php:11
 #: ../../mod/tagrm.php:94 ../../mod/dfrn_request.php:628
-#: ../../mod/dfrn_request.php:630
+#: ../../mod/dfrn_request.php:630 ../../mod/dfrn_request.php:644
+#: ../../addon/js_upload/js_upload.php:45 ../../mod/dfrn_request.php:642
 msgid "Cancel"
 msgstr "Annuler"
 
 #: ../../addon/js_upload/js_upload.php:42
+#: ../../addon/js_upload/js_upload.php:46
 #, fuzzy
 msgid "Failed"
 msgstr "Échec"
 
 #: ../../addon/js_upload/js_upload.php:288
+#: ../../addon/js_upload/js_upload.php:292
 #, fuzzy
 msgid "No files were uploaded."
 msgstr "Aucun fichier n'a été téléversé."
 
 #: ../../addon/js_upload/js_upload.php:294
+#: ../../addon/js_upload/js_upload.php:298
 #, fuzzy
 msgid "Uploaded file is empty"
 msgstr "Le fichier téléversé est vide"
@@ -882,21 +1002,26 @@ msgid "Uploaded file is too large"
 msgstr "Le fichier téléversé est trop volumineux"
 
 #: ../../addon/js_upload/js_upload.php:306 ../../mod/photos.php:559
+#: ../../mod/photos.php:563 ../../addon/js_upload/js_upload.php:310
+#: ../../mod/photos.php:608
 msgid "Image exceeds size limit of "
 msgstr "L'image dépasse la taille maximale de  "
 
 #: ../../addon/js_upload/js_upload.php:317
+#: ../../addon/js_upload/js_upload.php:321
 #, fuzzy
 msgid "File has an invalid extension, it should be one of "
 msgstr "Le fichier a une extension invalide, elle devrait être parmi "
 
 #: ../../addon/js_upload/js_upload.php:328
+#: ../../addon/js_upload/js_upload.php:332
 #, fuzzy
 msgid "Upload was cancelled, or server error encountered"
 msgstr "Téléversement annulé, ou erreur de serveur"
 
 #: ../../mod/profiles.php:21 ../../mod/profiles.php:237
 #: ../../mod/profiles.php:342 ../../mod/dfrn_confirm.php:62
+#: ../../mod/profiles.php:236 ../../mod/profiles.php:341
 msgid "Profile not found."
 msgstr "Profil introuvable."
 
@@ -904,27 +1029,30 @@ msgstr "Profil introuvable."
 msgid "Profile Name is required."
 msgstr "Le nom du profil est requis."
 
-#: ../../mod/profiles.php:199
+#: ../../mod/profiles.php:199 ../../mod/profiles.php:198
 msgid "Profile updated."
 msgstr "Profil mis à jour."
 
-#: ../../mod/profiles.php:254
+#: ../../mod/profiles.php:254 ../../mod/profiles.php:253
 msgid "Profile deleted."
 msgstr "Profil supprimé."
 
 #: ../../mod/profiles.php:270 ../../mod/profiles.php:301
+#: ../../mod/profiles.php:269 ../../mod/profiles.php:300
 msgid "Profile-"
 msgstr "Profil-"
 
 #: ../../mod/profiles.php:289 ../../mod/profiles.php:328
+#: ../../mod/profiles.php:288 ../../mod/profiles.php:327
 msgid "New profile created."
 msgstr "Nouveau profil créé."
 
-#: ../../mod/profiles.php:307
+#: ../../mod/profiles.php:307 ../../mod/profiles.php:306
 msgid "Profile unavailable to clone."
 msgstr "Ce profil ne peut être cloné."
 
 #: ../../mod/profiles.php:370 ../../mod/profiles.php:411
+#: ../../mod/profiles.php:413
 msgid ""
 "This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
 "be visible to anybody using the internet."
@@ -934,6 +1062,8 @@ msgstr ""
 
 #: ../../mod/profiles.php:380 ../../mod/directory.php:89
 #: ../../mod/profiles.php:421 ../../mod/directory.php:91
+#: ../../mod/directory.php:97 ../../mod/profiles.php:423
+#: ../../mod/directory.php:112
 msgid "Age: "
 msgstr "Age: "
 
@@ -948,60 +1078,69 @@ msgid "Image exceeds size limit of %d"
 msgstr "L'image excède la taille limite de %d"
 
 #: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:118
-#: ../../mod/photos.php:571
+#: ../../mod/photos.php:571 ../../mod/photos.php:575 ../../mod/photos.php:630
 msgid "Unable to process image."
 msgstr "Impossible de traiter l'image."
 
 #: ../../mod/wall_upload.php:79 ../../mod/wall_upload.php:88
 #: ../../mod/wall_upload.php:95 ../../mod/message.php:93
-#: ../../mod/item.php:212
+#: ../../mod/item.php:212 ../../mod/item.php:214 ../../include/message.php:82
+#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
+#: ../../mod/wall_upload.php:97 ../../mod/item.php:296
 msgid "Wall Photos"
 msgstr "Photos du mur"
 
 #: ../../mod/wall_upload.php:82 ../../mod/profile_photo.php:230
 #: ../../mod/photos.php:589 ../../mod/profile_photo.php:232
-#: ../../mod/profile_photo.php:236
+#: ../../mod/profile_photo.php:236 ../../mod/profile_photo.php:241
+#: ../../mod/photos.php:593 ../../mod/wall_upload.php:84
+#: ../../mod/photos.php:650
 #, fuzzy
 msgid "Image upload failed."
 msgstr "Le téléversement de l'image a échoué."
 
-#: ../../mod/register.php:47
+#: ../../mod/register.php:47 ../../mod/register.php:66
 msgid "Invalid OpenID url"
 msgstr "Adresse OpenID invalide"
 
-#: ../../mod/register.php:62
+#: ../../mod/register.php:62 ../../mod/register.php:81
 msgid "Please enter the required information."
 msgstr "Entrez les informations requises."
 
-#: ../../mod/register.php:74
+#: ../../mod/register.php:74 ../../mod/register.php:95
 msgid "Please use a shorter name."
 msgstr "Utilisez un nom plus court."
 
-#: ../../mod/register.php:76
+#: ../../mod/register.php:76 ../../mod/register.php:97
 msgid "Name too short."
 msgstr "Nom trop court."
 
-#: ../../mod/register.php:89
+#: ../../mod/register.php:89 ../../mod/register.php:91
+#: ../../mod/register.php:112
 #, fuzzy
 msgid "That doesn't appear to be your full (First Last) name."
 msgstr "Ceci ne semble pas être votre nom complet (Prénom Nom)."
 
-#: ../../mod/register.php:92
+#: ../../mod/register.php:92 ../../mod/register.php:95
+#: ../../mod/register.php:117
 #, fuzzy
 msgid "Your email domain is not among those allowed on this site."
 msgstr "Votre domaine de courriel n'est pas autorisé sur ce site."
 
-#: ../../mod/register.php:95
+#: ../../mod/register.php:95 ../../mod/register.php:98
+#: ../../mod/register.php:120
 #, fuzzy
 msgid "Not a valid email address."
 msgstr "Ceci n'est pas une adresse courriel valide."
 
-#: ../../mod/register.php:101
+#: ../../mod/register.php:101 ../../mod/register.php:104
+#: ../../mod/register.php:130
 #, fuzzy
 msgid "Cannot use that email."
 msgstr "Impossible d'utiliser ce courriel."
 
-#: ../../mod/register.php:106
+#: ../../mod/register.php:106 ../../mod/register.php:109
+#: ../../mod/register.php:136
 msgid ""
 "Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
 "must also begin with a letter."
@@ -1010,22 +1149,25 @@ msgstr ""
 "\", and \"_\", et doit commencer par une lettre."
 
 #: ../../mod/register.php:112 ../../mod/register.php:212
+#: ../../mod/register.php:115 ../../mod/register.php:215
+#: ../../mod/register.php:142 ../../mod/register.php:243
 msgid "Nickname is already registered. Please choose another."
 msgstr "Pseudo déjà utilisé. Merci d'en choisir un autre."
 
-#: ../../mod/register.php:131
+#: ../../mod/register.php:131 ../../mod/register.php:134
+#: ../../mod/register.php:161
 msgid "SERIOUS ERROR: Generation of security keys failed."
 msgstr "ERREUR SÉRIEUSE: La génération des clés de sécurité a échoué."
 
-#: ../../mod/register.php:198
+#: ../../mod/register.php:198 ../../mod/register.php:201
+#: ../../mod/register.php:229
 msgid "An error occurred during registration. Please try again."
 msgstr "Une erreur est survenue lors de l'inscription. Merci de recommencer."
 
 #: ../../mod/register.php:216 ../../mod/register.php:234
+#: ../../mod/register.php:237 ../../mod/register.php:265
 msgid "An error occurred creating your default profile. Please try again."
-msgstr ""
-"Une erreur est survenue lors de la création de votre profil par défaut. "
-"Merci de recommencer."
+msgstr "Une erreur est survenue lors de la création de votre profil par défaut. Merci de recommencer."
 
 #: ../../mod/register.php:267 ../../mod/register.php:274
 #: ../../mod/register.php:281 ../../mod/profile_photo.php:58
@@ -1037,40 +1179,60 @@ msgstr ""
 #: ../../mod/register.php:299 ../../mod/profile_photo.php:227
 #: ../../mod/profile_photo.php:236 ../../mod/profile_photo.php:231
 #: ../../mod/profile_photo.php:240 ../../mod/photos.php:854
-#: ../../mod/photos.php:869
+#: ../../mod/photos.php:869 ../../mod/register.php:288
+#: ../../mod/register.php:295 ../../mod/register.php:302
+#: ../../mod/profile_photo.php:160 ../../mod/profile_photo.php:245
+#: ../../mod/photos.php:110 ../../mod/photos.php:535 ../../mod/photos.php:875
+#: ../../mod/photos.php:890 ../../mod/register.php:316
+#: ../../mod/register.php:323 ../../mod/register.php:330
+#: ../../mod/photos.php:143 ../../mod/photos.php:577 ../../mod/photos.php:926
+#: ../../mod/photos.php:941
 msgid "Profile Photos"
 msgstr "Photos du profil"
 
 #: ../../mod/register.php:310 ../../mod/regmod.php:92
-#: ../../mod/register.php:328
+#: ../../mod/register.php:328 ../../mod/register.php:331
+#: ../../mod/register.php:367 ../../mod/regmod.php:52
 #, fuzzy, php-format
 msgid "Registration details for %s"
 msgstr "Détails d'inscription pour %s"
 
 #: ../../mod/register.php:315 ../../mod/register.php:333
+#: ../../mod/register.php:336 ../../mod/register.php:339
+#: ../../mod/register.php:375
 msgid ""
 "Registration successful. Please check your email for further instructions."
 msgstr ""
 "Inscription réussie. Vérifiez vos emails pour la suite des instructions."
 
 #: ../../mod/register.php:319 ../../mod/register.php:337
+#: ../../mod/register.php:340 ../../mod/register.php:343
+#: ../../mod/register.php:379
 msgid "Failed to send email message. Here is the message that failed."
 msgstr "Impossible d'envoyer un email. Voici le message qui a échoué."
 
 #: ../../mod/register.php:324 ../../mod/register.php:342
+#: ../../mod/register.php:345 ../../mod/register.php:348
+#: ../../mod/register.php:384
 msgid "Your registration can not be processed."
 msgstr "Votre inscription ne peut être traitée."
 
 #: ../../mod/register.php:347 ../../mod/register.php:365
+#: ../../mod/register.php:368 ../../mod/register.php:371
+#: ../../mod/register.php:421
 #, fuzzy, php-format
 msgid "Registration request at %s"
 msgstr "Demande d'inscription à %s"
 
 #: ../../mod/register.php:351 ../../mod/register.php:369
+#: ../../mod/register.php:372 ../../mod/register.php:377
+#: ../../mod/register.php:430
 msgid "Your registration is pending approval by the site owner."
 msgstr "Votre inscription attend une validation du propriétaire du site."
 
 #: ../../mod/register.php:399 ../../mod/register.php:417
+#: ../../mod/register.php:420 ../../mod/register.php:425
+#: ../../mod/register.php:479
 #, fuzzy
 msgid ""
 "You may (optionally) fill in this form via OpenID by supplying your OpenID "
@@ -1080,6 +1242,8 @@ msgstr ""
 "Fournissez votre OpenID et cliquez \"S'inscrire\"."
 
 #: ../../mod/register.php:400 ../../mod/register.php:418
+#: ../../mod/register.php:421 ../../mod/register.php:426
+#: ../../mod/register.php:480
 msgid ""
 "If you are not familiar with OpenID, please leave that field blank and fill "
 "in the rest of the items."
@@ -1088,10 +1252,14 @@ msgstr ""
 "le reste."
 
 #: ../../mod/register.php:401 ../../mod/register.php:419
+#: ../../mod/register.php:422 ../../mod/register.php:427
+#: ../../mod/register.php:481
 msgid "Your OpenID (optional): "
 msgstr "Votre OpenID (facultatif): "
 
 #: ../../mod/register.php:415 ../../mod/register.php:433
+#: ../../mod/register.php:436 ../../mod/register.php:441
+#: ../../mod/register.php:495
 #, fuzzy
 msgid "Include your profile in member directory?"
 msgstr "Inclure votre profil dans l'annuaire des membres?"
@@ -1099,14 +1267,26 @@ msgstr "Inclure votre profil dans l'annuaire des membres?"
 #: ../../mod/register.php:418 ../../mod/dfrn_request.php:618
 #: ../../mod/register.php:436 ../../mod/profiles.php:355
 #: ../../mod/settings.php:289 ../../mod/settings.php:301
-#: ../../mod/dfrn_request.php:620
+#: ../../mod/dfrn_request.php:620 ../../mod/register.php:439
+#: ../../mod/register.php:444 ../../mod/settings.php:350
+#: ../../mod/settings.php:362 ../../mod/dfrn_request.php:634
+#: ../../mod/profiles.php:354 ../../mod/register.php:498
+#: ../../mod/settings.php:415 ../../mod/settings.php:421
+#: ../../mod/settings.php:429 ../../mod/settings.php:433
+#: ../../mod/dfrn_request.php:632
 msgid "Yes"
 msgstr "Oui"
 
 #: ../../mod/register.php:419 ../../mod/dfrn_request.php:619
 #: ../../mod/register.php:437 ../../mod/profiles.php:356
 #: ../../mod/settings.php:290 ../../mod/settings.php:302
-#: ../../mod/dfrn_request.php:621
+#: ../../mod/dfrn_request.php:621 ../../mod/register.php:440
+#: ../../mod/register.php:445 ../../mod/settings.php:351
+#: ../../mod/settings.php:363 ../../mod/dfrn_request.php:635
+#: ../../mod/profiles.php:355 ../../mod/register.php:499
+#: ../../mod/settings.php:415 ../../mod/settings.php:421
+#: ../../mod/settings.php:429 ../../mod/settings.php:433
+#: ../../mod/dfrn_request.php:633
 msgid "No"
 msgstr "Non"
 
@@ -1119,7 +1299,10 @@ msgstr "Non"
 #: ../../mod/profile.php:489 ../../mod/network.php:274
 #: ../../mod/display.php:135 ../../mod/profile.php:300
 #: ../../mod/network.php:277 ../../mod/display.php:140
-#: ../../mod/display.php:142
+#: ../../mod/display.php:142 ../../mod/register.php:445
+#: ../../mod/register.php:450 ../../mod/network.php:259
+#: ../../mod/display.php:147 ../../mod/profile.php:262
+#: ../../include/text.php:913 ../../mod/community.php:83
 msgid ""
 "Shared content is covered by the <a href=\"http://creativecommons.org/"
 "licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."
@@ -1128,20 +1311,28 @@ msgstr ""
 "creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a>."
 
 #: ../../mod/register.php:431 ../../mod/register.php:449
+#: ../../mod/register.php:452 ../../mod/register.php:457
+#: ../../mod/register.php:515 ../../mod/admin.php:301
 msgid "Registration"
 msgstr "Inscription"
 
 #: ../../mod/register.php:439 ../../mod/register.php:457
+#: ../../mod/register.php:460 ../../mod/register.php:465
+#: ../../mod/register.php:523
 #, fuzzy
 msgid "Your Full Name (e.g. Joe Smith): "
 msgstr "Votre nom complet (p.ex. Michel Dupont): "
 
 #: ../../mod/register.php:440 ../../mod/register.php:458
+#: ../../mod/register.php:461 ../../mod/register.php:466
+#: ../../mod/register.php:524
 #, fuzzy
 msgid "Your Email Address: "
 msgstr "Votre adresse courriel: "
 
 #: ../../mod/register.php:441 ../../mod/register.php:459
+#: ../../mod/register.php:462 ../../mod/register.php:467
+#: ../../mod/register.php:525
 #, fuzzy
 msgid ""
 "Choose a profile nickname. This must begin with a text character. Your "
@@ -1152,6 +1343,8 @@ msgstr ""
 "votre profil en découlera sous la forme '<strong>pseudo@$sitename</strong>'."
 
 #: ../../mod/register.php:442 ../../mod/register.php:460
+#: ../../mod/register.php:463 ../../mod/register.php:468
+#: ../../mod/register.php:526
 msgid "Choose a nickname: "
 msgstr "Choisir un pseudo: "
 
@@ -1172,7 +1365,8 @@ msgstr "Vue des nouveautés"
 #: ../../mod/profile.php:134 ../../mod/profile.php:137
 #: ../../mod/mprofile.php:136 ../../mod/network.php:77
 #: ../../mod/profile.php:130 ../../mod/network.php:75
-#: ../../mod/profile.php:131
+#: ../../mod/profile.php:131 ../../include/conversation.php:674
+#: ../../include/conversation.php:699 ../../mod/message.php:98
 #, fuzzy
 msgid "Please enter a link URL:"
 msgstr "Entrez un lien web:"
@@ -1180,7 +1374,8 @@ msgstr "Entrez un lien web:"
 #: ../../mod/network.php:70 ../../mod/profile.php:135
 #: ../../mod/profile.php:138 ../../mod/mprofile.php:137
 #: ../../mod/network.php:78 ../../mod/profile.php:131 ../../mod/network.php:76
-#: ../../mod/profile.php:132
+#: ../../mod/profile.php:132 ../../include/conversation.php:675
+#: ../../include/conversation.php:700
 #, fuzzy
 msgid "Please enter a YouTube link:"
 msgstr "Entrez un lien Youtube:"
@@ -1188,7 +1383,8 @@ msgstr "Entrez un lien Youtube:"
 #: ../../mod/network.php:71 ../../mod/profile.php:136
 #: ../../mod/profile.php:139 ../../mod/mprofile.php:138
 #: ../../mod/network.php:79 ../../mod/profile.php:132 ../../mod/network.php:77
-#: ../../mod/profile.php:133
+#: ../../mod/profile.php:133 ../../include/conversation.php:676
+#: ../../include/conversation.php:701
 #, fuzzy
 msgid "Please enter a video(.ogg) link/URL:"
 msgstr "Entrez un lien vidéo (.ogg):"
@@ -1196,7 +1392,8 @@ msgstr "Entrez un lien vidéo (.ogg):"
 #: ../../mod/network.php:72 ../../mod/profile.php:137
 #: ../../mod/profile.php:140 ../../mod/mprofile.php:139
 #: ../../mod/network.php:80 ../../mod/profile.php:133 ../../mod/network.php:78
-#: ../../mod/profile.php:134
+#: ../../mod/profile.php:134 ../../include/conversation.php:677
+#: ../../include/conversation.php:702
 #, fuzzy
 msgid "Please enter an audio(.ogg) link/URL:"
 msgstr "Entrez un lien audio (.ogg):"
@@ -1204,7 +1401,8 @@ msgstr "Entrez un lien audio (.ogg):"
 #: ../../mod/network.php:73 ../../mod/profile.php:138
 #: ../../mod/profile.php:141 ../../mod/mprofile.php:140
 #: ../../mod/network.php:81 ../../mod/profile.php:134 ../../mod/network.php:79
-#: ../../mod/profile.php:135
+#: ../../mod/profile.php:135 ../../include/conversation.php:678
+#: ../../include/conversation.php:703
 #, fuzzy
 msgid "Where are you right now?"
 msgstr "Où êtes-vous présentemment?"
@@ -1221,6 +1419,9 @@ msgstr "Où êtes-vous présentemment?"
 #: ../../include/conversation.php:276 ../../mod/network.php:103
 #: ../../include/conversation.php:290 ../../include/conversation.php:300
 #: ../../mod/profile.php:159 ../../mod/photos.php:1089
+#: ../../include/conversation.php:359 ../../include/conversation.php:718
+#: ../../mod/photos.php:1111 ../../include/conversation.php:392
+#: ../../include/conversation.php:746 ../../mod/photos.php:1164
 #, fuzzy
 msgid "Share"
 msgstr "Partager"
@@ -1232,7 +1433,10 @@ msgstr "Partager"
 #: ../../mod/profile.php:166 ../../mod/network.php:106
 #: ../../mod/message.php:188 ../../mod/message.php:322
 #: ../../mod/profile.php:159 ../../mod/network.php:104
-#: ../../mod/profile.php:160
+#: ../../mod/profile.php:160 ../../include/conversation.php:719
+#: ../../mod/editpost.php:89 ../../include/conversation.php:747
+#: ../../mod/message.php:114 ../../mod/message.php:248
+#: ../../mod/editpost.php:91
 msgid "Upload photo"
 msgstr "Joindre photo"
 
@@ -1243,7 +1447,10 @@ msgstr "Joindre photo"
 #: ../../mod/profile.php:167 ../../mod/network.php:107
 #: ../../mod/message.php:189 ../../mod/message.php:323
 #: ../../mod/profile.php:160 ../../mod/network.php:105
-#: ../../mod/profile.php:161
+#: ../../mod/profile.php:161 ../../include/conversation.php:720
+#: ../../mod/editpost.php:90 ../../include/conversation.php:749
+#: ../../mod/message.php:115 ../../mod/message.php:249
+#: ../../mod/editpost.php:93
 msgid "Insert web link"
 msgstr "Insérer lien web"
 
@@ -1252,7 +1459,9 @@ msgstr "Insérer lien web"
 #: ../../mod/network.php:100 ../../mod/mprofile.php:166
 #: ../../mod/profile.php:168 ../../mod/network.php:108
 #: ../../mod/profile.php:161 ../../mod/network.php:106
-#: ../../mod/profile.php:162
+#: ../../mod/profile.php:162 ../../include/conversation.php:721
+#: ../../mod/editpost.php:91 ../../include/conversation.php:750
+#: ../../mod/editpost.php:94
 #, fuzzy
 msgid "Insert YouTube video"
 msgstr "Insérer une vidéo Youtube"
@@ -1262,7 +1471,9 @@ msgstr "Insérer une vidéo Youtube"
 #: ../../mod/network.php:101 ../../mod/mprofile.php:167
 #: ../../mod/profile.php:169 ../../mod/network.php:109
 #: ../../mod/profile.php:162 ../../mod/network.php:107
-#: ../../mod/profile.php:163
+#: ../../mod/profile.php:163 ../../include/conversation.php:722
+#: ../../mod/editpost.php:92 ../../include/conversation.php:751
+#: ../../mod/editpost.php:95
 #, fuzzy
 msgid "Insert Vorbis [.ogg] video"
 msgstr "Insérer un lien vidéo Vorbis [.ogg]"
@@ -1272,7 +1483,9 @@ msgstr "Insérer un lien vidéo Vorbis [.ogg]"
 #: ../../mod/network.php:102 ../../mod/mprofile.php:168
 #: ../../mod/profile.php:170 ../../mod/network.php:110
 #: ../../mod/profile.php:163 ../../mod/network.php:108
-#: ../../mod/profile.php:164
+#: ../../mod/profile.php:164 ../../include/conversation.php:723
+#: ../../mod/editpost.php:93 ../../include/conversation.php:752
+#: ../../mod/editpost.php:96
 #, fuzzy
 msgid "Insert Vorbis [.ogg] audio"
 msgstr "Insérer un lien audio Vorbis [.ogg]"
@@ -1282,7 +1495,9 @@ msgstr "Insérer un lien audio Vorbis [.ogg]"
 #: ../../mod/network.php:103 ../../mod/mprofile.php:169
 #: ../../mod/profile.php:171 ../../mod/network.php:111
 #: ../../mod/profile.php:164 ../../mod/network.php:109
-#: ../../mod/profile.php:165
+#: ../../mod/profile.php:165 ../../include/conversation.php:724
+#: ../../mod/editpost.php:94 ../../include/conversation.php:753
+#: ../../mod/editpost.php:97
 #, fuzzy
 msgid "Set your location"
 msgstr "Définir votre localisation"
@@ -1292,7 +1507,9 @@ msgstr "Définir votre localisation"
 #: ../../mod/network.php:104 ../../mod/mprofile.php:170
 #: ../../mod/profile.php:172 ../../mod/network.php:112
 #: ../../mod/profile.php:165 ../../mod/network.php:110
-#: ../../mod/profile.php:166
+#: ../../mod/profile.php:166 ../../include/conversation.php:725
+#: ../../mod/editpost.php:95 ../../include/conversation.php:754
+#: ../../mod/editpost.php:98
 #, fuzzy
 msgid "Clear browser location"
 msgstr "Effacer la localisation du navigateur"
@@ -1311,7 +1528,12 @@ msgstr "Effacer la localisation du navigateur"
 #: ../../mod/profile.php:373 ../../include/conversation.php:277
 #: ../../mod/network.php:112 ../../include/conversation.php:291
 #: ../../include/conversation.php:301 ../../mod/profile.php:168
-#: ../../mod/photos.php:1090
+#: ../../mod/photos.php:1090 ../../include/conversation.php:360
+#: ../../include/conversation.php:727 ../../mod/photos.php:1112
+#: ../../mod/editpost.php:96 ../../include/conversation.php:393
+#: ../../include/conversation.php:756 ../../mod/message.php:116
+#: ../../mod/message.php:250 ../../mod/photos.php:1165
+#: ../../mod/editpost.php:99
 msgid "Please wait"
 msgstr "Patientez"
 
@@ -1320,7 +1542,9 @@ msgstr "Patientez"
 #: ../../mod/network.php:107 ../../mod/mprofile.php:172
 #: ../../mod/profile.php:175 ../../mod/network.php:115
 #: ../../mod/profile.php:168 ../../mod/network.php:113
-#: ../../mod/profile.php:169
+#: ../../mod/profile.php:169 ../../include/conversation.php:728
+#: ../../mod/editpost.php:97 ../../include/conversation.php:757
+#: ../../mod/editpost.php:100
 #, fuzzy
 msgid "Permission settings"
 msgstr "Réglages des permissions"
@@ -1330,7 +1554,9 @@ msgstr "Réglages des permissions"
 #: ../../mod/network.php:113 ../../mod/mprofile.php:179
 #: ../../mod/profile.php:182 ../../mod/network.php:121
 #: ../../mod/profile.php:175 ../../mod/network.php:119
-#: ../../mod/profile.php:176
+#: ../../mod/profile.php:176 ../../include/conversation.php:734
+#: ../../mod/editpost.php:103 ../../include/conversation.php:765
+#: ../../mod/editpost.php:108
 #, fuzzy
 msgid "CC: email addresses"
 msgstr "CC: adresse de courriel"
@@ -1340,23 +1566,28 @@ msgstr "CC: adresse de courriel"
 #: ../../mod/network.php:115 ../../mod/mprofile.php:181
 #: ../../mod/profile.php:184 ../../mod/network.php:123
 #: ../../mod/profile.php:177 ../../mod/network.php:121
-#: ../../mod/profile.php:178
+#: ../../mod/profile.php:178 ../../include/conversation.php:736
+#: ../../mod/editpost.php:105 ../../include/conversation.php:768
+#: ../../mod/editpost.php:111
 #, fuzzy
 msgid "Example: bob@example.com, mary@example.com"
 msgstr "Exemple: bob@exemple.com, mary@exemple.com"
 
 #: ../../mod/network.php:156 ../../mod/network.php:158
 #: ../../mod/network.php:166 ../../mod/network.php:164
+#: ../../mod/network.php:126
 msgid "No such group"
 msgstr "Groupe inexistant"
 
 #: ../../mod/network.php:167 ../../mod/network.php:169
 #: ../../mod/network.php:177 ../../mod/network.php:175
+#: ../../mod/network.php:137
 msgid "Group is empty"
 msgstr "Groupe vide"
 
 #: ../../mod/network.php:171 ../../mod/network.php:173
 #: ../../mod/network.php:181 ../../mod/network.php:179
+#: ../../mod/network.php:141 ../../mod/network.php:180
 msgid "Group: "
 msgstr "Groupe: "
 
@@ -1375,7 +1606,8 @@ msgstr "Voir le profil de $name"
 #: ../../mod/network.php:318 ../../mod/network.php:336
 #: ../../mod/network.php:346 ../../mod/search.php:140
 #: ../../include/conversation.php:134 ../../include/conversation.php:132
-#: ../../include/conversation.php:142
+#: ../../include/conversation.php:142 ../../include/conversation.php:200
+#: ../../include/conversation.php:230
 msgid "View in context"
 msgstr "Voir dans le contexte"
 
@@ -1386,6 +1618,8 @@ msgstr "Voir dans le contexte"
 #: ../../mod/network.php:443 ../../mod/profile.php:363
 #: ../../include/conversation.php:232 ../../include/conversation.php:240
 #: ../../include/conversation.php:250 ../../mod/photos.php:965
+#: ../../include/conversation.php:309 ../../mod/photos.php:989
+#: ../../include/conversation.php:342 ../../mod/photos.php:1040
 msgid "Private Message"
 msgstr "Message privé"
 
@@ -1396,6 +1630,8 @@ msgstr "Message privé"
 #: ../../mod/network.php:487 ../../mod/profile.php:370
 #: ../../include/conversation.php:274 ../../include/conversation.php:288
 #: ../../include/conversation.php:298 ../../mod/photos.php:1087
+#: ../../include/conversation.php:357 ../../mod/photos.php:1109
+#: ../../include/conversation.php:390 ../../mod/photos.php:1162
 #, fuzzy
 msgid "I like this (toggle)"
 msgstr "I like this (bascule)"
@@ -1407,6 +1643,8 @@ msgstr "I like this (bascule)"
 #: ../../mod/network.php:488 ../../mod/profile.php:371
 #: ../../include/conversation.php:275 ../../include/conversation.php:289
 #: ../../include/conversation.php:299 ../../mod/photos.php:1088
+#: ../../include/conversation.php:358 ../../mod/photos.php:1110
+#: ../../include/conversation.php:391 ../../mod/photos.php:1163
 #, fuzzy
 msgid "I don't like this (toggle)"
 msgstr "I don't like this (bascule)"
@@ -1421,6 +1659,10 @@ msgstr "I don't like this (bascule)"
 #: ../../include/conversation.php:290 ../../include/conversation.php:304
 #: ../../include/conversation.php:314 ../../mod/photos.php:1109
 #: ../../mod/photos.php:1151 ../../mod/photos.php:1180
+#: ../../include/conversation.php:373 ../../mod/photos.php:1128
+#: ../../mod/photos.php:1167 ../../mod/photos.php:1198
+#: ../../include/conversation.php:406 ../../mod/photos.php:1181
+#: ../../mod/photos.php:1220 ../../mod/photos.php:1251
 msgid "This is you"
 msgstr "C'est vous"
 
@@ -1431,7 +1673,10 @@ msgstr "C'est vous"
 #: ../../mod/network.php:513 ../../mod/display.php:224
 #: ../../mod/profile.php:411 ../../include/conversation.php:301
 #: ../../include/conversation.php:315 ../../include/conversation.php:325
-#: ../../include/group.php:168
+#: ../../include/group.php:168 ../../include/conversation.php:384
+#: ../../include/group.php:169 ../../mod/editpost.php:88
+#: ../../include/conversation.php:417 ../../include/group.php:172
+#: ../../include/group.php:173 ../../mod/editpost.php:90
 #, fuzzy
 msgid "Edit"
 msgstr "Éditer"
@@ -1446,6 +1691,9 @@ msgstr "Éditer"
 #: ../../include/conversation.php:107 ../../include/conversation.php:317
 #: ../../include/conversation.php:117 ../../include/conversation.php:327
 #: ../../mod/group.php:146 ../../mod/photos.php:1208
+#: ../../include/conversation.php:174 ../../include/conversation.php:386
+#: ../../mod/photos.php:1228 ../../include/conversation.php:427
+#: ../../mod/admin.php:471 ../../mod/group.php:154 ../../mod/photos.php:1281
 #, fuzzy
 msgid "Delete"
 msgstr "Supprimer"
@@ -1461,7 +1709,8 @@ msgstr "Voir le profil de $owner_name"
 #: ../../mod/network.php:514 ../../mod/network.php:552
 #: ../../mod/network.php:565 ../../mod/display.php:266
 #: ../../include/conversation.php:363 ../../include/conversation.php:378
-#: ../../include/conversation.php:388
+#: ../../include/conversation.php:388 ../../include/conversation.php:443
+#: ../../include/conversation.php:490
 #, fuzzy
 msgid "to"
 msgstr "à"
@@ -1470,7 +1719,8 @@ msgstr "à"
 #: ../../mod/network.php:515 ../../mod/network.php:553
 #: ../../mod/network.php:566 ../../mod/display.php:267
 #: ../../include/conversation.php:364 ../../include/conversation.php:379
-#: ../../include/conversation.php:389
+#: ../../include/conversation.php:389 ../../include/conversation.php:444
+#: ../../include/conversation.php:491
 #, fuzzy
 msgid "Wall-to-Wall"
 msgstr "Inter-mur"
@@ -1479,62 +1729,76 @@ msgstr "Inter-mur"
 #: ../../mod/network.php:516 ../../mod/network.php:554
 #: ../../mod/network.php:567 ../../mod/display.php:268
 #: ../../include/conversation.php:365 ../../include/conversation.php:380
-#: ../../include/conversation.php:390
+#: ../../include/conversation.php:390 ../../include/conversation.php:445
+#: ../../include/conversation.php:492
 #, fuzzy
 msgid "via Wall-To-Wall:"
 msgstr "en Inter-mur:"
 
 #: ../../mod/like.php:110 ../../mod/photos.php:469
+#: ../../include/conversation.php:20 ../../mod/photos.php:473
+#: ../../include/conversation.php:31 ../../include/diaspora.php:786
+#: ../../mod/like.php:106 ../../mod/photos.php:508
 #, fuzzy
 msgid "photo"
 msgstr "la photo"
 
-#: ../../mod/like.php:110
+#: ../../mod/like.php:110 ../../include/conversation.php:20
+#: ../../addon/facebook/facebook.php:745 ../../include/conversation.php:26
+#: ../../include/conversation.php:35 ../../include/diaspora.php:786
+#: ../../addon/facebook/facebook.php:958 ../../mod/like.php:106
 #, fuzzy
 msgid "status"
 msgstr "le statut"
 
-#: ../../mod/like.php:127
+#: ../../mod/like.php:127 ../../include/conversation.php:25
+#: ../../addon/facebook/facebook.php:749 ../../include/conversation.php:43
+#: ../../include/diaspora.php:802 ../../addon/facebook/facebook.php:962
+#: ../../mod/like.php:123
 #, fuzzy, php-format
 msgid "%1$s likes %2$s's %3$s"
 msgstr "%1$s aime %3$s de %2$s"
 
-#: ../../mod/like.php:129
+#: ../../mod/like.php:129 ../../include/conversation.php:28
+#: ../../include/conversation.php:46 ../../mod/like.php:125
 #, fuzzy, php-format
 msgid "%1$s doesn't like %2$s's %3$s"
 msgstr "%1$s n'aime pas %3$s de %2$s"
 
 #: ../../mod/dfrn_confirm.php:114 ../../mod/contacts.php:209
-#: ../../mod/contacts.php:214
+#: ../../mod/contacts.php:214 ../../mod/crepair.php:68
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+#: ../../mod/contacts.php:242
 msgid "Contact not found."
 msgstr "Contact introuvable."
 
-#: ../../mod/dfrn_confirm.php:231
+#: ../../mod/dfrn_confirm.php:231 ../../mod/dfrn_confirm.php:234
 msgid "Response from remote site was not understood."
 msgstr "Réponse du site distant incomprise."
 
-#: ../../mod/dfrn_confirm.php:240
+#: ../../mod/dfrn_confirm.php:240 ../../mod/dfrn_confirm.php:243
 msgid "Unexpected response from remote site: "
 msgstr "Réponse inattendue du site distant: "
 
-#: ../../mod/dfrn_confirm.php:248
+#: ../../mod/dfrn_confirm.php:248 ../../mod/dfrn_confirm.php:251
 msgid "Confirmation completed successfully."
 msgstr "Confirmation achevée avec succès."
 
 #: ../../mod/dfrn_confirm.php:250 ../../mod/dfrn_confirm.php:264
-#: ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:271 ../../mod/dfrn_confirm.php:253
+#: ../../mod/dfrn_confirm.php:267 ../../mod/dfrn_confirm.php:274
 msgid "Remote site reported: "
 msgstr "Alerte du site distant: "
 
-#: ../../mod/dfrn_confirm.php:262
+#: ../../mod/dfrn_confirm.php:262 ../../mod/dfrn_confirm.php:265
 msgid "Temporary failure. Please wait and try again."
 msgstr "Échec temporaire. Merci de recommencer ultérieurement."
 
-#: ../../mod/dfrn_confirm.php:269
+#: ../../mod/dfrn_confirm.php:269 ../../mod/dfrn_confirm.php:272
 msgid "Introduction failed or was revoked."
 msgstr "Introduction échouée ou annulée."
 
-#: ../../mod/dfrn_confirm.php:387
+#: ../../mod/dfrn_confirm.php:387 ../../mod/dfrn_confirm.php:409
 msgid "Unable to set contact photo."
 msgstr "Impossible de définir la photo du contact."
 
@@ -1543,23 +1807,28 @@ msgid "is now friends with"
 msgstr "est désormais relié à"
 
 #: ../../mod/dfrn_confirm.php:494 ../../mod/dfrn_confirm.php:499
+#: ../../mod/dfrn_confirm.php:501 ../../mod/dfrn_confirm.php:529
 #, fuzzy, php-format
 msgid "No user record found for '%s' "
 msgstr "Pas d'utilisateur trouvé pour '%s' "
 
 #: ../../mod/dfrn_confirm.php:504 ../../mod/dfrn_confirm.php:509
+#: ../../mod/dfrn_confirm.php:511 ../../mod/dfrn_confirm.php:539
 msgid "Our site encryption key is apparently messed up."
 msgstr "Notre clé de chiffrement de site est apparemment corrompue."
 
 #: ../../mod/dfrn_confirm.php:515 ../../mod/dfrn_confirm.php:520
+#: ../../mod/dfrn_confirm.php:522 ../../mod/dfrn_confirm.php:550
 msgid "Empty site URL was provided or URL could not be decrypted by us."
 msgstr "URL de site absente ou indéchiffrable."
 
 #: ../../mod/dfrn_confirm.php:527 ../../mod/dfrn_confirm.php:532
+#: ../../mod/dfrn_confirm.php:534 ../../mod/dfrn_confirm.php:571
 msgid "Contact record was not found for you on our site."
 msgstr "Pas d'entrée pour ce contact sur notre site."
 
 #: ../../mod/dfrn_confirm.php:555 ../../mod/dfrn_confirm.php:560
+#: ../../mod/dfrn_confirm.php:562 ../../mod/dfrn_confirm.php:600
 msgid ""
 "The ID provided by your system is a duplicate on our system. It should work "
 "if you try again."
@@ -1568,15 +1837,17 @@ msgstr ""
 "fonctionner si vous réessayez."
 
 #: ../../mod/dfrn_confirm.php:566 ../../mod/dfrn_confirm.php:571
+#: ../../mod/dfrn_confirm.php:573 ../../mod/dfrn_confirm.php:611
 msgid "Unable to set your contact credentials on our system."
 msgstr "Impossible de vous définir des permissions sur notre système."
 
 #: ../../mod/dfrn_confirm.php:619 ../../mod/dfrn_confirm.php:624
+#: ../../mod/dfrn_confirm.php:626 ../../mod/dfrn_confirm.php:665
 msgid "Unable to update your contact profile details on our system"
-msgstr ""
-"Impossible de mettre les détails de votre profil à jour sur notre système"
+msgstr "Impossible de mettre les détails de votre profil à jour sur notre système"
 
 #: ../../mod/dfrn_confirm.php:648 ../../mod/dfrn_confirm.php:653
+#: ../../mod/dfrn_confirm.php:655 ../../mod/dfrn_confirm.php:695
 #, fuzzy, php-format
 msgid "Connection accepted at %s"
 msgstr "Connexion acceptée avec %s"
@@ -1584,100 +1855,114 @@ msgstr "Connexion acceptée avec %s"
 #: ../../mod/display.php:15 ../../mod/display.php:312 ../../mod/item.php:598
 #: ../../mod/display.php:315 ../../mod/display.php:130
 #: ../../mod/display.php:135 ../../mod/display.php:20
-#: ../../mod/display.php:137
+#: ../../mod/display.php:137 ../../mod/display.php:25
+#: ../../mod/display.php:142 ../../mod/item.php:609
+#: ../../include/items.php:1860 ../../mod/display.php:112
+#: ../../mod/admin.php:118 ../../mod/admin.php:505
 msgid "Item not found."
 msgstr "Élément introuvable."
 
 #: ../../mod/display.php:305 ../../mod/display.php:308
 #: ../../mod/display.php:123 ../../mod/display.php:128
-#: ../../mod/display.php:130
+#: ../../mod/display.php:130 ../../mod/display.php:135
+#: ../../mod/display.php:105
 msgid "Item has been removed."
 msgstr "Cet élément a été enlevé."
 
-#: ../../mod/message.php:18
+#: ../../mod/message.php:18 ../../mod/message.php:23
 msgid "No recipient selected."
 msgstr "Pas de destinataire sélectionné."
 
-#: ../../mod/message.php:23
+#: ../../mod/message.php:23 ../../include/message.php:13
 msgid "[no subject]"
 msgstr "[pas de sujet]"
 
-#: ../../mod/message.php:34
+#: ../../mod/message.php:34 ../../mod/message.php:26
 msgid "Unable to locate contact information."
 msgstr "Impossible de localiser les informations du contact."
 
-#: ../../mod/message.php:102
+#: ../../mod/message.php:102 ../../mod/message.php:31
 msgid "Message sent."
 msgstr "Message envoyé."
 
-#: ../../mod/message.php:105
+#: ../../mod/message.php:105 ../../mod/message.php:29
 msgid "Message could not be sent."
 msgstr "Impossible d'envoyer le message."
 
-#: ../../mod/message.php:126
+#: ../../mod/message.php:126 ../../mod/message.php:52
 msgid "Inbox"
 msgstr "Messages entrants"
 
-#: ../../mod/message.php:127
+#: ../../mod/message.php:127 ../../mod/message.php:53
 msgid "Outbox"
 msgstr "Messages sortants"
 
-#: ../../mod/message.php:128
+#: ../../mod/message.php:128 ../../mod/message.php:54
 msgid "New Message"
 msgstr "Nouveau message"
 
-#: ../../mod/message.php:142
+#: ../../mod/message.php:142 ../../mod/message.php:68
 msgid "Message deleted."
 msgstr "Message supprimé."
 
-#: ../../mod/message.php:158
+#: ../../mod/message.php:158 ../../mod/message.php:84
 msgid "Conversation removed."
 msgstr "Conversation supprimée."
 
 #: ../../mod/message.php:178 ../../mod/message.php:180
+#: ../../mod/message.php:106
 msgid "Send Private Message"
 msgstr "Envoyer un message privé"
 
 #: ../../mod/message.php:179 ../../mod/message.php:313
 #: ../../mod/message.php:181 ../../mod/message.php:315
+#: ../../mod/message.php:107 ../../mod/message.php:241
 msgid "To:"
 msgstr "À:"
 
 #: ../../mod/message.php:180 ../../mod/message.php:314
 #: ../../mod/message.php:182 ../../mod/message.php:316
+#: ../../mod/message.php:108 ../../mod/message.php:242
 msgid "Subject:"
 msgstr "Sujet:"
 
 #: ../../mod/message.php:183 ../../mod/message.php:317 ../../mod/invite.php:59
-#: ../../mod/message.php:185 ../../mod/message.php:319
+#: ../../mod/message.php:185 ../../mod/message.php:319 ../../mod/invite.php:63
+#: ../../mod/message.php:111 ../../mod/message.php:245
+#: ../../mod/invite.php:101
 msgid "Your message:"
 msgstr "Votre message:"
 
 #: ../../mod/message.php:222 ../../mod/message.php:224
+#: ../../mod/message.php:150
 msgid "No messages."
 msgstr "Aucun message."
 
 #: ../../mod/message.php:235 ../../mod/message.php:237
+#: ../../mod/message.php:163
 msgid "Delete conversation"
 msgstr "Effacer conversation"
 
 #: ../../mod/message.php:265 ../../mod/message.php:267
+#: ../../mod/message.php:193
 msgid "Message not available."
 msgstr "Message indisponible."
 
 #: ../../mod/message.php:302 ../../mod/message.php:304
+#: ../../mod/message.php:230
 msgid "Delete message"
 msgstr "Effacer message"
 
 #: ../../mod/message.php:312 ../../mod/message.php:314
+#: ../../mod/message.php:240
 msgid "Send Reply"
 msgstr "Répondre"
 
-#: ../../mod/install.php:30 ../../mod/install.php:33
+#: ../../mod/install.php:30 ../../mod/install.php:33 ../../mod/install.php:34
 msgid "Could not create/connect to database."
 msgstr "Impossible de créer/atteindre la base de données."
 
-#: ../../mod/install.php:35 ../../mod/install.php:38
+#: ../../mod/install.php:35 ../../mod/install.php:38 ../../mod/install.php:39
 msgid "Connected to database."
 msgstr "Connecté à la base de données."
 
@@ -1685,7 +1970,7 @@ msgstr "Connecté à la base de données."
 msgid "Database import succeeded."
 msgstr "Import de base achevé avec succès."
 
-#: ../../mod/install.php:67 ../../mod/install.php:75
+#: ../../mod/install.php:67 ../../mod/install.php:75 ../../mod/install.php:78
 msgid ""
 "IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
 msgstr ""
@@ -1694,15 +1979,16 @@ msgstr ""
 
 #: ../../mod/install.php:68 ../../mod/install.php:75 ../../mod/install.php:175
 #: ../../mod/install.php:76 ../../mod/install.php:86 ../../mod/install.php:189
-#: ../../mod/install.php:199
+#: ../../mod/install.php:199 ../../mod/install.php:79 ../../mod/install.php:89
+#: ../../mod/install.php:207
 msgid "Please see the file \"INSTALL.txt\"."
 msgstr "Référez-vous au fichier \"INSTALL.txt\"."
 
-#: ../../mod/install.php:73 ../../mod/install.php:84
+#: ../../mod/install.php:73 ../../mod/install.php:84 ../../mod/install.php:87
 msgid "Database import failed."
 msgstr "Import de base échoué."
 
-#: ../../mod/install.php:74 ../../mod/install.php:85
+#: ../../mod/install.php:74 ../../mod/install.php:85 ../../mod/install.php:88
 msgid ""
 "You may need to import the file \"database.sql\" manually using phpmyadmin "
 "or mysql."
@@ -1710,19 +1996,17 @@ msgstr ""
 "Vous pourriez avoir besoin d'importer le fichier \"database.sql\" "
 "manuellement au moyen de phpmyadmin ou de la commande mysql."
 
-#: ../../mod/install.php:84 ../../mod/install.php:98
+#: ../../mod/install.php:84 ../../mod/install.php:98 ../../mod/install.php:101
 msgid "Welcome to Friendika."
 msgstr "Bienvenue sur Friendika."
 
 #: ../../mod/install.php:124 ../../mod/install.php:138
-#: ../../mod/install.php:148
+#: ../../mod/install.php:148 ../../mod/install.php:153
 msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr ""
-"Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH "
-"du serveur web."
+msgstr "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web."
 
 #: ../../mod/install.php:125 ../../mod/install.php:139
-#: ../../mod/install.php:149
+#: ../../mod/install.php:149 ../../mod/install.php:154
 msgid ""
 "This is required. Please adjust the configuration file .htconfig.php "
 "accordingly."
@@ -1731,7 +2015,7 @@ msgstr ""
 "php en conséquence."
 
 #: ../../mod/install.php:132 ../../mod/install.php:146
-#: ../../mod/install.php:156
+#: ../../mod/install.php:156 ../../mod/install.php:161
 msgid ""
 "The command line version of PHP on your system does not have "
 "\"register_argc_argv\" enabled."
@@ -1740,12 +2024,12 @@ msgstr ""
 "\"register_argc_argv\" d'activé."
 
 #: ../../mod/install.php:133 ../../mod/install.php:147
-#: ../../mod/install.php:157
+#: ../../mod/install.php:157 ../../mod/install.php:162
 msgid "This is required for message delivery to work."
 msgstr "Ceci est requis pour que la livraison des messages fonctionne."
 
 #: ../../mod/install.php:155 ../../mod/install.php:169
-#: ../../mod/install.php:179
+#: ../../mod/install.php:179 ../../mod/install.php:184
 msgid ""
 "Error: the \"openssl_pkey_new\" function on this system is not able to "
 "generate encryption keys"
@@ -1754,7 +2038,7 @@ msgstr ""
 "générer des clés de chiffrement"
 
 #: ../../mod/install.php:156 ../../mod/install.php:170
-#: ../../mod/install.php:180
+#: ../../mod/install.php:180 ../../mod/install.php:185
 msgid ""
 "If running under Windows, please see \"http://www.php.net/manual/en/openssl."
 "installation.php\"."
@@ -1763,7 +2047,7 @@ msgstr ""
 "manual/en/openssl.installation.php\"."
 
 #: ../../mod/install.php:165 ../../mod/install.php:179
-#: ../../mod/install.php:189
+#: ../../mod/install.php:189 ../../mod/install.php:194
 msgid ""
 "Error: Apache webserver mod-rewrite module is required but not installed."
 msgstr ""
@@ -1771,12 +2055,12 @@ msgstr ""
 "installé."
 
 #: ../../mod/install.php:167 ../../mod/install.php:181
-#: ../../mod/install.php:191
+#: ../../mod/install.php:191 ../../mod/install.php:196
 msgid "Error: libCURL PHP module required but not installed."
 msgstr "Erreur: Le module PHP \"libCURL\" est requis mais pas installé."
 
 #: ../../mod/install.php:169 ../../mod/install.php:183
-#: ../../mod/install.php:193
+#: ../../mod/install.php:193 ../../mod/install.php:198
 msgid ""
 "Error: GD graphics PHP module with JPEG support required but not installed."
 msgstr ""
@@ -1784,17 +2068,17 @@ msgstr ""
 "installé."
 
 #: ../../mod/install.php:171 ../../mod/install.php:185
-#: ../../mod/install.php:195
+#: ../../mod/install.php:195 ../../mod/install.php:200
 msgid "Error: openssl PHP module required but not installed."
 msgstr "Erreur: Le module PHP \"openssl\" est requis mais pas installé."
 
 #: ../../mod/install.php:173 ../../mod/install.php:187
-#: ../../mod/install.php:197
+#: ../../mod/install.php:197 ../../mod/install.php:202
 msgid "Error: mysqli PHP module required but not installed."
 msgstr "Erreur: Le module PHP \"mysqli\" est requis mais pas installé."
 
 #: ../../mod/install.php:184 ../../mod/install.php:198
-#: ../../mod/install.php:208
+#: ../../mod/install.php:208 ../../mod/install.php:216
 msgid ""
 "The web installer needs to be able to create a file called \".htconfig.php\" "
 "in the top folder of your web server and it is unable to do so."
@@ -1803,7 +2087,7 @@ msgstr ""
 "la racine de votre serveur web, mais il en est incapable."
 
 #: ../../mod/install.php:185 ../../mod/install.php:199
-#: ../../mod/install.php:209
+#: ../../mod/install.php:209 ../../mod/install.php:217
 msgid ""
 "This is most often a permission setting, as the web server may not be able "
 "to write files in your folder - even if you can."
@@ -1813,7 +2097,7 @@ msgstr ""
 "pouvez."
 
 #: ../../mod/install.php:186 ../../mod/install.php:200
-#: ../../mod/install.php:210
+#: ../../mod/install.php:210 ../../mod/install.php:218
 msgid ""
 "Please check with your site documentation or support people to see if this "
 "situation can be corrected."
@@ -1822,7 +2106,7 @@ msgstr ""
 "- que la situation peut être corrigée."
 
 #: ../../mod/install.php:187 ../../mod/install.php:201
-#: ../../mod/install.php:211
+#: ../../mod/install.php:211 ../../mod/install.php:219
 msgid ""
 "If not, you may be required to perform a manual installation. Please see the "
 "file \"INSTALL.txt\" for instructions."
@@ -1831,7 +2115,7 @@ msgstr ""
 "Référez-vous au fichier \"INSTALL.txt\" pour les instructions."
 
 #: ../../mod/install.php:196 ../../mod/install.php:210
-#: ../../mod/install.php:220
+#: ../../mod/install.php:220 ../../mod/install.php:228
 msgid ""
 "The database configuration file \".htconfig.php\" could not be written. "
 "Please use the enclosed text to create a configuration file in your web "
@@ -1842,81 +2126,98 @@ msgstr ""
 "de votre hébergement."
 
 #: ../../mod/install.php:211 ../../mod/install.php:225
-#: ../../mod/install.php:235
+#: ../../mod/install.php:235 ../../mod/install.php:243
 msgid "Errors encountered creating database tables."
 msgstr "Des erreurs ont été signalées lors de la création des tables."
 
 #: ../../mod/settings.php:37 ../../mod/settings.php:38
+#: ../../mod/settings.php:64
 msgid "Passwords do not match. Password unchanged."
 msgstr "Les mots de passe ne correspondent pas. Aucun changement appliqué."
 
 #: ../../mod/settings.php:42 ../../mod/settings.php:43
+#: ../../mod/settings.php:69
 msgid "Empty passwords are not allowed. Password unchanged."
 msgstr "Les mots de passe vides sont interdits. Aucun changement appliqué."
 
 #: ../../mod/settings.php:53 ../../mod/settings.php:54
+#: ../../mod/settings.php:80
 msgid "Password changed."
 msgstr "Mots de passe changés."
 
 #: ../../mod/settings.php:55 ../../mod/settings.php:56
+#: ../../mod/settings.php:82
 msgid "Password update failed. Please try again."
 msgstr "Le changement de mot de passe a échoué. Merci de recommencer."
 
 #: ../../mod/settings.php:97 ../../mod/settings.php:98
+#: ../../mod/settings.php:138 ../../mod/settings.php:188
 msgid " Please use a shorter name."
 msgstr " Merci d'utiliser un nom plus court."
 
 #: ../../mod/settings.php:99 ../../mod/settings.php:100
+#: ../../mod/settings.php:140 ../../mod/settings.php:190
 msgid " Name too short."
 msgstr " Nom trop court."
 
 #: ../../mod/settings.php:105 ../../mod/settings.php:106
+#: ../../mod/settings.php:146 ../../mod/settings.php:196
 msgid " Not valid email."
 msgstr " Email invalide."
 
 #: ../../mod/settings.php:107 ../../mod/settings.php:108
+#: ../../mod/settings.php:148 ../../mod/settings.php:198
 msgid " Cannot change to that email."
 msgstr " Impossible de changer pour cet email."
 
 #: ../../mod/settings.php:165 ../../mod/settings.php:166
+#: ../../mod/settings.php:206 ../../addon/piwik/piwik.php:94
+#: ../../addon/facebook/facebook.php:299 ../../addon/twitter/twitter.php:275
+#: ../../addon/impressum/impressum.php:64 ../../mod/settings.php:257
 msgid "Settings updated."
 msgstr "Réglages mis à jour."
 
 #: ../../mod/settings.php:215 ../../mod/settings.php:216
-#: ../../mod/settings.php:356
+#: ../../mod/settings.php:356 ../../mod/settings.php:256
+#: ../../mod/settings.php:418 ../../addon/widgets/widgets.php:122
+#: ../../mod/settings.php:329
 msgid "Plugin Settings"
 msgstr "Réglages des extensions"
 
 #: ../../mod/settings.php:216 ../../mod/settings.php:217
-#: ../../mod/settings.php:355
+#: ../../mod/settings.php:355 ../../mod/settings.php:257
+#: ../../mod/settings.php:417 ../../mod/settings.php:480
 msgid "Account Settings"
 msgstr "Réglages du compte"
 
 #: ../../mod/settings.php:222 ../../mod/settings.php:223
+#: ../../mod/settings.php:263 ../../mod/settings.php:322
 msgid "No Plugin settings configured"
 msgstr "Pas de réglages d'extensions configurés"
 
 #: ../../mod/settings.php:269 ../../mod/settings.php:270
-#: ../../mod/settings.php:278
+#: ../../mod/settings.php:278 ../../mod/settings.php:339
 msgid "OpenID: "
 msgstr "OpenID: "
 
 #: ../../mod/settings.php:269 ../../mod/settings.php:270
-#: ../../mod/settings.php:278
+#: ../../mod/settings.php:278 ../../mod/settings.php:339
 msgid "&nbsp;(Optional) Allow this OpenID to login to this account."
 msgstr "&nbsp;(Facultatif) Autoriser cet OpenID à se connecter à ce compte."
 
 #: ../../mod/settings.php:301 ../../mod/settings.php:302
-#: ../../mod/settings.php:316
+#: ../../mod/settings.php:316 ../../mod/settings.php:377
+#: ../../mod/settings.php:442
 msgid "Profile is <strong>not published</strong>."
 msgstr "Ce profil n'est <strong>pas publié</strong>."
 
 #: ../../mod/settings.php:358 ../../mod/settings.php:363
-#: ../../mod/settings.php:397
+#: ../../mod/settings.php:397 ../../mod/settings.php:459
+#: ../../mod/settings.php:509
 msgid "Default Post Permissions"
 msgstr "Permissions par défaut sur les articles"
 
-#: ../../mod/lostpass.php:38
+#: ../../mod/lostpass.php:38 ../../mod/lostpass.php:42
 #, fuzzy, php-format
 msgid "Password reset requested at %s"
 msgstr "Requête de réinitialisation de mot de passe à %s"
@@ -1934,30 +2235,30 @@ msgstr "Visible par:"
 msgid "Welcome to %s"
 msgstr "Bienvenue sur %s"
 
-#: ../../mod/item.php:37
+#: ../../mod/item.php:37 ../../mod/item.php:81
 msgid "Unable to locate original post."
 msgstr "Impossible de localiser l'article original."
 
-#: ../../mod/item.php:126
+#: ../../mod/item.php:126 ../../mod/item.php:128 ../../mod/item.php:196
 msgid "Empty post discarded."
 msgstr "Article vide défaussé."
 
-#: ../../mod/item.php:474
+#: ../../mod/item.php:474 ../../mod/item.php:478
 #, fuzzy, php-format
 msgid "%s commented on your item at %s"
 msgstr "%s a commenté votre publication : %s"
 
-#: ../../mod/item.php:497
+#: ../../mod/item.php:497 ../../mod/item.php:504
 #, fuzzy, php-format
 msgid "%s posted on your profile wall at %s"
 msgstr "%s a posté sur votre mur : %s"
 
-#: ../../mod/item.php:523
+#: ../../mod/item.php:523 ../../mod/item.php:534 ../../mod/item.php:765
 #, fuzzy
 msgid "System error. Post not saved."
 msgstr "Erreur système.Publication non sauvée."
 
-#: ../../mod/item.php:541
+#: ../../mod/item.php:541 ../../mod/item.php:553 ../../mod/item.php:784
 #, fuzzy, php-format
 msgid ""
 "This message was sent to you by %s, a member of the Friendika social network."
@@ -1969,7 +2270,7 @@ msgstr ""
 msgid "You may visit them online at"
 msgstr "Vous pouvez leur faire une visite sur"
 
-#: ../../mod/item.php:545
+#: ../../mod/item.php:545 ../../mod/item.php:556 ../../mod/item.php:787
 #, fuzzy
 msgid ""
 "Please contact the sender by replying to this post if you do not wish to "
@@ -1978,7 +2279,7 @@ msgstr ""
 "Merci de contacter l'émeteur en répondant à cette publication si vous ne "
 "souhaitez pas recevoir ces messages."
 
-#: ../../mod/item.php:547
+#: ../../mod/item.php:547 ../../mod/item.php:558 ../../mod/item.php:789
 #, fuzzy, php-format
 msgid "%s posted an update."
 msgstr "%s a publié une mise à jour."
@@ -2005,15 +2306,18 @@ msgid "Membership list updated."
 msgstr "Liste des membres mise à jour."
 
 #: ../../mod/group.php:88 ../../index.php:250 ../../index.php:264
-#: ../../mod/group.php:67 ../../mod/profperm.php:19
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:266
+#: ../../index.php:265
 msgid "Permission denied"
 msgstr "Permission refusée"
 
 #: ../../mod/group.php:107 ../../mod/group.php:111 ../../mod/group.php:90
+#: ../../mod/group.php:98
 msgid "Group removed."
 msgstr "Groupe enlevé."
 
 #: ../../mod/group.php:109 ../../mod/group.php:113 ../../mod/group.php:92
+#: ../../mod/group.php:100
 #, fuzzy
 msgid "Unable to remove group."
 msgstr "Impossible d'enlever le groupe."
@@ -2025,6 +2329,7 @@ msgstr "Image envoyée, mais impossible de la retailler."
 #: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
 #: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:237
 #: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:243
+#: ../../mod/profile_photo.php:248
 #, fuzzy, php-format
 msgid "Image size reduction [%s] failed."
 msgstr "Réduction de la taille de l'image [%s] échouée."
@@ -2034,39 +2339,48 @@ msgid "Unable to process image"
 msgstr "Impossible de traiter l'image"
 
 #: ../../mod/profile_photo.php:228 ../../mod/profile_photo.php:230
-#: ../../mod/profile_photo.php:234
+#: ../../mod/profile_photo.php:234 ../../mod/profile_photo.php:239
 #, fuzzy
 msgid "Image uploaded successfully."
 msgstr "Image téléversée avec succès."
 
-#: ../../mod/directory.php:32
+#: ../../mod/directory.php:32 ../../mod/directory.php:38
+#: ../../mod/directory.php:40
 msgid "Global Directory"
 msgstr "Annuaire global"
 
 #: ../../mod/directory.php:38 ../../mod/contacts.php:310
 #: ../../mod/contacts.php:315 ../../mod/contacts.php:323
+#: ../../mod/contacts.php:325 ../../mod/directory.php:44
+#: ../../mod/contacts.php:326 ../../mod/directory.php:55
+#: ../../mod/contacts.php:362
 msgid "Finding: "
 msgstr "Trouvé: "
 
 #: ../../mod/viewcontacts.php:17 ../../boot.php:2038 ../../boot.php:2039
 #: ../../boot.php:2041 ../../boot.php:2049 ../../boot.php:2061
-#: ../../boot.php:2051 ../../boot.php:1996
+#: ../../boot.php:2051 ../../boot.php:1996 ../../mod/viewcontacts.php:25
+#: ../../boot.php:2014 ../../include/text.php:555
 msgid "View Contacts"
 msgstr "Voir les contacts"
 
-#: ../../mod/viewcontacts.php:32
+#: ../../mod/viewcontacts.php:32 ../../mod/viewcontacts.php:40
 msgid "No contacts."
 msgstr "Aucun contact."
 
 #: ../../mod/viewcontacts.php:44 ../../mod/contacts.php:371
 #: ../../mod/contacts.php:376 ../../mod/contacts.php:384
+#: ../../mod/contacts.php:386 ../../mod/viewcontacts.php:52
+#: ../../mod/contacts.php:387
 #, fuzzy
 msgid "Visit $username's profile"
-msgstr "Visiter le profil de %s"
+msgstr "Visiter le profil de $username"
 
 #: ../../mod/profile.php:8 ../../boot.php:2210 ../../boot.php:2211
 #: ../../mod/mprofile.php:8 ../../boot.php:2213 ../../boot.php:2221
 #: ../../boot.php:2233 ../../boot.php:2248 ../../boot.php:2197
+#: ../../mod/profile.php:11 ../../boot.php:2216 ../../mod/hcard.php:10
+#: ../../mod/profile.php:10 ../../boot.php:792
 msgid "No profile"
 msgstr "Aucun profil"
 
@@ -2086,59 +2400,59 @@ msgstr "Choisir une étiquette à enlever: "
 msgid "Remove"
 msgstr "Enlever"
 
-#: ../../mod/regmod.php:10
+#: ../../mod/regmod.php:10 ../../mod/regmod.php:105
 msgid "Please login."
 msgstr "Merci de vous connecter."
 
-#: ../../mod/regmod.php:54
+#: ../../mod/regmod.php:54 ../../mod/regmod.php:93
 #, fuzzy, php-format
 msgid "Registration revoked for %s"
 msgstr "Inscription révoquée pour %s"
 
-#: ../../mod/regmod.php:96
+#: ../../mod/regmod.php:96 ../../mod/regmod.php:99 ../../mod/regmod.php:61
 msgid "Account approved."
 msgstr "Inscription validée."
 
-#: ../../mod/invite.php:28
+#: ../../mod/invite.php:28 ../../mod/invite.php:35
 #, fuzzy, php-format
 msgid "%s : Not a valid email address."
 msgstr "%s : Adresse de courriel invalide."
 
-#: ../../mod/invite.php:32
+#: ../../mod/invite.php:32 ../../mod/invite.php:59
 #, fuzzy, php-format
 msgid "Please join my network on %s"
 msgstr "Vous pouvez rejoindre mon réseau sur %s"
 
-#: ../../mod/invite.php:38
+#: ../../mod/invite.php:38 ../../mod/invite.php:42 ../../mod/invite.php:69
 #, fuzzy, php-format
 msgid "%s : Message delivery failed."
 msgstr "%s : L'envoi du message a échoué."
 
-#: ../../mod/invite.php:42
+#: ../../mod/invite.php:42 ../../mod/invite.php:46 ../../mod/invite.php:73
 #, php-format
 msgid "%d message sent."
 msgid_plural "%d messages sent."
 msgstr[0] "%d message envoyé."
 msgstr[1] "%d messages envoyés."
 
-#: ../../mod/invite.php:57
+#: ../../mod/invite.php:57 ../../mod/invite.php:61 ../../mod/invite.php:99
 msgid "Send invitations"
 msgstr "Envoyer des invitations"
 
-#: ../../mod/invite.php:58
+#: ../../mod/invite.php:58 ../../mod/invite.php:62 ../../mod/invite.php:100
 msgid "Enter email addresses, one per line:"
 msgstr "Entrez les adresses email, une par ligne:"
 
-#: ../../mod/invite.php:60
+#: ../../mod/invite.php:60 ../../mod/invite.php:64 ../../mod/invite.php:102
 #, fuzzy, php-format
 msgid "Please join my social network on %s"
 msgstr "Vous pouvez rejoindre mon réseau social sur %s"
 
-#: ../../mod/invite.php:61
+#: ../../mod/invite.php:61 ../../mod/invite.php:65 ../../mod/invite.php:103
 msgid "To accept this invitation, please visit:"
 msgstr "Pour accepter cette invitation, rendez vous sur:"
 
-#: ../../mod/invite.php:62
+#: ../../mod/invite.php:62 ../../mod/invite.php:66 ../../mod/invite.php:104
 msgid ""
 "Once you have registered, please connect with me via my profile page at:"
 msgstr "Une fois inscrit, connectez-vous à la page de mon profil sur:"
@@ -2168,117 +2482,150 @@ msgid "Select an identity to manage: "
 msgstr "Choisir une identité à gérer: "
 
 #: ../../mod/dfrn_notify.php:179 ../../mod/dfrn_notify.php:191
+#: ../../mod/item.php:623 ../../mod/item.php:668 ../../mod/item.php:691
+#: ../../mod/item.php:734 ../../mod/dfrn_notify.php:296
+#: ../../mod/dfrn_notify.php:506 ../../mod/dfrn_notify.php:553
+#: ../../mod/dfrn_notify.php:639 ../../mod/dfrn_notify.php:685
 #, fuzzy
 msgid "noreply"
 msgstr "noreply"
 
 #: ../../mod/dfrn_notify.php:237 ../../mod/dfrn_notify.php:249
+#: ../../mod/dfrn_notify.php:356
 msgid "New mail received at "
 msgstr "Nouvel email reçu à "
 
 #: ../../mod/dfrn_notify.php:388 ../../mod/dfrn_notify.php:474
 #: ../../mod/dfrn_notify.php:391 ../../mod/dfrn_notify.php:477
 #: ../../mod/dfrn_notify.php:403 ../../mod/dfrn_notify.php:489
+#: ../../mod/dfrn_notify.php:493 ../../mod/item.php:670
+#: ../../mod/dfrn_notify.php:555 ../../mod/dfrn_notify.php:687
 #, fuzzy, php-format
 msgid "%s commented on an item at %s"
-msgstr "%s a commanté sur une publication : %s"
+msgstr "%s a commenté sur une publication : %s"
 
 #: ../../mod/dfrn_poll.php:78 ../../mod/dfrn_poll.php:392
 #: ../../mod/dfrn_poll.php:77 ../../mod/dfrn_poll.php:391
 #: ../../mod/dfrn_poll.php:483 ../../mod/dfrn_poll.php:79
-#: ../../mod/dfrn_poll.php:504
+#: ../../mod/dfrn_poll.php:504 ../../mod/dfrn_poll.php:84
+#: ../../mod/dfrn_poll.php:510 ../../mod/dfrn_poll.php:90
+#: ../../mod/dfrn_poll.php:516
 #, fuzzy, php-format
 msgid "%s welcomes %s"
 msgstr "%s accueille %s"
 
-#: ../../mod/dfrn_request.php:92
+#: ../../mod/dfrn_request.php:92 ../../mod/dfrn_request.php:96
 msgid "This introduction has already been accepted."
 msgstr "Cette introduction a déjà été acceptée."
 
 #: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:347
+#: ../../mod/dfrn_request.php:120 ../../mod/dfrn_request.php:351
+#: ../../mod/dfrn_request.php:348
 msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
-"L'emplacement du profil est invalide ou ne contient pas de profil valide."
+msgstr "L'emplacement du profil est invalide ou ne contient pas de profil valide."
 
 #: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:352
+#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:356
+#: ../../mod/dfrn_request.php:353
 msgid "Warning: profile location has no identifiable owner name."
 msgstr "Attention: l'emplacement du profil n'a pas de nom identifiable."
 
 #: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:354
+#: ../../mod/dfrn_request.php:127 ../../mod/dfrn_request.php:358
+#: ../../mod/dfrn_request.php:355
 msgid "Warning: profile location has no profile photo."
 msgstr "Attention: l'emplacement du profil n'a pas de photo de profil."
 
 #: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:357
+#: ../../mod/dfrn_request.php:130 ../../mod/dfrn_request.php:361
+#: ../../mod/dfrn_request.php:358
 #, php-format
 msgid "%d required parameter was not found at the given location"
 msgid_plural "%d required parameters were not found at the given location"
 msgstr[0] "%d paramètre requis n'a pas été trouvé à l'endroit indiqué"
 msgstr[1] "%d paramètres requis n'ont pas été trouvés à l'endroit indiqué"
 
-#: ../../mod/dfrn_request.php:164
+#: ../../mod/dfrn_request.php:164 ../../mod/dfrn_request.php:168
+#: ../../mod/dfrn_request.php:165
 msgid "Introduction complete."
 msgstr "Phase de présentation achevée."
 
-#: ../../mod/dfrn_request.php:188
+#: ../../mod/dfrn_request.php:188 ../../mod/dfrn_request.php:192
+#: ../../mod/dfrn_request.php:189
 msgid "Unrecoverable protocol error."
 msgstr "Erreur de protocole non-récupérable."
 
-#: ../../mod/dfrn_request.php:216
+#: ../../mod/dfrn_request.php:216 ../../mod/dfrn_request.php:220
+#: ../../mod/dfrn_request.php:217
 msgid "Profile unavailable."
 msgstr "Profil indisponible."
 
-#: ../../mod/dfrn_request.php:241
+#: ../../mod/dfrn_request.php:241 ../../mod/dfrn_request.php:245
+#: ../../mod/dfrn_request.php:242
 #, fuzzy, php-format
 msgid "%s has received too many connection requests today."
 msgstr "%s a reçu trop de demande d'introduction de votre part aujourd'hui."
 
-#: ../../mod/dfrn_request.php:242
+#: ../../mod/dfrn_request.php:242 ../../mod/dfrn_request.php:246
+#: ../../mod/dfrn_request.php:243
 msgid "Spam protection measures have been invoked."
 msgstr "Des mesures de protection contre le spam ont été déclenchées."
 
-#: ../../mod/dfrn_request.php:243
+#: ../../mod/dfrn_request.php:243 ../../mod/dfrn_request.php:247
+#: ../../mod/dfrn_request.php:244
 msgid "Friends are advised to please try again in 24 hours."
 msgstr "Les relations sont encouragées à attendre 24 heures pour recommencer."
 
-#: ../../mod/dfrn_request.php:273
+#: ../../mod/dfrn_request.php:273 ../../mod/dfrn_request.php:277
+#: ../../mod/dfrn_request.php:274
 msgid "Invalid locator"
 msgstr "Localisateur invalide"
 
-#: ../../mod/dfrn_request.php:292
+#: ../../mod/dfrn_request.php:292 ../../mod/dfrn_request.php:296
+#: ../../mod/dfrn_request.php:293
 msgid "Unable to resolve your name at the provided location."
 msgstr "Impossible de résoudre votre nom à l'emplacement fourni."
 
-#: ../../mod/dfrn_request.php:305
+#: ../../mod/dfrn_request.php:305 ../../mod/dfrn_request.php:309
+#: ../../mod/dfrn_request.php:306
 msgid "You have already introduced yourself here."
 msgstr "Vous vous êtes déjà présenté ici."
 
-#: ../../mod/dfrn_request.php:309
+#: ../../mod/dfrn_request.php:309 ../../mod/dfrn_request.php:313
+#: ../../mod/dfrn_request.php:310
 #, fuzzy, php-format
 msgid "Apparently you are already friends with %s."
 msgstr "Il semblerait que vous soyez déjà ami avec %s."
 
-#: ../../mod/dfrn_request.php:330
+#: ../../mod/dfrn_request.php:330 ../../mod/dfrn_request.php:334
+#: ../../mod/dfrn_request.php:331
 msgid "Invalid profile URL."
 msgstr "URL de profil invalide."
 
-#: ../../mod/dfrn_request.php:336
+#: ../../mod/dfrn_request.php:336 ../../mod/dfrn_request.php:340
+#: ../../mod/follow.php:16 ../../mod/dfrn_request.php:337
+#: ../../mod/follow.php:20
 msgid "Disallowed profile URL."
 msgstr "URL de profil interdite."
 
 #: ../../mod/dfrn_request.php:402 ../../mod/contacts.php:85
-#: ../../mod/contacts.php:90
+#: ../../mod/contacts.php:90 ../../mod/dfrn_request.php:406
+#: ../../mod/dfrn_request.php:404 ../../mod/contacts.php:116
 msgid "Failed to update contact record."
 msgstr "Échec de mise-à-jour du contact."
 
-#: ../../mod/dfrn_request.php:423
+#: ../../mod/dfrn_request.php:423 ../../mod/dfrn_request.php:427
+#: ../../mod/dfrn_request.php:425
 msgid "Your introduction has been sent."
 msgstr "Votre présentation a été envoyée."
 
-#: ../../mod/dfrn_request.php:477
+#: ../../mod/dfrn_request.php:477 ../../mod/dfrn_request.php:481
+#: ../../mod/dfrn_request.php:478
 msgid "Please login to confirm introduction."
 msgstr "Connectez-vous pour confirmer l'introduction."
 
-#: ../../mod/dfrn_request.php:491
+#: ../../mod/dfrn_request.php:491 ../../mod/dfrn_request.php:495
+#: ../../mod/dfrn_request.php:492
 msgid ""
 "Incorrect identity currently logged in. Please login to <strong>this</"
 "strong> profile."
@@ -2287,23 +2634,28 @@ msgstr ""
 "<strong>ce</strong> profil."
 
 #: ../../mod/dfrn_request.php:543 ../../mod/dfrn_request.php:545
+#: ../../mod/dfrn_request.php:549 ../../mod/dfrn_request.php:546
 #, fuzzy
 msgid "Introduction received at "
 msgstr "Introduction reçue sur "
 
 #: ../../mod/dfrn_request.php:615 ../../mod/dfrn_request.php:617
+#: ../../mod/dfrn_request.php:630 ../../mod/dfrn_request.php:628
 msgid "Friend/Connection Request"
 msgstr "Requête de relation/amitié"
 
 #: ../../mod/dfrn_request.php:616 ../../mod/dfrn_request.php:618
+#: ../../mod/dfrn_request.php:632 ../../mod/dfrn_request.php:630
 msgid "Please answer the following:"
 msgstr "Merci de répondre à ce qui suit:"
 
 #: ../../mod/dfrn_request.php:617 ../../mod/dfrn_request.php:619
+#: ../../mod/dfrn_request.php:633
 msgid "Does $name know you?"
 msgstr "Est-ce que $name vous connaît?"
 
 #: ../../mod/dfrn_request.php:620 ../../mod/dfrn_request.php:622
+#: ../../mod/dfrn_request.php:636 ../../mod/dfrn_request.php:634
 msgid "Add a personal note:"
 msgstr "Ajouter une note personnelle:"
 
@@ -2315,18 +2667,22 @@ msgstr ""
 "Merci d'entrer l'adresse de votre profil sur l'une de ces réseaux sociaux:"
 
 #: ../../mod/dfrn_request.php:622 ../../mod/dfrn_request.php:624
+#: ../../mod/dfrn_request.php:638 ../../mod/dfrn_request.php:636
 msgid "Friendika"
 msgstr "Friendika"
 
 #: ../../mod/dfrn_request.php:623 ../../mod/dfrn_request.php:625
+#: ../../mod/dfrn_request.php:639 ../../mod/dfrn_request.php:637
 msgid "StatusNet/Federated Social Web"
 msgstr "StatusNet/Federated Social Web"
 
 #: ../../mod/dfrn_request.php:624 ../../mod/dfrn_request.php:626
+#: ../../mod/dfrn_request.php:640 ../../mod/dfrn_request.php:638
 msgid "Private (secure) network"
 msgstr "Réseau privé (sécurisé)"
 
 #: ../../mod/dfrn_request.php:625 ../../mod/dfrn_request.php:627
+#: ../../mod/dfrn_request.php:641 ../../mod/dfrn_request.php:639
 msgid "Public (insecure) network"
 msgstr "Réseau public (non-sécurisé)"
 
@@ -2335,15 +2691,17 @@ msgid "Your profile address:"
 msgstr "Votre adresse de profil:"
 
 #: ../../mod/dfrn_request.php:627 ../../mod/dfrn_request.php:629
+#: ../../mod/dfrn_request.php:643 ../../mod/dfrn_request.php:641
 msgid "Submit Request"
 msgstr "Envoyer la requête"
 
-#: ../../mod/follow.php:173 ../../mod/follow.php:186
+#: ../../mod/follow.php:173 ../../mod/follow.php:186 ../../mod/follow.php:39
+#: ../../mod/follow.php:48
 msgid "The profile address specified does not provide adequate information."
-msgstr ""
-"L'adresse de profil indiquée ne fournit par les informations adéquates."
+msgstr "L'adresse de profil indiquée ne fournit par les informations adéquates."
 
-#: ../../mod/follow.php:179 ../../mod/follow.php:192
+#: ../../mod/follow.php:179 ../../mod/follow.php:192 ../../mod/follow.php:45
+#: ../../mod/follow.php:66
 msgid ""
 "Limited profile. This person will be unable to receive direct/personal "
 "notifications from you."
@@ -2352,314 +2710,378 @@ msgstr ""
 "notifications directes/personnelles de votre part."
 
 #: ../../mod/follow.php:230 ../../mod/follow.php:243 ../../mod/follow.php:247
+#: ../../mod/follow.php:100 ../../mod/follow.php:130
 msgid "Unable to retrieve contact information."
 msgstr "Impossible de récupérer les informations du contact."
 
 #: ../../mod/follow.php:276 ../../mod/follow.php:289 ../../mod/follow.php:293
+#: ../../mod/follow.php:146 ../../mod/follow.php:176
 msgid "following"
 msgstr "following"
 
-#: ../../mod/photos.php:30
+#: ../../mod/photos.php:30 ../../mod/photos.php:34 ../../mod/photos.php:37
 msgid "Photo Albums"
 msgstr "Albums photo"
 
-#: ../../mod/photos.php:95
+#: ../../mod/photos.php:95 ../../mod/photos.php:99 ../../mod/photos.php:132
 msgid "Contact information unavailable"
 msgstr "Informations de contact indisponibles"
 
-#: ../../mod/photos.php:116
+#: ../../mod/photos.php:116 ../../mod/photos.php:120 ../../mod/photos.php:153
 msgid "Album not found."
 msgstr "Album introuvable."
 
 #: ../../mod/photos.php:134 ../../mod/photos.php:859 ../../mod/photos.php:863
+#: ../../mod/photos.php:138 ../../mod/photos.php:884 ../../mod/photos.php:171
+#: ../../mod/photos.php:935
 msgid "Delete Album"
 msgstr "Effacer l'album"
 
 #: ../../mod/photos.php:197 ../../mod/photos.php:1067
-#: ../../mod/photos.php:1070
+#: ../../mod/photos.php:1070 ../../mod/photos.php:201
+#: ../../mod/photos.php:1092 ../../mod/photos.php:234
+#: ../../mod/photos.php:1145
 msgid "Delete Photo"
 msgstr "Effacer la photo"
 
-#: ../../mod/photos.php:469
+#: ../../mod/photos.php:469 ../../mod/photos.php:473 ../../mod/photos.php:508
 msgid "was tagged in a"
 msgstr "a été identifié dans"
 
-#: ../../mod/photos.php:469
+#: ../../mod/photos.php:469 ../../mod/photos.php:473 ../../mod/photos.php:508
 msgid "by"
 msgstr "par"
 
-#: ../../mod/photos.php:661 ../../mod/photos.php:665
+#: ../../mod/photos.php:661 ../../mod/photos.php:665 ../../mod/photos.php:686
+#: ../../mod/photos.php:743
 msgid "No photos selected"
 msgstr "Aucune photo sélectionnée"
 
-#: ../../mod/photos.php:808 ../../mod/photos.php:812
+#: ../../mod/photos.php:808 ../../mod/photos.php:812 ../../mod/photos.php:833
+#: ../../mod/photos.php:884
 #, fuzzy
 msgid "Upload Photos"
 msgstr "Téléverser des photos"
 
 #: ../../mod/photos.php:811 ../../mod/photos.php:854 ../../mod/photos.php:815
-#: ../../mod/photos.php:858
+#: ../../mod/photos.php:858 ../../mod/photos.php:836 ../../mod/photos.php:879
+#: ../../mod/photos.php:887 ../../mod/photos.php:930
 msgid "New album name: "
 msgstr "Nom du nouvel album: "
 
-#: ../../mod/photos.php:812 ../../mod/photos.php:816
+#: ../../mod/photos.php:812 ../../mod/photos.php:816 ../../mod/photos.php:837
+#: ../../mod/photos.php:888
 msgid "or existing album name: "
 msgstr "ou nom d'un album existant: "
 
 #: ../../mod/photos.php:814 ../../mod/photos.php:1062 ../../mod/photos.php:818
-#: ../../mod/photos.php:1065
+#: ../../mod/photos.php:1065 ../../mod/photos.php:839
+#: ../../mod/photos.php:1087 ../../mod/photos.php:890
+#: ../../mod/photos.php:1140
 msgid "Permissions"
 msgstr "Permissions"
 
-#: ../../mod/photos.php:869 ../../mod/photos.php:873
+#: ../../mod/photos.php:869 ../../mod/photos.php:873 ../../mod/photos.php:894
+#: ../../mod/photos.php:945
 msgid "Edit Album"
 msgstr "Éditer l'album"
 
 #: ../../mod/photos.php:879 ../../mod/photos.php:1263
 #: ../../mod/photos.php:1265 ../../mod/photos.php:1264
-#: ../../mod/photos.php:883 ../../mod/photos.php:1267
+#: ../../mod/photos.php:883 ../../mod/photos.php:1267 ../../mod/photos.php:904
+#: ../../mod/photos.php:1307 ../../mod/photos.php:955
+#: ../../mod/photos.php:1362
 msgid "View Photo"
 msgstr "Voir la photo"
 
-#: ../../mod/photos.php:909 ../../mod/photos.php:912
+#: ../../mod/photos.php:909 ../../mod/photos.php:912 ../../mod/photos.php:933
+#: ../../mod/photos.php:984
 msgid "Photo not available"
 msgstr "Photo indisponible"
 
-#: ../../mod/photos.php:956 ../../mod/photos.php:959
+#: ../../mod/photos.php:956 ../../mod/photos.php:959 ../../mod/photos.php:982
+#: ../../mod/photos.php:1033
 msgid "Edit photo"
 msgstr "Éditer la photo"
 
-#: ../../mod/photos.php:958 ../../mod/photos.php:961
+#: ../../mod/photos.php:958 ../../mod/photos.php:961 ../../mod/photos.php:983
+#: ../../mod/photos.php:1034
 #, fuzzy
 msgid "Use as profile photo"
 msgstr "Utiliser comme photo de profil"
 
-#: ../../mod/photos.php:969 ../../mod/photos.php:972
+#: ../../mod/photos.php:969 ../../mod/photos.php:972 ../../mod/photos.php:996
 #, fuzzy
 msgid "<< Prev"
 msgstr "<< Précédent"
 
-#: ../../mod/photos.php:973 ../../mod/photos.php:976
+#: ../../mod/photos.php:973 ../../mod/photos.php:976 ../../mod/photos.php:1000
+#: ../../mod/photos.php:1051
 msgid "View Full Size"
 msgstr "Voir en taille réelle"
 
-#: ../../mod/photos.php:977 ../../mod/photos.php:980
+#: ../../mod/photos.php:977 ../../mod/photos.php:980 ../../mod/photos.php:1005
 #, fuzzy
 msgid "Next >>"
 msgstr "Suivant >>"
 
 #: ../../mod/photos.php:1036 ../../mod/photos.php:1039
+#: ../../mod/photos.php:1067 ../../mod/photos.php:1119
 msgid "Tags: "
 msgstr "Étiquettes: "
 
 #: ../../mod/photos.php:1046 ../../mod/photos.php:1049
+#: ../../mod/photos.php:1070 ../../mod/photos.php:1122
 msgid "[Remove any tag]"
 msgstr "[Retirer toutes les étiquettes]"
 
 #: ../../mod/photos.php:1055 ../../mod/photos.php:1058
+#: ../../mod/photos.php:1080 ../../mod/photos.php:1133
 msgid "New album name"
 msgstr "Nom du nouvel album"
 
 #: ../../mod/photos.php:1058 ../../mod/photos.php:1061
+#: ../../mod/photos.php:1083 ../../mod/photos.php:1136
 msgid "Caption"
 msgstr "Titre"
 
 #: ../../mod/photos.php:1060 ../../mod/photos.php:1063
+#: ../../mod/photos.php:1085 ../../mod/photos.php:1138
 msgid "Add a Tag"
 msgstr "Ajouter une étiquette"
 
 #: ../../mod/photos.php:1064 ../../mod/photos.php:1067
+#: ../../mod/photos.php:1089 ../../mod/photos.php:1142
 msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr ""
-"Exemples: @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances"
+msgstr "Exemples: @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances"
 
 #: ../../mod/photos.php:1249 ../../mod/photos.php:1251
-#: ../../mod/photos.php:1254
+#: ../../mod/photos.php:1254 ../../mod/photos.php:1294
+#: ../../mod/photos.php:1349
 msgid "Recent Photos"
 msgstr "Photos récentes"
 
 #: ../../mod/photos.php:1253 ../../mod/photos.php:1255
-#: ../../mod/photos.php:1258
+#: ../../mod/photos.php:1258 ../../mod/photos.php:1298
+#: ../../mod/photos.php:1353
 #, fuzzy
 msgid "Upload New Photos"
 msgstr "Téléverser de nouvelles photos"
 
 #: ../../mod/photos.php:1269 ../../mod/photos.php:1271
-#: ../../mod/photos.php:1268
+#: ../../mod/photos.php:1268 ../../mod/photos.php:1311
+#: ../../mod/photos.php:1366
 msgid "View Album"
 msgstr "Voir l'album"
 
-#: ../../mod/notifications.php:28
+#: ../../mod/notifications.php:28 ../../mod/notifications.php:26
 msgid "Invalid request identifier."
 msgstr "Identifiant de demande invalide."
 
 #: ../../mod/notifications.php:31 ../../mod/notifications.php:134
-#: ../../mod/notifications.php:133
+#: ../../mod/notifications.php:133 ../../mod/notifications.php:35
+#: ../../mod/notifications.php:118 ../../mod/notifications.php:164
 msgid "Discard"
 msgstr "Défausser"
 
 #: ../../mod/notifications.php:41 ../../mod/notifications.php:133
-#: ../../mod/notifications.php:132
+#: ../../mod/notifications.php:132 ../../mod/notifications.php:47
+#: ../../mod/notifications.php:117 ../../mod/notifications.php:163
 msgid "Ignore"
 msgstr "Ignorer"
 
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:72 ../../mod/notifications.php:78
 msgid "Show Ignored Requests"
 msgstr "Voir les demandes ignorées"
 
-#: ../../mod/notifications.php:72
+#: ../../mod/notifications.php:72 ../../mod/notifications.php:78
 msgid "Hide Ignored Requests"
 msgstr "Cacher les demandes ignorées"
 
 #: ../../mod/notifications.php:105 ../../mod/notifications.php:104
+#: ../../mod/notifications.php:134
 msgid "Claims to be known to you: "
 msgstr "Prétend que vous le connaissez: "
 
 #: ../../mod/notifications.php:105 ../../mod/notifications.php:104
+#: ../../mod/notifications.php:134
 msgid "yes"
 msgstr "oui"
 
 #: ../../mod/notifications.php:105 ../../mod/notifications.php:104
+#: ../../mod/notifications.php:134
 msgid "no"
 msgstr "non"
 
 #: ../../mod/notifications.php:111 ../../mod/notifications.php:110
+#: ../../mod/notifications.php:141
 msgid "Approve as: "
 msgstr "Approuver en tant que: "
 
 #: ../../mod/notifications.php:112 ../../mod/notifications.php:111
+#: ../../mod/notifications.php:142
 msgid "Friend"
 msgstr "Ami"
 
 #: ../../mod/notifications.php:113 ../../mod/notifications.php:112
+#: ../../mod/notifications.php:143
 msgid "Fan/Admirer"
 msgstr "Fan/Admirateur"
 
 #: ../../mod/notifications.php:120 ../../mod/notifications.php:119
+#: ../../mod/notifications.php:105 ../../mod/notifications.php:150
 msgid "Notification type: "
 msgstr "Type de notification: "
 
 #: ../../mod/notifications.php:121 ../../mod/notifications.php:120
+#: ../../mod/notifications.php:151
 msgid "Friend/Connect Request"
 msgstr "Demande de connexion/relation"
 
 #: ../../mod/notifications.php:121 ../../mod/notifications.php:120
+#: ../../mod/notifications.php:151
 msgid "New Follower"
 msgstr "Nouvel abonné"
 
 #: ../../mod/notifications.php:131 ../../mod/notifications.php:130
-#: ../../mod/notifications.php:153
+#: ../../mod/notifications.php:153 ../../mod/admin.php:469
+#: ../../mod/notifications.php:114 ../../mod/notifications.php:161
 msgid "Approve"
 msgstr "Approuver"
 
 #: ../../mod/notifications.php:140 ../../mod/notifications.php:139
+#: ../../mod/notifications.php:170
 msgid "No notifications."
 msgstr "Pas de notification."
 
 #: ../../mod/notifications.php:164 ../../mod/notifications.php:163
-#: ../../mod/notifications.php:159
+#: ../../mod/notifications.php:159 ../../mod/admin.php:468
 msgid "No registrations."
 msgstr "Pas d'inscriptions."
 
-#: ../../mod/contacts.php:12
+#: ../../mod/contacts.php:12 ../../mod/contacts.php:26
 msgid "Invite Friends"
 msgstr "Inviter des amis"
 
 #: ../../mod/contacts.php:16 ../../mod/contacts.php:19
+#: ../../mod/contacts.php:45
 #, fuzzy
 msgid "Connect/Follow"
 msgstr "Connecter/Suivre"
 
 #: ../../mod/contacts.php:17 ../../mod/contacts.php:20
+#: ../../mod/contacts.php:46
 msgid "Example: bob@example.com, http://example.com/barbara"
 msgstr "Exemple: bob@example.com, http://example.com/barbara"
 
 #: ../../mod/contacts.php:18 ../../mod/contacts.php:21
+#: ../../mod/contacts.php:47
 msgid "Follow"
 msgstr "Suivre"
 
 #: ../../mod/contacts.php:38 ../../mod/contacts.php:119
 #: ../../mod/contacts.php:43 ../../mod/contacts.php:124
+#: ../../mod/contacts.php:69 ../../mod/contacts.php:150
 msgid "Could not access contact record."
 msgstr "Impossible d'accéder à l'enregistrement du contact."
 
 #: ../../mod/contacts.php:52 ../../mod/contacts.php:57
+#: ../../mod/contacts.php:83
 msgid "Could not locate selected profile."
 msgstr "Impossible de localiser le profil séléctionné."
 
 #: ../../mod/contacts.php:83 ../../mod/contacts.php:88
+#: ../../mod/contacts.php:114
 msgid "Contact updated."
 msgstr "Contact mis-à-jour."
 
 #: ../../mod/contacts.php:141 ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
 msgid "Contact has been blocked"
 msgstr "Le contact a été bloqué"
 
 #: ../../mod/contacts.php:141 ../../mod/contacts.php:146
+#: ../../mod/contacts.php:172
 msgid "Contact has been unblocked"
 msgstr "Le contact n'est plus bloqué"
 
 #: ../../mod/contacts.php:155 ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
 #, fuzzy
 msgid "Contact has been ignored"
 msgstr "Le contact a été ignoré"
 
 #: ../../mod/contacts.php:155 ../../mod/contacts.php:160
+#: ../../mod/contacts.php:186
 #, fuzzy
 msgid "Contact has been unignored"
 msgstr "Le contact n'est plus ignoré"
 
 #: ../../mod/contacts.php:176 ../../mod/contacts.php:181
+#: ../../mod/contacts.php:207
 msgid "stopped following"
 msgstr "retiré de la liste de suivi"
 
 #: ../../mod/contacts.php:195 ../../mod/contacts.php:200
+#: ../../mod/contacts.php:228
 msgid "Contact has been removed."
 msgstr "Ce contact a été retiré."
 
 #: ../../mod/contacts.php:223 ../../mod/contacts.php:347
 #: ../../mod/contacts.php:228 ../../mod/contacts.php:352
-#: ../../mod/contacts.php:360
+#: ../../mod/contacts.php:360 ../../mod/contacts.php:362
+#: ../../mod/contacts.php:363 ../../mod/contacts.php:256
+#: ../../mod/contacts.php:399
 msgid "Mutual Friendship"
 msgstr "Relation réciproque"
 
 #: ../../mod/contacts.php:227 ../../mod/contacts.php:351
 #: ../../mod/contacts.php:232 ../../mod/contacts.php:356
-#: ../../mod/contacts.php:364
+#: ../../mod/contacts.php:364 ../../mod/contacts.php:366
+#: ../../mod/contacts.php:367 ../../mod/contacts.php:260
+#: ../../mod/contacts.php:403
 msgid "is a fan of yours"
 msgstr "est un fan de vous"
 
 #: ../../mod/contacts.php:232 ../../mod/contacts.php:355
 #: ../../mod/contacts.php:237 ../../mod/contacts.php:360
-#: ../../mod/contacts.php:368
+#: ../../mod/contacts.php:368 ../../mod/contacts.php:370
+#: ../../mod/contacts.php:371 ../../mod/contacts.php:265
+#: ../../mod/contacts.php:407
 msgid "you are a fan of"
 msgstr "vous êtes un fan de"
 
 #: ../../mod/contacts.php:247 ../../mod/contacts.php:252
+#: ../../mod/contacts.php:282
 #, fuzzy
 msgid "Privacy Unavailable"
 msgstr "Protection de la vie privée indisponible"
 
 #: ../../mod/contacts.php:248 ../../mod/contacts.php:253
+#: ../../mod/contacts.php:283
 #, fuzzy
 msgid "Private communications are not available for this contact."
 msgstr "Les communications privées ne sont pas disponibles pour ce contact."
 
 #: ../../mod/contacts.php:251 ../../mod/contacts.php:256
+#: ../../mod/contacts.php:286
 msgid "Never"
 msgstr "Jamais"
 
 #: ../../mod/contacts.php:255 ../../mod/contacts.php:260
+#: ../../mod/contacts.php:290
 #, fuzzy
 msgid "(Update was successful)"
 msgstr "(Mise à jour effectuée avec succès)"
 
 #: ../../mod/contacts.php:255 ../../mod/contacts.php:260
+#: ../../mod/contacts.php:290
 #, fuzzy
 msgid "(Update was not successful)"
 msgstr "(Mise à jour échouée)"
 
 #: ../../mod/contacts.php:258 ../../mod/contacts.php:263
+#: ../../mod/contacts.php:297
 msgid "Contact Editor"
 msgstr "Éditeur de contact"
 
@@ -2669,88 +3091,108 @@ msgid "Visit $name's profile"
 msgstr "Visiter le profil de $name"
 
 #: ../../mod/contacts.php:260 ../../mod/contacts.php:265
-#: ../../mod/contacts.php:273
+#: ../../mod/contacts.php:273 ../../mod/contacts.php:307
 msgid "Block/Unblock contact"
 msgstr "Bloquer/débloquer ce contact"
 
 #: ../../mod/contacts.php:261 ../../mod/contacts.php:266
-#: ../../mod/contacts.php:274
+#: ../../mod/contacts.php:274 ../../mod/contacts.php:308
 msgid "Ignore contact"
 msgstr "Ignorer ce contact"
 
 #: ../../mod/contacts.php:262 ../../mod/contacts.php:267
-#: ../../mod/contacts.php:275
+#: ../../mod/contacts.php:275 ../../mod/contacts.php:277
+#: ../../mod/contacts.php:278 ../../mod/contacts.php:314
 msgid "Delete contact"
 msgstr "Effacer ce contact"
 
 #: ../../mod/contacts.php:264 ../../mod/contacts.php:269
-#: ../../mod/contacts.php:277
+#: ../../mod/contacts.php:277 ../../mod/contacts.php:279
+#: ../../mod/contacts.php:280 ../../mod/contacts.php:316
 msgid "Last updated: "
 msgstr "Dernière mise-à-jour: "
 
 #: ../../mod/contacts.php:265 ../../mod/contacts.php:270
-#: ../../mod/contacts.php:278
+#: ../../mod/contacts.php:278 ../../mod/contacts.php:280
+#: ../../mod/contacts.php:281 ../../mod/contacts.php:317
 msgid "Update public posts: "
 msgstr "Met ses entrées publiques à jour: "
 
 #: ../../mod/contacts.php:267 ../../mod/contacts.php:272
-#: ../../mod/contacts.php:280
+#: ../../mod/contacts.php:280 ../../mod/contacts.php:282
+#: ../../mod/contacts.php:283 ../../mod/admin.php:704
+#: ../../mod/contacts.php:319
 #, fuzzy
 msgid "Update now"
 msgstr "Mettre-à-jour immédiatement"
 
 #: ../../mod/contacts.php:270 ../../mod/contacts.php:275
-#: ../../mod/contacts.php:283
+#: ../../mod/contacts.php:283 ../../mod/contacts.php:285
+#: ../../mod/contacts.php:286 ../../mod/contacts.php:322
 msgid "Unblock this contact"
 msgstr "Débloquer ce contact"
 
 #: ../../mod/contacts.php:270 ../../mod/contacts.php:275
-#: ../../mod/contacts.php:283
+#: ../../mod/contacts.php:283 ../../mod/contacts.php:285
+#: ../../mod/contacts.php:286 ../../mod/contacts.php:322
 msgid "Block this contact"
 msgstr "Bloquer ce contact"
 
 #: ../../mod/contacts.php:271 ../../mod/contacts.php:276
-#: ../../mod/contacts.php:284
+#: ../../mod/contacts.php:284 ../../mod/contacts.php:286
+#: ../../mod/contacts.php:287 ../../mod/contacts.php:323
 msgid "Unignore this contact"
 msgstr "Cesser d'ignorer ce contact"
 
 #: ../../mod/contacts.php:271 ../../mod/contacts.php:276
-#: ../../mod/contacts.php:284
+#: ../../mod/contacts.php:284 ../../mod/contacts.php:286
+#: ../../mod/contacts.php:287 ../../mod/contacts.php:323
 msgid "Ignore this contact"
 msgstr "Ignorer ce contact"
 
 #: ../../mod/contacts.php:274 ../../mod/contacts.php:279
-#: ../../mod/contacts.php:287
+#: ../../mod/contacts.php:287 ../../mod/contacts.php:289
+#: ../../mod/contacts.php:290 ../../mod/contacts.php:326
 msgid "Currently blocked"
 msgstr "Actuellement bloqué"
 
 #: ../../mod/contacts.php:275 ../../mod/contacts.php:280
-#: ../../mod/contacts.php:288
+#: ../../mod/contacts.php:288 ../../mod/contacts.php:290
+#: ../../mod/contacts.php:291 ../../mod/contacts.php:327
 msgid "Currently ignored"
 msgstr "Actuellement ignoré"
 
 #: ../../mod/contacts.php:308 ../../mod/contacts.php:313
-#: ../../mod/contacts.php:321
+#: ../../mod/contacts.php:321 ../../mod/contacts.php:323
+#: ../../mod/contacts.php:324 ../../mod/contacts.php:360
 msgid "Show Blocked Connections"
 msgstr "Montrer les connexions bloquées"
 
 #: ../../mod/contacts.php:308 ../../mod/contacts.php:313
-#: ../../mod/contacts.php:321
+#: ../../mod/contacts.php:321 ../../mod/contacts.php:323
+#: ../../mod/contacts.php:324 ../../mod/contacts.php:360
 msgid "Hide Blocked Connections"
 msgstr "Cacher les connexion bloquées"
 
 #: ../../mod/contacts.php:311 ../../mod/contacts.php:316
 #: ../../mod/directory.php:40 ../../mod/contacts.php:324
+#: ../../mod/contacts.php:326 ../../mod/directory.php:46
+#: ../../mod/contacts.php:327 ../../mod/directory.php:57
+#: ../../mod/contacts.php:363
 msgid "Find"
 msgstr "Trouver"
 
 #: ../../mod/contacts.php:372 ../../mod/contacts.php:377
 #: ../../mod/contacts.php:385 ../../boot.php:2737 ../../boot.php:2749
 #: ../../boot.php:2764 ../../include/conversation.php:520
+#: ../../mod/contacts.php:387 ../../include/conversation.php:587
+#: ../../mod/contacts.php:388 ../../include/conversation.php:612
+#: ../../mod/contacts.php:424
 msgid "Edit contact"
 msgstr "Éditer le contact"
 
 #: ../../mod/search.php:54 ../../mod/search.php:62 ../../mod/search.php:64
+#: ../../mod/search.php:69 ../../mod/community.php:56 ../../mod/search.php:65
 #, fuzzy
 msgid "No results."
 msgstr "Aucun résultat."
@@ -2784,327 +3226,347 @@ msgid "Please enter your password for verification:"
 msgstr "Merci de saisir votre mot de passe pour vérification:"
 
 #: ../../boot.php:808 ../../boot.php:810 ../../boot.php:813 ../../boot.php:825
-#: ../../boot.php:826
+#: ../../boot.php:826 ../../boot.php:834 ../../boot.php:636
 #, fuzzy
 msgid "Create a New Account"
 msgstr "Créer un nouveau compte"
 
 #: ../../boot.php:815 ../../boot.php:817 ../../boot.php:820 ../../boot.php:832
-#: ../../boot.php:833
+#: ../../boot.php:833 ../../boot.php:841 ../../boot.php:643
 #, fuzzy
 msgid "Nickname or Email address: "
 msgstr "Pseudo ou courriel: "
 
 #: ../../boot.php:816 ../../boot.php:818 ../../boot.php:821 ../../boot.php:833
-#: ../../boot.php:834
+#: ../../boot.php:834 ../../boot.php:842 ../../boot.php:644
 msgid "Password: "
 msgstr "Mot de passe: "
 
 #: ../../boot.php:821 ../../boot.php:823 ../../boot.php:826 ../../boot.php:838
-#: ../../boot.php:839
+#: ../../boot.php:839 ../../boot.php:847 ../../boot.php:649
 #, fuzzy
 msgid "Nickname/Email/OpenID: "
 msgstr "Pseudo/Courriel/OpenID: "
 
 #: ../../boot.php:822 ../../boot.php:824 ../../boot.php:827 ../../boot.php:839
-#: ../../boot.php:840
+#: ../../boot.php:840 ../../boot.php:848 ../../boot.php:650
 msgid "Password (if not OpenID): "
 msgstr "Mot de passe (sauf pour OpenID): "
 
 #: ../../boot.php:825 ../../boot.php:827 ../../boot.php:830 ../../boot.php:842
-#: ../../boot.php:843
+#: ../../boot.php:843 ../../boot.php:851 ../../boot.php:653
 msgid "Forgot your password?"
 msgstr "Mot de passe oublié?"
 
 #: ../../boot.php:826 ../../boot.php:828 ../../mod/lostpass.php:74
 #: ../../boot.php:831 ../../boot.php:843 ../../boot.php:844
+#: ../../mod/lostpass.php:78 ../../boot.php:852 ../../mod/lostpass.php:82
+#: ../../boot.php:654
 msgid "Password Reset"
 msgstr "Réinitialiser le mot de passe"
 
 #: ../../boot.php:1077 ../../boot.php:1078 ../../boot.php:1080
 #: ../../boot.php:1083 ../../boot.php:1095 ../../boot.php:1096
+#: ../../boot.php:1106 ../../include/text.php:229
 #, fuzzy
 msgid "prev"
 msgstr "précédent"
 
 #: ../../boot.php:1079 ../../boot.php:1080 ../../boot.php:1082
 #: ../../boot.php:1085 ../../boot.php:1097 ../../boot.php:1098
+#: ../../boot.php:1108 ../../include/text.php:231
 #, fuzzy
 msgid "first"
 msgstr "premier"
 
 #: ../../boot.php:1108 ../../boot.php:1109 ../../boot.php:1111
 #: ../../boot.php:1114 ../../boot.php:1126 ../../boot.php:1127
+#: ../../boot.php:1137 ../../include/text.php:260
 #, fuzzy
 msgid "last"
 msgstr "dernier"
 
 #: ../../boot.php:1111 ../../boot.php:1112 ../../boot.php:1114
 #: ../../boot.php:1117 ../../boot.php:1129 ../../boot.php:1130
+#: ../../boot.php:1140 ../../include/text.php:263
 #, fuzzy
 msgid "next"
 msgstr "suivant"
 
 #: ../../boot.php:1837 ../../boot.php:1838 ../../boot.php:1840
 #: ../../boot.php:1848 ../../boot.php:1860 ../../boot.php:1861
-#: ../../include/conversation.php:571
+#: ../../include/conversation.php:571 ../../include/conversation.php:638
+#: ../../include/conversation.php:663
 #, fuzzy, php-format
 msgid "%s likes this."
 msgstr "%s aime ça."
 
 #: ../../boot.php:1837 ../../boot.php:1838 ../../boot.php:1840
 #: ../../boot.php:1848 ../../boot.php:1860 ../../boot.php:1861
-#: ../../include/conversation.php:571
+#: ../../include/conversation.php:571 ../../include/conversation.php:638
+#: ../../include/conversation.php:663
 #, fuzzy, php-format
 msgid "%s doesn't like this."
 msgstr "%s n'aime pas ça."
 
 #: ../../boot.php:1841 ../../boot.php:1842 ../../boot.php:1844
 #: ../../boot.php:1852 ../../boot.php:1864 ../../boot.php:1865
-#: ../../include/conversation.php:575
+#: ../../include/conversation.php:575 ../../include/conversation.php:642
+#: ../../include/conversation.php:667
 #, fuzzy, php-format
 msgid "<span  %1$s>%2$d people</span> like this."
 msgstr "<span  %1$s>%2$d personnes</span> aiment ça."
 
 #: ../../boot.php:1843 ../../boot.php:1844 ../../boot.php:1846
 #: ../../boot.php:1854 ../../boot.php:1866 ../../boot.php:1867
-#: ../../include/conversation.php:577
+#: ../../include/conversation.php:577 ../../include/conversation.php:644
+#: ../../include/conversation.php:669
 #, fuzzy, php-format
 msgid "<span  %1$s>%2$d people</span> don't like this."
 msgstr "<span  %1$s>%2$d personnes</span> ,n'aiment pas ça."
 
 #: ../../boot.php:1849 ../../boot.php:1850 ../../boot.php:1852
 #: ../../boot.php:1860 ../../boot.php:1872 ../../boot.php:1873
-#: ../../include/conversation.php:583
+#: ../../include/conversation.php:583 ../../include/conversation.php:650
+#: ../../include/conversation.php:675
 msgid "and"
 msgstr "et"
 
 #: ../../boot.php:1852 ../../boot.php:1853 ../../boot.php:1855
 #: ../../boot.php:1863 ../../boot.php:1875 ../../boot.php:1876
-#: ../../include/conversation.php:586
+#: ../../include/conversation.php:586 ../../include/conversation.php:653
+#: ../../include/conversation.php:678
 #, fuzzy, php-format
 msgid ", and %d other people"
 msgstr ", et %d autres personnes"
 
 #: ../../boot.php:1853 ../../boot.php:1854 ../../boot.php:1856
 #: ../../boot.php:1864 ../../boot.php:1876 ../../boot.php:1877
-#: ../../include/conversation.php:587
+#: ../../include/conversation.php:587 ../../include/conversation.php:654
+#: ../../include/conversation.php:679
 #, fuzzy, php-format
 msgid "%s like this."
 msgstr "%s aiment ça."
 
 #: ../../boot.php:1853 ../../boot.php:1854 ../../boot.php:1856
 #: ../../boot.php:1864 ../../boot.php:1876 ../../boot.php:1877
-#: ../../include/conversation.php:587
+#: ../../include/conversation.php:587 ../../include/conversation.php:654
+#: ../../include/conversation.php:679
 #, fuzzy, php-format
 msgid "%s don't like this."
 msgstr "%s n'aiment pas ça."
 
 #: ../../boot.php:2014 ../../boot.php:2015 ../../boot.php:2017
 #: ../../boot.php:2025 ../../boot.php:2037 ../../boot.php:2038
-#: ../../boot.php:1983
+#: ../../boot.php:1983 ../../boot.php:2001 ../../include/text.php:542
 msgid "No contacts"
 msgstr "Aucun contact"
 
 #: ../../boot.php:2267 ../../boot.php:2268 ../../boot.php:2270
 #: ../../boot.php:2278 ../../boot.php:2290 ../../boot.php:2305
-#: ../../boot.php:2254
+#: ../../boot.php:2254 ../../boot.php:2275 ../../boot.php:856
 msgid "Connect"
 msgstr "Relier"
 
 #: ../../boot.php:2277 ../../boot.php:2278 ../../boot.php:2280
 #: ../../boot.php:2288 ../../boot.php:2300 ../../boot.php:2315
-#: ../../boot.php:2264
+#: ../../boot.php:2264 ../../boot.php:2290 ../../include/event.php:37
+#: ../../mod/events.php:328 ../../boot.php:871
 msgid "Location:"
 msgstr "Localisation:"
 
 #: ../../boot.php:2281 ../../boot.php:2282 ../../boot.php:2284
 #: ../../boot.php:2292 ../../boot.php:2304 ../../boot.php:2319
-#: ../../boot.php:2268
+#: ../../boot.php:2268 ../../boot.php:2294 ../../boot.php:875
 msgid ", "
 msgstr ", "
 
 #: ../../boot.php:2289 ../../boot.php:2290 ../../boot.php:2292
 #: ../../include/profile_advanced.php:23 ../../boot.php:2300
 #: ../../boot.php:2312 ../../boot.php:2327 ../../boot.php:2276
+#: ../../boot.php:2302 ../../boot.php:884
 msgid "Gender:"
 msgstr "Genre:"
 
 #: ../../boot.php:2293 ../../boot.php:2294 ../../boot.php:2296
 #: ../../boot.php:2304 ../../boot.php:2316 ../../boot.php:2331
-#: ../../boot.php:2280
+#: ../../boot.php:2280 ../../boot.php:2306 ../../boot.php:888
 msgid "Status:"
 msgstr "Statut:"
 
 #: ../../boot.php:2295 ../../boot.php:2296 ../../boot.php:2298
 #: ../../include/profile_advanced.php:103 ../../boot.php:2306
 #: ../../boot.php:2318 ../../boot.php:2333 ../../boot.php:2282
+#: ../../boot.php:2308 ../../boot.php:890
 msgid "Homepage:"
 msgstr "Page personnelle:"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Monday"
 msgstr "Lundi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Tuesday"
 msgstr "Mardi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Wednesday"
 msgstr "Mercredi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Thursday"
 msgstr "Jeudi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Friday"
 msgstr "Vendredi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Saturday"
 msgstr "Samedi"
 
 #: ../../boot.php:2386 ../../boot.php:2387 ../../boot.php:2389
 #: ../../boot.php:2397 ../../boot.php:2409 ../../boot.php:2424
-#: ../../boot.php:2373
+#: ../../boot.php:2373 ../../boot.php:2399 ../../include/text.php:685
 msgid "Sunday"
 msgstr "Dimanche"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "January"
 msgstr "Janvier"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "February"
 msgstr "Février"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "March"
 msgstr "Mars"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "April"
 msgstr "Avril"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "May"
 msgstr "Mai"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "June"
 msgstr "Juin"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "July"
 msgstr "Juillet"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "August"
 msgstr "Août"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "September"
 msgstr "Septembre"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "October"
 msgstr "Octobre"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "November"
 msgstr "Novembre"
 
 #: ../../boot.php:2390 ../../boot.php:2391 ../../boot.php:2393
 #: ../../boot.php:2401 ../../boot.php:2413 ../../boot.php:2428
-#: ../../boot.php:2377
+#: ../../boot.php:2377 ../../boot.php:2403 ../../include/text.php:689
 msgid "December"
 msgstr "Décembre"
 
 #: ../../boot.php:2424 ../../boot.php:2425 ../../boot.php:2427
 #: ../../boot.php:2433 ../../boot.php:2445 ../../boot.php:2460
-#: ../../boot.php:2409
+#: ../../boot.php:2409 ../../boot.php:2436 ../../boot.php:1003
 #, fuzzy
 msgid "Birthday Reminders"
 msgstr "Rappels d'anniversaires"
 
 #: ../../boot.php:2425 ../../boot.php:2426 ../../boot.php:2428
 #: ../../boot.php:2434 ../../boot.php:2446 ../../boot.php:2461
-#: ../../boot.php:2410
+#: ../../boot.php:2410 ../../boot.php:2437 ../../boot.php:1004
 msgid "Birthdays this week:"
 msgstr "Anniversaires cette semaine:"
 
 #: ../../boot.php:2426 ../../boot.php:2427 ../../boot.php:2429
 #: ../../boot.php:2435 ../../boot.php:2447 ../../boot.php:2462
-#: ../../boot.php:2411
+#: ../../boot.php:2411 ../../boot.php:2438 ../../boot.php:1005
 msgid "(Adjusted for local time)"
 msgstr "(Ajustés pour le fuseau horaire local)"
 
 #: ../../boot.php:2437 ../../boot.php:2438 ../../boot.php:2440
 #: ../../boot.php:2446 ../../boot.php:2458 ../../boot.php:2473
-#: ../../boot.php:2422
+#: ../../boot.php:2422 ../../boot.php:2449 ../../boot.php:1016
 msgid "[today]"
 msgstr "[aujourd'hui]"
 
 #: ../../boot.php:2634 ../../boot.php:2635 ../../boot.php:2637
 #: ../../boot.php:2643 ../../boot.php:2655 ../../boot.php:2670
-#: ../../boot.php:2619
+#: ../../boot.php:2619 ../../boot.php:2653 ../../include/text.php:820
+#: ../../mod/events.php:237
 #, fuzzy
 msgid "link to source"
 msgstr "lien original"
 
-#: ../../index.php:194 ../../index.php:208
+#: ../../index.php:194 ../../index.php:208 ../../index.php:210
+#: ../../mod/help.php:37 ../../index.php:209
 msgid "Not Found"
 msgstr "Non trouvé"
 
-#: ../../index.php:195 ../../index.php:209
+#: ../../index.php:195 ../../index.php:209 ../../index.php:211
+#: ../../mod/help.php:38 ../../index.php:210
 msgid "Page not found."
 msgstr "Page introuvable."
 
-#: ../../mod/friendika.php:12
+#: ../../mod/friendika.php:12 ../../mod/friendika.php:42
 msgid "This is Friendika version"
 msgstr "Motorisé par Friendika version"
 
-#: ../../mod/friendika.php:13
+#: ../../mod/friendika.php:13 ../../mod/friendika.php:43
 msgid "running at web location"
 msgstr "hébergé sur"
 
-#: ../../mod/friendika.php:15
+#: ../../mod/friendika.php:15 ../../mod/friendika.php:45
 msgid ""
 "Shared content within the Friendika network is provided under the <a href="
 "\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution "
@@ -3114,7 +3576,7 @@ msgstr ""
 "href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
 "Attribution 3.0</a>"
 
-#: ../../mod/friendika.php:17
+#: ../../mod/friendika.php:17 ../../mod/friendika.php:47
 msgid ""
 "Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</"
 "a> to learn more about the Friendika project."
@@ -3122,11 +3584,11 @@ msgstr ""
 "Pour en savoir plus, vous pouvez nous rendre visite sur <a href=\"http://"
 "project.friendika.com\">Project.Friendika.com</a>"
 
-#: ../../mod/friendika.php:19
+#: ../../mod/friendika.php:19 ../../mod/friendika.php:49
 msgid "Bug reports and issues: please visit"
 msgstr "Pour les rapports de bugs: rendez vous sur"
 
-#: ../../mod/friendika.php:20
+#: ../../mod/friendika.php:20 ../../mod/friendika.php:50
 msgid ""
 "Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - "
 "dot com"
@@ -3134,11 +3596,11 @@ msgstr ""
 "Suggestions, remerciements, donations, etc. - écrivez à \"Info\" arob. "
 "Friendika - point com"
 
-#: ../../mod/friendika.php:25
+#: ../../mod/friendika.php:25 ../../mod/friendika.php:55
 msgid "Installed plugins/addons/apps"
 msgstr "Extensions/greffons/applications installées"
 
-#: ../../mod/friendika.php:33
+#: ../../mod/friendika.php:33 ../../mod/friendika.php:63
 msgid "No installed plugins/addons/apps"
 msgstr "Aucune extension/greffon/application installée"
 
@@ -3146,13 +3608,14 @@ msgstr "Aucune extension/greffon/application installée"
 msgid "Profile Match"
 msgstr "Correpondance de profils"
 
-#: ../../mod/match.php:50
+#: ../../mod/match.php:50 ../../mod/match.php:54
 msgid "No matches"
 msgstr "Aucune correspondance"
 
 #: ../../mod/network.php:363 ../../mod/network.php:399
 #: ../../mod/network.php:409 ../../include/conversation.php:198
 #: ../../include/conversation.php:203 ../../include/conversation.php:213
+#: ../../include/conversation.php:271 ../../include/conversation.php:301
 msgid "See more posts like this"
 msgstr "Davantage de publications similaires"
 
@@ -3160,57 +3623,66 @@ msgstr "Davantage de publications similaires"
 #: ../../mod/network.php:418 ../../mod/profile.php:359
 #: ../../mod/network.php:428 ../../mod/profile.php:352
 #: ../../include/conversation.php:217 ../../include/conversation.php:227
-#: ../../include/conversation.php:237
+#: ../../include/conversation.php:237 ../../include/conversation.php:296
+#: ../../include/conversation.php:329
 #, php-format
 msgid "See all %d comments"
 msgstr "Voir les %d commentaires"
 
-#: ../../mod/install.php:72
+#: ../../mod/install.php:72 ../../mod/install.php:75
 msgid "Proceed with Installation"
 msgstr "Commencer l'installation"
 
-#: ../../mod/install.php:74
+#: ../../mod/install.php:74 ../../mod/install.php:77
 msgid "Your Friendika site database has been installed."
 msgstr "La base de données de votre site Friendika a été installée."
 
-#: ../../mod/install.php:78
+#: ../../mod/install.php:78 ../../mod/install.php:81
 msgid "Proceed to registration"
 msgstr "Commencer l'inscription"
 
 #: ../../mod/settings.php:345 ../../mod/settings.php:351
+#: ../../mod/settings.php:413 ../../mod/settings.php:487
 msgid "Export Personal Data"
 msgstr "Exporter les données personnelles"
 
 #: ../../mod/directory.php:92 ../../mod/directory.php:94
+#: ../../mod/directory.php:100 ../../mod/directory.php:115
 msgid "Gender: "
 msgstr "Genre: "
 
 #: ../../mod/directory.php:118 ../../mod/directory.php:120
+#: ../../mod/directory.php:126 ../../mod/directory.php:141
 msgid "No entries (some entries may be hidden)."
 msgstr "Aucune entrée (certaines peuvent être cachées)."
 
 #: ../../mod/profile.php:102 ../../mod/mprofile.php:101
-#: ../../mod/profile.php:103
+#: ../../mod/profile.php:103 ../../mod/profile.php:112 ../../mod/notes.php:46
+#: ../../mod/events.php:112 ../../mod/profile.php:117 ../../mod/photos.php:834
 msgid "Status"
 msgstr "Statut"
 
 #: ../../mod/profile.php:103 ../../mod/mprofile.php:102
 #: ../../include/profile_advanced.php:7 ../../mod/profile.php:104
-#: ../../mod/profperm.php:94
+#: ../../mod/profperm.php:94 ../../mod/profile.php:113 ../../mod/notes.php:47
+#: ../../mod/events.php:113 ../../mod/profile.php:118
+#: ../../mod/profperm.php:103 ../../mod/photos.php:835
 msgid "Profile"
 msgstr "Profil"
 
 #: ../../mod/profile.php:104 ../../mod/mprofile.php:103
-#: ../../mod/profile.php:105
+#: ../../mod/profile.php:105 ../../mod/profile.php:114 ../../mod/notes.php:48
+#: ../../mod/events.php:114 ../../mod/profile.php:119 ../../mod/photos.php:836
 msgid "Photos"
 msgstr "Photos"
 
-#: ../../mod/contacts.php:15
+#: ../../mod/contacts.php:15 ../../mod/contacts.php:41
 msgid "Find People With Shared Interests"
 msgstr "Trouver des gens d'intérêts communs"
 
 #: ../../boot.php:2023 ../../boot.php:2025 ../../boot.php:2033
 #: ../../boot.php:2045 ../../boot.php:2046 ../../boot.php:1991
+#: ../../boot.php:2009 ../../include/text.php:550
 #, php-format
 msgid "%d Contact"
 msgid_plural "%d Contacts"
@@ -3223,37 +3695,43 @@ msgstr "Publication réussie."
 
 #: ../../mod/network.php:74 ../../mod/profile.php:142 ../../mod/network.php:82
 #: ../../mod/profile.php:135 ../../mod/network.php:80
-#: ../../mod/profile.php:136
+#: ../../mod/profile.php:136 ../../include/conversation.php:679
+#: ../../include/conversation.php:704
 msgid "Enter a title for this item"
 msgstr "Saisissez un titre pour cet élément"
 
 #: ../../mod/network.php:105 ../../mod/profile.php:173
 #: ../../mod/network.php:113 ../../mod/profile.php:166
 #: ../../mod/network.php:111 ../../mod/profile.php:167
+#: ../../include/conversation.php:726 ../../include/conversation.php:755
 msgid "Set title"
 msgstr "Définir un titre"
 
 #: ../../mod/profile_photo.php:200 ../../mod/profile_photo.php:204
+#: ../../mod/profile_photo.php:209
 msgid "Crop Image"
 msgstr "(Re)cadrer l'image"
 
 #: ../../mod/profile_photo.php:201 ../../mod/profile_photo.php:205
+#: ../../mod/profile_photo.php:210
 msgid "Please adjust the image cropping for optimum viewing."
 msgstr "Ajustez le cadre de l'image pour une visualisation optimale."
 
 #: ../../mod/profile_photo.php:202 ../../mod/profile_photo.php:206
+#: ../../mod/profile_photo.php:211
 msgid "Done Editing"
 msgstr "Édition terminée"
 
-#: ../../mod/notifications.php:68
+#: ../../mod/notifications.php:68 ../../mod/notifications.php:74
 msgid "Pending Friend/Connect Notifications"
 msgstr "Notifications de relation/amitié enattente"
 
-#: ../../mod/notifications.php:143
+#: ../../mod/notifications.php:143 ../../mod/admin.php:466
 msgid "User registrations waiting for confirm"
 msgstr "Inscriptions d'utilisateurs en attente de confirmation"
 
-#: ../../boot.php:359 ../../boot.php:371 ../../boot.php:372
+#: ../../boot.php:359 ../../boot.php:371 ../../boot.php:372 ../../boot.php:385
+#: ../../boot.php:410
 msgid "Delete this item?"
 msgstr "Effacer cet élément?"
 
@@ -3262,10 +3740,15 @@ msgstr "Effacer cet élément?"
 #: ../../include/conversation.php:292 ../../boot.php:372
 #: ../../include/conversation.php:306 ../../boot.php:373
 #: ../../include/conversation.php:316 ../../mod/photos.php:1111
+#: ../../include/conversation.php:375 ../../mod/photos.php:1130
+#: ../../mod/photos.php:1169 ../../mod/photos.php:1200 ../../boot.php:386
+#: ../../include/conversation.php:408 ../../mod/photos.php:1183
+#: ../../mod/photos.php:1222 ../../mod/photos.php:1253 ../../boot.php:411
 msgid "Comment"
 msgstr "Commenter"
 
 #: ../../include/profile_advanced.php:10 ../../mod/settings.php:358
+#: ../../mod/settings.php:420 ../../mod/settings.php:497
 msgid "Full Name:"
 msgstr "Nom complet:"
 
@@ -3286,10 +3769,12 @@ msgid "<span class=\"heart\">&hearts;</span> Status:"
 msgstr "<span class=\"heart\">&hearts;</span> Statut:"
 
 #: ../../include/profile_advanced.php:90 ../../mod/profiles.php:388
+#: ../../mod/profiles.php:390
 msgid "Sexual Preference:"
 msgstr "Préférence sexuelle:"
 
 #: ../../include/profile_advanced.php:115 ../../mod/profiles.php:390
+#: ../../mod/profiles.php:392
 msgid "Political Views:"
 msgstr "Opinions politiques:"
 
@@ -3345,40 +3830,40 @@ msgstr "Études/Formation:"
 msgid "Hide my contact/friend list from viewers of this profile?"
 msgstr "Cacher ma liste d'amis/contacts des visiteurs de ce profil?"
 
-#: ../../mod/profiles.php:369
+#: ../../mod/profiles.php:369 ../../mod/profiles.php:371
 #, fuzzy
 msgid "Edit Profile Details"
 msgstr "Éditer les détails du profil"
 
-#: ../../mod/profiles.php:371
+#: ../../mod/profiles.php:371 ../../mod/profiles.php:373
 msgid "View this profile"
 msgstr "Voir ce profil"
 
-#: ../../mod/profiles.php:372
+#: ../../mod/profiles.php:372 ../../mod/profiles.php:374
 msgid "Create a new profile using these settings"
 msgstr "Créer un nouveau profil en utilisant ces réglages"
 
-#: ../../mod/profiles.php:373
+#: ../../mod/profiles.php:373 ../../mod/profiles.php:375
 msgid "Clone this profile"
 msgstr "Cloner ce profil"
 
-#: ../../mod/profiles.php:374
+#: ../../mod/profiles.php:374 ../../mod/profiles.php:376
 msgid "Delete this profile"
 msgstr "Supprimer ce profil"
 
-#: ../../mod/profiles.php:375
+#: ../../mod/profiles.php:375 ../../mod/profiles.php:377
 msgid "Profile Name:"
 msgstr "Nom du profil:"
 
-#: ../../mod/profiles.php:376
+#: ../../mod/profiles.php:376 ../../mod/profiles.php:378
 msgid "Your Full Name:"
 msgstr "Votre nom complet:"
 
-#: ../../mod/profiles.php:377
+#: ../../mod/profiles.php:377 ../../mod/profiles.php:379
 msgid "Title/Description:"
 msgstr "Titre/Description:"
 
-#: ../../mod/profiles.php:378
+#: ../../mod/profiles.php:378 ../../mod/profiles.php:380
 msgid "Your Gender:"
 msgstr "Votre genre:"
 
@@ -3386,165 +3871,158 @@ msgstr "Votre genre:"
 msgid "Birthday (y/m/d):"
 msgstr "Anniversaire (j/m/a):"
 
-#: ../../mod/profiles.php:380
+#: ../../mod/profiles.php:380 ../../mod/profiles.php:382
 msgid "Street Address:"
 msgstr "Adresse postale:"
 
-#: ../../mod/profiles.php:381
+#: ../../mod/profiles.php:381 ../../mod/profiles.php:383
 msgid "Locality/City:"
 msgstr "Ville/Localité:"
 
-#: ../../mod/profiles.php:382
+#: ../../mod/profiles.php:382 ../../mod/profiles.php:384
 msgid "Postal/Zip Code:"
 msgstr "Code postal:"
 
-#: ../../mod/profiles.php:383
+#: ../../mod/profiles.php:383 ../../mod/profiles.php:385
 msgid "Country:"
 msgstr "Pays:"
 
-#: ../../mod/profiles.php:384
+#: ../../mod/profiles.php:384 ../../mod/profiles.php:386
 #, fuzzy
 msgid "Region/State:"
 msgstr "Région/État:"
 
-#: ../../mod/profiles.php:385
+#: ../../mod/profiles.php:385 ../../mod/profiles.php:387
 msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
 msgstr "<span class=\"heart\">&hearts;</span> Statut marital:"
 
-#: ../../mod/profiles.php:386
+#: ../../mod/profiles.php:386 ../../mod/profiles.php:388
 msgid "Who: (if applicable)"
 msgstr "Qui: (si pertinent)"
 
-#: ../../mod/profiles.php:387
+#: ../../mod/profiles.php:387 ../../mod/profiles.php:389
 msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
 msgstr "Exemples: cathy123, Cathy Williams, cathy@example.com"
 
-#: ../../mod/profiles.php:389
+#: ../../mod/profiles.php:389 ../../mod/profiles.php:391
 msgid "Homepage URL:"
 msgstr "Page personnelle:"
 
-#: ../../mod/profiles.php:391
+#: ../../mod/profiles.php:391 ../../mod/profiles.php:393
 msgid "Religious Views:"
 msgstr "Opinions religieuses:"
 
-#: ../../mod/profiles.php:392
+#: ../../mod/profiles.php:392 ../../mod/profiles.php:394
 msgid "Public Keywords:"
 msgstr "Mots-clés publics:"
 
-#: ../../mod/profiles.php:393
+#: ../../mod/profiles.php:393 ../../mod/profiles.php:395
 msgid "Private Keywords:"
 msgstr "Mots-clés privés:"
 
-#: ../../mod/profiles.php:394
+#: ../../mod/profiles.php:394 ../../mod/profiles.php:396
 msgid "Example: fishing photography software"
 msgstr "Exemple: football dessin programmation"
 
-#: ../../mod/profiles.php:395
+#: ../../mod/profiles.php:395 ../../mod/profiles.php:397
 #, fuzzy
 msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr ""
-"(Utilisés pour vous suggérer des amis potentiels, peuvent être vus par "
-"autrui)"
+msgstr "(Utilisés pour vous suggérer des amis potentiels, peuvent être vus par autrui)"
 
-#: ../../mod/profiles.php:396
+#: ../../mod/profiles.php:396 ../../mod/profiles.php:398
 #, fuzzy
 msgid "(Used for searching profiles, never shown to others)"
-msgstr ""
-"(Utilisés pour rechercher dans les profils, ne seront jamais montrés à "
-"autrui)"
+msgstr "(Utilisés pour rechercher dans les profils, ne seront jamais montrés à autrui)"
 
-#: ../../mod/profiles.php:397
+#: ../../mod/profiles.php:397 ../../mod/profiles.php:399
 #, fuzzy
 msgid "Tell us about yourself..."
 msgstr "Parlez-nous de vous..."
 
-#: ../../mod/profiles.php:398
+#: ../../mod/profiles.php:398 ../../mod/profiles.php:400
 #, fuzzy
 msgid "Hobbies/Interests"
 msgstr "Passe-temps/Centres d'intérêt"
 
-#: ../../mod/profiles.php:399
+#: ../../mod/profiles.php:399 ../../mod/profiles.php:401
 #, fuzzy
 msgid "Contact information and Social Networks"
 msgstr "Coordonées/Réseaux sociaux"
 
-#: ../../mod/profiles.php:400
+#: ../../mod/profiles.php:400 ../../mod/profiles.php:402
 #, fuzzy
 msgid "Musical interests"
 msgstr "Goûts musicaux"
 
-#: ../../mod/profiles.php:401
+#: ../../mod/profiles.php:401 ../../mod/profiles.php:403
 #, fuzzy
 msgid "Books, literature"
 msgstr "Lectures"
 
-#: ../../mod/profiles.php:402
+#: ../../mod/profiles.php:402 ../../mod/profiles.php:404
 #, fuzzy
 msgid "Television"
 msgstr "Télévision"
 
-#: ../../mod/profiles.php:403
+#: ../../mod/profiles.php:403 ../../mod/profiles.php:405
 #, fuzzy
 msgid "Film/dance/culture/entertainment"
 msgstr "Cinéma/Danse/Culture/Divertissement"
 
-#: ../../mod/profiles.php:404
+#: ../../mod/profiles.php:404 ../../mod/profiles.php:406
 #, fuzzy
 msgid "Love/romance"
 msgstr "Amour/Romance"
 
-#: ../../mod/profiles.php:405
+#: ../../mod/profiles.php:405 ../../mod/profiles.php:407
 #, fuzzy
 msgid "Work/employment"
 msgstr "Activité professionnelle/Occupation"
 
-#: ../../mod/profiles.php:406
+#: ../../mod/profiles.php:406 ../../mod/profiles.php:408
 #, fuzzy
 msgid "School/education"
 msgstr "Études/Formation"
 
-#: ../../mod/profiles.php:457
+#: ../../mod/profiles.php:457 ../../mod/profiles.php:459
 #, fuzzy
 msgid "Change profile photo"
 msgstr "Changer de photo de profil"
 
-#: ../../mod/profiles.php:458
+#: ../../mod/profiles.php:458 ../../mod/profiles.php:460
 #, fuzzy
 msgid "Create New Profile"
 msgstr "Créer un nouveau profil"
 
-#: ../../mod/network.php:59 ../../mod/network.php:57
+#: ../../mod/network.php:59 ../../mod/network.php:57 ../../mod/network.php:64
 #, php-format
 msgid "%d member"
 msgid_plural "%d members"
 msgstr[0] "%d membre"
 msgstr[1] "%d membres"
 
-#: ../../mod/network.php:60 ../../mod/network.php:58
+#: ../../mod/network.php:60 ../../mod/network.php:58 ../../mod/network.php:65
 #, fuzzy, php-format
 msgid "Warning: This group contains %s from an insecure network."
-msgstr ""
-"Attention : ce groupe contient %s, qui se connecte depuis un réseau non-"
-"sécurisé."
+msgstr "Attention : ce groupe contient %s, qui se connecte depuis un réseau non-sécurisé."
 
-#: ../../mod/network.php:61 ../../mod/network.php:59
+#: ../../mod/network.php:61 ../../mod/network.php:59 ../../mod/network.php:66
+#: ../../mod/network.php:97
 #, fuzzy
 msgid "Private messages to this group are at risk of public disclosure."
-msgstr ""
-"Les messages privés envoyés à ce groupe s'exposent à une diffusion "
-"incontrôlée."
+msgstr Les messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée."
 
-#: ../../mod/message.php:240
+#: ../../mod/message.php:240 ../../mod/message.php:166
 #, fuzzy
 msgid "D, d M Y - g:i A"
 msgstr "D, d M Y - g:i A"
 
-#: ../../mod/install.php:121
+#: ../../mod/install.php:121 ../../mod/install.php:124
 #, fuzzy
 msgid "Friendika Social Network"
 msgstr "Réseau social Friendika"
 
-#: ../../mod/install.php:122
+#: ../../mod/install.php:122 ../../mod/install.php:125
 #, fuzzy
 msgid "Installation"
 msgstr "Installation"
@@ -3557,7 +4035,7 @@ msgstr ""
 "Pour installer Friendika, nous avons besoin de contacter votre base de "
 "données."
 
-#: ../../mod/install.php:124
+#: ../../mod/install.php:124 ../../mod/install.php:127
 #, fuzzy
 msgid ""
 "Please contact your hosting provider or site administrator if you have "
@@ -3575,90 +4053,92 @@ msgstr ""
 "La base de données que vous spécifierez doit exister. Si ce n'est pas encore "
 "le cas, merci de la créer avant de continuer."
 
-#: ../../mod/install.php:126
+#: ../../mod/install.php:126 ../../mod/install.php:129
 #, fuzzy
 msgid "Database Server Name"
 msgstr "Serveur de base de données"
 
-#: ../../mod/install.php:127
+#: ../../mod/install.php:127 ../../mod/install.php:130
 #, fuzzy
 msgid "Database Login Name"
 msgstr "Nom d'utilisateur de la base"
 
-#: ../../mod/install.php:128
+#: ../../mod/install.php:128 ../../mod/install.php:131
 #, fuzzy
 msgid "Database Login Password"
 msgstr "Mot de passe de la base"
 
-#: ../../mod/install.php:129
+#: ../../mod/install.php:129 ../../mod/install.php:132
 #, fuzzy
 msgid "Database Name"
 msgstr "Nom de la base"
 
-#: ../../mod/install.php:130
+#: ../../mod/install.php:130 ../../mod/install.php:133
 #, fuzzy
 msgid "Please select a default timezone for your website"
 msgstr "Sélectionner un fuseau horaire par défaut pour votre site"
 
-#: ../../mod/settings.php:262
+#: ../../mod/settings.php:262 ../../mod/settings.php:323
+#: ../../mod/admin.php:133 ../../mod/admin.php:446 ../../mod/settings.php:382
 #, fuzzy
 msgid "Normal Account"
 msgstr "Compte normal"
 
-#: ../../mod/settings.php:263
+#: ../../mod/settings.php:263 ../../mod/settings.php:324
+#: ../../mod/settings.php:383
 #, fuzzy
 msgid "This account is a normal personal profile"
-msgstr ""
-"Ce compte correspond à un profil normal, pour une seule personne (physique, "
-"généralement)"
+msgstr Ce compte correspond à un profil normal, pour une seule personne (physique, généralement)"
 
-#: ../../mod/settings.php:264
+#: ../../mod/settings.php:264 ../../mod/settings.php:325
+#: ../../mod/admin.php:134 ../../mod/admin.php:447 ../../mod/settings.php:386
 #, fuzzy
 msgid "Soapbox Account"
 msgstr "Compte \"boîte à savon\""
 
-#: ../../mod/settings.php:265
+#: ../../mod/settings.php:265 ../../mod/settings.php:326
+#: ../../mod/settings.php:387
 #, fuzzy
 msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des fans 'en lecture seule'"
+msgstr Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'"
 
-#: ../../mod/settings.php:266
+#: ../../mod/settings.php:266 ../../mod/settings.php:327
+#: ../../mod/admin.php:135 ../../mod/admin.php:448 ../../mod/settings.php:390
 #, fuzzy
 msgid "Community/Celebrity Account"
 msgstr "Compte de communauté/célébrité"
 
-#: ../../mod/settings.php:267
+#: ../../mod/settings.php:267 ../../mod/settings.php:328
+#: ../../mod/settings.php:391
 #, fuzzy
 msgid "Automatically approve all connection/friend requests as read-write fans"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des fans en 'lecture/écriture'"
+msgstr "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'"
 
-#: ../../mod/settings.php:268
+#: ../../mod/settings.php:268 ../../mod/settings.php:329
+#: ../../mod/admin.php:136 ../../mod/admin.php:449 ../../mod/settings.php:394
 #, fuzzy
 msgid "Automatic Friend Account"
 msgstr "Compte auto-amical"
 
-#: ../../mod/settings.php:269
+#: ../../mod/settings.php:269 ../../mod/settings.php:330
+#: ../../mod/settings.php:395
 #, fuzzy
 msgid "Automatically approve all connection/friend requests as friends"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des amis"
+msgstr "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des amis"
 
-#: ../../mod/settings.php:288
+#: ../../mod/settings.php:288 ../../mod/settings.php:349
 #, fuzzy
 msgid "Publish your default profile in site directory?"
 msgstr "Publier votre profil par défaut sur l'annuaire local?"
 
-#: ../../mod/settings.php:300
+#: ../../mod/settings.php:300 ../../mod/settings.php:361
 #, fuzzy
 msgid "Publish your default profile in global social directory?"
 msgstr "Publier votre profil par défaut sur l'annuaire global?"
 
 #: ../../mod/settings.php:336 ../../mod/profile_photo.php:191
+#: ../../mod/settings.php:398 ../../mod/profile_photo.php:196
+#: ../../mod/settings.php:461
 #, fuzzy
 msgid "or"
 msgstr "ou"
@@ -3668,128 +4148,150 @@ msgstr "ou"
 msgid "Your profile address is"
 msgstr "Votre adresse de profil est"
 
-#: ../../mod/settings.php:357
+#: ../../mod/settings.php:357 ../../mod/settings.php:419
+#: ../../mod/settings.php:496
 #, fuzzy
 msgid "Basic Settings"
 msgstr "Réglages basiques"
 
-#: ../../mod/settings.php:359
+#: ../../mod/settings.php:359 ../../mod/settings.php:421
+#: ../../mod/settings.php:498
 #, fuzzy
 msgid "Email Address:"
 msgstr "Adresse courriel:"
 
-#: ../../mod/settings.php:360
+#: ../../mod/settings.php:360 ../../mod/settings.php:422
+#: ../../mod/settings.php:499
 #, fuzzy
 msgid "Your Timezone:"
 msgstr "Fuseau horaire:"
 
-#: ../../mod/settings.php:361
+#: ../../mod/settings.php:361 ../../mod/settings.php:423
+#: ../../mod/settings.php:500
 #, fuzzy
 msgid "Default Post Location:"
 msgstr "Publication par défaut depuis :"
 
-#: ../../mod/settings.php:362
+#: ../../mod/settings.php:362 ../../mod/settings.php:424
+#: ../../mod/settings.php:501
 #, fuzzy
 msgid "Use Browser Location:"
 msgstr "Utiliser la localisation géographique du navigateur:"
 
-#: ../../mod/settings.php:363
+#: ../../mod/settings.php:363 ../../mod/settings.php:425
+#: ../../mod/settings.php:502
 #, fuzzy
 msgid "Display Theme:"
 msgstr "Thème d'affichage:"
 
-#: ../../mod/settings.php:365
+#: ../../mod/settings.php:365 ../../mod/settings.php:427
+#: ../../mod/settings.php:506
 #, fuzzy
 msgid "Security and Privacy Settings"
 msgstr "Réglages de sécurité et vie privée"
 
-#: ../../mod/settings.php:366
+#: ../../mod/settings.php:366 ../../mod/settings.php:428
+#: ../../mod/settings.php:508
 #, fuzzy
 msgid "Maximum Friend Requests/Day:"
 msgstr "Nombre maximal de requêtes d'amitié/jour:"
 
-#: ../../mod/settings.php:367
+#: ../../mod/settings.php:367 ../../mod/settings.php:429
+#: ../../mod/settings.php:508
 #, fuzzy
 msgid "(to prevent spam abuse)"
 msgstr "(pour limiter l'impact du spam)"
 
-#: ../../mod/settings.php:368
+#: ../../mod/settings.php:368 ../../mod/settings.php:430
+#: ../../mod/settings.php:514
 #, fuzzy
 msgid "Allow friends to post to your profile page:"
 msgstr "Autoriser vos amis à publier sur votre page de profil:"
 
-#: ../../mod/settings.php:369
+#: ../../mod/settings.php:369 ../../mod/settings.php:431
 #, fuzzy
 msgid "Automatically expire (delete) posts older than"
 msgstr "Fair e expirer automatiquement les publications de plus de"
 
-#: ../../mod/settings.php:371
+#: ../../mod/settings.php:371 ../../mod/settings.php:433
+#: ../../mod/settings.php:524
 #, fuzzy
 msgid "Notification Settings"
 msgstr "Réglages de notification"
 
-#: ../../mod/settings.php:372
+#: ../../mod/settings.php:372 ../../mod/settings.php:434
+#: ../../mod/settings.php:525
 #, fuzzy
 msgid "Send a notification email when:"
 msgstr "Envoyer un courriel de notification quand:"
 
-#: ../../mod/settings.php:373
+#: ../../mod/settings.php:373 ../../mod/settings.php:435
+#: ../../mod/settings.php:526
 #, fuzzy
 msgid "You receive an introduction"
 msgstr "Vous recevez une introduction"
 
-#: ../../mod/settings.php:374
+#: ../../mod/settings.php:374 ../../mod/settings.php:436
+#: ../../mod/settings.php:527
 #, fuzzy
 msgid "Your introductions are confirmed"
 msgstr "Vos introductions sont confirmées"
 
-#: ../../mod/settings.php:375
+#: ../../mod/settings.php:375 ../../mod/settings.php:437
+#: ../../mod/settings.php:528
 #, fuzzy
 msgid "Someone writes on your profile wall"
 msgstr "Quelqu'un écrit sur votre mur"
 
-#: ../../mod/settings.php:376
+#: ../../mod/settings.php:376 ../../mod/settings.php:438
+#: ../../mod/settings.php:529
 #, fuzzy
 msgid "Someone writes a followup comment"
 msgstr "Quelqu'un vous commente"
 
-#: ../../mod/settings.php:377
+#: ../../mod/settings.php:377 ../../mod/settings.php:439
+#: ../../mod/settings.php:530
 #, fuzzy
 msgid "You receive a private message"
 msgstr "Vous recevez un message privé"
 
-#: ../../mod/settings.php:378
+#: ../../mod/settings.php:378 ../../mod/settings.php:440
+#: ../../mod/settings.php:490
 #, fuzzy
 msgid "Password Settings"
 msgstr "Réglages de mot de passe"
 
-#: ../../mod/settings.php:379
+#: ../../mod/settings.php:379 ../../mod/settings.php:441
+#: ../../mod/settings.php:492
 #, fuzzy
 msgid "Leave password fields blank unless changing"
-msgstr ""
-"Laissez les champs de mot de passe vierge, sauf si vous désirez les changer"
+msgstr "Laissez les champs de mot de passe vierge, sauf si vous désirez les changer"
 
-#: ../../mod/settings.php:380
+#: ../../mod/settings.php:380 ../../mod/settings.php:442
+#: ../../mod/settings.php:491
 #, fuzzy
 msgid "New Password:"
 msgstr "Nouveau mot de passe:"
 
-#: ../../mod/settings.php:381
+#: ../../mod/settings.php:381 ../../mod/settings.php:443
+#: ../../mod/settings.php:492
 #, fuzzy
 msgid "Confirm:"
 msgstr "Confirmer:"
 
-#: ../../mod/settings.php:382
+#: ../../mod/settings.php:382 ../../mod/settings.php:444
+#: ../../mod/settings.php:549
 #, fuzzy
 msgid "Advanced Page Settings"
 msgstr "Réglages avancés"
 
-#: ../../mod/lostpass.php:27
+#: ../../mod/lostpass.php:27 ../../mod/lostpass.php:31
 #, fuzzy
 msgid "Password reset request issued. Check your email."
 msgstr "Réinitialisation du mot de passe en cours. Vérifiez votre courriel."
 
-#: ../../mod/lostpass.php:56
+#: ../../mod/lostpass.php:56 ../../mod/lostpass.php:60
+#: ../../mod/lostpass.php:64
 #, fuzzy
 msgid ""
 "Request could not be verified. (You may have previously submitted it.) "
@@ -3798,27 +4300,32 @@ msgstr ""
 "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par "
 "le passé.) La réinitialisation a échoué."
 
-#: ../../mod/lostpass.php:75
+#: ../../mod/lostpass.php:75 ../../mod/lostpass.php:79
+#: ../../mod/lostpass.php:83
 #, fuzzy
 msgid "Your password has been reset as requested."
 msgstr "Votre mot de passe a bien été réinitialisé."
 
-#: ../../mod/lostpass.php:76
+#: ../../mod/lostpass.php:76 ../../mod/lostpass.php:80
+#: ../../mod/lostpass.php:84
 #, fuzzy
 msgid "Your new password is"
 msgstr "Votre nouveau mot de passe est"
 
-#: ../../mod/lostpass.php:77
+#: ../../mod/lostpass.php:77 ../../mod/lostpass.php:81
+#: ../../mod/lostpass.php:85
 #, fuzzy
 msgid "Save or copy your new password - and then"
 msgstr "Sauvez ou copiez ce nouveau mot de passe - puis"
 
-#: ../../mod/lostpass.php:78
+#: ../../mod/lostpass.php:78 ../../mod/lostpass.php:82
+#: ../../mod/lostpass.php:86
 #, fuzzy
 msgid "click here to login"
 msgstr "cliquez ici pour vous connecter"
 
-#: ../../mod/lostpass.php:79
+#: ../../mod/lostpass.php:79 ../../mod/lostpass.php:83
+#: ../../mod/lostpass.php:87
 #, fuzzy
 msgid ""
 "Your password may be changed from the <em>Settings</em> page after "
@@ -3827,12 +4334,14 @@ msgstr ""
 "Votre mot de passe peut être changé depuis la page <em>Réglages</em>, une "
 "fois que vous serez connecté."
 
-#: ../../mod/lostpass.php:107
+#: ../../mod/lostpass.php:107 ../../mod/lostpass.php:114
+#: ../../mod/lostpass.php:118
 #, fuzzy
 msgid "Forgot your Password?"
 msgstr "Mot de passe oublié?"
 
-#: ../../mod/lostpass.php:108
+#: ../../mod/lostpass.php:108 ../../mod/lostpass.php:115
+#: ../../mod/lostpass.php:119
 #, fuzzy
 msgid ""
 "Enter your email address and submit to have your password reset. Then check "
@@ -3841,28 +4350,30 @@ msgstr ""
 "Entrez votre adresse de courriel et validez pour réinitialiser votre mot de "
 "passe. Vous recevrez la suite des instructions par courriel."
 
-#: ../../mod/lostpass.php:109
+#: ../../mod/lostpass.php:109 ../../mod/lostpass.php:116
+#: ../../mod/lostpass.php:120
 #, fuzzy
 msgid "Nickname or Email: "
 msgstr "Pseudo ou courriel:"
 
-#: ../../mod/lostpass.php:110
+#: ../../mod/lostpass.php:110 ../../mod/lostpass.php:117
+#: ../../mod/lostpass.php:121
 #, fuzzy
 msgid "Reset"
 msgstr "Réinitialiser"
 
-#: ../../mod/group.php:95 ../../mod/group.php:74
+#: ../../mod/group.php:95 ../../mod/group.php:74 ../../mod/group.php:82
 #, fuzzy
 msgid "Create a group of contacts/friends."
 msgstr "Créez un groupe de contacts/amis."
 
 #: ../../mod/group.php:96 ../../mod/group.php:153 ../../mod/group.php:75
-#: ../../mod/group.php:158
+#: ../../mod/group.php:158 ../../mod/group.php:83 ../../mod/group.php:166
 #, fuzzy
 msgid "Group Name: "
 msgstr "Nom du groupe:"
 
-#: ../../mod/group.php:152 ../../mod/group.php:157
+#: ../../mod/group.php:152 ../../mod/group.php:157 ../../mod/group.php:165
 #, fuzzy
 msgid "Group Editor"
 msgstr "Éditeur de groupe"
@@ -3872,57 +4383,61 @@ msgstr "Éditeur de groupe"
 msgid "Members:"
 msgstr "Membres:"
 
-#: ../../mod/profile_photo.php:188
+#: ../../mod/profile_photo.php:188 ../../mod/profile_photo.php:193
 #, fuzzy
 msgid "Upload File:"
 msgstr "Fichier à téléverser:"
 
-#: ../../mod/profile_photo.php:189
+#: ../../mod/profile_photo.php:189 ../../mod/profile_photo.php:194
 #, fuzzy
 msgid "Upload Profile Photo"
 msgstr "Téléverser une photo de profil"
 
-#: ../../mod/profile_photo.php:190
+#: ../../mod/profile_photo.php:190 ../../mod/profile_photo.php:195
 #, fuzzy
 msgid "Upload"
 msgstr "Téléverser"
 
-#: ../../mod/profile_photo.php:191
+#: ../../mod/profile_photo.php:191 ../../mod/profile_photo.php:196
 #, fuzzy
 msgid "select a photo from your photo albums"
 msgstr "choisissez une photo depuis vos albums"
 
-#: ../../mod/directory.php:39
+#: ../../mod/directory.php:39 ../../mod/directory.php:45
+#: ../../mod/directory.php:56
 #, fuzzy
 msgid "Site Directory"
 msgstr "Annuaire local"
 
-#: ../../mod/dfrn_request.php:503
+#: ../../mod/dfrn_request.php:503 ../../mod/dfrn_request.php:507
+#: ../../mod/dfrn_request.php:504
 #, fuzzy, php-format
 msgid "Welcome home %s."
 msgstr "Bienvenue chez vous, %s."
 
-#: ../../mod/dfrn_request.php:504
+#: ../../mod/dfrn_request.php:504 ../../mod/dfrn_request.php:508
+#: ../../mod/dfrn_request.php:505
 #, fuzzy, php-format
 msgid "Please confirm your introduction/connection request to %s."
 msgstr "Merci de confirmer votre demande d'introduction auprès de %s."
 
-#: ../../mod/dfrn_request.php:505
+#: ../../mod/dfrn_request.php:505 ../../mod/dfrn_request.php:509
+#: ../../mod/dfrn_request.php:506
 #, fuzzy
 msgid "Confirm"
 msgstr "Confirmer"
 
-#: ../../mod/notifications.php:154
+#: ../../mod/notifications.php:154 ../../mod/admin.php:470
 #, fuzzy
 msgid "Deny"
 msgstr "Rejetter"
 
-#: ../../mod/contacts.php:265
+#: ../../mod/contacts.php:265 ../../mod/contacts.php:299
 #, fuzzy
 msgid "Profile Visibility"
 msgstr "Visibilité du profil"
 
-#: ../../mod/contacts.php:266
+#: ../../mod/contacts.php:266 ../../mod/contacts.php:300
 #, fuzzy, php-format
 msgid ""
 "Please choose the profile you would like to display to %s when viewing your "
@@ -3931,17 +4446,17 @@ msgstr ""
 "Merci de choisir le profil que vous souhaitez montrer à %s lorsqu'il vous "
 "rend visite de manière nominative."
 
-#: ../../mod/contacts.php:267
+#: ../../mod/contacts.php:267 ../../mod/contacts.php:301
 #, fuzzy
 msgid "Contact Information / Notes"
 msgstr "Informations de contact / Notes"
 
-#: ../../mod/contacts.php:268
+#: ../../mod/contacts.php:268 ../../mod/contacts.php:302
 #, fuzzy
 msgid "Online Reputation"
 msgstr "Réputation en ligne"
 
-#: ../../mod/contacts.php:269
+#: ../../mod/contacts.php:269 ../../mod/contacts.php:303
 #, fuzzy
 msgid ""
 "Occasionally your friends may wish to inquire about this person's online "
@@ -3950,7 +4465,7 @@ msgstr ""
 "De temps à autres, vos amis peuvent avoir besoin de connaître la légitimité "
 "de cette personne."
 
-#: ../../mod/contacts.php:270
+#: ../../mod/contacts.php:270 ../../mod/contacts.php:304
 #, fuzzy
 msgid ""
 "You may help them choose whether or not to interact with this person by "
@@ -3959,7 +4474,7 @@ msgstr ""
 "Vous pouvez les aider à choisir s'ils veulent - ou non - interagir avec "
 "cette personne en leur fournissant une mesure de <em>réputation</em>."
 
-#: ../../mod/contacts.php:271
+#: ../../mod/contacts.php:271 ../../mod/contacts.php:305
 #, fuzzy
 msgid ""
 "Please take a moment to elaborate on this selection if you feel it could be "
@@ -3969,31 +4484,35 @@ msgstr ""
 "utile à d'autres."
 
 #: ../../boot.php:2416 ../../boot.php:2428 ../../boot.php:2443
-#: ../../boot.php:2392
+#: ../../boot.php:2392 ../../boot.php:2418 ../../boot.php:985
 #, fuzzy
 msgid "g A l F d"
 msgstr "g A | F d"
 
 #: ../../boot.php:2734 ../../boot.php:2746 ../../boot.php:2761
-#: ../../include/conversation.php:517
+#: ../../include/conversation.php:517 ../../include/conversation.php:583
+#: ../../include/conversation.php:608
 #, fuzzy
 msgid "View status"
 msgstr "Voir le statut"
 
 #: ../../boot.php:2735 ../../boot.php:2747 ../../boot.php:2762
-#: ../../include/conversation.php:518
+#: ../../include/conversation.php:518 ../../include/conversation.php:584
+#: ../../include/conversation.php:609
 #, fuzzy
 msgid "View profile"
 msgstr "Voir le profil"
 
 #: ../../boot.php:2736 ../../boot.php:2748 ../../boot.php:2763
-#: ../../include/conversation.php:519
+#: ../../include/conversation.php:519 ../../include/conversation.php:585
+#: ../../include/conversation.php:610
 #, fuzzy
 msgid "View photos"
 msgstr "Voir les photos"
 
 #: ../../boot.php:2738 ../../boot.php:2750 ../../boot.php:2765
-#: ../../include/conversation.php:521
+#: ../../include/conversation.php:521 ../../include/conversation.php:588
+#: ../../include/conversation.php:613
 #, fuzzy
 msgid "Send PM"
 msgstr "Envoyer message"
@@ -4002,48 +4521,1478 @@ msgstr "Envoyer message"
 #: ../../include/conversation.php:362 ../../include/conversation.php:116
 #: ../../include/conversation.php:376 ../../include/conversation.php:377
 #: ../../include/conversation.php:126 ../../include/conversation.php:386
-#: ../../include/conversation.php:387
+#: ../../include/conversation.php:387 ../../include/conversation.php:184
+#: ../../include/conversation.php:441 ../../include/conversation.php:442
+#: ../../include/conversation.php:213 ../../include/conversation.php:488
+#: ../../include/conversation.php:489
 #, fuzzy, php-format
 msgid "View %s's profile"
 msgstr "Voir le profil de %s"
 
-#: ../../include/nav.php:68
+#: ../../include/nav.php:68 ../../include/nav.php:67 ../../include/nav.php:64
+#: ../../mod/help.php:31 ../../mod/help.php:33
 #, fuzzy
 msgid "Help"
 msgstr "Aide"
 
-#: ../../mod/profiles.php:470
+#: ../../mod/profiles.php:470 ../../include/acl_selectors.php:279
 msgid "Visible to everybody"
 msgstr "Visible par tout le monde"
 
-#: ../../mod/profiles.php:471
+#: ../../mod/profiles.php:471 ../../mod/profiles.php:473
 msgid "Edit visibility"
 msgstr "Changer la visibilité"
 
-#: ../../mod/group.php:156 ../../mod/profperm.php:96
+#: ../../mod/group.php:156 ../../mod/profperm.php:96 ../../mod/group.php:164
+#: ../../mod/profperm.php:105
 msgid "Click on a contact to add or remove."
 msgstr "Cliquez sur un contact pour l'ajouter ou le supprimer."
 
-#: ../../mod/group.php:169
+#: ../../mod/group.php:169 ../../mod/group.php:180
 msgid "Members"
 msgstr "Membres"
 
-#: ../../mod/group.php:183
+#: ../../mod/group.php:183 ../../mod/group.php:195
 msgid "All Contacts"
 msgstr "Tout les contacts"
 
 #: ../../mod/profperm.php:25 ../../mod/profperm.php:46
+#: ../../mod/profperm.php:55
 msgid "Invalid profile identifier."
 msgstr "Identifiant de profil invalide."
 
-#: ../../mod/profperm.php:92
+#: ../../mod/profperm.php:92 ../../mod/profperm.php:101
 msgid "Profile Visibility Editor"
 msgstr "Éditer la visibilité du profil"
 
-#: ../../mod/profperm.php:105
+#: ../../mod/profperm.php:105 ../../mod/profperm.php:114
 msgid "Visible To"
 msgstr "Visible par"
 
-#: ../../mod/profperm.php:116
+#: ../../mod/profperm.php:116 ../../mod/profperm.php:128
 msgid "All Contacts (with secure profile access)"
 msgstr "Tous les contacts (ayant un accès sécurisé)"
+
+#: ../../mod/settings.php:398 ../../mod/settings.php:460
+#: ../../mod/settings.php:510
+msgid "(click to open/close)"
+msgstr "(cliquer pour ouvrir/fermer)"
+
+#: ../../mod/crepair.php:42
+msgid "Contact settings applied."
+msgstr "Réglages du contact appliqués."
+
+#: ../../mod/crepair.php:44
+msgid "Contact update failed."
+msgstr "Echec lors de la mise à jour du contact."
+
+#: ../../mod/crepair.php:74
+msgid "Repair Contact Settings"
+msgstr "Réparer les réglages du contact"
+
+#: ../../mod/crepair.php:76
+msgid ""
+"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
+"information your communications with this contact will stop working."
+msgstr ""
+"<strong>ATTENTION: Ceci est à réserver aux utilisateurs avancés</strong> et pourrait "
+"bloquer vos communications avec ce contact en cas d'erreur."
+
+#: ../../mod/crepair.php:77
+msgid ""
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
+msgstr ""
+"Merci d'utiliser le bouton 'Précédent' <strong>tout de suite</strong> si "
+"vous avez le moindre doute."
+
+#: ../../mod/crepair.php:85 ../../mod/admin.php:467 ../../mod/admin.php:476
+msgid "Name"
+msgstr "Nom"
+
+#: ../../mod/crepair.php:86
+msgid "Account Nickname"
+msgstr "Pseudo du compte"
+
+#: ../../mod/crepair.php:87
+msgid "Account URL"
+msgstr "URL du compte"
+
+#: ../../mod/crepair.php:88
+msgid "Friend Request URL"
+msgstr "URL de requête"
+
+#: ../../mod/crepair.php:89
+msgid "Friend Confirm URL"
+msgstr "URL de confirmation"
+
+#: ../../mod/crepair.php:90
+msgid "Notification Endpoint URL"
+msgstr "URL de notification"
+
+#: ../../mod/crepair.php:91
+msgid "Poll/Feed URL"
+msgstr "URL de poll/feed"
+
+#: ../../mod/contacts.php:275 ../../mod/contacts.php:309
+msgid "Repair contact URL settings"
+msgstr "Réparer les URLs du contact"
+
+#: ../../mod/contacts.php:276 ../../mod/contacts.php:310
+msgid "Repair contact URL settings (WARNING: Advanced)"
+msgstr "Réparer les URLs du contact (ATTENTION: procédure avancée)"
+
+#: ../../include/notifier.php:414 ../../include/notifier.php:499
+msgid "(no subject)"
+msgstr "(aucun sujet)"
+
+#: ../../include/auth.php:208 ../../mod/openid.php:78
+#: ../../include/auth.php:214
+msgid "Welcome "
+msgstr "Bienvenue "
+
+#: ../../include/auth.php:209 ../../mod/openid.php:79
+#: ../../include/auth.php:215
+msgid "Please upload a profile photo."
+msgstr "Merci de téléverser une photo pour votre profil."
+
+#: ../../include/conversation.php:61 ../../mod/dfrn_confirm.php:430
+#: ../../include/conversation.php:79 ../../mod/dfrn_confirm.php:458
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr "%1$s est désormais relié à %2$s"
+
+#: ../../include/conversation.php:586 ../../include/conversation.php:611
+msgid "View recent"
+msgstr "Voir les nouveautés"
+
+#: ../../include/conversation.php:673 ../../mod/editpost.php:38
+#: ../../include/conversation.php:698
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visible par <strong>tout le monde</strong>"
+
+#: ../../include/conversation.php:707 ../../mod/editpost.php:75
+#: ../../include/conversation.php:732
+msgid "Post to Email"
+msgstr "Transmettre par courriel"
+
+#: ../../include/bbcode.php:83 ../../include/bbcode.php:116
+msgid "Image/photo"
+msgstr "Image/photo"
+
+#: ../../addon/facebook/facebook.php:257 ../../addon/facebook/facebook.php:321
+msgid "Updating contacts"
+msgstr "Mettre les contacts à jour"
+
+#: ../../addon/facebook/facebook.php:279 ../../addon/facebook/facebook.php:343
+msgid "Install Facebook connector for this account."
+msgstr "Activer le connecteur Facebook pour ce compte."
+
+#: ../../addon/facebook/facebook.php:286 ../../addon/facebook/facebook.php:350
+msgid "Remove Facebook connector"
+msgstr "Désactiver le connecteur Facebook"
+
+#: ../../addon/facebook/facebook.php:436 ../../addon/facebook/facebook.php:511
+msgid ""
+"Post to Facebook cancelled because of multi-network access permission "
+"conflict."
+msgstr ""
+"Envoi vers Facebook annulé à cause d'un conflit dans les permissions "
+"d'accès aux réseaux tiers."
+
+#: ../../addon/facebook/facebook.php:551 ../../addon/facebook/facebook.php:660
+msgid "View on Friendika"
+msgstr "Voir sur Friendika"
+
+#: ../../mod/network.php:151 ../../mod/network.php:190
+msgid "Contact: "
+msgstr "Contact: "
+
+#: ../../mod/network.php:153 ../../mod/network.php:192
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Les messages privés destinés à cette personne risquent des fuites."
+
+#: ../../mod/network.php:158 ../../mod/network.php:197
+msgid "Invalid contact."
+msgstr "Contact invalide."
+
+#: ../../mod/display.php:7 ../../mod/directory.php:18
+#: ../../mod/viewcontacts.php:16 ../../mod/dfrn_request.php:591
+#: ../../mod/photos.php:676 ../../mod/search.php:13 ../../mod/directory.php:20
+#: ../../mod/community.php:9 ../../mod/dfrn_request.php:589
+#: ../../mod/photos.php:733
+msgid "Public access denied."
+msgstr "Accès public refusé."
+
+#: ../../mod/settings.php:403 ../../mod/settings.php:466
+msgid "Your Identity Address is"
+msgstr "L'adresse de votre identité est"
+
+#: ../../mod/settings.php:473 ../../mod/settings.php:534
+msgid "Email/Mailbox Setup"
+msgstr "Réglages Courriel/Boîte"
+
+#: ../../mod/settings.php:474 ../../mod/settings.php:535
+msgid ""
+"If you wish to communicate with email contacts using this service "
+"(optional), please specify how to connect to your mailbox."
+msgstr ""
+"Si vous souhaitez communiquer avec vos contacts 'courriel' via ce "
+"service (facultatif), indiquez comment vous connecter à votre boîte."
+
+#: ../../mod/settings.php:475 ../../mod/settings.php:538
+msgid "IMAP server name:"
+msgstr "Serveur IMAP:"
+
+#: ../../mod/settings.php:477 ../../mod/settings.php:539
+msgid "IMAP port:"
+msgstr "Port:"
+
+#: ../../mod/settings.php:479
+msgid "Security (TLS or SSL):"
+msgstr "Sécurité (TLS ou SSL):"
+
+#: ../../mod/settings.php:481 ../../mod/settings.php:541
+msgid "Email login name:"
+msgstr "Identifiant courriel:"
+
+#: ../../mod/settings.php:483 ../../mod/settings.php:542
+msgid "Email password:"
+msgstr "Mot de passe courriel:"
+
+#: ../../mod/settings.php:484
+msgid "Reply-to address (Optional):"
+msgstr "Adresse de réponse (facultatif):"
+
+#: ../../mod/settings.php:486 ../../mod/settings.php:544
+msgid "Send public posts to all email contacts:"
+msgstr "Envoyer les entrées publiques à tous les contacts courriel:"
+
+#: ../../mod/settings.php:488 ../../mod/settings.php:537
+msgid "Email access is disabled on this site."
+msgstr "L'accès par courriel est désactivé sur ce site."
+
+#: ../../mod/item.php:555 ../../mod/item.php:786
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Vous pouvez leur rendre visite à %s"
+
+#: ../../mod/profile_photo.php:196
+msgid "skip this step"
+msgstr "ignorer cette étape"
+
+#: ../../mod/help.php:27 ../../mod/help.php:29
+msgid "Help:"
+msgstr "Aide:"
+
+#: ../../mod/dfrn_request.php:631 ../../mod/dfrn_request.php:629
+msgid ""
+"Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr ""
+"Exemples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, "
+"utilisateur@identi.ca"
+
+#: ../../mod/dfrn_request.php:637 ../../mod/dfrn_request.php:635
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"social networks:"
+msgstr ""
+"Merci d'indiquer votre 'Adresse d'identité' issue de l'un des réseaux "
+"sociaux supportés:"
+
+#: ../../mod/dfrn_request.php:642 ../../mod/dfrn_request.php:640
+msgid "Your Identity Address:"
+msgstr "Adresse de votre identité:"
+
+#: ../../mod/contacts.php:277 ../../mod/contacts.php:311
+msgid "View conversations"
+msgstr "Voir conversations"
+
+#: ../../include/conversation.php:23
+msgid "event"
+msgstr "[[event]]"
+
+#: ../../include/conversation.php:222 ../../include/conversation.php:501
+#, php-format
+msgid "%s from %s"
+msgstr "[[%s from %s]]"
+
+#: ../../include/conversation.php:427
+msgid "Select"
+msgstr "Sélectionner"
+
+#: ../../include/conversation.php:429
+msgid "toggle star status"
+msgstr "(dé)marquer d'une étoile"
+
+#: ../../include/conversation.php:534
+msgid "Delete Selected Items"
+msgstr "Supprimer les éléments selectionnés"
+
+#: ../../include/conversation.php:748 ../../mod/editpost.php:92
+msgid "Attach file"
+msgstr "Joindre un fichier"
+
+#: ../../include/conversation.php:766 ../../mod/editpost.php:109
+msgid "Public post"
+msgstr "Entrée publique"
+
+#: ../../include/text.php:752
+msgid "bytes"
+msgstr "octets"
+
+#: ../../include/text.php:835
+msgid "Select an alternate language"
+msgstr "Choisir une langue complémentaire"
+
+#: ../../include/acl_selectors.php:280
+msgid "show"
+msgstr "montrer"
+
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
+msgstr "ne pas montrer"
+
+#: ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
+
+#: ../../include/event.php:17
+msgid "Starts:"
+msgstr "Commence:"
+
+#: ../../include/event.php:27
+msgid "Finishes:"
+msgstr "Termine:"
+
+#: ../../include/diaspora.php:390
+msgid "Sharing notification from Diaspora network"
+msgstr "Partager les notifications du réseau Diaspora"
+
+#: ../../include/diaspora.php:946
+msgid "link"
+msgstr "lien"
+
+#: ../../include/poller.php:423
+msgid "From: "
+msgstr "De:"
+
+#: ../../include/datetime.php:228
+msgid "never"
+msgstr "jamais"
+
+#: ../../include/nav.php:41
+msgid "End this session"
+msgstr "Terminer cette session"
+
+#: ../../include/nav.php:44
+msgid "Sign in"
+msgstr "Se connecter"
+
+#: ../../include/nav.php:55
+msgid "Home Page"
+msgstr "Page d'accueil"
+
+#: ../../include/nav.php:59
+msgid "Create an account"
+msgstr "Créer un compte"
+
+#: ../../include/nav.php:64
+msgid "Help and documentation"
+msgstr "Aide et documentation"
+
+#: ../../include/nav.php:67
+msgid "Addon applications, utilities, games"
+msgstr "Applications supplémentaires, utilitaires, jeux"
+
+#: ../../include/nav.php:69
+msgid "Search site content"
+msgstr "Rechercher dans le contenu du site"
+
+#: ../../include/nav.php:79 ../../mod/community.php:26
+msgid "Community"
+msgstr "Place publique"
+
+#: ../../include/nav.php:79
+msgid "Conversations on this site"
+msgstr "Conversations sur ce site"
+
+#: ../../include/nav.php:81
+msgid "People directory"
+msgstr "Annuaire"
+
+#: ../../include/nav.php:91
+msgid "Conversations from your friends"
+msgstr "Conversations de vos amis"
+
+#: ../../include/nav.php:93
+msgid "Your posts and conversations"
+msgstr "Vos conversations et entrées"
+
+#: ../../include/nav.php:99
+msgid "Friend requests"
+msgstr "Demandes de connexion/amitié"
+
+#: ../../include/nav.php:102
+msgid "Private mail"
+msgstr "Courriel privé"
+
+#: ../../include/nav.php:105
+msgid "Manage other pages"
+msgstr "Gérer les autres pages"
+
+#: ../../include/nav.php:108 ../../mod/settings.php:311
+msgid "Account settings"
+msgstr "Réglages du compte"
+
+#: ../../include/nav.php:109
+msgid "Manage/edit profiles"
+msgstr "Gérer/éditer les profils"
+
+#: ../../include/nav.php:110
+msgid "Manage/edit friends and contacts"
+msgstr "Gérer/éditer les amis et contacts"
+
+#: ../../include/nav.php:117
+msgid "Admin"
+msgstr "Admin"
+
+#: ../../include/nav.php:117
+msgid "Site setup and configuration"
+msgstr "Configuration du site"
+
+#: ../../addon/piwik/piwik.php:70
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr ""
+"Ce site construit ses statistiques grâce à <a href='http://www.piwik.org'>Piwik</a>."
+
+#: ../../addon/piwik/piwik.php:73
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr ""
+"Si vous ne souhaitez pas que vos visites soient comptabilisées de cette "
+"manière, vous pouvez <a href='%s'>activer un cookie qui internet à Piwik "
+"d'en tenir compte à l'avenir</a> (mécanisme d'opt-out)."
+
+#: ../../addon/piwik/piwik.php:82
+msgid "Piwik Base URL"
+msgstr "URL de base de Piwik"
+
+#: ../../addon/piwik/piwik.php:83
+msgid "Site ID"
+msgstr "ID du site"
+
+#: ../../addon/piwik/piwik.php:84
+msgid "Show opt-out cookie link?"
+msgstr "Montrer le lien du cookie d'opt-out?"
+
+#: ../../addon/facebook/facebook.php:360
+msgid "Link all your Facebook friends and conversations"
+msgstr "Relier tous vos amis et conversations Facebook"
+
+#: ../../addon/facebook/facebook.php:365
+msgid "Warning: Your Facebook privacy settings can not be imported."
+msgstr "Attention: vos réglages de vie privée ne pourront être importés de Facebook."
+
+#: ../../addon/facebook/facebook.php:366
+msgid ""
+"Linked Facebook items <strong>may</strong> be publicly visible, depending on "
+"your privacy settings for this website/account."
+msgstr ""
+"Les éléments liés depuis Facebook <strong>pourront</strong> être visibles "
+"publiquement, selon les réglages."
+
+#: ../../addon/facebook/facebook.php:691
+msgid "Facebook post failed. Queued for retry."
+msgstr "Echec temporaire de l'envoi vers Facebook."
+
+#: ../../addon/widgets/widgets.php:53
+msgid "Generate new key"
+msgstr "Générer une nouvelle clé"
+
+#: ../../addon/widgets/widgets.php:56
+msgid "Widgets key"
+msgstr "Clé des widgets"
+
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets available"
+msgstr "Widgets disponibles"
+
+#: ../../addon/widgets/widget_friends.php:30
+msgid "Connect on Friendika!"
+msgstr "Relier par Friendika!"
+
+#: ../../addon/oembed/oembed.php:30
+msgid "OEmbed settings updated"
+msgstr "Réglages OEmbed mis à jour"
+
+#: ../../addon/oembed/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
+msgstr "Utiliser OEmbed pour les vidéos YouTube"
+
+#: ../../addon/oembed/oembed.php:71
+msgid "URL to embed:"
+msgstr "URL à incorporer:"
+
+#: ../../addon/twitter/twitter.php:115
+msgid "Twitter settings updated."
+msgstr "Réglages Twitter mis à jour."
+
+#: ../../addon/twitter/twitter.php:181
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for "
+"every posting separately in the posting options when writing the entry."
+msgstr ""
+"Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées "
+"sur le compte Twitter associé. Vous pouvez choisir de le faire par défaut (ici) ou "
+"pour chaque entrée séparément dans les options de la-dite entrée."
+
+#: ../../addon/twitter/twitter.php:183
+msgid "Allow posting to Twitter"
+msgstr "Autoriser à poster vers Twitter"
+
+#: ../../addon/twitter/twitter.php:186
+msgid "Send public postings to Twitter by default"
+msgstr "Envoyer les entrées publiques vers Twitter par défaut"
+
+#: ../../addon/twitter/twitter.php:282
+msgid "Consumer key"
+msgstr "Consumer key"
+
+#: ../../addon/twitter/twitter.php:283
+msgid "Consumer secret"
+msgstr "Consumer secret"
+
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
+msgstr "Mentions légales"
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr "Propriétaire du site"
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr "Courriel"
+
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr "Adresse postale"
+
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr ""
+"Les mentions légales ont besoin d'être paramêtrées!<br />Merci d'ajouter "
+"au moins le <tt>propriétaire</tt> à votre configuration. Pour les autres "
+"variables, merci de vous référer au README de l'extension."
+
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr "Profil du propriétaire"
+
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr "Notes"
+
+#: ../../addon/statusnet/statusnet.php:175
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr ""
+"Merci de contacter l'administrateur.<br />L'URL d'API fournie n'est pas "
+"valide."
+
+#: ../../addon/statusnet/statusnet.php:203
+msgid "We could not contact the StatusNet API with the Path you entered."
+msgstr "Impossible de contacter l'API StatusNet avec le chemin fourni."
+
+#: ../../addon/statusnet/statusnet.php:230
+msgid "StatusNet settings updated."
+msgstr "Réglages StatusNet mis à jour."
+
+#: ../../addon/statusnet/statusnet.php:267
+msgid "Globally Available StatusNet OAuthKeys"
+msgstr "Clé OAuth globales de StatusNet"
+
+#: ../../addon/statusnet/statusnet.php:268
+msgid ""
+"There are preconfigured OAuth key pairs for some StatusNet servers "
+"available. If you are useing one of them, please use these credentials. If "
+"not feel free to connect to any other StatusNet instance (see below)."
+msgstr ""
+"Voici quelques paires de clés OAuth correspondant à quelques serveurs "
+"courants. Si vous utilisez l'un d'entre eux, merci d'utiliser la paire "
+"fournie. Sinon, vous pouvez toujours vous connecter à l'instance "
+"StatusNet de votre choix (voir plus bas)."
+
+#: ../../addon/statusnet/statusnet.php:276
+msgid "Provide your own OAuth Credentials"
+msgstr "Entrez vos coordonnées OAuth manuellement"
+
+#: ../../addon/statusnet/statusnet.php:315
+msgid "Cancel Connection Process"
+msgstr "Annuler la mise en relation"
+
+#: ../../addon/statusnet/statusnet.php:317
+msgid "Current StatusNet API is"
+msgstr "L'API StatusNet actuelle est"
+
+#: ../../addon/statusnet/statusnet.php:318
+msgid "Cancel StatusNet Connection"
+msgstr "Annuler la connexion à StatusNet"
+
+#: ../../addon/statusnet/statusnet.php:330
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
+msgstr ""
+"Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées "
+"sur le compte StatusNet associé. Vous pouvez choisir de le faire par défaut (ici) ou "
+"pour chaque entrée séparément dans les options de la-dite entrée."
+
+#: ../../addon/statusnet/statusnet.php:332
+msgid "Allow posting to StatusNet"
+msgstr "Autoriser à poster vers StatusNet"
+
+#: ../../addon/statusnet/statusnet.php:335
+msgid "Send public postings to StatusNet by default"
+msgstr "Envoyer les entrées publiques vers StatusNet par défaut"
+
+#: ../../addon/statusnet/statusnet.php:459 ../../mod/admin.php:308
+msgid "Site name"
+msgstr "Nom du site"
+
+#: ../../addon/statusnet/statusnet.php:460
+msgid "API URL"
+msgstr "URL de l'API"
+
+#: ../../addon/statusnet/statusnet.php:461
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
+
+#: ../../addon/statusnet/statusnet.php:462
+msgid "Consumer Key"
+msgstr "Consumer Key"
+
+#: ../../mod/profiles.php:353
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Cacher vos amis/contacts des visiteurs de ce profil?"
+
+#: ../../mod/profiles.php:381
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Date de naissance (%s):"
+
+#: ../../mod/profiles.php:472
+msgid "visible to everybody"
+msgstr "visible par tout le monde"
+
+#: ../../mod/notes.php:49 ../../mod/events.php:115 ../../mod/events.php:120
+#: ../../mod/profile.php:120 ../../mod/photos.php:837
+msgid "Events"
+msgstr "Evènements"
+
+#: ../../mod/notes.php:50 ../../mod/notes.php:55 ../../mod/events.php:116
+#: ../../mod/profile.php:121 ../../mod/photos.php:838
+msgid "Personal Notes"
+msgstr "Notes personnelles"
+
+#: ../../mod/notes.php:74
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../../mod/register.php:53
+msgid "An invitation is required."
+msgstr "Une invitation est requise."
+
+#: ../../mod/register.php:58
+msgid "Invitation could not be verified."
+msgstr "L'invitation n'a pu être vérifiée."
+
+#: ../../mod/register.php:511
+msgid "Membership on this site is by invitation only."
+msgstr "L'inscription à ce site se fait sur invitation uniquement."
+
+#: ../../mod/register.php:512
+msgid "Your invitation ID: "
+msgstr "Votre invitation: "
+
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendika"
+msgstr "Bienvenue sur Friendika"
+
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
+msgstr "Checklist du nouvel inscrit"
+
+#: ../../mod/newmember.php:12
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
+msgstr ""
+"Nous souhaitons vous offrir quelques astuces et pointeurs pour vous aider "
+"à faire de votre passage ici un moment agréable. Cliquez sur les éléments 
+"suivants pour visiter les pages adéquates."
+
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page -  change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
+msgstr ""
+"Sur votre page <em>Réglages</em> - vous pouvez modifier votre mot de passe. "
+"Par ailleurs, notez bien l'adresse de votre identité : elle sera fort utile "
+"pour vous faire des amis."
+
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished "
+"directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr ""
+
+#: ../../mod/newmember.php:20
+msgid ""
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make "
+"friends than people who do not."
+msgstr ""
+"Téléversez (c'est-à-dire envoyez-nous) une photo de profil si vous ne "
+"l'avez déjà fait. Les études montrent que les gens qui utilisent une vraie "
+"photo d'eux sont dix fois plus susceptibles de se faire de nouveaux amis "
+"que les autres."
+
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
+msgstr ""
+"Activez le connecteur Facebook si vous avez un compte sur ce service, et nous "
+"pourrons (de manière facultative) importer tous vos amis et conversations."
+
+#: ../../mod/newmember.php:28
+msgid ""
+"Enter your email access information on your Settings page if you wish to "
+"import and interact with friends or mailing lists from your email INBOX"
+msgstr ""
+"Renseignez la page Réglages à propos de votre accès à vos courriels si "
+"vous souhaitez interagir avec des amis ou des listes de diffusion "
+"issues de votre boîte de réception"
+
+#: ../../mod/newmember.php:30
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown "
+"visitors."
+msgstr ""
+"Pensez à éditer votre profil <strong>par défaut</strong> à votre convenance. "
+"Vérifiez bien les réglages permettant de cacher vos informations aux "
+"visiteurs inconnus."
+
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr ""
+"Choisissez quelques mots-clés publiques pour votre profil par défaut. Vous "
+"pourrez ainsi décrire vos centres d'intérêt, et nous pourrons vous suggérer "
+"des amis les partageant."
+
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Connect</em> dialog."
+msgstr ""
+"Votre page Contacts est l'endroit idéal pour gérer vos relations et vous "
+"connecter à des amis issus d'autres réseaux. En général, il suffit de "
+"saisir leur adresse dans la section <em>Relier</em>."
+
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr ""
+"L'Annuaire vous permet de rechercher d'autres personnes au sein de ce "
+"réseau, ou dans l'ensemble des sites fédérés. Cherchez un lien nommé "
+"<em>Relier</em>, <em>Connect</em> ou <em>Follow</em> sur leurs profils. "
+"Vous aurez peut-être à fournir votre propre adresse d'identité."
+
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with "
+"each group privately on your Network page."
+msgstr ""
+"Une fois que vous aurez retrouvé quelques amis ou contacts, vous pourrez les "
+"classer en groupes depuis le panneau latéral de votre page Contacts. Vous "
+"serez désormais en mesure d'interagir avec chaque groupe de manière exclusive "
+"et privée depuis la page Réseau."
+
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program "
+"features and resources."
+msgstr ""
+"Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage "
+"d'informations sur les fonctionnalités et procédures du réseau."
+
+#: ../../mod/match.php:18
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Aucun mot-clé ne correspond. Merci d'ajouter quelques mots-clés à votre profil par défaut."
+
+#: ../../mod/update_community.php:18 ../../mod/update_profile.php:41
+#: ../../mod/update_network.php:22
+msgid "[Embedded content - reload page to view]"
+msgstr "[Contenu incorporé - rechargez la page]"
+
+#: ../../mod/apps.php:11
+msgid "No installed applications."
+msgstr "Pas d'application installée."
+
+#: ../../mod/network.php:27
+msgid "View Conversations"
+msgstr "Voir par conversation"
+
+#: ../../mod/network.php:29
+msgid "View New Items"
+msgstr "Voir les nouveautés"
+
+#: ../../mod/network.php:35
+msgid "View Any Items"
+msgstr "Tout voir"
+
+#: ../../mod/network.php:43
+msgid "View Starred Items"
+msgstr "Voir les favoris"
+
+#: ../../mod/network.php:94
+#, php-format
+msgid "Warning: This group contains %s member from an insecure network."
+msgid_plural ""
+"Warning: This group contains %s members from an insecure network."
+msgstr[0] "Ce groupe contient %s membre issu d'un réseau non-fiable."
+msgstr[1] "Ce groupe contient %s membres issus de réseaux non-fiables."
+
+#: ../../mod/display.php:63 ../../mod/profile.php:103
+msgid "Access to this profile has been restricted."
+msgstr "L'accès à ce profil a été restreint."
+
+#: ../../mod/admin.php:66 ../../mod/admin.php:299
+msgid "Site"
+msgstr "Site"
+
+#: ../../mod/admin.php:67 ../../mod/admin.php:463 ../../mod/admin.php:475
+msgid "Users"
+msgstr "Utilisateurs"
+
+#: ../../mod/admin.php:68 ../../mod/admin.php:552 ../../mod/admin.php:589
+msgid "Plugins"
+msgstr "Extensions"
+
+#: ../../mod/admin.php:69
+msgid "Update"
+msgstr "Mises-à-jour"
+
+#: ../../mod/admin.php:83 ../../mod/admin.php:654
+msgid "Logs"
+msgstr "Journaux"
+
+#: ../../mod/admin.php:88
+msgid "User registrations waiting for confirmation"
+msgstr "Inscriptions d'utilisateurs en attente de confirmation"
+
+#: ../../mod/admin.php:151 ../../mod/admin.php:298 ../../mod/admin.php:462
+#: ../../mod/admin.php:551 ../../mod/admin.php:588 ../../mod/admin.php:653
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../mod/admin.php:152
+msgid "Summary"
+msgstr "En résumé"
+
+#: ../../mod/admin.php:153
+msgid "Registered users"
+msgstr "Utilisateurs inscrits"
+
+#: ../../mod/admin.php:155
+msgid "Pending registrations"
+msgstr "Utilisateurs en attente d'inscription"
+
+#: ../../mod/admin.php:156
+msgid "Version"
+msgstr "Version"
+
+#: ../../mod/admin.php:158
+msgid "Active plugins"
+msgstr "Extensions actives"
+
+#: ../../mod/admin.php:247
+msgid "Site settings updated."
+msgstr "Réglages du site appliqués."
+
+#: ../../mod/admin.php:291
+msgid "Closed"
+msgstr "Fermé"
+
+#: ../../mod/admin.php:292
+msgid "Requires approval"
+msgstr "Après autorisation"
+
+#: ../../mod/admin.php:293
+msgid "Open"
+msgstr "Ouvert"
+
+#: ../../mod/admin.php:302
+msgid "File upload"
+msgstr "Envoi de fichiers"
+
+#: ../../mod/admin.php:303
+msgid "Policies"
+msgstr "Politiques"
+
+#: ../../mod/admin.php:304
+msgid "Advanced"
+msgstr "Avancé"
+
+#: ../../mod/admin.php:309
+msgid "Banner/Logo"
+msgstr "Titre/Logo"
+
+#: ../../mod/admin.php:310
+msgid "System language"
+msgstr "Langue du système"
+
+#: ../../mod/admin.php:311
+msgid "System theme"
+msgstr "Thème du système"
+
+#: ../../mod/admin.php:313
+msgid "Maximum image size"
+msgstr "Taille maximum des images"
+
+#: ../../mod/admin.php:315
+msgid "Register policy"
+msgstr "Politique d'inscription"
+
+#: ../../mod/admin.php:316
+msgid "Register text"
+msgstr "Texte à l'inscription"
+
+#: ../../mod/admin.php:317
+msgid "Allowed friend domains"
+msgstr "Domaines autorisés pour la mise en relation"
+
+#: ../../mod/admin.php:318
+msgid "Allowed email domains"
+msgstr "Domaines autorisés pour les courriels"
+
+#: ../../mod/admin.php:319
+msgid "Block public"
+msgstr "Bloquer public"
+
+#: ../../mod/admin.php:320
+msgid "Force publish"
+msgstr "Forcer la publication"
+
+#: ../../mod/admin.php:321
+msgid "Global directory update URL"
+msgstr "URL de mise à jour de l'annuaire global"
+
+#: ../../mod/admin.php:323
+msgid "Block multiple registrations"
+msgstr "Interdire les inscriptions multiples"
+
+#: ../../mod/admin.php:324
+msgid "OpenID support"
+msgstr "Support d'OpenID"
+
+#: ../../mod/admin.php:325
+msgid "Gravatar support"
+msgstr "Support de Gravatar"
+
+#: ../../mod/admin.php:326
+msgid "Fullname check"
+msgstr "Imposer 'Prénom Nom'"
+
+#: ../../mod/admin.php:327
+msgid "UTF-8 Regular expressions"
+msgstr "Expressions rationnelles en UTF-8"
+
+#: ../../mod/admin.php:328
+msgid "Show Community Page"
+msgstr "Montrer la Place publique"
+
+#: ../../mod/admin.php:329
+msgid "Enable OStatus support"
+msgstr "Activer OStatus"
+
+#: ../../mod/admin.php:330
+msgid "Enable Diaspora support"
+msgstr "Activer Diaspora"
+
+#: ../../mod/admin.php:331
+msgid "Only allow Friendika contacts"
+msgstr "N'autoriser que les contacts Friendika"
+
+#: ../../mod/admin.php:332
+msgid "Verify SSL"
+msgstr "Vérifier SSL"
+
+#: ../../mod/admin.php:333
+msgid "Proxy user"
+msgstr "Utilisateur du proxy"
+
+#: ../../mod/admin.php:334
+msgid "Proxy URL"
+msgstr "URL du proxy"
+
+#: ../../mod/admin.php:335
+msgid "Network timeout"
+msgstr "Délai d'attente du réseau"
+
+#: ../../mod/admin.php:356
+#, php-format
+msgid "%s user blocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s utilisateur bloqué"
+msgstr[1] "%s utilisateurs bloqués/débloqués"
+
+#: ../../mod/admin.php:363
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s utilisateur supprimé"
+msgstr[1] "%s utilisateurs supprimés"
+
+#: ../../mod/admin.php:397
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Utilisateur '%s' supprimé"
+
+#: ../../mod/admin.php:404
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Utilisateur '%s' débloqué"
+
+#: ../../mod/admin.php:404
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Utilisateur '%s' bloqué"
+
+#: ../../mod/admin.php:465
+msgid "select all"
+msgstr "tout sélectionner"
+
+#: ../../mod/admin.php:467
+msgid "Request date"
+msgstr "Date de la demande"
+
+#: ../../mod/admin.php:467 ../../mod/admin.php:476
+msgid "Email"
+msgstr "Courriel"
+
+#: ../../mod/admin.php:472
+msgid "Block"
+msgstr "Bloquer"
+
+#: ../../mod/admin.php:473
+msgid "Unblock"
+msgstr "Débloquer"
+
+#: ../../mod/admin.php:476
+msgid "Register date"
+msgstr "Date d'inscription"
+
+#: ../../mod/admin.php:476
+msgid "Last login"
+msgstr "Dernière connexion"
+
+#: ../../mod/admin.php:476
+msgid "Last item"
+msgstr "Dernière entrée"
+
+#: ../../mod/admin.php:476
+msgid "Account"
+msgstr "Compte"
+
+#: ../../mod/admin.php:478
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
+"Les utilisateurs selectionnés seront supprimés!\\n\\nTout ce qu'ils ont "
+"posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?"
+
+#: ../../mod/admin.php:479
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
+"L'utilisateur {0} sera supprimé!\\n\\nTout ce qu'il a posté sur ce site "
+"sera définitivement perdu!\\n\\nÊtes-vous certain?"
+
+#: ../../mod/admin.php:515
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Extension %s désactivée."
+
+#: ../../mod/admin.php:519
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Extension %s activée."
+
+#: ../../mod/admin.php:529
+msgid "Disable"
+msgstr "Désactiver"
+
+#: ../../mod/admin.php:531
+msgid "Enable"
+msgstr "Activer"
+
+#: ../../mod/admin.php:553
+msgid "Toggle"
+msgstr "Activer/Désactiver"
+
+#: ../../mod/admin.php:616
+msgid "Log settings updated."
+msgstr "Réglages des journaux mis-à-jour."
+
+#: ../../mod/admin.php:656
+msgid "Clear"
+msgstr "Remettre à zéro"
+
+#: ../../mod/admin.php:662
+msgid "Debugging"
+msgstr "Débogage"
+
+#: ../../mod/admin.php:663
+msgid "Log file"
+msgstr "Fichier de journal"
+
+#: ../../mod/admin.php:663
+msgid "Must be writable by web server. Relative to your Friendika index.php."
+msgstr "Doit pouvoir être modifié par le serveur web. Chemin relatif à l'index.php de Friendika."
+
+#: ../../mod/admin.php:664
+msgid "Log level"
+msgstr "Niveau de journalisation"
+
+#: ../../mod/admin.php:705
+msgid "Close"
+msgstr "Fermer"
+
+#: ../../mod/admin.php:711
+msgid "FTP Host"
+msgstr "Hôte FTP"
+
+#: ../../mod/admin.php:712
+msgid "FTP Path"
+msgstr "Chemin FTP"
+
+#: ../../mod/admin.php:713
+msgid "FTP User"
+msgstr "Utilisateur FTP"
+
+#: ../../mod/admin.php:714
+msgid "FTP Password"
+msgstr "Mot de passe FTP"
+
+#: ../../mod/install.php:126
+msgid ""
+"In order to install Friendika we need to know how to connect to your "
+"database."
+msgstr ""
+"Pour installer Friendika, nous avons besoin des coordonnées de votre "
+"base de données."
+
+#: ../../mod/install.php:128
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr ""
+"La base spécifiée ci-dessous doit exister. Si ce n'est le cas, créez-la avant "
+"de continuer."
+
+#: ../../mod/install.php:134
+msgid ""
+"Site administrator email address. Your account email address must match this "
+"in order to use the web admin panel."
+msgstr ""
+"Courriel de l'administrateur du site. L'adresse de courriel de votre compte doit "
+"correspondre pour pouvoir utiliser la page d'Administration."
+
+#: ../../mod/install.php:204
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur: le module mb_string de PHP est manquant."
+
+#: ../../mod/settings.php:9 ../../mod/photos.php:57
+msgid "everybody"
+msgstr "tout le monde"
+
+#: ../../mod/settings.php:161
+msgid "Failed to connect with email account using the settings provided."
+msgstr "Impossible de se connecter aux courriels avec les réglages fournis."
+
+#: ../../mod/settings.php:312
+msgid "Plugin settings"
+msgstr "Réglages des extensions"
+
+#: ../../mod/settings.php:405
+msgid "OpenID:"
+msgstr "OpenID:"
+
+#: ../../mod/settings.php:405
+msgid "(Optional) Allow this OpenID to login to this account."
+msgstr "(Facultatif) Autoriser cet OpenID à accéder à ce compte."
+
+#: ../../mod/settings.php:415
+msgid "Publish your default profile in your local site directory?"
+msgstr "Publier votre profil par défaut dans l'annuaire local?"
+
+#: ../../mod/settings.php:421
+msgid "Publish your default profile in the global social directory?"
+msgstr "Publier votre profil par défaut dans l'annuaire global?"
+
+#: ../../mod/settings.php:429
+msgid "Hide your contact/friend list from viewers of your default profile?"
+msgstr "Masquer vos contacts/amis aux visiteurs de votre profil par défaut?"
+
+#: ../../mod/settings.php:433
+msgid "Hide profile details and all your messages from unknown viewers?"
+msgstr "Masquer vos informations et messages à tous les visiteurs inconnus?"
+
+#: ../../mod/settings.php:515
+msgid "Automatically expire posts after days:"
+msgstr "Expiration automatique des entrées de plus de <em>n</em> jours:"
+
+#: ../../mod/settings.php:515
+msgid "If empty, posts will not expire. Expired posts will be deleted"
+msgstr "Si le champ est vide, les entrées n'expireront pas. L'expiration équivaut à une suppression"
+
+#: ../../mod/settings.php:536
+msgid "Last successful email check:"
+msgstr "Dernière vérification des courriels:"
+
+#: ../../mod/settings.php:540
+msgid "Security:"
+msgstr "Sécurité"
+
+#: ../../mod/settings.php:540
+msgid "None"
+msgstr "Aucune"
+
+#: ../../mod/settings.php:543
+msgid "Reply-to address:"
+msgstr "Adresse de réponse:"
+
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
+msgstr "Pas de compte valide trouvé."
+
+#: ../../mod/events.php:210
+msgid "Create New Event"
+msgstr "Créer un évènement"
+
+#: ../../mod/events.php:213
+msgid "Previous"
+msgstr "Précédent"
+
+#: ../../mod/events.php:216
+msgid "Next"
+msgstr "Suivant"
+
+#: ../../mod/events.php:223
+msgid "l, F j"
+msgstr "l, F j"
+
+#: ../../mod/events.php:235
+msgid "Edit event"
+msgstr "Modifier l'évènement"
+
+#: ../../mod/events.php:305
+msgid "hour:minute"
+msgstr "heure:minute"
+
+#: ../../mod/events.php:314
+msgid "Event details"
+msgstr "Détails de l'évènement"
+
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
+msgstr "Le format est %s %s. La date de début et la description sont obligatoires."
+
+#: ../../mod/events.php:316
+msgid "Event Starts:"
+msgstr "Date/heure de début:"
+
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
+msgstr "La date/heure de fin est inconnue ou sans objet"
+
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
+msgstr "Date/heure de fin:"
+
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
+msgstr "Ajuster au fuseau horaire du visiteur"
+
+#: ../../mod/events.php:326
+msgid "Description:"
+msgstr "Description:"
+
+#: ../../mod/events.php:330
+msgid "Share this event"
+msgstr "Partager cet évènement"
+
+#: ../../mod/item.php:667 ../../mod/item.php:733 ../../mod/dfrn_notify.php:684
+msgid "Administrator@"
+msgstr "Administrator@"
+
+#: ../../mod/item.php:736
+#, php-format
+msgid "%s posted to your profile wall at %s"
+msgstr "%s a écrit sur votre profil (%s)"
+
+#: ../../mod/directory.php:46
+msgid "Normal site view"
+msgstr "Vue normale"
+
+#: ../../mod/directory.php:48
+msgid "View all site entries"
+msgstr "Vue de toutes les entrées"
+
+#: ../../mod/viewcontacts.php:61 ../../mod/contacts.php:306
+#: ../../mod/contacts.php:423
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visiter le profile de %s [%s]"
+
+#: ../../mod/community.php:14
+msgid "Not available."
+msgstr "Indisponible."
+
+#: ../../mod/wall_attach.php:57
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Le fichier dépasse la limite de %d"
+
+#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
+msgid "File upload failed."
+msgstr "Echec du téléversement."
+
+#: ../../mod/profile.php:134
+msgid "Tips for New Members"
+msgstr "Astuces pour les nouveaux inscrits"
+
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
+msgstr "Vous ne disposez pas d'invitations"
+
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Vous devrez fournir ce code d'invitation: $invite_code"
+
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Suggestion d'amitié envoyée."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Suggérer de amis/contacts"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Suggérer un ami/contact pour %s"
+
+#: ../../mod/dfrn_request.php:631
+#, php-format
+msgid "Does %s know you?"
+msgstr "Est-ce que %s vous connaît?"
+
+#: ../../mod/follow.php:39
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr ""
+"Ce site n'est pas configuré pour permettre les communication avec "
+"d'autres réseaux."
+
+#: ../../mod/follow.php:40 ../../mod/follow.php:50
+msgid "No compatible communication protocols or feeds were discovered."
+msgstr "Aucun protocole ou flux compatible n'a pu être découvert."
+
+#: ../../mod/follow.php:52
+msgid "An author or name was not found."
+msgstr "Impossible de trouver le nom ou l'auteur."
+
+#: ../../mod/follow.php:54
+msgid "No browser URL could be matched to this address."
+msgstr "Aucune URL ne correspond à cette adresse."
+
+#: ../../mod/follow.php:61
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr ""
+"L'adresse de profil spécifiée appartient à un réseau dont l'usage a été "
+"désactivé sur ce site."
+
+#: ../../mod/attach.php:8
+msgid "Item not available."
+msgstr "Entrée inaccessible."
+
+#: ../../mod/attach.php:20
+msgid "Item was not found."
+msgstr "Entrée introuvable."
+
+#: ../../mod/photos.php:616
+msgid "Image file is empty."
+msgstr "L'image est vide."
+
+#: ../../mod/photos.php:820
+msgid "Access to this item is restricted."
+msgstr "L'accès à cette entrée est restreint."
+
+#: ../../mod/notifications.php:106
+msgid "Friend Suggestion"
+msgstr "Suggestion d'amitié/contact"
+
+#: ../../mod/notifications.php:108
+#, php-format
+msgid "suggested by %s"
+msgstr "suggéré(e) par %s"
+
+#: ../../mod/notifications.php:143
+msgid "Sharer"
+msgstr "Source du partage"
+
+#: ../../mod/contacts.php:32
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitation disponible"
+msgstr[1] "%d invitations disponibles"
+
+#: ../../mod/contacts.php:293
+msgid "Suggest friends"
+msgstr "Suggérer des amis/contacts"
index f2f27b0f4b2e649692781a0df6ebd034c702bbe2..cbed6eec465617d403ac41e23032c76f42c2eb32 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 function string_plural_select($n){
-       return ;
+       return ($n != 1);
 }
 ;
 $a->strings["Logged out."] = "Déconnecté.";
@@ -367,7 +367,7 @@ $a->strings["Global Directory"] = "Annuaire global";
 $a->strings["Finding: "] = "Trouvé: ";
 $a->strings["View Contacts"] = "Voir les contacts";
 $a->strings["No contacts."] = "Aucun contact.";
-$a->strings["Visit \$username's profile"] = "Visiter le profil de %s";
+$a->strings["Visit \$username's profile"] = "Visiter le profil de \$username";
 $a->strings["No profile"] = "Aucun profil";
 $a->strings["Tag removed"] = "Étiquette enlevée";
 $a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément";
@@ -394,7 +394,7 @@ $a->strings["(Toggle between different identities or community/group pages which
 $a->strings["Select an identity to manage: "] = "Choisir une identité à gérer: ";
 $a->strings["noreply"] = "noreply";
 $a->strings["New mail received at "] = "Nouvel email reçu à ";
-$a->strings["%s commented on an item at %s"] = "%s a commanté sur une publication : %s";
+$a->strings["%s commented on an item at %s"] = "%s a commenté sur une publication : %s";
 $a->strings["%s welcomes %s"] = "%s accueille %s";
 $a->strings["This introduction has already been accepted."] = "Cette introduction a déjà été acceptée.";
 $a->strings["Profile location is not valid or does not contain profile information."] = "L'emplacement du profil est invalide ou ne contient pas de profil valide.";
@@ -676,7 +676,7 @@ $a->strings["%d member"] = array(
        1 => "%d membres",
 );
 $a->strings["Warning: This group contains %s from an insecure network."] = "Attention : ce groupe contient %s, qui se connecte depuis un réseau non-sécurisé.";
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Les messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
+$a->strings["Private messages to this group are at risk of public disclosure."] = "es messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
 $a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
 $a->strings["Friendika Social Network"] = "Réseau social Friendika";
 $a->strings["Installation"] = "Installation";
@@ -689,9 +689,9 @@ $a->strings["Database Login Password"] = "Mot de passe de la base";
 $a->strings["Database Name"] = "Nom de la base";
 $a->strings["Please select a default timezone for your website"] = "Sélectionner un fuseau horaire par défaut pour votre site";
 $a->strings["Normal Account"] = "Compte normal";
-$a->strings["This account is a normal personal profile"] = "Ce compte correspond à un profil normal, pour une seule personne (physique, généralement)";
+$a->strings["This account is a normal personal profile"] = "e compte correspond à un profil normal, pour une seule personne (physique, généralement)";
 $a->strings["Soapbox Account"] = "Compte \"boîte à savon\"";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
+$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "ccepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
 $a->strings["Community/Celebrity Account"] = "Compte de communauté/célébrité";
 $a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'";
 $a->strings["Automatic Friend Account"] = "Compte auto-amical";
@@ -770,3 +770,319 @@ $a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
 $a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
 $a->strings["Visible To"] = "Visible par";
 $a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)";
+$a->strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
+$a->strings["Contact settings applied."] = "Réglages du contact appliqués.";
+$a->strings["Contact update failed."] = "Echec lors de la mise à jour du contact.";
+$a->strings["Repair Contact Settings"] = "Réparer les réglages du contact";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = "<strong>ATTENTION: Ceci est à réserver aux utilisateurs avancés</strong> et pourrait bloquer vos communications avec ce contact en cas d'erreur.";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Merci d'utiliser le bouton 'Précédent' <strong>tout de suite</strong> si vous avez le moindre doute.";
+$a->strings["Name"] = "Nom";
+$a->strings["Account Nickname"] = "Pseudo du compte";
+$a->strings["Account URL"] = "URL du compte";
+$a->strings["Friend Request URL"] = "URL de requête";
+$a->strings["Friend Confirm URL"] = "URL de confirmation";
+$a->strings["Notification Endpoint URL"] = "URL de notification";
+$a->strings["Poll/Feed URL"] = "URL de poll/feed";
+$a->strings["Repair contact URL settings"] = "Réparer les URLs du contact";
+$a->strings["Repair contact URL settings (WARNING: Advanced)"] = "Réparer les URLs du contact (ATTENTION: procédure avancée)";
+$a->strings["(no subject)"] = "(aucun sujet)";
+$a->strings["Welcome "] = "Bienvenue ";
+$a->strings["Please upload a profile photo."] = "Merci de téléverser une photo pour votre profil.";
+$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s est désormais relié à %2\$s";
+$a->strings["View recent"] = "Voir les nouveautés";
+$a->strings["Visible to <strong>everybody</strong>"] = "Visible par <strong>tout le monde</strong>";
+$a->strings["Post to Email"] = "Transmettre par courriel";
+$a->strings["Image/photo"] = "Image/photo";
+$a->strings["Updating contacts"] = "Mettre les contacts à jour";
+$a->strings["Install Facebook connector for this account."] = "Activer le connecteur Facebook pour ce compte.";
+$a->strings["Remove Facebook connector"] = "Désactiver le connecteur Facebook";
+$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Envoi vers Facebook annulé à cause d'un conflit dans les permissions d'accès aux réseaux tiers.";
+$a->strings["View on Friendika"] = "Voir sur Friendika";
+$a->strings["Contact: "] = "Contact: ";
+$a->strings["Private messages to this person are at risk of public disclosure."] = "Les messages privés destinés à cette personne risquent des fuites.";
+$a->strings["Invalid contact."] = "Contact invalide.";
+$a->strings["Public access denied."] = "Accès public refusé.";
+$a->strings["Your Identity Address is"] = "L'adresse de votre identité est";
+$a->strings["Email/Mailbox Setup"] = "Réglages Courriel/Boîte";
+$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Si vous souhaitez communiquer avec vos contacts 'courriel' via ce service (facultatif), indiquez comment vous connecter à votre boîte.";
+$a->strings["IMAP server name:"] = "Serveur IMAP:";
+$a->strings["IMAP port:"] = "Port:";
+$a->strings["Security (TLS or SSL):"] = "Sécurité (TLS ou SSL):";
+$a->strings["Email login name:"] = "Identifiant courriel:";
+$a->strings["Email password:"] = "Mot de passe courriel:";
+$a->strings["Reply-to address (Optional):"] = "Adresse de réponse (facultatif):";
+$a->strings["Send public posts to all email contacts:"] = "Envoyer les entrées publiques à tous les contacts courriel:";
+$a->strings["Email access is disabled on this site."] = "L'accès par courriel est désactivé sur ce site.";
+$a->strings["You may visit them online at %s"] = "Vous pouvez leur rendre visite à %s";
+$a->strings["skip this step"] = "ignorer cette étape";
+$a->strings["Help:"] = "Aide:";
+$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "Exemples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, utilisateur@identi.ca";
+$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Merci d'indiquer votre 'Adresse d'identité' issue de l'un des réseaux sociaux supportés:";
+$a->strings["Your Identity Address:"] = "Adresse de votre identité:";
+$a->strings["View conversations"] = "Voir conversations";
+$a->strings["event"] = "[[event]]";
+$a->strings["%s from %s"] = "[[%s from %s]]";
+$a->strings["Select"] = "Sélectionner";
+$a->strings["toggle star status"] = "(dé)marquer d'une étoile";
+$a->strings["Delete Selected Items"] = "Supprimer les éléments selectionnés";
+$a->strings["Attach file"] = "Joindre un fichier";
+$a->strings["Public post"] = "Entrée publique";
+$a->strings["bytes"] = "octets";
+$a->strings["Select an alternate language"] = "Choisir une langue complémentaire";
+$a->strings["show"] = "montrer";
+$a->strings["don't show"] = "ne pas montrer";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Starts:"] = "Commence:";
+$a->strings["Finishes:"] = "Termine:";
+$a->strings["Sharing notification from Diaspora network"] = "Partager les notifications du réseau Diaspora";
+$a->strings["link"] = "lien";
+$a->strings["From: "] = "De:";
+$a->strings["never"] = "jamais";
+$a->strings["End this session"] = "Terminer cette session";
+$a->strings["Sign in"] = "Se connecter";
+$a->strings["Home Page"] = "Page d'accueil";
+$a->strings["Create an account"] = "Créer un compte";
+$a->strings["Help and documentation"] = "Aide et documentation";
+$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, utilitaires, jeux";
+$a->strings["Search site content"] = "Rechercher dans le contenu du site";
+$a->strings["Community"] = "Place publique";
+$a->strings["Conversations on this site"] = "Conversations sur ce site";
+$a->strings["People directory"] = "Annuaire";
+$a->strings["Conversations from your friends"] = "Conversations de vos amis";
+$a->strings["Your posts and conversations"] = "Vos conversations et entrées";
+$a->strings["Friend requests"] = "Demandes de connexion/amitié";
+$a->strings["Private mail"] = "Courriel privé";
+$a->strings["Manage other pages"] = "Gérer les autres pages";
+$a->strings["Account settings"] = "Réglages du compte";
+$a->strings["Manage/edit profiles"] = "Gérer/éditer les profils";
+$a->strings["Manage/edit friends and contacts"] = "Gérer/éditer les amis et contacts";
+$a->strings["Admin"] = "Admin";
+$a->strings["Site setup and configuration"] = "Configuration du site";
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site construit ses statistiques grâce à <a href='http://www.piwik.org'>Piwik</a>.";
+$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient comptabilisées de cette manière, vous pouvez <a href='%s'>activer un cookie qui internet à Piwik d'en tenir compte à l'avenir</a> (mécanisme d'opt-out).";
+$a->strings["Piwik Base URL"] = "URL de base de Piwik";
+$a->strings["Site ID"] = "ID du site";
+$a->strings["Show opt-out cookie link?"] = "Montrer le lien du cookie d'opt-out?";
+$a->strings["Link all your Facebook friends and conversations"] = "Relier tous vos amis et conversations Facebook";
+$a->strings["Warning: Your Facebook privacy settings can not be imported."] = "Attention: vos réglages de vie privée ne pourront être importés de Facebook.";
+$a->strings["Linked Facebook items <strong>may</strong> be publicly visible, depending on your privacy settings for this website/account."] = "Les éléments liés depuis Facebook <strong>pourront</strong> être visibles publiquement, selon les réglages.";
+$a->strings["Facebook post failed. Queued for retry."] = "Echec temporaire de l'envoi vers Facebook.";
+$a->strings["Generate new key"] = "Générer une nouvelle clé";
+$a->strings["Widgets key"] = "Clé des widgets";
+$a->strings["Widgets available"] = "Widgets disponibles";
+$a->strings["Connect on Friendika!"] = "Relier par Friendika!";
+$a->strings["OEmbed settings updated"] = "Réglages OEmbed mis à jour";
+$a->strings["Use OEmbed for YouTube videos"] = "Utiliser OEmbed pour les vidéos YouTube";
+$a->strings["URL to embed:"] = "URL à incorporer:";
+$a->strings["Twitter settings updated."] = "Réglages Twitter mis à jour.";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées sur le compte Twitter associé. Vous pouvez choisir de le faire par défaut (ici) ou pour chaque entrée séparément dans les options de la-dite entrée.";
+$a->strings["Allow posting to Twitter"] = "Autoriser à poster vers Twitter";
+$a->strings["Send public postings to Twitter by default"] = "Envoyer les entrées publiques vers Twitter par défaut";
+$a->strings["Consumer key"] = "Consumer key";
+$a->strings["Consumer secret"] = "Consumer secret";
+$a->strings["Impressum"] = "Mentions légales";
+$a->strings["Site Owner"] = "Propriétaire du site";
+$a->strings["Email Address"] = "Courriel";
+$a->strings["Postal Address"] = "Adresse postale";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Les mentions légales ont besoin d'être paramêtrées!<br />Merci d'ajouter au moins le <tt>propriétaire</tt> à votre configuration. Pour les autres variables, merci de vous référer au README de l'extension.";
+$a->strings["Site Owners Profile"] = "Profil du propriétaire";
+$a->strings["Notes"] = "Notes";
+$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Merci de contacter l'administrateur.<br />L'URL d'API fournie n'est pas valide.";
+$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Impossible de contacter l'API StatusNet avec le chemin fourni.";
+$a->strings["StatusNet settings updated."] = "Réglages StatusNet mis à jour.";
+$a->strings["Globally Available StatusNet OAuthKeys"] = "Clé OAuth globales de StatusNet";
+$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Voici quelques paires de clés OAuth correspondant à quelques serveurs courants. Si vous utilisez l'un d'entre eux, merci d'utiliser la paire fournie. Sinon, vous pouvez toujours vous connecter à l'instance StatusNet de votre choix (voir plus bas).";
+$a->strings["Provide your own OAuth Credentials"] = "Entrez vos coordonnées OAuth manuellement";
+$a->strings["Cancel Connection Process"] = "Annuler la mise en relation";
+$a->strings["Current StatusNet API is"] = "L'API StatusNet actuelle est";
+$a->strings["Cancel StatusNet Connection"] = "Annuler la connexion à StatusNet";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées sur le compte StatusNet associé. Vous pouvez choisir de le faire par défaut (ici) ou pour chaque entrée séparément dans les options de la-dite entrée.";
+$a->strings["Allow posting to StatusNet"] = "Autoriser à poster vers StatusNet";
+$a->strings["Send public postings to StatusNet by default"] = "Envoyer les entrées publiques vers StatusNet par défaut";
+$a->strings["Site name"] = "Nom du site";
+$a->strings["API URL"] = "URL de l'API";
+$a->strings["Consumer Secret"] = "Consumer Secret";
+$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher vos amis/contacts des visiteurs de ce profil?";
+$a->strings["Birthday (%s):"] = "Date de naissance (%s):";
+$a->strings["visible to everybody"] = "visible par tout le monde";
+$a->strings["Events"] = "Evènements";
+$a->strings["Personal Notes"] = "Notes personnelles";
+$a->strings["Save"] = "Enregistrer";
+$a->strings["An invitation is required."] = "Une invitation est requise.";
+$a->strings["Invitation could not be verified."] = "L'invitation n'a pu être vérifiée.";
+$a->strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait sur invitation uniquement.";
+$a->strings["Your invitation ID: "] = "Votre invitation: ";
+$a->strings["Welcome to Friendika"] = "Bienvenue sur Friendika";
+$a->strings["New Member Checklist"] = "Checklist du nouvel inscrit";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Nous souhaitons vous offrir quelques astuces et pointeurs pour vous aider à faire de votre passage ici un moment agréable. Cliquez sur les éléments suivants pour visiter les pages adéquates.";
+$a->strings["On your <em>Settings</em> page -  change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Sur votre page <em>Réglages</em> - vous pouvez modifier votre mot de passe. Par ailleurs, notez bien l'adresse de votre identité : elle sera fort utile pour vous faire des amis.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Téléversez (c'est-à-dire envoyez-nous) une photo de profil si vous ne l'avez déjà fait. Les études montrent que les gens qui utilisent une vraie photo d'eux sont dix fois plus susceptibles de se faire de nouveaux amis que les autres.";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Activez le connecteur Facebook si vous avez un compte sur ce service, et nous pourrons (de manière facultative) importer tous vos amis et conversations.";
+$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Renseignez la page Réglages à propos de votre accès à vos courriels si vous souhaitez interagir avec des amis ou des listes de diffusion issues de votre boîte de réception";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Pensez à éditer votre profil <strong>par défaut</strong> à votre convenance. Vérifiez bien les réglages permettant de cacher vos informations aux visiteurs inconnus.";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Choisissez quelques mots-clés publiques pour votre profil par défaut. Vous pourrez ainsi décrire vos centres d'intérêt, et nous pourrons vous suggérer des amis les partageant.";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "Votre page Contacts est l'endroit idéal pour gérer vos relations et vous connecter à des amis issus d'autres réseaux. En général, il suffit de saisir leur adresse dans la section <em>Relier</em>.";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "L'Annuaire vous permet de rechercher d'autres personnes au sein de ce réseau, ou dans l'ensemble des sites fédérés. Cherchez un lien nommé <em>Relier</em>, <em>Connect</em> ou <em>Follow</em> sur leurs profils. Vous aurez peut-être à fournir votre propre adresse d'identité.";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Une fois que vous aurez retrouvé quelques amis ou contacts, vous pourrez les classer en groupes depuis le panneau latéral de votre page Contacts. Vous serez désormais en mesure d'interagir avec chaque groupe de manière exclusive et privée depuis la page Réseau.";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage d'informations sur les fonctionnalités et procédures du réseau.";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clé ne correspond. Merci d'ajouter quelques mots-clés à votre profil par défaut.";
+$a->strings["[Embedded content - reload page to view]"] = "[Contenu incorporé - rechargez la page]";
+$a->strings["No installed applications."] = "Pas d'application installée.";
+$a->strings["View Conversations"] = "Voir par conversation";
+$a->strings["View New Items"] = "Voir les nouveautés";
+$a->strings["View Any Items"] = "Tout voir";
+$a->strings["View Starred Items"] = "Voir les favoris";
+$a->strings["Warning: This group contains %s member from an insecure network."] = array(
+       0 => "Ce groupe contient %s membre issu d'un réseau non-fiable.",
+       1 => "Ce groupe contient %s membres issus de réseaux non-fiables.",
+);
+$a->strings["Access to this profile has been restricted."] = "L'accès à ce profil a été restreint.";
+$a->strings["Site"] = "Site";
+$a->strings["Users"] = "Utilisateurs";
+$a->strings["Plugins"] = "Extensions";
+$a->strings["Update"] = "Mises-à-jour";
+$a->strings["Logs"] = "Journaux";
+$a->strings["User registrations waiting for confirmation"] = "Inscriptions d'utilisateurs en attente de confirmation";
+$a->strings["Administration"] = "Administration";
+$a->strings["Summary"] = "En résumé";
+$a->strings["Registered users"] = "Utilisateurs inscrits";
+$a->strings["Pending registrations"] = "Utilisateurs en attente d'inscription";
+$a->strings["Version"] = "Version";
+$a->strings["Active plugins"] = "Extensions actives";
+$a->strings["Site settings updated."] = "Réglages du site appliqués.";
+$a->strings["Closed"] = "Fermé";
+$a->strings["Requires approval"] = "Après autorisation";
+$a->strings["Open"] = "Ouvert";
+$a->strings["File upload"] = "Envoi de fichiers";
+$a->strings["Policies"] = "Politiques";
+$a->strings["Advanced"] = "Avancé";
+$a->strings["Banner/Logo"] = "Titre/Logo";
+$a->strings["System language"] = "Langue du système";
+$a->strings["System theme"] = "Thème du système";
+$a->strings["Maximum image size"] = "Taille maximum des images";
+$a->strings["Register policy"] = "Politique d'inscription";
+$a->strings["Register text"] = "Texte à l'inscription";
+$a->strings["Allowed friend domains"] = "Domaines autorisés pour la mise en relation";
+$a->strings["Allowed email domains"] = "Domaines autorisés pour les courriels";
+$a->strings["Block public"] = "Bloquer public";
+$a->strings["Force publish"] = "Forcer la publication";
+$a->strings["Global directory update URL"] = "URL de mise à jour de l'annuaire global";
+$a->strings["Block multiple registrations"] = "Interdire les inscriptions multiples";
+$a->strings["OpenID support"] = "Support d'OpenID";
+$a->strings["Gravatar support"] = "Support de Gravatar";
+$a->strings["Fullname check"] = "Imposer 'Prénom Nom'";
+$a->strings["UTF-8 Regular expressions"] = "Expressions rationnelles en UTF-8";
+$a->strings["Show Community Page"] = "Montrer la Place publique";
+$a->strings["Enable OStatus support"] = "Activer OStatus";
+$a->strings["Enable Diaspora support"] = "Activer Diaspora";
+$a->strings["Only allow Friendika contacts"] = "N'autoriser que les contacts Friendika";
+$a->strings["Verify SSL"] = "Vérifier SSL";
+$a->strings["Proxy user"] = "Utilisateur du proxy";
+$a->strings["Proxy URL"] = "URL du proxy";
+$a->strings["Network timeout"] = "Délai d'attente du réseau";
+$a->strings["%s user blocked"] = array(
+       0 => "%s utilisateur bloqué",
+       1 => "%s utilisateurs bloqués/débloqués",
+);
+$a->strings["%s user deleted"] = array(
+       0 => "%s utilisateur supprimé",
+       1 => "%s utilisateurs supprimés",
+);
+$a->strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
+$a->strings["User '%s' unblocked"] = "Utilisateur '%s' débloqué";
+$a->strings["User '%s' blocked"] = "Utilisateur '%s' bloqué";
+$a->strings["select all"] = "tout sélectionner";
+$a->strings["Request date"] = "Date de la demande";
+$a->strings["Email"] = "Courriel";
+$a->strings["Block"] = "Bloquer";
+$a->strings["Unblock"] = "Débloquer";
+$a->strings["Register date"] = "Date d'inscription";
+$a->strings["Last login"] = "Dernière connexion";
+$a->strings["Last item"] = "Dernière entrée";
+$a->strings["Account"] = "Compte";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les utilisateurs selectionnés seront supprimés!\\n\\nTout ce qu'ils ont posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utilisateur {0} sera supprimé!\\n\\nTout ce qu'il a posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
+$a->strings["Plugin %s disabled."] = "Extension %s désactivée.";
+$a->strings["Plugin %s enabled."] = "Extension %s activée.";
+$a->strings["Disable"] = "Désactiver";
+$a->strings["Enable"] = "Activer";
+$a->strings["Toggle"] = "Activer/Désactiver";
+$a->strings["Log settings updated."] = "Réglages des journaux mis-à-jour.";
+$a->strings["Clear"] = "Remettre à zéro";
+$a->strings["Debugging"] = "Débogage";
+$a->strings["Log file"] = "Fichier de journal";
+$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Doit pouvoir être modifié par le serveur web. Chemin relatif à l'index.php de Friendika.";
+$a->strings["Log level"] = "Niveau de journalisation";
+$a->strings["Close"] = "Fermer";
+$a->strings["FTP Host"] = "Hôte FTP";
+$a->strings["FTP Path"] = "Chemin FTP";
+$a->strings["FTP User"] = "Utilisateur FTP";
+$a->strings["FTP Password"] = "Mot de passe FTP";
+$a->strings["In order to install Friendika we need to know how to connect to your database."] = "Pour installer Friendika, nous avons besoin des coordonnées de votre base de données.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base spécifiée ci-dessous doit exister. Si ce n'est le cas, créez-la avant de continuer.";
+$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "Courriel de l'administrateur du site. L'adresse de courriel de votre compte doit correspondre pour pouvoir utiliser la page d'Administration.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur: le module mb_string de PHP est manquant.";
+$a->strings["everybody"] = "tout le monde";
+$a->strings["Failed to connect with email account using the settings provided."] = "Impossible de se connecter aux courriels avec les réglages fournis.";
+$a->strings["Plugin settings"] = "Réglages des extensions";
+$a->strings["OpenID:"] = "OpenID:";
+$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Facultatif) Autoriser cet OpenID à accéder à ce compte.";
+$a->strings["Publish your default profile in your local site directory?"] = "Publier votre profil par défaut dans l'annuaire local?";
+$a->strings["Publish your default profile in the global social directory?"] = "Publier votre profil par défaut dans l'annuaire global?";
+$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Masquer vos contacts/amis aux visiteurs de votre profil par défaut?";
+$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Masquer vos informations et messages à tous les visiteurs inconnus?";
+$a->strings["Automatically expire posts after days:"] = "Expiration automatique des entrées de plus de <em>n</em> jours:";
+$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Si le champ est vide, les entrées n'expireront pas. L'expiration équivaut à une suppression";
+$a->strings["Last successful email check:"] = "Dernière vérification des courriels:";
+$a->strings["Security:"] = "Sécurité";
+$a->strings["None"] = "Aucune";
+$a->strings["Reply-to address:"] = "Adresse de réponse:";
+$a->strings["No valid account found."] = "Pas de compte valide trouvé.";
+$a->strings["Create New Event"] = "Créer un évènement";
+$a->strings["Previous"] = "Précédent";
+$a->strings["Next"] = "Suivant";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Modifier l'évènement";
+$a->strings["hour:minute"] = "heure:minute";
+$a->strings["Event details"] = "Détails de l'évènement";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "Le format est %s %s. La date de début et la description sont obligatoires.";
+$a->strings["Event Starts:"] = "Date/heure de début:";
+$a->strings["Finish date/time is not known or not relevant"] = "La date/heure de fin est inconnue ou sans objet";
+$a->strings["Event Finishes:"] = "Date/heure de fin:";
+$a->strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
+$a->strings["Description:"] = "Description:";
+$a->strings["Share this event"] = "Partager cet évènement";
+$a->strings["Administrator@"] = "Administrator@";
+$a->strings["%s posted to your profile wall at %s"] = "%s a écrit sur votre profil (%s)";
+$a->strings["Normal site view"] = "Vue normale";
+$a->strings["View all site entries"] = "Vue de toutes les entrées";
+$a->strings["Visit %s's profile [%s]"] = "Visiter le profile de %s [%s]";
+$a->strings["Not available."] = "Indisponible.";
+$a->strings["File exceeds size limit of %d"] = "Le fichier dépasse la limite de %d";
+$a->strings["File upload failed."] = "Echec du téléversement.";
+$a->strings["Tips for New Members"] = "Astuces pour les nouveaux inscrits";
+$a->strings["You have no more invitations available"] = "Vous ne disposez pas d'invitations";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Vous devrez fournir ce code d'invitation: \$invite_code";
+$a->strings["Friend suggestion sent."] = "Suggestion d'amitié envoyée.";
+$a->strings["Suggest Friends"] = "Suggérer de amis/contacts";
+$a->strings["Suggest a friend for %s"] = "Suggérer un ami/contact pour %s";
+$a->strings["Does %s know you?"] = "Est-ce que %s vous connaît?";
+$a->strings["This site is not configured to allow communications with other networks."] = "Ce site n'est pas configuré pour permettre les communication avec d'autres réseaux.";
+$a->strings["No compatible communication protocols or feeds were discovered."] = "Aucun protocole ou flux compatible n'a pu être découvert.";
+$a->strings["An author or name was not found."] = "Impossible de trouver le nom ou l'auteur.";
+$a->strings["No browser URL could be matched to this address."] = "Aucune URL ne correspond à cette adresse.";
+$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "L'adresse de profil spécifiée appartient à un réseau dont l'usage a été désactivé sur ce site.";
+$a->strings["Item not available."] = "Entrée inaccessible.";
+$a->strings["Item was not found."] = "Entrée introuvable.";
+$a->strings["Image file is empty."] = "L'image est vide.";
+$a->strings["Access to this item is restricted."] = "L'accès à cette entrée est restreint.";
+$a->strings["Friend Suggestion"] = "Suggestion d'amitié/contact";
+$a->strings["suggested by %s"] = "suggéré(e) par %s";
+$a->strings["Sharer"] = "Source du partage";
+$a->strings["%d invitation available"] = array(
+       0 => "%d invitation disponible",
+       1 => "%d invitations disponibles",
+);
+$a->strings["Suggest friends"] = "Suggérer des amis/contacts";
index 6b28ba782d2860eea24778ca833087ea523a50c5..235cfbcf7a4cc51a36fe460ab643ba56ee9945e8 100644 (file)
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: friendika\n"
 "Report-Msgid-Bugs-To: http://bugs.friendika.com/\n"
 "POT-Creation-Date: 2011-08-14 21:17-0700\n"
-"PO-Revision-Date: 2011-08-17 17:49+0000\n"
+"PO-Revision-Date: 2011-09-01 10:32+0000\n"
 "Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
 "Language-Team: Italian (http://www.transifex.net/projects/p/friendika/team/it/)\n"
 "MIME-Version: 1.0\n"
@@ -1082,7 +1082,7 @@ msgstr "Amico"
 
 #: ../../mod/notifications.php:141
 msgid "Fan/Admirer"
-msgstr "Fan/Admiratore"
+msgstr "Fan/Ammiratore"
 
 #: ../../mod/notifications.php:149
 msgid "Friend/Connect Request"
@@ -2158,7 +2158,7 @@ msgstr "Regitrati"
 #: ../../include/diaspora.php:446 ../../include/conversation.php:26
 #: ../../include/conversation.php:35
 msgid "status"
-msgstr "stato"
+msgstr "lo stato"
 
 #: ../../mod/like.php:127 ../../addon/facebook/facebook.php:958
 #: ../../include/diaspora.php:463 ../../include/conversation.php:43
@@ -4420,7 +4420,7 @@ msgstr "Hai un nuovo seguace su "
 
 #: ../../include/conversation.php:23
 msgid "event"
-msgstr "evento"
+msgstr "l'evento"
 
 #: ../../include/conversation.php:213 ../../include/conversation.php:488
 #: ../../include/conversation.php:489
index 9e3a2262f381be010f6da1e2f823f2c4e93d1e8e..7d6c2e704f78ae91c58011a1bc27dd59e797eb9f 100644 (file)
@@ -224,7 +224,7 @@ $a->strings["yes"] = "si";
 $a->strings["no"] = "no";
 $a->strings["Approve as: "] = "Approva come: ";
 $a->strings["Friend"] = "Amico";
-$a->strings["Fan/Admirer"] = "Fan/Admiratore";
+$a->strings["Fan/Admirer"] = "Fan/Ammiratore";
 $a->strings["Friend/Connect Request"] = "Richiesta Amicizia/Connessione";
 $a->strings["New Follower"] = "Nuovo Seguace";
 $a->strings["No notifications."] = "Nessuna notifica.";
@@ -459,7 +459,7 @@ $a->strings["Your Email Address: "] = "Il tuo Indirizzo Email: ";
 $a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Scegli un soprannome. Deve cominciare con un carattere. L'indirizzo del tuo profilo sarà '<strong>soprannome@\$sitename</strong>'.";
 $a->strings["Choose a nickname: "] = "Scegli un soprannome: ";
 $a->strings["Register"] = "Regitrati";
-$a->strings["status"] = "stato";
+$a->strings["status"] = "lo stato";
 $a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s piace %3\$s di %2\$s";
 $a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s non piace %3\$s di %2\$s";
 $a->strings["This is Friendika version"] = "Questo è Friendika versione";
@@ -985,7 +985,7 @@ $a->strings["show"] = "mostra";
 $a->strings["don't show"] = "non mostrare";
 $a->strings["(no subject)"] = "(nessun oggetto)";
 $a->strings["You have a new follower at "] = "Hai un nuovo seguace su ";
-$a->strings["event"] = "evento";
+$a->strings["event"] = "l'evento";
 $a->strings["View %s's profile"] = "Vedi il profilo di %s";
 $a->strings["%s from %s"] = "%s da %s";
 $a->strings["View in context"] = "Vedi nel contesto";
diff --git a/view/theme/dispy/photo-menu.jpg b/view/theme/dispy/photo-menu.jpg
new file mode 100644 (file)
index 0000000..fde5eb5
Binary files /dev/null and b/view/theme/dispy/photo-menu.jpg differ
index e9d11d601f81c4f326cdb0280c718d3bdb09089d..78efb57ffa5091b91b1ef0dde3599e2f35f6a08f 100644 (file)
@@ -688,12 +688,17 @@ div[id$="wrapper"] br { clear: left; }
  */
 
 .view-contact-wrapper,
-.contact-entry-wrapper { float: left; margin-right: 20px; margin-bottom: 20px; position: relative;}
+.contact-entry-wrapper { float: left; margin-right: 20px; margin-bottom: 20px; width: 120px; height: 120px; position: relative;}
 .contact-entry-direction-wrapper {position: absolute; top: 20px;}
 .contact-entry-edit-links { position: absolute; top: 60px; }
 .contact-entry-photo {
        margin-left:20px;
 }
+.contact-entry-name { width: 120px; overflow: hidden; }
+.contact-entry-photo {
+       position: relative;
+}
+
 .contact-entry-edit-links .icon {      
        border: 1px solid #babdb6;
     -webkit-border-radius: 3px;
@@ -718,7 +723,36 @@ div[id$="wrapper"] br { clear: left; }
 #contact-edit-last-update-text { margin-bottom: 15px; }
 #contact-edit-last-updated { font-weight: bold; }
 #contact-edit-poll-text { display: inline; }
-#contact-edit-end { clear: both; }
+#contact-edit-end { clear: both; margin-bottom: 65px;}
+
+.contact-photo-menu-button {
+       position: absolute;
+       background-image: url("photo-menu.jpg");
+       background-position: top left; 
+       background-repeat: no-repeat;
+       margin: 0px; padding: 0px;
+       width: 16px;
+       height: 16px;
+       top: 64px; left:0px;
+       overflow: hidden;
+       text-indent: 40px;
+       display: none;
+       
+}
+.contact-photo-menu {
+       width: auto;
+       border: 2px solid #444444;
+       background: #FFFFFF;
+       position: absolute;
+       left: 0px; top: 90px;
+       display: none;
+       z-index: 10000;
+}
+.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
+.contact-photo-menu li a { display: block; padding: 2px; }
+.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
+
+
 
 /**
  *     register, settings & profile forms
index 5943e5061722c07dbb5bdaa8fb55c324d5f86dce..f47af934c557cbbee55d56098fb025809b6b6034 100644 (file)
@@ -743,7 +743,8 @@ input#dfrn-url {
 
 .contact-entry-wrapper {
        float: left;
-       width: 180px;
+       width: 120px;
+       height: 120px;
 }
 
 .contact-entry-direction-icon {
@@ -759,7 +760,9 @@ input#dfrn-url {
 }
 .contact-entry-name {
        float: left;
-       margin-left: 30px;
+       margin-left: 0px;
+       width: 120px;
+       overflow: hidden;
 }
 .contact-entry-edit-links {
        margin-top: 6px;
@@ -777,6 +780,7 @@ input#dfrn-url {
 }
 .contact-entry-photo {
        float: left;
+       position: relative;
 }
 .contact-entry-end {
        clear: both;
@@ -784,6 +788,7 @@ input#dfrn-url {
 
 #contact-edit-end {
        clear: both;
+       margin-bottom: 65px;
 }
 
 #fsuggest-desc, #fsuggest-submit-wrapper {
@@ -1374,6 +1379,12 @@ input#dfrn-url {
        margin-left: 30px;
 }
 
+#contact-edit-nettype {
+       margin-top: 5px;
+       margin-left: 30px;
+}
+
+
 #contact-edit-poll-wrapper {
        margin-left: 50px;
        margin-top: 30px;
@@ -1458,6 +1469,35 @@ input#dfrn-url {
        /*margin-left: 50px;*/
 }
 
+
+.contact-photo-menu-button {
+       position: absolute;
+       background-image: url("photo-menu.jpg");
+       background-position: top left; 
+       background-repeat: no-repeat;
+       margin: 0px; padding: 0px;
+       width: 16px;
+       height: 16px;
+       top: 64px; left:0px;
+       overflow: hidden;
+       text-indent: 40px;
+       display: none;
+       
+}
+.contact-photo-menu {
+       width: auto;
+       border: 2px solid #444444;
+       background: #FFFFFF;
+       position: absolute;
+       left: 0px; top: 90px;
+       display: none;
+       z-index: 10000;
+}
+.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
+.contact-photo-menu li a { display: block; padding: 2px; }
+.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
+
+
 #block-message, #ignore-message {
        margin-top: 20px;
        color: #FF0000;
index c58bda5bb37b0b3a09895b894d9349df1a02f6a5..781526eae8b442e93afad495aacd7996fb532dae 100644 (file)
@@ -841,7 +841,8 @@ input#dfrn-url {
 
 .contact-entry-wrapper {
        float: left;
-       width: 180px;
+       width: 120px;
+       height: 120px;
 }
 
 .contact-entry-direction-icon {
@@ -857,7 +858,9 @@ input#dfrn-url {
 }
 .contact-entry-name {
        float: left;
-       margin-left: 30px;
+       margin-left: 0px;
+       width: 120px;
+       oveflow: hidden;
 }
 .contact-entry-edit-links {
        margin-top: 6px;
@@ -875,6 +878,7 @@ input#dfrn-url {
 }
 .contact-entry-photo {
        float: left;
+       position: relative;
 }
 .contact-entry-end {
        clear: both;
@@ -882,8 +886,36 @@ input#dfrn-url {
 
 #contact-edit-end {
        clear: both;
-}
-
+       margin-bottom: 65px;
+}
+
+.contact-photo-menu-button {
+       position: absolute;
+       background-image: url("photo-menu.jpg");
+       background-position: top left; 
+       background-repeat: no-repeat;
+       margin: 0px; padding: 0px;
+       width: 16px;
+       height: 16px;
+       top: 64px; left:0px;
+       overflow: hidden;
+       text-indent: 40px;
+       display: none;
+       
+}
+
+.contact-photo-menu {
+       width: 100px;
+       border: 2px solid #444444;
+       background: #FFFFFF;
+       position: absolute;
+       left: 0px; top: 90px;
+       display: none;
+       z-index: 10000;
+}
+.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
+.contact-photo-menu li a { display: block; padding: 2px; }
+.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
 
 #fsuggest-desc, #fsuggest-submit-wrapper {
        margin-top: 15px;
@@ -1420,6 +1452,11 @@ padding: 5px 10px 0px;
        font-weight: bold;
        margin-left: 30px;
 }
+#contact-edit-nettype {
+       margin-top: 5px;
+       margin-left: 30px;
+}
+
 
 #contact-edit-poll-wrapper {
        margin-left: 50px;
diff --git a/zot.txt b/zot.txt
new file mode 100644 (file)
index 0000000..0704875
--- /dev/null
+++ b/zot.txt
@@ -0,0 +1,304 @@
+This is the Zot! social communications protocol. 
+
+Specification revision: 1
+02 September 2011
+
+Mike Macgirvin
+This specification is public domain.
+
+Zot is a framework for secure delivery of messages on the web based on 
+webfinger and encapsulating salmon.
+
+First read the salmon and salmon magic envelope specifications. Zot also 
+makes use of webfinger and ActivityStreams and several concepts from RFC822
+(email). Zot encompasses the zot delivery framework and the zid remote
+access protocol.
+
+The current specification revision (1) is frozen until a reference 
+implementation is available. After that, any protocol changes will require a 
+change to the revision number.  
+
+****************
+* Zot delivery *
+****************
+
+Format of a zot wrapper. This completely encapsulates a salmon magic envelope 
+and provides privacy protection, while defining a delivery envelope - a 
+concept familiar to email systems. All addresses in zot are webfinger 
+resolvable addresses containing zot endpoints and salmon public keys (zot 
+is a superset of salmon). 
+
+
+<?xml version='1.0' encoding='UTF-8'?>
+<zot:msg xmlns:zot='http://purl.org/zot/1.0'>
+ <zot:key>((key))</zot:key>
+ <zot:iv>((iv))</zot:iv>
+ <zot:env_key>((env_key))</zot:env_key>
+ <zot:env_iv>((env_iv))</zot:env_iv>
+ <zot:env>((envelope))</zot:env>
+ <zot:sig key_id="xxx">((sender signature))</zot:sig>
+ <zot:alg>AES-256-CBC</zot:alg>
+ <zot:data type='application/magic-envelope+xml'>((salmon))</zot:data>
+</zot:msg>
+
+
+zot:key
+*******
+
+A suitable randomly generated encyption key of length 32 octets for encrypting 
+the salmon packet. This is then encrypted with the sender's private key and 
+base64url encoded.
+
+zot:iv
+******
+
+A suitable randomly generated initialisation vector of length 16 octets for 
+encrypting the salmon packet. This is then encrypted with the sender's private 
+key and base64url encoded.
+
+zot:env_key
+***********
+
+A suitable randomly generated encyption key of length 32 octets for encrypting 
+the envelope. This is then encrypted with the recipient's public key and 
+base64url encoded. For bulk deliveries, it is encrypted with the site bulk 
+delivery public key.
+
+
+zot:env_iv
+**********
+
+A suitable randomly generated initialisation vector of length 16 octets for 
+encrypting the envelope. This is then encrypted with the recipient's public
+key and base64url encoded. For bulk deliveries, it is encrypted with the site 
+bulk delivery public key.
+
+
+zot:env
+*******
+
+This consists of RFC822-style header fields representing the sender and 
+recipient(s). Example:
+
+From: bob@example.com
+Sender: bob@example.com
+To: alice@example.com
+
+Both "From:" and "Sender:" MUST be provided, and represent a webfinger 
+address of the author and sender respectively. The webfinger address for
+the From address MUST contain a discoverable salmon public key that
+is needed to verify the enclosed salmon data. Sender is used to indicate
+the webfinger identity responsible for transmitting this message. From
+indicates the message author. 
+
+In web-based social systems, a reply to a message SHOULD be conveyed to all of 
+the original message participants. Only the author of the original message 
+may know all the recipients (such as those contained in Bcc: elements). The 
+author of a message always provides 'From'. They MUST duplicate this 
+information as 'Sender'.
+
+A reply to a given message MUST be sent to the original From address, and MAY
+be sent to any additional addresses in the recipient list. The original author
+MUST send the reply to all known recipients of the original message, with 
+their webfinger identity as Sender, and the comment/reply author as From.   
+
+Receiving agents SHOULD validate the From identity as the signer of the salmon
+magic envelope, and MAY reject it. They SHOULD also verify the Sender signature
+of the zot packet if it is different than the salmon signature. They MAY 
+reject the message if the Sender is not allowed in their "friend list", or if 
+they do not have a suitable relationship with the Sender, or if either
+signature fails to validate.  
+
+
+To: *
+
+indicates a public message with no specifically enumerated recipients.
+
+The fields To:, Cc:, and/or Bcc: MAY be present. At least one recipient field
+MUST be present. These fields may use the entire syntax specified by RFC822,
+for example:
+
+To: "Bob Smith" <bob@example.com>, "Alice Jones" <alice@example.com>
+
+is a valid entry. A zot envelope is UTF-8 encoded, which differs from RFC822.
+The host component MUST be US-ASCII, with punycode translation of 
+internationalised domain names applied.
+
+The entire envelope is then encrypted using alg with env_key and env_iv and
+base64url encoded for transmission.
+
+The zot envelope MAY include remote addresses. A zot delivery agent MUST parse
+all addresses and determine whether a delivery address to the current endpoint
+is valid. This may be the result of:
+
+       1. An address contains the public message wildcard '*'
+
+       2. The current endpoint is a personal endpoint and one of the recipients
+listed in the To:, Cc:, or Bcc: addresses matches the webfinger address of
+the "owner" of the endpoint.
+
+       3. The current endpoint is a bulk delivery endpoint. The bulk delivery
+endpoint is defined elsewhere in this document. The bulk delivery agent
+will deliver to all local addresses found in the address lists. 
+
+zot:sig
+*******
+
+The Sender of the message signs the underlying salmon data in the manner 
+prescribed by salmon. If the Sender and From address are identical, the
+signature will be identical to the signature of the underlying salmon packet. 
+If they are different, this signature is verified with the Sender's public 
+key to verify the Sender. 
+
+zot:alg
+*******
+
+Currently the only valid choice for alg is "AES-256-CBC". 
+
+
+zot:data
+********
+
+The data field is a salmon magic envelope. This is encrypted with alg using 
+key and iv. The result is then base64url encoded for transmission.
+
+For the first release of this specification, the data format of the enclosed
+salmon SHOULD be 'application/atom+xml' representing an Atom formatted
+ActivityStream. Future revisions MAY allow other alternate data formats.
+All acceptable formats MUST be listed in an XRD property (described elsewhere
+in this document).  
+
+
+Delivery
+********
+
+The zot message is then POSTed to the zot endpoint URL as 
+application/text+xml and can be decoded/decrypted by the recipient using 
+their private key.
+
+The normal salmon endpoint for a service MAY be used as an alternate
+delivery method for non-encrypted (e.g. public) messages. 
+
+Discover of the zot endpoint is based on webfinger XRD:
+
+<link rel="http://purl.org/zot/1.0/post" 
+       href="http://example/org/zot-endpoint" />
+
+
+Bulk Delivery
+*************
+
+A site MAY provide a bulk delivery endpoint, which MAY be used to avoid
+multiple encryptions of the same data for a single destination.
+This is discoverable by providing a zot endpoint with a corresponding
+salmon public key in the site's .well-known/host-meta file.
+A delivery to this endpoint will deliver to all local recipients provided
+within the zot envelope. 
+
+
+Extensibility
+*************
+
+This specification is subject to change. The current version which is in
+effect at a given site may be noted by XRD properties. The following 
+properties MUST be present in the XRD providing the relevant endpoint:
+
+<Property xmlns:zot="http://purl.og/zot/1.0"
+       type="http://purl.org/zot/1.0/version"
+       zot:version="1" />
+
+<Property xmlns:zot="http://purl.og/zot/1.0"
+       type="http://purl.org/zot/1.0/accept"
+       zot:accept="application/atom+xml" />
+
+Version is specified in this document and indicates the current revision.
+Implementations MAY provide compatibility to multiple incompatible versions
+by using this version indication. The "accept" indicates a range of document
+content types which may be enclosed in the underlying salmon magic envelope.
+We anticipate this specification will in the future allow for a close variant
+of "message/rfc822" and which may include MIME. This may also be used to 
+embed alternate message formats and protocols such as 
+"application/x-diaspora+xml". If a delivery agent is unable to provide any
+acceptable data format, the delivery MUST be terminated/cancelled. 
+
+Foreign Messages
+****************
+
+Messages MAY be imported from other networks and systems which have no 
+knowledge of salmon signatures. The salmon signature in this case MUST be the
+exact string 'NOTSIGNED' to indicate that the author (From address) cannot be 
+validated using salmon verification. This message MUST be relayed by a Sender
+who can provide a valid salmon signature of the message. Delivery systems MAY
+reject foreign messages.  
+
+
+
+**********************
+* Zid authentication *
+**********************
+
+URLs may be present within a zot message which refer to private and/or
+protected resources. Zid uses OpenID to gain access to these protected
+resources. These could be private photos or profile information - or *any*
+web accessible resource. Using zid, these can have access controls which 
+extends to any resolvable webfinger address.
+
+Zid authentication relies on the presence of an OpenID provider element in
+webfinger, and a URL template which is applied to protected resources within
+a zot message.
+
+The template is designated with the characters "{zid=}" within a URL of a zot
+message. When the page is rendered for viewing to an observer, this template
+is replaced with the webfinger address of the viewer (if known), or an empty
+string if the webfinger address of the viewer cannot be determined.
+
+For example in a message body:
+
+http://example.com/photos/bob/picture.jpg?{zid=}
+
+refers to a private photo which is only visible to alice@example.com.
+
+If Alice is viewing the page, the link is rendered with
+
+http://example.com/photos/bob/picture.jpg?zid=alice@example.com
+
+If the page viewer is unknown, it is rendered as
+
+http://example.com/photos/bob/picture.jpg?zid=
+
+
+When the link is visited, the web server at example.com notes the presence of 
+the zid parameter and uses information from webfinger to locate the OpenID 
+provider for the zid webfinger address. It then redirects to the OpenID 
+server and requests authentication of the given person. If this is successful,
+access to the protected resource is granted.
+
+A browser cookie may be provided to avoid future authentication redirects
+and allow authenticated browsing to other resources on the website.
+
+Only authentication via OpenID is defined in this version of the specification.
+
+This can be used to provide access control of any web resource to any 
+webfinger identity on the internet.
+
+
+*********
+* Links *
+*********
+
+Salmon Protocol
+       http://www.salmon-protocol.org/salmon-protocol-summary
+
+Salmon Magic Envelope
+       http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-magicsig-01.html
+
+Atom Activity Stream Draft
+       http://activitystrea.ms/specs/atom/1.0/
+
+Activty Stream Base Schema
+       http://activitystrea.ms/head/activity-schema.html
+
+WebFinger Protocol
+       http://code.google.com/p/webfinger/wiki/WebFingerProtocol
+
+