From eb2ef6dec43391631e2989b55bc4d762336680ca Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 22 Aug 2011 18:52:02 -0700 Subject: [PATCH 01/64] diaspora admin toggle, update install guide --- INSTALL.txt | 42 ++++++++++++++++++++++++------------- addon/facebook/facebook.php | 2 ++ boot.php | 2 +- include/acl_selectors.php | 2 +- include/network.php | 2 +- mod/admin.php | 3 +++ view/admin_site.tpl | 1 + 7 files changed, 36 insertions(+), 18 deletions(-) diff --git a/INSTALL.txt b/INSTALL.txt index dd4c747e2..053c33902 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -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... diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php index ed59daff6..33895f80d 100644 --- a/addon/facebook/facebook.php +++ b/addon/facebook/facebook.php @@ -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) { diff --git a/boot.php b/boot.php index ae3c04b77..b0ff7830c 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1079' ); +define ( 'FRIENDIKA_VERSION', '2.2.1080' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1081 ); diff --git a/include/acl_selectors.php b/include/acl_selectors.php index 48ba77a88..66fe104ea 100644 --- a/include/acl_selectors.php +++ b/include/acl_selectors.php @@ -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' ) "; } diff --git a/include/network.php b/include/network.php index d4f0d8aa7..f0dd828d1 100644 --- a/include/network.php +++ b/include/network.php @@ -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); diff --git a/mod/admin.php b/mod/admin.php index 1a926443f..7799e64ab 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -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'), ""), diff --git a/view/admin_site.tpl b/view/admin_site.tpl index 5ee0125de..061656df7 100644 --- a/view/admin_site.tpl +++ b/view/admin_site.tpl @@ -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 }} From b0211499c1990792eaa501e86c984d67d4cd4f39 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 22 Aug 2011 19:27:40 -0700 Subject: [PATCH 02/64] invoke notifier --- include/diaspora.php | 88 +++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index f3adc608e..78a642048 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -3,6 +3,43 @@ require_once('include/crypto.php'); require_once('include/items.php'); +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 +50,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(); @@ -262,42 +289,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) { @@ -599,6 +590,8 @@ function diaspora_comment($importer,$xml,$msg) { } // notify others + proc_run('php','include/notifier.php','comment',$message_id); + return; } @@ -768,7 +761,8 @@ EOT; ); } - // FIXME send notification + // notify others + proc_run('php','include/notifier.php','comment',$message_id); return; } From b9e4668f68321bd767dfffb626be940e0b1be460 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 22 Aug 2011 20:35:34 -0700 Subject: [PATCH 03/64] d* retractions --- include/diaspora.php | 62 +++++++++++++++++++++++++++++++++++++++----- mod/contacts.php | 22 +++++++++------- 2 files changed, 67 insertions(+), 17 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 78a642048..4420129b0 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -771,19 +771,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) { @@ -805,6 +818,28 @@ function diaspora_share($me,$contact) { return $return_code; } +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']))); + + post_url($contact['notify'] . '/',$slap); + $return_code = $a->get_curl_code(); + logger('diaspora_send_unshare: returns: ' . $return_code); + return $return_code; +} + + + function diaspora_send_status($item,$owner,$contact) { $a = get_app(); @@ -975,8 +1010,21 @@ 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']))); + post_url($contact['notify'] . '/',$slap); + $return_code = $a->get_curl_code(); + logger('diaspora_send_retraction: returns: ' . $return_code); + return $return_code; } \ No newline at end of file diff --git a/mod/contacts.php b/mod/contacts.php index efb0dc75b..4d9385026 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -163,9 +163,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 +178,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 +193,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 +215,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'); From 58651f7eb83e1be1f2dffc6f88370187be2f3943 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 22 Aug 2011 21:15:31 -0700 Subject: [PATCH 04/64] public posts ~f to D* --- include/notifier.php | 79 +++++++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index cf8871fb9..5cbd3deb1 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -139,7 +139,7 @@ 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 = ''; @@ -153,7 +153,7 @@ function notifier_run($argv, $argc){ if($parent['wall'] == 0 && (! $expire)) { // 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 +163,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 +177,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:') { @@ -241,7 +241,7 @@ function notifier_run($argv, $argc){ )); if($cmd === 'mail') { - $notify_hub = false; // mail is not public + $public_message = false; // mail is not public $body = fix_private_photos($item['body'],$owner['uid']); @@ -257,7 +257,7 @@ function notifier_run($argv, $argc){ )); } elseif($cmd === 'suggest') { - $notify_hub = false; // suggestions are not public + $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_suggest.tpl'); @@ -296,7 +296,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 +305,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); } } @@ -403,7 +403,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']) { @@ -544,7 +544,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,7 +556,7 @@ function notifier_run($argv, $argc){ } } - if((strlen($hub)) && ($notify_hub)) { + if((strlen($hub)) && ($public_message)) { $hubs = explode(',', $hub); if(count($hubs)) { foreach($hubs as $h) { @@ -572,12 +572,12 @@ function notifier_run($argv, $argc){ } } - if($notify_hub) { + if($public_message) { /** * * 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. + * we'll just go ahead and push them out securely with dfrn/rino or Diaspora. * If you've got more than that, you'll have to rely on PuSH delivery. * */ @@ -592,9 +592,10 @@ function notifier_run($argv, $argc){ */ $r = q("SELECT `id`, `name` FROM `contact` - WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 + WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `rel` != %d ", dbesc(NETWORK_DFRN), + dbesc(NETWORK_DIASPORA), intval($owner['uid']), intval(CONTACT_IS_SHARING) ); @@ -607,19 +608,51 @@ function notifier_run($argv, $argc){ /* 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)) + continue; - if(count($n)) { + $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", + intval($rr['id']) + ); + + if(count($n)) { + switch($n[0]['network']) { + case NETWORK_DFRN : + logger('notifier: dfrnpubdelivery: ' . $n[0]['name']); + $deliver_status = dfrn_deliver($owner,$n[0],$atom); + break; + case NETWORK_DIASPORA : + require_once('include/diaspora.php'); + if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) + break; - logger('notifier: dfrnpubdelivery: ' . $n[0]['name']); - $deliver_status = dfrn_deliver($owner,$n[0],$atom); + if($target_item['verb'] === ACTIVITY_DISLIKE) { + // unsupported + break; + } + elseif($target_item['deleted'] && (! $parent_item['verb'] === ACTIVITY_LIKE)) { + // diaspora delete, + diaspora_send_retraction($target_item,$owner,$n[0]); + break; + } + elseif($followup) { + // send comments, likes and retractions of likes to owner to relay + diaspora_send_followup($target_item,$owner,$n[0]); + break; + } + elseif($target_item['parent'] != $target_item['id']) { + // we are the relay - send comments, likes and unlikes to our conversants + diaspora_send_relay($target_item,$owner,$n[0]); + break; + } + elseif($top_level) { + diaspora_send_status($target_item,$owner,$n[0]); + break; + } + default: + break; } } - else - logger('notifier: dfrnpubdelivery: ignoring ' . $rr['name']); } } } From 9cd28af4e86c37dd553033a2f85881c17005a809 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Tue, 23 Aug 2011 06:32:21 +0200 Subject: [PATCH 05/64] fixed a missing string in DE --- view/de/strings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/view/de/strings.php b/view/de/strings.php index db53b0784..56d54a6d3 100644 --- a/view/de/strings.php +++ b/view/de/strings.php @@ -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"; From 56ea11a5616ad5f17a81078fa8251a8c15ec7fd4 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 22 Aug 2011 23:18:22 -0700 Subject: [PATCH 06/64] bad param in like function --- include/diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index 4420129b0..58dd579bc 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -907,7 +907,7 @@ function diaspora_send_followup($item,$owner,$contact) { 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']), From 561051e805e3f262ed5e8e5f712e2e514ecb90b8 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:00:29 -0700 Subject: [PATCH 07/64] convert bbcode to markdown for diaspora (first try, will need tweaking) --- include/bb2diaspora.php | 154 ++++++++++++++++++++++++++++++++++++++++ include/diaspora.php | 10 +-- 2 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 include/bb2diaspora.php diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php new file mode 100644 index 000000000..a4e7997fa --- /dev/null +++ b/include/bb2diaspora.php @@ -0,0 +1,154 @@ +', '', $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("<", "<", $Text); + $Text = str_replace(">", ">", $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 + + + + $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($1)', $Text); + $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '[$2]($1)', $Text); + //$Text = preg_replace("(\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[/url\])", '[$2]($1)', $Text); + + + // Perform MAIL Search + $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); + $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '[$2](mailto:$1)', $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",'$1',$Text); + + // Check for strike-through text +// $Text = preg_replace("(\[s\](.*?)\[\/s\])is",'$1',$Text); + + // Check for over-line text +// $Text = preg_replace("(\[o\](.*?)\[\/o\])is",'$1',$Text); + + // Check for colored text +// $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","$2",$Text); + + // Check for sized text +// $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","$2",$Text); + + // Check for list text +// $Text = preg_replace("/\[list\](.*?)\[\/list\]/is", '
    $1
' ,$Text); +// $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/is", '
    $1
' ,$Text); +// $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/s",'
    $1
' ,$Text); +// $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/s", '
    $1
' ,$Text); +// $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/s", '
    $1
' ,$Text); +// $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/s", '
    $1
' ,$Text); +// $Text = preg_replace("/\[li\](.*?)\[\/li\]/s", '
  • $1
  • ' ,$Text); + +// $Text = preg_replace("/\[td\](.*?)\[\/td\]/s", '$1' ,$Text); +// $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/s", '$1' ,$Text); +// $Text = preg_replace("/\[table\](.*?)\[\/table\]/s", '$1
    ' ,$Text); + +// $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/s", '$1
    ' ,$Text); +// $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/s", '$1
    ' ,$Text); + + +// $Text = str_replace("[*]", "
  • ", $Text); + + // Check for font change text +// $Text = preg_replace("(\[font=(.*?)\](.*?)\[\/font\])","$2",$Text); + + // Declare the format for [code] layout + + $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/is",'stripdcode_br_cb',$Text); + +// $CodeLayout = '$1'; + // Check for [code] text +// $Text = preg_replace("/\[code\](.*?)\[\/code\]/is","$CodeLayout", $Text); + + + + + // Declare the format for [quote] layout +// $QuoteLayout = '
    $1
    '; + // Check for [quote] text +// $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is","$QuoteLayout", $Text); + + // Images + // [img]pathtoimage[/img] +// $Text = preg_replace("/\[img\](.*?)\[\/img\]/", '' . t('Image/photo') . '', $Text); + + // html5 video and audio + +// $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '', $Text); + +// $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '', $Text); + +// $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/", '', $Text); + + // [img=widthxheight]image source[/img] +// $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/", '', $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\]/", '', $Text); +// } +// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $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; +} diff --git a/include/diaspora.php b/include/diaspora.php index 58dd579bc..b841c7770 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -845,9 +845,9 @@ 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'); + require_once('include/bb2diaspora.php'); - $body = xmlify(bbcode($item['body'])); + $body = xmlify(bb2diaspora($item['body'])); $public = (($item['private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -898,12 +898,12 @@ function diaspora_send_followup($item,$owner,$contact) { $like = false; } - $text = bbcode($item['body']); + $text = 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; @@ -966,7 +966,7 @@ function diaspora_send_relay($item,$owner,$contact) { $like = false; } - $text = bbcode($item['body']); + $text = bb2diaspora($item['body']); // sign it From c1a1b2ab60b9c19d49580869a0835b0be6f0eb0d Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:33:58 -0700 Subject: [PATCH 08/64] updates bb2md --- include/bb2diaspora.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index a4e7997fa..007a2bf35 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -32,6 +32,8 @@ function bb2diaspora($Text,$preserve_nl = false) { // Perform URL Search + // [img]pathtoimage[/img] + $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($1)', $Text); @@ -43,6 +45,11 @@ function bb2diaspora($Text,$preserve_nl = false) { $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); @@ -92,7 +99,7 @@ function bb2diaspora($Text,$preserve_nl = false) { // $CodeLayout = '$1'; // Check for [code] text -// $Text = preg_replace("/\[code\](.*?)\[\/code\]/is","$CodeLayout", $Text); + $Text = preg_replace("/\[code\](.*?)\[\/code\]/is","```$1```", $Text); @@ -103,8 +110,6 @@ function bb2diaspora($Text,$preserve_nl = false) { // $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is","$QuoteLayout", $Text); // Images - // [img]pathtoimage[/img] -// $Text = preg_replace("/\[img\](.*?)\[\/img\]/", '' . t('Image/photo') . '', $Text); // html5 video and audio From 508f22f859eb8e450f705a401e72bb2ee2cd72ef Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:47:42 -0700 Subject: [PATCH 09/64] photos a bit messed up on d* --- include/bb2diaspora.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 007a2bf35..3d5846432 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -33,13 +33,12 @@ function bb2diaspora($Text,$preserve_nl = false) { // Perform URL Search // [img]pathtoimage[/img] - $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($1)', $Text); $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '[$2]($1)', $Text); - //$Text = preg_replace("(\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[/url\])", '[$2]($1)', $Text); + $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text); // Perform MAIL Search $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); From 124881903ef1c6bd6717b14074538007a01da89a Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:51:37 -0700 Subject: [PATCH 10/64] forget about the image link we have it in the wrapper --- include/bb2diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 3d5846432..0dae9ae45 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -38,7 +38,7 @@ function bb2diaspora($Text,$preserve_nl = false) { $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($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: ') . '$1', $Text); // Perform MAIL Search $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); From c55d24b451cfab81b68452064951f1ada4ff9d1f Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:52:59 -0700 Subject: [PATCH 11/64] second try --- include/bb2diaspora.php | 1 + 1 file changed, 1 insertion(+) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 0dae9ae45..ceda4b69c 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -39,6 +39,7 @@ function bb2diaspora($Text,$preserve_nl = false) { $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '[$2]($1)', $Text); // $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text); + $Text = preg_replace("/\[img\](.*?)\[\/img\]/", '', $Text); // Perform MAIL Search $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); From 92504b5df77bb53bc40b7e105e8c7a759995dd30 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 01:55:46 -0700 Subject: [PATCH 12/64] more testing with images --- include/bb2diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index ceda4b69c..3baba8a9e 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -39,7 +39,7 @@ function bb2diaspora($Text,$preserve_nl = false) { $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '[$2]($1)', $Text); // $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text); - $Text = preg_replace("/\[img\](.*?)\[\/img\]/", '', $Text); + $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('image/photo'), $Text); // Perform MAIL Search $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); From 8cfbe2c432e658fe67b0b21ba411a751f50d8f0c Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 03:02:31 -0700 Subject: [PATCH 13/64] include bb2diaspora at top level --- include/diaspora.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index b841c7770..345ea5562 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -2,6 +2,7 @@ require_once('include/crypto.php'); require_once('include/items.php'); +require_once('include/bb2diaspora.php'); function diaspora_get_contact_by_handle($uid,$handle) { $r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1", @@ -845,7 +846,6 @@ 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/bb2diaspora.php'); $body = xmlify(bb2diaspora($item['body'])); $public = (($item['private']) ? 'false' : 'true'); From afbc46c00f3fcd66603bb6b725fd687335376d2d Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 03:06:08 -0700 Subject: [PATCH 14/64] don't process diaspora communications if no pubkey --- include/notifier.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/notifier.php b/include/notifier.php index 5cbd3deb1..14057c35b 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -505,6 +505,9 @@ 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 @@ -625,6 +628,9 @@ 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 From 0739ae315bdc4d9d8d7c5021d34fc14860431c41 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 03:07:26 -0700 Subject: [PATCH 15/64] typo --- include/notifier.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 14057c35b..93df670f1 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -506,7 +506,7 @@ function notifier_run($argv, $argc){ if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if(! contact['pubkey']) + if(! $contact['pubkey']) break; if($target_item['verb'] === ACTIVITY_DISLIKE) { @@ -629,7 +629,7 @@ function notifier_run($argv, $argc){ if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if(! contact['pubkey']) + if(! $contact['pubkey']) break; if($target_item['verb'] === ACTIVITY_DISLIKE) { From 99681e33af20bc35e6992eb1e8869fb6ebcce39e Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 03:49:38 -0700 Subject: [PATCH 16/64] testing retractions --- include/notifier.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 93df670f1..4068a9fae 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -513,7 +513,7 @@ function notifier_run($argv, $argc){ // 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; @@ -628,7 +628,7 @@ 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; @@ -636,7 +636,7 @@ function notifier_run($argv, $argc){ // 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,$n[0]); break; From 91de9edecd2663d5e3313da1b8a01a35e7e8970e Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 04:02:29 -0700 Subject: [PATCH 17/64] retractions - precedence issue --- include/notifier.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 4068a9fae..55d74eb5f 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -513,7 +513,7 @@ function notifier_run($argv, $argc){ // unsupported break; } - elseif($target_item['deleted'] && (! $target_item['verb'] === ACTIVITY_LIKE)) { + elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { // diaspora delete, diaspora_send_retraction($target_item,$owner,$contact); break; @@ -636,7 +636,7 @@ function notifier_run($argv, $argc){ // unsupported break; } - elseif($target_item['deleted'] && (! $target_item['verb'] === ACTIVITY_LIKE)) { + elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { // diaspora delete, diaspora_send_retraction($target_item,$owner,$n[0]); break; From 56d64316f457c85141e35356a61a4d352ed9f24c Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 18:17:35 -0700 Subject: [PATCH 18/64] diaspora photos ? --- boot.php | 4 +- database.sql | 4 +- include/Photo.php | 13 ++++- include/diaspora.php | 116 ++++++++++++++++++++++++++++++++++++- include/group.php | 5 +- include/poller.php | 8 ++- mod/receive.php | 3 + update.php | 19 +++++- view/api_timeline_atom.tpl | 2 +- view/diaspora_photo.tpl | 13 +++++ 10 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 view/diaspora_photo.tpl diff --git a/boot.php b/boot.php index b0ff7830c..16b8f9c85 100644 --- 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.1080' ); +define ( 'FRIENDIKA_VERSION', '2.2.1081' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1081 ); +define ( 'DB_UPDATE_VERSION', 1082 ); define ( 'EOL', "
    \r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index 605433e6e..f659e8049 100644 --- a/database.sql +++ b/database.sql @@ -267,6 +267,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 +289,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; -- -------------------------------------------------------- diff --git a/include/Photo.php b/include/Photo.php index de4c3d9e0..1450374ff 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -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()), diff --git a/include/diaspora.php b/include/diaspora.php index 345ea5562..a1edd08a6 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -597,6 +597,57 @@ function diaspora_comment($importer,$xml,$msg) { } +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(); @@ -847,7 +898,25 @@ function diaspora_send_status($item,$owner,$contact) { $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $theiraddr = $contact['addr']; - $body = xmlify(bb2diaspora($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'],'',$body); + } + } + + $body = xmlify(bb2diaspora($body)); $public = (($item['private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -869,10 +938,55 @@ function diaspora_send_status($item,$owner,$contact) { post_url($contact['notify'] . '/',$slap); $return_code = $a->get_curl_code(); logger('diaspora_send_status: returns: ' . $return_code); + + 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('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']))); + + post_url($contact['notify'] . '/',$slap); + $return_code = $a->get_curl_code(); + logger('diaspora_send_photo: returns: ' . $return_code); + } + +} + function diaspora_send_followup($item,$owner,$contact) { $a = get_app(); diff --git a/include/group.php b/include/group.php index 1ebae7b7b..5e3a1511a 100644 --- a/include/group.php +++ b/include/group.php @@ -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` = '%' AND `contact`.`notify` != '' ", intval($gid), - intval(local_user()) + intval(local_user()), + dbesc(NETWORK_OSTATUS) ); if(count($r)) $ret = count($r); diff --git a/include/poller.php b/include/poller.php index 651736a99..e80b696bf 100644 --- a/include/poller.php +++ b/include/poller.php @@ -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)) { diff --git a/mod/receive.php b/mod/receive.php index c3738c143..b50774933 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -63,6 +63,9 @@ function receive_post(&$a) { elseif($xmlbase->retraction) { diaspora_retraction($importer,$xmlbase->retraction,$msg); } + elseif($xmlbase->photo) { + diaspora_photo($importer,$xmlbase->photo,$msg); + } else { logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true)); } diff --git a/update.php b/update.php index adfb5fe02..ef036008f 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ true - + {{ endfor }} diff --git a/view/diaspora_photo.tpl b/view/diaspora_photo.tpl new file mode 100644 index 000000000..75ca7f15c --- /dev/null +++ b/view/diaspora_photo.tpl @@ -0,0 +1,13 @@ + + + + $path + $filename + $msg_guid + $guid + $handle + $public + $created_at + + + \ No newline at end of file From b41592f5563f0cf1e776a02da6771cd096d47943 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 18:22:15 -0700 Subject: [PATCH 19/64] fix group public members --- include/group.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/group.php b/include/group.php index 5e3a1511a..d69679484 100644 --- a/include/group.php +++ b/include/group.php @@ -124,7 +124,7 @@ 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` = '%' AND `contact`.`notify` != '' ", + AND ( `contact`.`network` = '%s' OR `contact`.`notify` != '' )", intval($gid), intval(local_user()), dbesc(NETWORK_OSTATUS) From 3b4da00495f17fd937ebdfc14b52106ac4d9a5f3 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 18:28:17 -0700 Subject: [PATCH 20/64] fix it again --- include/group.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/group.php b/include/group.php index d69679484..f21ce42e0 100644 --- a/include/group.php +++ b/include/group.php @@ -124,7 +124,7 @@ 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` = '%s' OR `contact`.`notify` != '' )", + AND ( `contact`.`network` = '%s' OR `contact`.`notify` = '' )", intval($gid), intval(local_user()), dbesc(NETWORK_OSTATUS) From c1acea330c7c497f85c587e5499718d170272040 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 18:50:18 -0700 Subject: [PATCH 21/64] photo fixes --- include/bb2diaspora.php | 2 +- include/diaspora.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 3baba8a9e..5ce34d666 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -39,7 +39,7 @@ function bb2diaspora($Text,$preserve_nl = false) { $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); +// $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('image/photo'), $Text); // Perform MAIL Search $Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text); diff --git a/include/diaspora.php b/include/diaspora.php index a1edd08a6..00bf1f910 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -907,12 +907,12 @@ function diaspora_send_status($item,$owner,$contact) { foreach($matches as $mtch) { $detail = array(); $detail['str'] = $mtch[0]; - $detail['path'] = dirname($mtch[1]); + $detail['path'] = dirname($mtch[1]) . '/'; $detail['file'] = basename($mtch[1]); $detail['guid'] = $item['guid']; $detail['handle'] = $myaddr; $images[] = $detail; - $body = str_replace($detail['str'],'',$body); + $body = str_replace($detail['str'],t('link to photo'),$body); } } @@ -931,7 +931,7 @@ 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']))); From 6a052c35865f21a094446a462c07f2b653ce209f Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 19:01:08 -0700 Subject: [PATCH 22/64] correct time in photo msg --- include/diaspora.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 00bf1f910..3c86b0037 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -912,7 +912,7 @@ function diaspora_send_status($item,$owner,$contact) { $detail['guid'] = $item['guid']; $detail['handle'] = $myaddr; $images[] = $detail; - $body = str_replace($detail['str'],t('link to photo'),$body); + $body = str_replace($detail['str'],t('link'),$body); } } @@ -974,7 +974,7 @@ function diaspora_send_images($item,$owner,$contact,$images) { '$guid' => xmlify($r[0]['guid']), '$handle' => xmlify($image['handle']), '$public' => xmlify($public), - '$created_at' => xmlify('UTC','UTC',$r[0]['created'],'Y-m-d h:i:s \U\T\C') + '$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); From 838d89a1104eae279fd80d337ce322560f0bda97 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 19:40:50 -0700 Subject: [PATCH 23/64] fix for public posts to D* --- include/notifier.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/notifier.php b/include/notifier.php index 55d74eb5f..47dccc1bd 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -629,7 +629,7 @@ function notifier_run($argv, $argc){ if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if(! $contact['pubkey']) + if(! $n[0]['pubkey']) break; if($target_item['verb'] === ACTIVITY_DISLIKE) { From b57a01dc1418cc179ddd327af9d04a9e68e679e9 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 19:42:45 -0700 Subject: [PATCH 24/64] that was ugly - let's do better --- include/notifier.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 47dccc1bd..1c8245c7a 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -619,17 +619,18 @@ function notifier_run($argv, $argc){ ); if(count($n)) { - switch($n[0]['network']) { + $contact = $n[0]; + switch($contact['network']) { case NETWORK_DFRN : - logger('notifier: dfrnpubdelivery: ' . $n[0]['name']); - $deliver_status = dfrn_deliver($owner,$n[0],$atom); + logger('notifier: dfrnpubdelivery: ' . $contact['name']); + $deliver_status = dfrn_deliver($owner,$contact,$atom); break; case NETWORK_DIASPORA : require_once('include/diaspora.php'); if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if(! $n[0]['pubkey']) + if(! $contact['pubkey']) break; if($target_item['verb'] === ACTIVITY_DISLIKE) { @@ -638,21 +639,21 @@ function notifier_run($argv, $argc){ } elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { // diaspora delete, - diaspora_send_retraction($target_item,$owner,$n[0]); + diaspora_send_retraction($target_item,$owner,$contact); break; } elseif($followup) { // send comments, likes and retractions of likes to owner to relay - diaspora_send_followup($target_item,$owner,$n[0]); + diaspora_send_followup($target_item,$owner,$contact); break; } elseif($target_item['parent'] != $target_item['id']) { // we are the relay - send comments, likes and unlikes to our conversants - diaspora_send_relay($target_item,$owner,$n[0]); + diaspora_send_relay($target_item,$owner,$contact); break; } elseif($top_level) { - diaspora_send_status($target_item,$owner,$n[0]); + diaspora_send_status($target_item,$owner,$contact); break; } default: From 2cfdcee29a80e355307d013fe71d23a7300f8d98 Mon Sep 17 00:00:00 2001 From: Friendika Date: Tue, 23 Aug 2011 19:54:35 -0700 Subject: [PATCH 25/64] author and owner sign exactly the same string - apparently --- include/diaspora.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 3c86b0037..320f716bf 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -514,7 +514,8 @@ 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 . ';' . $msg['author']; + $owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle; $parent_author_signature = base64_decode($parent_author_signature); @@ -734,7 +735,8 @@ function diaspora_like($importer,$xml,$msg) { } if($parent_author_signature) { - $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author']; +// $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author']; + $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $diaspora_handle; $parent_author_signature = base64_decode($parent_author_signature); From 2aa23843e401e7f448c3d12f844934da6c27f8ef Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 01:21:24 -0700 Subject: [PATCH 26/64] D* queue --- database.sql | 36 +++++++++--------- include/diaspora.php | 88 +++++++++++++++++++++++++++++++------------- include/queue.php | 13 +++++++ mod/receive.php | 29 +-------------- 4 files changed, 94 insertions(+), 72 deletions(-) diff --git a/database.sql b/database.sql index f659e8049..f6ae4c7c6 100644 --- a/database.sql +++ b/database.sql @@ -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; @@ -428,7 +428,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` ( @@ -436,7 +436,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 , @@ -444,7 +444,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 , @@ -453,7 +453,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 , @@ -462,7 +462,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 , @@ -470,7 +470,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` ( @@ -478,7 +478,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` ( @@ -488,7 +488,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` ( @@ -509,13 +509,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` ( @@ -536,14 +536,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` ( @@ -556,7 +556,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` ( @@ -571,7 +571,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 , @@ -587,13 +587,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` ( @@ -603,6 +603,6 @@ 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; diff --git a/include/diaspora.php b/include/diaspora.php index 320f716bf..5ea38bad5 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -4,6 +4,36 @@ require_once('include/crypto.php'); require_once('include/items.php'); require_once('include/bb2diaspora.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), @@ -866,10 +896,7 @@ 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) { @@ -886,10 +913,8 @@ function diaspora_unshare($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_unshare: returns: ' . $return_code); - return $return_code; + return(diaspora_transmit($owner,$contact,$slap)); + } @@ -937,9 +962,7 @@ function diaspora_send_status($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_status: returns: ' . $return_code); + $return_code = diaspora_transmit($owner,$contact,$slap); if(count($images)) { diaspora_send_images($item,$owner,$contact,$images); @@ -979,12 +1002,11 @@ function diaspora_send_images($item,$owner,$contact,$images) { '$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']))); - post_url($contact['notify'] . '/',$slap); - $return_code = $a->get_curl_code(); - logger('diaspora_send_photo: returns: ' . $return_code); + diaspora_transmit($owner,$contact,$slap); } } @@ -1039,11 +1061,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)); } @@ -1115,10 +1133,7 @@ function diaspora_send_relay($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_relay: returns: ' . $return_code); - return $return_code; + return(diaspora_transmit($owner,$contact,$slap)); } @@ -1138,9 +1153,30 @@ function diaspora_send_retraction($item,$owner,$contact) { $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) { + + $a = get_app(); + post_url($contact['notify'] . '/',$slap); $return_code = $a->get_curl_code(); - logger('diaspora_send_retraction: returns: ' . $return_code); - return $return_code; + logger('diaspora_transmit: returns: ' . $return_code); -} \ No newline at end of file + 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)); +} diff --git a/include/queue.php b/include/queue.php index fb65d5c25..da5028aee 100644 --- a/include/queue.php +++ b/include/queue.php @@ -56,6 +56,7 @@ function queue_run($argv, $argc){ // delivery loop require_once('include/salmon.php'); + require_once('include/diaspora.php'); foreach($r as $q_item) { @@ -120,6 +121,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['notify'],$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); diff --git a/mod/receive.php b/mod/receive.php index b50774933..34128518b 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -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,32 +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); - } - elseif($xmlbase->photo) { - diaspora_photo($importer,$xmlbase->photo,$msg); - } - else { - logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true)); - } + diaspora_dispatch($importer,$msg); http_status_exit(200); // NOTREACHED From 0883a614a288a85b973174a03c9498289e6383dc Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 01:41:27 -0700 Subject: [PATCH 27/64] don't accept pubsub from diaspora --- mod/pubsub.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mod/pubsub.php b/mod/pubsub.php index d6e3d378f..4dff5d531 100644 --- a/mod/pubsub.php +++ b/mod/pubsub.php @@ -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'); From b6fdd3c76bd6d0f30a7973286ef19c10bf6326a6 Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 01:55:34 -0700 Subject: [PATCH 28/64] turn off notifier - runaway --- include/diaspora.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 5ea38bad5..563eaa4e2 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -622,7 +622,7 @@ function diaspora_comment($importer,$xml,$msg) { } // notify others - proc_run('php','include/notifier.php','comment',$message_id); +// proc_run('php','include/notifier.php','comment',$message_id); return; @@ -846,7 +846,7 @@ EOT; } // notify others - proc_run('php','include/notifier.php','comment',$message_id); +// proc_run('php','include/notifier.php','comment',$message_id); return; } From a775474dff73e0e17e95bcfee42caeecdacf5295 Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 04:42:28 -0700 Subject: [PATCH 29/64] cleaned up the conditions on when to and when not to relay. --- include/diaspora.php | 20 ++++++++++++-------- include/items.php | 2 +- include/notifier.php | 32 +++++++++++++++++++++++++++++++- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 563eaa4e2..75d47e05a 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -544,7 +544,6 @@ 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); @@ -619,13 +618,14 @@ function diaspora_comment($importer,$xml,$msg) { dbesc(base64_encode($author_signature)), dbesc($diaspora_handle) ); + + // 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); } - - // notify others -// proc_run('php','include/notifier.php','comment',$message_id); - return; - } function diaspora_photo($importer,$xml,$msg) { @@ -845,8 +845,12 @@ EOT; ); } - // notify others -// proc_run('php','include/notifier.php','comment',$message_id); + // 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; } diff --git a/include/items.php b/include/items.php index 746e3b294..19e56c0b6 100644 --- a/include/items.php +++ b/include/items.php @@ -1556,7 +1556,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']; diff --git a/include/notifier.php b/include/notifier.php index 1c8245c7a..7b645844f 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -150,7 +150,37 @@ function notifier_run($argv, $argc){ $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; $public_message = false; // not public From d6f9e0e2a4864a7e7de48f40c8da676c870db6bc Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 05:58:31 -0700 Subject: [PATCH 30/64] change the way public feeds work just to fix statusnet's bug, because they won't --- include/items.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/include/items.php b/include/items.php index 19e56c0b6..150be2707 100644 --- a/include/items.php +++ b/include/items.php @@ -12,6 +12,18 @@ 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; + } + } + + $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 +41,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 +93,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,6 +101,11 @@ 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`, @@ -152,7 +169,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']) From 1f5a67c81fb8e0c46cf5636d736dada8a73822bb Mon Sep 17 00:00:00 2001 From: Olivier Migeot Date: Wed, 24 Aug 2011 17:47:21 +0200 Subject: [PATCH 31/64] French translation up to date. --- view/fr/messages.po | 2917 ++++++++++++++++++++++++++++++++++++------- view/fr/strings.php | 328 ++++- 2 files changed, 2755 insertions(+), 490 deletions(-) diff --git a/view/fr/messages.po b/view/fr/messages.po index e1dc4b867..d6bd55f00 100644 --- a/view/fr/messages.po +++ b/view/fr/messages.po @@ -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 \n" "Language-Team: LANGUAGE \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 publics 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 publics 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 public profile.
    It may " "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 Creative Commons Attribution 3.0 license." @@ -1128,20 +1311,28 @@ msgstr "" "creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0." #: ../../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 'pseudo@$sitename'." #: ../../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 " (Optional) Allow this OpenID to login to this account." msgstr " (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 not published." msgstr "Ce profil n'est pas publié." #: ../../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 this profile." @@ -2287,23 +2634,28 @@ msgstr "" "ce 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 "%2$d people like this." msgstr "%2$d personnes 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 "%2$d people don't like this." msgstr "%2$d personnes ,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 Creative Commons Attribution " @@ -3114,7 +3576,7 @@ msgstr "" "href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons " "Attribution 3.0" -#: ../../mod/friendika.php:17 +#: ../../mod/friendika.php:17 ../../mod/friendika.php:47 msgid "" "Please visit Project.Friendika.com to learn more about the Friendika project." @@ -3122,11 +3584,11 @@ msgstr "" "Pour en savoir plus, vous pouvez nous rendre visite sur Project.Friendika.com" -#: ../../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 " Status:" msgstr " 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 " Marital Status:" msgstr " 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 Settings page after " @@ -3827,12 +4334,14 @@ msgstr "" "Votre mot de passe peut être changé depuis la page Réglages, 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 réputation." -#: ../../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 "" +"WARNING: This is highly advanced and if you enter incorrect " +"information your communications with this contact will stop working." +msgstr "" +"ATTENTION: Ceci est à réserver aux utilisateurs avancés et pourrait " +"bloquer vos communications avec ce contact en cas d'erreur." + +#: ../../mod/crepair.php:77 +msgid "" +"Please use your browser 'Back' button now if you are " +"uncertain what to do on this page." +msgstr "" +"Merci d'utiliser le bouton 'Précédent' tout de suite 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 everybody" +msgstr "Visible par tout le monde" + +#: ../../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 Piwik " +"analytics tool." +msgstr "" +"Ce site construit ses statistiques grâce à Piwik." + +#: ../../addon/piwik/piwik.php:73 +#, php-format +msgid "" +"If you do not want that your visits are logged this way you can " +"set a cookie to prevent Piwik from tracking further visits of the site " +"(opt-out)." +msgstr "" +"Si vous ne souhaitez pas que vos visites soient comptabilisées de cette " +"manière, vous pouvez activer un cookie qui internet à Piwik " +"d'en tenir compte à l'avenir (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 may be publicly visible, depending on " +"your privacy settings for this website/account." +msgstr "" +"Les éléments liés depuis Facebook pourront ê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 public 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 publiques 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!
    Please add at least the " +"owner 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!
    Merci d'ajouter " +"au moins le propriétaire à 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.
    The provided API URL is not " +"valid." +msgstr "" +"Merci de contacter l'administrateur.
    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 public 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 publiques 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 Settings page - change your initial password. Also make a " +"note of your Identity Address. This will be useful in making friends." +msgstr "" +"Sur votre page Réglages - 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 default 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 par défaut à 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 Connect 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 Relier." + +#: ../../mod/newmember.php:36 +msgid "" +"The Directory page lets you find other people in this network or other " +"federated sites. Look for a Connect or Follow 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é " +"Relier, Connect ou Follow 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 help pages may be consulted for detail on other program " +"features and resources." +msgstr "" +"Nos pages d'aide 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 n 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" diff --git a/view/fr/strings.php b/view/fr/strings.php index f2f27b0f4..cbed6eec4 100644 --- a/view/fr/strings.php +++ b/view/fr/strings.php @@ -1,7 +1,7 @@ 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["WARNING: This is highly advanced and if you enter incorrect information your communications with this contact will stop working."] = "ATTENTION: Ceci est à réserver aux utilisateurs avancés et pourrait bloquer vos communications avec ce contact en cas d'erreur."; +$a->strings["Please use your browser 'Back' button now if you are uncertain what to do on this page."] = "Merci d'utiliser le bouton 'Précédent' tout de suite 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 everybody"] = "Visible par tout le monde"; +$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 Piwik analytics tool."] = "Ce site construit ses statistiques grâce à Piwik."; +$a->strings["If you do not want that your visits are logged this way you can set a cookie to prevent Piwik from tracking further visits of the site (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient comptabilisées de cette manière, vous pouvez activer un cookie qui internet à Piwik d'en tenir compte à l'avenir (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 may be publicly visible, depending on your privacy settings for this website/account."] = "Les éléments liés depuis Facebook pourront ê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 public 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 publiques 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!
    Please add at least the owner 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!
    Merci d'ajouter au moins le propriétaire à 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.
    The provided API URL is not valid."] = "Merci de contacter l'administrateur.
    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 public 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 publiques 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 Settings page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Sur votre page Réglages - 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 default profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Pensez à éditer votre profil par défaut à 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 Connect 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 Relier."; +$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a Connect or Follow 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é Relier, Connect ou Follow 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 help pages may be consulted for detail on other program features and resources."] = "Nos pages d'aide 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 n 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"; From d51d42b7d4b5bc6b3b6c4273c794a5a011507d7f Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 15:55:27 -0700 Subject: [PATCH 32/64] revup --- boot.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 16b8f9c85..eddcdf153 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1081' ); +define ( 'FRIENDIKA_VERSION', '2.2.1082' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1082 ); From 8f6ae2b66044a36996ac92a8db1a540db9c71fe3 Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 20:40:08 -0700 Subject: [PATCH 33/64] missing salmon key? report it. --- include/auth.php | 6 ++++-- include/queue.php | 5 +++-- include/salmon.php | 7 +++++++ mod/openid.php | 3 ++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/auth.php b/include/auth.php index 768af626f..b7b96bdc0 100644 --- a/include/auth.php +++ b/include/auth.php @@ -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/queue.php b/include/queue.php index da5028aee..fe96a75ce 100644 --- a/include/queue.php +++ b/include/queue.php @@ -83,7 +83,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)) { @@ -124,7 +125,7 @@ function queue_run($argv, $argc){ case NETWORK_DIASPORA: if($contact['notify']) { logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']); - $deliver_status = diaspora_transmit($owner,$contact['notify'],$data); + $deliver_status = diaspora_transmit($owner,$contact,$data); if($deliver_status == (-1)) update_queue_time($q_item['id']); diff --git a/include/salmon.php b/include/salmon.php index 4043b4f1d..ba61fffcc 100644 --- a/include/salmon.php +++ b/include/salmon.php @@ -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 diff --git a/mod/openid.php b/mod/openid.php index 6fbd013b8..3c3293147 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -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)) { From 74d61ed00b9ff6fe768d4a0f4a27da246020c270 Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 22:40:26 -0700 Subject: [PATCH 34/64] contact menu beginnings --- include/Contact.php | 52 +++++++++++++++++++++++++++++++ mod/contacts.php | 1 + view/contact_template.tpl | 12 ++++++- view/theme/duepuntozero/style.css | 31 ++++++++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) diff --git a/include/Contact.php b/include/Contact.php index 4ca77d065..6eda0b6c5 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -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/' . $cid; + $posts_link = $a->get_baseurl() . '/network/?cid=' . $cid; + + $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 .= "
  • $k
  • \n"; + } + return $o; +}} diff --git a/mod/contacts.php b/mod/contacts.php index 4d9385026..6863bd737 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -422,6 +422,7 @@ 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, diff --git a/view/contact_template.tpl b/view/contact_template.tpl index e9f616760..a74cebab5 100644 --- a/view/contact_template.tpl +++ b/view/contact_template.tpl @@ -12,8 +12,18 @@
    -
    +
    + $name + + menu +
    +
      + $contact_photo_menu +
    +
    +
    diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 5943e5061..66e9f857e 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -744,6 +744,7 @@ input#dfrn-url { .contact-entry-wrapper { float: left; width: 180px; + height: 120px; } .contact-entry-direction-icon { @@ -1458,6 +1459,36 @@ input#dfrn-url { /*margin-left: 50px;*/ } + +.contact-photo-menu-button { + display: block; +/* 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: 60px; left:10px; + overflow: hidden; + text-indent: 40px; + display: none; + +} +.contact-photo-menu { + width: auto; + border: 2px solid #444444; + background: #FFFFFF; +/* position: absolute; */ + left: 10px; 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; From 71fc694c6715601f8d9cabcb1835c66a23aea4ca Mon Sep 17 00:00:00 2001 From: Friendika Date: Wed, 24 Aug 2011 23:20:04 -0700 Subject: [PATCH 35/64] contact photo menu --- include/Contact.php | 4 ++-- view/contact_template.tpl | 15 ++------------- view/theme/duepuntozero/style.css | 14 +++++++------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index 6eda0b6c5..7524c0cea 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -114,8 +114,8 @@ function contact_photo_menu($contact) { $pm_url = $a->get_baseurl() . '/message/new/' . $contact['id']; } - $contact_url = $a->get_baseurl() . '/contacts/' . $cid; - $posts_link = $a->get_baseurl() . '/network/?cid=' . $cid; + $contact_url = $a->get_baseurl() . '/contacts/' . $contact['id']; + $posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['id']; $menu = Array( t("View status") => $status_link, diff --git a/view/contact_template.tpl b/view/contact_template.tpl index a74cebab5..2fa167feb 100644 --- a/view/contact_template.tpl +++ b/view/contact_template.tpl @@ -1,23 +1,12 @@
    -
    -
    - $alt_text -
    -
    -
    - -
    -
    -
    -
    + 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)" > $name - menu + menu
      $contact_photo_menu diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 66e9f857e..e3c643bfc 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -743,7 +743,7 @@ input#dfrn-url { .contact-entry-wrapper { float: left; - width: 180px; + width: 120px; height: 120px; } @@ -760,7 +760,7 @@ input#dfrn-url { } .contact-entry-name { float: left; - margin-left: 30px; + margin-left: 0px; } .contact-entry-edit-links { margin-top: 6px; @@ -778,6 +778,7 @@ input#dfrn-url { } .contact-entry-photo { float: left; + position: relative; } .contact-entry-end { clear: both; @@ -1461,15 +1462,14 @@ input#dfrn-url { .contact-photo-menu-button { - display: block; -/* position: absolute; */ + 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: 60px; left:10px; + top: 64px; left:0px; overflow: hidden; text-indent: 40px; display: none; @@ -1479,8 +1479,8 @@ input#dfrn-url { width: auto; border: 2px solid #444444; background: #FFFFFF; -/* position: absolute; */ - left: 10px; top: 90px; + position: absolute; + left: 0px; top: 90px; display: none; z-index: 10000; } From 83605cf3dc03be7c2ddad48d04aede90d68069e3 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 05:15:05 -0700 Subject: [PATCH 36/64] theme settings for contact photo menu --- mod/contacts.php | 2 +- view/theme/dispy/photo-menu.jpg | Bin 0 -> 459 bytes view/theme/dispy/style.css | 36 +++++++++++++++++++++++++++++- view/theme/duepuntozero/style.css | 2 ++ view/theme/loozah/style.css | 35 +++++++++++++++++++++++++++-- 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 view/theme/dispy/photo-menu.jpg diff --git a/mod/contacts.php b/mod/contacts.php index 6863bd737..8f851e9e0 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -427,7 +427,7 @@ function contacts_content(&$a) { '$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 diff --git a/view/theme/dispy/photo-menu.jpg b/view/theme/dispy/photo-menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fde5eb53524ddb12ec5642f33d0d34e14e256193 GIT binary patch literal 459 zcmex=&g!NbMF!_CFb&C4ewz{@Ad$IUGuCLky*A}T7%!!Ir&CL$pu zA}RthgpnDjhlQ1sm6cP3mz!6FWbpq0gCGZk0D}NCqY?v?AS1IN>UQrQGDKoE6M2QoDc3G+f#K-Lz&!r^Qc^B##H0%WszGMCU1W znAE#pe4KOt&Ml**OEy0VoUS}?d3@zno#;NjlP3257arA~E4nCar)(9G=iXTV|0V#| C@@!oI literal 0 HcmV?d00001 diff --git a/view/theme/dispy/style.css b/view/theme/dispy/style.css index e9d11d601..aa8d82bbb 100644 --- a/view/theme/dispy/style.css +++ b/view/theme/dispy/style.css @@ -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; @@ -720,6 +725,35 @@ div[id$="wrapper"] br { clear: left; } #contact-edit-poll-text { display: inline; } #contact-edit-end { clear: both; } +.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 */ diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index e3c643bfc..6ac28cb95 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -761,6 +761,8 @@ input#dfrn-url { .contact-entry-name { float: left; margin-left: 0px; + width: 120px; + overflow: hidden; } .contact-entry-edit-links { margin-top: 6px; diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css index c58bda5bb..74d9058f7 100644 --- a/view/theme/loozah/style.css +++ b/view/theme/loozah/style.css @@ -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; @@ -884,6 +888,33 @@ input#dfrn-url { clear: both; } +.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; From 1b33ba6587766d939ac37c1ca60aa5c012e4da9d Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 06:01:40 -0700 Subject: [PATCH 37/64] third attempt to get rid of this stupid warning --- include/network.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/network.php b/include/network.php index f0dd828d1..691a8c9f9 100644 --- a/include/network.php +++ b/include/network.php @@ -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); } From 21c03fb5220d2190a8a764d5430c6fa8bc013860 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 16:37:27 -0700 Subject: [PATCH 38/64] diaspora2bb, salmon fix argument error --- boot.php | 2 +- include/bb2diaspora.php | 19 +++++++++++++++ include/diaspora.php | 54 ++--------------------------------------- include/salmon.php | 6 ++--- 4 files changed, 25 insertions(+), 56 deletions(-) diff --git a/boot.php b/boot.php index eddcdf153..e897f19aa 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1082' ); +define ( 'FRIENDIKA_VERSION', '2.2.1083' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1082 ); diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index 5ce34d666..7f7b8748d 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -5,6 +5,25 @@ 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('/\[(.+?)\]\((.+?)\)/','[url=$2]$1[/url]',$s); + + $s = escape_tags($s); + return $s; + +} + + function stripdcode_br_cb($s) { return '[code]' . str_replace('
      ', '', $s[1]) . '[/code]'; } diff --git a/include/diaspora.php b/include/diaspora.php index 75d47e05a..90c802363 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -435,32 +435,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('#]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s', - '[youtube]$1[/youtube]', $body); - - $body = preg_replace('#].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?#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']; @@ -558,32 +533,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('#]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?#s', - '[youtube]$1[/youtube]', $body); - - $body = preg_replace('#].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?#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; diff --git a/include/salmon.php b/include/salmon.php index ba61fffcc..9153f8994 100644 --- a/include/salmon.php +++ b/include/salmon.php @@ -109,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'); From 99ea045723b89a312db5227f0036c76d481e58a1 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 18:12:42 -0700 Subject: [PATCH 39/64] some minor work on contact edit page --- include/contact_selectors.php | 15 +++++++++++++-- mod/contacts.php | 7 ++++++- view/contact_edit.tpl | 7 +++++-- view/theme/dispy/style.css | 2 +- view/theme/duepuntozero/style.css | 7 +++++++ view/theme/loozah/style.css | 6 ++++++ 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/include/contact_selectors.php b/include/contact_selectors.php index ac1e38e4f..1303acf74 100644 --- a/include/contact_selectors.php +++ b/include/contact_selectors.php @@ -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 .= '" . "\r\n"; $rep = array( 0 => t('Frequently'), @@ -67,3 +68,13 @@ function contact_poll_interval($current) { $o .= "\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); + +} diff --git a/mod/contacts.php b/mod/contacts.php index 8f851e9e0..5d72cff88 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -292,6 +292,9 @@ function contacts_content(&$a) { $lblsuggest = (($r[0]['network'] === NETWORK_DFRN) ? '' : ''); + $poll_enabled = (($r[0]['network'] !== NETWORK_DIASPORA) ? true : false); + + $nettype = '
      ' . sprintf( t('Network type: %s'),network_to_name($r[0]['network'])) . '
      '; $o .= replace_macros($tpl,array( '$header' => t('Contact Editor'), @@ -312,7 +315,9 @@ function contacts_content(&$a) { '$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, diff --git a/view/contact_edit.tpl b/view/contact_edit.tpl index 66479210f..0ee88d372 100644 --- a/view/contact_edit.tpl +++ b/view/contact_edit.tpl @@ -3,6 +3,8 @@
      $name
      +$nettype +
      @@ -28,13 +30,14 @@
    - + {{ if $poll_enabled }}
    $lastupdtext$last_update
    $updpub
    $poll_interval - +
    + {{ endif }}
    diff --git a/view/theme/dispy/style.css b/view/theme/dispy/style.css index aa8d82bbb..78efb57ff 100644 --- a/view/theme/dispy/style.css +++ b/view/theme/dispy/style.css @@ -723,7 +723,7 @@ 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; diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index 6ac28cb95..f47af934c 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -788,6 +788,7 @@ input#dfrn-url { #contact-edit-end { clear: both; + margin-bottom: 65px; } #fsuggest-desc, #fsuggest-submit-wrapper { @@ -1378,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; diff --git a/view/theme/loozah/style.css b/view/theme/loozah/style.css index 74d9058f7..781526eae 100644 --- a/view/theme/loozah/style.css +++ b/view/theme/loozah/style.css @@ -886,6 +886,7 @@ input#dfrn-url { #contact-edit-end { clear: both; + margin-bottom: 65px; } .contact-photo-menu-button { @@ -1451,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; From 5eb08d43b6f78b1aec5f40d4a53725e713cfd9b5 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 20:09:32 -0700 Subject: [PATCH 40/64] tweak to bbcode linkificator --- include/bbcode.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bbcode.php b/include/bbcode.php index 3619015ca..6c26dabfe 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -41,7 +41,7 @@ function bbcode($Text,$preserve_nl = false) { // Perform URL Search - $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+\,]+)/", ' $2', $Text); + $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\%\$\!\+\,]+)/", ' $1$2', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '$1', $Text); $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '$2', $Text); From c15c53d307f1b298e6140e33dfbd859a68d0b5f9 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 20:12:56 -0700 Subject: [PATCH 41/64] one more little tweak to linkificator --- include/bbcode.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/bbcode.php b/include/bbcode.php index 6c26dabfe..c05c36938 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -41,7 +41,7 @@ function bbcode($Text,$preserve_nl = false) { // Perform URL Search - $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\%\$\!\+\,]+)/", ' $1$2', $Text); + $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\%\$\!\+\,]+)/", '$1$2', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '$1', $Text); $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '$2', $Text); From a4739aef915c0083bc2020c66fe5361018259e00 Mon Sep 17 00:00:00 2001 From: Friendika Date: Thu, 25 Aug 2011 20:35:55 -0700 Subject: [PATCH 42/64] more logging diaspora pubdeliver --- include/notifier.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 7b645844f..1acb6d71f 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -657,11 +657,18 @@ function notifier_run($argv, $argc){ break; case NETWORK_DIASPORA : require_once('include/diaspora.php'); - if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) + + logger('notifier: diaspora pubdelivery: ' . $contact['name']); + + if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) { + logger('notifier: diaspora pubdelivery not allowed at this time'); break; + } - if(! $contact['pubkey']) + if(! $contact['pubkey']) { + logger('notifier: diaspora pubdelivery: no pubkey'); break; + } if($target_item['verb'] === ACTIVITY_DISLIKE) { // unsupported From 1861dc1fae549a0ee2b6287d4f7dc7f8797f5070 Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 01:32:22 -0700 Subject: [PATCH 43/64] don't allow fullscreen for youtube iframe - this makes it hard to visit the network page when they throw an error --- include/bbcode.php | 2 +- include/notifier.php | 8 ++++++-- include/queue.php | 28 +++++++++++++++++++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/include/bbcode.php b/include/bbcode.php index c05c36938..a3f2971e5 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -134,7 +134,7 @@ function bbcode($Text,$preserve_nl = false) { // 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\]/", '', $Text); + $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); } // $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); diff --git a/include/notifier.php b/include/notifier.php index 1acb6d71f..e92a4f6a8 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -641,15 +641,19 @@ function notifier_run($argv, $argc){ /* Don't deliver to folks who have already been delivered to */ - if(in_array($rr['id'],$conversants)) + if(in_array($rr['id'],$conversants)) { + logger('notifier: already delivered id=' . $rr['id']); continue; + } $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", - intval($rr['id']) + intval($rr['id']) ); if(count($n)) { $contact = $n[0]; + logger('pubdeliver: network: ' . $contact['network']); + switch($contact['network']) { case NETWORK_DFRN : logger('notifier: dfrnpubdelivery: ' . $contact['name']); diff --git a/include/queue.php b/include/queue.php index fe96a75ce..f1bcf2e9f 100644 --- a/include/queue.php +++ b/include/queue.php @@ -29,6 +29,11 @@ function queue_run($argv, $argc){ load_hooks(); + if($argc > 1) + $queue_id = intval($argv[1]); + else + $queue_id = 0; + $deadguys = array(); logger('queue: start'); @@ -44,13 +49,19 @@ 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 @@ -63,9 +74,16 @@ function queue_run($argv, $argc){ // 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; From 506853adcdc0229c5b1b9c96e319f99c589c967f Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 07:29:22 -0700 Subject: [PATCH 44/64] break up delivery into per-person processes --- include/delivery.php | 420 +++++++++++++++++++++++++++++++++++++++++++ include/diaspora.php | 54 +++--- include/notifier.php | 144 ++++++--------- 3 files changed, 503 insertions(+), 115 deletions(-) create mode 100644 include/delivery.php diff --git a/include/delivery.php b/include/delivery.php new file mode 100644 index 000000000..be4f3978c --- /dev/null +++ b/include/delivery.php @@ -0,0 +1,420 @@ +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]); + + 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 * FROM `item` 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']) + $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 = '' . xmlify($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 .= '' . "\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 . ''; + 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(); +} diff --git a/include/diaspora.php b/include/diaspora.php index 90c802363..bb4bd98c7 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1035,14 +1035,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; @@ -1056,12 +1048,37 @@ function diaspora_send_relay($item,$owner,$contact) { $text = bb2diaspora($item['body']); - // sign it + // fetch the original signature if somebody sent the post to us to relay + // if we are relaying for a reply originating here, 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 - if($like) - $parent_signed_text = $orig_sign['signed_text']; - else - $parent_signed_text = $orig_sign['signed_text']; + $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']; + } + 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) + ); + + } + + // sign it $parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha')); @@ -1071,18 +1088,11 @@ 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($myaddr) )); - // 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']))); diff --git a/include/notifier.php b/include/notifier.php index e92a4f6a8..1a3b321cf 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -1,4 +1,5 @@ $birthday )); - if($cmd === 'mail') { + if($mail) { $public_message = false; // mail is not public $body = fix_private_photos($item['body'],$owner['uid']); @@ -286,7 +290,7 @@ function notifier_run($argv, $argc){ '$parent_id' => xmlify($item['parent-uri']) )); } - elseif($cmd === 'suggest') { + elseif($fsuggest) { $public_message = false; // suggestions are not public $sugg_template = get_markup_template('atom_suggest.tpl'); @@ -383,8 +387,23 @@ function notifier_run($argv, $argc){ 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)) { + $interval = intval(get_config('system','delivery_interval')); + if(! $interval) + $interval = 2; + + proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); + sleep($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']); @@ -589,52 +608,19 @@ function notifier_run($argv, $argc){ } } - if((strlen($hub)) && ($public_message)) { - $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($public_message) { - /** - * - * 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 or Diaspora. - * 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. - * - */ - $r = q("SELECT `id`, `name` FROM `contact` WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 - AND `rel` != %d ", + 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)); foreach($r as $rr) { @@ -646,63 +632,35 @@ function notifier_run($argv, $argc){ continue; } - $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", - intval($rr['id']) - ); + if((! $mail) && (! $fsuggest) && (! $followup)) { + $interval = intval(get_config('system','delivery_interval')); + if(! $interval) + $interval = 2; - if(count($n)) { - $contact = $n[0]; - logger('pubdeliver: network: ' . $contact['network']); - - switch($contact['network']) { - case NETWORK_DFRN : - logger('notifier: dfrnpubdelivery: ' . $contact['name']); - $deliver_status = dfrn_deliver($owner,$contact,$atom); - break; - case NETWORK_DIASPORA : - require_once('include/diaspora.php'); - - logger('notifier: diaspora pubdelivery: ' . $contact['name']); - - if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) { - logger('notifier: diaspora pubdelivery not allowed at this time'); - break; - } - - if(! $contact['pubkey']) { - logger('notifier: diaspora pubdelivery: no pubkey'); - break; - } - - if($target_item['verb'] === ACTIVITY_DISLIKE) { - // unsupported - break; - } - elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { - // diaspora delete, - diaspora_send_retraction($target_item,$owner,$contact); - break; - } - elseif($followup) { - // send comments, likes and retractions of likes to owner to relay - diaspora_send_followup($target_item,$owner,$contact); - break; - } - elseif($target_item['parent'] != $target_item['id']) { - // we are the relay - send comments, likes and unlikes to our conversants - diaspora_send_relay($target_item,$owner,$contact); - break; - } - elseif($top_level) { - diaspora_send_status($target_item,$owner,$contact); - break; - } - default: - break; - } + proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']); + sleep($interval); + continue; } } } + + + 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; From fcf45db075e13d7889715b715406abbccf012fc8 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 26 Aug 2011 16:35:51 +0200 Subject: [PATCH 45/64] API: fix friends profile, statuses etc --- include/api.php | 115 +++++++++++++++++++++++++++++++----------------- 1 file changed, 75 insertions(+), 40 deletions(-) diff --git a/include/api.php b/include/api.php index aa42313b2..1f58a6baa 100644 --- a/include/api.php +++ b/include/api.php @@ -1,6 +1,7 @@ $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); @@ -131,7 +133,7 @@ return ''."\n".$r; break; case "json": - header ("Content-Type: application/json"); + //header ("Content-Type: application/json"); foreach($r as $rr) return json_encode($rr); break; @@ -193,6 +195,7 @@ * Returns user info array. */ function api_get_user(&$a, $contact_id = Null){ + global $called_api; $user = null; $extra_query = ""; @@ -209,16 +212,20 @@ 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()); } } @@ -301,6 +308,7 @@ } $ret = Array( + 'self' => intval($uinfo[0]['self']), 'uid' => intval($uinfo[0]['uid']), 'id' => intval($uinfo[0]['cid']), 'name' => $uinfo[0]['name'], @@ -321,7 +329,7 @@ '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', @@ -616,6 +624,7 @@ $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); @@ -664,6 +673,12 @@ $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); @@ -672,6 +687,7 @@ $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`, @@ -679,14 +695,15 @@ `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) ); @@ -711,33 +728,41 @@ if (local_user()===false) return false; $user_info = api_get_user($a); - // get last newtork messages + // in friendika starred item are private + // return favorites only for self + logger('api_favorites: self:' . $user_info['self']); - // params - $count = (x($_GET,'count')?$_GET['count']:20); - $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0); - if ($page<0) $page=0; + 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); - $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){ @@ -762,6 +787,7 @@ $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']), @@ -819,15 +845,21 @@ 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') @@ -845,15 +877,18 @@ } - $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); From 8438da7d70561c2c07356a0f1b1be6e6880b8de1 Mon Sep 17 00:00:00 2001 From: fabrixxm Date: Fri, 26 Aug 2011 16:36:02 +0200 Subject: [PATCH 46/64] Small fix to IT strings --- view/it/messages.po | 6 +++--- view/it/strings.php | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/view/it/messages.po b/view/it/messages.po index 6b28ba782..290e22f7b 100644 --- a/view/it/messages.po +++ b/view/it/messages.po @@ -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-08-26 14:28+0000\n" "Last-Translator: fabrixxm \n" "Language-Team: Italian (http://www.transifex.net/projects/p/friendika/team/it/)\n" "MIME-Version: 1.0\n" @@ -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 diff --git a/view/it/strings.php b/view/it/strings.php index 9e3a2262f..1d6ba3dc0 100644 --- a/view/it/strings.php +++ b/view/it/strings.php @@ -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 'nickname@\$sitename'."] = "Scegli un soprannome. Deve cominciare con un carattere. L'indirizzo del tuo profilo sarà 'soprannome@\$sitename'."; $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"; From 144f241c5daa56428113dd53138002f40fd7cb44 Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 15:21:21 -0700 Subject: [PATCH 47/64] fix bad embeds --- boot.php | 2 +- include/conversation.php | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index e897f19aa..41951b06b 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1083' ); +define ( 'FRIENDIKA_VERSION', '2.2.1084' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1082 ); diff --git a/include/conversation.php b/include/conversation.php index 0d901a3c0..3353cb2b7 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -80,6 +80,9 @@ function localize_item(&$item){ } + // fix bad embeds + $item['body'] = str_replace('http://www.youtube.com/embed/http:','http:',$item['body']); + } /** From 721db93e8450eb051f98a9a0b12db476d3cc3dfc Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 17:52:24 -0700 Subject: [PATCH 48/64] check for existing diaspora comment before accepting, add 'Diaspora' app to item, use html_entity_decode so quotes don't get messed up --- include/diaspora.php | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index bb4bd98c7..e3ab9458d 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -453,6 +453,7 @@ function diaspora_post($importer,$xml) { $datarray['author-link'] = $contact['url']; $datarray['author-avatar'] = $contact['thumb']; $datarray['body'] = $body; + $datarray['app'] = 'Diaspora'; item_store($datarray); @@ -483,6 +484,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('daspora_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) @@ -558,6 +568,7 @@ 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); @@ -776,6 +787,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; @@ -897,7 +910,8 @@ function diaspora_send_status($item,$owner,$contact) { } } - $body = xmlify(bb2diaspora($body)); + $body = xmlify(html_entity_decode(bb2diaspora($body))); + $public = (($item['private']) ? 'false' : 'true'); require_once('include/datetime.php'); @@ -990,7 +1004,7 @@ function diaspora_send_followup($item,$owner,$contact) { $like = false; } - $text = bb2diaspora($item['body']); + $text = html_entity_decode(bb2diaspora($item['body'])); // sign it @@ -1046,7 +1060,7 @@ function diaspora_send_relay($item,$owner,$contact) { $like = false; } - $text = bb2diaspora($item['body']); + $text = html_entity_decode(bb2diaspora($item['body'])); // fetch the original signature if somebody sent the post to us to relay // if we are relaying for a reply originating here, there wasn't a 'send to relay' From f48a758a1e8bce122957fb2fc4c65966290cfead Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 21:37:00 -0700 Subject: [PATCH 49/64] typo in update script --- update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.php b/update.php index ef036008f..d92b1dd91 100644 --- a/update.php +++ b/update.php @@ -676,7 +676,7 @@ function update_1080() { } function update_1081() { - q("ALTER TABLE `photo` ADD `guid` CHAR( 64 ) NOT NULL AFTER `contact`id`, + q("ALTER TABLE `photo` ADD `guid` CHAR( 64 ) NOT NULL AFTER `contact-id`, ADD INDEX ( `guid` ) "); $r = q("SELECT distinct(`resource-id`) FROM `photo` WHERE 1 group by `id`"); if(count($r)) { From e3dbb6339386fce5cef2d22be6edd63b93a9b41d Mon Sep 17 00:00:00 2001 From: Friendika Date: Fri, 26 Aug 2011 21:51:12 -0700 Subject: [PATCH 50/64] fix any update issues that may arise from update 1081 --- boot.php | 2 +- update.php | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index 41951b06b..cb18b0560 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.2.1084' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1082 ); +define ( 'DB_UPDATE_VERSION', 1083 ); define ( 'EOL', "
    \r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/update.php b/update.php index d92b1dd91..c23ce95c6 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Sat, 27 Aug 2011 18:09:43 -0700 Subject: [PATCH 51/64] remove public disclosure risk --- boot.php | 2 +- include/crypto.php | 65 ++++++++++++++++++++++++++++++++++++++++++++++ mod/network.php | 2 +- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/boot.php b/boot.php index cb18b0560..58d6cc839 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1084' ); +define ( 'FRIENDIKA_VERSION', '2.2.1085' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1083 ); diff --git a/include/crypto.php b/include/crypto.php index a20606db5..88e05b9eb 100644 --- a/include/crypto.php +++ b/include/crypto.php @@ -225,3 +225,68 @@ 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); +} + + +function zot_encapsulate($data,$sender,$pubkey) { +$res = aes_encapsulate($data,$pubkey); +openssl_public_encrypt($sender,$s,$pubkey); +$s1 = base64url_encode($s,true); + +return <<< EOT + + + {$res['key']} + {$res['iv']} + $s1 + AES-256-CBC + {$res['data']} + +EOT; + +} + +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/mod/network.php b/mod/network.php index 05b74b50a..54fb2a0a4 100644 --- a/mod/network.php +++ b/mod/network.php @@ -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 = '

    ' . t('Contact: ') . $r[0]['name'] . '

    ' . $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); } From 41b00a6f3b6e46b4886e91069109b538f7596b12 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 05:00:30 -0700 Subject: [PATCH 52/64] allow comment relaying for comments which were never Diaspora signed --- include/diaspora.php | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/include/diaspora.php b/include/diaspora.php index e3ab9458d..9a43c7b07 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -3,6 +3,7 @@ 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) { @@ -1060,10 +1061,22 @@ function diaspora_send_relay($item,$owner,$contact) { $like = false; } + $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. + } + } + $text = html_entity_decode(bb2diaspora($item['body'])); // fetch the original signature if somebody sent the post to us to relay - // if we are relaying for a reply originating here, there wasn't a 'send to relay' + // If we are relaying for a reply originating here, 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 @@ -1076,6 +1089,10 @@ function diaspora_send_relay($item,$owner,$contact) { $authorsig = $orig_sign['signature']; } else { + + + + if($like) $signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr; else From 4572f32603905de369b82e02a6776d25877bec33 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 05:04:49 -0700 Subject: [PATCH 53/64] cleanup --- include/diaspora.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 9a43c7b07..10b342289 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1061,6 +1061,8 @@ function diaspora_send_relay($item,$owner,$contact) { $like = false; } + $body = $item['body']; + $itemcontact = q("select * from contact where `id` = %d limit 1", intval($item['contact-id']) ); @@ -1069,11 +1071,11 @@ function diaspora_send_relay($item,$owner,$contact) { $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. + $body = $prefix . $body; } } - $text = html_entity_decode(bb2diaspora($item['body'])); + $text = html_entity_decode(bb2diaspora($body)); // fetch the original signature if somebody sent the post to us to relay // If we are relaying for a reply originating here, there wasn't a 'send to relay' From f29f228463d35f574d6d285be0cf337b7d39c541 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 19:22:27 -0700 Subject: [PATCH 54/64] bring Diaspora message signing back to the source author - whether they like it or not. --- boot.php | 2 +- include/delivery.php | 5 ++++- include/diaspora.php | 53 ++++++++++++++++++++++---------------------- include/items.php | 48 ++++++++++++++++++++++++++++++++++++--- include/notifier.php | 3 ++- mod/item.php | 29 ++++++++++++++++++++++++ 6 files changed, 107 insertions(+), 33 deletions(-) diff --git a/boot.php b/boot.php index 58d6cc839..060bd7117 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1085' ); +define ( 'FRIENDIKA_VERSION', '2.2.1086' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1083 ); diff --git a/include/delivery.php b/include/delivery.php index be4f3978c..0df8ea7e4 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -77,7 +77,10 @@ function delivery_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) ); diff --git a/include/diaspora.php b/include/diaspora.php index 10b342289..6cba0ecec 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1063,18 +1063,6 @@ function diaspora_send_relay($item,$owner,$contact) { $body = $item['body']; - $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; - } - } - $text = html_entity_decode(bb2diaspora($body)); // fetch the original signature if somebody sent the post to us to relay @@ -1092,23 +1080,34 @@ function diaspora_send_relay($item,$owner,$contact) { } 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) + $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) + ); + + } } // sign it diff --git a/include/items.php b/include/items.php index 150be2707..e9594cff2 100644 --- a/include/items.php +++ b/include/items.php @@ -112,8 +112,10 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) `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' ) @@ -363,6 +365,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. */ @@ -659,6 +673,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']) @@ -835,6 +858,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 */ @@ -1670,10 +1703,19 @@ function atom_entry($item,$type,$author,$owner,$comment = false) { $o .= '1' . "\r\n"; if($item['extid']) - $o .= '' . $item['extid'] . '' . "\r\n"; + $o .= '' . xmlify($item['extid']) . '' . "\r\n"; if($item['app']) - $o .= ''; + $o .= '' . "\r\n"; + + if($item['guid']) + $o .= '' . $item['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 .= '' . xmlify($sign) . '' . "\r\n"; + } + $verb = construct_verb($item); $o .= '' . xmlify($verb) . '' . "\r\n"; $actobj = construct_activity_object($item); diff --git a/include/notifier.php b/include/notifier.php index 1a3b321cf..b87aa95b1 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -109,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) ); diff --git a/mod/item.php b/mod/item.php index ef0b232d5..dd42014eb 100644 --- a/mod/item.php +++ b/mod/item.php @@ -15,6 +15,8 @@ * */ +require_once('include/crypto.php'); + function item_post(&$a) { if((! local_user()) && (! remote_user())) @@ -674,6 +676,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 +822,12 @@ function item_post(&$a) { } } + + + + + + logger('post_complete'); // figure out how to return, depending on from whence we came From 846c4cea7c0e3868a63a187ee9a504a031b2a7e4 Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 21:41:42 -0700 Subject: [PATCH 55/64] implement delivery queue in case notifier gets killed --- boot.php | 2 +- database.sql | 6 ++++++ include/delivery.php | 6 ++++++ include/diaspora.php | 5 ++--- include/items.php | 4 ++-- include/notifier.php | 45 +++++++++++++++++++++++++++++++------------- include/queue.php | 14 ++++++++++++++ update.php | 12 +++++++++++- 8 files changed, 74 insertions(+), 20 deletions(-) diff --git a/boot.php b/boot.php index 060bd7117..595dc1fef 100644 --- a/boot.php +++ b/boot.php @@ -9,7 +9,7 @@ require_once("include/pgettext.php"); define ( 'FRIENDIKA_VERSION', '2.2.1086' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); -define ( 'DB_UPDATE_VERSION', 1083 ); +define ( 'DB_UPDATE_VERSION', 1084 ); define ( 'EOL', "
    \r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/database.sql b/database.sql index f6ae4c7c6..9819914f7 100644 --- a/database.sql +++ b/database.sql @@ -606,3 +606,9 @@ INDEX ( `iid` ) ) 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; diff --git a/include/delivery.php b/include/delivery.php index 0df8ea7e4..1f5883c26 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -37,6 +37,12 @@ function delivery_run($argv, $argc){ $item_id = intval($argv[2]); $contact_id = intval($argv[3]); + 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; diff --git a/include/diaspora.php b/include/diaspora.php index 6cba0ecec..99bc21c0b 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -140,10 +140,9 @@ EOT; $encrypted_outer_key_bundle = ''; openssl_public_encrypt($outer_json,$encrypted_outer_key_bundle,$pubkey); - logger('outer_bundle_encrypt: ' . openssl_error_string()); $b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle); - logger('outer_bundle: ' . $b64_encrypted_outer_key_bundle . ' key: ' . $pubkey); + 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))); @@ -223,7 +222,7 @@ function diaspora_decode($importer,$xml) { * */ - logger('decrypted: ' . $decrypted); + logger('decrypted: ' . $decrypted, LOGGER_DEBUG); $idom = parse_xml_string($decrypted,false); $inner_iv = base64_decode($idom->iv); diff --git a/include/items.php b/include/items.php index e9594cff2..1603dec60 100644 --- a/include/items.php +++ b/include/items.php @@ -927,7 +927,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; @@ -991,7 +991,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) { diff --git a/include/notifier.php b/include/notifier.php index b87aa95b1..cde156cbd 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -379,11 +379,27 @@ function notifier_run($argv, $argc){ dbesc($recip_str) ); - // delivery loop require_once('include/salmon.php'); + $interval = intval(get_config('system','delivery_interval')); + if(! $interval) + $interval = 2; + + // 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; @@ -392,13 +408,8 @@ function notifier_run($argv, $argc){ // we will deliver single recipient types of message and email receipients here. if((! $mail) && (! $fsuggest) && (! $followup)) { - $interval = intval(get_config('system','delivery_interval')); - if(! $interval) - $interval = 2; - proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); - sleep($interval); - continue; + @time_sleep_until(microtime(true) + (float) $interval); } $deliver_status = 0; @@ -624,6 +635,18 @@ function notifier_run($argv, $argc){ 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 */ @@ -634,13 +657,9 @@ function notifier_run($argv, $argc){ } if((! $mail) && (! $fsuggest) && (! $followup)) { - $interval = intval(get_config('system','delivery_interval')); - if(! $interval) - $interval = 2; - + logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']); - sleep($interval); - continue; + @time_sleep_until(microtime(true) + (float) $interval); } } } diff --git a/include/queue.php b/include/queue.php index f1bcf2e9f..0cb6fcec2 100644 --- a/include/queue.php +++ b/include/queue.php @@ -38,6 +38,20 @@ function queue_run($argv, $argc){ logger('queue: start'); + $interval = intval(get_config('system','delivery_interval')); + if(! $interval) + $interval = 2; + + + $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']); + @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"); diff --git a/update.php b/update.php index c23ce95c6..14bc48ab7 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ Date: Sun, 28 Aug 2011 22:59:49 -0700 Subject: [PATCH 56/64] remove item from queue --- include/delivery.php | 13 +++++++++++++ include/queue.php | 21 ++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/include/delivery.php b/include/delivery.php index 1f5883c26..e32a9346c 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -37,6 +37,19 @@ function delivery_run($argv, $argc){ $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), diff --git a/include/queue.php b/include/queue.php index 0cb6fcec2..1ac1e7d48 100644 --- a/include/queue.php +++ b/include/queue.php @@ -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"); @@ -42,7 +42,6 @@ function queue_run($argv, $argc){ if(! $interval) $interval = 2; - $r = q("select * from deliverq where 1"); if(count($r)) { foreach($r as $rr) { From 51615f57acbdf5ff282037ba3c8e6a454127ea2c Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 23:00:45 -0700 Subject: [PATCH 57/64] flag top level post --- include/delivery.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/delivery.php b/include/delivery.php index 1f5883c26..4b85a9ad1 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -108,8 +108,10 @@ function delivery_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('delivery: top level post'); $top_level = true; + } } $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, From bfc708e07bde21b772f160aa9873d660f7995c2e Mon Sep 17 00:00:00 2001 From: Friendika Date: Sun, 28 Aug 2011 23:05:06 -0700 Subject: [PATCH 58/64] logging on notifier --- include/notifier.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/notifier.php b/include/notifier.php index cde156cbd..aa186317f 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -125,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`, From 391330d95f4b59aaca60ee7e954eaa9e7d2a20c0 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 00:51:08 -0700 Subject: [PATCH 59/64] better handling of relayed Diaspora comments --- include/diaspora.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 99bc21c0b..5e751f4ba 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -1065,9 +1065,11 @@ function diaspora_send_relay($item,$owner,$contact) { $text = html_entity_decode(bb2diaspora($body)); // fetch the original signature if somebody sent the post to us to relay - // If we are relaying for a reply originating here, there wasn't a 'send 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']) @@ -1076,6 +1078,7 @@ function diaspora_send_relay($item,$owner,$contact) { $orig_sign = $r[0]; $signed_text = $orig_sign['signed_text']; $authorsig = $orig_sign['signature']; + $handle = $orig_sign['signer']; } else { @@ -1105,7 +1108,7 @@ function diaspora_send_relay($item,$owner,$contact) { dbesc(base64_encode($authorsig)), dbesc($myaddr) ); - + $handle = $myaddr; } } @@ -1121,7 +1124,7 @@ function diaspora_send_relay($item,$owner,$contact) { '$parentsig' => xmlify($parentauthorsig), '$body' => xmlify($text), '$positive' => xmlify($positive), - '$handle' => xmlify($myaddr) + '$handle' => xmlify($handle) )); logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA); From 177e0e15d73fedd3c58a9d5f9cb7f509bd1da07b Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 00:59:44 -0700 Subject: [PATCH 60/64] allow zero delivery interval on dedicated servers --- include/notifier.php | 10 +++++----- include/queue.php | 7 +++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index aa186317f..1c71538d7 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -384,9 +384,7 @@ function notifier_run($argv, $argc){ require_once('include/salmon.php'); - $interval = intval(get_config('system','delivery_interval')); - if(! $interval) - $interval = 2; + $interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval'))); // delivery loop @@ -411,7 +409,8 @@ function notifier_run($argv, $argc){ if((! $mail) && (! $fsuggest) && (! $followup)) { proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); - @time_sleep_until(microtime(true) + (float) $interval); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); } $deliver_status = 0; @@ -661,7 +660,8 @@ function notifier_run($argv, $argc){ if((! $mail) && (! $fsuggest) && (! $followup)) { logger('notifier: delivery agent: ' . $rr['name'] . ' ' . $rr['id']); proc_run('php','include/delivery.php',$cmd,$item_id,$rr['id']); - @time_sleep_until(microtime(true) + (float) $interval); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); } } } diff --git a/include/queue.php b/include/queue.php index 1ac1e7d48..5119a65d8 100644 --- a/include/queue.php +++ b/include/queue.php @@ -38,16 +38,15 @@ function queue_run($argv, $argc){ logger('queue: start'); - $interval = intval(get_config('system','delivery_interval')); - if(! $interval) - $interval = 2; + $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']); - @time_sleep_until(microtime(true) + (float) $interval); + if($interval) + @time_sleep_until(microtime(true) + (float) $interval); } } From 7e79b140f038732b340fed70a1d88bdf2b950189 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 17:52:31 -0700 Subject: [PATCH 61/64] don't deliver on first pass if already queued --- boot.php | 2 +- include/notifier.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 595dc1fef..46f1e318c 100644 --- a/boot.php +++ b/boot.php @@ -7,7 +7,7 @@ require_once('include/text.php'); require_once("include/pgettext.php"); -define ( 'FRIENDIKA_VERSION', '2.2.1086' ); +define ( 'FRIENDIKA_VERSION', '2.2.1087' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DB_UPDATE_VERSION', 1084 ); diff --git a/include/notifier.php b/include/notifier.php index 1c71538d7..8d2aa961c 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -411,6 +411,7 @@ function notifier_run($argv, $argc){ proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); if($interval) @time_sleep_until(microtime(true) + (float) $interval); + continue; } $deliver_status = 0; From 454882812e8c4a56962aef1d69abc36ca8993286 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 18:01:59 -0700 Subject: [PATCH 62/64] wrong time format string, 24hr clock --- include/diaspora.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index 5e751f4ba..f14abc053 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -915,7 +915,7 @@ function diaspora_send_status($item,$owner,$contact) { $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( @@ -967,7 +967,7 @@ function diaspora_send_images($item,$owner,$contact,$images) { '$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')) + '$created_at' => xmlify(datetime_convert('UTC','UTC',$r[0]['created'],'Y-m-d H:i:s \U\T\C')) )); From 22d9d97d71a94fcfc057c350c4dfad5e36fb6dd0 Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 19:18:59 -0700 Subject: [PATCH 63/64] remove "online reputation" section on contact editing - nobody ever uses it, and there is no interface to query it. --- mod/contacts.php | 18 +----------------- view/contact_edit.tpl | 21 --------------------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/mod/contacts.php b/mod/contacts.php index 5d72cff88..307e9b15b 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -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()) @@ -277,8 +267,6 @@ function contacts_content(&$a) { $sparkle = ''; } - $grps = ''; - $insecure = '

    ' . t('Privacy Unavailable') . ' ' . t('Private communications are not available for this contact.') . '

    '; @@ -313,7 +301,6 @@ 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'), '$nettype' => $nettype, '$poll_interval' => contact_poll_interval($r[0]['priority'],(! $poll_enabled)), @@ -330,9 +317,6 @@ function contacts_content(&$a) { '$info' => $r[0]['info'], '$blocked' => (($r[0]['blocked']) ? '
    ' . t('Currently blocked') . '
    ' : ''), '$ignored' => (($r[0]['readonly']) ? '
    ' . t('Currently ignored') . '
    ' : ''), - '$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, diff --git a/view/contact_edit.tpl b/view/contact_edit.tpl index 0ee88d372..86ebb5608 100644 --- a/view/contact_edit.tpl +++ b/view/contact_edit.tpl @@ -45,8 +45,6 @@ $insecure $blocked $ignored -$grps - $lblsuggest @@ -68,24 +66,5 @@ $profile_select - -
    -

    $lbl_rep1

    -

    -$lbl_rep2 $lbl_rep3 -

    -
    -$rating -
    -
    -

    -$lbl_rep4 -

    - -
    -
    -$groups - -
    From 0f1bc6e9571e367b37246e43ce08921bf317fa7c Mon Sep 17 00:00:00 2001 From: Friendika Date: Mon, 29 Aug 2011 22:50:41 -0700 Subject: [PATCH 64/64] log every possible diaspora return for posts and comments --- include/diaspora.php | 14 ++++++++++---- include/network.php | 28 ++++++++++++++-------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/include/diaspora.php b/include/diaspora.php index f14abc053..fc9289039 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -417,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 @@ -475,8 +477,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.'); @@ -489,7 +493,7 @@ function diaspora_comment($importer,$xml,$msg) { dbesc($guid) ); if(count($r)) { - logger('daspora_comment: our comment just got relayed back to us (or there was a guid collision) : ' . $guid); + logger('diaspora_comment: our comment just got relayed back to us (or there was a guid collision) : ' . $guid); return; } @@ -658,8 +662,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.'); diff --git a/include/network.php b/include/network.php index 691a8c9f9..2832ae2d3 100644 --- a/include/network.php +++ b/include/network.php @@ -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); }}