diff options
35 files changed, 282 insertions, 195 deletions
diff --git a/Zotlabs/Access/PermissionLimits.php b/Zotlabs/Access/PermissionLimits.php index 1d15098fc..c11dc95e6 100644 --- a/Zotlabs/Access/PermissionLimits.php +++ b/Zotlabs/Access/PermissionLimits.php @@ -41,10 +41,8 @@ class PermissionLimits { $limits = []; $perms = Permissions::Perms(); - $anon_comments = get_config('system','anonymous_comments',true); - foreach($perms as $k => $v) { - if(strstr($k, 'view') || ($k === 'post_comments' && $anon_comments)) + if(strstr($k, 'view')) $limits[$k] = PERMS_PUBLIC; else $limits[$k] = PERMS_SPECIFIC; @@ -74,13 +72,13 @@ class PermissionLimits { * @param int $channel_id * @param string $perm (optional) * @return - * * \b boolean false if no perm_limits set for this channel - * * \b int if $perm is set, return one of PERMS_* constants for this permission + * * \b false if no perm_limits set for this channel + * * \b int if $perm is set, return one of PERMS_* constants for this permission, default 0 * * \b array with all permission limits, if $perm is not set */ static public function Get($channel_id, $perm = '') { if($perm) { - return PConfig::Get($channel_id, 'perm_limits', $perm); + return intval(PConfig::Get($channel_id, 'perm_limits', $perm)); } PConfig::Load($channel_id); diff --git a/Zotlabs/Access/PermissionRoles.php b/Zotlabs/Access/PermissionRoles.php index a8a9ae462..9855a05c4 100644 --- a/Zotlabs/Access/PermissionRoles.php +++ b/Zotlabs/Access/PermissionRoles.php @@ -41,7 +41,7 @@ class PermissionRoles { break; - case 'social_party': + case 'social_federation': $ret['perms_auto'] = false; $ret['default_collection'] = false; $ret['directory_publish'] = true; @@ -281,7 +281,7 @@ class PermissionRoles { static public function roles() { $roles = [ t('Social Networking') => [ - 'social_party' => t('Social - Party'), + 'social_federation' => t('Social - Federation'), 'social' => t('Social - Mostly Public'), 'social_restricted' => t('Social - Restricted'), 'social_private' => t('Social - Private') diff --git a/Zotlabs/Module/Articles.php b/Zotlabs/Module/Articles.php index 62ce1cb9c..284868241 100644 --- a/Zotlabs/Module/Articles.php +++ b/Zotlabs/Module/Articles.php @@ -191,7 +191,7 @@ class Articles extends \Zotlabs\Web\Controller { '$title' => t('Articles'), '$editor' => $editor, '$content' => $content, - '$pager' => alt_pager($a,$pager_total) + '$pager' => alt_pager($pager_total) ]); return $o; diff --git a/Zotlabs/Module/Cards.php b/Zotlabs/Module/Cards.php index d3b16e82e..f196988a2 100644 --- a/Zotlabs/Module/Cards.php +++ b/Zotlabs/Module/Cards.php @@ -194,7 +194,7 @@ class Cards extends \Zotlabs\Web\Controller { '$title' => t('Cards'), '$editor' => $editor, '$content' => $content, - '$pager' => alt_pager($a, $pager_total) + '$pager' => alt_pager($pager_total) ]); return $o; diff --git a/Zotlabs/Module/Channel.php b/Zotlabs/Module/Channel.php index 6a334b59a..953f87f11 100644 --- a/Zotlabs/Module/Channel.php +++ b/Zotlabs/Module/Channel.php @@ -380,7 +380,7 @@ class Channel extends \Zotlabs\Web\Controller { } if((! $update) || ($checkjs->disabled())) { - $o .= alt_pager($a,count($items)); + $o .= alt_pager(count($items)); if ($mid && $items[0]['title']) \App::$page['title'] = $items[0]['title'] . " - " . \App::$page['title']; } diff --git a/Zotlabs/Module/Directory.php b/Zotlabs/Module/Directory.php index 87387ef56..f2673fa1a 100644 --- a/Zotlabs/Module/Directory.php +++ b/Zotlabs/Module/Directory.php @@ -404,7 +404,7 @@ class Directory extends \Zotlabs\Web\Controller { '$entries' => $entries, '$dirlbl' => $suggest ? t('Channel Suggestions') : $dirtitle, '$submit' => t('Find'), - '$next' => alt_pager($a,$j['records'], t('next page'), t('previous page')), + '$next' => alt_pager($j['records'], t('next page'), t('previous page')), '$sort' => t('Sort options'), '$normal' => t('Alphabetic'), '$reverse' => t('Reverse Alphabetic'), diff --git a/Zotlabs/Module/Message.php b/Zotlabs/Module/Message.php index 7494f4bf4..5856bfbdf 100644 --- a/Zotlabs/Module/Message.php +++ b/Zotlabs/Module/Message.php @@ -93,7 +93,7 @@ class Message extends \Zotlabs\Web\Controller { )); - $o .= alt_pager($a,count($r)); + $o .= alt_pager(count($r)); return $o; diff --git a/Zotlabs/Module/Moderate.php b/Zotlabs/Module/Moderate.php index 10c8ab8f2..a7c98e05e 100644 --- a/Zotlabs/Module/Moderate.php +++ b/Zotlabs/Module/Moderate.php @@ -14,9 +14,12 @@ class Moderate extends \Zotlabs\Web\Controller { return; } + \App::set_pager_itemspage(60); + $pager_sql = sprintf(" LIMIT %d OFFSET %d ", intval(\App::$pager['itemspage']), intval(\App::$pager['start'])); + //show all items if(argc() == 1) { - $r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60", + $r = q("select item.id as item_id, item.* from item where item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc $pager_sql", intval(local_channel()), intval(ITEM_MODERATED) ); @@ -26,7 +29,7 @@ class Moderate extends \Zotlabs\Web\Controller { if(argc() == 2) { $post_id = intval(argv(1)); - $r = q("select item.id as item_id, item.* from item where item.id = %d and item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc limit 60", + $r = q("select item.id as item_id, item.* from item where item.id = %d and item.uid = %d and item_blocked = %d and item_deleted = 0 order by created desc $pager_sql", intval($post_id), intval(local_channel()), intval(ITEM_MODERATED) @@ -92,6 +95,7 @@ class Moderate extends \Zotlabs\Web\Controller { } $o = conversation($items,'moderate',false,'traditional'); + $o .= alt_pager(count($items)); return $o; } diff --git a/Zotlabs/Module/Network.php b/Zotlabs/Module/Network.php index b11b470f5..8d017207b 100644 --- a/Zotlabs/Module/Network.php +++ b/Zotlabs/Module/Network.php @@ -565,7 +565,7 @@ class Network extends \Zotlabs\Web\Controller { $o .= conversation($items,$mode,$update,$page_mode); if(($items) && (! $update)) - $o .= alt_pager($a,count($items)); + $o .= alt_pager(count($items)); return $o; } diff --git a/Zotlabs/Module/New_channel.php b/Zotlabs/Module/New_channel.php index ea9f27447..d9becbc22 100644 --- a/Zotlabs/Module/New_channel.php +++ b/Zotlabs/Module/New_channel.php @@ -146,14 +146,14 @@ class New_channel extends \Zotlabs\Web\Controller { $name = array('name', t('Name or caption'), ((x($_REQUEST,'name')) ? $_REQUEST['name'] : ''), t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group"'), "*"); $nickhub = '@' . \App::get_hostname(); $nickname = array('nickname', t('Choose a short nickname'), ((x($_REQUEST,'nickname')) ? $_REQUEST['nickname'] : ''), sprintf( t('Your nickname will be used to create an easy to remember channel address e.g. nickname%s'), $nickhub), "*"); - $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Account_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles); + $role = array('permissions_role' , t('Channel role and privacy'), ($privacy_role) ? $privacy_role : 'social', t('Select a channel role with your privacy requirements.') . ' <a href="help/member/member_guide#Channel_Permission_Roles" target="_blank">' . t('Read more about roles') . '</a>',$perm_roles); $o = replace_macros(get_markup_template('new_channel.tpl'), array( '$title' => t('Create Channel'), - '$desc' => t('A channel is your identity on this network. It can represent a person, a blog, or a forum to name a few. Channels can make connections with other channels to share information with highly detailed permissions.'), + '$desc' => t('A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things. Channels can make connections with other channels to share information with each other.') . ' ' . t('The type of channel you create affects the basic privacy settings, the permissions that are granted to connections/friends, and also the channel\'s visibility across the network.'), '$label_import' => t('or <a href="import">import an existing channel</a> from another location.'), '$name' => $name, - '$role' => $role, + '$role' => $role, '$default_role' => $default_role, '$nickname' => $nickname, '$validate' => t('Validate'), diff --git a/Zotlabs/Module/Owa.php b/Zotlabs/Module/Owa.php index e62fc9592..da26748b3 100644 --- a/Zotlabs/Module/Owa.php +++ b/Zotlabs/Module/Owa.php @@ -34,6 +34,15 @@ class Owa extends \Zotlabs\Web\Controller { where hubloc_addr = '%s' ", dbesc(str_replace('acct:','',$keyId)) ); + if(! $r) { + $found = discover_by_webbie(str_replace('acct:','',$keyId)); + if($found) { + $r = q("select * from hubloc left join xchan on hubloc_hash = xchan_hash + where hubloc_addr = '%s' ", + dbesc(str_replace('acct:','',$keyId)) + ); + } + } if($r) { foreach($r as $hubloc) { $verified = \Zotlabs\Web\HTTPSig::verify('',$hubloc['xchan_pubkey']); diff --git a/Zotlabs/Module/Pubstream.php b/Zotlabs/Module/Pubstream.php index e8a0146c4..571118201 100644 --- a/Zotlabs/Module/Pubstream.php +++ b/Zotlabs/Module/Pubstream.php @@ -279,7 +279,7 @@ class Pubstream extends \Zotlabs\Web\Controller { $o .= '<div id="content-complete"></div>'; if(($items) && (! $update)) - $o .= alt_pager($a,count($items)); + $o .= alt_pager(count($items)); return $o; diff --git a/Zotlabs/Module/Settings/Channel.php b/Zotlabs/Module/Settings/Channel.php index e274c9786..3e928ec58 100644 --- a/Zotlabs/Module/Settings/Channel.php +++ b/Zotlabs/Module/Settings/Channel.php @@ -536,7 +536,7 @@ class Channel { '$deny_gid' => acl2json($perm_defaults['deny_gid']), '$suggestme' => $suggestme, '$group_select' => $group_select, - '$role' => array('permissions_role' , t('Channel permissions category:'), $permissions_role, '', $perm_roles), + '$role' => array('permissions_role' , t('Channel role and privacy'), $permissions_role, '', $perm_roles), '$defpermcat' => [ 'defpermcat', t('Default Permissions Group'), $default_permcat, '', $permcats ], '$permcat_enable' => feature_enabled(local_channel(),'permcats'), '$profile_in_dir' => $profile_in_dir, diff --git a/Zotlabs/Module/Webfinger.php b/Zotlabs/Module/Webfinger.php index c50680de7..0dafae23c 100644 --- a/Zotlabs/Module/Webfinger.php +++ b/Zotlabs/Module/Webfinger.php @@ -17,33 +17,15 @@ class Webfinger extends \Zotlabs\Web\Controller { $o .= '<br /><br />'; - $old = false; if(x($_GET,'addr')) { $addr = trim($_GET['addr']); - // if(strpos($addr,'@') !== false) { - $res = webfinger_rfc7033($addr,true); - if(! $res) { - $res = old_webfinger($addr); - $old = true; - } - // } - // else { - // if(function_exists('lrdd')) - // $res = lrdd($addr); - // } - - if($res && $old) { - foreach($res as $r) { - if($r['@attributes']['rel'] === 'http://microformats.org/profile/hcard') { - $hcard = unamp($r['@attributes']['href']); - require_once('library/HTML5/Parser.php'); - $res['vcard'] = scrape_vcard($hcard); - break; - } - } + + $res = webfinger_rfc7033($addr,true); + if(! $res) { + $res = old_webfinger($addr); } - + $o .= '<pre>'; $o .= str_replace("\n",'<br />',print_r($res,true)); $o .= '</pre>'; diff --git a/Zotlabs/Update/_1212.php b/Zotlabs/Update/_1212.php new file mode 100644 index 000000000..f15ba8a71 --- /dev/null +++ b/Zotlabs/Update/_1212.php @@ -0,0 +1,26 @@ +<?php + +namespace Zotlabs\Update; + +class _1212 { + + function run() { + + $r = q("select channel_id from channel where true"); + if($r) { + foreach($r as $rv) { + $role = get_pconfig($rv['channel_id'],'system','permissions_role'); + if($role !== 'custom') { + $role_permissions = \Zotlabs\Access\PermissionRoles::role_perms($role); + if(array_key_exists('limits',$role_permissions) && array_key_exists('post_comments',$role_permissions['limits'])) { + set_pconfig($rv['channel_id'],'perm_limits','post_comments',$role_permissions['limits']['post_comments']); + } + } + } + } + + return UPDATE_SUCCESS; + + } + +} diff --git a/Zotlabs/Web/HTTPSig.php b/Zotlabs/Web/HTTPSig.php index 255511ede..df66ecf5c 100644 --- a/Zotlabs/Web/HTTPSig.php +++ b/Zotlabs/Web/HTTPSig.php @@ -195,7 +195,9 @@ class HTTPSig { if($x && $x[0]['xchan_pubkey']) { return ($x[0]['xchan_pubkey']); } - $r = as_fetch($id); + + if(function_exists('as_fetch')) + $r = as_fetch($id); if($r) { $j = json_decode($r,true); diff --git a/Zotlabs/Widget/Design_tools.php b/Zotlabs/Widget/Design_tools.php index 8ab6a235d..a15c0c98d 100644 --- a/Zotlabs/Widget/Design_tools.php +++ b/Zotlabs/Widget/Design_tools.php @@ -6,16 +6,9 @@ class Design_tools { function widget($arr) { - // mod menu doesn't load a profile. For any modules which load a profile, check it. - // otherwise local_channel() is sufficient for permissions. + if(perm_is_allowed(\App::$profile['profile_uid'],get_observer_hash(),'write_pages') || (\App::$is_sys && is_site_admin())) + return design_tools(); - if(\App::$profile['profile_uid']) - if((\App::$profile['profile_uid'] != local_channel()) && (! \App::$is_sys)) - return ''; - - if(! local_channel()) - return ''; - - return design_tools(); + return EMPTY_STR; } }
\ No newline at end of file @@ -54,7 +54,7 @@ define ( 'STD_VERSION', '3.5' ); define ( 'ZOT_REVISION', '6.0a' ); -define ( 'DB_UPDATE_VERSION', 1211 ); +define ( 'DB_UPDATE_VERSION', 1212 ); define ( 'PROJECT_BASE', __DIR__ ); diff --git a/doc/about/project.bb b/doc/about/project.bb index f9bc920f8..fe90b4d36 100644 --- a/doc/about/project.bb +++ b/doc/about/project.bb @@ -116,7 +116,7 @@ even if we have had our occasional disagreements. [li]Simon[/li] [li]zottel[/li] [li]Christian Vogeley[/li] -[li]Jeroen van Riet Paap (jeroenpraat)[/li] +[li]jeroenpraat[/li] [li]Michael Vogel[/li] [li]erik[/li] [li]Zach Prezkuta[/li] diff --git a/doc/member/member_guide.bb b/doc/member/member_guide.bb index 218f11d26..e36e1c497 100644 --- a/doc/member/member_guide.bb +++ b/doc/member/member_guide.bb @@ -22,67 +22,41 @@ Click the link to read the site's [zrl=[baseurl]/help/TermsOfService]Terms of Se Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval. -[b]Create a Channel[/b] -Next, you will be presented with the "Add a channel" screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The "choose a short nickname" box is similar to a "username" field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz -When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles. - -See Also -[zrl=[baseurl]/help/accounts_profiles_channels_basics]The Basics about Identities within $Projectname[/zrl] -[zrl=[baseurl]/help/accounts]Accounts[/zrl] -[zrl=[baseurl]/help/profiles]Profiles[/zrl] -[zrl=[baseurl]/help/permissions]Permissions[/zrl] -[zrl=[baseurl]/help/remove_account]Remove Account[/zrl] - -[b]Profiles[/b] - -$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing". - -You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile. - -That said, if you want other friends to be able to find you, it helps to have the following information in your public profile... - -[ul][*]Your real name or at least a nickname everybody knows -[*]A photo of you -[*]Your location on the planet, at least to a country level.[/ul] - -In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like. - -To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile. - -Then select "Edit Profiles" from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose "Clone this profile" there. - -In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" next to the profile in question (only available for the profiles that are not your default profile) and then click on specific connections to add them to or remove them from the group of people who can see this profile. +[h3]Channels[/h3] -Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile. +[h4]What are channels?[/h4] -There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page. +Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be "Me". -If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished. +The most important features for a channel that represents "me" are: +[ul] +[*]Secure and private "spam free" communications -[b]Keywords and Directory Search[/b] +[*]Identity and "single-signon" across the entire network -On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page. +[*]Privacy controls and permissions which extend to the entire network -On your Connnections page and in the directory there is a link to "Suggestions" or "Channel Suggestions", respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. +[*]Directory services (like a phone book) +[/ul] +In short, a channel that represents yourself is "me, on the internet". -See Also -[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl] -[h3]Account Permission Roles[/h3] +[h3]Channel Permission Roles[/h3] +When you create a new channel, you will be asked to select a permission role based on how you envision using this channel. The most popular permission roles are the Social Networking roles. You have many other choices, providing options which are analagous to Facebook Groups and Pages, collaborative spaces, newsfeeds, and more. These roles automatically configure several different system variables ranging from what permissions are granted to friends, to your default privacy settings and visibility choices. Advanced configurations are available to let you adjust each of these parameters to your needs, but we've found that most people prefer to "set it and forget it". Thew following describes some of the different roles which are currently available and how they impact your privacy and ability to interact. [h4]Social[/h4] -[b]Mostly Public[/b] +[b]Federation[/b] -The channel is a typical social networking profile. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. Only your immediate connections can comment on your public posts and send you private mail. The permission policies are similar to Facebook. +The channel is a very permissive social networking profile which is compatible with other federated social networks. The permission policies are similar to Twitter and mostly compatible with Diaspora and Mastodon. Privacy is a lower priority than ease of access and connecting with others. Anybody in the network can comment on your public posts and send you private mail. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. This mode [i]may[/i] increase your exposure to undesired communications and spam. This role is not generally recommended [i]unless[/i] you need to interact regularly with members of other networks. -[b]Party[/b] +[b]Mostly Public[/b] -The channel is a permissive social networking profile. The permission policies are similar to Twitter and several free networks such as Diaspora and Mastodon. Anybody in the network can comment on your public posts and send you private mail. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. This mode [i]may[/i] increase your exposure to undesired communications and spam. +The channel is a typical social networking profile. By default posts and published items are public, but you can over-ride this when creating the item and restrict it. You are listed in the directory. Your online presence and connections are visible to others. Only your immediate connections can comment on your public posts and send you private mail. The permission policies are similar to Facebook. [b]Restricted[/b] @@ -140,33 +114,59 @@ A public forum which allows members to post files/photos/webpages. Set all the privacy and permissions manually to suit your specific needs. -[h3]Channels[/h3] +[h3]Creating channels[/h3] -[h4]What are channels?[/h4] -Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be "Me". +After creating your account, you will be presented with the "Add a channel" screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The "choose a short nickname" box is similar to a "username" field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz -The most important features for a channel that represents "me" are: -[ul] -[*]Secure and private "spam free" communications +See Also +[zrl=[baseurl]/help/accounts_profiles_channels_basics]The Basics about Identities within $Projectname[/zrl] +[zrl=[baseurl]/help/accounts]Accounts[/zrl] +[zrl=[baseurl]/help/profiles]Profiles[/zrl] +[zrl=[baseurl]/help/permissions]Permissions[/zrl] +[zrl=[baseurl]/help/remove_account]Remove Account[/zrl] -[*]Identity and "single-signon" across the entire network -[*]Privacy controls and permissions which extend to the entire network +You can create additonal channels from the "Channel Manager" link. -[*]Directory services (like a phone book) -[/ul] -In short, a channel that represents yourself is "me, on the internet". +Once you have done this, your channel is ready to use. At [observer=1][observer.url][/observer][observer=0][baseurl]/channel/username[/observer] you will find your channel "stream". This is where your recent activity will appear, in reverse chronological order. If you post in the box marked "share", the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The "hamburger" menu in most themes will provide you with navigation to other system components and apps. The Photos page contain photo albums, and the Events page contains events share by both yourself and your contacts. + +[b]Profiles[/b] + +$Projectname has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing". + +You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile. + +That said, if you want other friends to be able to find you, it helps to have the following information in your public profile... -[h4]Creating channels[/h4] +[ul][*]Your real name or at least a nickname everybody knows +[*]A photo of you +[*]Your location on the planet, at least to a country level.[/ul] + +In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like. + +To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings > Additional Features[/zrl] and enable "Multiple Profiles" there, otherwise you won't have the ability to use more than just your default profile. + +Then select "Edit Profiles" from the menu of your $Projectname site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose "Clone this profile" there. + +In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" next to the profile in question (only available for the profiles that are not your default profile) and then click on specific connections to add them to or remove them from the group of people who can see this profile. + +Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile. + +There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page. + +If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished. + +[b]Keywords and Directory Search[/b] + +On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page. -You will be required to create your first channel as part of the sign up process. You can also create additonal channels from the "Select channel" link. +On your Connnections page and in the directory there is a link to "Suggestions" or "Channel Suggestions", respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. -You will be asked to provide a channel name, and a short nick name. For a channel that represents yourself, it is a good idea to use your real name here to ensure your friends can find you, and connect to your channel. The short nickname will be used to generate a "webbie". This is a bit like a username, and will look like an email address, taking the form nickname@domain. You should put a little thought into what you want to use here. Imagine somebody asking for your webbie and having to tell them it is "llamas-are_kewl.123". "llamasarecool" would be a much better choice. +See Also -Once you have created your channel, you will be taken to the settings page, where you can configure your channel, and set your default permissions. +[zrl=[baseurl]/help/AdvancedSearch]Advanced Searching[/zrl] -Once you have done this, your channel is ready to use. At [observer=1][observer.url][/observer][observer=0][baseurl]/channel/username[/observer] you will find your channel "stream". This is where your recent activity will appear, in reverse chronological order. If you post in the box marked "share", the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The "About" tab contains your "profile", the photos page contain photo albums, and the events page contains events share by both yourself and your contacts. [h4]The grid, permissions and delegation[/h4] diff --git a/include/follow.php b/include/follow.php index a63fe66ea..d803afa3f 100644 --- a/include/follow.php +++ b/include/follow.php @@ -150,9 +150,9 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) // attempt network auto-discovery - $d = discover_by_webbie($url,$protocol); + $wf = discover_by_webbie($url,$protocol); - if((! $d) && ($is_http)) { + if((! $wf) && ($is_http)) { // try RSS discovery @@ -167,9 +167,9 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) } } - if($d) { + if($wf || $d) { $r = q("select * from xchan where xchan_hash = '%s' or xchan_url = '%s' limit 1", - dbesc($url), + dbesc(($wf) ? $wf : $url), dbesc($url) ); } diff --git a/include/network.php b/include/network.php index 897fbccd6..c41d87af0 100644 --- a/include/network.php +++ b/include/network.php @@ -1192,9 +1192,10 @@ function discover_by_webbie($webbie, $protocol = '') { logger('webfinger: ' . print_r($x,true), LOGGER_DATA, LOG_INFO); $arr = [ - 'address' => $webbie, - 'protocol' => $protocol, - 'success' => false, + 'address' => $webbie, + 'protocol' => $protocol, + 'success' => false, + 'xchan' => '', 'webfinger' => $x ]; /** @@ -1207,7 +1208,7 @@ function discover_by_webbie($webbie, $protocol = '') { */ call_hooks('discover_channel_webfinger', $arr); if($arr['success']) - return true; + return $arr['xchan']; return false; } diff --git a/include/permissions.php b/include/permissions.php index f97142fab..185d37b6a 100644 --- a/include/permissions.php +++ b/include/permissions.php @@ -46,7 +46,7 @@ function get_all_perms($uid, $observer_xchan, $internal_use = true) { // First find out what the channel owner declared permissions to be. - $channel_perm = \Zotlabs\Access\PermissionLimits::Get($uid,$perm_name); + $channel_perm = intval(\Zotlabs\Access\PermissionLimits::Get($uid,$perm_name)); if(! $channel_checked) { $r = q("select * from channel where channel_id = %d limit 1", diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php index 22d2b776d..2e2f5a758 100644 --- a/include/photo/photo_driver.php +++ b/include/photo/photo_driver.php @@ -75,6 +75,7 @@ abstract class photo_driver { abstract function imageString(); + abstract function clearexif(); public function __construct($data, $type='') { $this->types = $this->supportedTypes(); diff --git a/include/photo/photo_gd.php b/include/photo/photo_gd.php index 24bdc204f..e98ac2827 100644 --- a/include/photo/photo_gd.php +++ b/include/photo/photo_gd.php @@ -35,6 +35,11 @@ class photo_gd extends photo_driver { } + public function clearexif() { + return; + } + + public function destroy() { if($this->is_valid()) { imagedestroy($this->image); diff --git a/include/photo/photo_imagick.php b/include/photo/photo_imagick.php index 32bb61342..89577e71e 100644 --- a/include/photo/photo_imagick.php +++ b/include/photo/photo_imagick.php @@ -96,6 +96,19 @@ class photo_imagick extends photo_driver { } + public function clearexif() { + + $profiles = $this->image->getImageProfiles("icc", true); + + $this->image->stripImage(); + + if(!empty($profiles)) { + $this->image->profileImage("icc", $profiles['icc']); + } + } + + + public function getImage() { if(!$this->is_valid()) return FALSE; diff --git a/include/photos.php b/include/photos.php index 321f7159c..9ae0e6874 100644 --- a/include/photos.php +++ b/include/photos.php @@ -211,6 +211,10 @@ function photo_upload($channel, $observer, $args) { $ph->orient($exif); } + + $ph->clearexif(); + + @unlink($src); $max_length = get_config('system','max_image_length'); diff --git a/include/queue_fn.php b/include/queue_fn.php index 798ac36db..f05bac5b0 100644 --- a/include/queue_fn.php +++ b/include/queue_fn.php @@ -95,6 +95,12 @@ function queue_set_delivered($id,$channel = 0) { function queue_insert($arr) { + // do not queue anything with no destination + + if(! (array_key_exists('posturl',$arr) && trim($arr['posturl']))) { + return false; + } + $x = q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_priority, outq_created, outq_updated, outq_scheduled, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s' )", diff --git a/include/taxonomy.php b/include/taxonomy.php index f65cdd941..46d95458c 100644 --- a/include/taxonomy.php +++ b/include/taxonomy.php @@ -312,7 +312,8 @@ function article_tagadelic($uid, $count = 0, $authors = '', $owner = '', $flags function pubtagblock($net,$site,$limit,$recent = 0,$safemode = 1, $type = TERM_HASHTAG) { $o = ''; - $r = pub_tagadelic($net,$site,$limit,$since,$safemode,$type); + $r = pub_tagadelic($net,$site,$limit,$recent,$safemode,$type); + $link = z_root() . '/pubstream'; if($r) { @@ -338,7 +339,7 @@ function pub_tagadelic($net,$site,$limit,$recent,$safemode,$type) { else { $sys = get_sys_channel(); $uids = " and item.uid = " . intval($sys['channel_id']) . " "; - $sql_extra = item_permissions_sql($sys['channel_id']); + $sql_extra = " and item_private = 0 "; } if($recent) diff --git a/include/text.php b/include/text.php index bc44f22f3..55fc49560 100644 --- a/include/text.php +++ b/include/text.php @@ -531,7 +531,7 @@ function paginate(&$a) { } -function alt_pager(&$a, $i, $more = '', $less = '') { +function alt_pager($i, $more = '', $less = '') { if(! $more) $more = t('older'); @@ -2404,7 +2404,7 @@ function jindent($json) { */ function design_tools() { - $channel = App::get_channel(); + $channel = channelx_by_n(App::$profile['profile_uid']); $sys = false; if(App::$is_sys && is_site_admin()) { diff --git a/tests/unit/Access/PermissionLimitsTest.php b/tests/unit/Access/PermissionLimitsTest.php index 58595111a..57ad42a19 100644 --- a/tests/unit/Access/PermissionLimitsTest.php +++ b/tests/unit/Access/PermissionLimitsTest.php @@ -66,7 +66,7 @@ class PermissionLimitsTest extends UnitTestCase { $this->assertEquals(PERMS_SPECIFIC, $stdlimits['write_pages']); $this->assertEquals(PERMS_SPECIFIC, $stdlimits['write_wiki']); $this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_wall']); - $this->assertEquals(PERMS_PUBLIC, $stdlimits['post_comments']); + $this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_comments']); $this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_mail']); $this->assertEquals(PERMS_SPECIFIC, $stdlimits['post_like']); $this->assertEquals(PERMS_SPECIFIC, $stdlimits['tag_deliver']); diff --git a/tests/unit/Access/PermissionRolesTest.php b/tests/unit/Access/PermissionRolesTest.php index f2636da62..58fd88bb1 100644 --- a/tests/unit/Access/PermissionRolesTest.php +++ b/tests/unit/Access/PermissionRolesTest.php @@ -62,7 +62,7 @@ class PermissionRolesTest extends UnitTestCase { $this->assertEquals($roles, $r->roles()); $socialNetworking = [ - 'social_party' => 'Social - Party', + 'social_federation' => 'Social - Federation', 'social' => 'Social - Mostly Public', 'social_restricted' => 'Social - Restricted', 'social_private' => 'Social - Private' diff --git a/view/fr/hstrings.php b/view/fr/hstrings.php index f7fe764cd..6941f6321 100644 --- a/view/fr/hstrings.php +++ b/view/fr/hstrings.php @@ -7,7 +7,7 @@ function string_plural_select_fr($n){ App::$rtl = 0; App::$strings["Can view my channel stream and posts"] = "Peut voir mon canal et mes publications"; App::$strings["Can send me their channel stream and posts"] = "Peuvent m'envoyer leur flux et les publications de leur canal"; -App::$strings["Can view my default channel profile"] = "Peut voir le profil par défaut du canal."; +App::$strings["Can view my default channel profile"] = "Peut voir le profil par défaut du canal"; App::$strings["Can view my connections"] = "Peut voir mes contacts"; App::$strings["Can view my file storage and photos"] = "Peut voir mes fichiers et photos"; App::$strings["Can upload/modify my file storage and photos"] = "Peut télécharger/modifier mes fichiers et mes photos"; @@ -15,15 +15,16 @@ App::$strings["Can view my channel webpages"] = "Peut voir les pages web de mon App::$strings["Can view my wiki pages"] = "Peut voir les pages de mon wiki"; App::$strings["Can create/edit my channel webpages"] = "Peut créer ou modifier les pages web de mon canal"; App::$strings["Can write to my wiki pages"] = "Peut écrire sur mon wiki"; -App::$strings["Can post on my channel (wall) page"] = "Peut écrire sur le mur de mon canal (mur)"; +App::$strings["Can post on my channel (wall) page"] = "Peut poster sur mon canal (\"mur\")"; App::$strings["Can comment on or like my posts"] = "Peuvent commenter et/ou aimer mes publications"; App::$strings["Can send me private mail messages"] = "Peuvent m'envoyer des messages privés"; -App::$strings["Can like/dislike profiles and profile things"] = "Peut aimer ou détester des profiles"; +App::$strings["Can like/dislike profiles and profile things"] = "Peut aimer ou détester des profils"; App::$strings["Can forward to all my channel connections via @+ mentions in posts"] = "Peut faire suivre à tous mes contacts avec la mention @+ dans une publication"; App::$strings["Can chat with me"] = "Peut discuter avec moi"; App::$strings["Can source my public posts in derived channels"] = "Peut rediriger mes publications publiques vers des canaux dérivés"; App::$strings["Can administer my channel"] = "Peut administrer mon canal"; App::$strings["Social Networking"] = "Réseau social"; +App::$strings["Social - Party"] = "Social - Fête"; App::$strings["Social - Mostly Public"] = "Social - principalement public"; App::$strings["Social - Restricted"] = "Social - restreint"; App::$strings["Social - Private"] = "Social - privé"; @@ -362,11 +363,10 @@ App::$strings["Error: PDO database PHP module required but not installed."] = "E App::$strings["Error: mb_string PHP module required but not installed."] = "Erreur : le module mb_string de PHP est requis, mais pas installé."; App::$strings["Error: xml PHP module required for DAV but not installed."] = "Erreur : le module xml de PHP est requis pour le DAV, mais pas installé."; App::$strings["Error: zip PHP module required but not installed."] = "Erreur : le module zip de PHP est requis, mais pas installé."; +App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture"; App::$strings["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."] = "L'installeur web a besoin de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais en est incapable."; App::$strings["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."] = "C'est généralement lié à un problème de droits d'accès, à cause duquel le serveur web est interdit d'écriture dans le répertoire concerné - alors que votre propre utilisateur a le droit."; -App::$strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Red top folder."] = "Au terme de cette procédure, nous vous transmettrons un texte à sauvegarder dans un fichier nommé .htconfig.php, à la racine de votre installation de \$Projectname."; -App::$strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Autrement, vous pouvez contourner toute cette procédure et réaliser l'installation manuellement. Merci de consulter le fichier \"install/INSTALL.txt\" pour les instructions détaillées."; -App::$strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture"; +App::$strings["Please see install/INSTALL.txt for additional information."] = "Merci de vous reporter à install/INSTALL.txt pour des informations supplémentaires."; App::$strings["This software uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Ce logiciel utilise Smarty3 comme moteur de modèles pour afficher ses vues Web. Smarty3 compile ses modèles en PHP pour accélérer le rendu."; App::$strings["In order to store these compiled templates, the web server needs to have write access to the directory %s under the top level web folder."] = "Afin de stocker ces modèles compilés, le serveur Web doit disposer d'un accès en écriture au répertoire %s selon le dossier Web racine."; App::$strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Merci de vous assurer que l'utilisateur sous lequel le serveur web tourne (le plus souvent, www-data) a bien l'autorisation d'écrire dans ce répertoire."; @@ -551,8 +551,6 @@ App::$strings["Publicly visible description of this site. Displayed on siteinfo App::$strings["System language"] = "Langue du système"; App::$strings["System theme"] = "Thème du système"; App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>"; -App::$strings["Mobile system theme"] = "Thème par défaut pour les mobiles"; -App::$strings["Theme for mobile devices"] = "Thème pour les mobiles"; App::$strings["Allow Feeds as Connections"] = "Autoriser les Flux (RSS) comme contacts"; App::$strings["(Heavy system resource usage)"] = "(Impact important sur les ressources)"; App::$strings["Maximum image size"] = "Taille maximale des images"; @@ -612,6 +610,7 @@ App::$strings["Maximum Load Average"] = "Charge maximale moyenne"; App::$strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Charge système maximale au-delà de laquelle distribution et scrutation sont reportées - par défaut 50."; App::$strings["Expiration period in days for imported (grid/network) content"] = "Délai d'expiration pour le contenu importé (réseau)"; App::$strings["0 for no expiration of imported content"] = "0 pour ne pas expirer le contenu importé"; +App::$strings["Do not expire any posts which have comments less than this many days ago"] = "Ne pas considérer comme expirés les messages qui ont reçu des commentaires depuis moins de ce nombre de jours"; App::$strings["Public servers: Optional landing (marketing) webpage for new registrants"] = "Serveurs publics : page Web facultative d'atterrissage (marketing) pour les nouveaux inscrits."; App::$strings["Create this page first. Default is %s/register"] = "Créez d'abord cette page. La valeur par défaut est %s /register"; App::$strings["Page to display after creating a new channel"] = "Page à afficher après la création d'un nouveau canal"; @@ -763,9 +762,10 @@ App::$strings["New connections"] = "Nouveaux contacts"; App::$strings["System Registrations"] = "Inscriptions système"; App::$strings["Unseen shared files"] = "Fichiers partagés non vus"; App::$strings["Unseen public activity"] = "Activité publique non vue"; +App::$strings["Unseen likes and dislikes"] = "Aime et n'aime pas non consultés"; App::$strings["Email notification hub (hostname)"] = "Concentrateur de notification par courriel (nom d'hôte)"; App::$strings["If your channel is mirrored to multiple hubs, set this to your preferred location. This will prevent duplicate email notifications. Example: %s"] = "Si votre canal est dupliqué sur plusieurs hubs, définissez cet emplacement comme votre emplacement préféré. Cela empêchera les notifications par courriel en double. Exemple : %s"; -App::$strings["Also show new wall posts, private messages and connections under Notices"] = "Afficher également les nouvelles publications sur le mur, les messages privés et les contacts dans Notifications"; +App::$strings["Show new wall posts, private messages and connections under Notices"] = "Montrer les nouveaux envois, messages privés et les nouvelles connexions dans Notifications"; App::$strings["Notify me of events this many days in advance"] = "Me prévenir d’événements à venir tant de jours en avance"; App::$strings["Must be greater than 0"] = "Doit être supérieur à 0"; App::$strings["Advanced Account/Page Type Settings"] = "Paramètres avancés de compte/type de page"; @@ -779,6 +779,8 @@ App::$strings["Remove this channel."] = "Supprimer ce canal"; App::$strings["Firefox Share \$Projectname provider"] = "Connecteur \$Projectname pour Firefox Share"; App::$strings["Start calendar week on Monday"] = "Commencer la semaine du calendrier le lundi"; App::$strings["Additional Features"] = "Fonctionnalités additionnelles"; +App::$strings["Your technical skill level"] = "Votre niveau technique"; +App::$strings["Used to provide a member experience and additional features consistent with your comfort level"] = "Utilisé pour offrir une expérience de membre et des fonctions supplémentaires compatibles avec votre niveau de confort."; App::$strings["This channel is limited to %d tokens"] = "Ce canal est limité à %d jetons"; App::$strings["Name and Password are required."] = "Le nom et le mot de passe sont requis"; App::$strings["Token saved."] = "Jeton sauvegardé"; @@ -789,6 +791,22 @@ App::$strings["Login Name"] = "Nom d'utilisateur"; App::$strings["Login Password"] = "Mot de passe"; App::$strings["Expires (yyyy-mm-dd)"] = "Date d'expiration sous la forme année mois jour (AAAA-MM-JJ)"; App::$strings["Their Settings"] = "Leurs paramètres"; +App::$strings["Name and Secret are required"] = "Un nom et un secret sont requis"; +App::$strings["Add OAuth2 application"] = "Ajouter une application OAuth2"; +App::$strings["Name of application"] = "Nom de l'application"; +App::$strings["Consumer Secret"] = "Secret client"; +App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."; +App::$strings["Redirect"] = "Redirection"; +App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"; +App::$strings["Grant Types"] = "Types de bourses"; +App::$strings["leave blank unless your application sepcifically requires this"] = "Laisser vide, sauf si votre application le requiert spécifiquement"; +App::$strings["Authorization scope"] = "Portée de l'autorisation"; +App::$strings["OAuth2 Application not found."] = "Application OAuth2 introuvable"; +App::$strings["Add application"] = "Ajouter une application"; +App::$strings["Connected OAuth2 Apps"] = "Applications OAuth2 connectées"; +App::$strings["Client key starts with"] = "La clef partagée commence par"; +App::$strings["No name"] = "Sans nom"; +App::$strings["Remove authorization"] = "Révoquer l'autorisation"; App::$strings["Not valid email."] = "Adresse de courriel non valide."; App::$strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser."; App::$strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci d'essayer à nouveau."; @@ -803,8 +821,6 @@ App::$strings["Current Password"] = "Mot de passe actuel"; App::$strings["Enter New Password"] = "Entrez votre nouveau mot de passe"; App::$strings["Confirm New Password"] = "Confirmez le nouveau mot de passe"; App::$strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier"; -App::$strings["Your technical skill level"] = "Votre niveau technique"; -App::$strings["Used to provide a member experience and additional features consistent with your comfort level"] = "Utilisé pour offrir une expérience de membre et des fonctions supplémentaires compatibles avec votre niveau de confort."; App::$strings["Remove Account"] = "Supprimer le compte"; App::$strings["Remove this account including all its channels"] = "Supprimer ce compte et tous ses canaux"; App::$strings["Affinity Slider settings updated."] = "Paramètres de la réglette d'affinité mis à jour."; @@ -845,20 +861,11 @@ App::$strings["click to expand content exceeding this height"] = "cliquer pour d App::$strings["Grid page max height of content (in pixels)"] = "Hauteur maximale du contenu sur la page du réseau (en pixels)"; App::$strings["Name is required"] = "Le nom est requis"; App::$strings["Key and Secret are required"] = "Clef et secret sont requis"; -App::$strings["Add application"] = "Ajouter une application"; -App::$strings["Name of application"] = "Nom de l'application"; App::$strings["Consumer Key"] = "Clef client"; -App::$strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."; -App::$strings["Consumer Secret"] = "Secret client"; -App::$strings["Redirect"] = "Redirection"; -App::$strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez vide, sauf si votre application le requiert spécifiquement"; App::$strings["Icon url"] = "URL de l'icône"; App::$strings["Optional"] = "Facultatif"; App::$strings["Application not found."] = "Application introuvable."; App::$strings["Connected Apps"] = "Applications connectées"; -App::$strings["Client key starts with"] = "La clef partagée commence par"; -App::$strings["No name"] = "Sans nom"; -App::$strings["Remove authorization"] = "Révoquer l'autorisation"; App::$strings["View Photo"] = "Voir la photo"; App::$strings["Edit Album"] = "Modifier l'album"; App::$strings["Upload"] = "Envoyer"; @@ -880,7 +887,7 @@ App::$strings["Permissions"] = "Droits d'accès"; App::$strings["Add Thing to your Profile"] = "Ajouter l'élément à votre profil"; App::$strings["No more system notifications."] = "Pas d'autre notification du système."; App::$strings["System Notifications"] = "Notifications du système"; -App::$strings["Channel added."] = "Canal ajouté."; +App::$strings["Connection added."] = "Connexion ajoutée."; App::$strings["Your service plan only allows %d channels."] = "Votre forfait n'autorise que %d canaux."; App::$strings["No channel. Import failed."] = "Pas de canal. Echec de l'import."; App::$strings["Import completed."] = "L'import est terminé."; @@ -915,19 +922,22 @@ App::$strings["Create new app"] = "Créer une application"; App::$strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s est %2\$s"; App::$strings["Mood"] = "Humeur"; App::$strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis"; +App::$strings["Active"] = "Active"; App::$strings["Blocked"] = "Bloqué(e)"; App::$strings["Ignored"] = "Ignoré(e)"; App::$strings["Hidden"] = "Caché"; App::$strings["Archived/Unreachable"] = "Archivé/Injoignable"; App::$strings["New"] = "Nouveautés"; App::$strings["All"] = "Tous"; +App::$strings["Active Connections"] = "Connexions actives"; +App::$strings["Show active connections"] = "Voir les connexions actives"; App::$strings["New Connections"] = "Nouveaux contacts"; App::$strings["Show pending (new) connections"] = "Voir les (nouveaux) contacts en attente"; -App::$strings["Show all connections"] = "Voir tous les contacts"; App::$strings["Only show blocked connections"] = "Ne montrer que les contacts bloqués"; App::$strings["Only show ignored connections"] = "Ne montrer que les contacts ignorés"; App::$strings["Only show archived/unreachable connections"] = "Ne montrer que les contacts archivés/injoignables"; App::$strings["Only show hidden connections"] = "Ne montrer que les contacts cachés"; +App::$strings["Show all connections"] = "Voir tous les contacts"; App::$strings["Pending approval"] = "En attente de validation"; App::$strings["Archived"] = "Archivé"; App::$strings["Not connected at this location"] = "Contact introuvable à cette adresse"; @@ -969,10 +979,10 @@ App::$strings["Upload Photos"] = "Téléverser des photos"; App::$strings["Enter an album name"] = "Entrer un nom d'album"; App::$strings["or select an existing album (doubleclick)"] = "ou sélectionner un album existant (double-clic)"; App::$strings["Create a status post for this upload"] = "Créer une publication de statut pour cet envoi"; -App::$strings["Caption (optional):"] = "Légende (facultative)"; -App::$strings["Description (optional):"] = "Description (facultative)"; +App::$strings["Description (optional)"] = "Description (facultative)"; App::$strings["Show Newest First"] = "Les plus récent(e)s en premier"; App::$strings["Show Oldest First"] = "Les moins récent(e)s en premier"; +App::$strings["Add Photos"] = "Ajouter des photos"; App::$strings["Permission denied. Access to this item may be restricted."] = "Accès refusé. L'accès à cet élément peut avoir été restreint."; App::$strings["Photo not available"] = "Photo non disponible"; App::$strings["Use as profile photo"] = "Utiliser comme photo du profil"; @@ -985,7 +995,6 @@ App::$strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)"; App::$strings["Move photo to album"] = "Déplacer la photo dans l'album"; App::$strings["Enter a new album name"] = "Entrer un nouveau nom d'album"; App::$strings["or select an existing one (doubleclick)"] = "ou en sélectionner un existant (double-clic)"; -App::$strings["Caption"] = "Titre/légende"; App::$strings["Add a Tag"] = "Ajouter une étiquette"; App::$strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Exemple : @marc, @Barbara_Jensen, @charles@exemple.com, #Ile_de_France, #marathon"; App::$strings["Flag as adult in album view"] = "Marquer comme \"adulte\" dans l'affichage de l'album"; @@ -1260,6 +1269,10 @@ App::$strings["Warning: Changing some settings could render your channel inopera App::$strings["If enabled, connection requests will be approved without your interaction"] = "Si cette option est activée, les demandes de connexion seront approuvées sans votre intervention."; App::$strings["Automatic approval settings"] = "Paramètres d'approbation automatique"; App::$strings["Some individual permissions may have been preset or locked based on your channel type and privacy settings."] = "Certaines permissions individuelles peuvent avoir été prédéfinies ou verrouillées en fonction de votre type de canal et de vos paramètres de confidentialité."; +App::$strings["Unknown App"] = "App inconnue"; +App::$strings["Authorize"] = "Autoriser"; +App::$strings["Do you authorize the app %s to access your channel data?"] = "Autorisez vous l'app %s à accéder aux données de votre canal ?"; +App::$strings["Allow"] = "Permettre"; App::$strings["Privacy group created."] = "Groupe de contacts créé."; App::$strings["Could not create privacy group."] = "Impossible de créer le groupe de contacts."; App::$strings["Privacy group not found."] = "Groupe de contacts introuvable."; @@ -1296,7 +1309,7 @@ App::$strings["Hide your connections list from viewers of this profile"] = "Cach App::$strings["Edit Profile Details"] = "Modifier les détails du profil"; App::$strings["View this profile"] = "Voir ce profil"; App::$strings["Edit visibility"] = "Changer la visibilité"; -App::$strings["Profile Tools"] = "Ouitls pour votre profile"; +App::$strings["Profile Tools"] = "Outils pour votre profil"; App::$strings["Change cover photo"] = "Modifier votre bannière"; App::$strings["Change profile photo"] = "Changer la photo du profil"; App::$strings["Create a new profile using these settings"] = "Créer un nouveau profil avec ces paramètres"; @@ -1304,14 +1317,14 @@ App::$strings["Clone this profile"] = "Cloner ce profil"; App::$strings["Delete this profile"] = "Supprimer ce profil"; App::$strings["Add profile things"] = "Ajouter des éléments de profil"; App::$strings["Personal"] = "Me concernant"; -App::$strings["Relation"] = "Contacts"; +App::$strings["Relationship"] = "Relation"; App::$strings["Miscellaneous"] = "Divers"; App::$strings["Import profile from file"] = "Importer le profil à partir d'un fichier"; App::$strings["Export profile to file"] = "Exporter le profil vers un fichier."; App::$strings["Your gender"] = "Votre genre"; App::$strings["Marital status"] = "Etat civil"; App::$strings["Sexual preference"] = "préférence sexuelle"; -App::$strings["Profile name"] = "Nom du profile"; +App::$strings["Profile name"] = "Nom du profil"; App::$strings["This is your default profile."] = "Ceci est votre profil par défaut."; App::$strings["Your full name"] = "Votre nom complet"; App::$strings["Title/Description"] = "Titre/description"; @@ -1458,6 +1471,7 @@ App::$strings["%1\$s is not attending %2\$s's %3\$s"] = "%1\$s ne participe pas App::$strings["%1\$s may attend %2\$s's %3\$s"] = "%1\$s participe peut-être à %3\$s de %2\$s"; App::$strings["Action completed."] = "Action terminée."; App::$strings["Thank you."] = "Merci."; +App::$strings["No default suggestions were found."] = "Aucune suggestion par défaut n'a été trouvée."; App::$strings["%d rating"] = array( 0 => "%d évaluation", 1 => "%d évaluations", @@ -1729,44 +1743,44 @@ App::$strings["To stop receiving these messages, please adjust your Notification App::$strings["To stop receiving these messages, please adjust your %s."] = "Pour ne plus recevoir ces messages, veuillez ajuster votre %s."; App::$strings["%s <!item_type!>"] = "%s <!item_type!>"; App::$strings["[\$Projectname:Notify] New mail received at %s"] = "[\$Projectname:Notify] Nouveau mail reçu sur %s"; -App::$strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, vous avez reçu un message privé sur %3\$s, de la part de %2\$s."; +App::$strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s vous a envoyé un nouveau message privé à %2\$s."; App::$strings["%1\$s sent you %2\$s."] = "%1\$s vous a envoyé %2\$s."; App::$strings["a private message"] = "un message privé"; App::$strings["Please visit %s to view and/or reply to your private messages."] = "Merci de visiter %s pour voir et/ou répondre à vos messages privés."; App::$strings["commented on"] = "commenté"; App::$strings["liked"] = "aimé"; App::$strings["disliked"] = "pas aimé"; -App::$strings["%1\$s, %2\$s %3\$s [zrl=%4\$s]a %5\$s[/zrl]"] = "%1\$s, %2\$s %3\$s [zrl=%4\$s]a %5\$s[/zrl]"; -App::$strings["%1\$s, %2\$s %3\$s [zrl=%4\$s]%5\$s's %6\$s[/zrl]"] = "%1\$s, %2\$s %3\$s [zrl=%4\$s]%5\$s's %6\$s[/zrl]"; -App::$strings["%1\$s, %2\$s %3\$s [zrl=%4\$s]your %5\$s[/zrl]"] = "%1\$s, %2\$s %3\$s [zrl=%4\$s]votre %5\$s[/zrl]"; +App::$strings["%1\$s %2\$s [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s %2\$s [zrl=%3\$s]a %4\$s[/zrl]"; +App::$strings["%1\$s %2\$s [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s %2\$s [zrl=%3\$s]%4\$s de %5\$s[/zrl]"; +App::$strings["%1\$s %2\$s [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s %2\$s [zrl=%3\$s]votre %4\$s[/zrl]"; App::$strings["[\$Projectname:Notify] Moderated Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notification] Commentaire modéré pour la conversation n°%1\$d par %2\$s"; App::$strings["[\$Projectname:Notify] Comment to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Commentaire effectué sur la conversation #%1\$d par %2\$s"; -App::$strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s a commenté un élément de conversation que vous suivez."; +App::$strings["%1\$s commented on an item/conversation you have been following."] = "%1\$sa commenté un élément ou une conversation que vous suivez."; App::$strings["Please visit %s to view and/or reply to the conversation."] = "Merci de visiter %s pour voir et/ou répondre sur cette conversation."; App::$strings["Please visit %s to approve or reject this comment."] = "Merci de visiter %spour valider ou rejeter ce commentaire."; -App::$strings["%1\$s, %2\$s liked [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s aiment [zrl=%3\$s]votre %4\$s[/zrl]"; +App::$strings["%1\$s liked [zrl=%2\$s]your %3\$s[/zrl]"] = "%1\$s aime [zrl=%2\$s]votre %3\$s[/zrl]"; App::$strings["[\$Projectname:Notify] Like received to conversation #%1\$d by %2\$s"] = "[\$Projectname:Notify] Aime reçu à la convesation #%1\$d par %2\$s"; -App::$strings["%1\$s, %2\$s liked an item/conversation you created."] = "%1\$s, %2\$s a aimé un élément ou une conversation que vous avez créée."; +App::$strings["%1\$s liked an item/conversation you created."] = "%1\$sa commenté un élément ou une conversation que vous avez créée "; App::$strings["[\$Projectname:Notify] %s posted to your profile wall"] = "[\$Projectname:Notify] %s a publié sur le mur de votre profil"; -App::$strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s a publié sur votre profil à %3\$s"; -App::$strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s a publié sur [zrl=%3\$s]votre profil[/zrl]"; +App::$strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s a posté sur le mur de votre profil à %2\$s"; +App::$strings["%1\$s posted to [zrl=%2\$s]your wall[/zrl]"] = "%1\$s envoyé à [zrl=%2\$s]votre mur[/zrl]"; App::$strings["[\$Projectname:Notify] %s tagged you"] = "[\$Projectname:Notify] %s vous a étiquetté"; -App::$strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, vous avez été étiqueté sur %3\$s par %2\$s"; -App::$strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]vous a étiqueté[/zrl]."; +App::$strings["%1\$s tagged you at %2\$s"] = "%1\$s vous a étiqueté à %2\$s"; +App::$strings["%1\$s [zrl=%2\$s]tagged you[/zrl]."] = "%1\$s [zrl=%2\$s]vous a étiqueté[/zrl]."; App::$strings["[\$Projectname:Notify] %1\$s poked you"] = "[\$Projectname:Notify] %1\$s vous a poké"; -App::$strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s vous a tapoté sur %3\$s"; -App::$strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]vous a tapoté[/zrl]."; +App::$strings["%1\$s poked you at %2\$s"] = "%1\$s vous a tapoté à %2\$s"; +App::$strings["%1\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s [zrl=%2\$s]vous a tapoté[/zrl]."; App::$strings["[\$Projectname:Notify] %s tagged your post"] = "[\$Projectname:Notify] %s a étiquetté votre publication"; -App::$strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s a étiqueté votre publication sur %3\$s"; -App::$strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s a étiqueté [zrl=%3\$s]votre publication[/zrl]"; +App::$strings["%1\$s tagged your post at %2\$s"] = "%1\$s a étiqueté votre message à %2\$s"; +App::$strings["%1\$s tagged [zrl=%2\$s]your post[/zrl]"] = "%1\$s a étiqueté [zrl=%2\$s]votre message[/zrl]"; App::$strings["[\$Projectname:Notify] Introduction received"] = "[\$Projectname:Notify] Demande de relation reçue"; -App::$strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une demande de contact de '%2\$s' sur %3\$s"; -App::$strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, vous avez reçu [zrl=%2\$s]une demande de contact[/zrl] de %3\$s."; +App::$strings["You've received an new connection request from '%1\$s' at %2\$s"] = "Vous avez reçu une nouvelle demande de connexion de la part de '%1\$s' à %2\$s"; +App::$strings["You've received [zrl=%1\$s]a new connection request[/zrl] from %2\$s."] = "Vous avez reçu [zrl=%1\$s]une nouvelle demande de connexion[/zrl] de la part de %2\$s."; App::$strings["You may visit their profile at %s"] = "Vous pouvez visiter leur profil sur %s"; App::$strings["Please visit %s to approve or reject the connection request."] = "Merci de visiter %s pour valider (ou non) cette demande de contact."; App::$strings["[\$Projectname:Notify] Friend suggestion received"] = "[\$Projectname:Notify] Suggestion d'amitié reçue"; -App::$strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une suggestion d'ami(e) de '%2\$s' à %3\$s"; -App::$strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, avez reçu %3\$s comme [zrl=%2\$s]une suggestion d'ami(e)[/zrl] de %4\$s."; +App::$strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Vous avez reçu une suggestion d'ami de la part de '%1\$s' à %2\$s"; +App::$strings["You've received [zrl=%1\$s]a friend suggestion[/zrl] for %2\$s from %3\$s."] = "Vous avez reçu [zrl=%1\$s]une suggestion d'ami[/zrl] pour %2\$s de %3\$s."; App::$strings["Name:"] = "Nom :"; App::$strings["Photo:"] = "Photo :"; App::$strings["Please visit %s to approve or reject the suggestion."] = "Merci de visiter %s pour valider ou rejeter cette suggestion."; @@ -1842,6 +1856,7 @@ App::$strings["Schedule Inbox"] = "Calendrier - Messages entrants"; App::$strings["Schedule Outbox"] = "Calendrier - Messages sortants"; App::$strings["Total"] = "Total"; App::$strings["Shared"] = "Partagé"; +App::$strings["Add Files"] = "Ajouter des fichiers"; App::$strings["You are using %1\$s of your available file storage."] = "Vous utilisez %1\$s de votre espace de stockage."; App::$strings["You are using %1\$s of %2\$s available file storage. (%3\$s%)"] = "Vous utilisez %1\$s sur %2\$s d'espace disponible. (%3\$s%)"; App::$strings["WARNING:"] = "AVERTISSEMENT :"; @@ -1913,17 +1928,19 @@ App::$strings["Suggestions"] = "Suggestions"; App::$strings["See more..."] = "Voir plus..."; App::$strings["Saved Folders"] = "Dossiers sauvegardés"; App::$strings["Click to show more"] = "Cliquer pour voir plus"; +App::$strings["Tags"] = "Étiquettes"; App::$strings["Profile Creation"] = "Création de profil"; App::$strings["Upload profile photo"] = "Téléverser la photo du profil"; App::$strings["Upload cover photo"] = "Téléverser la photo de couverture"; App::$strings["Edit your profile"] = "Modifier votre profil"; App::$strings["Find and Connect with others"] = "Trouver et connecter avec des autres personnes"; +App::$strings["View the directory"] = "Voir l'annuaire"; App::$strings["Manage your connections"] = "Gérez vos connexions"; App::$strings["Communicate"] = "Communiquer"; App::$strings["View your channel homepage"] = "Voir la page d'accueil de votre canal"; App::$strings["View your network stream"] = "Visualisez votre flux réseau"; App::$strings["Documentation"] = "Documentation"; -App::$strings["View public stream. Warning: not moderated"] = "Voir le flux public. Avertissement : non modéré"; +App::$strings["View public stream"] = "Voir le flux public"; App::$strings["New Member Links"] = "Liens pour les nouveaux membres"; App::$strings["Member registrations waiting for confirmation"] = "Inscriptions en attente d'approbation"; App::$strings["Inspect queue"] = "Analyser la file d'attente"; @@ -1937,7 +1954,8 @@ App::$strings["Addon settings"] = "Paramètres de greffon"; App::$strings["Display settings"] = "Paramètres d'affichage"; App::$strings["Manage locations"] = "Gérer les emplacements"; App::$strings["Export channel"] = "Exporter le canal"; -App::$strings["Connected apps"] = "Applications connectées"; +App::$strings["OAuth1 apps"] = "OAuth1 applications"; +App::$strings["OAuth2 apps"] = "OAuth2 applications"; App::$strings["Permission Groups"] = "Groupes d'accès"; App::$strings["Premium Channel Settings"] = "Paramètres de canal VIP"; App::$strings["Bookmarked Chatrooms"] = "Salons favoris"; @@ -2032,6 +2050,7 @@ App::$strings["Reminder note"] = "Note de rappel"; App::$strings["Enter a note to be displayed when you are within the specified proximity..."] = "Saisissez une note à afficher quand vous serez à la distance indiquée..."; App::$strings["Add new rendezvous"] = "Ajouter un nouveau rendezvous"; App::$strings["Create a new rendezvous and share the access link with those you wish to invite to the group. Those who open the link become members of the rendezvous. They can view other member locations, add markers to the map, or share their own locations with the group."] = "Créez un nouveau rendez-vous et partagez le lien d'accès avec les gens que vous souhaitez inviter au groupe. Ceux qui ouvrent le lien deviennent membres du rendez-vous. Ils peuvent afficher les emplacements des autres membres, ajouter des marqueurs à la carte ou partager leurs propres emplacements avec le groupe."; +App::$strings["You have no rendezvous. Press the button above to create a rendezvous!"] = "Vous n'avez pas de rendez-vous. Appuyez sur le bouton ci-dessus pour créer un rendez-vous !"; App::$strings["Some setting"] = "Un certain paramètre"; App::$strings["A setting"] = "Un paramètre"; App::$strings["Skeleton Settings"] = "Paramètres du squelette"; @@ -2305,7 +2324,7 @@ App::$strings["Configuration Help"] = "Aide pour la configuration"; App::$strings["Jappix Mini Settings"] = "Paramètres de Jappix mini"; App::$strings["Currently blocked"] = "Actuellement bloqué"; App::$strings["No channels currently blocked"] = "Aucun canal n'est actuellement bloqué"; -App::$strings["\"Superblock\" Settings"] = "Paramètres \"Superblock\""; +App::$strings["Superblock Settings"] = "Paramètres de Superblock"; App::$strings["Block Completely"] = "Bloquer complètement"; App::$strings["superblock settings updated"] = "Les paramètres du superblock ont été mis à jour"; App::$strings["Federate"] = "Fédérer"; @@ -2404,7 +2423,7 @@ App::$strings["Cancel Connection Process"] = "Annuler le processus de prise de c App::$strings["Current GNU social API is"] = "L'API GNU-social courante est"; App::$strings["Cancel GNU social Connection"] = "Annuler la connexion GNU-social"; App::$strings["Currently connected to: "] = "Actuellement connecté à :"; -App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "Remarque : en raison de vos paramètres de confidentialité (masquer les détails de votre profil aux visiteurs inconnus? ), le lien potentiellement inclus dans les annonces publiques relayées sur GNU-social amènera le visiteur à une page vierge informant le visiteur que l'accès à votre profil a été restreint."; +App::$strings["<strong>Note</strong>: Due your privacy settings (<em>Hide your profile details from unknown viewers?</em>) the link potentially included in public postings relayed to GNU social will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Remarque</strong> : en raison de vos paramètres de confidentialité (<em>masquer les détails de votre profil aux visiteurs inconnus ?</em>), le lien potentiellement inclus dans les annonces publiques relayées sur GNU-social amènera le visiteur à une page vierge informant le visiteur que l'accès à votre profil a été restreint."; App::$strings["Allow posting to GNU social"] = "Autoriser la publication sur GNU-social"; App::$strings["If enabled your public postings can be posted to the associated GNU-social account"] = "Si cette option est activée, vos publications publiques peuvent être publiées sur le compte GNU-social associé."; App::$strings["Post to GNU social by default"] = "Par défaut, publier sur GNU-social"; @@ -2442,6 +2461,24 @@ App::$strings["Twitter Post Settings"] = "Paramètres des publications Twitter"; App::$strings["Deactivate the feature"] = "Désactiver la fonctionnalité"; App::$strings["Hide the button and show the smilies directly."] = "Cacher le bouton et afficher les émoticônes directement."; App::$strings["Smileybutton Settings"] = "Paramètres du bouton des émoticônes"; +App::$strings["Order Not Found"] = "Commande introuvable"; +App::$strings["Order cannot be checked out."] = "La commande ne peut pas être finalisée."; +App::$strings["Enable Shopping Cart"] = "Activer le panier d'achats"; +App::$strings["Enable Test Catalog"] = "Activer le catalogue de test"; +App::$strings["Enable Manual Payments"] = "Activer les paiements manuels"; +App::$strings["Base Cart Settings"] = "Paramètres de base du panier"; +App::$strings["Add Item"] = "Ajouter un article"; +App::$strings["Call cart_post_"] = "Appeler cart_post_"; +App::$strings["Cart Not Enabled (profile: "] = "Panier non activé (profile:"; +App::$strings["Order not found."] = "Commande introuvable."; +App::$strings["No Order Found"] = "Aucune commande trouvée"; +App::$strings["call: "] = "appel:"; +App::$strings["An unknown error has occurred Please start again."] = "Une erreur inconnue s'est produite. Veuillez recommencer."; +App::$strings["Invalid Payment Type. Please start again."] = "Type de paiement non valable. Recommencez, s'il vous plaît."; +App::$strings["Order not found"] = "Commande non trouvée"; +App::$strings["Error: order mismatch. Please try again."] = "Erreur : non-appariement de commande. Veuillez réessayer."; +App::$strings["Manual payments are not enabled."] = "Les paiements manuels ne sont pas activés."; +App::$strings["Finished"] = "Terminé."; App::$strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site web est surveillé grâce à l'outil d'analyse <a href='http://www.piwik.org'>Piwik</a>."; App::$strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient enregistrées de cette façon, <a href='%s'>vous pouvez\ndéfinir un cookie pour empêcher Piwik de suivre davantage de visites du site</a> (opt-out)."; App::$strings["Piwik Base URL"] = "URL de base Piwik"; @@ -2626,8 +2663,8 @@ App::$strings["Uncertain"] = "Incertain"; App::$strings["It's complicated"] = "C'est compliqué"; App::$strings["Don't care"] = "S'en fiche"; App::$strings["Ask me"] = "Me demander"; -App::$strings["likes %1\$s's %2\$s"] = "aime %1\$s's %2\$s"; -App::$strings["doesn't like %1\$s's %2\$s"] = "n'aime pas %1\$s's %2\$s"; +App::$strings["likes %1\$s's %2\$s"] = "aime le %2\$s de %1\$s"; +App::$strings["doesn't like %1\$s's %2\$s"] = "n'aime pas le %2\$s de%1\$s "; App::$strings["%1\$s is now connected with %2\$s"] = "%1\$s ajoute %2\$s à ses contacts"; App::$strings["%1\$s poked %2\$s"] = "%1\$s a tapoté %2\$s"; App::$strings["poked"] = "a tapoté"; @@ -2641,7 +2678,6 @@ App::$strings["Delete Selected Items"] = "Supprimer les éléments selectionnés App::$strings["View Source"] = "Voir source"; App::$strings["Follow Thread"] = "Suivre la discussion"; App::$strings["Unfollow Thread"] = "Ne plus suivre la discussion"; -App::$strings["Activity/Posts"] = "Activité/Publications"; App::$strings["Edit Connection"] = "Modifier le contact"; App::$strings["Message"] = "Message"; App::$strings["%s likes this."] = "%s aime ça."; @@ -2664,7 +2700,7 @@ App::$strings["%s don't like this."] = "%s n'aime pas ça."; App::$strings["Set your location"] = "Spécifier votre emplacement géographique"; App::$strings["Clear browser location"] = "Supprimer l'emplacement géographique du navigateur"; App::$strings["Tag term:"] = "Étiquette :"; -App::$strings["Where are you right now?"] = "Où êtes-vous en ce moment ?"; +App::$strings["Where are you right now?"] = "Où êtes-vous en ce moment ?"; App::$strings["Choose a different album..."] = "Choisissez un autre album"; App::$strings["Comments enabled"] = "Commentaires activés"; App::$strings["Comments disabled"] = "Commentaires désactivés"; @@ -2725,6 +2761,7 @@ App::$strings["Safe Mode"] = "Mode sûr"; App::$strings["Public Forums Only"] = "Les forums publics uniquement"; App::$strings["This Website Only"] = "Ce site uniquement"; App::$strings["%1\$s's bookmarks"] = "Favoris de %1\$s"; +App::$strings["Unable to import a removed channel."] = "Impossible d'importer un canal supprimé."; App::$strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "L'import a échoué. Un canal existe déjà avec ce nom"; App::$strings["Cloned channel not found. Import failed."] = "Canal cloné non trouvé. Echec de l'import."; App::$strings["prev"] = "préc."; @@ -2739,7 +2776,7 @@ App::$strings["poke"] = "tapoter"; App::$strings["ping"] = "ping"; App::$strings["pinged"] = "pingé"; App::$strings["prod"] = "encourager"; -App::$strings["prodded"] = "encouragé"; +App::$strings["prodded"] = "à encouragé"; App::$strings["slap"] = "giffler"; App::$strings["slapped"] = "gifflé(e)"; App::$strings["finger"] = "pointer"; @@ -2834,6 +2871,7 @@ App::$strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s a écrit %2\$s q App::$strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site."; App::$strings["Channel location missing."] = "Emplacement du canal introuvable."; App::$strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète."; +App::$strings["Premium channel - please visit:"] = "Canal Premium - s'il vous plaît visitez :"; App::$strings["Channel was deleted and no longer exists."] = "Le canal a été supprimé et n'existe plus."; App::$strings["Remote channel or protocol unavailable."] = "Canal distant ou protocole indisponible."; App::$strings["Channel discovery failed."] = "La tentative d'accéder au canal a échoué."; @@ -2958,8 +2996,8 @@ App::$strings["j F, Y"] = "j F, Y"; App::$strings["j F"] = "j F"; App::$strings["Birthday:"] = "Date de naissance :"; App::$strings["for %1\$d %2\$s"] = "depuis %1\$d %2\$s"; -App::$strings["Sexual Preference:"] = "Orientation sexuelle :"; App::$strings["Tags:"] = "Étiquettes :"; +App::$strings["Sexual Preference:"] = "Orientation sexuelle :"; App::$strings["Political Views:"] = "Opinions politiques :"; App::$strings["Religion:"] = "Religion :"; App::$strings["Hobbies/Interests:"] = "Occupations/Centres d'intérêt :"; @@ -3024,9 +3062,10 @@ App::$strings["Embedded content"] = "Contenu imbriqué"; App::$strings["Embedding disabled"] = "Imbrication désactivée"; App::$strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s accueille favorablement %2\$s"; App::$strings["General Features"] = "Fonctionnalités générales"; -App::$strings["Advanced Profiles"] = "Profils Avancés"; +App::$strings["Display new member quick links menu"] = "Afficher le menu des liens rapides pour les nouveaux membres"; +App::$strings["Advanced Profiles"] = "Profils avancés"; App::$strings["Additional profile sections and selections"] = "Sections et sélections supplémentaires du profil"; -App::$strings["Profile Import/Export"] = "Importer/Exporter le profil"; +App::$strings["Profile Import/Export"] = "Importer/exporter le profil"; App::$strings["Save and load profile details across sites/channels"] = "Sauvegarder et charger les détails d'un profil entre sites/canaux"; App::$strings["Web Pages"] = "Pages web"; App::$strings["Provide managed web pages on your channel"] = "Fournir des pages web, sous votre contrôle, sur votre canal"; @@ -3057,8 +3096,10 @@ App::$strings["Enable management and selection of privacy groups"] = "Active la App::$strings["Multiple Profiles"] = "Profils multiples"; App::$strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils"; App::$strings["Provide alternate connection permission roles."] = "Fournir des rôles d'accès différents pour ce contact."; -App::$strings["OAuth Clients"] = "Clients OAuth"; -App::$strings["Manage authenticatication tokens for mobile and remote apps."] = "Gérer les jetons d'authentification pour les applications mobiles et distantes."; +App::$strings["OAuth1 Clients"] = "Clients OAuth1"; +App::$strings["Manage OAuth1 authenticatication tokens for mobile and remote apps."] = "Gérer les jetons d'authentification OAuth1 pour les applications mobiles et distantes."; +App::$strings["OAuth2 Clients"] = "Clients OAuth2"; +App::$strings["Manage OAuth2 authenticatication tokens for mobile and remote apps."] = "Gérer les jetons d'authentification OAuth2 pour les applications mobiles et distantes."; App::$strings["Access Tokens"] = "Jetons d'accès."; App::$strings["Create access tokens so that non-members can access private content."] = "Créez des jetons d'accès pour que les non-membres puissent accéder au contenu privé."; App::$strings["Post Composition Features"] = "Fonctionnalités de composition"; @@ -3077,6 +3118,8 @@ App::$strings["Content Expiration"] = "Expiration du contenu"; App::$strings["Remove posts/comments and/or private messages at a future time"] = "Supprimer les contributions/commentaires et/ou messages privés plus tard"; App::$strings["Suppress Duplicate Posts/Comments"] = "Supprimer les publications/commentaires en doublon"; App::$strings["Prevent posts with identical content to be published with less than two minutes in between submissions."] = "Empêcher des messages aux contenus identiques d'être publiés à moins de deux minutes d'intervalle"; +App::$strings["Auto-save drafts of posts and comments"] = "Sauvegarde automatique des brouillons de messages et commentaires"; +App::$strings["Automatically saves post and comment drafts in local browser storage to help prevent accidental loss of compositions"] = "Enregistre automatiquement les brouillons de messages et de commentaires dans le stockage local du navigateur pour aider à prévenir la perte accidentelle de compositions."; App::$strings["Network and Stream Filtering"] = "Filtrage du réseau et des flux"; App::$strings["Search by Date"] = "Chercher par date"; App::$strings["Ability to select posts by date ranges"] = "Pouvoir choisir des publications par date"; @@ -3104,7 +3147,6 @@ App::$strings["Star Posts"] = "Pouvoir mettre en avant les publications"; App::$strings["Ability to mark special posts with a star indicator"] = "Pouvoir marquer certaines publications d'une étoile"; App::$strings["Tag Cloud"] = "Nuage de tags"; App::$strings["Provide a personal tag cloud on your channel page"] = "Afficher un nuage de vos tags sur votre canal"; -App::$strings["Tags"] = "Étiquettes"; App::$strings["Keywords"] = "Mots-clefs"; App::$strings["have"] = "ont"; App::$strings["has"] = "a"; @@ -3200,6 +3242,7 @@ App::$strings["Add privacy group"] = "Créer un groupe de contacts"; App::$strings["Channels not in any privacy group"] = "Contacts n'étant dans aucun groupe de contacts"; App::$strings["New window"] = "Nouvelle fenêtre"; App::$strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre ou un onglet différent"; +App::$strings["Delegation session ended."] = "La séance de délégation a pris fin."; App::$strings["Logged out."] = "Deconnecté."; App::$strings["Email validation is incomplete. Please check your email."] = "La validation du courriel est incomplète. Veuillez vérifier l'adresse courriel."; App::$strings["Failed authentication"] = "Échec de l'authentification"; diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index e92de17c4..be632a07e 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -60,7 +60,7 @@ function contact_format(item) { var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick); if(typeof desc === 'undefined') desc = ''; if(desc) desc = ' ('+desc+')'; - return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span></div>".format(item.taggable, item.photo, item.name, desc, item.link); + return "<div class='{0} dropdown-item dropdown-notification clearfix' title='{4}'><img class='menu-img-2' src='{1}'><span class='contactname'>{2}</span><span class='dropdown-sub-text'>{3}</span></div>".format(item.taggable, item.photo, item.name, desc, typeof(item.link) !== 'undefined' ? item.link : desc.replace('(','').replace(')','')); } else return "<div>" + item.text + "</div>"; diff --git a/view/pdl/mod_pubstream.pdl b/view/pdl/mod_pubstream.pdl index abb1a4931..539900155 100644 --- a/view/pdl/mod_pubstream.pdl +++ b/view/pdl/mod_pubstream.pdl @@ -1,6 +1,5 @@ [region=aside] [widget=pubtagcloud][var=trending]8[/var][var=limit]20[/var][/widget] -[widget=pubtagcloud][/widget] [/region] [region=right_aside] [widget=notifications][/widget] |