{{tpl:EntryDate}}
+{{tpl:EntryTitle encode_html="1"}}
+{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+ {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
+
+
From: Vincent Vanwaelscappel '.sprintf(__('You are about to delete the blog %s. Every entry, comment and category will be deleted.'),
- ''.$blog_id.'').' '.__('Please give your password to confirm the blog deletion.').' '.__('XML/RPC interface allows you to edit your blog with an external client.').' '.__('XML/RPC interface is not active. Change settings to enable it.').' '.__('XML/RPC interface is active. You should set the following parameters on your XML/RPC client:').' '.__('No users').' '.html::escapeHTML($details['desc']).' '.
- ' '.
- ''.sprintf(__('version %s'),html::escapeHTML($details['version'])).' ';
- if ($has_parent) {
- if ($is_parent_present) {
- $res .= ''.sprintf(__('(built on "%s")'),html::escapeHTML($parent)).' ';
- } else {
- $res .= ''.sprintf(__('(requires "%s")'),html::escapeHTML($parent)).' ';
- }
- }
- if ($has_css) {
- $res .= ''.__('Stylesheet').'';
- }
- $res .= ' '.sprintf(__('You can find additional themes for your blog on %s.'),
- 'Dotaddict').' '.
- __('To install or upgrade a theme you generally just need to upload it '.
- 'in "Install or upgrade a theme" section.').' '.__('You can install themes by uploading or downloading zip files.').' '.
- __('To enable this function, please give write access to your themes directory.').
- ' '.$e->getMessage().' '.__('No blog').' '.__('Page(s)').' : '.$pager->getLinks().' '.__('Page(s)').' : '.$pager->getLinks().' '.__('No category yet.').' '.html::escapeHTML($rs->cat_title).''.
- ' ('.
- sprintf(($rs->nb_post > 1 ? __('%d entries') : __('%d entry') ),$rs->nb_post).''.
- ', '.__('total:').' '.$rs->nb_total.') '.__('URL:').' '.html::escapeHTML($rs->cat_url).' '.
- sprintf(__('Back to "%s"'),$post_title).' '.sprintf(__('You have one spam comments.'),''.$spam_count.'').' '.
- ''.__('Show it.').' '.sprintf(__('You have %s spam comments.'),''.$spam_count.'').' '.
- ''.__('Show them.').''.__('Blogs').' › '.__('New blog').'
'.
-
- '';
-
- dcPage::close();
-}
-?>
\ No newline at end of file
+/**
+ * @deprecated since 2.27 Use name "admin.blog" on dcCore::app()->admin->url methods
+ *
+ * @package Dotclear
+ * @subpackage Backend
+ *
+ * @copyright Olivier Meunier & Association Dotclear
+ * @copyright GPL-2.0-only
+ */
+require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']);
+
+Dotclear\App::bootstrap('Backend', 'Blog');
diff --git a/admin/blog_del.php b/admin/blog_del.php
index 756d32b..dadf614 100644
--- a/admin/blog_del.php
+++ b/admin/blog_del.php
@@ -1,71 +1,13 @@
getBlog($_POST['blog_id']);
- } catch (Exception $e) {
- $core->error->add($e->getMessage());
- }
-
- if ($rs->isEmpty()) {
- $core->error->add(__('No such blog ID'));
- } else {
- $blog_id = $rs->blog_id;
- }
-}
-
-# Delete the blog
-if (!$core->error->flag() && $blog_id && !empty($_POST['del']))
-{
- if (!$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['pwd']))) {
- $core->error->add(__('Password verification failed'));
- } else {
- try {
- $core->delBlog($blog_id);
- http::redirect('blogs.php?del=1');
- } catch (Exception $e) {
- $core->error->add($e->getMessage());
- }
- }
-}
-
-dcPage::open('Delete a blog');
-
-if (!$core->error->flag())
-{
- echo
- ''.__('Delete a blog').'
'.
- ''.
- ''.(!$standalone ? ''.__('Blogs').' › ' : '').
- html::escapeHTML($blog_name).' › '.
- __('Blog settings').'
';
-
- if (!empty($_GET['add'])) {
- echo '';
- }
-
- if (!empty($_GET['upd'])) {
- echo '';
- }
-
- echo
- ''.__('Parameters').'
'.
- '';
-
- if ($core->auth->isSuperAdmin() && $blog_id != $core->blog->id)
- {
- echo
- '';
- }
-
- # XML/RPC information
- echo ''.__('XML/RPC interface').'
';
-
- echo ''.
- '
';
- }
-
- echo ''.__('Users on this blog').'
';
-
- if (empty($blog_users))
- {
- echo ''.sprintf($user_url_p,html::escapeHTML($k)).
- ' ('.html::escapeHTML(dcUtils::getUserCN(
- $k, $v['name'], $v['firstname'], $v['displayname']
- )).')';
-
- if (!$v['super'] && $core->auth->isSuperAdmin()) {
- echo
- ' - '
- .__('change permissions').'';
- }
-
- echo '
';
-
- echo '';
- if ($v['super']) {
- echo '
';
- }
- }
- }
-
- echo ''.form::radio(array('theme',$radio_id),html::escapeHTML($id),$current,'','',($has_parent && !$is_parent_present)).' '.
- '
'.
- ''.html::escapeHTML($core->blog->name).' › '.__('Blog aspect').'
';
-
- if (!empty($_GET['upd'])) {
- echo '';
- }
-
- if (!empty($_GET['added'])) {
- echo '';
- }
-
- if (!empty($_GET['del'])) {
- echo '';
- }
-
- if ($can_install) {
- echo
- ''.sprintf(__('You are currently using "%s"'),$themes[$core->blog->settings->theme]['name']).'
';
- }
-
- echo
- ''.
- ''.html::escapeHTML($core->blog->name).
- ' › '.__('Blog aspect').' › '.__('Theme configuration').'
'.
- '';
-
- try
- {
- echo '';
- }
- catch (Exception $e)
- {
- echo ''.__('List of blogs').'
';
-
-if (!$core->error->flag())
-{
- if ($core->auth->isSuperAdmin()) {
- echo '';
- }
-
- if (!$show_filters) {
- echo '';
- }
-
- echo
- '';
-
- # Show blogs
- if ($nb_blog == 0)
- {
- echo '
';
-
- echo ''.
- ' ';
-
- while ($rs->fetch()) {
- echo blogLine($rs);
- }
-
- echo ''.__('Blog name').' '.
- ''.__('Last update').' '.
- ''.__('Entries').' '.
- ''.__('Blog ID').' '.
- ' '.
- ''.__('Status').' '.
- '
',$img_status,$txt_status);
-
- return
- ''.
- ' ';
-}
-?>
\ No newline at end of file
+/**
+ * @deprecated since 2.27 Use name "admin.blogs" on dcCore::app()->admin->url methods
+ *
+ * @package Dotclear
+ * @subpackage Backend
+ *
+ * @copyright Olivier Meunier & Association Dotclear
+ * @copyright GPL-2.0-only
+ */
+require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']);
+
+Dotclear\App::bootstrap('Backend', 'Blogs');
diff --git a/admin/categories.php b/admin/categories.php
index b832269..4410449 100644
--- a/admin/categories.php
+++ b/admin/categories.php
@@ -1,188 +1,13 @@
blog->getCategory((integer) $_POST['del_cat']);
- if ($c->isEmpty()) {
- throw new Exception(__('This category does not exist.'));
- }
- unset($c);
- $core->blog->delCategory($_POST['del_cat']);
- http::redirect('categories.php?del=1');
- }
- catch (Exception $e)
- {
- $core->error->add($e->getMessage());
- }
-}
-
-# Reset order
-if (!empty($_POST['reset']))
-{
- try
- {
- $core->blog->resetCategoriesOrder();
- http::redirect('categories.php?reord=1');
- }
- catch (Exception $e)
- {
- $core->error->add($e->getMessage());
- }
-}
-
-/* Display
--------------------------------------------------------- */
-dcPage::open(__('Categories'),
- dcPage::jsToolMan()."\n".
- dcPage::jsLoad('js/_categories.js')
-);
-
-if (!empty($_GET['add'])) {
- echo '';
-}
-if (!empty($_GET['del'])) {
- echo '';
-}
-if (!empty($_GET['reord'])) {
- echo '';
-}
-if (!empty($_GET['moved'])) {
- echo '';
-}
-
-echo 'blog_id).'">'.
- html::escapeHTML($rs->blog_name).' '.
- ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$rs->blog_upddt).' '.
- ''.$core->countBlogPosts($rs->blog_id).' '.
- ''.$blog_id.' '.
- ''.$edit_link.' '.
- ''.$img_status.' '.
- ''.html::escapeHTML($core->blog->name).' › '.__('Categories').'
';
-
-$rs = $core->blog->getCategories(array('post_type'=>'post'));
-
-echo
-''.__('Categories list').'
'.
- '
',-($rs->level - $level));
- }
-
- if ($rs->level <= $level) {
- echo ''.html::escapeHTML($core->blog->name).' › '.
-__('Categories').' › ';
-
-if ($cat_id)
-{
- while($parents->fetch()) {
- echo ''.html::escapeHTML($parents->cat_title).'';
- echo " › ";
- }
-}
-
-echo $title.'
';
-
-echo
-'';
-
-if ($cat_id)
-{
- echo
- ''.__('Move this category').'
'.
- ''.html::escapeHTML($core->blog->name).' › '.__('Edit comment').'
';
-
- echo ''.html::escapeHTML($core->blog->name).' › '.__('Comments').'
';
-
-if (!$core->error->flag())
-{
- # Filters
- if (!$show_filters) {
- echo '';
- }
-
- echo
- '';
-
- if (!$with_spam) {
- $spam_count = $core->blog->getComments(array('comment_status'=>-2),true)->f(0);
- if ($spam_count == 1) {
- echo '
'.dt::dt2str('%d %B %Y',$item->pubdate,'Europe/Paris').': '. - ''.text::cutString(html::clean($item->content),120).'...
'.__('This blog is offline').'
'; -} elseif ($core->blog->status == -1) { - echo ''.__('This blog is removed').'
'; -} - -if (!DC_ADMIN_URL) { - echo - ''. - __('DC_ADMIN_URL is not defined, you should edit your configuration file.'). - '
'; -} - -# Plugins install messages -if (!empty($plugins_install['success'])) -{ - echo ''.
- ''.$i[0].'
'.sprintf(__('Dotclear %s is available!'),$new_v).'
'. - ''.__('Please set a master key (DC_MASTER_KEY) in configuration file.').'
'; -} - -# Check if dotclear is already installed -$schema = dbSchema::init($core->con); -if (in_array($core->prefix.'post',$schema->getTables())) { - $can_install = false; - $err = ''.__('Dotclear is already installed.').'
'; -} - -# Check system capabilites -if (!dcSystemCheck($core->con,$_e)) { - $can_install = false; - $err = ''.__('Dotclear cannot be installed.').'
'.__('This is your first entry. When you\'re ready '. - 'to blog, log in to edit or delete it.').'
'; - $cur->post_content_xhtml = $cur->post_content; - $cur->post_status = 1; - $cur->post_open_comment = 1; - $cur->post_open_tb = 0; - $post_id = $core->blog->addPost($cur); - - # Add a comment to it - $cur = $core->con->openCursor($core->prefix.'comment'); - $cur->post_id = $post_id; - $cur->comment_tz = $default_tz; - $cur->comment_author = __('Dotclear Team'); - $cur->comment_email = 'contact@dotclear.net'; - $cur->comment_site = 'http://www.dotclear.org/'; - $cur->comment_content = __("This is a comment.
\nTo delete it, log in and ". - "view your blog's comments. Then you might remove or edit it.
"); - $core->blog->addComment($cur); - - $step = 1; - } - catch (Exception $e) - { - $err = $e->getMessage(); - } -} - -if (!isset($step)) { - $step = 0; -} -header('Content-Type: text/html; charset=UTF-8'); -?> - - - - - - - - - - -'.sprintf(__('Cache directory %s is not writable.'),DC_TPL_CACHE).'
'.__('Errors:').'
'.$err.''.__('Please provide the following information needed to create the first user.').'
'. - - ''; -} -elseif ($can_install && $step == 1) -{ - echo - ''.__('Dotclear has been successfully installed. Here is some useful information you should keep.').'
'. - - '' . __($e->getMessage()) . '
'); - } - - # Checks system capabilites - require dirname(__FILE__).'/check.php'; - if (!dcSystemCheck($con,$_e)) { - $can_install = false; - throw new Exception(''.__('Dotclear cannot be installed.').'
'.__('Errors:').'
'.$err.''.__('Please provide the following information needed to create your configuration file.').'
'. - -''; -?> -${msg}
`);}};checkQueryString();blog_url.on('focusout',checkQueryString);$('body').on('change','#url_scan',checkQueryString);} +$('#date_format_select,#time_format_select').on('change',function(){if($(this).prop('value')==''){return;} +$(`#${$(this).attr('id').replace('_select', '')}`).prop('value',$(this).prop('value'));$(this).parent().next('.chosen').html($(this).find(':selected').prop('label'));});$('#static_home_url_selector').on('click',(e)=>{window.open('popup_posts.php?plugin_id=admin.blog_pref&type=page','dc_popup','alwaysRaised=yes,dependent=yes,toolbar=yes,height=500,width=760,menubar=no,resizable=yes,scrollbars=yes,status=no');e.preventDefault();return false;});if(typeof jsToolBar==='function'){$('#blog_desc').each(function(){const tbWidgetText=new jsToolBar(this);tbWidgetText.context='blog_desc';tbWidgetText.draw('xhtml');});} +$('#standard-pref h3').toggleWithLegend($('#standard-pref').children().not('h3'),{legend_click:true,user_pref:'dcx_blog_pref_std',});$('#advanced-pref h3').toggleWithLegend($('#advanced-pref').children().not('h3'),{legend_click:true,user_pref:'dcx_blog_pref_adv',});$('#plugins-pref h3').toggleWithLegend($('#plugins-pref').children().not('h3'),{legend_click:true,user_pref:'dcx_blog_pref_plg',});}); \ No newline at end of file diff --git a/admin/js/_blog_pref_popup_posts.js b/admin/js/_blog_pref_popup_posts.js new file mode 100644 index 0000000..6877ec5 --- /dev/null +++ b/admin/js/_blog_pref_popup_posts.js @@ -0,0 +1,3 @@ +'use strict';Object.assign(dotclear,dotclear.getData('admin.blog_pref'));$(()=>{$('#link-insert-cancel').on('click',()=>{window.close();});$('#form-entries tr>td.maximal>a').on('click',function(){function stripBaseURL(url){if(dotclear.base_url!=''&&url.indexOf(dotclear.base_url)==0){return url.substr(dotclear.base_url.length);} +return url;} +const main=window.opener;const title=stripBaseURL($(this).attr('title'));const next=title.indexOf('/');const href=next===-1?title:title.substring(next+1);main.$('#static_home_url').prop('value',href);window.close();});}); \ No newline at end of file diff --git a/admin/js/_blog_theme.js b/admin/js/_blog_theme.js index 325a193..c97052e 100644 --- a/admin/js/_blog_theme.js +++ b/admin/js/_blog_theme.js @@ -1,6 +1,6 @@ - -$(function(){$('#themes-actions').hide();var submit_s=$('#themes-actions input[name=select]');var submit_r=$('#themes-actions input[name=remove]');var details=$('#themes div.theme-details');$('div.theme-actions',details).hide();$('input:radio',details).hide();$('div.theme-info span, div.theme-info a',details).hide();details.removeClass('theme-details').addClass('theme-details-js');var themes_wrapper=$('');var theme_box=$(''+dotclear.msg.website+' '+comment_site+'
'+''+dotclear.msg.email+' '+comment_email+'
'+''+dotclear.msg.ip_address+' '+comment_ip+''+'
'+comment_spam_disp+'
'+dotclear.msg.error+' '+$('rsp',data).text()+'
';}else{var msg=''+dotclear.msg.entry_created+' - '+ -dotclear.msg.edit_entry+'';if($('rsp>post',data).attr('post_status')==1){msg+=' - '+ -dotclear.msg.view_entry+'';} -msg+='
';$('#post_title',f).val('');$('#post_content',f).val('');if(contentTb.getMode()=='wysiwyg'){contentTb.syncContents('textarea');}} -$('fieldset',f).prepend(msg);});}}}); \ No newline at end of file +'use strict';dotclear.dbCommentsCount=(icon)=>{dotclear.jsonServicesGet('getCommentsCount',(data)=>{if(data.ret!=dotclear.dbCommentsCount_Counter){const nb_label=icon.children('span.db-icon-title');if(nb_label.length){nb_label.text(data.ret);} +dotclear.dbCommentsCount_Counter=data.ret;}});};dotclear.dbPostsCount=(icon)=>{dotclear.jsonServicesGet('getPostsCount',(data)=>{if(data.ret!=dotclear.dbPostsCount_Counter){const nb_label=icon.children('span.db-icon-title');if(nb_label.length){nb_label.text(data.ret);} +dotclear.dbPostsCount_Counter=data.ret;}});};dotclear.dbStoreUpdate=(store,icon)=>{dotclear.jsonServicesPost('checkStoreUpdate',(data)=>{if(data.check){icon.children('a').attr('href',`${icon.children('a').attr('href')}#update`);icon.children('a').children('img').attr('src',icon.children('a').children('img').attr('src').replace(/([^\/]+)(\..*)$/g,'$1-update$2'),);icon.children('a').children('.db-icon-title').append('${dotclear.msg.entry_created} - ${dotclear.msg.edit_entry}`;if(data.status==dotclear.post_published){msg+=` - ${dotclear.msg.view_entry}`;} +msg+='
';$('#post_title',f).val('');$('#post_content',f).val('');$('#post_content',f).change();if(typeof jsToolBar==='function'&&dotclear.contentTb.getMode()=='wysiwyg'){dotclear.contentTb.syncContents('textarea');} +$('#cat_id',f).val('0');$('#new_cat_title',f).val('');$('#new_cat_parent',f).val('0');f.append(msg);},{post_title:$('#post_title',f).val(),post_content:$('#post_content',f).val(),cat_id:$('#cat_id',f).val(),post_status:status,post_format:$('#post_format',f).val(),post_lang:$('#post_lang',f).val(),new_cat_title:$('#new_cat_title',f).val(),new_cat_parent:$('#new_cat_parent',f).val(),},(error)=>{const msg=`${dotclear.msg.error} ${error}
`;f.append(msg);},);} +const f=$('#quick-entry');if(f.length>0){Object.assign(dotclear,dotclear.getData('dotclear_quickentry'));if(typeof jsToolBar==='function'){dotclear.contentTb=new jsToolBar($('#post_content',f)[0]);dotclear.contentTb.switchMode($('#post_format',f).val());} +$('input[name=save]',f).on('click',()=>{quickPost(f,dotclear.post_pending);return false;});if($('input[name=save-publish]',f).length>0){const btn=$(``);$('input[name=save-publish]',f).remove();$('input[name=save]',f).after(btn).after(' ');btn.on('click',()=>{quickPost(f,dotclear.post_published);return false;});} +$('#new_cat').toggleWithLegend($('#new_cat').parent().children().not('#new_cat'),{legend_click:true,});$('#quick h3').toggleWithLegend($('#quick').children().not('h3'),{legend_click:true,user_pref:'dcx_quick_entry',});} +dotclear.jsonServicesGet('checkCoreUpdate',(data)=>{if(data.check){$('#content h2').after(data.ret);dotclear.outgoingLinks('#ajax-update a');}});if($('#dashboard-main #icons p #icon-process-plugins-fav').length){const plugins_db_icon=$('#dashboard-main #icons p #icon-process-plugins-fav').parent();dotclear.dbStoreUpdate('plugins',plugins_db_icon);} +if($('#dashboard-main #icons p #icon-process-blog_theme-fav').length){const themes_db_icon=$('#dashboard-main #icons p #icon-process-blog_theme-fav').parent();dotclear.dbStoreUpdate('themes',themes_db_icon);} +dotclear.jsonServicesGet('checkNewsUpdate',(data)=>{if(data.check){if($('#dashboard-boxes').length==0){$('#dashboard-main').append('');} +if($('#dashboard-boxes div.db-items').length==0){$('#dashboard-boxes').prepend('');} +$('#dashboard-boxes div.db-items').prepend(data.ret);dotclear.outgoingLinks('#ajax-news a');}});const icon_comments=$('#dashboard-main #icons p #icon-process-comments-fav');if(icon_comments.length){dotclear.dbCommentsCount(icon_comments);dotclear.dbCommentsCount_Timer=setInterval(dotclear.dbCommentsCount,60*1000,icon_comments);} +const icon_posts=$('#dashboard-main #icons p #icon-process-posts-fav');if(icon_posts.length){dotclear.dbPostsCount(icon_posts);dotclear.dbPostsCount_Timer=setInterval(dotclear.dbPostsCount,600*1000,icon_posts);} +if(!dotclear.data.noDragDrop){const set_positions=(sel,id)=>{const list=$(sel).sortable('toArray').join();dotclear.jsonServicesPost('setDashboardPositions',()=>{},{id,list});};const init_positions=(sel,id)=>{$(sel).sortable({cursor:'move',opacity:0.5,delay:200,distance:10,tolerance:'pointer',update(){set_positions(sel,id);},start(){$(sel).addClass('sortable-area');},stop(){$(sel).removeClass('sortable-area');},});};const reset_positions=(sel)=>{$(sel).sortable('destroy');};const areas=[['#dashboard-main','main_order'],['#dashboard-boxes','boxes_order'],['#db-items','boxes_items_order'],['#db-contents','boxes_contents_order'],];$('#dragndrop').on('click',function(){Object.assign(dotclear,dotclear.getData('dotclear_dragndrop'));if($(this).is(':checked')){areas.forEach((element)=>init_positions(element[0],element[1]));$(this).prop('title',dotclear.dragndrop_on);$('#dragndrop-label').text(dotclear.dragndrop_on);return;} +areas.forEach((element)=>reset_positions(element[0]));$(this).prop('title',dotclear.dragndrop_off);$('#dragndrop-label').text(dotclear.dragndrop_off);});}}); \ No newline at end of file diff --git a/admin/js/_install.js b/admin/js/_install.js new file mode 100644 index 0000000..7b5a82e --- /dev/null +++ b/admin/js/_install.js @@ -0,0 +1 @@ +'use strict';$(()=>{const login_re=/[^A-Za-z0-9@._-]+/g;$('#u_firstname').on('keyup',function(){$('#u_login').val(this.value.toLowerCase().replace(login_re,'').substring(0,32));});$('#u_login').on('keyup',function(){$(this).val(this.value.replace(login_re,''));});dotclear.passwordStrength(dotclear.getData('pwstrength'));$('#u_login').parent().after($(``));const show=dotclear.getData('install_show');const password_link=$(`${show}`).on('click',function(){$('#password').show();$(this).remove();return false;});$('#password').hide().before(password_link);}); \ No newline at end of file diff --git a/admin/js/_langs.js b/admin/js/_langs.js index 8824cff..76f11e0 100644 --- a/admin/js/_langs.js +++ b/admin/js/_langs.js @@ -1,2 +1 @@ - -$(function(){$('table.plugins form input[type=submit][name=delete]').click(function(){var l_name=$(this).parents('tr.line').find('td:first').text();return window.confirm(dotclear.msg.confirm_delete_lang.replace('%s',l_name));});}); \ No newline at end of file +'use strict';$(()=>{$('table.plugins form input[type=submit][name=delete]').on('click',function(){const l_name=$(this).parents('tr.line').find('td:first').text();return window.confirm(dotclear.msg.confirm_delete_lang.replace('%s',l_name));});}); \ No newline at end of file diff --git a/admin/js/_media.js b/admin/js/_media.js index 01e486d..9908544 100644 --- a/admin/js/_media.js +++ b/admin/js/_media.js @@ -1,7 +1,13 @@ - -$(function(){fileRemoveAct();function fileRemoveAct(){$('a.media-remove').click(function(){var m_name=$(this).parents('ul').find('li:first>a').text();if(window.confirm(dotclear.msg.confirm_delete_media.replace('%s',m_name))){var f=$('#media-remove-hide').get(0);f.elements['remove'].value=this.href.replace(/^(.*)&remove=(.*?)(&|$)/,'$2');this.href='';f.submit();} +'use strict';(()=>{$.fn.enhancedUploader=function(){return this.each(function(){const me=$(this);const $container=$(me).parent();function enableButton(button){button.prop('disabled',false).removeClass('disabled');} +function disableButton(button){button.prop('disabled',true).addClass('disabled');} +function displayMessageInQueue(n){let message='';if(n==1){message=dotclear.jsUpload.msg.file_in_queue;}else if(n>1){message=dotclear.jsUpload.msg.files_in_queue;message=message.replace(/%d/,n);}else{message=dotclear.jsUpload.msg.no_file_in_queue;} +$('.queue-message',me).html(message);} +$('.button.choose_files').on('click',(e)=>{if($container.hasClass('enhanced_uploader')){$('#upfile').trigger('click');e.preventDefault();}});$('.button.cancel','#fileupload .fileupload-buttonbar').on('click',()=>{$('.button.cancel','#fileupload .fileupload-buttonbar').hide();disableButton($('.button.start','#fileupload .fileupload-buttonbar'));displayMessageInQueue(0);});$(me).on('click','.cancel',()=>{if($('.fileupload-ctrl .files .template-upload',me).length==0){$('.button.cancel','#fileupload .fileupload-buttonbar').hide();disableButton($('.button.start','#fileupload .fileupload-buttonbar'));} +displayMessageInQueue($('.files .template-upload',me).length);});$('.button.clean',me).on('click',function(e){$('.fileupload-ctrl .files .template-download',me).slideUp(500,function(){$(this).remove();});$(this).hide();e.preventDefault();});$(me).fileupload({url:$(me).attr('action'),autoUpload:false,sequentialUploads:true,uploadTemplateId:null,downloadTemplateId:null,uploadTemplate:dotclear.jsUpload.template_upload,downloadTemplate:dotclear.jsUpload.template_download,}).on('fileuploadadd',()=>{$('.button.cancel').css('display','inline-block');$('#fileupload .fileupload-buttonbar').show();enableButton($('.button.start','#fileupload .fileupload-buttonbar'));}).on('fileuploadadded',()=>{displayMessageInQueue($('.files .template-upload',me).length);}).on('fileuploaddone',(_e,data)=>{if(data.result.files[0].html!==undefined){$('.media-list .media-items-bloc').append(data.result.files[0].html);$('#form-medias .hide').removeClass('hide');} +$('.button.clean').css('display','inline-block');$(me).show();}).on('fileuploadalways',()=>{displayMessageInQueue($('.files .template-upload',me).length);if($('.fileupload-ctrl .files .template-upload',me).length==0){$('.button.cancel','#fileupload .fileupload-buttonbar').hide();disableButton($('.button.start','#fileupload .fileupload-buttonbar'));}});let msg;let label;if($container.hasClass('enhanced_uploader')){msg=dotclear.msg.enhanced_uploader_disable;label=dotclear.jsUpload.msg.choose_files;$(me).fileupload({disabled:false,});displayMessageInQueue(0);disableButton($('.button.start','#fileupload .fileupload-buttonbar'));}else{msg=dotclear.msg.enhanced_uploader_activate;label=dotclear.jsUpload.msg.choose_file;$(me).fileupload({disabled:true,});} +$(``).on('click',function(e){if($container.hasClass('enhanced_uploader')){msg=dotclear.msg.enhanced_uploader_activate;label=dotclear.jsUpload.msg.choose_file;$('#upfile').attr('multiple',false);enableButton($('.button.start','#fileupload .fileupload-buttonbar'));$('.files .upload-file',me).remove();$('.button.cancel,.button.clean','#fileupload .fileupload-buttonbar').hide();$(me).fileupload({disabled:true,});$('.queue-message',me).html('').hide();}else{msg=dotclear.msg.enhanced_uploader_disable;label=dotclear.jsUpload.msg.choose_files;$('#upfile').attr('multiple',true);const startButton=$('.button.start');const buttonBar=$('#fileupload .fileupload-buttonbar');disableButton(startButton);disableButton(buttonBar);startButton.css('display','inline-block');buttonBar.show();$(me).fileupload({disabled:false,});$('.queue-message',me).show();displayMessageInQueue(0);} +$(this).find('button').text(msg);$('.add-label',me).text(label);$container.toggleClass('enhanced_uploader');e.preventDefault();}).appendTo(me);});};})();$(()=>{$('#fileupload').enhancedUploader();$('.checkboxes-helpers').each(function(){dotclear.checkboxesHelpers(this,undefined,'#form-medias input[type="checkbox"]','#form-medias #delete_medias');});dotclear.condSubmit('#form-medias input[type="checkbox"]','#form-medias #delete_medias');$('#form-medias #delete_medias').on('click',(e)=>{const count_checked=$('input[name="medias[]"]:checked',$('#form-medias')).length;if(count_checked==0){e.preventDefault();return false;} +return window.confirm(dotclear.msg.confirm_delete_medias.replace('%d',count_checked));});$('.modal-image').magnificPopup({type:'image',});$('#form-medias').on('click','.media-item .attach-media',function(e){const parts=$(this).prop('href').split('?');const str_params=parts[1].split('&');const postData={};for(const str_param of str_params){const kv=str_param.split('=');postData[kv[0]]=kv[1];} +postData.xd_check=dotclear.nonce;$.post(parts[0],postData,(data)=>{if(data.url!==undefined){document.location=data.url;}});e.preventDefault();});fileRemoveAct();function fileRemoveAct(){$('body').on('click','a.media-remove',function(){const m_name=$(this).parents('.media-item-bloc').find('a.media-link').text();let m_text='';m_text=$(this).parents('div.media-folder').length==0?dotclear.msg.confirm_delete_media.replace('%s',m_name):dotclear.msg.confirm_delete_directory.replace('%s',m_name);if(window.confirm(m_text)){const f=$('#media-remove-hide').get(0);f.elements.remove.value=this.href.replace(/^(.*)&remove=(.*?)(&|$)/,'$2');this.href='';f.submit();} return false;});} -if(!$.browser.opera){var upldr=$(''+dotclear.msg.activate_enhanced_uploader+'').click(function(){candyUploadInit();return false;});$('#media-upload>fieldset').append($('').append(upldr));if($.cookie('dc_candy_upl')==1){candyUploadInit();}} -function candyUploadInit() -{var candy_upload_success=false;var candy_upload_form_url=$('#media-upload').attr('action')+'&file_sort=date-desc&d='+$('#media-upload input[name=d]').val();var candy_upload_limit=$('#media-upload input[name=MAX_FILE_SIZE]').val();$('#media-upload').candyUpload({upload_url:dotclear.candyUpload.base_url+'/media.php',flash_movie:dotclear.candyUpload.movie_url,file_size_limit:candy_upload_limit+'b',params:'swfupload=1&'+dotclear.candyUpload.params,callbacks:{createControls:function(){var _this=this;var l=$(''+dotclear.msg.disable_enhanced_uploader+'').click(function(){_this.upldr.destroy();_this.ctrl.block.empty().remove();$('#media-upload').show();delete _this;$.cookie('dc_candy_upl','',{expires:-1});return false;});this.ctrl.disable=$('').append(l).appendTo(this.ctrl.block);},flashReady:function(){this.ctrl.btn_browse.addClass('button');this.ctrl.block.append(this.ctrl.disable);},uploadSuccess:function(o,data){if(data=='ok'){candy_upload_success=true;this.fileMsg(o.id,this.locales.file_uploaded);}else{this.fileErrorMsg(o.id,data);} -if(candy_upload_success&&$('div.cu-file:has(span.cu-filecancel a)',this.ctrl.files).length==0){$.cookie('dc_candy_upl','1',{expires:30});$.get(candy_upload_form_url,function(data){var media=$('div.media-list');media.after($('div.media-list',data)).remove();fileRemoveAct();});}}}});}}); \ No newline at end of file +const urlmenu=document.getElementById('switchfolder');if(urlmenu){urlmenu.onchange=function(){window.location=this.options[this.selectedIndex].value;};}}); \ No newline at end of file diff --git a/admin/js/_media_item.js b/admin/js/_media_item.js index c9a2eeb..c085db5 100644 --- a/admin/js/_media_item.js +++ b/admin/js/_media_item.js @@ -1,4 +1,2 @@ - -$(function(){$('#media-details-tab').onetabload(function(){var media_dt=document.getElementById('media_dt');if(media_dt==undefined){return;} -var post_dtPick=new datePicker(media_dt);post_dtPick.img_top='1.5em';post_dtPick.draw();});$('#file-unzip').each(function(){var a=document.createElement('a');var mediaId=$(this).find('input[name=id]').val();var self=$(this);a.href='#';$(a).text(dotclear.msg.zip_file_content);self.before(a);$(a).wrap('');$(a).click(function(){$.get('services.php',{f:'getZipMediaContent',id:mediaId},function(data){var rsp=$(data).children('rsp')[0];if(rsp.attributes[0].value=='ok'){var div=document.createElement('div');var list=document.createElement('ul');var expanded=false;$(div).css({overflow:'auto',border:'1px solid #ccc',margin:'1em 0',padding:'1px 0.5em'});$(div).append(list);self.before(div);$(a).hide();$(div).before(''+dotclear.msg.website+' '+comment_site+'
'+''+dotclear.msg.email+' '+
-comment_email+'
'+comment_spam_disp+'
'+dotclear.msg.xhtml_not_valid+'
'+$(data).find('errors').text());$(div).insertAfter(h);$(div).backgroundFade({sColor:'#ffffff',eColor:'#ff9999',steps:50},function(){$(this).backgroundFade({sColor:'#ff9999',eColor:'#ffffff'});});} -return false;});return false;});a.appendChild(document.createTextNode(dotclear.msg.xhtml_validator));h.appendChild(a);$(h).appendTo('#entry-content');});$('#comments').onetabload(function(){$('.comments-list tr.line').each(function(){dotclear.commentExpander(this);});$('.checkboxes-helpers').each(function(){dotclear.checkboxesHelpers(this);});dotclear.commentsActionsHelper();});$('#add-comment').onetabload(function(){commentTb.draw('xhtml');});}); \ No newline at end of file +'use strict';dotclear.viewCommentContent=(line,_action='toggle',e=null)=>{if($(line).attr('id')==undefined){return;} +const commentId=$(line).attr('id').substr(1);const lineId=`ce${commentId}`;let tr=document.getElementById(lineId);const clean=e.metaKey||$(line).hasClass('sts-junk');if(tr){$(tr).toggle();$(line).toggleClass('expand');}else{dotclear.getCommentContent(commentId,(content)=>{if(content){tr=document.createElement('tr');tr.id=lineId;const td=document.createElement('td');td.colSpan=$(line).children('td').length;td.className='expand';tr.appendChild(td);$(td).append(content);$(line).addClass('expand');line.parentNode.insertBefore(tr,line.nextSibling);}else{$(line).removeClass('expand');}},{ip:false,clean,},);}};$(()=>{const dtTodayHelper=(e)=>{e.preventDefault();const field=e.currentTarget.previousElementSibling;const now=new Date();now.setMinutes(now.getMinutes()-now.getTimezoneOffset());field.value=now.toISOString().slice(0,16);};const dtTodayButtonTemplate=new DOMParser().parseFromString(``,'text/html',).body.firstChild;const dtField=document.querySelector('#post_dt');const button=dtTodayButtonTemplate.cloneNode(true);dtField.after(button);dtField.classList.add('today_helper');button.addEventListener('click',dtTodayHelper);let preview_url=$('#post-preview').attr('href');if(preview_url){const $a=document.createElement('a');$a.href=$('#post-preview').attr('href');preview_url=$a.href;const has_modal=$('#post-preview').hasClass('modal');if(has_modal&&window.location.protocol==preview_url.substring(0,window.location.protocol.length)){$('#post-preview').magnificPopup({type:'iframe',iframe:{patterns:{dotclear_preview:{index:preview_url,src:preview_url,},},},});}else{if(has_modal){$('#post-preview').on('click',function(e){e.preventDefault();window.open($(this).attr('href'));});}}} +history.pushState(null,null);window.addEventListener('popstate',()=>{if(document.querySelector('.mfp-ready')){history.go(1);$.magnificPopup.close();}});$('#edit-entry').on('onetabload',()=>{dotclear.hideLockable();$('input[name="delete"]').on('click',()=>window.confirm(dotclear.msg.confirm_delete_post));$('#notes-area label').toggleWithLegend($('#notes-area').children().not('label'),{user_pref:'dcx_post_notes',legend_click:true,hide:$('#post_notes').val()=='',});$('#post_lang').parent().children('label').toggleWithLegend($('#post_lang'),{user_pref:'dcx_post_lang',legend_click:true,});$('#post_password').parent().children('label').toggleWithLegend($('#post_password').parent().children().not('label'),{user_pref:'dcx_post_password',legend_click:true,hide:$('#post_password').val()=='',});$('#post_status').parent().children('label').toggleWithLegend($('#post_status'),{user_pref:'dcx_post_status',legend_click:true,});$('#post_dt').parent().children('label').toggleWithLegend($('#post_dt').parent().children().not('label'),{user_pref:'dcx_post_dt',legend_click:true,});$('#label_format').toggleWithLegend($('#label_format').parent().children().not('#label_format'),{user_pref:'dcx_post_format',legend_click:true,});$('#label_cat_id').toggleWithLegend($('#label_cat_id').parent().children().not('#label_cat_id'),{user_pref:'dcx_cat_id',legend_click:true,});$('#create_cat').toggleWithLegend($('#create_cat').parent().children().not('#create_cat'),{legend_click:true,});$('#label_comment_tb').toggleWithLegend($('#label_comment_tb').parent().children().not('#label_comment_tb'),{user_pref:'dcx_comment_tb',legend_click:true,});$('#post_url').parent().children('label').toggleWithLegend($('#post_url').parent().children().not('label'),{user_pref:'post_url',legend_click:true,});$('#excerpt-area label').toggleWithLegend($('#excerpt-area').children().not('label'),{user_pref:'dcx_post_excerpt',legend_click:true,hide:$('#post_excerpt').val()=='',});$('a.attachment-remove').on('click',function(){this.href='';const m_name=$(this).parents('ul').find('li:first>a').attr('title');if(window.confirm(dotclear.msg.confirm_remove_attachment.replace('%s',m_name))){const f=$('#attachment-remove-hide').get(0);f.elements.media_id.value=this.id.substring(11);f.submit();} +return false;});});$('#comments').on('onetabload',()=>{$.expandContent({line:$('#form-comments .comments-list tr:not(.line)'),lines:$('#form-comments .comments-list tr.line'),callback:dotclear.viewCommentContent,});$('#form-comments .checkboxes-helpers').each(function(){dotclear.checkboxesHelpers(this);});dotclear.commentsActionsHelper();});$('#trackbacks').on('onetabload',()=>{$.expandContent({line:$('#form-trackbacks .comments-list tr:not(.line)'),lines:$('#form-trackbacks .comments-list tr.line'),callback:dotclear.viewCommentContent,});$('#form-trackbacks .checkboxes-helpers').each(function(){dotclear.checkboxesHelpers(this);});dotclear.commentsActionsHelper();});$('#add-comment').on('onetabload',()=>{dotclear.commentTb.draw('xhtml');});}); \ No newline at end of file diff --git a/admin/js/_posts_actions.js b/admin/js/_posts_actions.js new file mode 100644 index 0000000..4dc5701 --- /dev/null +++ b/admin/js/_posts_actions.js @@ -0,0 +1,2 @@ +'use strict';$(()=>{const new_auth_id=$('#new_auth_id');if(new_auth_id.length){const usersList=dotclear.getData('users_list');new_auth_id.autocomplete(usersList,{delay:1000,matchSubset:true,matchContains:true,});} +$('#new_cat').toggleWithLegend($('#new_cat').parent().children().not('#new_cat'),{legend_click:true,});dotclear.condSubmit('table.posts-list td input[type=checkbox]','input[type=submit]');}); \ No newline at end of file diff --git a/admin/js/_posts_list.js b/admin/js/_posts_list.js index f4ca648..5e8cd3a 100644 --- a/admin/js/_posts_list.js +++ b/admin/js/_posts_list.js @@ -1,7 +1,2 @@ - -dotclear.postExpander=function(line){var td=line.firstChild;var img=document.createElement('img');img.src=dotclear.img_plus_src;img.alt=dotclear.img_plus_alt;img.className='expand';$(img).css('cursor','pointer');img.line=line;img.onclick=function(){dotclear.viewPostContent(this,this.line);};td.insertBefore(img,td.firstChild);};dotclear.viewPostContent=function(img,line){var postId=line.id.substr(1);var tr=document.getElementById('pe'+postId);if(!tr){tr=document.createElement('tr');tr.id='pe'+postId;var td=document.createElement('td');td.colSpan=8;td.className='expand';tr.appendChild(td);img.src=dotclear.img_minus_src;img.alt=dotclear.img_minus_alt;$.get('services.php',{f:'getPostById',id:postId,post_type:''},function(data){var rsp=$(data).children('rsp')[0];if(rsp.attributes[0].value=='ok'){var post=$(rsp).find('post_display_content').text();var post_excerpt=$(rsp).find('post_display_excerpt').text();var res='';if(post){if(post_excerpt){res+=post_excerpt+'
');var select=$();img.click(function(){return toggle();});$('#content').append(img);return this;};var dotclear={msg:{},hideLockable:function(){$('div.lockable').each(function(){var current_lockable_div=this;$(this).find('p.form-note').hide();$(this).find('input').each(function(){this.disabled=true;$(this).width(($(this).width()-14)+'px');var imgE=document.createElement('img');imgE.src='images/locker.png';imgE.style.position='absolute';imgE.style.top='1.7em';imgE.style.left=($(this).width()+4)+'px';$(imgE).css('cursor','pointer');$(imgE).click(function(){$(this).hide();$(this).prev('input').each(function(){this.disabled=false;$(this).width(($(this).width()+14)+'px');});$(current_lockable_div).find('p.form-note').show();});$(this).parent().css('position','relative');$(this).after(imgE);});});},checkboxesHelpers:function(e){var a=document.createElement('a');a.href='#';$(a).append(document.createTextNode(dotclear.msg.select_all));a.onclick=function(){$(this).parents('form').find('input[type="checkbox"]').check();return false;};$(e).append(a);$(e).append(document.createTextNode(' - '));a=document.createElement('a');a.href='#';$(a).append(document.createTextNode(dotclear.msg.invert_sel));a.onclick=function(){$(this).parents('form').find('input[type="checkbox"]').toggleCheck();return false;};$(e).append(a);},postsActionsHelper:function(){$('#form-entries').submit(function(){var action=$(this).find('select[name="action"]').val();var checked=false;$(this).find('input[name="entries[]"]').each(function(){if(this.checked){checked=true;}});if(!checked){return false;}
-if(action=='delete'){return window.confirm(dotclear.msg.confirm_delete_posts);}
-return true;});},commentsActionsHelper:function(){$('#form-comments').submit(function(){var action=$(this).find('select[name="action"]').val();var checked=false;$(this).find('input[name="comments[]"]').each(function(){if(this.checked){checked=true;}});if(!checked){return false;}
-if(action=='delete'){return window.confirm(dotclear.msg.confirm_delete_comments);}
-return true;});}};$(function(){$('#switchblog').change(function(){this.form.submit();});var menu_settings={img_on_src:dotclear.img_menu_off,img_off_src:dotclear.img_menu_on,legend_click:true,speed:100}
-$('#blog-menu h3:first').toggleWithLegend($('#blog-menu ul:first'),$.extend({cookie:'dc_blog_menu',hide:false,reverse_cookie:true},menu_settings));$('#system-menu h3:first').toggleWithLegend($('#system-menu ul:first'),$.extend({cookie:'dc_system_menu'},menu_settings));$('#plugins-menu h3:first').toggleWithLegend($('#plugins-menu ul:first'),$.extend({cookie:'dc_plugins_menu'},menu_settings));$('#help').helpViewer();$('.message').backgroundFade({sColor:'#cccccc',eColor:'#666666',steps:20});$('.error').backgroundFade({sColor:'#f5e5e5',eColor:'#e5bfbf',steps:20});$('form:has(input[type=password][name=your_pwd])').submit(function(){var e=this.elements['your_pwd'];if(e.value==''){e.focus();$(e).backgroundFade({sColor:'#ffffff',eColor:'#ff9999',steps:50},function(){$(this).backgroundFade({sColor:'#ff9999',eColor:'#ffffff'});});return false;}
-return true;});});
\ No newline at end of file
+'use strict';dotclear.data=dotclear.getData('dotclear_init');if(typeof dotclear.data.htmlFontSize!=='undefined'){document.documentElement.style.setProperty('--html-font-size',dotclear.data.htmlFontSize);}
+if(typeof dotclear.data.systemFont!=='undefined'){document.documentElement.style.setProperty('--dc-font','dotclear');}
+dotclear.data.theme='light';if(document.documentElement.getAttribute('data-theme')!==''){dotclear.data.theme=document.documentElement.getAttribute('data-theme');}else if(window?.matchMedia('(prefers-color-scheme: dark)').matches){dotclear.data.theme='dark';}
+dotclear.data.lowdata=false;if(window?.matchMedia('(prefers-reduced-data: reduce)').matches){dotclear.data.lowdata=true;}
+document.documentElement.style.setProperty('--dark-mode',dotclear.data.theme==='dark'?1:0);$.fn.check=function(){return this.each(function(){if(this.checked!=undefined){this.checked=true;}});};$.fn.unCheck=function(){return this.each(function(){if(this.checked!=undefined){this.checked=false;}});};$.fn.setChecked=function(status){return this.each(function(){if(this.checked!=undefined){this.checked=status;}});};$.fn.toggleCheck=function(){return this.each(function(){if(this.checked!=undefined){this.checked=!this.checked;}});};$.fn.enableShiftClick=function(){this.on('click',function(event){if(event.shiftKey){if(dotclear.lastclicked!=''){let range;const trparent=$(this).parents('tr');const id=`#${dotclear.lastclicked}`;range=trparent.nextAll(id).length==0?trparent.prevUntil(id):trparent.nextUntil(id);range.find('input[type=checkbox]').setChecked(dotclear.lastclickedstatus);this.checked=dotclear.lastclickedstatus;}}else{dotclear.lastclicked=$(this).parents('tr')[0].id;dotclear.lastclickedstatus=this.checked;}
+return true;});};$.fn.toggleWithLegend=function(target,s){const defaults={img_on_txt:dotclear.img_plus_txt,img_on_alt:dotclear.img_plus_alt,img_off_txt:dotclear.img_minus_txt,img_off_alt:dotclear.img_minus_alt,unfolded_sections:dotclear.unfolded_sections,hide:true,legend_click:false,fn:false,user_pref:false,reverse_user_pref:false,};const p=$.extend(defaults,s);if(!target){return this;}
+const set_user_pref=p.hide^p.reverse_user_pref;if(p.user_pref&&p.unfolded_sections!==undefined&&p.user_pref in p.unfolded_sections){p.hide=p.reverse_user_pref;}
+const toggle=(i)=>{const b=$(i).get(0);if(p.hide){b.firstChild.data=p.img_on_txt;b.setAttribute('value',p.img_on_txt);b.setAttribute('aria-label',p.img_on_alt);b.setAttribute('aria-expanded',false);target.addClass('hide');}else{b.firstChild.data=p.img_off_txt;b.setAttribute('value',p.img_off_txt);b.setAttribute('aria-label',p.img_off_alt);b.setAttribute('aria-expanded',true);target.removeClass('hide');if(p.fn){p.fn.apply(target);p.fn=false;}}
+p.hide=!p.hide;};return this.each(function(){const b=document.createElement('button');b.setAttribute('type','button');b.className='details-cmd';b.value=p.img_on_txt;b.setAttribute('aria-label',p.img_on_alt);const t=document.createTextNode(p.img_on_txt);b.appendChild(t);const ctarget=p.legend_click?this:b;$(ctarget).css('cursor','pointer');if(p.legend_click){$(ctarget).find('label').css('cursor','pointer');}
+$(ctarget).on('click',(e)=>{if(p.user_pref&&set_user_pref){dotclear.jsonServicesPost('setSectionFold',()=>{},{section:p.user_pref,value:p.hide^p.reverse_user_pref?1:0,});}
+toggle(b);e.preventDefault();return false;});toggle($(b).get(0));$(this).prepend(b);});};$.fn.toggleWithDetails=function(s){const target=this;const defaults={unfolded_sections:dotclear.unfolded_sections,hide:true,fn:false,user_pref:false,reverse_user_pref:false,};const p=$.extend(defaults,s);if(p.user_pref&&p.unfolded_sections!==undefined&&p.user_pref in p.unfolded_sections){p.hide=p.reverse_user_pref;}
+const toggle=()=>{if(!p.hide&&p.fn){p.fn.apply(target);p.fn=false;}
+p.hide=!p.hide;if(p.hide&&target.attr('open')){target.removeAttr('open');}else if(!p.hide&&!target.attr('open')){target.attr('open','open');}};return this.each(()=>{$(target).on('click',(e)=>{if(p.user_pref){dotclear.jsonServicesPost('setSectionFold',()=>{},{section:p.user_pref,value:p.hide^p.reverse_user_pref?1:0,});}
+toggle();e.preventDefault();return false;});toggle();});};(()=>{$.expandContent=(opts)=>{if(opts==undefined||opts.callback==undefined||typeof opts.callback!=='function'){return;}
+if(opts.line!=undefined){multipleExpander(opts.line,opts.lines,opts.callback);}
+opts.lines.each(function(){singleExpander(this,opts.callback);});};const singleExpander=(line,callback)=>{$(``,).on('click',function(e){if(toggleArrow(this)!==''){callback(line,'',e);}
+e.preventDefault();}).prependTo($(line).children().get(0));};const multipleExpander=(line,lines,callback)=>{$(``,).on('click',function(e){const action=toggleArrow(this);lines.each(function(){if(toggleArrow(this.firstChild.firstChild,action)!==''){callback(this,action,e);}});e.preventDefault();}).prependTo($(line).children().get(0));};const toggleArrow=(button,action='')=>{if(action==''){action=button.getAttribute('aria-label')==dotclear.img_plus_alt?'open':'close';}
+if(action=='open'&&button.getAttribute('aria-expanded')=='false'){button.firstChild.data=dotclear.img_minus_txt;button.setAttribute('value',dotclear.img_minus_txt);button.setAttribute('aria-label',dotclear.img_minus_alt);button.setAttribute('aria-expanded',true);}else if(action=='close'&&button.getAttribute('aria-expanded')=='true'){button.firstChild.data=dotclear.img_plus_txt;button.setAttribute('value',dotclear.img_plus_txt);button.setAttribute('aria-label',dotclear.img_plus_alt);button.setAttribute('aria-expanded',false);}else{return'';}
+return action;};})();$.fn.helpViewer=function(){if(this.length<1){return this;}
+const p={img_on_txt:dotclear.img_plus_txt,img_on_alt:dotclear.img_plus_alt,img_off_txt:dotclear.img_minus_txt,img_off_alt:dotclear.img_minus_alt,};const toggle=()=>{$('#content').toggleClass('with-help');$('p#help-button span a').text($('#content').hasClass('with-help')?dotclear.msg.help_hide:dotclear.msg.help);sizeBox();return false;};const sizeBox=()=>{this.css('height','auto');if($('#wrapper').height()>this.height()){this.css('height',`${$('#wrapper').height()}px`);}};const textToggler=(o)=>{const b=$(``);o.css('cursor','pointer');let hide=true;o.prepend(' ').prepend(b);o.on('click',function(){$(this).nextAll().each(function(){if($(this).is('h4')){return false;}
+$(this).toggle();sizeBox();return true;});hide=!hide;const image=$(this).find('button.details-cmd');if(hide){image.html(p.img_on_txt);image.attr('value',p.img_on_txt);image.attr('aria-label',p.img_on_alt);return;}
+image.html(p.img_off_txt);image.attr('value',p.img_off_txt);image.attr('aria-label',p.img_off_alt);});};this.addClass('help-box');this.find('>hr').remove();this.find('h4').each(function(){textToggler($(this));});this.find('h4:first').nextAll('*:not(h4)').hide();sizeBox();const img=$(``);img.on('click',(e)=>{e.preventDefault();return toggle();});$('#content').append(img);const peInPage=$('#help-button').offset().top;$('#help-button').addClass('floatable');const peInFloat=$('#help-button').offset().top-$(window).scrollTop();$('#help-button').removeClass('floatable');$(window).on('scroll',()=>{if($(window).scrollTop()>=peInPage-peInFloat){$('#help-button').addClass('floatable');}else{$('#help-button').removeClass('floatable');}});return this;};dotclear.enterKeyInForm=(frm_id,ok_id,cancel_id)=>{$(`${frm_id}:not(${cancel_id})`).on('keyup',(e)=>{if(e.key=='Enter'&&$(ok_id).prop('disabled')!==true){e.preventDefault();e.stopPropagation();$(ok_id).trigger('click');}});};dotclear.condSubmit=(chkboxes,target)=>{const checkboxes=Array.from(document.querySelectorAll(chkboxes));const submitButt=document.querySelector(target);if(checkboxes.length===0||submitButt===null){return;}
+submitButt.disabled=!checkboxes.some((checkbox)=>checkbox.checked);if(submitButt.disabled){submitButt.classList.add('disabled');}else{submitButt.classList.remove('disabled');}
+checkboxes.forEach((checkbox)=>{checkbox.addEventListener('click',()=>{submitButt.disabled=!checkboxes.some((checkbox)=>checkbox.checked);if(submitButt.disabled){submitButt.classList.add('disabled');}else{submitButt.classList.remove('disabled');}});});};dotclear.hideLockable=()=>{const lockableDivs=document.querySelectorAll('div.lockable');lockableDivs.forEach((lockableDiv)=>{const formNotes=lockableDiv.querySelectorAll('p.form-note');formNotes.forEach((formNote)=>(formNote.style.display='none'));const inputs=lockableDiv.querySelectorAll('input');inputs.forEach((input)=>{input.disabled=true;input.style.width=`${input.offsetWidth - 14}px`;const image=document.createElement('img');image.src='images/locker.png';image.style.position='absolute';image.style.top='1.8em';image.style.left=`${input.offsetWidth + 14}px`;image.alt=dotclear.msg.click_to_unlock;image.style.cursor='pointer';image.addEventListener('click',()=>{image.style.display='none';input.disabled=false;input.style.width=`${input.offsetWidth + 14}px`;formNotes.forEach((formNote)=>(formNote.style.display='block'));});input.parentElement.style.position='relative';input.after(image);});});};dotclear.checkboxesHelpers=(e,target,c,s)=>{$(e).append(document.createTextNode(dotclear.msg.to_select));$(e).append(document.createTextNode(' '));$(``).on('click',()=>{if(target===undefined){$(e).parents('form').find('input[type="checkbox"]:not(:disabled)').check();}else{target.check();}
+if(c!==undefined&&s!==undefined){dotclear.condSubmit(c,s);}
+return false;}).appendTo($(e));$(e).append(document.createTextNode(' '));$(``).on('click',()=>{if(target===undefined){$(e).parents('form').find('input[type="checkbox"]:not(:disabled)').unCheck();}else{target.unCheck();}
+if(c!==undefined&&s!==undefined){dotclear.condSubmit(c,s);}
+return false;}).appendTo($(e));$(e).append(document.createTextNode(' '));$(``).on('click',()=>{if(target===undefined){$(e).parents('form').find('input[type="checkbox"]:not(:disabled)').toggleCheck();}else{target.toggleCheck();}
+if(c!==undefined&&s!==undefined){dotclear.condSubmit(c,s);}
+return false;}).appendTo($(e));};dotclear.postsActionsHelper=()=>{$('#form-entries').on('submit',function(){const action=$(this).find('select[name="action"]').val();if(action===undefined){return;}
+let checked=false;$(this).find('input[name="entries[]"]').each(function(){if(this.checked){checked=true;}});if(!checked){return false;}
+if(action=='delete'){return window.confirm(dotclear.msg.confirm_delete_posts.replace('%s',$('input[name="entries[]"]:checked').length));}
+return true;});};dotclear.commentsActionsHelper=()=>{$('#form-comments').on('submit',function(){const action=$(this).find('select[name="action"]').val();let checked=false;$(this).find('input[name="comments[]"]').each(function(){if(this.checked){checked=true;}});if(!checked){return false;}
+if(action=='delete'){return window.confirm(dotclear.msg.confirm_delete_comments.replace('%s',$('input[name="comments[]"]:checked').length));}
+return true;});};dotclear.outgoingLinks=(target)=>{const elements=document.querySelectorAll(target);elements.forEach((element)=>{if((element.hostname&&element.hostname!=location.hostname&&!element.classList.contains('modal')&&!element.classList.contains('modal-image'))||element.classList.contains('outgoing')){element.title=`${element.title} (${dotclear.msg.new_window})`;if(!element.classList.contains('outgoing')){element.innerHTML+=' ${dotclear.msg.filter_posts_list}
`,);if(dotclear.msg.show_filters){$('#filter-control').addClass('open').text(dotclear.msg.cancel_the_filter);}else{$filtersform.hide();} +if(dotclear.getData('filter_options').auto_filter){$('#filters-form input[type="submit"]').parent().hide();$('#filters-form select').on('input',()=>{$filtersform[0].submit();});$('#filters-form input[type!="submit"]').on('focusin',function(){$(this).data('val',$(this).val());});$('#filters-form input[type!="submit"]').on('focusout',function(){if($(this).val()!==$(this).data('val')){$filtersform[0].submit();}});} +dotclear.enterKeyInForm('#filters-form','#filters-form input[type="submit"]','#filter-control');$('#filter-control').on('click',function(){if($(this).hasClass('open')){if(dotclear.msg.show_filters){return true;} +$filtersform.hide();$(this).removeClass('open').text(dotclear.msg.filter_posts_list);}else{$filtersform.show();$(this).addClass('open').text(dotclear.msg.cancel_the_filter);} +return false;});$('#filter-options-save').on('click',()=>{dotclear.jsonServicesPost('setListsOptions',(data)=>{window.alert(data.msg);},{id:$('#filters-options-id').val(),sort:$('#sortby').val(),order:$('#order').val(),nb:$('#nb').val(),},(error)=>{window.alert(error);},);});}); \ No newline at end of file diff --git a/admin/js/ie7/IE7.js b/admin/js/ie7/IE7.js deleted file mode 100644 index 97924d4..0000000 --- a/admin/js/ie7/IE7.js +++ /dev/null @@ -1,2 +0,0 @@ -/* IE7/IE8.js - copyright 2004-2008, Dean Edwards */ -(function(){IE7={toString:function(){return"IE7 version 2.0 (beta2)"}};var k=IE7.appVersion=navigator.appVersion.match(/MSIE (\d\.\d)/)[1];if(/ie7_off/.test(top.location.search)||k<5)return;var Q=bG();var C=document.compatMode!="CSS1Compat";var bm=document.documentElement,v,s;var bA="!";var G=":link{ie7-link:link}:visited{ie7-link:visited}";var cj=/^[\w\.]+[^:]*$/;function W(a,b){if(cj.test(a))a=(b||"")+a;return a};function bn(a,b){a=W(a,b);return a.slice(0,a.lastIndexOf("/")+1)};var bB=document.scripts[document.scripts.length-1];var ck=bn(bB.src);try{var H=new ActiveXObject("Microsoft.XMLHTTP")}catch(e){}var X={};function cl(a,b){try{a=W(a,b);if(!X[a]){H.open("GET",a,false);H.send();if(H.status==0||H.status==200){X[a]=H.responseText}}}catch(e){}finally{return X[a]||""}};if(k<5.5){undefined=Q();bA="HTML:!";var cm=/(g|gi)$/;var cn=String.prototype.replace;String.prototype.replace=function(a,b){if(typeof b=="function"){if(a&&a.constructor==RegExp){var c=a;var d=c.global;if(d==null)d=cm.test(c);if(d)c=new RegExp(c.source)}else{c=new RegExp(bb(a))}var f,g=this,h="";while(g&&(f=c.exec(g))){h+=g.slice(0,f.index)+b.apply(this,f);g=g.slice(f.index+f[0].length);if(!d)break}return h+g}return cn.apply(this,arguments)};Array.prototype.pop=function(){if(this.length){var a=this[this.length-1];this.length--;return a}return undefined};Array.prototype.push=function(){for(var a=0;a'+msg+'');_this.bindEvent('debug',arguments);},flashReady:function(){_this.initControls(this);_this.bindEvent('flashReady',arguments);this.movie.style.width=_this.ctrl.btn_browse.width()+'px';this.movie.style.height=_this.ctrl.btn_browse.height()+'px';},fileDialogComplete:function(num_ref_files,num_queue_files){_this.bindEvent('fileDialogComplete',arguments);},fileDialogStart:function(){_this.bindEvent('fileQueued',arguments);},fileQueued:function(o){_this.appendFile(this,o);_this.refreshControls(this);_this.bindEvent('fileQueued',arguments);},fileQueueError:function(o,code,msg){var codes=window.SWFUpload.QUEUE_ERROR;switch(code){case codes.QUEUE_LIMIT_EXCEEDED:_this.queueErrorMsg(_this.locales.limit_exceeded);break;case codes.FILE_EXCEEDS_SIZE_LIMIT:_this.queueErrorMsg(_this.locales.size_limit_exceeded);break;case codes.ZERO_BYTE_FILE:case codes.INVALID_FILETYPE:_this.queueErrorMsg(msg);break;} -_this.bindEvent('fileQueueError',arguments);},uploadStart:function(){this.ReturnUploadStart(true);_this.bindEvent('uploadStart',arguments);},uploadProgress:function(o,bytes,total){_this.fileProgressBar(o.id,bytes,total);_this.bindEvent('uploadProgress',arguments);},uploadError:function(o,code,msg){var codes=window.SWFUpload.UPLOAD_ERROR;switch(code){case codes.FILE_CANCELLED:_this.fileErrorMsg(o.id,_this.locales.canceled);break;case codes.HTTP_ERROR:_this.fileErrorMsg(o.id,_this.locales.http_error+' '+msg);break;case codes.MISSING_UPLOAD_URL:case codes.IO_ERROR:case codes.SECURITY_ERROR:case codes.UPLOAD_LIMIT_EXCEEDED:case codes.UPLOAD_FAILED:case codes.SPECIFIED_FILE_ID_NOT_FOUND:case codes.FILE_VALIDATION_FAILED:case codes.FILE_CANCELLED:case codes.UPLOAD_STOPPED:_this.fileErrorMsg(o.id,_this.locales.error+' '+msg);break;} -_this.refreshControls(this);_this.removeFileCancel(o);_this.bindEvent('uploadError',arguments);},uploadSuccess:function(o,data){_this.fileProgressBar(o.id,1,1);_this.refreshControls(this);_this.removeFileCancel(o);_this.bindEvent('uploadSuccess',arguments);},uploadComplete:function(o){this.StartUpload();_this.refreshControls(this);_this.bindEvent('uploadComplete',arguments);}});};$._candyUpload.prototype={locales:{max_file_size:'Maximum file size allowed:',limit_exceeded:'Limit exceeded.',size_limit_exceeded:'File size exceeds allowed limit.',canceled:'Canceled.',http_error:'HTTP Error:',error:'Error:',choose_file:'Choose file',choose_files:'Choose files',cancel:'Cancel',clean:'Clean',upload:'Upload',no_file_in_queue:'No file in queue.',file_in_queue:'1 file in queue.',files_in_queue:'%d files in queue.',queue_error:'Queue error:'},ctrl:{block:$(''),files:null},createControls:function(){this.ctrl.btn_browse=$(' ').click(function(){return false;});this.ctrl.btn_cancel=$(''+this.locales.cancel+'').click(function(){return false;});this.ctrl.btn_clean=$(''+this.locales.clean+'').click(function(){return false;});this.ctrl.btn_upload=$(''+this.locales.upload+'').click(function(){return false;});this.ctrl.msg=$('
'.__('The plugin you reached does not exist or does not have an admin page.').'
'; - - call_user_func($close_f); -} -?> \ No newline at end of file +/** + * @deprecated since 2.27 Use name "admin.plugin" on dcCore::app()->admin->url methods + * + * @package Dotclear + * @subpackage Backend + * + * @copyright Olivier Meunier & Association Dotclear + * @copyright GPL-2.0-only + */ +require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']); + +Dotclear\App::bootstrap('Backend', 'Plugin'); diff --git a/admin/plugins.php b/admin/plugins.php index f93a378..53ad665 100644 --- a/admin/plugins.php +++ b/admin/plugins.php @@ -1,364 +1,13 @@ plugins->moduleExists($plugin_id)) { - throw new Exception(__('No such plugin.')); - } - - $plugin = $core->plugins->getModules($plugin_id); - $plugin['id'] = $plugin_id; - - if (!preg_match('!^'.$p_path_pat.'!', $plugin['root'])) { - throw new Exception(__('You don\'t have permissions to delete this plugin.')); - } - - # --BEHAVIOR-- pluginBeforeDelete - $core->callBehavior('pluginsBeforeDelete', $plugin); - - $core->plugins->deleteModule($plugin_id); - - # --BEHAVIOR-- pluginAfterDelete - $core->callBehavior('pluginsAfterDelete', $plugin); - } - else - { - $core->plugins->deleteModule($plugin_id,true); - } - - http::redirect('plugins.php?removed=1'); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } - } - # Deactivate plugin - elseif ($plugin_id && !empty($_POST['deactivate'])) - { - try - { - if (!$core->plugins->moduleExists($plugin_id)) { - throw new Exception(__('No such plugin.')); - } - - $plugin = $core->plugins->getModules($plugin_id); - $plugin['id'] = $plugin_id; - - if (!$plugin['root_writable']) { - throw new Exception(__('You don\'t have permissions to deactivate this plugin.')); - } - - $core->plugins->deactivateModule($plugin_id); - http::redirect('plugins.php'); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } - } - # Activate plugin - elseif ($plugin_id && !empty($_POST['activate'])) - { - try - { - $p = $core->plugins->getDisabledModules(); - if (!isset($p[$plugin_id])) { - throw new Exception(__('No such plugin.')); - } - $core->plugins->activateModule($plugin_id); - http::redirect('plugins.php'); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } - } - # Plugin upload - elseif ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) || - (!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url']))) - { - try - { - if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) { - throw new Exception(__('Password verification failed')); - } - - if (!empty($_POST['upload_pkg'])) - { - files::uploadStatus($_FILES['pkg_file']); - - $dest = $p_path.'/'.$_FILES['pkg_file']['name']; - if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) { - throw new Exception(__('Unable to move uploaded file.')); - } - } - else - { - $url = urldecode($_POST['pkg_url']); - $dest = $p_path.'/'.basename($url); - - try - { - $client = netHttp::initClient($url,$path); - $client->setUserAgent('Dotclear - http://www.dotclear.org/'); - $client->useGzip(false); - $client->setPersistReferers(false); - $client->setOutput($dest); - $client->get($path); - } - catch( Exception $e) - { - throw new Exception(__('An error occurred while downloading the file.')); - } - - unset($client); - } - - $ret_code = $core->plugins->installPackage($dest,$core->plugins); - http::redirect('plugins.php?added='.$ret_code); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - $default_tab = 'addplugin'; - } - } -} - -# Plugin install -$plugins_install = $core->plugins->installModules(); - -/* DISPLAY Main page --------------------------------------------------------- */ -dcPage::open(__('Plugins management'), - dcPage::jsLoad('js/_plugins.js'). - dcPage::jsPageTabs($default_tab) -); - -echo -''.__('Plugins add new functionalities to Dotclear. '. -'Here you can activate or deactivate installed plugins.').'
'; - -echo ''.sprintf(__('You can find additional plugins for your blog on %s.'), -'Dotaddict').' '; - -if ($is_writable) { - echo __('To install or upgrade a plugin you generally just need to upload it '. - 'in "Install or upgrade a plugin" section.'); -} else { - echo __('To install or upgrade a plugin you just need to extract it in your plugins directory.'); -} -echo '
'; - -echo -'| '.__('Plugin').' | '. - ''.__('Version').' | '. - ''.__('Details').' | '. - ''.__('Action').' | '. - '
|---|---|---|---|
| '.html::escapeHTML($k).' | '. - ''.html::escapeHTML($v['version']).' | '. - ''.html::escapeHTML($v['name']).' '.
- ' '.html::escapeHTML($v['desc']).' | '.
- ''; - - if ($is_deletable || $is_deactivable) - { - echo - ''; - } - - echo - ' | '. - '
| '.__('Plugin').' | '. - ''.__('Action').' | '. - '
|---|---|
| '.html::escapeHTML($k).' | '. - ''; - - if ($is_deletable || $is_activable) - { - echo - ''; - } - - echo - ' | '. - '
'.__('You can install plugins by uploading or downloading zip files.').'
'; - - # 'Upload plugin' form - echo - ''; - - # 'Fetch plugin' form - echo - ''; -} -else -{ - echo - ''. - __('To enable this function, please give write access to your plugins directory.'). - '
'; -} -echo ''.__('cancel').' - '. -''.__('insert').'
'."\n". - -''."\n"; - -dcPage::closePopup(); -?> \ No newline at end of file +/** + * @deprecated since 2.27 Use name "admin.link.popup" on dcCore::app()->admin->url methods + * + * @package Dotclear + * @subpackage Backend + * + * @copyright Olivier Meunier & Association Dotclear + * @copyright GPL-2.0-only + */ +require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']); + +Dotclear\App::bootstrap('Backend', 'LinkPopup'); diff --git a/admin/popup_posts.php b/admin/popup_posts.php index 9b771a6..96ef66c 100644 --- a/admin/popup_posts.php +++ b/admin/popup_posts.php @@ -1,57 +1,13 @@ '.__('Add a link to an entry').''; - -echo ''; - -try { - $posts = $core->blog->getPosts($params); - $counter = $core->blog->getPosts($params,true); - $post_list = new adminPostMiniList($core,$posts,$counter->f(0)); -} catch (Exception $e) { - $core->error->add($e->getMessage()); -} - -echo ''; - if ($prev_link) { echo $prev_link; } - if ($next_link && $prev_link) { echo ' - '; } - if ($next_link) { echo $next_link; } - - # --BEHAVIOR-- adminPostNavLinks - $core->callBehavior('adminPostNavLinks',isset($post) ? $post : null); - - echo '
'; -} - -# Exit if we cannot view page -if (!$can_view_page) { - dcPage::helpBlock('core_post'); - dcPage::close(); - exit; -} - -/* Post form if we can edit post --------------------------------------------------------- */ -if ($can_edit_post) -{ - echo '| '.__('Author').' | '. - ''.__('Date').' | '. - ''.__('IP address').' | '. - ''.__('Status').' | '. - ''. - ' | |
|---|---|---|---|---|---|
| '. - ($has_action ? form::checkbox(array('comments[]'),$rs->comment_id,'','','',0) : '').' | '. - ''.html::escapeHTML($rs->comment_author).' | '. - ''.dt::dt2str(__('%Y-%m-%d %H:%M'),$rs->comment_dt).' | '. - ''.$rs->comment_ip.' | '. - ''.$img_status.' | '. - ''.
- '![]() | '.
-
- '
« '. - sprintf(__('Back to "%s"'),html::escapeHTML($post->post_title)).'
'; - -echo -''.__('No newer Dotclear version available.').'
'; - } - else - { - echo - ''.sprintf(__('Dotclear %s is available.'),$new_v).'
'. - - ''.__('To upgrade your Dotclear installation simply click on the following button. '. - 'A backup file of your current installation will be created in your root directory.').'
'. - ''; - } - - if (!empty($archives)) - { - echo - ''.__('The following files are backups of previously updates. '. - 'You can revert your previous installation or delete theses files.').'
'; - - echo ''; - } -} -elseif ($step == 'unzip' && !$core->error->flag()) -{ - echo - ''; -} - -dcPage::close(); -?> \ No newline at end of file +/** + * @deprecated since 2.27 Use name "admin.update" on dcCore::app()->admin->url methods + * + * @package Dotclear + * @subpackage Backend + * + * @copyright Olivier Meunier & Association Dotclear + * @copyright GPL-2.0-only + */ +require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']); + +Dotclear\App::bootstrap('Backend', 'Update'); diff --git a/admin/upgrade/upgrade-cli.php b/admin/upgrade/upgrade-cli.php new file mode 100644 index 0000000..aee6d27 --- /dev/null +++ b/admin/upgrade/upgrade-cli.php @@ -0,0 +1,15 @@ +#!/usr/bin/env php +auth->getInfo('user_lang'); -$user_tz = $core->auth->getInfo('user_tz'); -$user_post_status = ''; - -$user_options = $core->userDefaults(); - -foreach ($core->getFormaters() as $v) { - $formaters_combo[$v] = $v; -} - -foreach ($core->blog->getAllPostStatus() as $k => $v) { - $status_combo[$v] = $k; -} - -# Language codes -$langs = l10n::getISOcodes(1,1); -foreach ($langs as $k => $v) { - $lang_avail = $v == 'en' || is_dir(DC_L10N_ROOT.'/'.$v); - $lang_combo[] = new formSelectOption($k,$v,$lang_avail ? 'avail10n' : ''); -} - -# Get user if we have an ID -if (!empty($_REQUEST['id'])) -{ - try { - $rs = $core->getUser($_REQUEST['id']); - - $user_id = $rs->user_id; - $user_super = $rs->user_super; - $user_pwd = $rs->user_pwd; - $user_name = $rs->user_name; - $user_firstname = $rs->user_firstname; - $user_displayname = $rs->user_displayname; - $user_email = $rs->user_email; - $user_url = $rs->user_url; - $user_lang = $rs->user_lang; - $user_tz = $rs->user_tz; - $user_post_status = $rs->user_post_status; - - $user_options = array_merge($user_options,$rs->options()); - - $page_title = $user_id; - } catch (Exception $e) { - $core->error->add($e->getMessage()); - } -} - -# Add or update user -if (isset($_POST['user_name'])) -{ - try - { - if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) { - throw new Exception(__('Password verification failed')); - } - - $cur = $core->con->openCursor($core->prefix.'user'); - - $cur->user_id = $_POST['user_id']; - $cur->user_super = $user_super = !empty($_POST['user_super']) ? 1 : 0; - $cur->user_name = $user_name = $_POST['user_name']; - $cur->user_firstname = $user_firstname = $_POST['user_firstname']; - $cur->user_displayname = $user_displayname = $_POST['user_displayname']; - $cur->user_email = $user_email = $_POST['user_email']; - $cur->user_url = $user_url = $_POST['user_url']; - $cur->user_lang = $user_lang = $_POST['user_lang']; - $cur->user_tz = $user_tz = $_POST['user_tz']; - $cur->user_post_status = $user_post_status = $_POST['user_post_status']; - - if (!empty($_POST['new_pwd'])) { - if ($_POST['new_pwd'] != $_POST['new_pwd_c']) { - throw new Exception(__("Passwords don't match")); - } else { - $cur->user_pwd = $_POST['new_pwd']; - } - } - - $user_options['post_format'] = $_POST['user_post_format']; - $user_options['edit_size'] = (integer) $_POST['user_edit_size']; - - if ($user_options['edit_size'] < 1) { - $user_options['edit_size'] = 10; - } - - $cur->user_options = new ArrayObject($user_options); - - # Udate user - if ($user_id) - { - # --BEHAVIOR-- adminBeforeUserUpdate - $core->callBehavior('adminBeforeUserUpdate',$cur,$user_id); - - $new_id = $core->updUser($user_id,$cur); - - # --BEHAVIOR-- adminAfterUserUpdate - $core->callBehavior('adminAfterUserUpdate',$cur,$new_id); - - if ($user_id == $core->auth->userID() && - $user_id != $new_id) { - $core->session->destroy(); - } - - http::redirect('user.php?id='.$new_id.'&upd=1'); - } - # Add user - else - { - if ($core->getUsers(array('user_id' => $cur->user_id),true)->f(0) > 0) { - throw new Exception(sprintf(__('User "%s" already exists.'),html::escapeHTML($cur->user_id))); - } - - # --BEHAVIOR-- adminBeforeUserCreate - $core->callBehavior('adminBeforeUserCreate',$cur); - - $new_id = $core->addUser($cur); - - # --BEHAVIOR-- adminAfterUserCreate - $core->callBehavior('adminAfterUserCreate',$cur,$new_id); - - http::redirect('user.php?id='.$new_id.'&add=1'); - } - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } -} - - -/* DISPLAY --------------------------------------------------------- */ -dcPage::open($page_title, - dcPage::jsConfirmClose('user-form'). - - # --BEHAVIOR-- adminUserHeaders - $core->callBehavior('adminUserHeaders') -); - -if (!empty($_GET['upd'])) { - echo ''; -} - -if (!empty($_GET['add'])) { - echo ''; -} - -echo ''.__('Warning:').' '. - __('If you change your username, you will have to log in again.').'
'; -} - -echo -''; - -if ($user_id) -{ - echo ''; -} - -dcPage::close(); -?> \ No newline at end of file +/** + * @deprecated since 2.27 Use name "admin.user" on dcCore::app()->admin->url methods + * + * @package Dotclear + * @subpackage Backend + * + * @copyright Olivier Meunier & Association Dotclear + * @copyright GPL-2.0-only + */ +require_once implode(DIRECTORY_SEPARATOR, [__DIR__, '..', 'src', 'App.php']); + +Dotclear\App::bootstrap('Backend', 'User'); diff --git a/admin/users.php b/admin/users.php index 195cabd..7a070fd 100644 --- a/admin/users.php +++ b/admin/users.php @@ -1,167 +1,13 @@ callBehavior('adminBeforeUserDelete',$u); - - $core->delUser($u); - } - catch (Exception $e) - { - $core->error->add($e->getMessage()); - } - } - - if (!$core->error->flag()) { - http::redirect('users.php?del=1'); - } -} - - -# Creating filter combo boxes -$sortby_combo = array( -__('Username') => 'U.user_id', -__('Last Name') => 'user_name', -__('First Name') => 'user_firstname', -__('Display name') => 'user_displayname', -__('Number of entries') => 'nb_post' -); - -$order_combo = array( -__('Descending') => 'desc', -__('Ascending') => 'asc' -); - - -# Get users -$page = !empty($_GET['page']) ? $_GET['page'] : 1; -$nb_per_page = 30; - -if (!empty($_GET['nb']) && (integer) $_GET['nb'] > 0) { - $nb_per_page = $_GET['nb']; -} - -$q = !empty($_GET['q']) ? $_GET['q'] : ''; -$sortby = !empty($_GET['sortby']) ? $_GET['sortby'] : 'user_id'; -$order = !empty($_GET['order']) ? $_GET['order'] : 'asc'; - -$params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); - -$show_filters = false; - -# - Search filter -if ($q) { - $params['q'] = $q; - $show_filters = true; -} - -# - Sortby and order filter -if ($sortby !== '' && in_array($sortby,$sortby_combo)) { - if ($order !== '' && in_array($order,$order_combo)) { - $params['order'] = $sortby.' '.$order; - $show_filters = true; - } -} - -try { - $rs = $core->getUsers($params); - $counter = $core->getUsers($params,1); - $user_list = new adminUserList($core,$rs,$counter->f(0)); -} catch (Exception $e) { - $core->error->add($e->getMessage()); -} - - -/* DISPLAY --------------------------------------------------------- */ -$starting_script = dcPage::jsLoad('js/_users.js'); -if (!$show_filters) { - $starting_script .= dcPage::jsLoad('js/filter-controls.js'); -} - -dcPage::open(__('users'),$starting_script); - -if (!$core->error->flag()) -{ - if (!empty($_GET['del'])) { - echo ''; - } - - echo ''.$line.'
'; - $level = ''; - } - echo ''.$line.'
'; - } - echo ''.__('This tool is meant to retrieve the latest Dotclear 2 archive and unzip it in your webspace.').'
'. - ''.__('Right after then, you will be redirect to the Dotclear 2 Setup Wizard.').'
'; - - if (!$can_write) { - writeMessage('message',__('Write access is needed'), array( - __('It looks like NetInstall wont be able to write in the current directory, and this is required to follow on.'), - __('Please try to change the permissions to allow write access, then reload this page by hitting the Refresh button.') - )); - nextAction(__('Refresh'),1); - } - elseif (!$got_php5) { - writeMessage('message',__('PHP 5 is required'), array( - sprintf(__('It appears your webhost is currently running PHP %s.'), PHP_VERSION), - __('NetInstall may try to switch your configuration to PHP 5 by creating or modifying a .htaccess file.'), - __('Note you can change your configuration by yourself and restart NetInstall after that.') - )); - nextAction(__('Try to activate PHP 5'),2); - } - else { - nextAction(__('Retrieve and unzip Dotclear'),3, - ''. - getLocation(). - '
' - ); - } - closePage(); - break; - } - case 2 : { - if (!empty($_POST['submit']) && !$got_php5) { - if (($got_php5 = initPHP5())) { - header('Location: '.$_SERVER['SCRIPT_NAME'].'?step=1'); - } - } - elseif ($got_php5) { - header('Location: '.$_SERVER['SCRIPT_NAME'].'?step=1'); - } - else { - openPage(); - writeMessage('message',__('OMG!'),array( - __('NetInstall was not able to activate PHP 5.'), - __('You may referer to your hosting provider\'s support and see how you could switch to PHP 5 by yourself.'), - __('Hope to see you back soon.') - )); - closePage(); - } - break; - } - case 3 : { - $msg = array(__('WTF are you doing here that way?!')); - $level = 'error'; - $text = ''; - if (!empty($_POST['submit']) && isset($_POST['destination'])) - { - $msg = array(); - $dest = preg_replace('/[^A-Za-z0-9_\/-]/','',$_POST['destination']); - $dest = preg_replace('#/+#','/',$dest); - - if (file_exists(dirname(__FILE__).'/./'.$dest.'/inc/config.php') || file_exists(dirname(__FILE__).'/./'.$dest.'/conf/dotclear.ini')) - { - $level = 'message'; - $msg[] = __('It seems like a previous Dotclear installation is still sitting in that space.'); - $msg[] = __('You need to rename or remove it before we can go further...'); - } - elseif (grabFiles()) - { - $lib_files = dirname(__FILE__).'/dcl_files.php'; - $lib_unzip = dirname(__FILE__).'/dcl_unzip.php'; - $dc_zip = dirname(__FILE__).'/dotclear-install.zip'; - if (!file_exists($lib_files) || !file_exists($lib_unzip) || !file_exists($dc_zip)) { - $msg[] = __('Files needed for this automatic installation could not be downloaded.'); - $msg[] = sprintf(__('Please see the Dotclear documentation to perform a normal installation.'), - __('http://dotclear.org/documentation/2.0/admin/install')); - $msg[] = __('Really sorry for the inconvenience.'); - } - - require $lib_files; - require $lib_unzip; - $uz = new fileUnzip($dc_zip); - $files = $uz->getList(); - if (count($files) == 0) { - $msg[] = __('The integrity of the downloaded archive could not be verified.'); - $msg[] = sprintf(__('Please see the Dotclear documentation to perform a normal installation.'), - __('http://dotclear.org/documentation/2.0/admin/install')); - $msg[] = __('Really sorry for the inconvenience.'); - } - - foreach ($files as $k => $v) - { - if ($v['is_dir']) { - continue; - } - $t = preg_replace('#^dotclear/#','./'.$dest.'/',$k); - $uz->unzip($k,$t); - } - - if (!is_dir(dirname(__FILE__).'/./'.$dest)) - { - $msg[] = __('The downloaded archive file could not be extracted.'); - $msg[] = sprintf(__('Please see the Dotclear documentation to perform a normal installation.'), - __('http://dotclear.org/documentation/2.0/admin/install')); - $msg[] = __('Really sorry for the inconvenience.'); - } - else - { - # Remove files, create public directory, and self-destruction - files::makeDir('./'.$dest.'/public'); - cleanFiles(); -// @unlink(__FILE__); - - $redir = preg_replace('#/+#','/',dirname($_SERVER['SCRIPT_NAME']).'/'.$dest.'/admin/install/wizard.php'); - - header('Location: '.$redir); - } - } - else - { - $msg[] = __('An error occurred while grabbing the necessary files to go on.'); - $msg[] = sprintf(__('Please see the Dotclear documentation to perform a normal installation.'), - __('http://dotclear.org/documentation/2.0/admin/install')); - $msg[] = __('Really sorry for the inconvenience.'); - } - } - openPage(); - writeMessage($level,__('Something went wrong ...'),$msg); - echo $text; - closePage(); - break; - } -} -?> \ No newline at end of file diff --git a/inc/.htaccess b/inc/.htaccess index 14249c5..6a1299a 100644 --- a/inc/.htaccess +++ b/inc/.htaccess @@ -1 +1,9 @@ -Deny from all \ No newline at end of file +# Apache 2.2 +memory usage: '.memory_get_usage().' ('.files::size(memory_get_usage()).')
'; - - if (function_exists('xdebug_get_profiler_filename')) - { - $res .= 'Elapsed time: '.xdebug_time_index().' seconds
'; - - $prof_file = xdebug_get_profiler_filename(); - if ($prof_file) { - $res .= 'Profiler file : '.xdebug_get_profiler_filename().'
'; - } else { - $prof_url = http::getSelfURI(); - $prof_url .= (strpos($prof_url,'?') === false) ? '?' : '&'; - $prof_url .= 'XDEBUG_PROFILE'; - $res .= ''; - } - - /* xdebug configuration: - zend_extension = /.../xdebug.so - xdebug.auto_trace = On - xdebug.trace_format = 0 - xdebug.trace_options = 1 - xdebug.show_mem_delta = On - xdebug.profiler_enable = 0 - xdebug.profiler_enable_trigger = 1 - xdebug.profiler_output_dir = /tmp - xdebug.profiler_append = 0 - xdebug.profiler_output_name = timestamp - */ - } - - $res .= - 'Global vars: '.$global_vars.'
'. - ''.__('No entry').'
'; - } - else - { - $pager = new pager($page,$this->rs_count,$nb_per_page,10); - $pager->html_prev = $this->html_prev; - $pager->html_next = $this->html_next; - $pager->var_page = 'page'; - - $html_block = - '| '.__('Title').' | '. - ''.__('Date').' | '. - ''.__('Category').' | '. - ''.__('Author').' | '. - ''.__('Comments').' | '. - ''.__('Trackbacks').' | '. - ''.__('Status').' | '. - '|
|---|---|---|---|---|---|---|---|
'.__('Page(s)').' : '.$pager->getLinks().'
'; - - $blocks = explode('%s',$html_block); - - echo $blocks[0]; - - while ($this->rs->fetch()) - { - echo $this->postLine(); - } - - echo $blocks[1]; - - echo ''.__('Page(s)').' : '.$pager->getLinks().'
'; - } - } - - private function postLine() - { - if ($this->core->auth->check('categories',$this->core->blog->id)) { - $cat_link = '%s'; - } else { - $cat_link = '%2$s'; - } - - if ($this->rs->cat_title) { - $cat_title = sprintf($cat_link,$this->rs->cat_id, - html::escapeHTML($this->rs->cat_title)); - } else { - $cat_title = __('None'); - } - - $img = ''.__('No entry').'
'; - } - else - { - $pager = new pager($page,$this->rs_count,$nb_per_page,10); - $pager->html_prev = $this->html_prev; - $pager->html_next = $this->html_next; - $pager->var_page = 'page'; - - $html_block = - '| '.__('Title').' | '. - ''.__('Date').' | '. - ''.__('Author').' | '. - ''.__('Status').' | '. - '
|---|
'.__('Page(s)').' : '.$pager->getLinks().'
'; - - $blocks = explode('%s',$html_block); - - echo $blocks[0]; - - while ($this->rs->fetch()) - { - echo $this->postLine(); - } - - echo $blocks[1]; - - echo ''.__('Page(s)').' : '.$pager->getLinks().'
'; - } - } - - private function postLine() - { - $img = ''.__('No comment').'
'; - } - else - { - $pager = new pager($page,$this->rs_count,$nb_per_page,10); - $pager->html_prev = $this->html_prev; - $pager->html_next = $this->html_next; - $pager->var_page = 'page'; - - $html_block = - '| '.__('Title').' | '. - ''.__('Date').' | '. - ''.__('Author').' | '. - ''.__('Type').' | '. - ''.__('Status').' | '. - ''. - ' | |
|---|---|---|---|---|---|---|
'.__('Page(s)').' : '.$pager->getLinks().'
'; - - $blocks = explode('%s',$html_block); - - echo $blocks[0]; - - while ($this->rs->fetch()) - { - echo $this->commentLine(); - } - - echo $blocks[1]; - - echo ''.__('Page(s)').' : '.$pager->getLinks().'
'; - } - } - - private function commentLine() - { - global $author, $status, $sortby, $order, $nb_per_page; - - $author_url = - 'comments.php?n='.$nb_per_page. - '&status='.$status. - '&sortby='.$sortby. - '&order='.$order. - '&author='.rawurlencode($this->rs->comment_author); - - $post_url = $this->core->getPostAdminURL($this->rs->post_type,$this->rs->post_id); - - $comment_url = 'comment.php?id='.$this->rs->comment_id; - - $comment_dt = - dt::dt2str($this->core->blog->settings->date_format.' - '. - $this->core->blog->settings->time_format,$this->rs->comment_dt); - - $img = '
'.__('No user').'
'; - } - else - { - $pager = new pager($page,$this->rs_count,$nb_per_page,10); - $pager->html_prev = $this->html_prev; - $pager->html_next = $this->html_next; - $pager->var_page = 'page'; - - $html_block = - '| '.__('Username').' | '. - ''.__('First Name').' | '. - ''.__('Last Name').' | '. - ''.__('Display name').' | '. - ''.__('Entries').' | '. - '|
|---|---|---|---|---|---|
'.__('Page(s)').' : '.$pager->getLinks().'
'; - - $blocks = explode('%s',$html_block); - - echo $blocks[0]; - - while ($this->rs->fetch()) - { - echo $this->userLine(); - } - - echo $blocks[1]; - - echo ''.__('Page(s)').' : '.$pager->getLinks().'
'; - } - } - - private function userLine() - { - return - '
- * fetch()) {
- * echo $rs->field1;
- * }
- * ?>
- *
- *
- * @return boolean
- */
- public function fetch()
- {
- if (!$this->__fetch) {
- $this->__fetch = true;
- $i = -1;
- } else {
- $i = $this->__index;
- }
-
- if (!$this->index($i+1)) {
- $this->__fetch = false;
- $this->__index = 0;
- return false;
- }
-
- return true;
- }
-
- /**
- * Moves index to first position.
- *
- * @return boolean
- */
- public function moveStart()
- {
- return $this->index(0);
- }
-
- /**
- * Moves index to last position.
- *
- * @return boolean
- */
- public function moveEnd()
- {
- return $this->index($this->__info['rows']-1);
- }
-
- /**
- * Moves index to next position.
- *
- * @return boolean
- */
- public function moveNext()
- {
- return $this->index($this->__index+1);
- }
-
- /**
- * Moves index to previous position.
- *
- * @return boolean
- */
- public function movePrev()
- {
- return $this->index($this->__index-1);
- }
-
- /**
- * @return boolean true if index is at last position
- */
- public function isEnd()
- {
- return $this->__index+1 == $this->count();
- }
-
- /**
- * @return boolean true if index is at first position.
- */
- public function isStart()
- {
- return $this->__index <= 0;
- }
-
- /**
- * @return boolean true if record contains no result.
- */
- public function isEmpty()
- {
- return $this->count() == 0;
- }
-
- /**
- * @return integer number of rows in record
- */
- public function count()
- {
- return $this->__info['rows'];
- }
-
- /**
- * @return array array of columns, with name as key and type as value.
- */
- public function columns()
- {
- return $this->__info['info']['name'];
- }
-
- /**
- * @return array all rows in record.
- */
- public function rows()
- {
- return $this->getData();
- }
-
- /**
- * All data
- *
- * Returns an array of all rows in record. This method is called by rows().
- *
- * @return array
- */
- protected function getData()
- {
- $res = array();
-
- if ($this->count() == 0) {
- return $res;
- }
-
- $this->__info['con']->db_result_seek($this->__result,0);
- while (($r = $this->__info['con']->db_fetch_assoc($this->__result)) !== false) {
- foreach ($r as $k => $v) {
- $r[] =& $r[$k];
- }
- $res[] = $r;
- }
- $this->__info['con']->db_result_seek($this->__result,$this->__index);
-
- return $res;
- }
-}
-
-/**
-* Query Result Static Record Class
-*
-* Unlike record class, this one contains all results in an associative array.
-*
-* @package Clearbricks
-* @subpackage DBLayer
-*/
-class staticRecord extends record
-{
- /** @var array Data array */
- public $__data = array();
-
- private $__sortfield;
- private $__sortsign;
-
- /** @ignore */
- public function __construct($result,$info)
- {
- if (is_array($result))
- {
- $this->__info = $info;
- $this->__data = $result;
- }
- else
- {
- parent::__construct($result,$info);
- $this->__data = parent::getData();
- }
-
- unset($this->__link);
- unset($this->__result);
- }
-
- /**
- * Static record from array
- *
- * Returns a new instance of object from an associative array.
- *
- * @param array $data Data array
- * @return staticRecord
- */
- public static function newFromArray($data)
- {
- if (!is_array($data)) {
- $data = array();
- }
-
- $data = array_values($data);
-
- if (empty($data) || !is_array($data[0])) {
- $cols = 0;
- } else {
- $cols = count($data[0]);
- }
-
- $info = array(
- 'con' => null,
- 'info' => null,
- 'cols' => $cols,
- 'rows' => count($data)
- );
-
- return new self($data,$info);
- }
-
- /** @ignore */
- public function field($n)
- {
- return $this->__data[$this->__index][$n];
- }
-
- /** @ignore */
- public function exists($n)
- {
- return isset($this->__data[$this->__index][$n]);
- }
-
- /** @ignore */
- public function index($row=null)
- {
- if ($row === null) {
- return $this->__index;
- }
-
- if ($row < 0 || $row+1 > $this->__info['rows']) {
- return false;
- }
-
- $this->__index = $row;
- return true;
- }
-
- /** @ignore */
- public function rows()
- {
- return $this->__data;
- }
-
- /**
- * Changes value of a given field in the current row.
- *
- * @param string $n Field name
- * @param string $v Field value
- */
- public function set($n,$v)
- {
- if ($this->__index === null) {
- return false;
- }
-
- $this->__data[$this->__index][$n] = $v;
- }
-
- /**
- * Sorts values by a field in a given order.
- *
- * @param string $field Field name
- * @param string $order Sort type (asc or desc)
- */
- public function sort($field,$order='asc')
- {
- if (!isset($this->__data[0][$field])) {
- return false;
- }
-
- $this->__sortfield = $field;
- $this->__sortsign = strtolower($order) == 'asc' ? 1 : -1;
-
- usort($this->__data,array($this,'sortCallback'));
-
- $this->__sortfield = null;
- $this->__sortsign = null;
- }
-
- private function sortCallback($a,$b)
- {
- $a = $a[$this->__sortfield];
- $b = $b[$this->__sortfield];
-
- # Integer values
- if ($a == (string) (integer) $a && $b == (string) (integer) $b) {
- $a = (integer) $a;
- $b = (integer) $b;
- return ($a - $b) * $this->__sortsign;
- }
-
- return strcmp($a,$b) * $this->__sortsign;
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/dbschema/class.dbschema.php b/inc/clearbricks/dbschema/class.dbschema.php
deleted file mode 100644
index 54ac086..0000000
--- a/inc/clearbricks/dbschema/class.dbschema.php
+++ /dev/null
@@ -1,310 +0,0 @@
-array
- */
- function db_get_tables();
-
- /**
- This method should return an associative array of columns in given table
- $table with column names in keys. Each line value is an array
- with following values:
-
- - [type] data type (string)
- - [len] data length (integer or null)
- - [null] is null? (boolean)
- - [default] default value (string)
-
- @param table string Table name
- @return array
- */
- function db_get_columns($table);
-
- /**
- This method should return an array of keys in given table
- $table. Each line value is an array with following values:
-
- - [name] index name (string)
- - [primary] primary key (boolean)
- - [unique] unique key (boolean)
- - [cols] columns (array)
-
- @param table string Table name
- @return array
- */
- function db_get_keys($table);
-
- /**
- This method should return an array of indexes in given table
- $table. Each line value is an array with following values:
-
- - [name] index name (string)
- - [type] index type (string)
- - [cols] columns (array)
-
- @param table string Table name
- @return array
- */
- function db_get_indexes($table);
-
- /**
- This method should return an array of foreign keys in given table
- $table. Each line value is an array with following values:
-
- - [name] key name (string)
- - [c_cols] child columns (array)
- - [p_table] parent table (string)
- - [p_cols] parent columns (array)
- - [update] on update statement (string)
- - [delete] on delete statement (string)
-
- @param table string Table name
- @return array
- */
- function db_get_references($table);
-
- function db_create_table($name,$fields);
-
- function db_create_field($table,$name,$type,$len,$null,$default);
-
- function db_create_primary($table,$name,$cols);
-
- function db_create_unique($table,$name,$cols);
-
- function db_create_index($table,$name,$type,$cols);
-
- function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
-
- function db_alter_field($table,$name,$type,$len,$null,$default);
-
- function db_alter_primary($table,$name,$newname,$cols);
-
- function db_alter_unique($table,$name,$newname,$cols);
-
- function db_alter_index($table,$name,$newname,$type,$cols);
-
- function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
-
- function db_drop_unique($table,$name);
-}
-
-class dbSchema
-{
- protected $con;
-
- public function __construct($con)
- {
- $this->con =& $con;
- }
-
- public static function init($con)
- {
- $driver = $con->driver();
- $driver_class = $driver.'Schema';
-
- if (!class_exists($driver_class))
- {
- if (file_exists(dirname(__FILE__).'/class.'.$driver.'.dbschema.php')) {
- require dirname(__FILE__).'/class.'.$driver.'.dbschema.php';
- } else {
- trigger_error('Unable to load DB schema layer for '.$driver,E_USER_ERROR);
- exit(1);
- }
- }
-
- return new $driver_class($con);
- }
-
- /**
- Database data type to universal data type conversion.
-
- @param type string Type name
- @param leng integer Field length (in/out)
- @param default string Default field value (in/out)
- @return string
- */
- public function dbt2udt($type,&$len,&$default)
- {
- $c = array(
- 'bool' => 'boolean',
- 'int2' => 'smallint',
- 'int' => 'integer',
- 'int4' => 'integer',
- 'int8' => 'bigint',
- 'float4' => 'real',
- 'double precision' => 'float',
- 'float8' => 'float',
- 'decimal' => 'numeric',
- 'character varying' => 'varchar',
- 'character' => 'char'
- );
-
- if (isset($c[$type])) {
- return $c[$type];
- }
-
- return $type;
- }
-
- /**
- Universal data type to database data tye conversion.
-
- @param type string Type name
- @param leng integer Field length (in/out)
- @param default string Default field value (in/out)
- @return string
- */
- public function udt2dbt($type,&$len,&$default)
- {
- return $type;
- }
-
- /**
- Returns an array of all table names.
-
- @see i_dbSchema::db_get_tables
- @return array
- */
- public function getTables()
- {
- return $this->db_get_tables();
- }
-
- /**
- Returns an array of columns (name and type) of a given table.
-
- @see i_dbSchema::db_get_columns
- @param table string Table name
- @return array
- */
- public function getColumns($table)
- {
- return $this->db_get_columns($table);
- }
-
- /**
- Returns an array of index of a given table.
-
- @see i_dbSchema::db_get_keys
- @param table string Table name
- @return array
- */
- public function getKeys($table)
- {
- return $this->db_get_keys($table);
- }
-
- /**
- Returns an array of indexes of a given table.
-
- @see i_dbSchema::db_get_index
- @param table string Table name
- @return array
- */
- public function getIndexes($table)
- {
- return $this->db_get_indexes($table);
- }
-
- /**
- Returns an array of foreign keys of a given table.
-
- @see i_dbSchema::db_get_references
- @param table string Table name
- @return array
- */
- public function getReferences($table)
- {
- return $this->db_get_references($table);
- }
-
- public function createTable($name,$fields)
- {
- return $this->db_create_table($name,$fields);
- }
-
- public function createField($table,$name,$type,$len,$null,$default)
- {
- return $this->db_create_field($table,$name,$type,$len,$null,$default);
- }
-
- public function createPrimary($table,$name,$cols)
- {
- return $this->db_create_primary($table,$name,$cols);
- }
-
- public function createUnique($table,$name,$cols)
- {
- return $this->db_create_unique($table,$name,$cols);
- }
-
- public function createIndex($table,$name,$type,$cols)
- {
- return $this->db_create_index($table,$name,$type,$cols);
- }
-
- public function createReference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- return $this->db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
- }
-
- public function alterField($table,$name,$type,$len,$null,$default)
- {
- return $this->db_alter_field($table,$name,$type,$len,$null,$default);
- }
-
- public function alterPrimary($table,$name,$newname,$cols)
- {
- return $this->db_alter_primary($table,$name,$newname,$cols);
- }
-
- public function alterUnique($table,$name,$newname,$cols)
- {
- return $this->db_alter_unique($table,$name,$newname,$cols);
- }
-
- public function alterIndex($table,$name,$newname,$type,$cols)
- {
- return $this->db_alter_index($table,$name,$newname,$type,$cols);
- }
-
- public function alterReference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- return $this->db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
- }
-
- public function dropUnique($table,$name)
- {
- return $this->db_drop_unique($table,$name);
- }
-
- public function flushStack()
- {
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/dbschema/class.dbstruct.php b/inc/clearbricks/dbschema/class.dbstruct.php
deleted file mode 100644
index 20dec7d..0000000
--- a/inc/clearbricks/dbschema/class.dbstruct.php
+++ /dev/null
@@ -1,639 +0,0 @@
-con =& $con;
- $this->prefix = $prefix;
- }
-
- public function driver()
- {
- return $this->con->driver();
- }
-
- public function table($name)
- {
- $this->tables[$name] = new dbStructTable($name);
- return $this->tables[$name];
- }
-
- public function __get($name)
- {
- if (!isset($this->tables[$name])) {
- return $this->table($name);
- }
-
- return $this->tables[$name];
- }
-
- public function reverse()
- {
- $schema = dbSchema::init($this->con);
-
- # Get tables
- $tables = $schema->getTables();
-
- foreach ($tables as $t_name)
- {
- if ($this->prefix && strpos($t_name,$this->prefix) !== 0) {
- continue;
- }
-
- $t = $this->table($t_name);
-
- # Get columns
- $cols = $schema->getColumns($t_name);
-
- foreach ($cols as $c_name => $col) {
- $type = $schema->dbt2udt($col['type'],$col['len'],$col['default']);
- $t->field($c_name,$type,$col['len'],$col['null'],$col['default'],true);
- }
-
- # Get keys
- $keys = $schema->getKeys($t_name);
-
- foreach ($keys as $k)
- {
- $args = $k['cols'];
- array_unshift($args,$k['name']);
-
- if ($k['primary']) {
- call_user_func_array(array($t,'primary'),$args);
- } elseif ($k['unique']) {
- call_user_func_array(array($t,'unique'),$args);
- }
- }
-
- # Get indexes
- $idx = $schema->getIndexes($t_name);
- foreach ($idx as $i)
- {
- $args = array($i['name'],$i['type']);
- $args = array_merge($args,$i['cols']);
-
- call_user_func_array(array($t,'index'),$args);
- }
-
- # Get foreign keys
- $ref = $schema->getReferences($t_name);
- foreach ($ref as $r) {
- $t->reference($r['name'],$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']);
- }
- }
- }
-
- /**
- Synchronize this schema taken from database with $schema.
-
- @param s dbStruct Structure to synchronize with
- */
- public function synchronize($s)
- {
- $this->tables = array();
- $this->reverse();
-
- if (!($s instanceof self)) {
- throw new Exception('Invalid database schema');
- }
-
- $tables = $s->getTables();
-
- $table_create = array();
- $key_create = array();
- $index_create = array();
- $reference_create = array();
-
- $field_create = array();
- $field_update = array();
- $key_update = array();
- $index_update = array();
- $reference_update = array();
-
- $got_work = false;
-
- $schema = dbSchema::init($this->con);
-
- foreach ($tables as $tname => $t)
- {
- if (!$this->tableExists($tname))
- {
- # Table does not exist, create table
- $table_create[$tname] = $t->getFields();
-
- # Add keys, indexes and references
- $keys = $t->getKeys();
- $indexes = $t->getIndexes();
- $references = $t->getReferences();
-
- foreach ($keys as $k => $v) {
- $key_create[$tname][$this->prefix.$k] = $v;
- }
- foreach ($indexes as $k => $v) {
- $index_create[$tname][$this->prefix.$k] = $v;
- }
- foreach ($references as $k => $v) {
- $v['p_table'] = $this->prefix.$v['p_table'];
- $reference_create[$tname][$this->prefix.$k] = $v;
- }
-
- $got_work = true;
- }
- else # Table exists
- {
- # Check new fields to create
- $fields = $t->getFields();
- $db_fields = $this->tables[$tname]->getFields();
- foreach ($fields as $fname => $f)
- {
- if (!$this->tables[$tname]->fieldExists($fname))
- {
- # Field doest not exist, create it
- $field_create[$tname][$fname] = $f;
- $got_work = true;
- }
- elseif ($this->fieldsDiffer($db_fields[$fname],$f))
- {
- # Field exists and differs from db version
- $field_update[$tname][$fname] = $f;
- $got_work = true;
- }
- }
-
- # Check keys to add or upgrade
- $keys = $t->getKeys();
- $db_keys = $this->tables[$tname]->getKeys();
-
- foreach ($keys as $kname => $k)
- {
- if ($k['type'] == 'primary' && $this->con->driver() == 'mysql') {
- $kname = 'PRIMARY';
- } else {
- $kname = $this->prefix.$kname;
- }
-
- $db_kname = $this->tables[$tname]->keyExists($kname,$k['type'],$k['cols']);
- if (!$db_kname)
- {
- # Key does not exist, create it
- $key_create[$tname][$kname] = $k;
- $got_work = true;
- }
- elseif ($this->keysDiffer($db_kname,$db_keys[$db_kname]['cols'],$kname,$k['cols']))
- {
- # Key exists and differs from db version
- $key_update[$tname][$db_kname] = array_merge(array('name'=>$kname),$k);
- $got_work = true;
- }
- }
-
- # Check index to add or upgrade
- $idx = $t->getIndexes();
- $db_idx = $this->tables[$tname]->getIndexes();
-
- foreach ($idx as $iname => $i)
- {
- $iname = $this->prefix.$iname;
- $db_iname = $this->tables[$tname]->indexExists($iname,$i['type'],$i['cols']);
-
- if (!$db_iname)
- {
- # Index does not exist, create it
- $index_create[$tname][$iname] = $i;
- $got_work = true;
- }
- elseif ($this->indexesDiffer($db_iname,$db_idx[$db_iname],$iname,$i))
- {
- # Index exists and differs from db version
- $index_update[$tname][$db_iname] = array_merge(array('name'=>$iname),$i);
- $got_work = true;
- }
- }
-
- # Check references to add or upgrade
- $ref = $t->getReferences();
- $db_ref = $this->tables[$tname]->getReferences();
-
- foreach ($ref as $rname => $r)
- {
- $rname = $this->prefix.$rname;
- $r['p_table'] = $this->prefix.$r['p_table'];
- $db_rname = $this->tables[$tname]->referenceExists($rname,$r['c_cols'],$r['p_table'],$r['p_cols']);
-
- if (!$db_rname)
- {
- # Reference does not exist, create it
- $reference_create[$tname][$rname] = $r;
- $got_work = true;
- }
- elseif ($this->referencesDiffer($db_rname,$db_ref[$db_rname],$rname,$r))
- {
- $reference_update[$tname][$db_rname] = array_merge(array('name'=>$rname),$r);
- $got_work = true;
- }
- }
- }
- }
-
- if (!$got_work) {
- return;
- }
-
- # Create tables
- foreach ($table_create as $table => $fields)
- {
- $schema->createTable($table,$fields);
- }
-
- # Create new fields
- foreach ($field_create as $tname => $fields)
- {
- foreach ($fields as $fname => $f) {
- $schema->createField($tname,$fname,$f['type'],$f['len'],$f['null'],$f['default']);
- }
- }
-
- # Update fields
- foreach ($field_update as $tname => $fields)
- {
- foreach ($fields as $fname => $f) {
- $schema->alterField($tname,$fname,$f['type'],$f['len'],$f['null'],$f['default']);
- }
- }
-
- # Create new keys
- foreach ($key_create as $tname => $keys)
- {
- foreach ($keys as $kname => $k)
- {
- if ($k['type'] == 'primary') {
- $schema->createPrimary($tname,$kname,$k['cols']);
- } elseif ($k['type'] == 'unique') {
- $schema->createUnique($tname,$kname,$k['cols']);
- }
- }
- }
-
- # Update keys
- foreach ($key_update as $tname => $keys)
- {
- foreach ($keys as $kname => $k)
- {
- if ($k['type'] == 'primary') {
- $schema->alterPrimary($tname,$kname,$k['name'],$k['cols']);
- } elseif ($k['type'] == 'unique') {
- $schema->alterUnique($tname,$kname,$k['name'],$k['cols']);
- }
- }
- }
-
- # Create indexes
- foreach ($index_create as $tname => $index)
- {
- foreach ($index as $iname => $i) {
- $schema->createIndex($tname,$iname,$i['type'],$i['cols']);
- }
- }
-
- # Update indexes
- foreach ($index_update as $tname => $index)
- {
- foreach ($index as $iname => $i) {
- $schema->alterIndex($tname,$iname,$i['name'],$i['type'],$i['cols']);
- }
- }
-
- # Create references
- foreach ($reference_create as $tname => $ref)
- {
- foreach ($ref as $rname => $r)
- {
- $schema->createReference($rname,$tname,$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']);
- }
- }
-
- # Update references
- foreach ($reference_update as $tname => $ref)
- {
- foreach ($ref as $rname => $r) {
- $schema->alterReference($rname,$r['name'],$tname,$r['c_cols'],$r['p_table'],$r['p_cols'],$r['update'],$r['delete']);
- }
- }
-
- # Flush execution stack
- $schema->flushStack();
-
- return
- count($table_create) + count($key_create) + count($index_create) +
- count($reference_create) + count($field_create) + count($field_update) +
- count($key_update) + count($index_update) + count($reference_update);
- }
-
- public function getTables()
- {
- $res = array();
- foreach ($this->tables as $t => $v)
- {
- $res[$this->prefix.$t] = $v;
- }
-
- return $res;
- }
-
- public function tableExists($name)
- {
- return isset($this->tables[$name]);
- }
-
- private function fieldsDiffer($db_field,$schema_field)
- {
- $d_type = $db_field['type'];
- $d_len = (integer) $db_field['len'];
- $d_default = $db_field['default'];
- $d_null = $db_field['null'];
-
- $s_type = $schema_field['type'];
- $s_len = (integer) $schema_field['len'];
- $s_default = $schema_field['default'];
- $s_null = $schema_field['null'];
-
- return $d_type != $s_type || $d_len != $s_len || $d_default != $s_default || $d_null != $s_null;
- }
-
- private function keysDiffer($d_name,$d_cols,$s_name,$s_cols)
- {
- return $d_name != $s_name || $d_cols != $s_cols;
- }
-
- private function indexesDiffer($d_name,$d_i,$s_name,$s_i)
- {
- return $d_name != $s_name || $d_i['cols'] != $s_i['cols'] || $d_i['type'] != $s_i['type'];
- }
-
- private function referencesDiffer($d_name,$d_r,$s_name,$s_r)
- {
- return
- $d_name != $s_name || $d_r['c_cols'] != $s_r['c_cols']
- || $d_r['p_table'] != $s_r['p_table'] || $d_r['p_cols'] != $s_r['p_cols']
- || $d_r['update'] != $s_r['update'] || $d_r['delete'] != $s_r['delete'];
- }
-}
-
-class dbStructTable
-{
- protected $name;
- protected $has_primary = false;
-
- protected $fields = array();
- protected $keys = array();
- protected $indexes = array();
- protected $references = array();
-
- /**
- Universal data types supported by dbSchema
-
- SMALLINT : signed 2 bytes integer
- INTEGER : signed 4 bytes integer
- BIGINT : signed 8 bytes integer
- REAL : signed 4 bytes floating point number
- FLOAT : signed 8 bytes floating point number
- NUMERIC : exact numeric type
-
- DATE : Calendar date (day, month and year)
- TIME : Time of day
- TIMESTAMP : Date and time
-
- CHAR : A fixed n-length character string
- VARCHAR : A variable length character string
- TEXT : A variable length of text
- */
- protected $allowed_types = array(
- 'smallint','integer','bigint','real','float','numeric',
- 'date','time','timestamp',
- 'char','varchar','text'
- );
-
- public function __construct($name)
- {
- $this->name = $name;
- return $this;
- }
-
- public function getFields()
- {
- return $this->fields;
- }
-
- public function getKeys($primary=null)
- {
- return $this->keys;
- }
-
- public function getIndexes()
- {
- return $this->indexes;
- }
-
- public function getReferences()
- {
- return $this->references;
- }
-
- public function fieldExists($name)
- {
- return isset($this->fields[$name]);
- }
-
- public function keyExists($name,$type,$cols)
- {
- # Look for key with the same name
- if (isset($this->keys[$name])) {
- return $name;
- }
-
- # Look for key with the same columns list and type
- foreach ($this->keys as $n => $k)
- {
- if ($k['cols'] == $cols && $k['type'] == $type) {
- # Same columns and type, return new name
- return $n;
- }
- }
-
- return false;
- }
-
- public function indexExists($name,$type,$cols)
- {
- # Look for key with the same name
- if (isset($this->indexes[$name])) {
- return $name;
- }
-
- # Look for index with the same columns list and type
- foreach ($this->indexes as $n => $i)
- {
- if ($i['cols'] == $cols && $i['type'] == $type) {
- # Same columns and type, return new name
- return $n;
- }
- }
-
- return false;
- }
-
- public function referenceExists($name,$c_cols,$p_table,$p_cols)
- {
- if (isset($this->references[$name])) {
- return $name;
- }
-
- # Look for reference with same chil columns, parent table and columns
- foreach ($this->references as $n => $r)
- {
- if ($c_cols == $r['c_cols'] && $p_table == $r['p_table'] && $p_cols == $r['p_cols']) {
- # Only name differs, return new name
- return $n;
- }
- }
-
- return false;
- }
-
- public function field($name,$type,$len,$null=true,$default=false,$to_null=false)
- {
- $type = strtolower($type);
-
- if (!in_array($type,$this->allowed_types))
- {
- if ($to_null) {
- $type = null;
- } else {
- throw new Exception('Invalid data type '.$type.' in schema');
- }
- }
-
- $this->fields[$name] = array(
- 'type' => $type,
- 'len' => (integer) $len,
- 'default' => $default,
- 'null' => (boolean) $null
- );
-
- return $this;
- }
-
- public function __call($name,$args)
- {
- array_unshift($args,$name);
- return call_user_func_array(array($this,'field'),$args);
- }
-
- public function primary($name,$col)
- {
- if ($this->has_primary) {
- throw new Exception(sprintf('Table %s already has a primary key',$this->name));
- }
-
- $cols = func_get_args();
- array_shift($cols);
-
- return $this->newKey('primary',$name,$cols);
- }
-
- public function unique($name,$col)
- {
- $cols = func_get_args();
- array_shift($cols);
-
- return $this->newKey('unique',$name,$cols);
- }
-
- public function index($name,$type,$col)
- {
- $cols = func_get_args();
- array_shift($cols);
- array_shift($cols);
-
- $this->checkCols($cols);
-
- $this->indexes[$name] = array(
- 'type' => strtolower($type),
- 'cols' => $cols
- );
-
- return $this;
- }
-
- public function reference($name,$c_cols,$p_table,$p_cols,$update=false,$delete=false)
- {
- if (!is_array($p_cols)) {
- $p_cols = array($p_cols);
- }
- if (!is_array($c_cols)) {
- $c_cols = array($c_cols);
- }
-
- $this->checkCols($c_cols);
-
- $this->references[$name] = array(
- 'c_cols' => $c_cols,
- 'p_table' => $p_table,
- 'p_cols' => $p_cols,
- 'update' => $update,
- 'delete' => $delete
- );
- }
-
- protected function newKey($type,$name,$cols)
- {
- $this->checkCols($cols);
-
- $this->keys[$name] = array(
- 'type' => $type,
- 'cols' => $cols
- );
-
- if ($type == 'primary') {
- $this->has_primary = true;
- }
-
- return $this;
- }
-
- protected function checkCols($cols)
- {
- foreach ($cols as $v) {
- if (!preg_match('/^\(.*?\)$/',$v) && !isset($this->fields[$v])) {
- throw new Exception(sprintf('Field %s does not exist in table %s',$v,$this->name));
- }
- }
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/dbschema/class.mysql.dbschema.php b/inc/clearbricks/dbschema/class.mysql.dbschema.php
deleted file mode 100644
index af1963f..0000000
--- a/inc/clearbricks/dbschema/class.mysql.dbschema.php
+++ /dev/null
@@ -1,470 +0,0 @@
-con->select($sql);
-
- $res = array();
- while ($rs->fetch()) {
- $res[] = $rs->f(0);
- }
- return $res;
- }
-
- public function db_get_columns($table)
- {
- $sql = 'SHOW COLUMNS FROM '.$this->con->escapeSystem($table);
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- $field = trim($rs->f('Field'));
- $type = trim($rs->f('Type'));
- $null = strtolower($rs->f('Null')) == 'yes';
- $default = $rs->f('Default');
-
- $len = null;
- if (preg_match('/^(.+?)\(([\d,]+)\)$/si',$type,$m)) {
- $type = $m[1];
- $len = (integer) $m[2];
- }
-
- if ($default != '' && !is_numeric($default)) {
- $default = "'".$default."'";
- }
-
- $res[$field] = array(
- 'type' => $type,
- 'len' => $len,
- 'null' => $null,
- 'default' => $default
- );
- }
- return $res;
- }
-
- public function db_get_keys($table)
- {
- $sql = 'SHOW INDEX FROM '.$this->con->escapeSystem($table);
- $rs = $this->con->select($sql);
-
- $t = array();
- $res = array();
- while ($rs->fetch())
- {
- $key_name = $rs->f('Key_name');
- $unique = $rs->f('Non_unique') == 0;
- $seq = $rs->f('Seq_in_index');
- $col_name = $rs->f('Column_name');
-
- if ($key_name == 'PRIMARY' || $unique) {
- $t[$key_name]['cols'][$seq] = $col_name;
- $t[$key_name]['unique'] = $unique;
- }
- }
-
- foreach ($t as $name => $idx)
- {
- ksort($idx['cols']);
-
- $res[] = array(
- 'name' => $name,
- 'primary' => $name == 'PRIMARY',
- 'unique' => $idx['unique'],
- 'cols' => array_values($idx['cols'])
- );
- }
-
- return $res;
- }
-
- public function db_get_indexes($table)
- {
- $sql = 'SHOW INDEX FROM '.$this->con->escapeSystem($table);
- $rs = $this->con->select($sql);
-
- $t = array();
- $res = array();
- while ($rs->fetch())
- {
- $key_name = $rs->f('Key_name');
- $unique = $rs->f('Non_unique') == 0;
- $seq = $rs->f('Seq_in_index');
- $col_name = $rs->f('Column_name');
- $type = $rs->f('Index_type');
-
- if ($key_name != 'PRIMARY' && !$unique) {
- $t[$key_name]['cols'][$seq] = $col_name;
- $t[$key_name]['type'] = $type;
- }
- }
-
- foreach ($t as $name => $idx)
- {
- ksort($idx['cols']);
-
- $res[] = array(
- 'name' => $name,
- 'type' => $idx['type'],
- 'cols' => $idx['cols']
- );
- }
-
- return $res;
- }
-
- public function db_get_references($table)
- {
- $sql = 'SHOW CREATE TABLE '.$this->con->escapeSystem($table);
- $rs = $this->con->select($sql);
-
- $s = $rs->f(1);
-
- $res = array();
-
- $n = preg_match_all('/^\s*CONSTRAINT\s+`(.+?)`\s+FOREIGN\s+KEY\s+\((.+?)\)\s+REFERENCES\s+`(.+?)`\s+\((.+?)\)(.*?)$/msi',$s,$match);
- if ($n > 0)
- {
- foreach ($match[1] as $i => $name)
- {
- # Columns transformation
- $t_cols = str_replace('`','',$match[2][$i]);
- $t_cols = explode(',',$t_cols);
- $r_cols = str_replace('`','',$match[4][$i]);
- $r_cols = explode(',',$r_cols);
-
- # ON UPDATE|DELETE
- $on = trim($match[5][$i],', ');
- $on_delete = null;
- $on_update = null;
- if ($on != '') {
- if (preg_match('/ON DELETE (.+?)(?:\s+ON|$)/msi',$on,$m)) {
- $on_delete = strtolower(trim($m[1]));
- }
- if (preg_match('/ON UPDATE (.+?)(?:\s+ON|$)/msi',$on,$m)) {
- $on_update = strtolower(trim($m[1]));
- }
- }
-
- $res[] = array (
- 'name' => $name,
- 'c_cols' => $t_cols,
- 'p_table' => $match[3][$i],
- 'p_cols' => $r_cols,
- 'update' => $on_update,
- 'delete' => $on_delete
- );
- }
- }
- return $res;
- }
-
- public function db_create_table($name,$fields)
- {
- $a = array();
-
- foreach ($fields as $n => $f)
- {
- $type = $f['type'];
- $len = (integer) $f['len'];
- $default = $f['default'];
- $null = $f['null'];
-
- $type = $this->udt2dbt($type,$len,$default);
- $len = $len > 0 ? '('.$len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default.' ';
- } else {
- $default = '';
- }
-
- $a[] =
- $this->con->escapeSystem($n).' '.
- $type.$len.' '.$null.' '.$default;
- }
-
- $sql =
- 'CREATE TABLE '.$this->con->escapeSystem($name)." (\n".
- implode(",\n",$a).
- "\n) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin ";
-
- $this->con->execute($sql);
- }
-
- public function db_create_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- $len = (integer) $len > 0 ? '('.(integer) $len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default;
- } else {
- $default = '';
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'ADD COLUMN '.$this->con->escapeSystem($name).' '.
- $type.$len.' '.$null.' '.$default;
-
- $this->con->execute($sql);
- }
-
- public function db_create_primary($table,$name,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'ADD CONSTRAINT PRIMARY KEY ('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_unique($table,$name,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'ADD CONSTRAINT UNIQUE KEY '.$this->con->escapeSystem($name).' '.
- '('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_index($table,$name,$type,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'ADD INDEX '.$this->con->escapeSystem($name).' USING '.$type.' '.
- '('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- $c = array();
- $p = array();
- foreach ($c_cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
- foreach ($p_cols as $v) {
- $p[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($c_table).' '.
- 'ADD CONSTRAINT '.$name.' FOREIGN KEY '.
- '('.implode(',',$c).') '.
- 'REFERENCES '.$this->con->escapeSystem($p_table).' '.
- '('.implode(',',$p).') ';
-
- if ($update) {
- $sql .= 'ON UPDATE '.$update.' ';
- }
- if ($delete) {
- $sql .= 'ON DELETE '.$delete.' ';
- }
-
- $this->con->execute($sql);
- }
-
- public function db_alter_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- $len = (integer) $len > 0 ? '('.(integer) $len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default;
- } else {
- $default = '';
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'CHANGE COLUMN '.$this->con->escapeSystem($name).' '.$this->con->escapeSystem($name).' '.
- $type.$len.' '.$null.' '.$default;
-
- $this->con->execute($sql);
- }
-
- public function db_alter_primary($table,$name,$newname,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'DROP PRIMARY KEY, ADD PRIMARY KEY '.
- '('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_alter_unique($table,$name,$newname,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'DROP INDEX '.$this->con->escapeSystem($name).', '.
- 'ADD UNIQUE '.$this->con->escapeSystem($newname).' '.
- '('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_alter_index($table,$name,$newname,$type,$cols)
- {
- $c = array();
- foreach ($cols as $v) {
- $c[] = $this->con->escapeSystem($v);
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'DROP INDEX '.$this->con->escapeSystem($name).', '.
- 'ADD INDEX '.$this->con->escapeSystem($newname).' '.
- 'USING '.$type.' '.
- '('.implode(',',$c).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($c_table).' '.
- 'DROP FOREIGN KEY '.$this->con->escapeSystem($name);
-
- $this->con->execute($sql);
- $this->createReference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
- }
-
- public function db_drop_unique($table,$name)
- {
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'DROP INDEX '.$this->con->escapeSystem($name);
- $this->con->execute($sql);
- }
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/dbschema/class.pgsql.dbschema.php b/inc/clearbricks/dbschema/class.pgsql.dbschema.php
deleted file mode 100644
index 3745713..0000000
--- a/inc/clearbricks/dbschema/class.pgsql.dbschema.php
+++ /dev/null
@@ -1,400 +0,0 @@
- 'no action',
- 'r' => 'restrict',
- 'c' => 'cascade',
- 'n' => 'set null',
- 'd' => 'set default'
- );
-
- public function dbt2udt($type,&$len,&$default)
- {
- $type = parent::dbt2udt($type,$len,$default);
-
- return $type;
- }
-
- public function udt2dbt($type,&$len,&$default)
- {
- $type = parent::udt2dbt($type,$len,$default);
-
- return $type;
- }
-
- public function db_get_tables()
- {
- $sql =
- 'SELECT table_name '.
- 'FROM information_schema.tables '.
- "WHERE table_schema = 'public' ";
-
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch()) {
- $res[] = $rs->f(0);
- }
- return $res;
- }
-
- public function db_get_columns($table)
- {
- $sql =
- 'SELECT column_name, udt_name, character_maximum_length, '.
- 'is_nullable, column_default '.
- 'FROM information_schema.columns '.
- "WHERE table_name = '".$this->con->escape($table)."' ";
-
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- $field = trim($rs->column_name);
- $type = trim($rs->udt_name);
- $null = strtolower($rs->is_nullable) == 'yes';
- $default = $rs->column_default;
- $len = $rs->character_maximum_length;
-
- if ($len == '') {
- $len = null;
- }
-
- $default = preg_replace('/::([\w\d\s]*)$/','',$default);
-
- $res[$field] = array(
- 'type' => $type,
- 'len' => $len,
- 'null' => $null,
- 'default' => $default
- );
- }
-
- return $res;
- }
-
- public function db_get_keys($table)
- {
- $sql =
- 'SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, indisunique::integer, indisprimary::integer, '.
- 'indnatts, tab.relname as tabname, contype, amname '.
- 'FROM pg_index idx '.
- 'JOIN pg_class cls ON cls.oid=indexrelid '.
- 'JOIN pg_class tab ON tab.oid=indrelid '.
- 'LEFT OUTER JOIN pg_tablespace ta on ta.oid=cls.reltablespace '.
- 'JOIN pg_namespace n ON n.oid=tab.relnamespace '.
- 'JOIN pg_am am ON am.oid=cls.relam '.
- "LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0') ".
- 'LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) '.
- 'LEFT OUTER JOIN pg_description des ON des.objoid=con.oid '.
- 'LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) '.
- "WHERE tab.relname = '".$this->con->escape($table)."' ".
- "AND contype IN ('p','u') ".
- 'ORDER BY cls.relname ';
-
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- $k = array(
- 'name' => $rs->idxname,
- 'primary' => (boolean) $rs->indisprimary,
- 'unique' => (boolean) $rs->indisunique,
- 'cols' => array()
- );
-
- for ($i=1; $i<=$rs->indnatts; $i++) {
- $cols = $this->con->select('SELECT pg_get_indexdef('.$rs->oid.'::oid, '.$i.', true);');
- $k['cols'][] = $cols->f(0);
- }
-
- $res[] = $k;
- }
-
- return $res;
- }
-
- public function db_get_indexes($table)
- {
- $sql =
- 'SELECT DISTINCT ON(cls.relname) cls.oid, cls.relname as idxname, n.nspname, '.
- 'indnatts, tab.relname as tabname, contype, amname '.
- 'FROM pg_index idx '.
- 'JOIN pg_class cls ON cls.oid=indexrelid '.
- 'JOIN pg_class tab ON tab.oid=indrelid '.
- 'LEFT OUTER JOIN pg_tablespace ta on ta.oid=cls.reltablespace '.
- 'JOIN pg_namespace n ON n.oid=tab.relnamespace '.
- 'JOIN pg_am am ON am.oid=cls.relam '.
- "LEFT JOIN pg_depend dep ON (dep.classid = cls.tableoid AND dep.objid = cls.oid AND dep.refobjsubid = '0') ".
- 'LEFT OUTER JOIN pg_constraint con ON (con.tableoid = dep.refclassid AND con.oid = dep.refobjid) '.
- 'LEFT OUTER JOIN pg_description des ON des.objoid=con.oid '.
- 'LEFT OUTER JOIN pg_description desp ON (desp.objoid=con.oid AND desp.objsubid = 0) '.
- "WHERE tab.relname = '".$this->con->escape($table)."' ".
- 'AND conname IS NULL '.
- 'ORDER BY cls.relname ';
-
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- $k = array(
- 'name' => $rs->idxname,
- 'type' => $rs->amname,
- 'cols' => array()
- );
-
- for ($i=1; $i<=$rs->indnatts; $i++) {
- $cols = $this->con->select('SELECT pg_get_indexdef('.$rs->oid.'::oid, '.$i.', true);');
- $k['cols'][] = $cols->f(0);
- }
-
- $res[] = $k;
- }
-
- return $res;
- }
-
- public function db_get_references($table)
- {
- $sql =
- 'SELECT ct.oid, conname, condeferrable, condeferred, confupdtype, '.
- 'confdeltype, confmatchtype, conkey, confkey, conrelid, confrelid, cl.relname as fktab, '.
- 'cr.relname as reftab '.
- 'FROM pg_constraint ct '.
- 'JOIN pg_class cl ON cl.oid=conrelid '.
- 'JOIN pg_namespace nl ON nl.oid=cl.relnamespace '.
- 'JOIN pg_class cr ON cr.oid=confrelid '.
- 'JOIN pg_namespace nr ON nr.oid=cr.relnamespace '.
- "WHERE contype='f' ".
- "AND cl.relname = '".$this->con->escape($table)."' ".
- 'ORDER BY conname ';
-
- $rs = $this->con->select($sql);
-
- $cols_sql =
- 'SELECT a1.attname as conattname, a2.attname as confattname '.
- 'FROM pg_attribute a1, pg_attribute a2 '.
- 'WHERE a1.attrelid=%1$s::oid AND a1.attnum=%2$s '.
- 'AND a2.attrelid=%3$s::oid AND a2.attnum=%4$s ';
-
- $res = array();
- while ($rs->fetch())
- {
- $conkey = preg_replace('/[^\d]/','',$rs->conkey);
- $confkey = preg_replace('/[^\d]/','',$rs->confkey);
-
- $k = array(
- 'name' => $rs->conname,
- 'c_cols' => array(),
- 'p_table' => $rs->reftab,
- 'p_cols' => array(),
- 'update' => $this->ref_actions_map[$rs->confupdtype],
- 'delete' => $this->ref_actions_map[$rs->confdeltype]
- );
-
- $cols = $this->con->select(sprintf($cols_sql,$rs->conrelid,$conkey,$rs->confrelid,$confkey));
- while ($cols->fetch()) {
- $k['c_cols'][] = $cols->conattname;
- $k['p_cols'][] = $cols->confattname;
- }
-
- $res[] = $k;
- }
-
- return $res;
- }
-
- public function db_create_table($name,$fields)
- {
- $a = array();
-
- foreach ($fields as $n => $f)
- {
- $type = $f['type'];
- $len = (integer) $f['len'];
- $default = $f['default'];
- $null = $f['null'];
-
- $type = $this->udt2dbt($type,$len,$default);
- $len = $len > 0 ? '('.$len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default.' ';
- } else {
- $default = '';
- }
-
- $a[] =
- $n.' '.
- $type.$len.' '.$null.' '.$default;
- }
-
- $sql =
- 'CREATE TABLE '.$name." (\n".
- implode(",\n",$a).
- "\n)";
-
- $this->con->execute($sql);
- }
-
- public function db_create_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- $len = $len > 0 ? '('.$len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default.' ';
- } else {
- $default = '';
- }
-
- $sql =
- 'ALTER TABLE '.$table.' ADD COLUMN '.$name.' '.
- $type.$len.' '.$null.' '.$default;
-
- $this->con->execute($sql);
- }
-
- public function db_create_primary($table,$name,$cols)
- {
- $sql =
- 'ALTER TABLE '.$table.' '.
- 'ADD CONSTRAINT '.$name.' PRIMARY KEY ('.implode(",",$cols).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_unique($table,$name,$cols)
- {
- $sql =
- 'ALTER TABLE '.$table.' '.
- 'ADD CONSTRAINT '.$name.' UNIQUE ('.implode(',',$cols).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_index($table,$name,$type,$cols)
- {
- $sql =
- 'CREATE INDEX '.$name.' ON '.$table.' USING '.$type.
- '('.implode(',',$cols).') ';
-
- $this->con->execute($sql);
- }
-
- public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- $sql =
- 'ALTER TABLE '.$c_table.' '.
- 'ADD CONSTRAINT '.$name.' FOREIGN KEY '.
- '('.implode(',',$c_cols).') '.
- 'REFERENCES '.$p_table.' '.
- '('.implode(',',$p_cols).') ';
-
- if ($update) {
- $sql .= 'ON UPDATE '.$update.' ';
- }
- if ($delete) {
- $sql .= 'ON DELETE '.$delete.' ';
- }
-
- $this->con->execute($sql);
- }
-
- public function db_alter_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- $len = (integer) $len > 0 ? '('.(integer) $len.')' : '';
-
- $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' TYPE '.$type.$len;
- $this->con->execute($sql);
-
- if ($default === null) {
- $default = 'SET DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'SET DEFAULT '.$default;
- } else {
- $default = 'DROP DEFAULT';
- }
-
- $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' '.$default;
- $this->con->execute($sql);
-
- $null = $null ? 'DROP NOT NULL' : 'SET NOT NULL';
- $sql = 'ALTER TABLE '.$table.' ALTER COLUMN '.$name.' '.$null;
- $this->con->execute($sql);
- }
-
- public function db_alter_primary($table,$name,$newname,$cols)
- {
- $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name;
- $this->con->execute($sql);
-
- $this->createPrimary($table,$newname,$cols);
- }
-
- public function db_alter_unique($table,$name,$newname,$cols)
- {
- $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name;
- $this->con->execute($sql);
-
- $this->createUnique($table,$newname,$cols);
- }
-
- public function db_alter_index($table,$name,$newname,$type,$cols)
- {
- $sql = 'DROP INDEX '.$name;
- $this->con->execute($sql);
-
- $this->createIndex($table,$newname,$type,$cols);
- }
-
- public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- $sql = 'ALTER TABLE '.$c_table.' DROP CONSTRAINT '.$name;
- $this->con->execute($sql);
-
- $this->createReference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
- }
-
- public function db_drop_unique($table,$name)
- {
- $sql = 'ALTER TABLE '.$table.' DROP CONSTRAINT '.$name;
- $this->con->execute($sql);
- }
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/dbschema/class.sqlite.dbschema.php b/inc/clearbricks/dbschema/class.sqlite.dbschema.php
deleted file mode 100644
index aa0b336..0000000
--- a/inc/clearbricks/dbschema/class.sqlite.dbschema.php
+++ /dev/null
@@ -1,515 +0,0 @@
-table_stack as $table => $def)
- {
- $sql = 'CREATE TABLE '.$table." (\n".implode(",\n",$def)."\n)\n ";
- $this->con->execute($sql);
- }
-
- foreach ($this->x_stack as $x)
- {
- $this->con->execute($x);
- }
-
- }
-
- public function db_get_tables()
- {
- $res = array();
- $sql = "SELECT * FROM sqlite_master WHERE type = 'table'";
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch()) {
- $res[] = $rs->tbl_name;
- }
-
- return $res;
- }
-
- public function db_get_columns($table)
- {
- $sql = 'PRAGMA table_info('.$this->con->escapeSystem($table).')';
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- $field = trim($rs->name);
- $type = trim($rs->type);
- $null = trim($rs->notnull) == 0;
- $default = trim($rs->dflt_value);
-
- $len = null;
- if (preg_match('/^(.+?)\(([\d,]+)\)$/si',$type,$m)) {
- $type = $m[1];
- $len = (integer) $m[2];
- }
-
- $res[$field] = array(
- 'type' => $type,
- 'len' => $len,
- 'null' => $null,
- 'default' => $default
- );
- }
- return $res;
- }
-
- public function db_get_keys($table)
- {
- $t = array();
- $res = array();
-
- # Get primary keys first
- $sql = "SELECT sql FROM sqlite_master WHERE type='table' AND name='".$this->con->escape($table)."'";
- $rs = $this->con->select($sql);
-
- if ($rs->isEmpty()) {
- return array();
- }
-
- # Get primary keys
- $n = preg_match_all('/^\s*CONSTRAINT\s+([^,]+?)\s+PRIMARY\s+KEY\s+\((.+?)\)/msi',$rs->sql,$match);
- if ($n > 0)
- {
- foreach ($match[1] as $i => $name)
- {
- $cols = preg_split('/\s*,\s*/',$match[2][$i]);
- $res[] = array(
- 'name' => $name,
- 'primary' => true,
- 'unique' => false,
- 'cols' => $cols
- );
- }
- }
-
- # Get unique keys
- $n = preg_match_all('/^\s*CONSTRAINT\s+([^,]+?)\s+UNIQUE\s+\((.+?)\)/msi',$rs->sql,$match);
- if ($n > 0)
- {
- foreach ($match[1] as $i => $name)
- {
- $cols = preg_split('/\s*,\s*/',$match[2][$i]);
- $res[] = array(
- 'name' => $name,
- 'primary' => false,
- 'unique' => true,
- 'cols' => $cols
- );
- }
- }
-
- return $res;
- }
-
- public function db_get_indexes($table)
- {
- $sql = 'PRAGMA index_list('.$this->con->escapeSystem($table).')';
- $rs = $this->con->select($sql);
-
- $res = array();
- while ($rs->fetch())
- {
- if (preg_match('/^sqlite_/',$rs->name)) {
- continue;
- }
-
- $idx = $this->con->select('PRAGMA index_info('.$this->con->escapeSystem($rs->name).')');
- $cols = array();
- while ($idx->fetch()) {
- $cols[] = $idx->name;
- }
-
- $res[] = array(
- 'name' => $rs->name,
- 'type' => 'btree',
- 'cols' => $cols
- );
- }
-
- return $res;
- }
-
- public function db_get_references($table)
- {
- $sql = 'SELECT * FROM sqlite_master WHERE type=\'trigger\' AND tbl_name = \'%1$s\' AND name LIKE \'%2$s_%%\' ';
- $res = array();
-
- # Find constraints on table
- $bir = $this->con->select(sprintf($sql,$this->con->escape($table),'bir'));
- $bur = $this->con->select(sprintf($sql,$this->con->escape($table),'bur'));
-
- if ($bir->isEmpty() || $bur->isempty()) {
- return $res;
- }
-
- while ($bir->fetch())
- {
- # Find child column and parent table and column
- if (!preg_match('/FROM\s+(.+?)\s+WHERE\s+(.+?)\s+=\s+NEW\.(.+?)\s*?\) IS\s+NULL/msi',$bir->sql,$m)) {
- continue;
- }
-
- $c_col = $m[3];
- $p_table = $m[1];
- $p_col = $m[2];
-
- # Find on update
- $on_update = 'restrict';
- $aur = $this->con->select(sprintf($sql,$this->con->escape($p_table),'aur'));
- while ($aur->fetch())
- {
- if (!preg_match('/AFTER\s+UPDATE/msi',$aur->sql)) {
- continue;
- }
-
- if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NEW.'.$p_col.
- '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$aur->sql)) {
- $on_update = 'cascade';
- break;
- }
-
- if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NULL'.
- '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$aur->sql)) {
- $on_update = 'set null';
- break;
- }
- }
-
- # Find on delete
- $on_delete = 'restrict';
- $bdr = $this->con->select(sprintf($sql,$this->con->escape($p_table),'bdr'));
- while ($bdr->fetch())
- {
- if (!preg_match('/BEFORE\s+DELETE/msi',$bdr->sql)) {
- continue;
- }
-
- if (preg_match('/DELETE\s+FROM\s+'.$table.'\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$bdr->sql)) {
- $on_delete = 'cascade';
- break;
- }
-
- if (preg_match('/UPDATE\s+'.$table.'\s+SET\s+'.$c_col.'\s*=\s*NULL'.
- '\s+WHERE\s+'.$c_col.'\s*=\s*OLD\.'.$p_col.'/msi',$bdr->sql)) {
- $on_update = 'set null';
- break;
- }
- }
-
- $res[] = array(
- 'name' => substr($bir->name,4),
- 'c_cols' => array($c_col),
- 'p_table' => $p_table,
- 'p_cols' => array($p_col),
- 'update' => $on_update,
- 'delete' => $on_delete
- );
- }
-
- return $res;
- }
-
- public function db_create_table($name,$fields)
- {
- $a = array();
-
- foreach ($fields as $n => $f)
- {
- $type = $f['type'];
- $len = (integer) $f['len'];
- $default = $f['default'];
- $null = $f['null'];
-
- $type = $this->udt2dbt($type,$len,$default);
- $len = $len > 0 ? '('.$len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default.' ';
- } else {
- $default = '';
- }
-
- $a[] = $n.' '.$type.$len.' '.$null.' '.$default;
- }
-
- $this->table_stack[$name][] = implode(",\n",$a);
- $this->table_hist[$name] = $fields;
- }
-
- public function db_create_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- $len = $len > 0 ? '('.$len.')' : '';
- $null = $null ? 'NULL' : 'NOT NULL';
-
- if ($default === null) {
- $default = 'DEFAULT NULL';
- } elseif ($default !== false) {
- $default = 'DEFAULT '.$default.' ';
- } else {
- $default = '';
- }
-
- $sql =
- 'ALTER TABLE '.$this->con->escapeSystem($table).' '.
- 'ADD COLUMN '.$this->con->escapeSystem($name).' '.
- $type.$len.' '.$null.' '.$default;
-
- $this->con->execute($sql);
- }
-
- public function db_create_primary($table,$name,$cols)
- {
- $this->table_stack[$table][] = 'CONSTRAINT '.$name.' PRIMARY KEY ('.implode(',',$cols).') ';
- }
-
- public function db_create_unique($table,$name,$cols)
- {
- $this->table_stack[$table][] = 'CONSTRAINT '.$name.' UNIQUE ('.implode(',',$cols).') ';
- }
-
- public function db_create_index($table,$name,$type,$cols)
- {
- $this->x_stack[] = 'CREATE INDEX '.$name.' ON '.$table.' ('.implode(',',$cols).') ';
- }
-
- public function db_create_reference($name,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- if (!isset($this->table_hist[$c_table])) {
- return;
- }
-
- if (count($c_cols) > 1 || count($p_cols) > 1) {
- throw new Exception('SQLite UDBS does not support multiple columns foreign keys');
- }
-
- $c_col = $c_cols[0];
- $p_col = $p_cols[0];
-
- $update = strtolower($update);
- $delete = strtolower($delete);
-
- $cnull = $this->table_hist[$c_table][$c_col]['null'];
-
- # Create constraint
- $this->x_stack[] =
- 'CREATE TRIGGER bir_'.$name."\n".
- 'BEFORE INSERT ON '.$c_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' SELECT RAISE(ROLLBACK,\'insert on table "'.$c_table.'" violates foreign key constraint "'.$name.'"\')'."\n".
- ' WHERE '.
- ($cnull ? 'NEW.'.$c_col." IS NOT NULL\n AND " : '').
- '(SELECT '.$p_col.' FROM '.$p_table.' WHERE '.$p_col.' = NEW.'.$c_col.") IS NULL;\n".
- "END;\n";
-
- # Update constraint
- $this->x_stack[] =
- 'CREATE TRIGGER bur_'.$name."\n".
- 'BEFORE UPDATE ON '.$c_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' SELECT RAISE(ROLLBACK,\'update on table "'.$c_table.'" violates foreign key constraint "'.$name.'"\')'."\n".
- ' WHERE '.
- ($cnull ? 'NEW.'.$c_col." IS NOT NULL\n AND " : '').
- '(SELECT '.$p_col.' FROM '.$p_table.' WHERE '.$p_col.' = NEW.'.$c_col.") IS NULL;\n".
- "END;\n";
-
- # ON UPDATE
- if ($update == 'cascade')
- {
- $this->x_stack[] =
- 'CREATE TRIGGER aur_'.$name."\n".
- 'AFTER UPDATE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' UPDATE '.$c_table.' SET '.$c_col.' = NEW.'.$p_col.' WHERE '.$c_col.' = OLD.'.$p_col.";\n".
- "END;\n";
- }
- elseif ($update == 'set null')
- {
- $this->x_stack[] =
- 'CREATE TRIGGER aur_'.$name."\n".
- 'AFTER UPDATE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' UPDATE '.$c_table.' SET '.$c_col.' = NULL WHERE '.$c_col.' = OLD.'.$p_col.";\n".
- "END;\n";
- }
- else # default on restrict
- {
- $this->x_stack[] =
- 'CREATE TRIGGER burp_'.$name."\n".
- 'BEFORE UPDATE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' SELECT RAISE (ROLLBACK,\'update on table "'.$p_table.'" violates foreign key constraint "'.$name.'"\')'."\n".
- ' WHERE (SELECT '.$c_col.' FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.") IS NOT NULL;\n".
- "END;\n";
- }
-
- # ON DELETE
- if ($delete == 'cascade')
- {
- $this->x_stack[] =
- 'CREATE TRIGGER bdr_'.$name."\n".
- 'BEFORE DELETE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' DELETE FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.";\n".
- "END;\n";
- }
- elseif ($delete == 'set null')
- {
- $this->x_stack[] =
- 'CREATE TRIGGER bdr_'.$name."\n".
- 'BEFORE DELETE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' UPDATE '.$c_table.' SET '.$c_col.' = NULL WHERE '.$c_col.' = OLD.'.$p_col.";\n".
- "END;\n";
- }
- else
- {
- $this->x_stack[] =
- 'CREATE TRIGGER bdr_'.$name."\n".
- 'BEFORE DELETE ON '.$p_table."\n".
- "FOR EACH ROW BEGIN\n".
- ' SELECT RAISE (ROLLBACK,\'delete on table "'.$p_table.'" violates foreign key constraint "'.$name.'"\')'."\n".
- ' WHERE (SELECT '.$c_col.' FROM '.$c_table.' WHERE '.$c_col.' = OLD.'.$p_col.") IS NOT NULL;\n".
- "END;\n";
- }
- }
-
- public function db_alter_field($table,$name,$type,$len,$null,$default)
- {
- $type = $this->udt2dbt($type,$len,$default);
- if ($type != 'integer' && $type != 'text' && $type != 'timestamp') {
- throw new Exception('SQLite fields cannot be changed.');
- }
- }
-
- public function db_alter_primary($table,$name,$newname,$cols)
- {
- throw new Exception('SQLite primary key cannot be changed.');
- }
-
- public function db_alter_unique($table,$name,$newname,$cols)
- {
- throw new Exception('SQLite unique index cannot be changed.');
- }
-
- public function db_alter_index($table,$name,$newname,$type,$cols)
- {
- $this->con->execute('DROP INDEX IF EXISTS '.$name);
- $this->con->execute('CREATE INDEX '.$newname.' ON '.$table.' ('.implode(',',$cols).') ');
- }
-
- public function db_alter_reference($name,$newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete)
- {
- $this->con->execute('DROP TRIGGER IF EXISTS bur_'.$name);
- $this->con->execute('DROP TRIGGER IF EXISTS burp_'.$name);
- $this->con->execute('DROP TRIGGER IF EXISTS bir_'.$name);
- $this->con->execute('DROP TRIGGER IF EXISTS aur_'.$name);
- $this->con->execute('DROP TRIGGER IF EXISTS bdr_'.$name);
-
- $this->table_hist[$c_table] = $this->db_get_columns($c_table);
- $this->db_create_reference($newname,$c_table,$c_cols,$p_table,$p_cols,$update,$delete);
- }
-
- public function db_drop_unique($table,$name)
- {
- throw new Exception('SQLite unique index cannot be removed.');
- }
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/filemanager/class.filemanager.php b/inc/clearbricks/filemanager/class.filemanager.php
deleted file mode 100644
index 3096ee8..0000000
--- a/inc/clearbricks/filemanager/class.filemanager.php
+++ /dev/null
@@ -1,614 +0,0 @@
-array(),'files'=>array());
-
- /**
- * Constructor
- *
- * New filemanage istance. Note that filemanage is a jail in given root
- * path. You won't be able to access files outside {@link $root} path with
- * the object's methods.
- *
- * @param string $root Root path
- * @param string $root_url Root URL
- */
- public function __construct($root,$root_url='')
- {
- $this->root = $this->pwd = path::real($root);
- $this->root_url = $root_url;
-
- if (!preg_match('#/$#',$this->root_url)) {
- $this->root_url = $this->root_url.'/';
- }
-
- if (!$this->root) {
- throw new Exception('Invalid root directory.');
- }
- }
-
- /**
- * Change directory
- *
- * Changes working directory. $dir is relative to instance {@link $root}
- * directory.
- *
- * @param string $dir Directory
- */
- public function chdir($dir)
- {
- $realdir = path::real($this->root.'/'.path::clean($dir));
- if (!$realdir || !is_dir($realdir)) {
- throw new Exception('Invalid directory.');
- }
-
- if ($this->isExclude($realdir)) {
- throw new Exception('Directory is excluded.');
- }
-
- $this->pwd = $realdir;
- }
-
- /**
- * Get working directory
- *
- * Returns working directory path.
- *
- * @return string
- */
- public function getPwd()
- {
- return $this->pwd;
- }
-
- /**
- * Current directory is writable
- *
- * @return boolean true if working directory is writable
- */
- public function writable()
- {
- if (!$this->pwd) {
- return false;
- }
-
- return is_writable($this->pwd);
- }
-
- /**
- * Add exclusion
- *
- * Appends an exclusion to exclusions list. $f should be a regexp.
- *
- * @see $exclude_list
- * @param string $f Exclusion regexp
- */
- public function addExclusion($f)
- {
- if (is_array($f))
- {
- foreach ($f as $v) {
- if (($V = path::real($v)) !== false) {
- $this->exclude_list[] = $V;
- }
- }
- }
- elseif (($F = path::real($f)) !== false)
- {
- $this->exclude_list[] = $F;
- }
- }
-
- /**
- * Path is excluded
- *
- * Returns true if path (file or directory) $f is excluded. $f path is
- * relative to {@link $root} path.
- *
- * @see $exclude_list
- * @param string $f Path to match
- * @return boolean
- */
- protected function isExclude($f)
- {
- foreach ($this->exclude_list as $v)
- {
- if (strpos($f,$v) === 0) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * File is excluded
- *
- * Returns true if file $f is excluded. $f path is relative to {@link $root}
- * path.
- *
- * @see $exclude_pattern
- * @param string $f File to match
- * @return boolean
- */
- protected function isFileExclude($f)
- {
- if (!$this->exclude_pattern) {
- return false;
- }
-
- return preg_match($this->exclude_pattern,$f);
- }
-
- /**
- * Item in jail
- *
- * Returns true if file or directory $f is in jail (ie. not outside the
- * {@link $root} directory).
- *
- * @param string $f Path to match
- * @return boolean
- */
- protected function inJail($f)
- {
- $f = path::real($f);
-
- if ($f !== false) {
- return preg_match('|^'.preg_quote($this->root,'|').'|',$f);
- }
-
- return false;
- }
-
- /**
- * File in files
- *
- * Returns true if file $f is in files array of {@link $dir}.
- *
- * @param string $f File to match
- * @return boolean
- */
- public function inFiles($f)
- {
- foreach ($this->dir['files'] as $v) {
- if ($v->relname == $f) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Directory list
- *
- * Creates list of items in working directory and append it to {@link $dir}
- *
- * @uses sortHandler()
- * @uses fileItem
- */
- public function getDir()
- {
- $dir = path::clean($this->pwd);
-
- $dh = @opendir($dir);
-
- if ($dh === false) {
- throw new Exception('Unable to read directory.');
- }
-
- $d_res = $f_res = array();
-
- while (($file = readdir($dh)) !== false)
- {
- $fname = $dir.'/'.$file;
-
- if ($this->inJail($fname) && !$this->isExclude($fname))
- {
- if (is_dir($fname) && $file != '.') {
- $tmp = new fileItem($fname,$this->root,$this->root_url);
- if ($file == '..') {
- $tmp->parent = true;
- }
- $d_res[] = $tmp;
- }
-
- if (is_file($fname) && strpos($file,'.') !== 0 && !$this->isFileExclude($file)) {
- $f_res[] = new fileItem($fname,$this->root,$this->root_url);
- }
- }
- }
- closedir($dh);
-
- $this->dir = array('dirs'=>$d_res,'files'=>$f_res);
- usort($this->dir['dirs'],array($this,'sortHandler'));
- usort($this->dir['files'],array($this,'sortHandler'));
- }
-
- /**
- * Root directories
- *
- * Returns an array of directory under {@link $root} directory.
- *
- * @uses fileItem
- * @return array
- */
- public function getRootDirs()
- {
- $d = files::getDirList($this->root);
-
- $dir = array();
-
- foreach ($d['dirs'] as $v) {
- $dir[] = new fileItem($v,$this->root,$this->root_url);
- }
-
- return $dir;
- }
-
- /**
- * Upload file
- *
- * Move $tmp file to its final destination $dest and
- * returns the destination file path.
- * $dest should be in jail. This method will throw exception
- * if the file cannot be written.
- *
- * You should first verify upload status, with {@link files::uploadStatus()}
- * or PHP native functions.
- *
- * @see files::uploadStatus()
- * @param string $tmp Temporary uploaded file path
- * @param string $dest Destination file
- * @param string $overwrite overwrite mode
- * @return string Destination real path
- */
- public function uploadFile($tmp,$dest,$overwrite=false)
- {
- $dest = $this->pwd.'/'.path::clean($dest);
-
- if ($this->isFileExclude($dest)) {
- throw new Exception(__('Uploading this file is not allowed.'));
- }
-
- if (!$this->inJail(dirname($dest))) {
- throw new Exception(__('Destination directory is not in jail.'));
- }
-
- if (!$overwrite && file_exists($dest)) {
- throw new Exception(__('File already exists.'));
- }
-
- if (!is_writable(dirname($dest))) {
- throw new Exception(__('Cannot write in this directory.'));
- }
-
- if (@move_uploaded_file($tmp,$dest) === false) {
- throw new Exception(__('An error occurred while writing the file.'));
- }
-
- files::inheritChmod($dest);
- return path::real($dest);
- }
-
- /**
- * Upload file by bits
- *
- * Creates a new file $dest with contents of $bits and
- * return the destination file path.
- * $dest should be in jail. This method will throw exception
- * if file cannot be written.
- *
- * @param string $bits Destination file content
- * @param string $dest Destination file
- * @return string Destination real path
- */
- public function uploadBits($name,$bits)
- {
- $dest = $this->pwd.'/'.path::clean($name);
-
- if ($this->isFileExclude($dest)) {
- throw new Exception(__('Uploading this file is not allowed.'));
- }
-
- if (!$this->inJail(dirname($dest))) {
- throw new Exception(__('Destination directory is not in jail.'));
- }
-
- if (!is_writable(dirname($dest))) {
- throw new Exception(__('Cannot write in this directory.'));
- }
-
- $fp = @fopen($dest,'wb');
- if ($fp === false) {
- throw new Exception(__('An error occurred while writing the file.'));
- }
-
- fwrite($fp,$bits);
- fclose($fp);
- files::inheritChmod($dest);
-
- return path::real($dest);
- }
-
- /**
- * New directory
- *
- * Creates a new directory $d relative to working directory.
- *
- * @param string $d Directory name
- */
- public function makeDir($d)
- {
- files::makeDir($this->pwd.'/'.path::clean($d));
- }
-
- /**
- * Move file
- *
- * Moves a file $s to a new destination $d. Both
- * $s and $d are relative to {@link $root}.
- *
- * @param string $s Source file
- * @param string $d Destination file
- */
- public function moveFile($s,$d)
- {
- $s = $this->root.'/'.path::clean($s);
- $d = $this->root.'/'.path::clean($d);
-
- if (($s = path::real($s)) === false) {
- throw new Exception(__('Source file does not exist.'));
- }
-
- $dest_dir = path::real(dirname($d));
-
- if (!$this->inJail($s)) {
- throw new Exception(__('File is not in jail.'));
- }
- if (!$this->inJail($dest_dir)) {
- throw new Exception(__('File is not in jail.'));
- }
-
- if (!is_writable($dest_dir)) {
- throw new Exception(__('Destination directory is not writable.'));
- }
-
- if (@rename($s,$d) === false) {
- throw new Exception(__('Unable to rename file.'));
- }
- }
-
- /**
- * Remove item
- *
- * Removes a file or directory $f which is relative to working
- * directory.
- *
- * @param string $f Path to remove
- */
- public function removeItem($f)
- {
- $file = path::real($this->pwd.'/'.path::clean($f));
-
- if (is_file($file)) {
- $this->removeFile($f);
- } elseif (is_dir($file)) {
- $this->removeDir($f);
- }
- }
-
- /**
- * Remove item
- *
- * Removes a file $f which is relative to working directory.
- *
- * @param string $f File to remove
- */
- public function removeFile($f)
- {
- $f = path::real($this->pwd.'/'.path::clean($f));
-
- if (!$this->inJail($f)) {
- throw new Exception(__('File is not in jail.'));
- }
-
- if (!files::isDeletable($f)) {
- throw new Exception(__('File cannot be removed.'));
- }
-
- if (@unlink($f) === false) {
- throw new Exception(__('File cannot be removed.'));
- }
- }
-
- /**
- * Remove item
- *
- * Removes a directory $d which is relative to working directory.
- *
- * @param string $d Directory to remove
- */
- public function removeDir($d)
- {
- $d = path::real($this->pwd.'/'.path::clean($d));
-
- if (!$this->inJail($d)) {
- throw new Exception(__('Directory is not in jail.'));
- }
-
- if (!files::isDeletable($d)) {
- throw new Exception(__('Directory cannot be removed.'));
- }
-
- if (@rmdir($d) === false) {
- throw new Exception(__('Directory cannot be removed.'));
- }
- }
-
- /**
- * SortHandler
- *
- * This method is called by {@link getDir()} to sort files. Can be overrided
- * in inherited classes.
- *
- * @param fileItem $a fileItem object
- * @param fileItem $b fileItem object
- * @return integer
- */
- protected function sortHandler($a,$b)
- {
- if ($a->parent && !$b->parent || !$a->parent && $b->parent) {
- return ($a->parent) ? -1 : 1;
- }
- return strcasecmp($a->basename,$b->basename);
- }
-}
-
-/**
-* File item
-*
-* File item class used by {@link filemanager}. In this class {@link $file} could
-* be either a file or a directory.
-*
-* @package Clearbricks
-* @subpackage Filemanager
-*/
-class fileItem
-{
- /** @var string Complete path to file */
- public $file;
-
- /** @var string File basename */
- public $basename;
-
- /** @var string File directory name */
- public $dir;
-
- /** @var string File URL */
- public $file_url;
-
- /** @var string File directory URL */
- public $dir_url;
-
- /** @var string File extension */
- public $extension;
-
- /** @var string File path relative to $root given in constructor */
- public $relname;
-
- /** @var boolean Parent directory (ie. "..") */
- public $parent = false;
-
-
- /** @var string File MimeType. See {@link files::getMimeType()}. */
- public $type;
-
- /** @var integer File modification timestamp */
- public $mtime;
-
- /** @var integer File size */
- public $size;
-
- /** @var integer File permissions mode */
- public $mode;
-
- /** @var integer File owner ID */
- public $uid;
-
- /** @var integer File group ID */
- public $gid;
-
- /** @var boolean True if file or directory is writable */
- public $w;
-
- /** @var boolean True if file is a directory */
- public $d;
-
- /** @var boolean True if file file is executable or directory is traversable */
- public $x;
-
- /** @var boolean True if file is a file */
- public $f;
-
- /** @var boolean True if file or directory is deletable */
- public $del;
-
- /**
- * Constructor
- *
- * Creates an instance of fileItem object.
- *
- * @param string $file Absolute file or directory path
- * @param string $root File root path
- * @param string $root_url File root URL
- */
- public function __construct($file,$root,$root_url='')
- {
- $file = path::real($file);
- $stat = stat($file);
- $path = path::info($file);
-
- $rel = preg_replace('/^'.preg_quote($root,'/').'\/?/','',$file);
-
- $this->file = $file;
- $this->basename = $path['basename'];
- $this->dir = $path['dirname'];
- $this->relname = $rel;
-
- $this->file_url = str_replace('%2F','/',rawurlencode($rel));
- $this->file_url = $root_url.$this->file_url;
-
- $this->dir_url = dirname($this->file_url);
- $this->extension = $path['extension'];
-
- $this->mtime = $stat[9];
- $this->size = $stat[7];
- $this->mode = $stat[2];
- $this->uid = $stat[4];
- $this->gid = $stat[5];
- $this->w = is_writable($file);
- $this->d = is_dir($file);
- $this->f = is_file($file);
- $this->x = file_exists($file.'/.');
- $this->del = files::isDeletable($file);
-
- $this->type = $this->d ? null : files::getMimeType($file);
- $this->type_prefix = preg_replace('/^(.+?)\/.+$/','$1',$this->type);
- }
-}
-?>
\ No newline at end of file
diff --git a/inc/clearbricks/html.filter/class.html.filter.php b/inc/clearbricks/html.filter/class.html.filter.php
deleted file mode 100644
index ba22c4c..0000000
--- a/inc/clearbricks/html.filter/class.html.filter.php
+++ /dev/null
@@ -1,676 +0,0 @@
-parser = xml_parser_create('UTF-8');
- xml_set_object($this->parser,$this);
- xml_set_element_handler($this->parser, 'tag_open', 'tag_close');
- xml_set_character_data_handler($this->parser, 'cdata');
- xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, false);
-
- $this->removeTags(
- 'applet','base','basefont','body','center','dir','font',
- 'frame','frameset','head','html','isindex',
- 'link','menu','meta','noframes','script','style'
- );
-
- $this->removeAttributes(
- 'onclick','ondblclick','onfocus','onkeydown','onkeypress',
- 'onkeyup','onload','onmousedown','onmousemove','onmouseout',
- 'onmouseover','onmouseup','onreset','onselect','onsubmit',
- 'onunload'
- );
- }
-
- /**
- * Append tags
- *
- * Appends tags to remove. Each method argument is a tag. Example:
- *
- *
- * removeTags('frame','script');
- * ?>
- *
- */
- public function removeTags()
- {
- foreach ($this->argsArray(func_get_args()) as $tag) {
- $this->removed_tags[] = $tag;
- }
- }
-
- /**
- * Append attributes
- *
- * Appends attributes to remove. Each method argument is an attribute. Example:
- *
- *
- * removeAttributes('onclick','onunload');
- * ?>
- *
- */
- public function removeAttributes()
- {
- foreach ($this->argsArray(func_get_args()) as $a) {
- $this->removed_attrs[] = $a;
- }
- }
-
- /**
- * Append attributes for tags
- *
- * Appends attributes to remove from specific tags. Each method argument is
- * an array of tags with attributes. Example:
- *
- *
- * removeTagAttributes(array('a' => array('src','title')));
- * ?>
- *
- */
- public function removeTagAttributes($tag)
- {
- $args = $this->argsArray(func_get_args());
- array_shift($args);
-
- foreach ($args as $a) {
- $this->removed_tag_attrs[$tag][] = $a;
- }
- }
-
- /**
- * Known tags
- *
- * Creates a list of known tags.
- *
- * @param array $t Tags array
- */
- public function setTags($t)
- {
- if (is_array($t)) {
- $this->tags = $t;
- }
- }
-
- /**
- * Apply filter
- *
- * This method applies filter on given $str string. It will first
- * try to use tidy extension if exists and then apply the filter.
- *
- * @param string $str String to filter
- * @return string Filtered string
- */
- public function apply($str)
- {
- if (extension_loaded('tidy') && class_exists('tidy'))
- {
- $config = array(
- 'doctype' => 'strict',
- 'drop-proprietary-attributes' => true,
- 'drop-font-tags' => true,
- 'escape-cdata' => true,
- 'indent' => false,
- 'join-classes' => false,
- 'join-styles' => true,
- 'lower-literals' => true,
- 'output-xhtml' => true,
- 'show-body-only' => true,
- 'wrap' => 80
- );
-
- $str = 'tt
'.$str; // Fixes a big issue - - $tidy = new tidy; - $tidy->parseString($str, $config, 'utf8'); - $tidy->cleanRepair(); - - $str = (string) $tidy; - - $str = preg_replace('#^tt
\s?#','',$str); - } - else - { - $str = $this->miniTidy($str); - } - - # Removing open comments, open CDATA and processing instructions - $str = preg_replace('%%msu','',$str); - $str = str_replace(' - $fc = preg_replace('/(^\s*)?/ms','',$fc); - - # Compile blocks - foreach ($this->blocks as $b => $f) { - $pattern = sprintf($this->tag_block,preg_quote($b,'#')); - - $fc = preg_replace_callback('#'.$pattern.'#ms', - array($this,'compileBlock'),$fc); - } - - # Compile values - foreach ($this->values as $v => $f) { - $pattern = sprintf($this->tag_value,preg_quote($v,'#')); - - $fc = preg_replace_callback('#'.$pattern.'#ms', - array($this,'compileValue'),$fc); - } - - return $fc; - } - - protected function compileBlock($match) - { - $b = $match[1]; - $content = $match[3]; - $attr = $this->getAttrs($match[2]); - - # Call block function - return call_user_func($this->blocks[$b],$attr,$content); - } - - protected function compileValue($match) - { - $v = $match[1]; - $attr = isset($match[2]) ? $this->getAttrs($match[2]) : array(); - $str_attr = isset($match[2]) ? $match[2] : null; - - return call_user_func($this->values[$v],$attr,ltrim($str_attr)); - } - - protected function getAttrs($str) - { - $res = array(); - if (preg_match_all('|([a-zA-Z0-9_:-]+)="(.+?)"|ms',$str,$m) > 0) { - foreach ($m[1] as $i => $v) { - $res[$v] = $m[2][$i]; - } - } - return $res; - } -} -?> \ No newline at end of file diff --git a/inc/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php b/inc/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php deleted file mode 100644 index d0c4b96..0000000 --- a/inc/clearbricks/text.wiki2xhtml/class.wiki2xhtml.php +++ /dev/null @@ -1,1267 +0,0 @@ - Added ``inline html`` support -# -# 3.2.5 -# => Changed longdesc by title in images -# -# 3.2.4 -# => Auto links -# => Code cleanup -# -# 3.2.3 -# Olivier -# => PHP5 Strict -# -# 3.2.2 -# Olivier -# => Changement de la gestion des URL spéciales -# -# 3.2.1 -# Olivier -# => Changement syntaxe des macros -# -# 3.2 -# Olivier -# => Changement de fonctionnement des macros -# => Passage de fonctions externes pour les macros et les mots wiki -# -# 3.1d -# Jérôme Lipowicz -# => antispam -# Olivier -# => centrage d'image -# -# 3.1c -# Olivier -# => Possibilité d'échaper les | dans les marqueurs avec \ -# -# 3.1b -# Nicolas Chachereau -# => Changement de regexp pour la correction syntaxique -# -# 3.1a -# Olivier -# => Bug du Call-time pass-by-reference -# -# 3.1 -# Olivier -# => Ajout des macros «««..»»» -# => Ajout des blocs vides øøø -# => Ajout du niveau de titre paramétrable -# => Option de blocage du parseur dans les
-# => Titres au format setext (experimental, désactivé)
-#
-# 3.0
-# Olivier => Récriture du parseur inline, plus d'erreur XHTML
-# => Ajout d'une vérification d'intégrité pour les listes
-# => Les acronymes sont maintenant dans un fichier texte
-# => Ajout d'un tag images ((..)), del --..-- et ins ++..++
-# => Plus possible de faire des liens JS [lien|javascript:...]
-# => Ajout des notes de bas de page §§...§§
-# => Ajout des mots wiki
-#
-# 2.5
-# Olivier => Récriture du code, plus besoin du saut de ligne entre blocs !=
-#
-# 2.0
-# Stephanie => correction des PCRE et ajout de fonctionnalités
-# Mathieu => ajout du strip-tags, implementation des options, reconnaissance automatique d'url, etc.
-# Olivier => chagement de active_link en active_urls
-# => ajout des options pour les blocs
-# => intégration de l'aide dans le code, avec les options
-# => début de quelque chose pour la reconnaissance auto d'url (avec Mat)
-
-# TODO :
-# Mathieu => active_wiki_urls (modifier wikiParseUrl ?)
-# => active_auto_urls
-#
-# * => ajouter des options.
-# => trouver un meilleur nom pour active_link ? (pour le jour ou ca sera tellement une usine
-# a gaz que on generera des tags :)
-#
-
-# Wiki2xhtml
-
-class wiki2xhtml
-{
- public $__version__ = '3.2.6';
-
- public $T;
- public $opt;
- public $line;
- public $acro_table;
- public $foot_notes;
- public $macros;
- public $functions;
-
- public $tags;
- public $open_tags;
- public $close_tags;
- public $custom_tags = array();
- public $all_tags;
- public $tag_pattern;
- public $escape_table;
- public $allowed_inline = array();
-
- function __construct()
- {
- # Mise en place des options
- $this->setOpt('active_title',1); # Activation des titres !!!
- $this->setOpt('active_setext_title',0); # Activation des titres setext (EXPERIMENTAL)
- $this->setOpt('active_hr',1); # Activation des
- $this->setOpt('active_lists',1); # Activation des listes
- $this->setOpt('active_quote',1); # Activation du
- $this->setOpt('active_pre',1); # Activation du
- $this->setOpt('active_empty',1); # Activation du bloc vide øøø
- $this->setOpt('active_auto_urls',0); # Activation de la reconnaissance d'url
- $this->setOpt('active_auto_br',0); # Activation du saut de ligne automatique (dans les paragraphes)
- $this->setOpt('active_antispam',1); # Activation de l'antispam pour les emails
- $this->setOpt('active_urls',1); # Activation des liens []
- $this->setOpt('active_auto_img',1); # Activation des images automatiques dans les liens []
- $this->setOpt('active_img',1); # Activation des images (())
- $this->setOpt('active_anchor',1); # Activation des ancres ~...~
- $this->setOpt('active_em',1); # Activation du ''...''
- $this->setOpt('active_strong',1); # Activation du __...__
- $this->setOpt('active_br',1); # Activation du
%%%
- $this->setOpt('active_q',1); # Activation du {{...}}
- $this->setOpt('active_code',1); # Activation du @@...@@
- $this->setOpt('active_acronym',1); # Activation des acronymes
- $this->setOpt('active_ins',1); # Activation des ins ++..++
- $this->setOpt('active_del',1); # Activation des del --..--
- $this->setOpt('active_inline_html',1); # Activation du HTML inline ``...``
- $this->setOpt('active_footnotes',1); # Activation des notes de bas de page
- $this->setOpt('active_wikiwords',0); # Activation des mots wiki
- $this->setOpt('active_macros',1); # Activation des macros /// ///
-
- $this->setOpt('parse_pre',1); # Parser l'intérieur de blocs ?
-
- $this->setOpt('active_fr_syntax',1); # Corrections syntaxe FR
-
- $this->setOpt('first_title_level',3); # Premier niveau de titre
-
- $this->setOpt('note_prefix','wiki-footnote');
- $this->setOpt('note_str','Notes
%s');
- $this->setOpt('words_pattern',
- '((?setOpt('auto_url_pattern',
- '%(?setOpt('acronyms_file',dirname(__FILE__).'/acronyms.txt');
-
- $this->acro_table = $this->__getAcronyms();
- $this->foot_notes = array();
- $this->functions = array();
- $this->macros = array();
-
- $this->registerFunction('macro:html',array($this,'__macroHTML'));
- }
-
- function setOpt($option, $value)
- {
- $this->opt[$option] = $value;
- }
-
- function setOpts($options)
- {
- if (!is_array($options)) {
- return;
- }
-
- foreach ($options as $k => $v) {
- $this->opt[$k] = $v;
- }
- }
-
- function getOpt($option)
- {
- return (!empty($this->opt[$option])) ? $this->opt[$option] : false;
- }
-
- function registerFunction($type,$name)
- {
- if (is_callable($name)) {
- $this->functions[$type] = $name;
- }
- }
-
- function transform($in)
- {
- # Initialisation des tags
- $this->__initTags();
- $this->foot_notes = array();
-
- # Récupération des macros
- if ($this->getOpt('active_macros')) {
- $in = preg_replace('#^///(.*?)///($|\r)#mse',"\\\$this->__getMacro('\\1')",$in);
- }
-
- # Vérification du niveau de titre
- if ($this->getOpt('first_title_level') > 4) {
- $this->setOpt('first_title_level',4);
- }
-
- $res = str_replace("\r", '', $in);
-
- $escape_pattern = array();
-
- # traitement des titres à la setext
- if ($this->getOpt('active_setext_title') && $this->getOpt('active_title')) {
- $res = preg_replace('/^(.*)\n[=]{5,}$/m','!!!$1',$res);
- $res = preg_replace('/^(.*)\n[-]{5,}$/m','!!$1',$res);
- }
-
- # Transformation des mots Wiki
- if ($this->getOpt('active_wikiwords') && $this->getOpt('words_pattern')) {
- $res = preg_replace('/'.$this->getOpt('words_pattern').'/msu','¶¶¶$1¶¶¶',$res);
- }
-
- # Transformation des URLs automatiques
- if ($this->getOpt('active_auto_urls'))
- {
- $active_urls = $this->getOpt('active_urls');
-
- $this->setOpt('active_urls',1);
- $this->__initTags();
-
- # If urls are not active, escape URLs tags
- if (!$active_urls)
- {
- $res = preg_replace(
- '%(?tags['a'])).'])%msU',
- '\\\$1',$res
- );
- }
-
- # Transforms urls
- $res = preg_replace($this->getOpt('auto_url_pattern'),'[$1$2]',$res);
-
- }
-
- $this->T = explode("\n",$res);
- $this->T[] = '';
-
- # Parse les blocs
- $res = $this->__parseBlocks();
-
- # Line break
- if ($this->getOpt('active_br')) {
- $res = preg_replace('/(?', $res);
- $escape_pattern[] = '%%%';
- }
-
- # Nettoyage des \s en trop
- $res = preg_replace('/([\s]+)(<\/p>|<\/li>|<\/pre>)/', '$2', $res);
- $res = preg_replace('/(- )([\s]+)/', '$1', $res);
-
- # On vire les escapes
- if (!empty($escape_pattern)) {
- $res = preg_replace('/\\\('.implode('|',$escape_pattern).')/','$1',$res);
- }
-
- # On vire les ¶¶¶MotWiki¶¶¶ qui sont resté (dans les url...)
- if ($this->getOpt('active_wikiwords') && $this->getOpt('words_pattern')) {
- $res = preg_replace('/¶¶¶'.$this->getOpt('words_pattern').'¶¶¶/msu','$1',$res);
- }
-
- # On remet les macros
- if ($this->getOpt('active_macros')) {
- $res = preg_replace('/^##########MACRO#([0-9]+)#$/mse','\$this->__putMacro("$1")',$res);
- }
-
- # Auto line break dans les paragraphes
- if ($this->getOpt('active_auto_br')) {
- $res = preg_replace_callback('%(
)(.*?)(
)%msu',array($this,'__autoBR'),$res);
- }
-
- # On ajoute les notes
- if (count($this->foot_notes) > 0)
- {
- $res_notes = '';
- $i = 1;
- foreach ($this->foot_notes as $k => $v) {
- $res_notes .= "\n".'['.$i.'] '.$v.'
';
- $i++;
- }
- $res .= sprintf("\n".$this->getOpt('note_str')."\n",$res_notes);
- }
-
- return $res;
- }
-
- /* PRIVATE
- --------------------------------------------------- */
-
- function __initTags()
- {
- $tags = array(
- 'em' => array("''","''"),
- 'strong' => array('__','__'),
- 'acronym' => array('??','??'),
- 'a' => array('[',']'),
- 'img' => array('((','))'),
- 'q' => array('{{','}}'),
- 'code' => array('@@','@@'),
- 'anchor' => array('~','~'),
- 'del' => array('--','--'),
- 'ins' => array('++','++'),
- 'inline' => array('``','``'),
- 'note' => array('$$','$$'),
- 'word' => array('¶¶¶','¶¶¶')
- );
-
- $this->tags = array_merge($tags,$this->custom_tags);
-
- # Suppression des tags selon les options
- if (!$this->getOpt('active_urls')) {
- unset($this->tags['a']);
- }
- if (!$this->getOpt('active_img')) {
- unset($this->tags['img']);
- }
- if (!$this->getOpt('active_anchor')) {
- unset($this->tags['anchor']);
- }
- if (!$this->getOpt('active_em')) {
- unset($this->tags['em']);
- }
- if (!$this->getOpt('active_strong')) {
- unset($this->tags['strong']);
- }
- if (!$this->getOpt('active_q')) {
- unset($this->tags['q']);
- }
- if (!$this->getOpt('active_code')) {
- unset($this->tags['code']);
- }
- if (!$this->getOpt('active_acronym')) {
- unset($this->tags['acronym']);
- }
- if (!$this->getOpt('active_ins')) {
- unset($this->tags['ins']);
- }
- if (!$this->getOpt('active_del')) {
- unset($this->tags['del']);
- }
- if (!$this->getOpt('active_inline_html')) {
- unset($this->tags['inline']);
- }
- if (!$this->getOpt('active_footnotes')) {
- unset($this->tags['note']);
- }
- if (!$this->getOpt('active_wikiwords')) {
- unset($this->tags['word']);
- }
-
- $this->open_tags = $this->__getTags();
- $this->close_tags = $this->__getTags(false);
- $this->all_tags = $this->__getAllTags();
- $this->tag_pattern = $this->__getTagsPattern();
-
- $this->escape_table = $this->all_tags;
- array_walk($this->escape_table,create_function('&$a','$a = \'\\\\\'.$a;'));
- }
-
- function __getTags($open=true)
- {
- $res = array();
- foreach ($this->tags as $k => $v) {
- $res[$k] = ($open) ? $v[0] : $v[1];
- }
- return $res;
- }
-
- function __getAllTags()
- {
- $res = array();
- foreach ($this->tags as $v) {
- $res[] = $v[0];
- $res[] = $v[1];
- }
- return array_values(array_unique($res));
- }
-
- function __getTagsPattern($escape=false)
- {
- $res = $this->all_tags;
- array_walk($res,create_function('&$a','$a = preg_quote($a,"/");'));
-
- if (!$escape) {
- return '/(?T);
-
- for ($i=0; $i<$max; $i++)
- {
- $pre_mode = $mode;
- $pre_type = $type;
- $end = ($i+1 == $max);
-
- $line = $this->__getLine($i,$type,$mode);
-
- if ($type != 'pre' || $this->getOpt('parse_pre')) {
- $line = $this->__inlineWalk($line);
- }
-
- $res .= $this->__closeLine($type,$mode,$pre_type,$pre_mode);
- $res .= $this->__openLine($type,$mode,$pre_type,$pre_mode);
-
- # P dans les blockquotes
- if ($type == 'blockquote' && trim($line) == '' && $pre_type == $type) {
- $res .= "\n";
- }
-
- # Correction de la syntaxe FR dans tous sauf pre et hr
- # Sur idée de Christophe Bonijol
- # Changement de regex (Nicolas Chachereau)
- if ($this->getOpt('active_fr_syntax') && $type != null && $type != 'pre' && $type != 'hr') {
- $line = preg_replace('%[ ]+([:?!;\x{00BB}](\s|$))%u',' $1',$line);
- $line = preg_replace('%(\x{00AB})[ ]+%u','$1 ',$line);
- }
-
- $res .= $line;
- }
-
- return trim($res);
- }
-
- function __getLine($i,&$type,&$mode)
- {
- $pre_type = $type;
- $pre_mode = $mode;
- $type = $mode = null;
-
- if (empty($this->T[$i])) {
- return false;
- }
-
- $line = htmlspecialchars($this->T[$i],ENT_NOQUOTES);
-
- # Ligne vide
- if (empty($line))
- {
- $type = null;
- }
- elseif ($this->getOpt('active_empty') && preg_match('/^øøø(.*)$/',$line,$cap))
- {
- $type = null;
- $line = trim($cap[1]);
- }
- # Titre
- elseif ($this->getOpt('active_title') && preg_match('/^([!]{1,4})(.*)$/',$line,$cap))
- {
- $type = 'title';
- $mode = strlen($cap[1]);
- $line = trim($cap[2]);
- }
- # Ligne HR
- elseif ($this->getOpt('active_hr') && preg_match('/^[-]{4}[- ]*$/',$line))
- {
- $type = 'hr';
- $line = null;
- }
- # Blockquote
- elseif ($this->getOpt('active_quote') && preg_match('/^(>|;:)(.*)$/',$line,$cap))
- {
- $type = 'blockquote';
- $line = trim($cap[2]);
- }
- # Liste
- elseif ($this->getOpt('active_lists') && preg_match('/^([*#]+)(.*)$/',$line,$cap))
- {
- $type = 'list';
- $mode = $cap[1];
- $valid = true;
-
- # Vérification d'intégrité
- $dl = ($type != $pre_type) ? 0 : strlen($pre_mode);
- $d = strlen($mode);
- $delta = $d-$dl;
-
- if ($delta < 0 && strpos($pre_mode,$mode) !== 0) {
- $valid = false;
- }
- if ($delta > 0 && $type == $pre_type && strpos($mode,$pre_mode) !== 0) {
- $valid = false;
- }
- if ($delta == 0 && $mode != $pre_mode) {
- $valid = false;
- }
- if ($delta > 1) {
- $valid = false;
- }
-
- if (!$valid) {
- $type = 'p';
- $mode = null;
- $line = '
'.$line;
- } else {
- $line = trim($cap[2]);
- }
- }
- # Préformaté
- elseif ($this->getOpt('active_pre') && preg_match('/^[ ]{1}(.*)$/',$line,$cap))
- {
- $type = 'pre';
- $line = $cap[1];
- }
- # Paragraphe
- else {
- $type = 'p';
- $line = trim($line);
- }
-
- return $line;
- }
-
- function __openLine($type,$mode,$pre_type,$pre_mode)
- {
- $open = ($type != $pre_type);
-
- if ($open && $type == 'p')
- {
- return "\n
";
- }
- elseif ($open && $type == 'blockquote')
- {
- return "\n
";
- }
- elseif (($open || $mode != $pre_mode) && $type == 'title')
- {
- $fl = $this->getOpt('first_title_level');
- $fl = $fl+3;
- $l = $fl-$mode;
- return "\n';
- }
- elseif ($open && $type == 'pre')
- {
- return "\n";
- }
- elseif ($open && $type == 'hr')
- {
- return "\n
";
- }
- elseif ($type == 'list')
- {
- $dl = ($open) ? 0 : strlen($pre_mode);
- $d = strlen($mode);
- $delta = $d-$dl;
- $res = '';
-
- if($delta > 0) {
- if(substr($mode, -1, 1) == '*') {
- $res .= "\n";
- } else {
- $res .= "\n";
- }
- } elseif ($delta < 0) {
- $res .= "
\n";
- for($j = 0; $j < abs($delta); $j++) {
- if (substr($pre_mode,(0 - $j - 1), 1) == '*') {
- $res .= "\n\n";
- } else {
- $res .= "\n\n";
- }
- }
- } else {
- $res .= "\n";
- }
-
- return $res."- ";
- }
- else
- {
- return null;
- }
- }
-
- function __closeLine($type,$mode,$pre_type,$pre_mode)
- {
- $close = ($type != $pre_type);
-
- if ($close && $pre_type == 'p')
- {
- return "\n";
- }
- elseif ($close && $pre_type == 'blockquote')
- {
- return "
\n";
- }
- elseif (($close || $mode != $pre_mode) && $pre_type == 'title')
- {
- $fl = $this->getOpt('first_title_level');
- $fl = $fl+3;
- $l = $fl-$pre_mode;
- return '\n";
- }
- elseif ($close && $pre_type == 'pre')
- {
- return "\n";
- }
- elseif ($close && $pre_type == 'list')
- {
- $res = '';
- for($j = 0; $j < strlen($pre_mode); $j++) {
- if(substr($pre_mode,(0 - $j - 1), 1) == '*') {
- $res .= "\n";
- } else {
- $res .= "\n";
- }
- }
- return $res;
- }
- else
- {
- return "\n";
- }
- }
-
-
- /* Inline
- --------------------------------------------------- */
- function __inlineWalk($str,$allow_only=null)
- {
- $tree = preg_split($this->tag_pattern,$str,-1,PREG_SPLIT_DELIM_CAPTURE);
-
- $res = '';
- for ($i=0; $i- return ''.htmlspecialchars($this->macros[$id]).''; - } - - return null; - } - - function __macroHTML($s) - { - return $s; - } - - /* Aide et debug - --------------------------------------------------- */ - function help() - { - $help['b'] = array(); - $help['i'] = array(); - - $help['b'][] = 'Laisser une ligne vide entre chaque bloc de même nature.'; - $help['b'][] = 'Paragraphe : du texte et une ligne vide'; - - if ($this->getOpt('active_title')) { - $help['b'][] = 'Titre :!!!,!!, '. - '!pour des titres plus ou moins importants'; - } - - if ($this->getOpt('active_hr')) { - $help['b'][] = 'Trait horizontal :----'; - } - - if ($this->getOpt('active_lists')) { - $help['b'][] = 'Liste : ligne débutant par*ou '. - '#. Il est possible de mélanger les listes '. - '(*#*) pour faire des listes de plusieurs niveaux. '. - 'Respecter le style de chaque niveau'; - } - - if ($this->getOpt('active_pre')) { - $help['b'][] = 'Texte préformaté : espace devant chaque ligne de texte'; - } - - if ($this->getOpt('active_quote')) { - $help['b'][] = 'Bloc de citation :>ou '. - ';:devant chaque ligne de texte'; - } - - if ($this->getOpt('active_fr_syntax')) { - $help['i'][] = 'La correction de ponctuation est active. Un espace '. - 'insécable remplacera automatiquement tout espace '. - 'précédant les marques ";","?",":" et "!".'; - } - - if ($this->getOpt('active_em')) { - $help['i'][] = 'Emphase : deux apostrophes\'\'texte\'\''; - } - - if ($this->getOpt('active_strong')) { - $help['i'][] = 'Forte emphase : deux soulignés__texte__'; - } - - if ($this->getOpt('active_br')) { - $help['i'][] = 'Retour forcé à la ligne :%%%'; - } - - if ($this->getOpt('active_ins')) { - $help['i'][] = 'Insertion : deux plus++texte++'; - } - - if ($this->getOpt('active_del')) { - $help['i'][] = 'Suppression : deux moins--texte--'; - } - - if ($this->getOpt('active_urls')) { - $help['i'][] = 'Lien :[url],[nom|url], '. - '[nom|url|langue]ou[nom|url|langue|titre].'; - - $help['i'][] = 'Image : comme un lien mais avec une extension d\'image.'. - '
Pour désactiver la reconnaissance d\'image mettez 0 dans un dernier '. - 'argument. Par exemple[image|image.gif||0]fera un lien vers l\'image au '. - 'lieu de l\'afficher.'. - '
Il est conseillé d\'utiliser la nouvelle syntaxe.'; - } - - if ($this->getOpt('active_img')) { - $help['i'][] = 'Image (nouvelle syntaxe) : '. - '((url|texte alternatif)), '. - '((url|texte alternatif|position))ou '. - '((url|texte alternatif|position|description longue)). '. - '
La position peut prendre les valeur L ou G (gauche), R ou D (droite) ou C (centré).'; - } - - if ($this->getOpt('active_anchor')) { - $help['i'][] = 'Ancre :~ancre~'; - } - - if ($this->getOpt('active_acronym')) { - $help['i'][] = 'Acronyme :??acronyme??ou '. - '??acronyme|titre??'; - } - - if ($this->getOpt('active_q')) { - $help['i'][] = 'Citation :{{citation}}, '. - '{{citation|langue}}ou{{citation|langue|url}}'; - } - - if ($this->getOpt('active_code')) { - $help['i'][] = 'Code :@@code ici@@'; - } - - if ($this->getOpt('active_footnotes')) { - $help['i'][] = 'Note de bas de page :$$Corps de la note$$'; - } - - $res = '
| p-mode | p-type | mode | type | chaine |
|---|---|---|---|---|
| '.$pre_mode.' | '.$pre_type.' | '. - ''.$mode.' | '.$type.' | '.$line.' |
(.*?)
|msU',$rs->comment_content, - $match)) { - return html::decodeEntities($match[1]); - } - } - - /** - Returns trackback content if comment is a trackback. - - @param rs Invisible parameter - @return string - */ - public static function getTrackbackContent(&$rs) - { - if ($rs->comment_trackback == 1) { - return preg_replace('|.*?
|msU','', - $rs->comment_content); - } - } - - /** - Returns comment feed unique ID. - - @param rs Invisible parameter - @return string - */ - public static function getFeedID(&$rs) - { - return 'urn:md5:'.md5($rs->core->blog->uid.$rs->comment_id); - - $url = parse_url($rs->core->blog->url); - $date_part = date('Y-m-d',strtotime($rs->comment_dt)); - - return 'tag:'.$url['host'].','.$date_part.':'.$rs->comment_id; - } - - /** - Returns whether comment is from the post author. - - @param rs Invisible parameter - @return boolean - */ - public static function isMe(&$rs) - { - return - $rs->comment_email && $rs->comment_site && - $rs->comment_email == $rs->user_email && - $rs->comment_site == $rs->user_url; - } + /** + * Returns comment date with $format as formatting pattern. If + * format is empty, uses date_format blog setting. + * + * @param MetaRecord $rs Invisible parameter + * @param string $format The date format pattern + * @param string $type The type, (dt|upddt) defaults to comment_dt + * + * @return string The date. + */ + public static function getDate(MetaRecord $rs, ?string $format, string $type = ''): string + { + if (!$format) { + $format = dcCore::app()->blog->settings->system->date_format; + } + + if ($type === 'upddt') { + return Date::dt2str($format, (string) $rs->comment_upddt, (string) $rs->comment_tz); + } + + return Date::dt2str($format, (string) $rs->comment_dt); + } + + /** + * Returns comment time with $format as formatting pattern. If + * format is empty, uses time_format blog setting. + * + * @param MetaRecord $rs Invisible parameter + * @param string $format The date format pattern + * @param string $type The type, (dt|upddt) defaults to comment_dt + * + * @return string The time. + */ + public static function getTime(MetaRecord $rs, ?string $format, string $type = ''): string + { + if (!$format) { + $format = dcCore::app()->blog->settings->system->time_format; + } + + if ($type === 'upddt') { + return Date::dt2str($format, (string) $rs->comment_updt, (string) $rs->comment_tz); + } + + return Date::dt2str($format, (string) $rs->comment_dt); + } + + /** + * Returns comment timestamp. + * + * @param MetaRecord $rs Invisible parameter + * @param string $type The type, (dt|upddt) defaults to comment_dt + * + * @return integer The timestamp. + */ + public static function getTS(MetaRecord $rs, string $type = ''): int + { + if ($type === 'upddt') { + return strtotime((string) $rs->comment_upddt); + } + + return strtotime((string) $rs->comment_dt); + } + + /** + * Returns comment date formating according to the ISO 8601 standard. + * + * @param MetaRecord $rs Invisible parameter + * @param string $type The type, (dt|upddt) defaults to comment_dt + * + * @return string The iso 8601 date. + */ + public static function getISO8601Date(MetaRecord $rs, string $type = ''): string + { + if ($type === 'upddt') { + return Date::iso8601($rs->getTS($type) + Date::getTimeOffset((string) $rs->comment_tz), (string) $rs->comment_tz); + } + + return Date::iso8601($rs->getTS(), (string) $rs->comment_tz); + } + + /** + * Returns comment date formating according to RFC 822. + * + * @param MetaRecord $rs Invisible parameter + * @param string $type The type, (dt|upddt) defaults to comment_dt + * + * @return string The rfc 822 date. + */ + public static function getRFC822Date(MetaRecord $rs, string $type = ''): string + { + if ($type === 'upddt') { + return Date::rfc822($rs->getTS($type) + Date::getTimeOffset((string) $rs->comment_tz), (string) $rs->comment_tz); + } + + return Date::rfc822($rs->getTS(), (string) $rs->comment_tz); + } + + /** + * Returns comment content. If $absolute_urls is true, appends full + * blog URL to each relative post URLs. + * + * @param MetaRecord $rs Invisible parameter + * @param bool|int $absolute_urls With absolute URLs + * + * @return string The content. + */ + public static function getContent(MetaRecord $rs, $absolute_urls = false): string + { + $res = (string) $rs->comment_content; + + if (dcCore::app()->blog->settings->system->comments_nofollow) { + $res = preg_replace_callback( + '##ms', + function ($m) { + if (preg_match('/rel="ugc nofollow"/', $m[1])) { + return $m[0]; + } + + return ''; + }, + $res + ); + } else { + $res = preg_replace_callback( + '##ms', + function ($m) { + if (preg_match('/rel="ugc"/', $m[1])) { + return $m[0]; + } + + return ''; + }, + $res + ); + } + + if ($absolute_urls) { + $res = Html::absoluteURLs($res, $rs->getPostURL()); + } + + return $res; + } + + /** + * Returns comment author link to his website if he specified one. + * + * @param MetaRecord $rs Invisible parameter + * + * @return mixed The author url. + */ + public static function getAuthorURL(MetaRecord $rs) + { + if (trim((string) $rs->comment_site)) { + return trim((string) $rs->comment_site); + } + } + + /** + * Returns comment post full URL. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string The comment post url. + */ + public static function getPostURL(MetaRecord $rs): string + { + return dcCore::app()->blog->url . dcCore::app()->getPostPublicURL( + $rs->post_type, + Html::sanitizeURL($rs->post_url) + ); + } + + /** + * Returns comment author name in a link to his website if he specified one. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string The author link. + */ + public static function getAuthorLink(MetaRecord $rs): string + { + $res = '%1$s'; + $url = $rs->getAuthorURL(); + if ($url) { + $res = '%1$s'; + } + + $rel = 'ugc'; + if (dcCore::app()->blog->settings->system->comments_nofollow) { + $rel .= ' nofollow'; + } + + return sprintf($res, Html::escapeHTML($rs->comment_author), Html::escapeHTML($url), $rel); + } + + /** + * Returns comment author e-mail address. If $encoded is true, + * "@" sign is replaced by "%40" and "." by "%2e". + * + * @param MetaRecord $rs Invisible parameter + * @param bool $encoded Encode address + * + * @return string The email. + */ + public static function getEmail(MetaRecord $rs, bool $encoded = true): string + { + return $encoded ? strtr((string) $rs->comment_email, ['@' => '%40', '.' => '%2e']) : $rs->comment_email; + } + + /** + * Returns trackback site title if comment is a trackback. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string The trackback title. + */ + public static function getTrackbackTitle(MetaRecord $rs): string + { + if ($rs->comment_trackback == 1 && preg_match( + '|(.*?)
|msU', + (string) $rs->comment_content, + $match + )) { + return Html::decodeEntities($match[1]); + } + + return ''; + } + + /** + * Returns trackback content if comment is a trackback. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string The trackback content. + */ + public static function getTrackbackContent(MetaRecord $rs): string + { + if ($rs->comment_trackback == 1) { + return preg_replace( + '|.*?
|msU', + '', + (string) $rs->comment_content + ); + } + + return ''; + } + + /** + * Returns comment feed unique ID. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string The feed id. + */ + public static function getFeedID(MetaRecord $rs): string + { + return 'urn:md5:' . md5(dcCore::app()->blog->uid . $rs->comment_id); + } + + /** + * Determines whether the specified comment is from the post author. + * + * @param MetaRecord $rs Invisible parameter + * + * @return bool True if the specified comment is from the post author, False otherwise. + */ + public static function isMe(MetaRecord $rs): bool + { + $user_prefs = new dcPrefs((string) $rs->user_id, 'profile'); + $user_profile_mails = $user_prefs->profile->mails ? + array_map('trim', explode(',', $user_prefs->profile->mails)) : + []; + $user_profile_urls = $user_prefs->profile->urls ? + array_map('trim', explode(',', $user_prefs->profile->urls)) : + []; + + return + ($rs->comment_email && $rs->comment_site) && ($rs->comment_email == $rs->user_email || in_array($rs->comment_email, $user_profile_mails)) && ($rs->comment_site == $rs->user_url || in_array($rs->comment_site, $user_profile_urls)); + } } /** @ingroup DC_CORE -@brief Dotclear dates record helpers. +@brief Dotclear dates Record helpers. This class adds new methods to database dates results. You can call them on every record comming from dcBlog::getDates. @warning You should not give the first argument (usualy $rs) of every described function. -*/ + */ class rsExtDates { - /** - @param rs Invisible parameter - @return integer Date timestamp - */ - public static function ts(&$rs) - { - return strtotime($rs->dt); - } - - /** - @param rs Invisible parameter - @return string Date year - */ - public static function year(&$rs) - { - return date('Y',strtotime($rs->dt)); - } - - /** - @param rs Invisible parameter - @return string Date month - */ - public static function month(&$rs) - { - return date('m',strtotime($rs->dt)); - } - - /** - @param rs Invisible parameter - @return integer Date day - */ - public static function day(&$rs) - { - return date('d',strtotime($rs->dt)); - } - - /** - Returns date month archive full URL. - - @param rs Invisible parameter - @param core dcCore dcCore instance - @return integer - */ - public static function url(&$rs,&$core) - { - $url = date('Y/m',strtotime($rs->dt)); - - return $core->blog->url.$core->url->getBase('archive').'/'.$url; - } - - /** - Returns whether date is the first of year. - - @param rs Invisible parameter - @return boolean - */ - public static function yearHeader(&$rs) - { - if ($rs->isStart()) { - return true; - } - - $y = $rs->year(); - $rs->movePrev(); - $py = $rs->year(); - $rs->moveNext(); - - return $y != $py; - } - - /** - Returns whether date is the last of year. - - @param rs Invisible parameter - @return boolean - */ - public static function yearFooter(&$rs) - { - if ($rs->isEnd()) { - return true; - } - - $y = $rs->year(); - if ($rs->moveNext()) { - $ny = $rs->year(); - $rs->movePrev(); - return $y != $ny; - } - return false; - - } + /** + * Convert date to timestamp + * + * @param MetaRecord $rs Invisible parameter + * + * @return integer + */ + public static function ts(MetaRecord $rs): int + { + return strtotime((string) $rs->dt); + } + + /** + * Get date year + * + * @param MetaRecord $rs Invisible parameter + * + * @return string + */ + public static function year(MetaRecord $rs): string + { + return date('Y', strtotime((string) $rs->dt)); + } + + /** + * Get date month + * + * @param MetaRecord $rs Invisible parameter + * + * @return string + */ + public static function month(MetaRecord $rs): string + { + return date('m', strtotime((string) $rs->dt)); + } + + /** + * Get date day + * + * @param MetaRecord $rs Invisible parameter + * + * @return string + */ + public static function day(MetaRecord $rs): string + { + return date('d', strtotime((string) $rs->dt)); + } + + /** + * Returns date month archive full URL. + * + * @param MetaRecord $rs Invisible parameter + * + * @return string + */ + public static function url(MetaRecord $rs): string + { + $url = date('Y/m', strtotime((string) $rs->dt)); + + return dcCore::app()->blog->url . dcCore::app()->url->getURLFor('archive', $url); + } + + /** + * Returns whether date is the first of year. + * + * @param MetaRecord $rs Invisible parameter + * + * @return bool + */ + public static function yearHeader(MetaRecord $rs): bool + { + if ($rs->isStart()) { + return true; + } + + $y = $rs->year(); + $rs->movePrev(); + $py = $rs->year(); + $rs->moveNext(); + + return $y != $py; + } + + /** + * Returns whether date is the last of year. + * + * @param MetaRecord $rs Invisible parameter + * + * @return bool + */ + public static function yearFooter(MetaRecord $rs): bool + { + if ($rs->isEnd()) { + return true; + } + + $y = $rs->year(); + if ($rs->moveNext()) { + $ny = $rs->year(); + $rs->movePrev(); + + return $y != $ny; + } + + return false; + } } /** @ingroup DC_CORE -@brief Dotclear dates record helpers. +@brief Dotclear dates Record helpers. This class adds new methods to database dates results. You can call them on every record comming from dcAuth::checkUser and @@ -777,39 +944,71 @@ dcCore::getUsers. @warning You should not give the first argument (usualy $rs) of every described function. -*/ + */ class rsExtUser { - /** - Returns a user option. - - @param rs Invisible parameter - @param name string Option name - @return string - */ - public static function option(&$rs,$name) - { - $options = self::options($rs); - - if (isset($options[$name])) { - return $options[$name]; - } - return null; - } - - /** - Returns all user options. - - @param rs Invisible parameter - @return array - */ - public static function options(&$rs) - { - $options = @unserialize($rs->user_options); - if (is_array($options)) { - return $options; - } - return array(); - } + /** + * Returns a user option. + * + * @param MetaRecord $rs Invisible parameter + * @param string $name The name of option + * + * @return mixed + */ + public static function option(MetaRecord $rs, string $name) + { + $options = self::options($rs); + + if (isset($options[$name])) { + return $options[$name]; + } + } + + /** + * Returns all user options. + * + * @param MetaRecord $rs Invisible parameter + * + * @return array + */ + public static function options(MetaRecord $rs): array + { + $options = @unserialize((string) $rs->user_options); + if (is_array($options)) { + return $options; + } + + return []; + } + + /** + * Converts this Record to a {@link StaticRecord} instance. + * + * @param MetaRecord $rs Invisible parameter + * + * @return MetaRecord The extent static record. + */ + public static function toExtStatic(MetaRecord $rs): MetaRecord + { + $rs->toExtStatic(); + + return $rs; + } +} + +class rsExtBlog +{ + /** + * Converts this Record to a {@link StaticRecord} instance. + * + * @param MetaRecord $rs Invisible parameter + * + * @return MetaRecord The extent static record. + */ + public static function toExtStatic(MetaRecord $rs): MetaRecord + { + $rs->toExtStatic(); + + return $rs; + } } -?> \ No newline at end of file diff --git a/inc/core/class.dc.settings.php b/inc/core/class.dc.settings.php index 19f832b..76bd3f0 100644 --- a/inc/core/class.dc.settings.php +++ b/inc/core/class.dc.settings.php @@ -1,330 +1,236 @@ connection Database connection object - protected $table; ///< string Permission table name - protected $blog_id; ///< string Blog ID - - protected $settings = array(); ///< array Associative settings array - protected $global_settings = array(); ///< array Global settings array - protected $local_settings = array(); ///< array Local settings array - - protected $ns; ///< string Current namespace - - /** - Object constructor. Retrieves blog settings and puts them in $settings - array. Local (blog) settings have a highest priority than global settings. - - @param core dcCore dcCore object - @param blog_id string Blog ID - */ - public function __construct(&$core,$blog_id) - { - $this->con =& $core->con; - $this->table = $core->prefix.'setting'; - $this->blog_id =& $blog_id; - - $this->getSettings(); - } - - private function getSettings() - { - $strReq = 'SELECT blog_id, setting_id, setting_ns, setting_value, '. - 'setting_type, setting_label '. - 'FROM '.$this->table.' '. - "WHERE blog_id = '".$this->con->escape($this->blog_id)."' ". - 'OR blog_id IS NULL '. - 'ORDER BY setting_ns, setting_id DESC '; - - try { - $rs = $this->con->select($strReq); - } catch (Exception $e) { - trigger_error(__('Unable to retrieve settings:').' '.$this->con->error(), E_USER_ERROR); - } - - while ($rs->fetch()) - { - $id = trim($rs->f('setting_id')); - $value = $rs->f('setting_value'); - $type = $rs->f('setting_type'); - - if ($type == 'float' || $type == 'double') { - $type = 'float'; - } elseif ($type != 'boolean' && $type != 'integer') { - $type = 'string'; - } - - settype($value,$type); - - $array = $rs->blog_id ? 'local' : 'global'; - - $this->{$array.'_settings'}[$id] = array( - 'ns' => $rs->f('setting_ns'), - 'value' => $value, - 'type' => $type, - 'label' => (string) $rs->f('setting_label'), - 'global' => $rs->blog_id == '' - ); - } - - $this->settings = $this->global_settings; - - foreach ($this->local_settings as $id => $v) { - $this->settings[$id] = $v; - } - - return true; - } - - private function settingExists($id,$global=false) - { - $array = $global ? 'global' : 'local'; - return isset($this->{$array.'_settings'}[$id]); - } - - /** - Sets a working namespace. You should do this before adding any setting. - - @param ns string Namespace name - */ - public function setNamespace($ns) - { - if (preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/',$ns)) { - $this->ns = $ns; - } else { - throw new Exception(sprintf(__('Invalid setting namespace: %s'),$ns)); - } - } - - /** - Creates or updates a setting. - - $type could be 'string', 'integer', 'float', 'boolean' or null. If $type is - null and setting exists, it will keep current setting type. - - $value_change allow you to not change setting. Useful if you need to change - a setting label or type and don't want to change its value. - - Don't forget to set namespace before calling this method. - - @param id string Setting ID - @param value mixed Setting value - @param type string Setting type - @param label string Setting label - @param value_change boolean Change setting value or not - @param global boolean Setting is global - */ - public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false) - { - if (!$this->ns) { - throw new Exception(__('No namespace specified')); - } - - if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]+$/',$id)) { - throw new Exception(sprintf(__('%s is not a valid setting id'),$id)); - } - - # We don't want to change setting value - if (!$value_change) - { - if (!$global && $this->settingExists($id,false)) { - $value = $this->local_settings[$id]['value']; - } elseif ($this->settingExists($id,true)) { - $value = $this->global_settings[$id]['value']; - } - } - - # Setting type - if ($type == 'double') - { - $type = 'float'; - } - elseif ($type === null) - { - if (!$global && $this->settingExists($id,false)) { - $type = $this->local_settings[$id]['type']; - } elseif ($this->settingExists($id,true)) { - $type = $this->global_settings[$id]['type']; - } else { - $type = 'string'; - } - } - elseif ($type != 'boolean' && $type != 'integer' && $type != 'float') - { - $type = 'string'; - } - - # We don't change label - if ($label == null) - { - if (!$global && $this->settingExists($id,false)) { - $label = $this->local_settings[$id]['label']; - } elseif ($this->settingExists($id,true)) { - $label = $this->global_settings[$id]['label']; - } - } - - settype($value,$type); - - $cur = $this->con->openCursor($this->table); - $cur->setting_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value; - $cur->setting_type = $type; - $cur->setting_label = $label; - - #If we are local, compare to global value - if (!$global && $this->settingExists($id,true)) - { - $g = $this->global_settings[$id]; - $same_setting = $g['ns'] == $this->ns && $g['value'] == $value - && $g['type'] == $type && $g['label'] == $label; - - # Drop setting if same value as global - if ($same_setting && $this->settingExists($id,false)) { - $this->drop($id); - } elseif ($same_setting) { - return; - } - } - - if ($this->settingExists($id,$global) && $this->ns == $this->settings[$id]['ns']) - { - if ($global) { - $where = 'WHERE blog_id IS NULL '; - } else { - $where = "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; - } - - $cur->update($where."AND setting_id = '".$this->con->escape($id)."' "); - } - else - { - $cur->setting_id = $id; - $cur->blog_id = $global ? null : $this->blog_id; - $cur->setting_ns = $this->ns; - - $cur->insert(); - } - } - - /** - Removes an existing setting. Namespace - - @param id string Setting ID - */ - public function drop($id) - { - $strReq = 'DELETE FROM '.$this->table.' '; - - if ($this->blog_id === null) { - $strReq .= 'WHERE blog_id IS NULL '; - } else { - $strReq .= "WHERE blog_id = '".$this->con->escape($this->blog_id)."' "; - } - - $strReq .= "AND setting_id = '".$this->con->escape($id)."' "; - - $this->con->execute($strReq); - } - - /** - Returns setting value if exists. - - @param n string Setting name - @return mixed - */ - public function get($n) - { - if (isset($this->settings[$n]['value'])) { - return $this->settings[$n]['value']; - } - - return null; - } - - /** - Magic __get method. - @copydoc ::get - */ - public function __get($n) - { - return $this->get($n); - } - - /** - Sets a setting in $settings property. This sets the setting for script - execution time only and if setting exists. - - @param n string Setting name - @param v mixed Setting value - */ - public function set($n,$v) - { - if (isset($this->settings[$n])) { - $this->settings[$n]['value'] = $v; - } else { - $this->settings[$n] = array( - 'ns' => $this->ns, - 'value' => $v, - 'type' => gettype($n), - 'label' => '', - 'global' => false - ); - } - } - - /** - Magic __set method. - @copydoc ::set - */ - public function __set($n,$v) - { - $this->set($n,$v); - } - - /** - Returns $settings property content. - - @return array - */ - public function dumpSettings() - { - return $this->settings; - } - - /** - Returns $global_settings property content. - - @return array - */ - public function dumpGlobalSettings() - { - return $this->global_settings; - } - - /** - @pre - toto - @endpre - */ + // Properties + + /** + * Database connection object + * + * @var object + */ + protected $con; + + /** + * Settings table name + * + * @var string + */ + protected $table; + + /** + * Blog ID + * + * @var string + */ + protected $blog_id; + + /** + * Associative namespaces array + * + * @var array + */ + protected $namespaces = []; + + /** + * Object constructor. Retrieves blog settings and puts them in $namespaces + * array. Local (blog) settings have a highest priority than global settings. + * + * @param mixed $blog_id The blog identifier + */ + public function __construct($blog_id) + { + $this->con = dcCore::app()->con; + $this->table = dcCore::app()->prefix . dcNamespace::NS_TABLE_NAME; + $this->blog_id = $blog_id; + $this->loadSettings(); + } + + /** + Retrieves all namespaces (and their settings) from database, with one query. + */ + private function loadSettings(): void + { + $sql = new SelectStatement(); + $sql + ->columns([ + 'blog_id', + 'setting_id', + 'setting_value', + 'setting_type', + 'setting_label', + 'setting_ns', + ]) + ->from($this->table) + ->where('blog_id = ' . $sql->quote((string) $this->blog_id)) + ->or('blog_id IS NULL') + ->order([ + 'setting_ns ASC', + 'setting_id DESC', + ]); + + try { + $rs = $sql->select(); + } catch (Exception $e) { + trigger_error(__('Unable to retrieve namespaces:') . ' ' . $this->con->error(), E_USER_ERROR); + } + + /* Prevent empty tables (install phase, for instance) */ + if ($rs->isEmpty()) { + return; + } + + do { + $ns = trim((string) $rs->f('setting_ns')); + if (!$rs->isStart()) { + // we have to go up 1 step, since namespaces construction performs a fetch() + // at very first time + $rs->movePrev(); + } + $this->namespaces[$ns] = new dcNamespace($this->blog_id, $ns, $rs); + } while (!$rs->isStart()); + } + + /** + * Create a new namespace. If the namespace already exists, return it without modification. + * + * @param string $namespace Namespace name + * + * @return dcNamespace + */ + public function addNamespace(string $namespace): dcNamespace + { + if (!$this->exists($namespace)) { + $this->namespaces[$namespace] = new dcNamespace($this->blog_id, $namespace); + } + + return $this->namespaces[$namespace]; + } + + /** + * Rename a namespace. + * + * @param string $old_namespace The old ns + * @param string $new_namespace The new ns + * + * @throws Exception + * + * @return bool return true if no error, else false + */ + public function renNamespace(string $old_namespace, string $new_namespace): bool + { + if (!$this->exists($old_namespace) || $this->exists($new_namespace)) { + return false; + } + + if (!preg_match(dcNamespace::NS_NAME_SCHEMA, $new_namespace)) { + throw new Exception(sprintf(__('Invalid setting namespace: %s'), $new_namespace)); + } + + // Rename the namespace in the database + $sql = new UpdateStatement(); + $sql + ->ref($this->table) + ->set('setting_ns = ' . $sql->quote($new_namespace)) + ->where('setting_ns = ' . $sql->quote($old_namespace)); + $sql->update(); + + // Reload the renamed namespace in the namespace array + $this->namespaces[$new_namespace] = new dcNamespace($this->blog_id, $new_namespace); + + // Remove the old namespace from the namespace array + unset($this->namespaces[$old_namespace]); + + return true; + } + + /** + * Delete a whole namespace with all settings pertaining to it. + * + * @param string $namespace Namespace name + * + * @return bool + */ + public function delNamespace(string $namespace): bool + { + if (!$this->exists($namespace)) { + return false; + } + + // Remove the namespace from the namespace array + unset($this->namespaces[$namespace]); + + // Delete all settings from the namespace in the database + $sql = new DeleteStatement(); + $sql + ->from($this->table) + ->where('setting_ns = ' . $sql->quote($namespace)); + + $sql->delete(); + + return true; + } + + /** + * Returns full namespace with all settings pertaining to it. + * + * @param string $namespace Namespace name + * + * @return dcNamespace + */ + public function get(string $namespace): dcNamespace + { + return $this->addNamespace($namespace); + } + + /** + * Magic __get method. + * + * @param string $namespace namespace name + * + * @return dcNamespace + */ + public function __get(string $namespace): dcNamespace + { + return $this->get($namespace); + } + + /** + * Check if a namespace exists + * + * @param string $namespace Namespace name + * + * @return bool + */ + public function exists(string $namespace): bool + { + return array_key_exists($namespace, $this->namespaces); + } + + /** + * Dumps namespaces. + * + * @return array + */ + public function dumpNamespaces(): array + { + return $this->namespaces; + } } -?> \ No newline at end of file diff --git a/inc/core/class.dc.store.parser.php b/inc/core/class.dc.store.parser.php new file mode 100644 index 0000000..0c9492c --- /dev/null +++ b/inc/core/class.dc.store.parser.php @@ -0,0 +1,139 @@ +xml = simplexml_load_string($data); + + if ($this->xml === false) { + throw new Exception(__('Wrong data feed')); + } + + $this->_parse(); + + $this->xml = false; + unset($data); + } + + /** + * Parse XML into array + */ + protected function _parse() + { + if (empty($this->xml->module)) { + return; + } + + foreach ($this->xml->module as $i) { + $attrs = $i->attributes(); + if (!isset($attrs['id'])) { + continue; + } + + $define = new dcModuleDefine((string) $attrs['id']); + + # DC/DA shared markers + $define->set('file', (string) $i->file); + $define->set('label', (string) $i->name); // deprecated + $define->set('name', (string) $i->name); + $define->set('version', (string) $i->version); + $define->set('author', (string) $i->author); + $define->set('desc', (string) $i->desc); + + # DA specific markers + $define->set('dc_min', (string) $i->children(self::$bloc)->dcmin); + $define->set('details', (string) $i->children(self::$bloc)->details); + $define->set('section', (string) $i->children(self::$bloc)->section); + $define->set('support', (string) $i->children(self::$bloc)->support); + $define->set('sshot', (string) $i->children(self::$bloc)->sshot); + + $tags = []; + foreach ($i->children(self::$bloc)->tags as $t) { + $tags[] = (string) $t->tag; + } + $define->set('tags', implode(', ', $tags)); + + # First filter right now. If DC_DEV is set all modules are parse + if (defined('DC_DEV') && DC_DEV === true || dcUtils::versionsCompare(DC_VERSION, $define->get('dc_min'), '>=', false)) { + $this->defines[] = $define; + } + } + } + + /** + * Get modules Defines. + * + * @return array Modules Define list + */ + public function getDefines(): array + { + return $this->defines; + } + + /** + * Get modules. + * + * @deprecated since 2.26 Use self::getDefines() + * + * @return array Modules list + */ + public function getModules(): array + { + dcDeprecated::set('dcStoreParser::getDefines()', '2.26'); + + // fill property once on demand + if (empty($this->items) && !empty($this->defines)) { + foreach ($this->defines as $define) { + $this->items[$define->getId()] = $define->dump(); + } + } + + return $this->items; + } +} diff --git a/inc/core/class.dc.store.php b/inc/core/class.dc.store.php new file mode 100644 index 0000000..3c566c9 --- /dev/null +++ b/inc/core/class.dc.store.php @@ -0,0 +1,414 @@ + 10, + 'name' => 8, + 'tags' => 6, + 'desc' => 4, + 'author' => 2, + ]; + + /** + * User agent used to query repository + * + * @var string + */ + protected $user_agent = 'DotClear.org RepoBrowser/0.1'; + + /** + * XML feed URL + * + * @var null|string + */ + protected $xml_url = null; + + /** + * Array of new/update modules from repository + * + * @var array + */ + protected $data = [ + 'new' => [], + 'update' => [], + ]; + + /** + * Array of new/update modules Define from repository + * + * @var array + */ + protected $defines = [ + 'new' => [], + 'update' => [], + ]; + + /** + * Repositories new updates status. + * + * @var bool + */ + private bool $has_new_update = false; + + /** + * Constructor. + * + * @param dcModules $modules dcModules instance + * @param string $xml_url XML feed URL + * @param null|bool $force Force query repository + */ + public function __construct(dcModules $modules, ?string $xml_url, ?bool $force = false) + { + $this->modules = $modules; + $this->xml_url = $xml_url; + $this->user_agent = sprintf('Dotclear/%s)', DC_VERSION); + + $this->check($force); + } + + /** + * Check repository. + * + * @param bool $force Force query repository + * + * @return bool True if get feed or cache + */ + public function check(?bool $force = false): bool + { + if (!$this->xml_url) { + return false; + } + + try { + $str_parser = DC_STORE_NOT_UPDATE ? false : dcStoreReader::quickParse($this->xml_url, DC_TPL_CACHE, $force); + } catch (Exception $e) { + return false; + } + + $new_defines = []; + $upd_defines = []; + $upd_versions = []; + + // check update/new from main repository + if ($str_parser !== false) { + foreach ($str_parser->getDefines() as $str_define) { + // is installed ? + $cur_define = $this->modules->getDefine($str_define->getId()); + if ($cur_define->isDefined()) { + // is update ? + if (dcUtils::versionsCompare($str_define->get('version'), $cur_define->get('version'), '>')) { + $str_define->set('root', $cur_define->get('root')); + $str_define->set('root_writable', $cur_define->get('root_writable')); + $str_define->set('current_version', $cur_define->get('version')); + + // set memo for third party updates + $upd_versions[$str_define->getId()] = [count($upd_defines), $str_define->get('version')]; + + $upd_defines[] = $str_define; + + // This update is new from main repository + if (dcStoreReader::readCode() === dcStoreReader::READ_FROM_SOURCE) { + $this->has_new_update = true; + } + } + // it's new + } else { + $new_defines[] = $str_define; + } + } + } + + // check update from third party repositories + foreach ($this->modules->getDefines() as $cur_define) { + if ($cur_define->get('repository') != '' && DC_ALLOW_REPOSITORIES) { + try { + $str_url = substr($cur_define->get('repository'), -12, 12) == '/dcstore.xml' ? $cur_define->get('repository') : Http::concatURL($cur_define->get('repository'), 'dcstore.xml'); + $str_parser = dcStoreReader::quickParse($str_url, DC_TPL_CACHE, $force); + if ($str_parser === false) { + continue; + } + + foreach ($str_parser->getDefines() as $str_define) { + if ($str_define->getId() == $cur_define->getId() && dcUtils::versionsCompare($str_define->get('version'), $cur_define->get('version'), '>')) { + $str_define->set('repository', true); + $str_define->set('root', $cur_define->get('root')); + $str_define->set('root_writable', $cur_define->get('root_writable')); + $str_define->set('current_version', $cur_define->get('version')); + + // if no update from main repository, add third party update + if (!isset($upd_versions[$str_define->getId()])) { + $upd_defines[] = $str_define; + // if update from third party repo is more recent than main repo, replace this last one + } elseif (dcUtils::versionsCompare($str_define->get('version'), $upd_versions[$str_define->getID()][1], '>')) { + $upd_defines[$upd_versions[$str_define->getId()][0]] = $str_define; + + // This update is new from third party repository + if (dcStoreReader::readCode() === dcStoreReader::READ_FROM_SOURCE) { + $this->has_new_update = true; + } + } + } + } + } catch (Exception $e) { + // Ignore exceptions + } + } + } + + // sort results by id + uasort($new_defines, fn ($a, $b) => strtolower($a->getId()) <=> strtolower($b->getId())); + uasort($upd_defines, fn ($a, $b) => strtolower($a->getId()) <=> strtolower($b->getId())); + + $this->defines = [ + 'new' => $new_defines, + 'update' => $upd_defines, + ]; + + // old style data + foreach ($this->defines['new'] as $define) { + $this->data['new'][$define->getId()] = $define->dump(); + } + foreach ($this->defines['update'] as $define) { + // keep only higher vesion + if (!isset($this->data['update'][$define->getId()]) || dcUtils::versionsCompare($define->get('version'), $this->data['update'][$define->getId()]['version'], '>')) { + $this->data['update'][$define->getId()] = $define->dump(); + } + } + + return true; + } + + /** + * Check if repositories have new updates. + * + * @return bool True on new updates + */ + public function hasNewUdpates(): bool + { + return $this->has_new_update; + } + + /** + * Get a list of modules. + * + * @param bool $update True to get update modules, false for new ones + * + * @return array List of update/new modules defines + */ + public function getDefines(bool $update = false): array + { + return $this->defines[$update ? 'update' : 'new']; + } + + /** + * Get a list of modules. + * + * @deprecated since 2.26 Use self::getDefines() + * + * @param bool $update True to get update modules, false for new ones + * + * @return array List of update/new modules + */ + public function get(bool $update = false): array + { + dcDeprecated::set('dcStore::getDefines()', '2.26'); + + return $this->data[$update ? 'update' : 'new']; + } + + /** + * Search a module. + * + * Search string is cleaned, split and compare to split: + * - module id and clean id, + * - module name, clean name, + * - module desccription. + * + * Every time a part of query is find on module, + * result accuracy grow. Result is sorted by accuracy. + * + * @param string $pattern String to search + * + * @return array Match modules defines + */ + public function searchDefines(string $pattern): array + { + # Split query into small clean words + if (!($patterns = self::patternize($pattern))) { + return []; + } + + # For each modules + $defines = []; + foreach ($this->defines['new'] as $define) { + # Loop through required module fields + foreach (self::$weighting as $field => $weight) { + # Skip fields which not exsist on module + if ($define->get($field) == '') { + continue; + } + + # Split field value into small clean word + if (!($subjects = self::patternize($define->get($field)))) { + continue; + } + + # Check contents + if (!($nb = preg_match_all('/(' . implode('|', $patterns) . ')/', implode(' ', $subjects), $_))) { + continue; + } + + # Increment score by matches count * field weight + $define->set('score', (int) $define->get('score') + $nb * $weight); + } + // return only scored modules + if ($define->get('score')) { + $defines[] = $define; + } + } + # Sort response by matches count + usort($defines, fn ($a, $b) => (int) $b->get('score') <=> (int) $a->get('score')); + + return $defines; + } + + /** + * Search a module. + * + * @deprecated since 2.26 Use self::searchDefines() + * + * @param string $pattern String to search + * + * @return array Match modules + */ + public function search(string $pattern): array + { + dcDeprecated::set('dcStore::searchDefines()', '2.26'); + + $result = []; + foreach ($this->searchDefines($pattern) as $define) { + $result[$define->getId()] = $define->dump(); + } + + return $result; + } + + /** + * Quick download and install module. + * + * @param string $url Module package URL + * @param string $dest Path to install module + * + * @return int dcModules::PACKAGE_INSTALLED (1), dcModules::PACKAGE_UPDATED (2) + */ + public function process(string $url, string $dest): int + { + $this->download($url, $dest); + + return $this->install($dest); + } + + /** + * Download a module. + * + * @param string $url Module package URL + * @param string $dest Path to put module package + */ + public function download(string $url, string $dest): void + { + // Check and add default protocol if necessary + if (!preg_match('%^https?:\/\/%', $url)) { + $url = 'http://' . $url; + } + // Download package + $path = ''; + if ($client = HttpClient::initClient($url, $path)) { + try { + $client->setUserAgent($this->user_agent); + $client->useGzip(false); + $client->setPersistReferers(false); + $client->setOutput($dest); + $client->get($path); + unset($client); + } catch (Exception $e) { + unset($client); + + throw new Exception(__('An error occurred while downloading the file.')); + } + } else { + throw new Exception(__('An error occurred while downloading the file.')); + } + } + + /** + * Install a previously downloaded module. + * + * @param string $path Path to module package + * + * @return int 1 = installed, 2 = update + */ + public function install(string $path): int + { + return dcModules::installPackage($path, $this->modules); + } + + /** + * User Agent String. + * + * @param string $str User agent string + */ + public function agent(string $str) + { + $this->user_agent = $str; + } + + /** + * Split and clean pattern. + * + * @param string $str String to sanitize + * + * @return array|false Array of cleaned pieces of string or false if none + */ + private static function patternize(string $str) + { + $arr = []; + + foreach (explode(' ', $str) as $_) { + $_ = strtolower(preg_replace('/[^A-Za-z0-9]/', '', $_)); + if (strlen($_) >= 2) { + $arr[] = $_; + } + } + + return empty($arr) ? false : $arr; + } +} diff --git a/inc/core/class.dc.store.reader.php b/inc/core/class.dc.store.reader.php new file mode 100644 index 0000000..66ba9d2 --- /dev/null +++ b/inc/core/class.dc.store.reader.php @@ -0,0 +1,349 @@ +setUserAgent(sprintf('Dotclear/%s', DC_VERSION)); + $this->setTimeout(DC_QUERY_TIMEOUT); + } + + /** + * Parse modules feed. + * + * @param string $url XML feed URL + * + * @return mixed Feed content, dcStoreParser instance or false + */ + public function parse(string $url) + { + $this->validators = []; + + if ($this->cache_dir) { + return $this->withCache($url); + } elseif ($this->force === null) { + return false; + } elseif (!$this->getModulesXML($url) || $this->getStatus() != '200') { + return false; + } + + self::$read_code = static::READ_FROM_SOURCE; + + return new dcStoreParser($this->getContent()); + } + + /** + * Quick parse modules feed. + * + * @param string $url XML feed URL + * @param string $cache_dir Cache directoy or null for no cache + * @param null|bool $force Force query repository. null to use cache without ttl + * + * @return mixed Feed content, dcStoreParser instance or false + */ + public static function quickParse(string $url, ?string $cache_dir = null, ?bool $force = false) + { + $parser = new self(); + if ($cache_dir) { + $parser->setCacheDir($cache_dir); + } + + $parser->setForce($force); + + return $parser->parse($url); + } + + /** + * Get last parsed reponse from. + * + * @return int The code + */ + public static function readCode(): int + { + return self::$read_code; + } + + /** + * Set cache directory. + * + * @param string $dir Cache directory + * + * @return bool True if cache dierctory is useable + */ + public function setCacheDir(string $dir): bool + { + $this->cache_dir = null; + + if (!empty($dir) && is_dir($dir) && is_writeable($dir)) { + $this->cache_dir = $dir; + + return true; + } + + return false; + } + + /** + * Set cache TTL. + * + * @param string $str Cache TTL + */ + public function setCacheTTL(string $str): void + { + $str = trim($str); + + if (!empty($str)) { + $this->cache_ttl = substr($str, 0, 1) == '-' ? $str : '-' . $str; + } + } + + /** + * Set force query repository. + * + * @param null|bool $force True to force query + */ + public function setForce(?bool $force): void + { + $this->force = $force; + } + + /** + * Request repository XML feed. + * + * @param string $url XML feed URL + * + * @return bool True on success, else false + */ + protected function getModulesXML(string $url): bool + { + $ssl = false; + $host = ''; + $port = 0; + $path = ''; + $user = ''; + $pass = ''; + + if (!self::readURL($url, $ssl, $host, $port, $path, $user, $pass)) { + return false; + } + $this->setHost($host, $port); + $this->useSSL($ssl); + $this->setAuthorization($user, $pass); + + try { + return $this->get($path); + } catch (Exception $e) { + // @todo Log error when repository query fail + return false; + } + } + + /** + * Get repository modules list using cache. + * + * @param string $url XML feed URL + * + * @return mixed Feed content or False on fail + */ + protected function withCache(string $url) + { + $url_md5 = md5($url); + $cached_file = sprintf( + '%s/%s/%s/%s/%s.ser', + $this->cache_dir, + $this->cache_file_prefix, + substr($url_md5, 0, 2), + substr($url_md5, 2, 2), + $url_md5 + ); + + $may_use_cached = false; + + # Use cache file ? + if (@file_exists($cached_file) && $this->force !== true) { + $may_use_cached = true; + $ts = @filemtime($cached_file); + if ($ts > strtotime($this->cache_ttl) || $this->force === null) { + # Direct cache + self::$read_code = static::READ_FROM_CACHE; + + return unserialize(file_get_contents($cached_file)); + } + $this->setValidator('IfModifiedSince', $ts); + } + + # Query repository + if (!$this->getModulesXML($url)) { + if ($may_use_cached) { + # Touch cache TTL even if query failed ? + if ($this->cache_touch_on_fail) { + @Files::touch($cached_file); + } + # Connection failed - fetched from cache + self::$read_code = static::READ_FROM_CACHE; + + return unserialize(file_get_contents($cached_file)); + } + + return false; + } + + # Parse response + switch ($this->getStatus()) { + # Not modified, use cache + case '304': + @Files::touch($cached_file); + + self::$read_code = static::READ_FROM_CACHE; + + return unserialize(file_get_contents($cached_file)); + # Ok, parse feed + case '200': + $modules = new dcStoreParser($this->getContent()); + self::$read_code = static::READ_FROM_SOURCE; + + try { + Files::makeDir(dirname($cached_file), true); + } catch (Exception $e) { + return $modules; + } + + if (($fp = @fopen($cached_file, 'wb'))) { + fwrite($fp, serialize($modules)); + fclose($fp); + Files::inheritChmod($cached_file); + } + + return $modules; + } + + return false; + } + + /** + * Prepare query. + * + * @return array Query headers + */ + protected function buildRequest(): array + { + $headers = parent::buildRequest(); + + # Cache validators + if (!empty($this->validators)) { + if (isset($this->validators['IfModifiedSince'])) { + $headers[] = 'If-Modified-Since: ' . $this->validators['IfModifiedSince']; + } + if (isset($this->validators['IfNoneMatch'])) { + $headers[] = ''; + } + } + + return $headers; + } + + /** + * Tweak query cache validator. + * + * @param string $key Validator key + * @param mixed $value Validator value + */ + private function setValidator(string $key, $value): void + { + if ($key == 'IfModifiedSince') { + $value = gmdate('D, d M Y H:i:s', $value) . ' GMT'; + } + + $this->validators[$key] = $value; + } +} diff --git a/inc/core/class.dc.themes.php b/inc/core/class.dc.themes.php index f4d6989..a80bb3a 100644 --- a/inc/core/class.dc.themes.php +++ b/inc/core/class.dc.themes.php @@ -1,84 +1,240 @@ $parent is a optional value to indicate them inheritance. - If $parent is null / not set, we simply fall back to - the standard behavior, by using 'default'. - - $priority is an integer. Modules are sorted by priority and name. - Lowest priority comes first. This property is currently ignored when dealing - with themes. - - @param name string Module name - @param desc string Module description - @param author string Module author name - @param version string Module version - @param parent string Module parent - @param priority integer Module priority - */ - public function registerModule($name,$desc,$author,$version,$parent = null,$priority = 1000) - { - if ($this->id) { - $this->modules[$this->id] = array( - 'root' => $this->mroot, - 'name' => $name, - 'desc' => $desc, - 'author' => $author, - 'version' => $version, - 'parent' => $parent, - 'priority' => 1000, - 'root_writable' => is_writable($this->mroot) - ); - } - } - - /** - Loads namespace $ns specific file for module with ID - $id - Note : actually, only 'public' namespace is supported with themes. - - @param id string Module ID - @param ns string Namespace name - */ - public function loadNsFile($id,$ns=null) - { - switch ($ns) { - case 'public': - $parent = $this->modules[$id]['parent']; - if ($parent) { - // This is not a real cascade - since we don't call loadNsFile -, - // thus limiting inclusion process. - // TODO : See if we have to change this. - $this->loadModuleFile($this->modules[$parent]['root'].'/_public.php'); - } - $this->loadModuleFile($this->modules[$id]['root'].'/_public.php'); - break; - } - } +{ + /** + * Module type + * + * @var string + */ + protected $type = 'theme'; + + /** + * Load module context. + * + * @param array'.($title ? $title : $blog_name)."
\n". - ''.$excerpt.'
'; - - $cur = $this->core->con->openCursor($this->core->prefix.'comment'); - $cur->comment_author = (string) $blog_name; - $cur->comment_site = (string) $url; - $cur->comment_content = (string) $comment; - $cur->post_id = $post_id; - $cur->comment_trackback = 1; - $cur->comment_status = $this->core->blog->settings->trackbacks_pub ? 1 : -1; - $cur->comment_ip = http::realIP(); - - try - { - # --BEHAVIOR-- publicBeforeTrackbackCreate - $this->core->callBehavior('publicBeforeTrackbackCreate',$cur); - if ($cur->post_id) { - $comment_id = $this->core->blog->addComment($cur); - - # --BEHAVIOR-- publicAfterTrackbackCreate - $this->core->callBehavior('publicAfterTrackbackCreate',$cur,$comment_id); - } - } - catch (Exception $e) - { - $err = 1; - $msg = 'Something went wrong : '.$e->getMessage(); - } - } - - - $debug_trace = - "' . ($title ?: $blog_name) . "
\n" . + '' . $excerpt . '
'; + + $cur = dcCore::app()->con->openCursor(dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME); + $cur->comment_author = (string) $blog_name; + $cur->comment_site = (string) $url; + $cur->comment_content = (string) $comment; + $cur->post_id = $post_id; + $cur->comment_trackback = 1; + $cur->comment_status = dcCore::app()->blog->settings->system->trackbacks_pub ? dcBlog::COMMENT_PUBLISHED : dcBlog::COMMENT_PENDING; + $cur->comment_ip = Http::realIP(); + + # --BEHAVIOR-- publicBeforeTrackbackCreate -- Cursor + dcCore::app()->callBehavior('publicBeforeTrackbackCreate', $cur); + if ($cur->post_id) { + $comment_id = dcCore::app()->blog->addComment($cur); + + # --BEHAVIOR-- publicAfterTrackbackCreate -- Cursor, int + dcCore::app()->callBehavior('publicAfterTrackbackCreate', $cur, $comment_id); + } + } + + /** + * Delete previously received comment made from an URL for a given post. + * + * @param int $post_id The post identifier + * @param string $url The url + */ + private function delBacklink(int $post_id, string $url) + { + dcCore::app()->con->execute( + 'DELETE FROM ' . dcCore::app()->prefix . dcBlog::COMMENT_TABLE_NAME . ' ' . + 'WHERE post_id = ' . ((int) $post_id) . ' ' . + "AND comment_site = '" . dcCore::app()->con->escape((string) $url) . "' " . + 'AND comment_trackback = 1 ' + ); + } + + /** + * Gets the charset from HTTP headers. + * + * @param string $header The header + * + * @return mixed The charset from request. + */ + private static function getCharsetFromRequest(string $header = '') + { + if (!$header && isset($_SERVER['CONTENT_TYPE'])) { + $header = $_SERVER['CONTENT_TYPE']; + } + + if ($header) { + if (preg_match('|charset=([a-zA-Z0-9-]+)|', $header, $m)) { + return $m[1]; + } + } + } + + /** + * Detect encoding. + * + * @param string $content The content + * + * @return string + */ + private static function detectCharset(string $content): string + { + return mb_detect_encoding( + $content, + 'UTF-8,ISO-8859-1,ISO-8859-2,ISO-8859-3,' . + 'ISO-8859-4,ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,' . + 'ISO-8859-9,ISO-8859-10,ISO-8859-13,ISO-8859-14,ISO-8859-15' + ); + } + + /** + * Retrieve local post from a given URL. + * + * @param string $to_url To url + * + * @throws Exception + * + * @return MetaRecord The target post. + */ + private function getTargetPost(string $to_url): MetaRecord + { + $reg = '!^' . preg_quote(dcCore::app()->blog->url) . '(.*)!'; + + # Are you dumb? + if (!preg_match($reg, $to_url, $m)) { + throw new Exception(__('Any chance you ping one of my contents? No? Really?'), 0); + } + + # Does the targeted URL look like a registered post type? + $url_part = $m[1]; + $p_type = ''; + $post_types = dcCore::app()->getPostTypes(); + $post_url = ''; + foreach ($post_types as $k => $v) { + $reg = '!^' . preg_quote(str_replace('%s', '', $v['public_url'])) . '(.*)!'; + if (preg_match($reg, $url_part, $n)) { + $p_type = $k; + $post_url = $n[1]; + + break; + } + } + + if (empty($p_type)) { + throw new Exception(__('Sorry but you can not ping this type of content.'), 33); + } + + # Time to see if we've got a winner... + $params = [ + 'post_type' => $p_type, + 'post_url' => $post_url, + ]; + $posts = dcCore::app()->blog->getPosts($params); + + # Missed! + if ($posts->isEmpty()) { + throw new Exception(__('Oops. Kinda "not found" stuff. Please check the target URL twice.'), 33); + } + + # Nice try. But, sorry, no. + if (!$posts->trackbacksActive()) { + throw new Exception(__('Sorry, dude. This entry does not accept pingback at the moment.'), 33); + } + + return $posts; + } + + /** + * Returns content of a distant page. + * + * @param string $from_url Target URL + * + * @throws Exception + * + * @return string + */ + private function getRemoteContent(string $from_url): string + { + $from_path = ''; + $http = self::initHttp($from_url, $from_path); + + # First round : just to be sure the ping comes from an acceptable resource type. + $http->setHeadersOnly(true); + $http->get($from_path); + $c_type = explode(';', $http->getHeader('content-type')); + + # Bad luck. Bye, bye... + if (!in_array($c_type[0], ['text/html', 'application/xhtml+xml'])) { + throw new Exception(__('Your source URL does not look like a supported content type. Sorry. Bye, bye!'), 0); + } + + # Second round : let's go fetch and parse the remote content + $http->setHeadersOnly(false); + $http->get($from_path); + $remote_content = $http->getContent(); + + # Convert content charset + $charset = self::getCharsetFromRequest($http->getHeader('content-type')); + if (!$charset) { + $charset = self::detectCharset($remote_content); + } + if (strtolower($charset) != 'utf-8') { + $remote_content = iconv($charset, 'UTF-8', $remote_content); + } + + return $remote_content; + } + //@} + + /// @name Discover + //@{ + /** + * Returns an array containing all discovered trackbacks URLs in $text. + * + * @param string $text The text + * + * @return array + */ + public function discover(string $text): array + { + $res = []; + + foreach ($this->getTextLinks($text) as $link) { + if (($url = $this->getPingURL($link)) !== null) { + $res[] = $url; + } + } + + return $res; + } + + /** + * Try to find source blog name or author from remote HTML page content + * Used when receive a webmention or a pingback + * + * @param string $content The content + * + * @return string + */ + private function getSourceName(string $content): string + { + // Clean text utility function + $clean = fn ($text, $size = 255) => Text::cutString(Html::escapeHTML(Html::decodeEntities(Html::clean(trim($text)))), $size); + + // First step: look for site name + // ------------------------------ + + // Try to find social media metadata + // Facebook + if (preg_match('!!msi', $content, $m)) { + return $clean($m[1]); + } + + // Second step: look for author + // ---------------------------- + + // Try to find social media metadata + // Twitter + if (preg_match('!!msi', $content, $m)) { + return $clean($m[1]); + } + + // Try to find a + if (preg_match('!!msi', $content, $m)) { + return $clean($m[1]); + } + + return ''; + } + + /** + * Find links into a text. + * + * @param string $text The text + * + * @return array The text links. + */ + private function getTextLinks(string $text): array + { + $res = []; + + # href attribute on "a" tags + if (preg_match_all('/]+)>/ms', $text, $match, PREG_SET_ORDER)) { + for ($i = 0; $i < count($match); $i++) { + if (preg_match('/href="((https?:\/)?\/[^"]+)"/ms', $match[$i][1], $matches)) { + $res[$matches[1]] = 1; + } + } + } + unset($match); + + # cite attributes on "blockquote" and "q" tags + if (preg_match_all('/<(blockquote|q) ([^>]+)>/ms', $text, $match, PREG_SET_ORDER)) { + for ($i = 0; $i < count($match); $i++) { + if (preg_match('/cite="((https?:\/)?\/[^"]+)"/ms', $match[$i][2], $matches)) { + $res[$matches[1]] = 1; + } + } + } + + return array_keys($res); + } + + /** + * Check remote header/content to find API trace. + * + * @param string $url The url + * + * @return mixed The ping url. + */ + private function getPingURL(string $url) + { + if (strpos($url, '/') === 0) { + $url = Http::getHost() . $url; + } + + try { + $path = ''; + $http = self::initHttp($url, $path); + $http->get($path); + $page_content = $http->getContent(); + $pb_url = $http->getHeader('x-pingback'); + $wm_url = $http->getHeader('link'); + } catch (Exception $e) { + return false; + } + + # Let's check for an elderly trackback data chunk... + $pattern_rdf = '/'.$cur->cat_desc.'
'; - } - } - - $parent = !empty($struct['category_parent']) ? (integer) $struct['category_parent'] : 0; - - $id = $this->core->blog->addCategory($cur,$parent); - $rs = $this->core->blog->getCategory($id); - return $rs->cat_url; - } - - private function deleteCategory($user,$pwd,$cat_id) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - $c = $this->core->blog->getCategories(array('cat_url' => $cat_id)); - if ($c->isEmpty()) { - throw new Exception(__('This category does not exist.')); - } - $cat_id = $c->cat_id; - unset($c); - - $this->core->blog->delCategory((integer) $cat_id); - return true; - } - - private function searchCategories($user,$pwd,$category,$limit) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - $strReq = 'SELECT cat_id, cat_title, cat_url '. - 'FROM '.$this->core->prefix.'category '. - "WHERE blog_id = '".$this->core->con->escape($this->core->blog->id)."' ". - "AND LOWER(cat_title) LIKE LOWER('%".$this->core->con->escape($category)."%') ". - ($limit > 0 ? $this->core->con->limit($limit) : ''); - - $rs = $this->core->con->select($strReq); - - $res = array(); - while ($rs->fetch()) - { - $res[] = array( - 'category_id' => $rs->cat_url, - 'category_name' => $rs->cat_url - ); - } - return $res; - } - - private function countComments($user,$pwd,$post_id) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - $res = array( - 'approved' => 0, - 'awaiting_moderation' => 0, - 'spam' => 0, - 'total' => 0 - ); - $rs = $this->core->blog->getComments(array('post_id' => $post_id)); - - while ($rs->fetch()) { - $res['total']++; - if ($rs->comment_status == 1) { - $res['approved']++; - } elseif ($rs->comment_status == -2) { - $res['spam']++; - } else { - $res['awaiting_moderation']++; - } - } - return $res; - } - - private function getComments($user,$pwd,$struct,$id=null) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - $params = array(); - - if (!empty($struct['status'])) { - $params['comment_status'] = $this->translateWpCommentstatus($struct['status']); - } - - if (!empty($struct['post_id'])) { - $params['post_id'] = (integer) $struct['post_id']; - } - - if (isset($id)) { - $params['comment_id'] = $id; - } - - $offset = !empty($struct['offset']) ? (integer) $struct['offset'] : 0; - $limit = !empty($struct['number']) ? (integer) $struct['number'] : 10; - $params['limit'] = array($offset,$limit); - - $rs = $this->core->blog->getComments($params); - $res = array(); - while ($rs->fetch()) - { - $res[] = array( - 'date_created_gmt' => new xmlrpcDate($rs->getTS()), - 'user_id' => $rs->user_id, - 'comment_id' => $rs->comment_id, - 'parent' => 0, - 'status' => $this->translateWpCommentstatus((integer) $rs->comment_status), - 'content' => $rs->comment_content, - 'link' => $rs->getPostURL().'#c'.$rs->comment_id, - 'post_id' => $rs->post_id, - 'post_title' => $rs->post_title, - 'author' => $rs->comment_author, - 'author_url' => $rs->comment_site, - 'author_email' => $rs->comment_email, - 'author_ip' => $rs->comment_ip, - ); - } - return $res; - } - - private function addComment($user,$pwd,$post_id,$struct) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - if (empty($struct['content'])) { - throw new Exception('Sorry, you cannot post an empty comment',401); - } - - if (is_numeric($post_id)) { - $p['post_id'] = $post_id; - } else { - $p['post_url'] = $post_id; - } - $rs = $this->core->blog->getPosts($p); - if ($rs->isEmpty()) { - throw new Exception('Sorry, no such post.',404); - } - - $cur = $this->core->con->openCursor($this->core->prefix.'comment'); - - $cur->comment_author = $this->core->auth->getInfo('user_cn'); - $cur->comment_email = $this->core->auth->getInfo('user_email'); - $cur->comment_site = $this->core->auth->getInfo('user_url'); - - $cur->comment_content = $struct['content']; - $cur->post_id = (integer) $post_id; - - $id = $this->core->blog->addComment($cur); - return $id; - } - - private function updComment($user,$pwd,$comment_id,$struct) - { - $this->setUser($user,$pwd); - $this->setBlog(); - - $cur = $this->core->con->openCursor($this->core->prefix.'comment'); - - if (isset($struct['status'])) { - $cur->comment_status = $this->translateWpCommentstatus($struct['status']); - } - - if (isset($struct['date_created_gmt'])) { - if ($struct['date_created_gmt'] instanceof xmlrpcDate) { - $cur->comment_dt = date('Y-m-d H:i:00',$struct['date_created_gmt']->getTimestamp()); - } elseif (is_string($struct['date_created_gmt']) && @strtotime($struct['date_created_gmt'])) { - $cur->comment_dt = date('Y-m-d H:i:00',strtotime($struct['date_created_gmt'])); - } - $cur->comment_dt = $struct['date_created_gmt']; - } - - if (isset($struct['content'])) { - $cur->comment_content = $struct['content']; - } + /** + * Blog ID + * + * @var string + */ + private string $blog_id; + + /** + * Set to true as soon as Blog is set (using Blog ID) + * + * @var bool + */ + private bool $blog_loaded = false; + + /** + * Debug mode + * + * @var bool + */ + private bool $debug = false; + + /** + * Debug file log + * + * @var string + */ + private string $debug_file = DC_TPL_CACHE . '/dotclear-xmlrpc.log'; + + /** + * Trace arguments + * + * @var bool + */ + private bool $trace_args = true; + + /** + * Trace response + * + * @var bool + */ + private bool $trace_response = true; + + /** + * Constructs a new instance. + * + * @param string $blog_id The blog ID + */ + public function __construct(string $blog_id) + { + parent::__construct(); + + $this->blog_id = $blog_id; + + # Pingback support + $this->addCallback( + 'pingback.ping', + [$this, 'pingback_ping'], + ['string', 'string', 'string'], + 'Notify a link to a post.' + ); + } + + /** + * Start the XML-RPC server + * + * @param bool $data The data + */ + public function serve($data = false): void + { + parent::serve(false); + } + + /** + * Call a XML-RPC method + * + * @param string $methodname The methodname + * @param mixed $args The arguments + * + * @return mixed + */ + public function call(string $methodname, $args) + { + try { + $rsp = @parent::call($methodname, $args); + $this->debugTrace($methodname, $args, $rsp); + + return $rsp; + } catch (Exception $e) { + $this->debugTrace($methodname, $args, [$e->getMessage(), $e->getCode()]); + + throw $e; + } + } + + /** + * Trace method response + * + * @param string $methodname The methodname + * @param mixed $args The arguments + * @param mixed $rsp The response + */ + private function debugTrace(string $methodname, $args, $rsp) + { + if (!$this->debug) { + return; + } + + if (($fp = @fopen($this->debug_file, 'a')) !== false) { + fwrite($fp, '[' . date('r') . ']' . ' ' . $methodname); + + if ($this->trace_args) { + fwrite($fp, "\n- args ---\n" . var_export($args, true)); + } + + if ($this->trace_response) { + fwrite($fp, "\n- response ---\n" . var_export($rsp, true)); + } + fwrite($fp, "\n"); + fclose($fp); + } + } + + // Internal methods + // ---------------- + + /** + * Sets the blog. + * + * @throws Exception + * + * @return bool + */ + private function setBlog() + { + if (!$this->blog_id) { + throw new Exception('No blog ID given.'); + } + + if ($this->blog_loaded) { + return true; + } + + dcCore::app()->setBlog($this->blog_id); + $this->blog_loaded = true; + + if (!dcCore::app()->blog->id) { + dcCore::app()->blog = null; + + throw new Exception('Blog does not exist.'); + } + + foreach (dcCore::app()->plugins->getDefines(['state' => dcModuleDefine::STATE_ENABLED]) as $define) { + dcCore::app()->plugins->loadNsFile($define->getId(), 'xmlrpc'); + } + + return true; + } + + // XML-RPC methods + + /** + * Receive a pingback + * + * @param string $from_url The from url + * @param string $to_url To url + * + * @return string Message sent back to the sender + */ + public function pingback_ping(string $from_url, string $to_url): string + { + dcTrackback::checkURLs($from_url, $to_url); + + $args = [ + 'type' => 'pingback', + 'from_url' => $from_url, + 'to_url' => $to_url, + ]; - if (isset($struct['author'])) { - $cur->comment_author = $struct['author']; - } + // Time to get things done... + $this->setBlog(); - if (isset($struct['author_url'])) { - $cur->comment_site = $struct['author_url']; - } + # --BEHAVIOR-- publicBeforeReceiveTrackback -- array`,'text/html',).body.firstChild;let point=document.querySelector('#comment-form input[type=submit][name=preview]');if(!point){point=document.querySelector('#comment-form button[type=submit][name=preview]');} +if(point){point=point.parentNode;point.parentNode.insertBefore(bloc,point);}else{return;} +const remember_me_name='comment_info';const info=readRememberInfo();if(info!==false){document.getElementById('c_name').setAttribute('value',info.name);document.getElementById('c_mail').setAttribute('value',info.mail);document.getElementById('c_site').setAttribute('value',info.site);document.getElementById('c_remember').setAttribute('checked','checked');} +document.getElementById('c_remember').onclick=(e)=>{if(e.target.checked){setRememberInfo();}else{dropRememberInfo();}};const copeWithModifiedInfo=()=>{if(document.getElementById('c_remember').checked){setRememberInfo();}};document.getElementById('c_name').onchange=copeWithModifiedInfo;document.getElementById('c_mail').onchange=copeWithModifiedInfo;document.getElementById('c_site').onchange=copeWithModifiedInfo;function setRememberInfo(){localStorage.setItem(remember_me_name,JSON.stringify({name:document.getElementById('c_name').value,mail:document.getElementById('c_mail').value,site:document.getElementById('c_site').value,}),);} +function dropRememberInfo(){localStorage.removeItem(remember_me_name);} +function readRememberInfo(){const data=localStorage.getItem(remember_me_name);if(data===null){return false;} +const result=JSON.parse(data);if(Object.keys(result).length!=3){dropRememberInfo();return false;} +return result;}}); \ No newline at end of file diff --git a/inc/js/util.js b/inc/js/util.js new file mode 100644 index 0000000..d6c855d --- /dev/null +++ b/inc/js/util.js @@ -0,0 +1,8 @@ +'use strict';var dotclear=dotclear||{};Object.assign(dotclear,{getData(id,clear=true,remove=false){let data={};const element=document.getElementById(`${id}-data`);if(element){try{data=JSON.parse(element.textContent);if(remove){element.remove();}else if(clear){element.innerHTML='';}}catch(e){}} +return data;},isObject(item){return item&&typeof item==='object'&&!Array.isArray(item);},isEmptyObject(item){return this.isObject(item)&&Object.keys(item).length===0;},mergeDeep(target,...sources){if(!sources.length)return target;const source=sources.shift();if(this.isObject(target)&&this.isObject(source)){for(const key in source){if(this.isObject(source[key])){if(!target[key]) +Object.assign(target,{[key]:{},});this.mergeDeep(target[key],source[key]);}else{Object.assign(target,{[key]:source[key],});}}} +return this.mergeDeep(target,...sources);},getCookie(name){const matches=document.cookie.match(new RegExp(`(?:^|; )${name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1')}=([^;]*)`),);return matches?decodeURIComponent(matches[1]):false;},setCookie(name,value,options={}){if(typeof options.expires==='number'){options.expires=new Date(Date.now()+options.expires*864e5);} +if(options.expires instanceof Date){options.expires=options.expires.toUTCString();} +let updatedCookie=`${encodeURIComponent(name)}=${encodeURIComponent(value)}`;for(const optionKey in options){updatedCookie+=`; ${optionKey}`;const optionValue=options[optionKey];if(optionValue!==true){updatedCookie+=`=${optionValue}`;}} +if(options.sameSite===undefined){updatedCookie+='; sameSite=Lax';} +document.cookie=updatedCookie;},deleteCookie(name){this.setCookie(name,'',{expires:-1,});},});var getData=getData||function getData(id,clear=true,remove=false){console.warn('getData() is deprecated. Use dotclear.getData');return dotclear.getData(id,clear,remove);};var isObject=isObject||function isObject(item){console.warn('isObject() is deprecated. Use dotclear.isObject()');return dotclear.isObject(item);};var mergeDeep=mergeDeep||function mergeDeep(target,...sources){console.warn('mergeDeep() is deprecated. Use dotclear.mergeDeep()');return dotclear.mergeDeep(target,...sources);};var getCookie=getCookie||function getCookie(name){console.warn('getCookie() is deprecated. Use dotclear.getCookie()');return dotclear.getCookie(name);};var setCookie=setCookie||function setCookie(name,value,options={}){console.warn('setCookie() is deprecated. Use dotclear.setCookie()');return dotclear.setCookie(name,value,options);};var deleteCookie=deleteCookie||function deleteCookie(name){console.warn('deleteCookie() is deprecated. Use dotclear.deleteCookie()');return dotclear.deleteCookie(name);}; \ No newline at end of file diff --git a/inc/load_plugin_file.php b/inc/load_plugin_file.php deleted file mode 100644 index c97c5dc..0000000 --- a/inc/load_plugin_file.php +++ /dev/null @@ -1,87 +0,0 @@ - \ No newline at end of file diff --git a/inc/prepend.php b/inc/prepend.php deleted file mode 100644 index d5f4f8b..0000000 --- a/inc/prepend.php +++ /dev/null @@ -1,260 +0,0 @@ -config.php file. '. - 'I need this before we can get started. Need more help? '. - 'We got it. '. - 'You can create a config.php '. - 'file through a web interface, but this doesn\'t work for all '. - 'server setups. The safest way is to manually create the file.' - ,10); -} - -require DC_RC_PATH; - -# Constants -define('DC_ROOT',path::real(dirname(__FILE__).'/..')); -define('DC_VERSION','2.1.7'); -define('DC_DIGESTS',dirname(__FILE__).'/digests'); -define('DC_L10N_ROOT',dirname(__FILE__).'/../locales'); -define('DC_L10N_UPDATE_URL','http://services.dotclear.net/dc2.l10n/?version=%s'); - -if (!defined('DC_VENDOR_NAME')) { - define('DC_VENDOR_NAME','Dotclear'); -} - -if (!defined('DC_XMLRPC_URL')) { - define('DC_XMLRPC_URL','%1$sxmlrpc/%2$s'); -} - -if (!defined('DC_ADMIN_SSL')) { - define('DC_ADMIN_SSL',false); -} - -if (defined('DC_FORCE_SCHEME_443') && DC_FORCE_SCHEME_443) { - http::$https_scheme_on_443 = true; -} - -if (!defined('DC_DBPERSIST')) { - define('DC_DBPERSIST',false); -} - -if (!defined('DC_UPDATE_URL')) { - define('DC_UPDATE_URL','http://download.dotclear.net/versions.xml'); -} - -if (!defined('DC_UPDATE_VERSION')) { - define('DC_UPDATE_VERSION','stable'); -} - -try { - $core = new dcCore(DC_DBDRIVER,DC_DBHOST,DC_DBNAME,DC_DBUSER,DC_DBPASSWORD,DC_DBPREFIX,DC_DBPERSIST); -} catch (Exception $e) { - __error($e->getMessage() - ,$e->getCode() == 0 ? - '
This either means that the username and password information in '. - 'your config.php file is incorrect or we can\'t contact '. - 'the database server at "'.DC_DBHOST.'". This could mean your '. - 'host\'s database server is down.
'. - 'If you\'re unsure what these terms mean you should probably contact '. - 'your host. If you still need help you can always visit the '. - 'Dotclear Support Forums.
' - : '' - ,20); -} - -# If we have some __top_behaviors, we load them -if (isset($__top_behaviors) && is_array($__top_behaviors)) -{ - foreach ($__top_behaviors as $b) { - $core->addBehavior($b[0],$b[1]); - } - unset($b); -} - -http::trimRequest(); -try { - http::unsetGlobals(); -} catch (Exception $e) { - header('Content-Type: text/plain'); - echo $e->getMessage(); - exit; -} - -l10n::init(); - -$core->url->registerDefault(array('dcUrlHandlers','home')); -$core->url->register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang')); -$core->url->register('post','post','^post/(.+)$',array('dcUrlHandlers','post')); -$core->url->register('preview','preview','^preview/(.+)$',array('dcUrlHandlers','preview')); -$core->url->register('category','category','^category/(.+)$',array('dcUrlHandlers','category')); -$core->url->register('archive','archive','^archive(/.+)?$',array('dcUrlHandlers','archive')); - -$core->url->register('feed','feed','^feed/(.+)$',array('dcUrlHandlers','feed')); -$core->url->register('trackback','trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback')); -$core->url->register('rsd','rsd','^rsd$',array('dcUrlHandlers','rsd')); -$core->url->register('xmlrpc','xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc')); - -$core->setPostType('post','post.php?id=%d',$core->url->getBase('post').'/%s'); - -# Store upload_max_filesize in bytes -$u_max_size = files::str2bytes(ini_get('upload_max_filesize')); -$p_max_size = files::str2bytes(ini_get('post_max_size')); -if ($p_max_size < $u_max_size) { - $u_max_size = $p_max_size; -} -define('DC_MAX_UPLOAD_SIZE',$u_max_size); -unset($u_max_size); unset($p_max_size); - -# Shutdown -register_shutdown_function('__shutdown'); - -function __shutdown() -{ - global $__shutdown; - if (is_array($__shutdown)) { - foreach ($__shutdown as $f) { - if (is_callable($f)) { - call_user_func($f); - } - } - } - - # Explicitly close session before DB connection - if (session_id()) { - session_write_close(); - } - $GLOBALS['core']->con->close(); -} - -function __error($summary,$message,$code=0) -{ - # Error codes - # 10 : no config file - # 20 : database issue - # 30 : blog is not defined - # 40 : template files creation - # 50 : no default theme - # 60 : template processing error - - if (CLI_MODE) - { - trigger_error($summary,E_USER_ERROR); - exit(1); - } - else - { - if (defined('DC_ERRORFILE') && is_file(DC_ERRORFILE)) { - include DC_ERRORFILE; - } else { - include dirname(__FILE__).'/core_error.php'; - } - exit; - } -} -?> \ No newline at end of file diff --git a/inc/public/class.dc.template.php b/inc/public/class.dc.template.php index 3045dd3..9bb0f14 100644 --- a/inc/public/class.dc.template.php +++ b/inc/public/class.dc.template.php @@ -1,2916 +1,4547 @@ remove_php = !$core->blog->settings->tpl_allow_php; - $this->use_cache = $core->blog->settings->tpl_use_cache; - - $this->tag_block = '{{tpl:lang URL you've tried has typos, or the page has been deleted or moved.}}
+{{tpl:SysFormError}}
+{{tpl:lang Trackback URL}} : {{tpl:EntryPingLink}}
+
+ {{tpl:EntryContent encode_html="1" remove_html="1" cut_string="300"}}
+
+
{{tpl:BlogDescription remove_html="1"}}
+{{tpl:lang RSS feed is a free blog summary. It provides content + (either posts or comments) or summaries of content, together with links + to the full versions, and other metadata. The last published items may + then be read by your favorite RSS + aggregator.}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned no result."}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s result."}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s results."}}
+
+
{{tpl:lang The list of recents posts is available}} {{tpl:lang here}}.
+{{tpl:lang The document you are looking for does not exist.}}
+{{tpl:EntryDate}}
+{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+ {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
+
+
+
{{tpl:EntryDate}}
+{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+
{{tpl:lang Entries feed}}
+
{{tpl:EntryDate}}
+{{tpl:lang By}} {{tpl:EntryAuthorLink}} + {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
++
+
{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+ {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
+
{{tpl:SysFormError}}
+{{tpl:lang Trackback URL}} : {{tpl:EntryPingLink}}
+{{tpl:lang RSS feed is a free blog summary. It provides content + (either posts or comments) or summaries of content, together with links + to the full versions, and other metadata. The last published items may + then be read by your favorite RSS + aggregator.}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned no result."}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s result."}}
+{{tpl:SysSearchString encode_html="1" string="Your search for %1$s returned %2$s results."}}
+{{tpl:EntryDate}}
+{{tpl:lang By}} {{tpl:EntryAuthorLink}}
+ {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
+
+
+
{{tpl:lang The list of recents posts is available}} {{tpl:lang here}}.
+{{tpl:lang RSS feed is a free blog summary. It provides content - (either posts or comments) or summaries of content, together with links - to the full versions, and other metadata. The last published items may - then be read by your favorite RSS - aggregator.}}
-{{tpl:lang Simply copy the following URL into your aggregator:}}
- -En modifiant la configuration du thème Blowup, vous pouvez personnaliser votre -thème très facilement. Pour cela, renseignez simplement les champs de configuration -ou choisissez un style prédéfini.
- -Quand vous devez indiquer une valeur de couleur, celle-ci doit être au format -hexadécimal. Par exemple : "#FF0000" donnera du rouge. Vous pouvez vous aider -de la pipette à côté de chaque champs de couleur.
-Si vous manquez d'inspiration vous pouvez consulter :
-Quand vous devez indiquer une taille, celle-ci doit être suivie d'une unité -de mesure. Par exemple : "1em". Si vous n'indiquez aucune unité, la valeur -donnée prendra des pixels comme unité par défaut.
-Les unités possibles sont :
-Vous pouvez choisir une image d'en-tête parmi une liste de nombreuses images -afin de remplacer celle utilisée par défaut.
- -En choisissant "Personnalisé..." parmi la liste d'images, vous pourrez -déposer votre propre image. Celle-ci doit être au format JPG ou PNG et -avoir une largeur exacte de 800 pixels. - -
Si vous déposez une image au format JPG, un cadre sera ajouté autours de -l'image, ce qui n'est pas le cas avec une image au format PNG (dont la -transparence sera également préservée).
- -Vous pouvez choisir un style prédéfini dans la liste d'option "Styles prédéfinis". -Une fois le style choisi, vous devez valider le formulaire pour appliquer les -changements.
- -Vous pouvez ensuite modifier le style prédéfini comme bon vous semble.
- -à la fin des options de Blowup, vous pouvez afficher une zone appelée "Import -/ export de configuration". Dans cette zone de texte se trouve la configuration -en cours d'utilisation. Vous pouvez la copier pour la partager avec d'autres.
- -Pour appliquer (importer) une configuration, il suffit simplement de remplacer -le contenu de la zone de texte par celui que vous voulez utiliser. N'oubliez pas -de cliquer sur "appliquer le code".
- - - \ No newline at end of file diff --git a/locales/fr/help/core_blog_new.html b/locales/fr/help/core_blog_new.html new file mode 100644 index 0000000..2f46dfb --- /dev/null +++ b/locales/fr/help/core_blog_new.html @@ -0,0 +1,28 @@ + + +Certains champs permettent de formater les dates avec des caractères -particuliers dont voici la définition :
+Indiquez ici si vous souhaitez ou non que les moteurs de recherche indexent +et/ou archivent vos pages. Choisissez la dernière option si vous ne voulez pas +que l'on trouve votre blog par le biais d'un moteur de recherche.
+ +Indiquez ici le nombre de jours après lequel vous souhaitez que les commentaires +indésirables soient automatiquement supprimés. Laisser ce champ de saisie vide ou mettre la valeur à 0 pour ne fixer aucune limite dans le temps.
+ +Certains champs permettent de formater les dates ou les heures avec des caractères particuliers dont voici la définition :
+ +Liste les utilisateur·rice·s de ce blog, ainsi que leurs permissions. Si l'utilisateur·rice n'est ni super administrateur·rice ni administrateur·rice, le bouton Changer les permissions permet de lui en ajouter ou supprimer.
Lorsque de nouvelles versions des thèmes installés sur votre blog ont été déposées dans le centre de ressources Dotaddict, la page comporte un onglet supplémentaire nommé Mise à jour de thèmes, qui liste les thèmes avec le numéro de version installée et le numéro de version de la mise à jour.
+Il suffit alors d'utiliser le bouton d'action Mise à jour.
+Si plusieurs mises à jour sont disponibles, un bouton d'action en bas de page permet de Mettre à jour tous les thèmes en une seule fois.
+à noter : les modifications que vous auriez pu apporter aux fichiers du thème seront perdues lors de sa mise à jour.
+ +La liste des thèmes installés apparaît dans cet onglet. Vous pouvez choisir un thème pour le blog courant en cliquant sur Utiliser celui-ci.
+Le thème courant peut être modifié via le bouton Modifier les fichiers du thème. Si le thème sélectionné comporte un configurateur, on y accède par le bouton Personnaliser le thème.
+Vous pouvez également désactiver un thème (s'il pose un problème de compatibilité par exemple). Un onglet "Thèmes désactivés" apparaît alors avec la liste de ceux-ci.
+ +Cet onglet permet de parcourir le centre de ressources Dotaddict des thèmes soit par ordre alphabétique, soit en effecturant une recherche dans le champ dédié. Les thèmes déjà installés n'apparaissent pas.
+ +Si le thème que vous voulez installer (ou mettre à jour) ne se trouve pas sur le centre de ressources Dotaddict, vous pouvez l'installer soit en allant le chercher sur votre disque dur, soit en entrant son adresse URL que vous aurez préalablement récupérée sur le site qui le propose. Le thème à télécharger se présente toujours sous la forme d'un fichier zip.
+ + + diff --git a/locales/fr/help/core_blogs.html b/locales/fr/help/core_blogs.html new file mode 100644 index 0000000..bc09a2d --- /dev/null +++ b/locales/fr/help/core_blogs.html @@ -0,0 +1,26 @@ + + +Si l'installation concerne plusieurs blogs auxquels vous avez accès, un menu déroulant permet de choisir le blog sur lequel vous souhaitez travailler. (Sinon il rappelle simplement le nom du blog.)
+Le lien Aller sur le site ouvre le blog courant dans un nouvel onglet.
+Plus loin, les autres liens offrent un accès au retour à ce tableau de bord, aux pages de réglages personnels et à la déconnexion.
+Le choix des favoris et l'affichage des modules sont personnalisables dans l'onglet Mon tableau de bord de la page Mes préférences.
+On peut afficher ou masquer ce menu à tout moment en cliquant sur sa bande extérieure droite (ou en activant le lien Masquer le menu principal).
+Le premier bloc du menu liste toutes les pages favorites de l'utilisateur·rice. On peut choisir de ne pas insérer ce bloc dans l'onglet Mon tableau de bord de la page Mes préférences..
+Ce menu liste les pages d'administration. Il est séparé en trois sections :
+Liste des langues installées et disponibles pour votre interface d'administration ou pour définir la langue du blog. Chacune de ces langues peut être supprimée.
+Dans le cas où plus aucune langue ne serait installée, l'anglais serait alors utilisé pour l'interface et pour le blog.
+ +Liste des langues disponibles sur le serveur de Dotclear. Pour installer une de ces langues, sélectionnez-la dans la liste déroulante, indiquez votre mot de passe et cliquez sur le bouton Installer la langue.
+La langue sélectionnée sera alors téléchargée et installée sur votre système.
+ +Vous pouvez également utiliser une archive compressée (au format zip) pour installer une langue. Sélectionnez le fichier correspondant sur votre ordinateur, indiquez votre mot de passe et cliquez sur le bouton Déposer la langue.
+ + + diff --git a/locales/fr/help/core_media.html b/locales/fr/help/core_media.html index 6191dc0..d68a202 100644 --- a/locales/fr/help/core_media.html +++ b/locales/fr/help/core_media.html @@ -1,96 +1,108 @@ - -La page principale de la Médiathèque (anciennement gestionnaire de médias) + présente la liste des fichiers (médias) disponibles pour le blog en cours d'utilisation.
- +Le clic sur l'icône ou le nom d'un répertoire permet d'afficher les sous-répertoires et médias qu'il contient.
-La page principale du gestionnaire de media présente la liste des fichiers -(media) disponibles pour le blog en cours d'utilisation.
+Les fichiers son au format MP3 sont présentés avec un lecteur permettant + d'en prendre immédiatement connaissance (sous réserve que le lecteur (ou + plugin) Flash soit disponible sur votre navigateur.
-Il est possible d'afficher les media dans dans des répertoires ou sous -répertoires en cliquant sur leurs icônes ou leurs noms.
+Les images sont affichées avec une miniature quand cela est possible.
-Les fichiers son au format MP3 sont présentés avec un lecteur permettant -d'en prendre immédiatement connaissance. Ce lecteur nécessite un lecteur (ou -plugin) Flash sur votre navigateur.
+Les images sont affichées avec une miniature quand cela est possible.
+Pour supprimer un fichier, cochez la case correspondante associée + et cliquez sur Supprimer les médias sélectionnés. Vous pouvez choisir de + supprimer plusieurs fichiers à la fois.
-Ce formulaire permet de créer un nouveau répertoire dans le répertoire en -cours d'utilisation. Indiquez simplement un nom comme vous le feriez sur votre -ordinateur.
+Ce formulaire permet de créer un nouveau répertoire dans le répertoire en + cours d'utilisation. Indiquez simplement un nom comme vous le feriez sur votre + ordinateur.
-La page individuelle d'un media présente un ensemble d'informations sur -celui-ci et permet d'effectuer quelques opérations.
+La page individuelle d'un média présente un ensemble d'informations sur + celui-ci et permet d'effectuer quelques opérations.
-Lors de l'ajout d'une image, jusqu'à quatre versions de celle-ci peuvent -être disponibles (selon la taille de l'image d'origine) :
-Lors de l'ajout d'une image, jusqu'à quatre versions de celle-ci peuvent + être disponibles (selon la taille de l'image d'origine) :
+Les tailles par défaut des versions miniature, petite et moyenne, peuvent être modifiées dans les paramètres du blog
-Vous pouvez attacher un fichier à un billet très facilement. Commencez par -créer un nouveau billet et enregistrez-le. Cliquez alors sur "ajouter un fichier -au billet" pour ouvrir le gestionnaire de media.
+Vous pouvez attacher un fichier à un billet très facilement. Commencez par + créer un nouveau billet et enregistrez-le. Dans la section Annexes, cliquez sur Ajouter des fichiers à la page pour ouvrir la médiathèque.
-En cliquant sur l'icône [+] (Attacher un fichier au billet) vous pourrez -joindre le fichier à votre billet.
+En cliquant sur l'icône [+] (Attacher un fichier au billet) vous pourrez + joindre le fichier à votre billet.
-Les fichiers attachés à un billet seront visibles sur la page individuelle -du billet, sous la forme d'une liste après le contenu du billet. Les fichiers -MP3 seront automatiquement accompagnés d'un lecteur en Flash permettant la -lecture directe du fichier.
+Les fichiers attachés à un billet seront visibles sur la page individuelle + du billet, sous la forme d'une liste après le contenu du billet. Les fichiers + MP3 seront automatiquement accompagnés d'un lecteur en Flash permettant la + lecture directe du fichier.
-Tous les fichiers attachés à un billet seront présents dans les fils RSS de -vos billets, vous permettant ainsi de réaliser des podcast de n'importe quel -type de fichier.
+Tous les fichiers attachés à un billet seront présents dans les fils RSS de + vos billets, vous permettant ainsi de réaliser des podcast de n'importe quel + type de fichier.
- - \ No newline at end of file + + diff --git a/locales/fr/help/core_plugins.html b/locales/fr/help/core_plugins.html new file mode 100644 index 0000000..1c11603 --- /dev/null +++ b/locales/fr/help/core_plugins.html @@ -0,0 +1,43 @@ + + +Lorsque de nouvelles versions des plugins installés sont disponibles sur Dotaddict, +un onglet Mise à jour de plugins est disponible listant les plugins concernés avec leur numéro de version installée et celui de leur mise à jour.
+ +Il suffit alors d'utiliser le bouton d'action Mise à jour.
+ +Si plusieurs mises à jour sont disponibles, un bouton d'action en bas de page permet de Mettre à jour tous les plugins en une seule fois.
+ + +La présence d'un logo Dotclear en début de ligne signifie que le plugin est uniquement disponible avec la distribution officielle et qu'il est un de ses composants.
+ + +Cette liste permet de visualiser des informations (nom, version, courte description) des plugins activés. Deux actions sont possibles : Désactiver (opération réversible) ou Supprimer (opération irrévocable).
+ +Cette liste permet de visualiser les plugins ayant été désactivés. Deux actions sont possibles : Activer ou Supprimer (opération irrévocable).
+Cette page permet d'installer directement un plugin disponible sur Dotaddict.
+ + +Deux moyens de recherche sont possibles : en saisissant son nom dans le champ Rechercher dans le dépot ou en parcourant l'index.
+Depuis la liste, un clic sur le triangle (lien Dévoiler), révèle un lien vers sa fiche sur Dotaddict et le lien de support indiqué par l'auteur.
+Pour faire un rétrolien cliquez sur le lien Faire des rétroliens. -Si vous ne voyez pas ce lien, vérifiez que votre billet est bien dans l'état -publié.
+Il est possible d'effectuer un ensemble d'actions sur plusieurs billets, d'un seul coup. Les actions possibles dépendent des permissions de l'utilisateur.
-Il se peut que la liste ci-dessus soit plus longue si d'autres actions possibles ont été ajoutées par des plugins activés sur votre installation.
- \ No newline at end of file + diff --git a/locales/fr/help/core_search.html b/locales/fr/help/core_search.html new file mode 100644 index 0000000..44c58ac --- /dev/null +++ b/locales/fr/help/core_search.html @@ -0,0 +1,43 @@ + + +Indiquer les mots ou termes recherchés dans le champ + de saisie et choisir l'étendue de la recherche :
+Depuis la liste des résultats d'une recherche, on peut cliquer sur le lien d'un des + billets pour accéder à sa page de modification.
+Il est possible d'effectuer un ensemble d'actions sur plusieurs billets en une seule fois. + Les actions possibles dépendent des permissions de l'utilisateur
+Pour faire un rétrolien, cliquez sur le lien Faire des rétroliens. +Si vous ne voyez pas ce lien, vérifiez que votre billet est bien à l'état +Publié.
+ +Cette page permet de mettre à jour Dotclear de manière automatique. + Si une version plus récente que la version actuellement installée + existe, elle vous sera proposée. Avant de faire la mise à jour + vous pouvez regarder ce que cette version va changer en cliquant + sur informations sur cette version.
+ +Si aucune nouvelle version ne vous est proposée, vous pouvez forcer + la vérification en cliquant sur + Forcer la vérification de mise à jour de Dotclear.
+ +Si tout est correct, c'est-à -dire si vous n'avez modifié manuellement + aucun fichier de l'installation, la procédure de mise à jour va :
+Une fois cela fait vous aurez un message tel que
+ "Félicitations, vous êtes à un clic de la fin de la mise à jour. Finir la mise à jour."
+ Cliquez sur Finir la mise à jour. Vous allez être déconnecté. La base de données sera
+ mise à jour, si nécessaire, lorsque vous vous reconnecterez.
Si vous avez modifié manuellement des fichiers, ceux-ci seront + listés et il vous sera conseillé de faire une mise à jour manuelle.
+ +Ã partir de cet onglet, vous pouvez supprimer les anciens fichiers de sauvegarde.
+Vous pouvez aussi revenir à une version précédente. Ne revenez à une + version précédente que si vous rencontrez d'importantes difficultés avec la nouvelle version.
+ + diff --git a/locales/fr/help/core_user.html b/locales/fr/help/core_user.html new file mode 100644 index 0000000..c45d0bd --- /dev/null +++ b/locales/fr/help/core_user.html @@ -0,0 +1,75 @@ + + +Pour changer votre mot de passe, indiquez deux fois le nouveau mot de passe -dans les champs Nouveau mot de passe et Confirmer le mot de -passe. Le mot de passe doit être long d'au moins 6 caractères.
-Si aucun mot de passe n'est donné, celui-ci ne sera pas changé.
+Cette page liste les utilisateur·rice·s sur la plateforme.
+Pour ajouter (ou modifier) les permissions d'un·e (ou plusieurs) utilisateur·rice(s) + votre mot de passe vous sera demandé dans le champ Votre mot de passe.
+ +Il est possible d'effectuer un ensemble d'actions sur plusieurs utilisateur·rice·s, d'un + seul coup.
+Si vous choisissez de définir les permissions d'un·e utilisateur·rice, vous allez être redirigé vers une nouvelle page, présentant + la liste des blogs présents sur votre plateforme. Cochez les cases correspondants aux blogs pour lesquels vous voulez définir + des permissions. Cliquez sur Définir les permissions.
+ +Pour chaque blog, vous avez un ensemble de permissions.
+Le statut Super administrateur·rice se définit sur le profil de l'utilisateur·rice.
+ + diff --git a/locales/fr/help/core_wiki.html b/locales/fr/help/core_wiki.html index 1fb3b90..ef65ca1 100644 --- a/locales/fr/help/core_wiki.html +++ b/locales/fr/help/core_wiki.html @@ -1,13 +1,13 @@ -La syntaxe Wiki est une manière d'écrire du texte avec un jeu de balises +
La syntaxe wiki est une manière d'écrire du texte avec un jeu de balises réduit au minimum, permettant de couvrir les besoins les plus courants (titres, paragraphes, citations, listes...).
@@ -24,17 +24,24 @@ réduit au minimum, permettant de couvrir les besoins les plus courants* pour des
listes à puce ou # pour des listes numérotées. Vous pouvez faire
des listes imbriquées en mélangeant les codes de liste. Par exemple :
--* item 1 -** item 1.1 -* item 2 -*# item 2.1 ++++*item 1 +**item 1.1 +*item 2 +*#item 2.1 ... -
= pour le terme à définir et par : pour la définition du terme.
+ +=terme +:définition du terme +
> devant chaque
ligne de texte.) devant chaque ligne de texte''texte''__texte__%%%++texte++--texte--[url], [nom|url],
+ ""texte""%%%++texte++--text--[url] [nom|url],
[nom|url|langue] ou [nom|url|langue|titre]((url|texte alternatif)),
((url|texte alternatif|position)) ou
- ((url|texte alternatif|position|description longue)).
- ~ancre~??acronyme|titre??``code html``{{citation}},
- {{citation|langue}} ou {{citation|langue|url}}@@code ici@@$$Corps de la note$$((url|texte alternatif|position|longue description)).
+ ~anchor~??acronyme|titre ??``Code HTML``{{quote}},
+ {{quote|language}} ou {{quote|language|url}}@@code@@$footnote$$^ exposant ^,,indice,,\ avant celui-ci. Par exemple&n
///html <p style="color:red">mon texte en rouge</p> @@ -80,6 +90,5 @@ texte au format Wiki. Pour cela, utilisez le code suivant :
Outre les pages d'aide globale, plusieurs pages d'administration disposent d'une aide en ligne. Si Javascript est activé
+ sur votre navigateur, vous pouvez voir l'aide en ligne en haut à droite de la page, en cliquant sur le lien Need Help ? . Si Javascript est désactivé, l'aide est affichée en bas de la page.
Sur chaque page de lâadministration, vous retrouverez les mêmes volet en haut, menu principal et pied de page. (Les emplacements de chacun de ces éléments sont indiqués ici pour une consultation sur ordinateur ; sur un mobile ou une tablette, leur emplacement varie selon la place disponible.)
+ +Le volet en haut de chaque page est composé de trois éléments :
+Par défaut, ce logo est celui de Dotclear et son lien conduit vers lâaccueil de lâadministration. Toutefois, un·e gestionnaire de plate-forme peut choisir un autre logo et diriger le lien vers autre chose que lâaccueil (en général la page dâaccueil du service).
+ +Le premier élément situé après le logo indique le bloc dit actif, câest-à -dire celui sur lequel vous êtes en train dâagir. Si vous avez plusieurs blogs sur la même installation, cette information figure dans un menu déroulant qui permet de permuter sur un autre blog.
+Le lien suivant le nom du blog permet dâaller voir le blog dans une autre fenêtre ou un autre onglet.
+ +à lâextrême droite du volet haut, le lien Mon tableau de bord permet de revenir à lâaccueil du blog.
+Le lien suivant, Mes préférences dirige vers la page où vous pourrez modifier vos informations personnelles, configurer votre tableau de bord et choisir vos options dâinterface et dâédition.
+Ãtonnamment, le lien Déconnecter [votre login] permet de⦠se déconnecter, si si. (Chez Dotclear, on est trop forts en ergo.)
+ +Le menu principal est situé à gauche de lâécran. Il peut être rétracté en cliquant sur sa bordure droite (puis déployé en cliquant sur cette même bordure).
+Il conduit vers les différentes pages dâadministration correspondant à vos permissions sur le blog actif. Quatre blocs le composent
+Une version gratuite de Dotclear est offerte à tout utilisateur·rice découvrant le secret du pied de page.
+ +Si vous n'êtes pas familier avec les blogs, nous vous recommandons de consulter notre documentation (la table des matières complète est disponible dans l'onglet Documentation de cette page) ainsi que des tutoriels tels que : +
+ +Le forum est un lieu dâentraide convivial où aucune question nâest considérée comme stupide. Nâhésitez pas à y participer pour demander de lâaide et â pourquoi pas â aider dâautres utilisateurs à votre tour.
+ +Nous nous efforçons dâutiliser un vocabulaire compréhensible sans connaissances préalables. Toutefois si nous nous sommes laissés aller à employer un terme de jargon, vous en trouverez sans doute lâexplication dans le glossaire de notre documentation en ligne.
+L'interface de Dotclear répond à la quasi totalité des critères WCAG 2.0 ; un reporting précis sera prochainement publié sur le blog du projet. à terme nous aimerions également répondre pleinement aux critères ATAG 2.0.
+L'accessibilité et l'ergonomie sont au cÅur des préoccupations de l'équipe Dotclear. Nous menons régulièrement des analyses avec l'aide dâexpert·e·s et procédons continuellement à des correctifs et améliorations.
+Vous pouvez nous aider en ouvrant des tickets ou en participant au forum . Vous pouvez également participer à des tests utilisateurs ou rejoindre notre équipe !
+L'éditeur de thème vous permet de modifier les fichiers template, les feuilles -de style et les fichiers JavaScript de votre thème en cours d'utilisation.
- -La liste des fichiers est divisée en trois parties :
-Une puce jaune contre le nom de chaque fichier indique que celui-ci fait partie -du thème. Une puce rouge indique qu'il se trouve dans le thème parent. -Une puce noire indique qu'il se trouve dans le thème "default".
- -Si vous modifiez un fichier se trouvant dans le thème "default", celui-ci -sera copié dans votre thème en cours d'utilisation.
- -Pour modifier un fichier, cliquez sur son nom, le contenu s'affichera alors -dans une zone d'édition. Si le fichier peut-être écrit vous pourrez sauvegarder -celui-ci en cliquant sur "enregistrer".
- -Les modifications sont immédiatement appliquées lors de la sauvegarde, soyez -vigilants.
- -Pour éditer vos templates, n'hésitez pas à consultez la -liste des marqueurs -de template.
- - - \ No newline at end of file diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php index bee1ae2..08c0fa9 100644 --- a/locales/fr/main.lang.php +++ b/locales/fr/main.lang.php @@ -1,816 +1,1498 @@ We apologize for this temporary unavailability.Veuillez nous excuser pour cette indisponibilité momentanée.
Merci de votre compréhension.
This either means that the username and password information in your config.php file is incorrect or we can\'t contact the database server at "%s". This could mean your host\'s database server is down.
If you\'re unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.
'] = 'Cela signifie soit que les informations d\'identifiant ou de mot de passe de votre fichier config.php sont incorrects, soit que nous ne pouvons pas contacter le serveur de base de données à l\'adresse "%s". Cela peut vouloir dire que le serveur en question est éteint.
Si vous n\'êtes pas sûr·e de la signification de ces termes, vous devriez probablement contacter votre hébergeur·euse. Si vous avez besoin d\'une aide supplémentaire, vous pouvez vous rendre sur le forum d\'entraide Dotclear.
'; +L10n::$locales['The following error was encountered while trying to read the database:'] = 'L\'erreur suivante a été rencontrée lors de la tentative d\'accès à la base de données :'; +L10n::$locales['Unable to find or initialize class %s'] = 'Impossible de trouver ou d\'initialiser la classe %s'; +L10n::$locales['Title'] = 'Titre'; +L10n::$locales['Blogs'] = 'Blogs'; +L10n::$locales['Back to blogs list'] = 'Retour à la liste des blogs'; +L10n::$locales['Blogs actions'] = 'Actions sur les blogs'; +L10n::$locales['Blog id'] = 'Identifiant du blog'; +L10n::$locales['Blog name'] = 'Nom du blog'; +L10n::$locales['Status'] = 'Ãtat'; +L10n::$locales['Set online'] = 'Mettre en ligne'; +L10n::$locales['Set offline'] = 'Mettre hors-ligne'; +L10n::$locales['Set as removed'] = 'Mettre à l\'état retiré'; +L10n::$locales['Delete'] = 'Supprimer'; +L10n::$locales['No blog selected'] = 'Pas de blog sélectionné'; +L10n::$locales['Selected blogs have been successfully updated.'] = 'Les blogs sélectionnés ont été modifiées.'; +L10n::$locales['Password verification failed'] = 'La vérification du mot de passe a échoué'; +L10n::$locales['The current blog cannot be deleted.'] = 'Le blog courant ne peut être détruit.'; +L10n::$locales['%d blog has been successfully deleted'] = [ + '%d blog a été supprimé', + 'Les %d blogs ont été supprimés', +]; +L10n::$locales['Comments'] = 'Commentaires'; +L10n::$locales['Back to comments list'] = 'Retour à la liste des commentaires'; +L10n::$locales['Comments actions'] = 'Action sur les commentaires'; +L10n::$locales['Author'] = 'Auteur·rice'; +L10n::$locales['Publish'] = 'Publier'; +L10n::$locales['Unpublish'] = 'Mettre hors ligne'; +L10n::$locales['Mark as pending'] = 'Mettre en attente'; +L10n::$locales['Mark as junk'] = 'Mettre en indésirable'; +L10n::$locales['Blocklist IP'] = 'Ajouter en liste de blocage'; +L10n::$locales['Blocklist IP (global)'] = 'Ajouter en liste de blocage (pour tous les blogs)'; +L10n::$locales['IP address'] = 'Adresse IP'; +L10n::$locales['No comment selected'] = 'Aucun commentaire sélectionné.'; +L10n::$locales['Selected comments have been successfully updated.'] = 'Les publications sélectionnées ont été modifiées.'; +L10n::$locales['Selected comments have been successfully deleted.'] = 'Les commentaires sélectionnés ont été supprimés.'; +L10n::$locales['IP addresses for selected comments have been blocklisted.'] = 'Les adresses IP des commentaires sélectionnés ont été ajoutées en liste de blocage.'; +L10n::$locales['Back to entries list'] = 'Retour à la liste des billets'; +L10n::$locales['Posts actions'] = 'Action sur les publications'; +L10n::$locales['Schedule'] = 'Programmer'; +L10n::$locales['First publication'] = 'Première publication'; +L10n::$locales['Never published'] = 'Jamais publié'; +L10n::$locales['Already published'] = 'Déjà publié'; +L10n::$locales['Mark'] = 'Marquer'; +L10n::$locales['Mark as selected'] = 'Sélectionner'; +L10n::$locales['Mark as unselected'] = 'Désélectionner'; +L10n::$locales['Change'] = 'Changer'; +L10n::$locales['Change category'] = 'Changer la catégorie'; +L10n::$locales['Change language'] = 'Changer la langue'; +L10n::$locales['Change author'] = 'Changer l\'auteur·rice'; +L10n::$locales['No entry selected'] = 'Aucune publication sélectionnée'; +L10n::$locales['Published entries cannot be set to scheduled'] = 'Les billets publiés ne peuvent être positionnés au statut programmé'; +L10n::$locales['%d entry has been successfully updated to status : "%s"'] = [ + '%d billet a été positionné au statut "%s"', + '%d billets ont été positionnés au statut "%s"', +]; +L10n::$locales['%d entry has been successfully updated as: "%s"'] = [ + '%d billet a été positionné au statut "%s"', + '%d billets ont été positionnés au statut "%s"', +]; +L10n::$locales['%d entry has been successfully marked as selected'] = [ + '%d billet a été marqué sélectionné', + '%d billets ont été marqués sélectionnés', +]; +L10n::$locales['%d entry has been successfully marked as unselected'] = [ + '%d billet a été marqué désélectionné', + '%d billets ont été marqués désélectionnés', +]; +L10n::$locales['%d entry has been successfully deleted'] = [ + '%d publication a été supprimée', + '%d publications ont été supprimées', +]; +L10n::$locales['(No cat)'] = '(aucune)'; +L10n::$locales['%d entry has been successfully moved to category "%s"'] = [ + '%d billet a été déplacé dans la catégorie "%s"', + '%d billets ont été déplacés dans la catégorie "%s".', +]; +L10n::$locales['Change category for this selection'] = 'Changer la catégorie pour cette sélection'; +L10n::$locales['Category:'] = 'Catégorie :'; +L10n::$locales['Create a new category for the post(s)'] = 'Créer une nouvelle catégorie pour ce(s) billet(s)'; +L10n::$locales['Title:'] = 'Titre :'; +L10n::$locales['Parent:'] = 'Parent :'; +L10n::$locales['Save'] = 'Enregistrer'; +L10n::$locales['This user does not exist'] = 'Cet·te utilisateur·rice n\'existe pas'; +L10n::$locales['%d entry has been successfully set to user "%s"'] = [ + '%d billet a été affecté à l\'utilisateur·rice "%s".', + '%d billets ont été affectés à l\'utilisateur·rice "%s".', +]; +L10n::$locales['Change author for this selection'] = 'Changer l\'auteur·rice pour cette sélection'; +L10n::$locales['New author (author ID):'] = 'Nouvel auteur·rice (identifiant utilisateur·rice) :'; +L10n::$locales['%d entry has been successfully set to language "%s"'] = [ + '%d billet mis à jour avec la langue "%s".', + '%d billets mis à jour avec la langue "%s".', +]; +L10n::$locales['Change language for this selection'] = 'Changer la langue de cette sélection'; +L10n::$locales['Available'] = 'Disponible'; +L10n::$locales['Most used'] = 'Plus utilisées'; +L10n::$locales['Entry language:'] = 'Langue du billet :'; +L10n::$locales['Descending'] = 'Décroissant'; +L10n::$locales['Ascending'] = 'Croissant'; +L10n::$locales['Date'] = 'Date'; +L10n::$locales['Category'] = 'Catégorie'; +L10n::$locales['Selected'] = 'Sélectionné'; +L10n::$locales['Number of comments'] = 'Nombre de commentaires'; +L10n::$locales['Number of trackbacks'] = 'Nombre de rétroliens'; +L10n::$locales['Entry title'] = 'Titre de la publication'; +L10n::$locales['Entry date'] = 'Date de la publication'; +L10n::$locales['Spam filter'] = 'Filtre antispam'; +L10n::$locales['IP'] = 'IP'; +L10n::$locales['Last update'] = 'Dernière mise à jour'; +L10n::$locales['Blog ID'] = 'Identifiant du blog'; +L10n::$locales['Username'] = 'Identifiant'; +L10n::$locales['Last Name'] = 'Nom'; +L10n::$locales['First Name'] = 'Prénom'; +L10n::$locales['Display name'] = 'Pseudonyme'; +L10n::$locales['Number of entries'] = 'Nombre de publications'; +L10n::$locales['My favorites'] = 'Mes favoris'; +L10n::$locales['My preferences'] = 'Mes préférences'; +L10n::$locales['New post'] = 'Nouveau billet'; +L10n::$locales['%d post'] = [ + '%d billet', + '%d billets', +]; +L10n::$locales['%d comment'] = [ + '%d commentaire', + '%d commentaires', +]; +L10n::$locales['Search'] = 'Rechercher'; +L10n::$locales['Categories'] = 'Catégories'; +L10n::$locales['Media manager'] = 'Médiathèque'; +L10n::$locales['Blog settings'] = 'Paramètres du blog'; +L10n::$locales['Blog appearance'] = 'Apparence du blog'; +L10n::$locales['Users'] = 'Utilisateur·rice·s'; +L10n::$locales['Plugins management'] = 'Gestion des plugins'; +L10n::$locales['Languages'] = 'Langues'; +L10n::$locales['Global help'] = 'Aide générale'; +L10n::$locales['Status:'] = 'Ãtat :'; +L10n::$locales['Email:'] = 'Email :'; +L10n::$locales['Web site:'] = 'Site web :'; +L10n::$locales['Author:'] = 'Auteur·rice :'; +L10n::$locales['Type:'] = 'Type :'; +L10n::$locales['Comment'] = 'Commentaire'; +L10n::$locales['Trackback'] = 'Rétrolien'; +L10n::$locales['IP address:'] = 'Adresse IP :'; +L10n::$locales['Media type:'] = 'Type de média :'; +L10n::$locales['image'] = 'image'; +L10n::$locales['text'] = 'texte'; +L10n::$locales['audio'] = 'audio'; +L10n::$locales['video'] = 'vidéo'; +L10n::$locales['Format:'] = 'Format :'; +L10n::$locales['Password:'] = 'Mot de passe :'; +L10n::$locales['With password'] = 'Avec mot de passe'; +L10n::$locales['Without password'] = 'Sans mot de passe'; +L10n::$locales['Selected:'] = 'Sélectionné :'; +L10n::$locales['Not selected'] = 'Non sélectionné'; +L10n::$locales['Attachments:'] = 'Annexes :'; +L10n::$locales['With attachments'] = 'Avec annexe(s)'; +L10n::$locales['Without attachments'] = 'Sans annexes'; +L10n::$locales['Month:'] = 'Mois :'; +L10n::$locales['Lang:'] = 'Langue :'; +L10n::$locales['Comments:'] = 'Commentaires :'; +L10n::$locales['Opened'] = 'Ouverts'; +L10n::$locales['Closed'] = 'Fermés'; +L10n::$locales['Trackbacks:'] = 'Rétroliens :'; +L10n::$locales['Show filters and display options'] = 'Afficher les filtres et options d\'affichage'; +L10n::$locales['Filters'] = 'Filtres'; +L10n::$locales['Display options'] = 'Options d\'affichage'; +L10n::$locales['Order by:'] = 'Trier par :'; +L10n::$locales['Sort:'] = 'Ordre :'; +L10n::$locales['Show'] = 'Afficher'; +L10n::$locales['Save current options'] = 'Sauvegarder ces options'; +L10n::$locales['Apply filters and display options'] = 'Appliquer les filtres et options d\'affichage'; +L10n::$locales['Search:'] = 'Chercher :'; +L10n::$locales['« prev.'] = '« préc.'; +L10n::$locales['next »'] = 'suiv. »'; +L10n::$locales['No blog matches the filter'] = 'Aucun blog correspondant au filtre'; +L10n::$locales['No blog'] = 'Pas de blog'; +L10n::$locales['URL'] = 'URL'; +L10n::$locales['Entries (all types)'] = 'Entrées (tous types)'; +L10n::$locales['%d blog matches the filter.'] = [ + '%d blog correspondant au filtre', + '%d blogs correspondants au filtre', +]; +L10n::$locales['Blogs list'] = 'Liste des blogs'; +L10n::$locales['Legend: '] = 'Légende : '; +L10n::$locales['Edit blog settings for %s'] = 'Modifier les paramètres de %s'; +L10n::$locales['Edit blog settings'] = 'Modifier les paramètres du blog'; +L10n::$locales['Switch to blog %s'] = 'Passer au blog %s'; +L10n::$locales['No comments or trackbacks matches the filter'] = 'aucun commentaire ou rétrolien ne correspond au filtre'; +L10n::$locales['No comments'] = 'Aucun commentaire'; +L10n::$locales['Comment or trackback matching the filter.'] = [ + 'Commentaire ou rétrolien correspondant au filtre.', + 'Liste des %s commentaires ou rétroliens correspondants au filtre.', +]; +L10n::$locales['List of comments and trackbacks (%s)'] = 'Liste des commentaires et rétroliens (%s)'; +L10n::$locales[', published (1)'] = [ + ', publié (1)', + ', publiés (%s)', +]; +L10n::$locales[', spam (1)'] = [ + ', indésirable (1)', + ', indésirables (%s)', +]; +L10n::$locales[', pending (1)'] = [ + ', en attente (1)', + ', en attente (%s)', +]; +L10n::$locales[', unpublished (1)'] = [ + ', non publié (1)', + ', non publiés (%s)', +]; +L10n::$locales['Type'] = 'Type'; +L10n::$locales['Entry'] = 'Billet'; +L10n::$locales['Edit the %1$s from %2$s'] = 'Modifier le %1$s de %2$s'; +L10n::$locales['comment'] = 'commentaire'; +L10n::$locales['trackback'] = 'rétrolien'; +L10n::$locales['Type and author'] = 'Type et auteur·rice'; +L10n::$locales['Edit'] = 'Modifier'; +L10n::$locales['No file matches the filter'] = 'Aucun fichier correspondant au filtre'; +L10n::$locales['No file.'] = 'Aucun fichier.'; +L10n::$locales['%d file matches the filter.'] = [ + '%d fichier correspondant au filtre', + '%d fichiers correspondants au filtre', +]; +L10n::$locales['Nb of items: %d â %d folder(s) + %d file(s)'] = 'Nb d\'éléments : %d â %d dossier(s) + %d fichier(s)'; +L10n::$locales['Nb of items: %d'] = 'Nb d\'éléments : %d'; +L10n::$locales['Name'] = 'Nom :'; +L10n::$locales['Size'] = 'Taille'; +L10n::$locales['Select this file'] = 'Sélectionner ce fichier'; +L10n::$locales['Attach this file to entry'] = 'Attacher ce fichier au billet'; +L10n::$locales['Insert this file into entry'] = 'Insérer ce fichier dans le billet'; +L10n::$locales['delete'] = 'supprimer'; +L10n::$locales['private media'] = 'Média privé'; +L10n::$locales['open'] = 'ouvrir'; +L10n::$locales['No entry matches the filter'] = 'Aucun résultat correspondant au filtre'; +L10n::$locales['No entry'] = 'Pas de résultat'; +L10n::$locales['List of %s entries matching the filter.'] = 'Liste des %s billets correspondant au filtre'; +L10n::$locales['List of entries (%s)'] = 'Liste des billets (%s)'; +L10n::$locales[', programmed (1)'] = [ + ', programmé (1)', + ', programmés (%s)', +]; +L10n::$locales['Trackbacks'] = 'Rétroliens'; +L10n::$locales['Protected'] = 'Protégé'; +L10n::$locales['Attachments'] = 'Annexes'; +L10n::$locales['%d attachment'] = '%d annexe'; +L10n::$locales['%d attachments'] = '%d annexes'; +L10n::$locales['Entries list'] = 'Liste des publications'; +L10n::$locales['No user matches the filter'] = 'Aucun·e utilisateur·rice correspondant·e au filtre'; +L10n::$locales['No user'] = 'Aucun·e utilisateur·rice'; +L10n::$locales['List of %s users match the filter.'] = '%s utilisateur·rice·s correspondent au filtre.'; +L10n::$locales['Users list'] = 'Liste des utilisateur·rice·s'; +L10n::$locales['admin'] = 'administrateur·rice'; +L10n::$locales['superadmin'] = 'Super administrateur·rice'; +L10n::$locales['First page'] = 'Première page'; +L10n::$locales['Previous page'] = 'Page précédente'; +L10n::$locales['Next page'] = 'Page suivante'; +L10n::$locales['Last page'] = 'Dernière page'; +L10n::$locales['Page %s / %s'] = 'Page %s / %s'; +L10n::$locales['Direct access page %s'] = 'Aller à la page : %s'; +L10n::$locales['ok'] = 'ok'; +L10n::$locales['%s file found'] = [ + '%s fichier trouvé', + '%s fichiers trouvés', +]; +L10n::$locales['Blog'] = 'Blog'; +L10n::$locales['System settings'] = 'Réglages système'; +L10n::$locales['Plugins'] = 'Plugins'; +L10n::$locales['Update'] = 'Mise à jour'; +L10n::$locales['other'] = 'autres'; +L10n::$locales['Search in repository:'] = 'Rechercher dans le dépôt :'; +L10n::$locales['OK'] = 'Ok'; +L10n::$locales['Reset search'] = 'réinitialiser la recherche'; +L10n::$locales['Search is allowed on multiple terms longer than 2 chars, terms must be separated by space.'] = 'La recherche est autorisée sur plusieurs mots de 2 caractères minimum, séparés par un espace.'; +L10n::$locales['Found %d result for search "%s":'] = [ + '%d résultat trouvé pour la recherche "%s" :', + '%d résultats trouvés pour la recherche "%s" :', +]; +L10n::$locales['current selection'] = 'sélection courante'; +L10n::$locales['%d result'] = [ + '%d résultat', + '%d résultats', +]; +L10n::$locales['no results'] = 'pas de résultats'; +L10n::$locales['Browse index:'] = 'Parcourir l\'index :'; +L10n::$locales['Plugins list'] = 'Liste des plugins'; +L10n::$locales['Score'] = 'Score'; +L10n::$locales['Version'] = 'Version'; +L10n::$locales['Current version'] = 'Version courante'; +L10n::$locales['Details'] = 'Détails'; +L10n::$locales['Repository'] = 'Dépôt'; +L10n::$locales['Action'] = 'Action'; +L10n::$locales[' (%s)'] = ' (%s)'; +L10n::$locales['This module cannot be disabled nor deleted, since the following modules are also enabled : %s'] = 'Ce module ne peut être désactivé ou supprimé car les modules suivants sont actifs : %s'; +L10n::$locales['This module cannot be enabled, because of the following reasons :'] = 'Ce module ne peut activé pour les raisons suivantes :'; +L10n::$locales['Official repository'] = 'Dépôt officiel'; +L10n::$locales['Third-party repository'] = 'Dépôt alternatif'; +L10n::$locales['Plugin from official distribution'] = 'Plugin de la distribution officielle'; +L10n::$locales['Plugin in development'] = 'Plugin en développement'; +L10n::$locales['Support'] = 'Assistance'; +L10n::$locales['update locked'] = 'mise à jour verrouillée'; +L10n::$locales['Section:'] = 'Section : '; +L10n::$locales['Tags:'] = 'Mots-clés:'; +L10n::$locales['No plugins matched your search.'] = 'Aucun plugin ne correspond à votre recherche.'; +L10n::$locales['Configure plugin'] = 'Configurer le plugin'; +L10n::$locales['Plugin settings (in blog parameters)'] = 'Réglages du plugin (paramètres du blog)'; +L10n::$locales['Plugin settings (in user preferences)'] = 'Réglages du plugin (mes préférences)'; +L10n::$locales['Plugin settings'] = 'Réglages du plugin'; +L10n::$locales['Plugin main page'] = 'Page principale du plugin'; +L10n::$locales['Activate'] = 'Activer'; +L10n::$locales['Deactivate'] = 'Désactiver'; +L10n::$locales['Clone'] = 'Dupliquer'; +L10n::$locales['Install'] = 'Installer'; +L10n::$locales['Activate selected plugins'] = 'Activer les plugins sélectionnés'; +L10n::$locales['Activate all plugins from this list'] = 'Activer tous les plugins de cette liste'; +L10n::$locales['Deactivate selected plugins'] = 'Désactiver les plugins sélectionnés'; +L10n::$locales['Deactivate all plugins from this list'] = 'Désactiver tous les plugins de cette liste'; +L10n::$locales['Update selected plugins'] = 'Mettre à jour les plugins sélectionnés'; +L10n::$locales['Update all plugins from this list'] = 'Mettre à jour tous les plugins de cette liste'; +L10n::$locales['No such plugin.'] = 'Plugin inexistant.'; +L10n::$locales['You don\'t have permissions to delete this plugin.'] = 'Vous n\'avez pas les permissions pour supprimer ce plugin.'; +L10n::$locales['Some plugins have not been delete.'] = 'Certains plugins n\'ont pas pu être supprimés.'; +L10n::$locales['Plugin has been successfully deleted.'] = [ + 'Ce plugin a été supprimé.', + 'Ces plugins ont été supprimés.', +]; +L10n::$locales['Plugin has been successfully installed.'] = [ + 'Ce plugin a été installé.', + 'Ces plugins ont été installés.', +]; +L10n::$locales['Plugin has been successfully activated.'] = [ + 'Ce plugin a été activé.', + 'Ces plugins ont été activés.', +]; +L10n::$locales['Some plugins have not been deactivated.'] = 'Certains plugins n\'ont pas pu être désactivés.'; +L10n::$locales['Plugin has been successfully deactivated.'] = [ + 'Ce plugin a été désactivé.', + 'Ces plugins ont été désactivés.', +]; +L10n::$locales['Plugin has been successfully updated.'] = [ + 'Ce plugin a été mis à jour.', + 'Ces plugins ont été mis à jour.', +]; +L10n::$locales['Following plugins updates are locked: %s'] = 'Les mises à jour de plugins suivantes sont verrouillées : %s'; +L10n::$locales['Unable to move uploaded file.'] = 'Impossible de déplacer le fichier téléchargé.'; +L10n::$locales['The plugin has been successfully updated.'] = 'Ce plugin a été mis à jour.'; +L10n::$locales['The plugin has been successfully installed.'] = 'Ce plugin a été installé.'; +L10n::$locales['Upload a zip file'] = 'Déposer un fichier zip'; +L10n::$locales['Required field'] = 'Champ obligatoire'; +L10n::$locales['Zip file path:'] = 'Chemin du fichier zip :'; +L10n::$locales['Your password:'] = 'Votre mot de passe :'; +L10n::$locales['Password'] = 'Mot de passe'; +L10n::$locales['Upload'] = 'Envoyer'; +L10n::$locales['Download a zip file'] = 'Télécharger un fichier zip'; +L10n::$locales['Zip file URL:'] = 'URL du fichier zip :'; +L10n::$locales['Download'] = 'Télécharger'; +L10n::$locales['Unknown plugin ID'] = 'ID de plugin inconnu'; +L10n::$locales['This plugin has no configuration file.'] = 'Ce plugin n\'a pas de fichier de configuration.'; +L10n::$locales['Insufficient permissions'] = 'Permissions insuffisantes'; +L10n::$locales['Configure "%s"'] = 'Configurer "%s"'; +L10n::$locales['Back'] = 'Retour'; +L10n::$locales['Error:'] = 'Erreur :'; +L10n::$locales['Errors:'] = 'Erreurs :'; +L10n::$locales['%H:%M:%S'] = '%H:%M:%S'; +L10n::$locales['Blog:'] = 'Blog :'; +L10n::$locales['Change blog'] = 'Changer de blog'; +L10n::$locales['Blogs:'] = 'Blogs :'; +L10n::$locales['Go to the content'] = 'Aller au contenu'; +L10n::$locales['Go to the menu'] = 'Aller au menu'; +L10n::$locales['Go to help'] = 'Aller à l\'aide'; +L10n::$locales['My dashboard'] = 'Mon tableau de bord'; +L10n::$locales['Go to site'] = 'Aller sur le site'; +L10n::$locales['Logout %s'] = 'Déconnecter %s'; +L10n::$locales['Hide main menu'] = 'Masquer le menu principal'; +L10n::$locales['Show main menu'] = 'Afficher le menu principal'; +L10n::$locales['Safe mode'] = 'Mode de secours'; +L10n::$locales['You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities'] = 'Vous êtes en mode de secours. Tous les plugins ont été temporairement désactivés. N\'oubliez-pas de vous déconnecter puis de vous reconnecter normalement pour retrouver toutes les fonctionnalités'; +L10n::$locales['Thank you for using %s.'] = 'Merci d\'utiliser %s.'; +L10n::$locales['Page top'] = 'Haut de page'; +L10n::$locales['Go to dashboard'] = 'Mon tableau de bord'; +L10n::$locales['Help about this page'] = 'Aide à propos de cette page'; +L10n::$locales['See also %s'] = 'Voir aussi %s'; +L10n::$locales['the global help'] = 'Aide générale'; +L10n::$locales['uncover'] = 'récupérer'; +L10n::$locales['hide'] = 'cacher'; +L10n::$locales['Need help?'] = 'Besoin d\'aide ?'; +L10n::$locales['new window'] = 'nouvelle fenêtre'; +L10n::$locales['Hide'] = 'Cacher'; +L10n::$locales['Select:'] = 'Sélectionner :'; +L10n::$locales['No selection'] = 'Pas de sélection'; +L10n::$locales['Select all'] = 'Tout sélectionner'; +L10n::$locales['Invert selection'] = 'Inverser la sélection'; +L10n::$locales['Entry has been successfully created.'] = 'Le billet a été créé.'; +L10n::$locales['Edit entry'] = 'Ãditer la publication'; +L10n::$locales['view entry'] = 'Voir la publication'; +L10n::$locales['Are you sure you want to delete selected entries (%s)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les publications sélectionnées (%s) ?'; +L10n::$locales['Are you sure you want to delete selected medias (%d)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les médias sélectionnés (%d) ?'; +L10n::$locales['Are you sure you want to delete selected categories (%s)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les catégories sélectionnées (%s) ?'; +L10n::$locales['Are you sure you want to delete this entry?'] = 'Ãtes-vous certain·e de vouloir supprimer cette publication ?'; +L10n::$locales['Click here to unlock the field'] = 'Cliquez ici pour déverrouiller le champ'; +L10n::$locales['Are you sure you want to delete all spams?'] = 'Ãtes-vous certain·e de vouloir supprimer tous les indésirables ?'; +L10n::$locales['Are you sure you want to delete selected comments (%s)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les commentaires sélectionnés (%s) ?'; +L10n::$locales['Are you sure you want to delete this comment?'] = 'Ãtes-vous certain·e de vouloir supprimer ce commentaire ?'; +L10n::$locales['Users with posts cannot be deleted.'] = 'Une utilisatrice ou un utilisateur avec des publications ne peut être supprimé.'; +L10n::$locales['Are you sure you want to delete selected users (%s)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les utilisatrices et les utilisateurs sélectionnées (%s) ?'; +L10n::$locales['Are you sure you want to delete selected blogs (%s)?'] = 'Ãtes-vous sûr·e de vouloir supprimer les blogs sélectionnés (%s) ?'; +L10n::$locales['Are you sure you want to delete category "%s"?'] = 'Ãtes-vous certain·e de vouloir supprimer la catégorie "%s" ?'; +L10n::$locales['Are you sure you want to reorder all categories?'] = 'Ãtes-vous sûr·e de vouloir réordonner toutes les catégories ?'; +L10n::$locales['Are you sure you want to remove media "%s"?'] = 'Ãtes-vous certain·e de vouloir supprimer le média "%s" ?'; +L10n::$locales['Are you sure you want to remove directory "%s"?'] = 'Ãtes-vous certain·e de vouloir supprimer le répertoire "%s" ?'; +L10n::$locales['Are you sure you want to extract archive in current directory?'] = 'Ãtes-vous certain·e de vouloir extraire cette archive dans le répertoire courant ?'; +L10n::$locales['Are you sure you want to remove attachment "%s"?'] = 'Ãtes-vous certain·e de vouloir supprimer l\'annexe "%s" ?'; +L10n::$locales['Are you sure you want to delete "%s" language?'] = 'Ãtes-vous certain·e de vouloir supprimer la langue "%s" ?'; +L10n::$locales['Are you sure you want to delete "%s" plugin?'] = 'Ãtes-vous certain·e de vouloir supprimer le plugin "%s" ?'; +L10n::$locales['Are you sure you want to delete selected plugins?'] = 'Ãtes-vous sûr·e de vouloir supprimer les plugins sélectionnés ?'; +L10n::$locales['Use this theme'] = 'Utiliser ce thème'; +L10n::$locales['Remove this theme'] = 'Supprimer ce thème'; +L10n::$locales['Are you sure you want to delete "%s" theme?'] = 'Ãtes-vous certain·e de vouloir supprimer le thème "%s" ?'; +L10n::$locales['Are you sure you want to delete selected themes?'] = 'Ãtes-vous sûr·e de vouloir supprimer les thèmes sélectionnés ?'; +L10n::$locales['Are you sure you want to delete this backup?'] = 'Ãtes-vous certain·e de vouloir supprimer cette sauvegarde ?'; +L10n::$locales['Are you sure you want to revert to this backup?'] = 'Ãtes-vous certain·e de vouloir restaurer cette sauvegarde ?'; +L10n::$locales['Zip file content'] = 'Contenu de l\'archive Zip'; +L10n::$locales['HTML markup validator'] = 'Validateur HTML'; +L10n::$locales['HTML content is valid.'] = 'Le contenu HTML est valide.'; +L10n::$locales['There are HTML markup errors.'] = 'Il y a des erreurs de balisage HTML.'; +L10n::$locales['Attention: an audit of a content not yet registered.'] = 'Attention : audit d\'un contenu qui n\'est pas encore enregistré.'; +L10n::$locales['You have unsaved changes. Switch post format will loose these changes. Proceed anyway?'] = 'Vous avez des modifications non enregistrées. Changer le format de publication va perdre ces modifications. Continuer quand même ?'; +L10n::$locales['Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?'] = 'Attention : la modification du format de publication ne convertira pas le contenu existant. Vous devrez appliquer le nouveau format par vous-même. Continuer quand même ?'; +L10n::$locales['Loading enhanced uploader, please wait.'] = 'Chargement de l\'interface améliorée, veuillez patienter.'; +L10n::$locales['Help:'] = 'Aide :'; +L10n::$locales['Hide this notice'] = 'Masquer ce message'; +L10n::$locales['Show password'] = 'Montrer le mot de passe'; +L10n::$locales['Hide password'] = 'Cacher le mot de passe'; +L10n::$locales['Reset to now'] = 'Réinitialiser à maintenant'; +L10n::$locales['An ad blocker has been detected on this Dotclear dashboard (Ghostery, Adblock plus, uBlock origin, â¦) and it may interfere with some features. In this case you should disable it. Note that this detection may be disabled in your preferences.'] = 'Une bloqueur de publicité a été détecté sur ce tableau de bord de Dotclear (Ghostery, Adblock plus, uBlock origin, â¦) et il peut perturber certaines fonctionnalités. Dans ce cas vous devriez le désactiver. Notez que vous pouvez désactiver cette détection dans vos préférences.'; +L10n::$locales['You have unsaved changes.'] = 'Vous avez des modifications non sauvegardées.'; +L10n::$locales['your battery charge seems low (%d%) and you have unsaved changes, you should save them.'] = 'la charge de votre batterie semble faible (%d%) et vous avez des modifications non enregistrées, vous devriez les enregistrer.'; +L10n::$locales['Temporarily activate enhanced uploader'] = 'Activer temporairement l\'interface avancée de la médiathèque'; +L10n::$locales['Temporarily disable enhanced uploader'] = 'Désactiver temporairement l\'interface améliorée'; +L10n::$locales['Limit exceeded.'] = 'La limite est dépassée.'; +L10n::$locales['File size exceeds allowed limit.'] = 'La taille du fichier dépasse la limite autorisée.'; +L10n::$locales['Canceled.'] = 'Annulé.'; +L10n::$locales['HTTP Error:'] = 'Erreur HTTP :'; +L10n::$locales['Choose file'] = 'Choisir un fichier'; +L10n::$locales['Choose files'] = 'Choisir des fichiers'; +L10n::$locales['Cancel'] = 'Annuler'; +L10n::$locales['Clean'] = 'Vider'; +L10n::$locales['Send'] = 'Envoyer'; +L10n::$locales['File successfully uploaded.'] = 'Le fichier a été chargé.'; +L10n::$locales['No file in queue.'] = 'Aucun fichier en attente.'; +L10n::$locales['1 file in queue.'] = '1 fichier en file d\'attente.'; +L10n::$locales['%d files in queue.'] = '%d fichiers dans la file d\'attente.'; +L10n::$locales['Queue error:'] = 'Erreur de file d\'attente :'; +L10n::$locales['Cancel filters and display options'] = 'Annuler les filtres et options d\'affichage'; +L10n::$locales['(%s)'] = '(%s)'; +L10n::$locales['ratio %.1f'] = 'ratio %.1f'; +L10n::$locales['The \'public\' directory does not exist.'] = 'Le répertoire \'public\' n\'existe pas.'; +L10n::$locales['The \'%s\' directory cannot be modified.'] = 'Le répertoire %s ne peut pas être modifié.'; +L10n::$locales['At least one of the following functions is not available: imagecreatetruecolor, imagepng & imagecreatefrompng.'] = 'Au moins une des fonctions suivantes n\'est pas disponible : imagecreatetruecolor, imagepng & imagecreatefrompng.'; +L10n::$locales['Unable to create images.'] = 'Impossible de créer des images.'; +L10n::$locales['Invalid file type.'] = 'Type de fichier invalide.'; +L10n::$locales['An error occurred while writing the file.'] = 'Une erreur est survenue pendant l\'écriture du fichier.'; +L10n::$locales['Uploaded image is not %s pixels wide.'] = 'L\'image envoyée n\'a pas %s pixels de large.'; +L10n::$locales['Score: %s'] = 'Score : %s'; +L10n::$locales['%s screenshot.'] = 'Capture d\'écran de %s.'; +L10n::$locales['by %s'] = 'par %s'; +L10n::$locales['version %s'] = 'version %s'; +L10n::$locales['(current version %s)'] = '(version courante %s)'; +L10n::$locales['(built on "%s")'] = '(basé sur "%s")'; +L10n::$locales['(requires "%s")'] = '(nécessite "%s")'; +L10n::$locales['View stylesheet'] = 'Feuille de style'; +L10n::$locales['Configure theme'] = 'Personnaliser le thème'; +L10n::$locales['No themes matched your search.'] = 'Aucun thème ne correspond à votre recherche.'; +L10n::$locales['Use this one'] = 'Utiliser celui-ci'; +L10n::$locales['Preview'] = 'Prévisualiser'; +L10n::$locales['Update selected themes'] = 'Mettre à jour les thèmes selectionnés'; +L10n::$locales['Update all themes from this list'] = 'Mettre à jour tous les thèmes de cette liste'; +L10n::$locales['No such theme.'] = 'Thème inexistant.'; +L10n::$locales['Theme %s has been successfully selected.'] = 'Le thème %s a été sélectionné.'; +L10n::$locales['Theme has been successfully activated.'] = [ + 'Ce thème a été activé.', + 'Ces thèmes ont été activés.', +]; +L10n::$locales['Some themes have not been deactivated.'] = 'Certains thèmes n\'ont pas pu être désactivés.'; +L10n::$locales['Theme has been successfully deactivated.'] = [ + 'Ce thème a été désactivé.', + 'Ces thèmes ont été désactivés.', +]; +L10n::$locales['Theme has been successfully cloned.'] = [ + 'Ce thème a été dupliqué.', + 'Ces thèmes ont été dupliqués.', +]; +L10n::$locales['You don\'t have permissions to delete this theme.'] = 'Vous n\'avez pas les permissions pour supprimer ce thème.'; +L10n::$locales['Some themes have not been delete.'] = 'Certains thèmes n\'ont pas pu être effacés.'; +L10n::$locales['Theme has been successfully deleted.'] = [ + 'Ce thème a été supprimé.', + 'Ces thèmes ont été supprimés.', +]; +L10n::$locales['Theme has been successfully installed.'] = [ + 'Ce thème a été installé.', + 'Ces thèmes ont été installés.', +]; +L10n::$locales['Theme has been successfully updated.'] = [ + 'Ce thème a été mis à jour.', + 'Ces thèmes ont été mis à jour.', +]; +L10n::$locales['Following themes updates are locked: %s'] = 'Les mises à jour des thèmes suivants sont verrouillées : %s'; +L10n::$locales['The theme has been successfully updated.'] = 'Ce thème a été mis à jour.'; +L10n::$locales['The theme has been successfully installed.'] = 'Ce thème a été installé.'; +L10n::$locales['users per page'] = 'utilisateur·rice·s par page'; +L10n::$locales['entries per page'] = 'billets par page'; +L10n::$locales['comments per page'] = 'commentaires par page'; +L10n::$locales['blogs per page'] = 'blogs par page'; +L10n::$locales['media per page'] = 'médias par page'; +L10n::$locales['results per page'] = 'résultats par page'; +L10n::$locales['Database error'] = 'Erreur de base de données'; +L10n::$locales['There seems to be no Session table in your database. Is Dotclear completly installed?'] = 'Il semble de la table Session n\'existe pas dans votre base de données. Dotclear est-il bien installé correctement ?'; +L10n::$locales['Precondition Failed'] = 'Ãchec de la précondition'; +L10n::$locales['Database problem'] = 'Problème de base de données'; +L10n::$locales['Something went wrong while trying to read the database.'] = 'Un problème s\'est produit lors de la lecture de la base de données.'; +L10n::$locales['Blog is not defined.'] = 'Le blog n\'est pas défini.'; +L10n::$locales['Did you change your Blog ID?'] = 'Avez-vous changé l\'identifiant de votre blog ?'; +L10n::$locales['Blog is offline.'] = 'Le blog est hors ligne.'; +L10n::$locales['This blog is offline. Please try again later.'] = 'Ce blog est hors ligne. Veuillez réessayer plus tard.'; +L10n::$locales['Can\'t create template files.'] = 'Impossible de créer des fichiers modèles.'; +L10n::$locales['Default theme not found.'] = 'Thème par défaut introuvable.'; +L10n::$locales['This either means you removed your default theme or set a wrong theme path in your blog configuration. Please check theme_path value in about:config module or reinstall default theme. ('] = 'Cela signifie que vous avez supprimé votre thème par défaut ou que vous avez défini un mauvais chemin d\'accès au thème dans la configuration de votre blog. Veuillez vérifier la valeur theme_path dans le module about:config ou réinstallez le thème par défaut. ('; +L10n::$locales['Something went wrong while loading template file for your blog.'] = 'Un problème s\'est produit lors du chargement du fichier modèle de votre blog.'; +L10n::$locales['PHP version is %s (%s or earlier needed).'] = 'La version de PHP est %s (%s ou plus récente nécessaire).'; +L10n::$locales['Multibyte string module (mbstring) is not available.'] = 'Le support des chaînes multi-octets (mbstring) n\'est pas disponible.'; +L10n::$locales['Iconv module is not available.'] = 'Le module iconv n\'est pas disponible.'; +L10n::$locales['Output control functions are not available.'] = 'Les fonctions de bufferisation de sortie ne sont pas disponibles.'; +L10n::$locales['SimpleXML module is not available.'] = 'Le module SimpleXML n\'est pas disponible.'; +L10n::$locales['DOM XML module is not available.'] = 'Le module DOM XML n\'est pas disponible.'; +L10n::$locales['PCRE engine does not support UTF-8 strings.'] = 'Le moteur d\'expressions rationnelles PCRE n\'accepte pas les chaînes UTF-8.'; +L10n::$locales['SPL module is not available.'] = 'Le module SPL n\'est pas disponible.'; +L10n::$locales['MySQL version is %s (%s or earlier needed).'] = 'La version de PHP est %s (%s ou plus récente nécessaire).'; +L10n::$locales['MySQL InnoDB engine is not available.'] = 'Le gestionnaire de stockage InnoDB de MySQL n\'est pas disponible.'; +L10n::$locales['PostgreSQL version is %s (%s or earlier needed).'] = 'La version de PHP est %s (%s ou plus récente nécessaire).'; +L10n::$locales['Something went wrong with auto upgrade:'] = 'Une erreur est survenue durant la mise à jour automatique :'; +L10n::$locales['SQL DELETE requires a FROM source'] = 'SQL DELETE requiert une source FROM'; +L10n::$locales['SQL DROP TABLE requires a FROM source'] = 'SQL DROP TABLE requiert une table source'; +L10n::$locales['SQL INSERT requires an INTO source'] = 'SQL INSERT requiert une source INTO'; +L10n::$locales['SQL JOIN requires a FROM source'] = 'SQL JOIN requiert une source'; +L10n::$locales['SQL SELECT requires a FROM source'] = 'SQL SELECT requiert une source FROM'; +L10n::$locales['SQL TRUNCATE TABLE requires a FROM source'] = 'SQL TRUNCATE TABLE requiert une table source'; +L10n::$locales['SQL UPDATE requires a FROM source'] = 'SQL UPDATE requiert une source FROM'; +L10n::$locales['Bad range'] = 'Bornes incorrectes'; +L10n::$locales['Invalid range'] = 'Bornes invalides'; +L10n::$locales['Invalid line number'] = 'Numéro de ligne invalide'; +L10n::$locales['Chunk is out of range'] = 'Le fragment est hors des bornes'; +L10n::$locales['Bad context'] = 'Contexte incorrect'; +L10n::$locales['Bad context (in deletion)'] = 'Contexte incorrect (en suppression)'; +L10n::$locales['Invalid diff format'] = 'Fichier de patch invalide'; +L10n::$locales['Unable to open directory.'] = 'Impossible de lire le répertoire.'; +L10n::$locales['Unable to create directory.'] = 'Impossible de créer le répertoire.'; +L10n::$locales['File is not writable.'] = 'Le fichier n\'est pas accessible en écriture.'; +L10n::$locales['Unable to open file.'] = 'Impossible d\'ouvrir le fichier.'; +L10n::$locales['Not an uploaded file.'] = 'Fichier invalide'; +L10n::$locales['The uploaded file exceeds the maximum file size allowed.'] = 'La taille du fichier envoyé excède la taille maximale autorisée.'; +L10n::$locales['The uploaded file was only partially uploaded.'] = 'Le fichier a été partiellement envoyé.'; +L10n::$locales['No file was uploaded.'] = 'Aucun fichier n\'a été envoyé.'; +L10n::$locales['Missing a temporary folder.'] = 'Un répertoire temporaire est manquant.'; +L10n::$locales['Failed to write file to disk.'] = 'Impossible d\'écrire le fichier sur le disque.'; +L10n::$locales['A PHP extension stopped the file upload.'] = 'Une extension PHP a stoppé l\'envoi du fichier.'; +L10n::$locales['%s is not a directory.'] = '%s n\'est pas un répertoire.'; +L10n::$locales['Can\'t get file path'] = 'Impossible d\'obtenir le chemin d\'accès au fichier'; +L10n::$locales['Can\'t lock a directory'] = 'Impossible de verrouiller un répertoire'; +L10n::$locales['Can\'t call php function named flock'] = 'Impossible d\'appeler la fonction PHP nommée flock'; +L10n::$locales['Can\'t create file'] = 'Impossible de créer un fichier'; +L10n::$locales['Can\'t open file'] = 'Impossible d\'ouvrir le fichier'; +L10n::$locales['Can\'t lock file'] = 'Impossible de verrouiller le fichier'; +L10n::$locales['File cannot be removed.'] = 'Le fichier ne peut être supprimé.'; +L10n::$locales['Not enough memory to open image.'] = 'Pas assez de mémoire pour ouvrir l\'image'; +L10n::$locales['Uploading this file is not allowed.'] = 'L\'envoi de ce fichier n\'est pas autorisé.'; +L10n::$locales['Destination directory is not in jail.'] = 'Le répertoire de destination n\'est pas interdit.'; +L10n::$locales['File already exists.'] = 'Le fichier existe déjà .'; +L10n::$locales['Cannot write in this directory.'] = 'Impossible d\'écrire dans ce répertoire.'; +L10n::$locales['Source file does not exist.'] = 'Le fichier source n\'existe pas.'; +L10n::$locales['File is not in jail.'] = 'Le fichier n\'est pas interdit.'; +L10n::$locales['Destination directory is not writable.'] = 'Le répertoire de destination n\'est pas accessible en écriture.'; +L10n::$locales['Unable to rename file.'] = 'Impossible de renommer le fichier.'; +L10n::$locales['Directory is not in jail.'] = 'Le répertoire n\'est pas interdit.'; +L10n::$locales['Directory cannot be removed.'] = 'Le répertoire ne peut pas être retiré.'; +L10n::$locales['File %s is not compressed in the zip.'] = 'Le fichier %s n\'existe pas dans l\'archive zip.'; +L10n::$locales['Trying to unzip a folder name %s'] = 'Tentative de décompression du dossier %s'; +L10n::$locales['Unable to write destination file.'] = 'Impossible d\'écrire le fichier de destination.'; +L10n::$locales['Unable to write in target directory, permission denied.'] = 'Impossible d\'écrire dans le repertoire de destination, les permissions sont insuffisantes.'; +L10n::$locales['Not enough memory to open file.'] = 'Pas assez de mémoire pour ouvrir le fichier.'; +L10n::$locales['File does not exist'] = 'Le fichier n\'existe pas.'; +L10n::$locales['Cannot read file'] = 'Impossible de lire le fichier'; +L10n::$locales['Directory does not exist'] = 'Le répertoire est inexistant'; +L10n::$locales['Cannot read directory'] = 'Impossible de lire le répertoire'; +L10n::$locales['Did not find closing tag for block%s return a %s status).'] = 'L\'URL du blog ou la méthode de lecture de l\'URL ne semblent pas être bien réglées (%s retourne un statut %s)';
+L10n::$locales['The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed).'] = 'L\'URL du blog ou la méthode de lecture de l\'URL ne semblent pas être bien réglées (%s ne retourne pas un flux ATOM)';
+L10n::$locales['New post URL format:'] = 'Format d\'URL des nouveaux billets :';
+L10n::$locales['Dotclear'] = 'Dotclear';
+L10n::$locales['HTML tag for the title of the notes on the blog:'] = 'Balise HTML pour le titre des notes sur le blog :';
+L10n::$locales['Search engines robots policy'] = 'Paramètres d\'indexation par les moteurs de recherche';
+L10n::$locales['jQuery javascript library'] = 'Bibliothèque javascript jQuery';
+L10n::$locales['Load the jQuery library'] = 'Charger la bibliothèque jQuery';
+L10n::$locales['jQuery version to be loaded for this blog:'] = 'Version de la bibliothèque jQuery à charger pour ce blog :';
+L10n::$locales['Blog security'] = 'Sécurité du blog';
+L10n::$locales['Protect the blog from Clickjacking (see Wikipedia)'] = 'Protéger le blog des détournements de clic ou Clickjacking (voir Wikipedia)';
+L10n::$locales['Plugins parameters'] = 'Paramètres des plugins pour ce blog';
+L10n::$locales['Only superadmin can delete a blog.'] = 'Seul un ou une super-administrateur·rice peut supprimer un blog.';
+L10n::$locales['Users on this blog'] = 'Utilisateur·rice·s de ce blog';
+L10n::$locales['No users'] = 'Aucun utilisateur·rice';
+L10n::$locales['Publications on this blog:'] = 'Publications sur ce blog :';
+L10n::$locales['%1$s: %2$s'] = '%1$s : %2$s';
+L10n::$locales['Permissions:'] = 'Permissions :';
+L10n::$locales['Super administrator'] = 'Super administrateur·rice';
+L10n::$locales['All rights on all blogs.'] = 'Tous les droits sur tous les blogs.';
+L10n::$locales['[%s] (unreferenced permission)'] = '[%s] (permission non référencée)';
+L10n::$locales['All rights on this blog.'] = 'Tous les droits sur ce blog.';
+L10n::$locales['Change permissions'] = 'Changer les permissions';
+L10n::$locales['The following themes have been disabled :'] = 'Les thèmes suivants ont été désactivés :';
+L10n::$locales['Theme configuration'] = 'Personnaliser ce thème';
+L10n::$locales['Themes management'] = 'Gestion des thèmes';
+L10n::$locales['Official repository could not be updated as there is no URL set in configuration.'] = 'Le dépôt officiel n\'a pas pu être mis à jour car il n\'y a pas d\'URL définie dans la configuration.';
+L10n::$locales['Manual checking of themes update done successfully.'] = 'La vérification manuelle de mise à jour des thèmes a été effectuée.';
+L10n::$locales['Force checking update of themes'] = 'Forcer la vérification de mise à jour des thèmes';
+L10n::$locales['Update themes'] = 'Mettre à jour les thèmes';
+L10n::$locales['There is one theme to update available from repository.'] = [
+ 'Il y a un thème à mettre à jour depuis le dépôt.',
+ 'Il y a %s thèmes à mettre à jour depuis le dépôt.',
+];
+L10n::$locales['Visit %s repository, the resources center for Dotclear.'] = 'Visitez le dépôt %s, le centre de ressources pour Dotclear';
+L10n::$locales['Installed themes'] = 'Thèmes installés';
+L10n::$locales['Activated themes'] = 'Thèmes activés';
+L10n::$locales['(in normal mode)'] = '(en mode normal)';
+L10n::$locales['You can configure and manage installed themes from this list.'] = 'Vous pouvez configurer et gérer les thèmes de cette liste.';
+L10n::$locales['Deactivated themes'] = 'Thèmes désactivés';
+L10n::$locales['Deactivated themes are installed but not usable. You can activate them from here.'] = 'Les thèmes désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page.';
+L10n::$locales['Add themes'] = 'Ajouter des thèmes';
+L10n::$locales['Add themes from repository'] = 'Ajouter des thèmes depuis le dépôt';
+L10n::$locales['Install or upgrade manually'] = 'Installer ou mettre à jour manuellement';
+L10n::$locales['Add themes from a package'] = 'Ajouter des thèmes depuis un package';
+L10n::$locales['You can install themes by uploading or downloading zip files.'] = 'Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip.';
+L10n::$locales['Some functions are disabled, please give write access to your themes directory to enable them.'] = 'Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de thèmes pour les activer.';
+L10n::$locales['List of blogs'] = 'Liste des blogs';
+L10n::$locales['Create a new blog'] = 'Créer un nouveau blog';
+L10n::$locales['Actions'] = 'Actions';
+L10n::$locales['Selected blogs action:'] = 'Action sur les blogs sélectionnés :';
+L10n::$locales['Please give your password to confirm blog(s) deletion:'] = 'Veuillez indiquer votre mot de passe pour confirmer la suppression du ou des blogs :';
+L10n::$locales['This category does not exist.'] = 'Cette catégorie n\'existe pas.';
+L10n::$locales['The category "%s" has been successfully deleted.'] = 'La catégorie "%s" a été supprimée.';
+L10n::$locales['Category where to move entries does not exist'] = 'La catégorie où les publications seront déplacées n\'existe pas.';
+L10n::$locales['The entries have been successfully moved to category "%s"'] = 'Les billets ont été déplacés dans la catégorie "%s".';
+L10n::$locales['Categories have been successfully reordered.'] = 'Les catégories ont été réordonnées.';
+L10n::$locales['Categories order has been successfully reset.'] = 'Les catégories ont été réordonnées par défaut.';
+L10n::$locales['The category has been successfully removed.'] = 'La catégorie a été supprimée.';
+L10n::$locales['Entries have been successfully moved to the category you choose.'] = 'Les publications ont été déplacés dans la catégorie choisie.';
+L10n::$locales['New category'] = 'Nouvelle catégorie';
+L10n::$locales['No category so far.'] = 'Pas de catégorie pour le moment.';
+L10n::$locales['%d entries'] = '%d publications';
+L10n::$locales['%d entry'] = '%d publication';
+L10n::$locales['total:'] = 'total :';
+L10n::$locales['URL:'] = 'URLÂ :';
+L10n::$locales['Move entries to'] = 'Déplacer les publications vers';
+L10n::$locales['Delete category'] = 'Supprimer la catégorie';
+L10n::$locales['To rearrange categories order, move items by drag and drop, then click on âSave categories orderâ button.'] = 'Pour modifier l\'ordre des catégories, déplacez les items par glisser-déposer puis cliquez sur le bouton "Enregistrer l\'ordre des catégories".';
+L10n::$locales['Save categories order'] = 'Enregistrer l\'ordre des catégories';
+L10n::$locales['Reorder all categories on the top level'] = 'Replacer toutes les catégories au premier niveau';
+L10n::$locales['Top level'] = 'Premier niveau';
+L10n::$locales['The category has been successfully moved'] = 'La catégorie a été déplacée.';
+L10n::$locales['The category has been successfully updated.'] = 'La catégorie a été mise à jour.';
+L10n::$locales['The category "%s" has been successfully created.'] = 'La catégorie "%s" a été créée.';
+L10n::$locales['Category has been successfully updated.'] = 'La catégorie a été mise à jour.';
+L10n::$locales['Category information'] = 'Détails de la catégorie';
+L10n::$locales['Name:'] = 'Nom :';
+L10n::$locales['Warning: If you set the URL manually, it may conflict with another category.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec une autre catégorie.';
+L10n::$locales['Description:'] = 'Description :';
+L10n::$locales['Move this category'] = 'Déplacer cette catégorie';
+L10n::$locales['Category parent'] = 'Catégorie parente';
+L10n::$locales['Category sibling'] = 'Catégorie voisine';
+L10n::$locales['Move current category'] = 'Déplacer la catégorie';
+L10n::$locales['before'] = 'avant';
+L10n::$locales['after'] = 'après';
+L10n::$locales['position: '] = 'position : ';
+L10n::$locales['Entry does not exist.'] = 'Cette publication n\'existe pas.';
+L10n::$locales['Comment has been successfully created.'] = 'Le commentaire a été créé.';
+L10n::$locales['Comment has been successfully updated.'] = 'Le commentaire a été mis à jour.';
+L10n::$locales['Comment has been successfully deleted.'] = 'Le commentaire a été effacé.';
+L10n::$locales['You can\'t edit this comment.'] = 'Vous ne pouvez pas modifier ce commentaire.';
+L10n::$locales['Edit comment'] = 'Modifier le commentaire';
+L10n::$locales['Your comment on my blog %s'] = 'Votre commentaire sur mon blog %s';
+L10n::$locales['Hi!
+You wrote a comment on:
+%s
-$GLOBALS['__l10n']['Dotclear has been upgraded.'] = 'Dotclear a été mis à jour.';
-$GLOBALS['__l10n']['Password reset'] = 'Réinitialisation du mot de passe';
-$GLOBALS['__l10n']['Someone has requested to reset the password for the following site and username.'] = 'Quelqu\'un a demandé la réinitialisation du mot de passe pour le site et l\'utilisateur suivants.';
-$GLOBALS['__l10n']['Username:'] = 'Nom d\'utilisateur :';
-$GLOBALS['__l10n']['To reset your password visit the following address, otherwise just ignore this email and nothing will happen.'] = 'Pour réinitialiser votre mot de passe, rendez-vous à l\'adresse suivante. Sinon ignorez simplement ce message et rien ne se passera.';
-$GLOBALS['__l10n']['The e-mail was sent successfully to %s.'] = 'Le message a été envoyé avec succès à %s.';
-$GLOBALS['__l10n']['Your new password'] = 'Votre nouveau mot de passe';
-$GLOBALS['__l10n']['Password:'] = 'Mot de passe :';
-$GLOBALS['__l10n']['Your new password is in your mailbox.'] = 'Votre nouveau mot de passe est dans votre boîte à lettres.';
-$GLOBALS['__l10n']['Wrong username or password'] = 'Nom d\'utilisateur ou mot de passe incorrect';
-$GLOBALS['__l10n']['Back to login screen'] = 'Retour à l\'écran de connexion';
-$GLOBALS['__l10n']['Request a new password'] = 'Demander un nouveau mot de passe';
-$GLOBALS['__l10n']['Email:'] = 'Email :';
-$GLOBALS['__l10n']['recover'] = 'récupérer';
-$GLOBALS['__l10n']['Remember my ID on this computer'] = 'Se souvenir de mon identifiant sur cet ordinateur';
-$GLOBALS['__l10n']['login'] = 'login';
-$GLOBALS['__l10n']['You must accept cookies in order to use the private area.'] = 'Vous devez accepter les cookies pour utiliser l\'interface privée.';
-$GLOBALS['__l10n']['I forgot my password'] = 'J\'ai oublié mon mot de passe';
-$GLOBALS['__l10n']['New blog'] = 'Nouveau blog';
-$GLOBALS['__l10n']['Blogs'] = 'Blogs';
-$GLOBALS['__l10n']['Blog details'] = 'Informations du blog';
-$GLOBALS['__l10n']['Blog ID:'] = 'Identifiant du blog :';
-$GLOBALS['__l10n']['Required field'] = 'Champ obligatoire';
-$GLOBALS['__l10n']['At least 2 characters using letters, numbers or symbols.'] = 'Au moins 2 caractères, composés de lettres non accentuées, chiffres ou symboles.';
-$GLOBALS['__l10n']['Please note that changing your blog ID may require changes in your public index.php file.'] = 'Veuillez noter que changer l\'identifiant de votre blog peut nécessiter des changements dans votre fichier index.php public.';
-$GLOBALS['__l10n']['Blog name:'] = 'Nom du blog :';
-$GLOBALS['__l10n']['Blog URL:'] = 'URL du blog :';
-$GLOBALS['__l10n']['Blog description:'] = 'Description du blog :';
-$GLOBALS['__l10n']['save'] = 'enregistrer';
-$GLOBALS['__l10n']['No such blog ID'] = 'Identifiant de blog inconnu';
-$GLOBALS['__l10n']['Password verification failed'] = 'La vérification du mot de passe a échoué';
-$GLOBALS['__l10n']['Delete a blog'] = 'Supprimer un blog';
-$GLOBALS['__l10n']['Warning'] = 'Attention';
-$GLOBALS['__l10n']['You are about to delete the blog %s. Every entry, comment and category will be deleted.'] = 'Vous êtes sur le point de supprimer le blog %s. Tous ses billets, commentaires et catégories seront supprimés.';
-$GLOBALS['__l10n']['Please give your password to confirm the blog deletion.'] = 'Veuillez indiquer votre mot de passe pour confirmer la suppression du blog.';
-$GLOBALS['__l10n']['Your password:'] = 'Votre mot de passe :';
-$GLOBALS['__l10n']['Delete this blog'] = 'Supprimer ce blog';
-$GLOBALS['__l10n']['No given blog id.'] = 'Pas d\'identifiant de blog.';
-$GLOBALS['__l10n']['No such blog.'] = 'Blog inexistant.';
-$GLOBALS['__l10n']['year/month/day/title'] = 'année/mois/jour/titre';
-$GLOBALS['__l10n']['year/month/title'] = 'année/mois/titre';
-$GLOBALS['__l10n']['year/title'] = 'année/titre';
-$GLOBALS['__l10n']['title'] = 'titre';
-$GLOBALS['__l10n']['Title'] = 'Titre';
-$GLOBALS['__l10n']['Title, Date'] = 'Titre, date';
-$GLOBALS['__l10n']['Title, Country, Date'] = 'Titre, pays, date';
-$GLOBALS['__l10n']['Title, City, Country, Date'] = 'Titre, ville, pays, date';
-$GLOBALS['__l10n']['I would like search engines and archivers to index and archive my blog\'s content.'] = 'Je souhaite que mon blog soit indexé et archivé par les moteurs de recherche et archiveurs.';
-$GLOBALS['__l10n']['I would like search engines and archivers to index but not archive my blog\'s content.'] = 'Je souhaite que mon blog soit indexé mais pas archivé par les moteurs de recherche et archiveurs.';
-$GLOBALS['__l10n']['I would like to prevent search engines and archivers from indexing or archiving my blog\'s content.'] = 'Je souhaite que mon blog ne soit ni indexé ni archivé par les moteurs de recherche et archiveurs.';
-$GLOBALS['__l10n']['Invalid language code'] = 'Code langue invalide';
-$GLOBALS['__l10n']['Blog settings'] = 'Paramètres du blog';
-$GLOBALS['__l10n']['Blog has been successfully created.'] = 'Blog créé avec succès.';
-$GLOBALS['__l10n']['Blog has been successfully updated.'] = 'Blog mis à jour avec succès.';
-$GLOBALS['__l10n']['Parameters'] = 'Paramètres';
-$GLOBALS['__l10n']['URL scan method:'] = 'Méthode de lecture de l\'URL';
-$GLOBALS['__l10n']['Blog status:'] = 'Ãtat du blog';
-$GLOBALS['__l10n']['Blog configuration'] = 'Configuration du blog';
-$GLOBALS['__l10n']['Blog editor name:'] = 'Nom de l\'éditeur du blog :';
-$GLOBALS['__l10n']['Default language:'] = 'Langue par défaut :';
-$GLOBALS['__l10n']['Blog timezone:'] = 'Fuseau horaire du blog :';
-$GLOBALS['__l10n']['Copyright notice:'] = 'Note de copyright :';
-$GLOBALS['__l10n']['New post URL format:'] = 'Format d\'URL des nouveaux billets :';
-$GLOBALS['__l10n']['Enable XML/RPC interface'] = 'Activer l\'interface XML/RPC';
-$GLOBALS['__l10n']['more information'] = 'plus d\'informations';
-$GLOBALS['__l10n']['Comments and trackbacks'] = 'Commentaires et rétroliens';
-$GLOBALS['__l10n']['Accept comments'] = 'Accepter les commentaires';
-$GLOBALS['__l10n']['Moderate comments'] = 'Modérer les commentaires';
-$GLOBALS['__l10n']['Leave comments open for %s days'] = 'Laisser les commentaires ouverts durant %s jours';
-$GLOBALS['__l10n']['Leave blank to disable this feature.'] = 'Laissez vide pour annuler ce comportement.';
-$GLOBALS['__l10n']['Wiki syntax for comments'] = 'Syntaxe wiki pour les commentaires';
-$GLOBALS['__l10n']['Accept trackbacks'] = 'Accepter les rétroliens';
-$GLOBALS['__l10n']['Moderate trackbacks'] = 'Modérer les rétroliens';
-$GLOBALS['__l10n']['Leave trackbacks open for %s days'] = 'Laisser les rétroliens ouverts durant %s jours';
-$GLOBALS['__l10n']['Add "nofollow" relation on comments and trackbacks links'] = 'Ajouter la relation "nofollow" aux liens des commentaires et rétroliens';
-$GLOBALS['__l10n']['Blog presentation'] = 'Présentation du blog';
-$GLOBALS['__l10n']['Date format:'] = 'Format des dates :';
-$GLOBALS['__l10n']['Time format:'] = 'Format des heures :';
-$GLOBALS['__l10n']['Display smilies on entries and comments'] = 'Afficher des émoticones dans les billets et commentaires';
-$GLOBALS['__l10n']['Display %s entries per page'] = 'Afficher %s billets par page';
-$GLOBALS['__l10n']['Display %s entries per feed'] = 'Afficher %s billets par flux de syndication';
-$GLOBALS['__l10n']['Display %s comments per feed'] = 'Afficher %s commentaires par flux de syndication';
-$GLOBALS['__l10n']['Truncate feeds'] = 'Tronquer les flux de syndication';
-$GLOBALS['__l10n']['Media and images'] = 'Médias et images';
-$GLOBALS['__l10n']['Generated image sizes (in pixels)'] = 'Tailles des images générées (en pixels)';
-$GLOBALS['__l10n']['Thumbnails:'] = 'Miniatures :';
-$GLOBALS['__l10n']['Small:'] = 'Petites :';
-$GLOBALS['__l10n']['Medium:'] = 'Moyennes :';
-$GLOBALS['__l10n']['Inserted image title'] = 'Titres des images insérées';
-$GLOBALS['__l10n']['This defines image tag title when you insert it in a post from the media manager. It is retrieved from the picture\'s metadata.'] = 'Ceci définit le titre de la balise d\'une image insérée depuis le gestionnaire de media. Les informations sont obtenues depuis les métadonnées de l\'image.';
-$GLOBALS['__l10n']['Search engines robots policy'] = 'Paramètres d\'indexation par les moteurs de recherche';
-$GLOBALS['__l10n']['XML/RPC interface'] = 'Interface XML/RPC';
-$GLOBALS['__l10n']['XML/RPC interface allows you to edit your blog with an external client.'] = 'L\'interface XML/RPC vous permet de publier sur votre blog avec un client externe.';
-$GLOBALS['__l10n']['XML/RPC interface is not active. Change settings to enable it.'] = 'L\'interface XML/RPC n\'est pas active. Changez vos paramètres pour l\'activer.';
-$GLOBALS['__l10n']['XML/RPC interface is active. You should set the following parameters on your XML/RPC client:'] = 'L\'interface XML/RPC est active. Vous êtes invités à indiquer les paramètres suivants dans votre client XML/RPC :';
-$GLOBALS['__l10n']['Server URL:'] = 'URL du serveur :';
-$GLOBALS['__l10n']['Blogging system:'] = 'Système de blog :';
-$GLOBALS['__l10n']['User name:'] = 'Nom d\'utilisateur :';
-$GLOBALS['__l10n']['your password'] = 'votre mot de passe';
-$GLOBALS['__l10n']['Users'] = 'Utilisateurs';
-$GLOBALS['__l10n']['Users on this blog'] = 'Utilisateurs de ce blog';
-$GLOBALS['__l10n']['No users'] = 'Aucun utilisateur';
-$GLOBALS['__l10n']['change permissions'] = 'changer les permissions';
-$GLOBALS['__l10n']['Super administrator'] = 'Super administrateur';
-$GLOBALS['__l10n']['You can\'t remove default theme.'] = 'Vous ne pouvez pas supprimer le thème par défaut.';
-$GLOBALS['__l10n']['Theme does not exist.'] = 'Ce thème n\'existe pas.';
-$GLOBALS['__l10n']['Unable to move uploaded file.'] = 'Impossible de déplacer le fichier téléchargé.';
-$GLOBALS['__l10n']['An error occurred while downloading the file.'] = 'Une erreur est survenue lors du téléchargement du fichier.';
-$GLOBALS['__l10n']['by %s'] = 'par %s';
-$GLOBALS['__l10n']['version %s'] = 'version %s';
-$GLOBALS['__l10n']['(built on "%s")'] = '(basé sur "%s")';
-$GLOBALS['__l10n']['(requires "%s")'] = '(nécessite "%s")';
-$GLOBALS['__l10n']['Stylesheet'] = 'Feuille de style';
-$GLOBALS['__l10n']['Theme configuration'] = 'Configuration du thème';
-$GLOBALS['__l10n']['Blog themes'] = 'Thèmes du blog';
-$GLOBALS['__l10n']['Blog aspect'] = 'Apparence du blog';
-$GLOBALS['__l10n']['Theme has been successfully changed.'] = 'Thème changé avec succès.';
-$GLOBALS['__l10n']['Theme has been successfully installed.'] = 'Le thème a été installé avec succès.';
-$GLOBALS['__l10n']['Theme has been successfully upgraded'] = 'Le thème a été mis à jour avec succès.';
-$GLOBALS['__l10n']['Theme has been successfully deleted.'] = 'Le thème a été supprimé avec succès.';
-$GLOBALS['__l10n']['You can find additional themes for your blog on %s.'] = 'Vous pouvez trouver de nouveaux thèmes pour votre blog sur %s.';
-$GLOBALS['__l10n']['To install or upgrade a theme you generally just need to upload it in "Install or upgrade a theme" section.'] = 'Tout ce que vous avez à faire pour installer ou mettre à jour un thème est généralement de le déposer dans la section "Installer ou mettre à jour un thème".';
-$GLOBALS['__l10n']['Themes'] = 'Thèmes';
-$GLOBALS['__l10n']['You are currently using "%s"'] = 'Vous utilisez actuellement "%s"';
-$GLOBALS['__l10n']['use selected theme'] = 'utiliser le thème sélectionné';
-$GLOBALS['__l10n']['delete selected theme'] = 'Supprimer le thème sélectionné';
-$GLOBALS['__l10n']['Install or upgrade a theme'] = 'Installer ou mettre à jour un thème';
-$GLOBALS['__l10n']['You can install themes by uploading or downloading zip files.'] = 'Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip.';
-$GLOBALS['__l10n']['Upload a zip file'] = 'Déposer un fichier zip';
-$GLOBALS['__l10n']['Theme zip file:'] = 'Fichier zip du thème :';
-$GLOBALS['__l10n']['Upload theme'] = 'Déposer un thème';
-$GLOBALS['__l10n']['Download a zip file'] = 'Télécharger un fichier zip';
-$GLOBALS['__l10n']['Theme zip file URL:'] = 'URL du fichier zip du thème :';
-$GLOBALS['__l10n']['Download theme'] = 'Télécharger le thème';
-$GLOBALS['__l10n']['To enable this function, please give write access to your themes directory.'] = 'Pour activer cette fonction, donnez un accès en écriture à votre répertoire de thèmes.';
-$GLOBALS['__l10n']['back'] = 'retour';
-$GLOBALS['__l10n']['Last update'] = 'Dernière mise à jour';
-$GLOBALS['__l10n']['Blog name'] = 'Nom du blog';
-$GLOBALS['__l10n']['Blog ID'] = 'Identifiant du blog';
-$GLOBALS['__l10n']['Descending'] = 'Décroissant';
-$GLOBALS['__l10n']['Ascending'] = 'Croissant';
-$GLOBALS['__l10n']['List of blogs'] = 'Liste des blogs';
-$GLOBALS['__l10n']['Blog has been successfully deleted.'] = 'Blog supprimé avec succès.';
-$GLOBALS['__l10n']['Create a new blog'] = 'Créer un nouveau blog';
-$GLOBALS['__l10n']['Filters'] = 'Filtres';
-$GLOBALS['__l10n']['Order by:'] = 'Trier par :';
-$GLOBALS['__l10n']['Sort:'] = 'Trier :';
-$GLOBALS['__l10n']['Search:'] = 'Chercher :';
-$GLOBALS['__l10n']['Blogs per page'] = 'Blogs par page';
-$GLOBALS['__l10n']['filter'] = 'filtre';
-$GLOBALS['__l10n']['No blog'] = 'Pas de blog';
-$GLOBALS['__l10n']['Page(s)'] = 'Page(s)';
-$GLOBALS['__l10n']['Entries'] = 'Billets';
-$GLOBALS['__l10n']['Status'] = 'Ãtat';
-$GLOBALS['__l10n']['Edit blog %s'] = 'Modifier le blog %s';
-$GLOBALS['__l10n']['edit'] = 'modifier';
-$GLOBALS['__l10n']['Switch to blog %s'] = 'Passer au blog %s';
-$GLOBALS['__l10n']['This category does not exist.'] = 'Cette catégorie n\'existe pas.';
-$GLOBALS['__l10n']['Categories'] = 'Catégories';
-$GLOBALS['__l10n']['The category has been successfully created.'] = 'Catégorie créée avec succès.';
-$GLOBALS['__l10n']['The category has been successfully removed.'] = 'Catégorie supprimée avec succès.';
-$GLOBALS['__l10n']['Categories have been successfully reordered.'] = 'Catégories réordonnées avec succès.';
-$GLOBALS['__l10n']['The category has been successfully moved.'] = 'Catégorie déplacée avec succès.';
-$GLOBALS['__l10n']['No category yet.'] = 'Pas encore de catégorie.';
-$GLOBALS['__l10n']['Categories list'] = 'Liste des catégories';
-$GLOBALS['__l10n']['%d entries'] = '%d billets';
-$GLOBALS['__l10n']['%d entry'] = '%d billet';
-$GLOBALS['__l10n']['total:'] = 'total :';
-$GLOBALS['__l10n']['URL:'] = 'URLÂ :';
-$GLOBALS['__l10n']['Add a new category'] = 'Créer une nouvelle catégorie';
-$GLOBALS['__l10n']['Title:'] = 'Titre :';
-$GLOBALS['__l10n']['Parent:'] = 'Parent :';
-$GLOBALS['__l10n']['Top level'] = 'Premier niveau';
-$GLOBALS['__l10n']['Save'] = 'Enregistrer';
-$GLOBALS['__l10n']['Remove a category'] = 'Supprimer une catégorie';
-$GLOBALS['__l10n']['Choose a category to remove:'] = 'Choisissez une catégorie à supprimer :';
-$GLOBALS['__l10n']['ok'] = 'ok';
-$GLOBALS['__l10n']['Reorder categories'] = 'Réordonner les catégories';
-$GLOBALS['__l10n']['This will relocate all categories on the top level'] = 'Ceci va déplacer toutes les catégories au premier niveau';
-$GLOBALS['__l10n']['Reorder'] = 'Réordonner';
-$GLOBALS['__l10n']['New category'] = 'Nouvelle catégorie';
-$GLOBALS['__l10n']['Category has been successfully updated.'] = 'Catégorie mise à jour avec succès.';
-$GLOBALS['__l10n']['Category information'] = 'Détails de la catégorie';
-$GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another category.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec une autre catégorie.';
-$GLOBALS['__l10n']['Description:'] = 'Description :';
-$GLOBALS['__l10n']['Move this category'] = 'Déplacer cette catégorie';
-$GLOBALS['__l10n']['Category parent'] = 'Catégorie parente';
-$GLOBALS['__l10n']['Category sibling'] = 'Catégorie voisine';
-$GLOBALS['__l10n']['Move current category'] = 'Déplacer la catégorie';
-$GLOBALS['__l10n']['after'] = 'après';
-$GLOBALS['__l10n']['before'] = 'avant';
-$GLOBALS['__l10n']['Entry does not exist.'] = 'Ce billet n\'existe pas.';
-$GLOBALS['__l10n']['No comment'] = 'Aucun commentaire';
-$GLOBALS['__l10n']['You can\'t edit this comment.'] = 'Vous ne pouvez pas modifier ce commentaire.';
-$GLOBALS['__l10n']['Edit comment'] = 'Modifier le commentaire';
-$GLOBALS['__l10n']['Comment has been successfully updated.'] = 'Commentaire mis à jour avec succès.';
-$GLOBALS['__l10n']['Your comment on my blog %s'] = 'Votre commentaire sur mon blog %s';
-$GLOBALS['__l10n']['Hi!
-You wrote a comment on:
-%s'] = 'Bonjour,
+'] = 'Bonjour,
+
+Vous avez déposé un commentaire sur :
+%s
+
-Vous avez déposé un commentaire sur
-%s';
-$GLOBALS['__l10n']['Send an e-mail'] = 'Envoyer un email';
-$GLOBALS['__l10n']['Back to "%s"'] = 'Retour à "%s"';
-$GLOBALS['__l10n']['IP address:'] = 'Adresse IPÂ :';
-$GLOBALS['__l10n']['Date:'] = 'Date :';
-$GLOBALS['__l10n']['Author:'] = 'Auteur :';
-$GLOBALS['__l10n']['Web site:'] = 'Site web :';
-$GLOBALS['__l10n']['Status:'] = 'Ãtat :';
-$GLOBALS['__l10n']['Comment:'] = 'Commentaire :';
-$GLOBALS['__l10n']['delete'] = 'supprimer';
-$GLOBALS['__l10n']['comment'] = 'commentaire';
-$GLOBALS['__l10n']['trackback'] = 'rétrolien';
-$GLOBALS['__l10n']['Date'] = 'Date';
-$GLOBALS['__l10n']['Entry title'] = 'Titre du billet';
-$GLOBALS['__l10n']['Author'] = 'Auteur';
-$GLOBALS['__l10n']['publish'] = 'publier';
-$GLOBALS['__l10n']['unpublish'] = 'hors ligne';
-$GLOBALS['__l10n']['mark as pending'] = 'en attente';
-$GLOBALS['__l10n']['mark as junk'] = 'indésirable';
-$GLOBALS['__l10n']['Comments'] = 'Commentaires';
-$GLOBALS['__l10n']['Type:'] = 'Type :';
-$GLOBALS['__l10n']['Comments per page'] = 'Commentaires par page';
-$GLOBALS['__l10n']['Comment author:'] = 'Auteur du commentaire :';
-$GLOBALS['__l10n']['You have one spam comments.'] = 'Vous avez un commentaire indésirable.';
-$GLOBALS['__l10n']['Show it.'] = 'L\'afficher';
-$GLOBALS['__l10n']['You have %s spam comments.'] = 'Vous avez %s commentaires indésirables.';
-$GLOBALS['__l10n']['Show them.'] = 'Les afficher.';
-$GLOBALS['__l10n']['Selected comments action:'] = 'Action sur les commentaires sélectionnés :';
-$GLOBALS['__l10n']['%d comment'] = '%d commentaire';
-$GLOBALS['__l10n']['%d comments'] = '%d commentaires';
-$GLOBALS['__l10n']['New entry'] = 'Nouveau billet';
-$GLOBALS['__l10n']['User preferences'] = 'Préférences utilisateur';
-$GLOBALS['__l10n']['Documentation'] = 'Documentation';
-$GLOBALS['__l10n']['Latest news'] = 'Actualités';
-$GLOBALS['__l10n']['Dashboard'] = 'Tableau de bord';
-$GLOBALS['__l10n']['Make this blog my default blog'] = 'Définir comme blog par défaut';
-$GLOBALS['__l10n']['This blog is offline'] = 'Ce blog est hors ligne';
-$GLOBALS['__l10n']['This blog is removed'] = 'Ce blog est supprimé';
-$GLOBALS['__l10n']['DC_ADMIN_URL is not defined, you should edit your configuration file.'] = 'DC_ADMIN_URL n\'est pas défini, vous devriez corriger votre fichier de configuration.';
-$GLOBALS['__l10n']['Following plugins have been installed:'] = 'Les extensions suivantes ont été installés :';
-$GLOBALS['__l10n']['Following plugins have not been installed:'] = 'Les extensions suivantes suivants n\'ont pas été installés :';
-$GLOBALS['__l10n']['Quick entry'] = 'Billet rapide';
-$GLOBALS['__l10n']['Content:'] = 'Contenu :';
-$GLOBALS['__l10n']['Category:'] = 'Catégorie :';
-$GLOBALS['__l10n']['save and publish'] = 'enregister et publier';
-$GLOBALS['__l10n']['Dotclear %s is available!'] = 'Dotclear %s est disponible !';
-$GLOBALS['__l10n']['Upgrade now'] = 'Mettre à jour maintenant';
-$GLOBALS['__l10n']['Remind me later'] = 'Me le rappeler plus tard';
-$GLOBALS['__l10n']['PHP version is %s (5.0 or earlier needed).'] = 'La version de PHP est %s (5.0 ou plus récent nécessaire.)';
-$GLOBALS['__l10n']['Multibyte string module (mbstring) is not available.'] = 'Le support des chaînes multi-octets (mbstring) n\'est pas disponible.';
-$GLOBALS['__l10n']['Iconv module is not available.'] = 'Le module iconv n\'est pas disponible.';
-$GLOBALS['__l10n']['Output control functions are not available.'] = 'Les fonctions de bufferisation de sortie ne sont pas disponibles.';
-$GLOBALS['__l10n']['SimpleXML module is not available.'] = 'Le module SimpleXML n\'est pas disponible.';
-$GLOBALS['__l10n']['DOM XML module is not available.'] = 'Le module DOM XML n\'est pas disponible.';
-$GLOBALS['__l10n']['PCRE engine does not support UTF-8 strings.'] = 'Le moteur d\'expressions rationnelles PCRE ne gère pas les chaînes UTF-8.';
-$GLOBALS['__l10n']['SPL module is not available.'] = 'Le module SPL n\'est pas disponible.';
-$GLOBALS['__l10n']['MySQL version is %s (4.1 or earlier needed).'] = 'La version de MySQL est %s (4.1 ou plus récent nécessaire).';
-$GLOBALS['__l10n']['MySQL InnoDB engine is not available.'] = 'Le gestionnaire de stockage InnoDB de MySQL n\'est pas disponible.';
-$GLOBALS['__l10n']['PostgreSQL version is %s (8.0 or earlier needed).'] = 'La version de PostgreSQL est %s (8.0 ou plus récent nécessaire).';
-$GLOBALS['__l10n']['Please set a master key (DC_MASTER_KEY) in configuration file.'] = 'Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration.';
-$GLOBALS['__l10n']['Dotclear is already installed.'] = 'Dotclear est déjà installé.';
-$GLOBALS['__l10n']['Dotclear cannot be installed.'] = 'Dotclear ne peut pas être installé.';
-$GLOBALS['__l10n']['No user ID given'] = 'Aucun identifiant utilisateur spécifié';
-$GLOBALS['__l10n']['User ID must contain at least 2 characters using letters, numbers or symbols.'] = 'L\'identifiant utilisateur doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles.';
-$GLOBALS['__l10n']['Invalid email address'] = 'Adresse email incorrecte';
-$GLOBALS['__l10n']['No password given'] = 'Aucun mot de passe spécifié';
-$GLOBALS['__l10n']['Passwords don\'t match'] = 'Les mots de passe ne correspondent pas';
-$GLOBALS['__l10n']['Password must contain at least 6 characters.'] = 'Le mot de passe doit contenir au moins 6 caractères.';
-$GLOBALS['__l10n']['My first blog'] = 'Mon premier blog';
-$GLOBALS['__l10n']['Welcome to Dotclear!'] = 'Bienvenue sur Dotclear !';
-$GLOBALS['__l10n']['This is your first entry. When you\'re ready to blog, log in to edit or delete it.'] = 'Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer.';
-$GLOBALS['__l10n']['Dotclear Team'] = 'L\'équipe Dotclear';
-$GLOBALS['__l10n']['This is a comment.
-To delete it, log in and view your blog\'s comments. Then you might remove or edit it.
'] = 'Ceci est un commentaire
Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.
'; -$GLOBALS['__l10n']['Dotclear installation'] = 'Installation de Dotclear'; -$GLOBALS['__l10n']['Cache directory %s is not writable.'] = 'Le répertoire de cache %s n\'est pas accessible en écriture.'; -$GLOBALS['__l10n']['Errors:'] = 'Erreurs :'; -$GLOBALS['__l10n']['Configuration file has been successfully created.'] = 'Le fichier de configuration a été créé avec succès.'; -$GLOBALS['__l10n']['User information'] = 'Informations utilisateur'; -$GLOBALS['__l10n']['Please provide the following information needed to create the first user.'] = 'Merci de fournir les informations suivantes pour créer le premier utilisateur.'; -$GLOBALS['__l10n']['First Name:'] = 'Prénom :'; -$GLOBALS['__l10n']['Last Name:'] = 'Nom'; -$GLOBALS['__l10n']['Username and password'] = 'Identifiant ou mot de passe incorrect'; -$GLOBALS['__l10n']['Confirm password:'] = 'Confirmez le mot de passe :'; -$GLOBALS['__l10n']['All done!'] = 'Terminé !'; -$GLOBALS['__l10n']['Dotclear has been successfully installed. Here is some useful information you should keep.'] = 'Dotclear a été installé avec succès. Conservez les informations suivantes précieusement.'; -$GLOBALS['__l10n']['Your account'] = 'Votre compte'; -$GLOBALS['__l10n']['Your blog'] = 'Votre blog'; -$GLOBALS['__l10n']['Blog address:'] = 'Adresse du blog :'; -$GLOBALS['__l10n']['Administration interface:'] = 'Interface d\'administration :'; -$GLOBALS['__l10n']['Manage your blog now'] = 'Gérez votre blog'; -$GLOBALS['__l10n']['The file %s already exists. If you need to reset any of the configuration items in this file, please delete it first or you may continue to install.'] = 'Le fichier %s existe déjà . Pour réinitialiser votre configuration, supprimez d\'abord ce fichier ou bien continuez l\'installation.'; -$GLOBALS['__l10n']['File %s does not exist.'] = 'Le fichier %s n\'existe pas.'; -$GLOBALS['__l10n']['Cannot write %s file.'] = 'Impossible d\'écrire le fichier %s.'; -$GLOBALS['__l10n']['Dotclear installation wizard'] = 'Assistant d\'installation de Dotclear'; -$GLOBALS['__l10n']['System information'] = 'Informations système'; -$GLOBALS['__l10n']['Please provide the following information needed to create your configuration file.'] = 'Merci de fournir les informations suivantes pour créer votre fichier de configuration.'; -$GLOBALS['__l10n']['Database type:'] = 'Type de base de données :'; -$GLOBALS['__l10n']['Database Host Name:'] = 'Nom d\'hôte de la base de données :'; -$GLOBALS['__l10n']['Database Name:'] = 'Nom de la base de données :'; -$GLOBALS['__l10n']['Database User Name:'] = 'Nom d\'utilisateur de la base de données :'; -$GLOBALS['__l10n']['Database Password:'] = 'Mot de passe de la base de données :'; -$GLOBALS['__l10n']['Database Tables Prefix:'] = 'Préfixe des tables de la base de données :'; -$GLOBALS['__l10n']['No such installed language'] = 'Cette langue n\'est pas installée'; -$GLOBALS['__l10n']['You can\'t remove English language.'] = 'Vous ne pouvez pas supprimer la langue anglaise.'; -$GLOBALS['__l10n']['Permissions to delete language denied.'] = 'Permission de supprimer la langue refusée.'; -$GLOBALS['__l10n']['Invalid language file URL.'] = 'URL de fichier de langue invalide.'; -$GLOBALS['__l10n']['Languages management'] = 'Gestion des langues'; -$GLOBALS['__l10n']['Language has been successfully deleted.'] = 'La langue a été supprimée avec succès.'; -$GLOBALS['__l10n']['Language has been successfully installed.'] = 'La langue a été installée avec succès.'; -$GLOBALS['__l10n']['Language has been successfully upgraded'] = 'La langue a été mise à jour avec succès.'; -$GLOBALS['__l10n']['Here you can install, upgrade or remove languages for your Dotclear installation.'] = 'Sur cette page, vous pouvez installer, mettre à jour ou supprimer des langues de votre installation de Dotclear.'; -$GLOBALS['__l10n']['You can change your user language in your preferences or change your blog\'s main language in your blog settings.'] = 'Vous pouvez changer votre langue d\'utilisateur dans vos préférences ou changer la langue principale de votre blog dans vos paramètres de blog.'; -$GLOBALS['__l10n']['Installed languages'] = 'Langues installées'; -$GLOBALS['__l10n']['No additional language is installed.'] = 'Aucune langue supplémentaire n\'est installée.'; -$GLOBALS['__l10n']['Language'] = 'Langue'; -$GLOBALS['__l10n']['Action'] = 'Action'; -$GLOBALS['__l10n']['Delete'] = 'Supprimer'; -$GLOBALS['__l10n']['Install or upgrade languages'] = 'Installer ou mettre à jour une langue'; -$GLOBALS['__l10n']['You can install or remove a language by adding or removing the relevant directory in your %s folder.'] = 'Vous pouvez installer ou supprimer une langue en ajoutant ou supprimant le répertoire correspondant dans votre répertoire %s.'; -$GLOBALS['__l10n']['Available languages'] = 'Langues disponibles'; -$GLOBALS['__l10n']['You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s.'] = 'Vous pouvez télécharger et installer une langue supplémentaire directement depuis Dotclear.net. Les langues proposées sont basées sur votre version : %s.'; -$GLOBALS['__l10n']['Language:'] = 'Langue :'; -$GLOBALS['__l10n']['Install language'] = 'Installer la langue'; -$GLOBALS['__l10n']['You can install languages by uploading zip files.'] = 'Vous pouvez installer des langues en déposant des fichiers zip.'; -$GLOBALS['__l10n']['Language zip file:'] = 'Fichier zip de la langue :'; -$GLOBALS['__l10n']['Upload language'] = 'Déposer la langue'; -$GLOBALS['__l10n']['Invalid language zip file.'] = 'Fichier zip de langue invalide.'; -$GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear language pack.'] = 'Le fichier zip ne semble pas être un fichier valide de langue Dotclear.'; -$GLOBALS['__l10n']['An error occurred during language upgrade.'] = 'Une erreur est survenue durant la mise à jour de la langue.'; -$GLOBALS['__l10n']['Error:'] = 'Erreur :'; -$GLOBALS['__l10n']['By names, ascendant'] = 'Par noms, croissants'; -$GLOBALS['__l10n']['By names, descendant'] = 'Par noms, décroissants'; -$GLOBALS['__l10n']['By dates, ascendant'] = 'Par dates, croissantes'; -$GLOBALS['__l10n']['By dates, descendant'] = 'Par dates, décroissantes'; -$GLOBALS['__l10n']['Media manager'] = 'Gestionnaire de médias'; -$GLOBALS['__l10n']['confirm removal'] = 'Confirmer la suppression'; -$GLOBALS['__l10n']['Are you sure you want to remove %s?'] = 'Ãtes-vous certain de vouloir supprimer %s ?'; -$GLOBALS['__l10n']['cancel'] = 'annuler'; -$GLOBALS['__l10n']['yes'] = 'oui'; -$GLOBALS['__l10n']['Directory has been successfully created.'] = 'Répertoire créé avec succès.'; -$GLOBALS['__l10n']['Files have been successfully uploaded.'] = 'Fichier chargé avec succès.'; -$GLOBALS['__l10n']['File has been successfully removed.'] = 'Fichier supprimé avec succès.'; -$GLOBALS['__l10n']['Directory has been successfully removed.'] = 'Répertoire supprimé avec succès.'; -$GLOBALS['__l10n']['Directory has been successfully rebuilt.'] = 'Répertoire reconstruit avec succès.'; -$GLOBALS['__l10n']['Zip file has been successfully extracted.'] = 'Le fichier zip a été extrait avec succès.'; -$GLOBALS['__l10n']['Choose a file to attach to entry %s by clicking on %s.'] = 'Choisissez un fichier à attacher au billet %s en cliquant sur %s.'; -$GLOBALS['__l10n']['Attach this file to entry'] = 'Attacher ce fichier au billet'; -$GLOBALS['__l10n']['Choose a file to insert into entry by clicking on %s.'] = 'Choisissez un fichier à insérer dans le billet en cliquant sur %s.'; -$GLOBALS['__l10n']['No file.'] = 'Aucun fichier.'; -$GLOBALS['__l10n']['Sort files:'] = 'Trier les fichiers :'; -$GLOBALS['__l10n']['Add files'] = 'Ajouter des fichiers'; -$GLOBALS['__l10n']['Choose a file:'] = 'Choisissez un fichier :'; -$GLOBALS['__l10n']['Maximum size %s'] = 'Taille maximale %s'; -$GLOBALS['__l10n']['Private'] = 'Privé'; -$GLOBALS['__l10n']['send'] = 'envoyer'; -$GLOBALS['__l10n']['Please take care to publish media that you own and that are not protected by copyright.'] = 'Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés contre la copie.'; -$GLOBALS['__l10n']['New directory'] = 'Nouveau répertoire'; -$GLOBALS['__l10n']['Directory Name:'] = 'Nom du répertoire :'; -$GLOBALS['__l10n']['Download this directory as a zip file'] = 'Télécharger ce répertoire dans un fichier zip'; -$GLOBALS['__l10n']['open'] = 'ouvrir'; -$GLOBALS['__l10n']['Insert this file into entry'] = 'Insérer ce fichier dans le billet'; -$GLOBALS['__l10n']['Not a valid file'] = 'Fichier invalide'; -$GLOBALS['__l10n']['File has been successfully updated.'] = 'Fichier mis à jour avec succès.'; -$GLOBALS['__l10n']['Thumbnails have been successfully updated.'] = 'Les miniatures ont été mises à jour avec succès.'; -$GLOBALS['__l10n']['Insert media item'] = 'Insérer un média'; -$GLOBALS['__l10n']['Image size:'] = 'Taille de l\'image :'; -$GLOBALS['__l10n']['original'] = 'originale'; -$GLOBALS['__l10n']['Image alignment'] = 'Alignement de l\'image'; -$GLOBALS['__l10n']['None'] = 'Aucun'; -$GLOBALS['__l10n']['Left'] = 'Gauche'; -$GLOBALS['__l10n']['Right'] = 'Droite'; -$GLOBALS['__l10n']['Center'] = 'Centre'; -$GLOBALS['__l10n']['Image insertion'] = 'Insertion de l\'image'; -$GLOBALS['__l10n']['As a single image'] = 'En tant qu\'image uniquement'; -$GLOBALS['__l10n']['As a link to original image'] = 'En tant que lien vers l\'image originale'; -$GLOBALS['__l10n']['MP3 disposition'] = 'Disposition du MP3'; -$GLOBALS['__l10n']['Please note that you cannot insert mp3 files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier mp3 avec l\'éditeur visuel.'; -$GLOBALS['__l10n']['Please note that you cannot insert video files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier vidéo avec l\'éditeur visuel.'; -$GLOBALS['__l10n']['Video size'] = 'Taille de la vidéo'; -$GLOBALS['__l10n']['Width:'] = 'Largeur :'; -$GLOBALS['__l10n']['Height:'] = 'Hauteur :'; -$GLOBALS['__l10n']['Video disposition'] = 'Disposition de la vidéo'; -$GLOBALS['__l10n']['Media item will be inserted as a link.'] = 'Le média sera inséré en tant que lien.'; -$GLOBALS['__l10n']['Cancel'] = 'Annuler'; -$GLOBALS['__l10n']['Insert'] = 'Insérer'; -$GLOBALS['__l10n']['Media details'] = 'Détails du média'; -$GLOBALS['__l10n']['Available sizes:'] = 'Tailles disponibles :'; -$GLOBALS['__l10n']['File owner:'] = 'Propriétaire du fichier :'; -$GLOBALS['__l10n']['File type:'] = 'Type de fichier :'; -$GLOBALS['__l10n']['File size:'] = 'Taille du fichier :'; -$GLOBALS['__l10n']['File URL:'] = 'URL du fichier :'; -$GLOBALS['__l10n']['Show entries containing this media'] = 'Afficher les billets contenant ce média'; -$GLOBALS['__l10n']['Entries containing this media'] = 'Billets contenant ce média'; -$GLOBALS['__l10n']['No entry seems contain this media.'] = 'Aucun billet ne semble contenir ce média.'; -$GLOBALS['__l10n']['Image details'] = 'Détails de l\'image'; -$GLOBALS['__l10n']['No detail'] = 'Aucun détail'; -$GLOBALS['__l10n']['Update thumbnails'] = 'Mettre à jour les miniatures'; -$GLOBALS['__l10n']['This will create or update thumbnails for this image.'] = 'Ceci va créer ou mettre à jour les miniatures pour cette image.'; -$GLOBALS['__l10n']['update thumbnails'] = 'mettre à jour les miniatures'; -$GLOBALS['__l10n']['Extract in a new directory'] = 'Extraire dans un nouveau répertoire'; -$GLOBALS['__l10n']['Extract in current directory'] = 'Extraire dans le répertoire actuel'; -$GLOBALS['__l10n']['Extract archive'] = 'Extraire l\'archive'; -$GLOBALS['__l10n']['This will extract archive in a new directory that should not exists yet.'] = 'Ceci va extraire l\'archive dans un nouveau répertoire qui ne doit pas encore exister.'; -$GLOBALS['__l10n']['This will extract archive in current directory and will overwrite existing files or directory.'] = 'Ceci va extraire l\'archive dans le répertoire actuel et va écraser les fichiers ou répertoires existants.'; -$GLOBALS['__l10n']['Extract mode:'] = 'Mode d\'extraction :'; -$GLOBALS['__l10n']['extract'] = 'extraire'; -$GLOBALS['__l10n']['Change media properties'] = 'Changer les propriétés du média'; -$GLOBALS['__l10n']['File name:'] = 'Nom du fichier :'; -$GLOBALS['__l10n']['File title:'] = 'Titre du fichier :'; -$GLOBALS['__l10n']['File date:'] = 'Date du fichier :'; -$GLOBALS['__l10n']['New directory:'] = 'Nouveau répertoire :'; -$GLOBALS['__l10n']['Change file'] = 'Changer le fichier'; -$GLOBALS['__l10n']['No blog or user given.'] = 'Vous n\'avez pas indiqué de blog ou d\'utilisateur'; -$GLOBALS['__l10n']['permissions'] = 'permissions'; -$GLOBALS['__l10n']['Permissions'] = 'Permissions'; -$GLOBALS['__l10n']['The permissions have been successfully updated.'] = 'Permissions mises à jour avec succès.'; -$GLOBALS['__l10n']['You are about to change permissions on the following blogs for users %s.'] = 'Vous allez changer les permissions des utilisateurs %s pour ces blogs.'; -$GLOBALS['__l10n']['choose a blog'] = 'choisissez un blog'; -$GLOBALS['__l10n']['Choose a blog'] = 'Choisissez un blog'; -$GLOBALS['__l10n']['Entries per page'] = 'Billets par page'; -$GLOBALS['__l10n']['Choose one or more blogs to which you want to give permissions to users %s.'] = 'Choisissez un ou plusieurs blogs pour lesquels les utilisateurs suivants auront des permissions : %s.'; -$GLOBALS['__l10n']['set permissions'] = 'définir les permissions'; -$GLOBALS['__l10n']['No content found on this plugin.'] = 'Aucun contenu pour cette extension.'; -$GLOBALS['__l10n']['Plugin not found'] = 'Extension introuvable'; -$GLOBALS['__l10n']['The plugin you reached does not exist or does not have an admin page.'] = 'L\'extension que vous essayez d\'atteindre n\'existe pas ou n\'a pas de page d\'administration.'; -$GLOBALS['__l10n']['No such plugin.'] = 'Extension inexistante.'; -$GLOBALS['__l10n']['You don\'t have permissions to delete this plugin.'] = 'Vous n\'avez pas les permissions pour effacer cette extension'; -$GLOBALS['__l10n']['You don\'t have permissions to deactivate this plugin.'] = 'Vous n\'avez pas les permissions pour désactiver cette extension.'; -$GLOBALS['__l10n']['Plugins management'] = 'Gestion des extensions'; -$GLOBALS['__l10n']['Plugin has been successfully deleted.'] = 'L\'extension a été supprimée avec succès.'; -$GLOBALS['__l10n']['Plugin has been successfully installed.'] = 'L\'extension a été installée avec succès.'; -$GLOBALS['__l10n']['Plugin has been successfully upgraded'] = 'L\'extension a été mise à jour avec succès.'; -$GLOBALS['__l10n']['Plugins add new functionalities to Dotclear. Here you can activate or deactivate installed plugins.'] = 'Les extensions ajoutent de nouvelles fonctionnalités à Dotclear. Ici, vous pouvez activer ou désactiver les extensions installées.'; -$GLOBALS['__l10n']['You can find additional plugins for your blog on %s.'] = 'Vous pouvez trouver de nouvelles extensions pour votre blog sur %s.'; -$GLOBALS['__l10n']['To install or upgrade a plugin you generally just need to upload it in "Install or upgrade a plugin" section.'] = 'Tout ce que vous avez à faire pour installer ou mettre à jour une extension est généralement de la déposer dans la section "Installer ou mettre à jour une extension".'; -$GLOBALS['__l10n']['To install or upgrade a plugin you just need to extract it in your plugins directory.'] = 'Tout ce que vous avez à faire pour installer une extension est de l\'extraire dans votre répertoire d\'extensions.'; -$GLOBALS['__l10n']['Plugins'] = 'Extensions'; -$GLOBALS['__l10n']['Activated plugins'] = 'Extensions activées'; -$GLOBALS['__l10n']['Plugin'] = 'Extension'; -$GLOBALS['__l10n']['Version'] = 'Version'; -$GLOBALS['__l10n']['Details'] = 'Détails'; -$GLOBALS['__l10n']['Deactivate'] = 'Désactiver'; -$GLOBALS['__l10n']['Deactivated plugins'] = 'Extensions désactivées'; -$GLOBALS['__l10n']['Activate'] = 'Activer'; -$GLOBALS['__l10n']['Install or upgrade a plugin'] = 'Installer ou mettre à jour une extension'; -$GLOBALS['__l10n']['You can install plugins by uploading or downloading zip files.'] = 'Vous pouvez installer des extensions en déposant ou téléchargeant des fichiers zip.'; -$GLOBALS['__l10n']['Plugin zip file:'] = 'Fichier zip de l\'extension :'; -$GLOBALS['__l10n']['Upload plugin'] = 'Déposer l\'extension'; -$GLOBALS['__l10n']['Plugin zip file URL:'] = 'URL du fichier zip de l\'extension :'; -$GLOBALS['__l10n']['Download plugin'] = 'Télécharger l\'extension'; -$GLOBALS['__l10n']['To enable this function, please give write access to your plugins directory.'] = 'Pour activer cette fonction, donnez un accès en écriture à votre répertoire d\'extensions.'; -$GLOBALS['__l10n']['Add a link'] = 'Ajouter un lien'; -$GLOBALS['__l10n']['Available'] = 'Disponible'; -$GLOBALS['__l10n']['Most used'] = 'Plus utilisées'; -$GLOBALS['__l10n']['Link URL:'] = 'URL du lien :'; -$GLOBALS['__l10n']['Link language:'] = 'Langue du lien :'; -$GLOBALS['__l10n']['insert'] = 'insérer'; -$GLOBALS['__l10n']['Add a link to an entry'] = 'Ajouter un lien vers un billet'; -$GLOBALS['__l10n']['Search entry:'] = 'Rechercher un billet :'; -$GLOBALS['__l10n']['This entry does not exist.'] = 'Ce billet n\'existe pas.'; -$GLOBALS['__l10n']['Edit entry'] = 'Modifier le billet'; -$GLOBALS['__l10n']['next entry'] = 'billet suivant'; -$GLOBALS['__l10n']['previous entry'] = 'billet précédent'; -$GLOBALS['__l10n']['Entry has been successfully updated.'] = 'Billet mis à jour avec succès.'; -$GLOBALS['__l10n']['Entry has been successfully created.'] = 'Billet créé avec succès.'; -$GLOBALS['__l10n']['File has been successfully attached.'] = 'Fichier attaché avec succès.'; -$GLOBALS['__l10n']['Attachment has been successfully removed.'] = 'Pièce jointe retirée avec succès.'; -$GLOBALS['__l10n']['Comment has been successfully created.'] = 'Commentaire créé avec succès.'; -$GLOBALS['__l10n']['Don\'t forget to validate your XHTML conversion by saving your post.'] = 'Enregistrez votre billet pour valider la transformation en XHTML.'; -$GLOBALS['__l10n']['View entry'] = 'Voir le billet'; -$GLOBALS['__l10n']['Preview entry'] = 'Prévisualiser le billet'; -$GLOBALS['__l10n']['Entry status:'] = 'Ãtat du billet :'; -$GLOBALS['__l10n']['Published on:'] = 'Publié le :'; -$GLOBALS['__l10n']['Text formating:'] = 'Format du texte :'; -$GLOBALS['__l10n']['Convert to XHTML'] = 'Convertir en XHTML'; -$GLOBALS['__l10n']['Selected entry'] = 'Billet sélectionné'; -$GLOBALS['__l10n']['Entry lang:'] = 'Langue du billet :'; -$GLOBALS['__l10n']['Entry password:'] = 'Mot de passe du billet :'; -$GLOBALS['__l10n']['Basename:'] = 'URL spécifique :'; -$GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another entry.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec un autre billet.'; -$GLOBALS['__l10n']['Attachments'] = 'Pièces jointes'; -$GLOBALS['__l10n']['remove'] = 'supprimer'; -$GLOBALS['__l10n']['No attachment.'] = 'Aucune pièce jointe'; -$GLOBALS['__l10n']['Add files to this entry'] = 'Ajouter un fichier au billet'; -$GLOBALS['__l10n']['Excerpt:'] = 'Extrait :'; -$GLOBALS['__l10n']['Notes:'] = 'Notes :'; -$GLOBALS['__l10n']['Ping blogs'] = 'Faire des rétroliens'; -$GLOBALS['__l10n']['Trackbacks'] = 'Rétroliens'; -$GLOBALS['__l10n']['No trackback'] = 'Aucun rétrolien'; -$GLOBALS['__l10n']['Add a comment'] = 'Ajouter un commentaire'; -$GLOBALS['__l10n']['Name:'] = 'Nom :'; -$GLOBALS['__l10n']['IP address'] = 'Adresse IP'; -$GLOBALS['__l10n']['published'] = 'publié'; -$GLOBALS['__l10n']['unpublished'] = 'non publié'; -$GLOBALS['__l10n']['pending'] = 'en attente'; -$GLOBALS['__l10n']['junk'] = 'indésirable'; -$GLOBALS['__l10n']['Edit this comment'] = 'Modifier ce commentaire'; -$GLOBALS['__l10n']['This attachment does not exist'] = 'Cette pièce jointe n\'existe pas'; -$GLOBALS['__l10n']['Remove attachment'] = 'Supprimer la pièce jointe'; -$GLOBALS['__l10n']['Attachment'] = 'Pièce jointe'; -$GLOBALS['__l10n']['Are you sure you want to remove this attachment?'] = 'Ãtes-vous certain de vouloir supprimer cette pièce jointe ?'; -$GLOBALS['__l10n']['selected'] = 'sélectionné'; -$GLOBALS['__l10n']['not selected'] = 'non sélectionné'; -$GLOBALS['__l10n']['Category'] = 'Catégorie'; -$GLOBALS['__l10n']['Selected'] = 'Sélectionné'; -$GLOBALS['__l10n']['schedule'] = 'programmer'; -$GLOBALS['__l10n']['mark as selected'] = 'marquer sélectionné'; -$GLOBALS['__l10n']['mark as unselected'] = 'marquer non sélectionné'; -$GLOBALS['__l10n']['change category'] = 'changer la catégorie'; -$GLOBALS['__l10n']['change author'] = 'changer l\'auteur'; -$GLOBALS['__l10n']['Selected:'] = 'Sélectionné :'; -$GLOBALS['__l10n']['Month:'] = 'Mois :'; -$GLOBALS['__l10n']['Lang:'] = 'Langue :'; -$GLOBALS['__l10n']['Selected entries action:'] = 'Action sur les billets sélectionnés :'; -$GLOBALS['__l10n']['This user does not exist'] = 'Cet utilisateur n\'existe pas'; -$GLOBALS['__l10n']['Change category for entries'] = 'Changer de catégorie pour les billets'; -$GLOBALS['__l10n']['Change author for entries'] = 'Changer l\'auteur des billets'; -$GLOBALS['__l10n']['Author ID:'] = 'Identifiant de l\'utilisateur'; -$GLOBALS['__l10n']['If you want to change your email or password you must provide your current password.'] = 'Si vous voulez changer votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe.'; -$GLOBALS['__l10n']['Personal information has been successfully updated.'] = 'Informations personnelles mises à jour avec succès.'; -$GLOBALS['__l10n']['Display name:'] = 'Pseudonyme :'; -$GLOBALS['__l10n']['Preferred format:'] = 'Format d\'édition préféré :'; -$GLOBALS['__l10n']['Default entry status:'] = 'Ãtat des billets par défaut :'; -$GLOBALS['__l10n']['Entry edit field height:'] = 'Taille de la zone d\'édition :'; -$GLOBALS['__l10n']['User language:'] = 'Langue de l\'utilisateur :'; -$GLOBALS['__l10n']['User timezone:'] = 'Fuseau horaire de l\'utilisateur :'; -$GLOBALS['__l10n']['Enable WYSIWYG mode'] = 'Activer l\'éditeur visuel'; -$GLOBALS['__l10n']['Change your password'] = 'Changer votre mot de passe'; -$GLOBALS['__l10n']['New password:'] = 'Nouveau mot de passe :'; -$GLOBALS['__l10n']['Search'] = 'Rechercher'; -$GLOBALS['__l10n']['Search options'] = 'Options de recherche'; -$GLOBALS['__l10n']['Query:'] = 'Requête :'; -$GLOBALS['__l10n']['search entries'] = 'rechercher des billets'; -$GLOBALS['__l10n']['search comments'] = 'recherche des commentaires'; -$GLOBALS['__l10n']['%d entries found'] = '%d billets trouvés'; -$GLOBALS['__l10n']['%d entry found'] = '%d billet trouvé'; -$GLOBALS['__l10n']['%d comment found'] = '%d commentaire trouvé'; -$GLOBALS['__l10n']['%d comments found'] = '%d commentaires trouvés'; -$GLOBALS['__l10n']['This entry does not exist or is not published'] = 'Ce billet n\'existe pas ou n\'est pas publié'; -$GLOBALS['__l10n']['All pings sent.'] = 'Tous les rétroliens ont été envoyés.'; -$GLOBALS['__l10n']['Auto discover ping URLs'] = 'Découverte automatique des URL à rétrolier'; -$GLOBALS['__l10n']['URLs to ping:'] = 'URLs à rétrolier :'; -$GLOBALS['__l10n']['Send excerpt:'] = 'Envoyer l\'extrait :'; -$GLOBALS['__l10n']['Previously sent pings'] = 'Rétroliens déjà envoyés'; -$GLOBALS['__l10n']['Dotclear update'] = 'Mise à jour de Dotclear'; -$GLOBALS['__l10n']['Unable to delete file %s'] = 'Impossible de supprimer le fichier %s'; -$GLOBALS['__l10n']['Downloaded Dotclear archive seems to be corrupted. Try download it again.'] = 'L\'archive téléchargée de Dotclear semble être corrompue. Essayer de la télécharger à nouveau.'; -$GLOBALS['__l10n']['The following files of your Dotclear installation have been modified so we won\'t try to update your installation. Please try to update manually.'] = 'Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement.'; -$GLOBALS['__l10n']['The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être lus. Veuillez corriger ceci ou créer un fichier de backup nommé %s manuellement.'; -$GLOBALS['__l10n']['The following files of your Dotclear installation cannot be written. Please fix this or try to update manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger ceci ou mettre à jour manuellement.'; -$GLOBALS['__l10n']['No newer Dotclear version available.'] = 'Aucune nouvelle version de Dotclear n\'est disponible.'; -$GLOBALS['__l10n']['Dotclear %s is available.'] = 'Dotclear %s est disponible.'; -$GLOBALS['__l10n']['To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory.'] = 'Pour mettre à jour votre installation de Dotclear, cliquez sur le bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera créé dans votre répertoire principal.'; -$GLOBALS['__l10n']['Update Dotclear'] = 'Mettre à jour Dotclear'; -$GLOBALS['__l10n']['Update backup files'] = 'Sauvegardes des mises à jour'; -$GLOBALS['__l10n']['The following files are backups of previously updates. You can revert your previous installation or delete theses files.'] = 'Les fichiers suivants sont des sauvegardes de mises à jour précédentes. Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers.'; -$GLOBALS['__l10n']['Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version.'] = 'Merci de noter que rétablir votre version de Dotclear peut avoir des effets non désirés. N\'envisagez ceci que si vous rencontrez d\'importantes difficultés avec cette nouvelle version.'; -$GLOBALS['__l10n']['You should not revert to version prior to last one (%s).'] = 'Vous ne devez pas rétablir une version précédant la dernière (%s).'; -$GLOBALS['__l10n']['Delete selected file'] = 'Supprimer le fichier sélectionné'; -$GLOBALS['__l10n']['Revert to selected file'] = 'Rétablir le fichier sélectionné'; -$GLOBALS['__l10n']['Congratulations, you\'re one click away from the end of the update.'] = 'Félicitations, vous êtes à un clic de la fin de la mise à jour.'; -$GLOBALS['__l10n']['Finish the update.'] = 'Finir la mise à jour.'; -$GLOBALS['__l10n']['new user'] = 'nouvel utilisateur'; -$GLOBALS['__l10n']['User "%s" already exists.'] = 'L\'utilisateur "%s" existe déjà .'; -$GLOBALS['__l10n']['User has been successfully updated.'] = 'Utilisateur mis à jour avec succès.'; -$GLOBALS['__l10n']['User has been successfully created.'] = 'Utilisateur créé avec succès.'; -$GLOBALS['__l10n']['Warning:'] = 'Attention :'; -$GLOBALS['__l10n']['If you change your username, you will have to log in again.'] = 'Si vous changez votre login, vous devrez vous identifier à nouveau.'; -$GLOBALS['__l10n']['No permissions.'] = 'Aucune permission.'; -$GLOBALS['__l10n']['Add new permissions'] = 'Ajouter de nouvelles permissions'; -$GLOBALS['__l10n']['Username'] = 'Identifiant :'; -$GLOBALS['__l10n']['Last Name'] = 'Nom'; -$GLOBALS['__l10n']['First Name'] = 'Prénom'; -$GLOBALS['__l10n']['Display name'] = 'Pseudonyme'; -$GLOBALS['__l10n']['Number of entries'] = 'Nombre de billets'; -$GLOBALS['__l10n']['users'] = 'utilisateurs'; -$GLOBALS['__l10n']['User has been successfully removed.'] = 'Utilisateur supprimé avec succès.'; -$GLOBALS['__l10n']['Create a new user'] = 'Créer un nouvel utilisateur'; -$GLOBALS['__l10n']['Users per page'] = 'Utilisateurs par page'; -$GLOBALS['__l10n']['Selected users action:'] = 'Action sur les utilisateurs sélectionnés :'; -$GLOBALS['__l10n']['Set permissions'] = 'Définir les permissions'; -$GLOBALS['__l10n']['Blog:'] = 'Blog :'; -$GLOBALS['__l10n']['Change blog'] = 'Changer de blog'; -$GLOBALS['__l10n']['Blogs:'] = 'Blogs :'; -$GLOBALS['__l10n']['View site'] = 'Voir le site'; -$GLOBALS['__l10n']['User:'] = 'Utilisateur :'; -$GLOBALS['__l10n']['Logout'] = 'Déconnexion'; -$GLOBALS['__l10n']['Thank you for using %s.'] = 'Merci d\'utiliser %s.'; -$GLOBALS['__l10n']['Help'] = 'Aide'; -$GLOBALS['__l10n']['uncover'] = 'dévoiler'; -$GLOBALS['__l10n']['hide'] = 'cacher'; -$GLOBALS['__l10n']['help'] = 'aide'; -$GLOBALS['__l10n']['No selection'] = 'Aucune sélection'; -$GLOBALS['__l10n']['select all'] = 'tout sélectionner'; -$GLOBALS['__l10n']['invert selection'] = 'inverser la sélection'; -$GLOBALS['__l10n']['view entry'] = 'voir le billet'; -$GLOBALS['__l10n']['Are you sure you want to delete selected entries?'] = 'Ãtes-vous certain de vouloir supprimer les billets sélectionnés ?'; -$GLOBALS['__l10n']['Are you sure you want to delete this entry?'] = 'Ãtes-vous certain de vouloir supprimer ce billet ?'; -$GLOBALS['__l10n']['Are you sure you want to delete selected comments?'] = 'Ãtes-vous certain de vouloir supprimer les commentaires sélectionnés ?'; -$GLOBALS['__l10n']['Are you sure you want to delete this comment?'] = 'Ãtes-vous certain de vouloir supprimer ce commentaire ?'; -$GLOBALS['__l10n']['Users with posts cannot be deleted.'] = 'Les utilisateurs ayant écrit des billets ne peuvent être effacées.'; -$GLOBALS['__l10n']['Are you sure you want to delete selected users?'] = 'Ãtes-vous certain de vouloir supprimer les utilisateurs sélectionnés ?'; -$GLOBALS['__l10n']['Are you sure you want to delete category "%s"?'] = 'Ãtes-vous certain de vouloir supprimer la catégorie "%s" ?'; -$GLOBALS['__l10n']['Are you sure you want to reorder all categories?'] = 'Ãtes-vous certain de vouloir réinitialiser l\'ordre des catégories ?'; -$GLOBALS['__l10n']['Are you sure you want to remove media "%s"?'] = 'Ãtes-vous certain de vouloir supprimer le média "%s" ?'; -$GLOBALS['__l10n']['Are you sure you want to extract archive in current directory?'] = 'Ãtes-vous certain de vouloir extraire l\'archive dans le répertoire actuel ?'; -$GLOBALS['__l10n']['Are you sure you want to remove attachment "%s"?'] = 'Ãtes-vous certain de vouloir supprimer la pièce jointe "%s" ?'; -$GLOBALS['__l10n']['Are you sure you want to delete "%s" language?'] = 'Ãtes-vous certain de vouloir supprimer la langue "%s" ?'; -$GLOBALS['__l10n']['Are you sure you want to delete "%s" plugin?'] = 'Ãtes-vous certain de vouloir supprimer l\'extension "%s" ?'; -$GLOBALS['__l10n']['Use this theme'] = 'Utiliser ce thème'; -$GLOBALS['__l10n']['Remove this theme'] = 'Supprimer ce thème'; -$GLOBALS['__l10n']['Are you sure you want to delete "%s" theme?'] = 'Ãtes-vous certain de vouloir supprimer le thème "%s" ?'; -$GLOBALS['__l10n']['Zip file content'] = 'Contenu du fichier zip'; -$GLOBALS['__l10n']['XHTML markup validator'] = 'Validation XHTML'; -$GLOBALS['__l10n']['XHTML content is valid.'] = 'Le contenu XHTML est valide.'; -$GLOBALS['__l10n']['There are XHTML markup errors.'] = 'Il y a des erreurs XHTML.'; -$GLOBALS['__l10n']['You have unsaved changes.'] = 'Vous n\'avez pas enregistré vos modifications.'; -$GLOBALS['__l10n']['close'] = 'fermer'; -$GLOBALS['__l10n']['now'] = 'maintenant'; -$GLOBALS['__l10n']['visual'] = 'visuel'; -$GLOBALS['__l10n']['source'] = 'source'; -$GLOBALS['__l10n']['You can use the following shortcuts to format your text.'] = 'Vous pouvez utiliser les raccourcis suivants pour formater votre texte.'; -$GLOBALS['__l10n']['-- none --'] = '-- aucun --'; -$GLOBALS['__l10n']['-- block format --'] = '-- format bloc --'; -$GLOBALS['__l10n']['Paragraph'] = 'Paragraphe'; -$GLOBALS['__l10n']['Level 1 header'] = 'Titre de niveau 1'; -$GLOBALS['__l10n']['Level 2 header'] = 'Titre de niveau 2'; -$GLOBALS['__l10n']['Level 3 header'] = 'Titre de niveau 3'; -$GLOBALS['__l10n']['Level 4 header'] = 'Titre de niveau 4'; -$GLOBALS['__l10n']['Level 5 header'] = 'Titre de niveau 5'; -$GLOBALS['__l10n']['Level 6 header'] = 'Titre de niveau 6'; -$GLOBALS['__l10n']['Strong emphasis'] = 'Forte emphase'; -$GLOBALS['__l10n']['Emphasis'] = 'Emphase'; -$GLOBALS['__l10n']['Inserted'] = 'Insertion'; -$GLOBALS['__l10n']['Deleted'] = 'Suppression'; -$GLOBALS['__l10n']['Inline quote'] = 'Citation en ligne'; -$GLOBALS['__l10n']['Code'] = 'Code'; -$GLOBALS['__l10n']['Line break'] = 'Passage à la ligne'; -$GLOBALS['__l10n']['Blockquote'] = 'Bloc de citation'; -$GLOBALS['__l10n']['Preformated text'] = 'Texte préformaté'; -$GLOBALS['__l10n']['Unordered list'] = 'Liste à puces'; -$GLOBALS['__l10n']['Ordered list'] = 'Liste numérotée'; -$GLOBALS['__l10n']['Link'] = 'Lien'; -$GLOBALS['__l10n']['URL?'] = 'URL ?'; -$GLOBALS['__l10n']['Language?'] = 'Langue ?'; -$GLOBALS['__l10n']['External image'] = 'Image externe'; -$GLOBALS['__l10n']['Media chooser'] = 'Sélecteur de média'; -$GLOBALS['__l10n']['Link to an entry'] = 'Lien vers un billet'; -$GLOBALS['__l10n']['Activate enhanced uploader'] = 'Activer l\'interface avancée'; -$GLOBALS['__l10n']['Disable enhanced uploader'] = 'Désactiver l\'interface avancée'; -$GLOBALS['__l10n']['File successfully uploaded.'] = 'Fichier envoyé avec succès.'; -$GLOBALS['__l10n']['Maximum file size allowed:'] = 'Taille maximale de fichier autorisée :'; -$GLOBALS['__l10n']['Limit exceeded.'] = 'Limite dépassée.'; -$GLOBALS['__l10n']['File size exceeds allowed limit.'] = 'La taille du fichier dépasse la limite autorisée.'; -$GLOBALS['__l10n']['Canceled.'] = 'Annulé.'; -$GLOBALS['__l10n']['HTTP Error:'] = 'Erreur HTTP :'; -$GLOBALS['__l10n']['Choose file'] = 'Choisir un fichier'; -$GLOBALS['__l10n']['Choose files'] = 'Choisir des fichiers'; -$GLOBALS['__l10n']['Clean'] = 'Nettoyer'; -$GLOBALS['__l10n']['Upload'] = 'Envoyer'; -$GLOBALS['__l10n']['No file in queue.'] = 'Aucun fichier en file d\'attente.'; -$GLOBALS['__l10n']['1 file in queue.'] = '1 fichier en attente.'; -$GLOBALS['__l10n']['%d files in queue.'] = '%d fichiers en attente.'; -$GLOBALS['__l10n']['Queue error:'] = 'Erreur de file d\'attente :'; -$GLOBALS['__l10n']['«prev.'] = '«préc.'; -$GLOBALS['__l10n']['next»'] = 'suiv.»'; -$GLOBALS['__l10n']['No entry'] = 'Pas de billet'; -$GLOBALS['__l10n']['scheduled'] = 'programmé'; -$GLOBALS['__l10n']['protected'] = 'protégé'; -$GLOBALS['__l10n']['%d attachment'] = '%d annexe'; -$GLOBALS['__l10n']['%d attachments'] = '%d annexes'; -$GLOBALS['__l10n']['Type'] = 'Type'; -$GLOBALS['__l10n']['No user'] = 'Pas d\'utilisateur'; -$GLOBALS['__l10n']['System'] = 'Système'; -$GLOBALS['__l10n']['Blog'] = 'Blog'; -$GLOBALS['__l10n']['Updates'] = 'Mises à jour'; -$GLOBALS['__l10n']['Languages'] = 'Langues'; -$GLOBALS['__l10n']['Unable to open directory.'] = 'Impossible d\'ouvrir le répertoire.'; -$GLOBALS['__l10n']['Unable to create directory.'] = 'Impossible de créer le répertoire.'; -$GLOBALS['__l10n']['File is not writable.'] = 'Le fichier n\'est pas accessible en écriture.'; -$GLOBALS['__l10n']['Unable to open file.'] = 'Impossible d\'ouvrir le fichier.'; -$GLOBALS['__l10n']['Not an uploaded file.'] = 'Pas un fichier déposé.'; -$GLOBALS['__l10n']['The uploaded file exceeds the maximum file size allowed.'] = 'Le fichier déposé est plus grand que la taille maximale autorisée.'; -$GLOBALS['__l10n']['The uploaded file was only partially uploaded.'] = 'Le fichier n\'a été chargé qu\'en partie.'; -$GLOBALS['__l10n']['No file was uploaded.'] = 'Aucun fichier chargé.'; -$GLOBALS['__l10n']['Missing a temporary folder.'] = 'Il manque un répertoire temporaire.'; -$GLOBALS['__l10n']['Failed to write file to disk.'] = 'Impossible d\'écrire le fichier.'; -$GLOBALS['__l10n']['%s is not a directory.'] = '%s n\'est pas un répertoire.'; -$GLOBALS['__l10n']['Uploading this file is not allowed.'] = 'L\'envoi de ce fichier n\'est pas autorisé.'; -$GLOBALS['__l10n']['Destination directory is not in jail.'] = 'Le répertoire cible n\'est pas en jail.'; -$GLOBALS['__l10n']['File already exists.'] = 'Le nouveau fichier existe déjà .'; -$GLOBALS['__l10n']['Cannot write in this directory.'] = 'Impossible d\'écrire dans ce répertoire.'; -$GLOBALS['__l10n']['An error occurred while writing the file.'] = 'Une erreur est survenue pendant l\'écriture du fichier.'; -$GLOBALS['__l10n']['Source file does not exist.'] = 'Le fichier source n\'existe pas'; -$GLOBALS['__l10n']['File is not in jail.'] = 'Le fichier n\'est pas en jail.'; -$GLOBALS['__l10n']['Destination directory is not writable.'] = 'Le répertoire cible n\'est pas accessible en écriture.'; -$GLOBALS['__l10n']['Unable to rename file.'] = 'Impossible de renommer le fichier.'; -$GLOBALS['__l10n']['File cannot be removed.'] = 'Ce fichier ne peut pas être supprimé.'; -$GLOBALS['__l10n']['Directory is not in jail.'] = 'Le répertoire n\'est pas en jail.'; -$GLOBALS['__l10n']['Directory cannot be removed.'] = 'Ce répertoire ne peut pas être supprimé.'; -$GLOBALS['__l10n']['Not enough memory to open image.'] = 'Mémoire insuffisante pour ouvrir l\'image.'; -$GLOBALS['__l10n']['File %s is not compressed in the zip.'] = 'Le fichier %s n\'est pas compressé dans le zip.'; -$GLOBALS['__l10n']['Trying to unzip a folder name %s'] = 'Tentative de décompresser un répertoire %s'; -$GLOBALS['__l10n']['Unable to write destination file.'] = 'Impossible d\'écrire le fichier de destination'; -$GLOBALS['__l10n']['Unable to write in target directory, permission denied.'] = 'Impossible d\'écrire dans le répertoire cible, permission refusée.'; -$GLOBALS['__l10n']['Not enough memory to open file.'] = 'Mémoire insuffisante pour ouvrir le fichier.'; -$GLOBALS['__l10n']['File does not exist'] = 'Le fichier n\'existe pas'; -$GLOBALS['__l10n']['Cannot read file'] = 'Impossible de lire le fichier'; -$GLOBALS['__l10n']['Directory does not exist'] = 'Le répertoire n\'existe pas'; -$GLOBALS['__l10n']['Cannot read directory'] = 'Impossible de lire le répertoire'; -$GLOBALS['__l10n']['administrator'] = 'administrateur'; -$GLOBALS['__l10n']['manage their own entries and comments'] = 'gérer ses propres billets et commentaires'; -$GLOBALS['__l10n']['publish entries and comments'] = 'publier des billets et des commentaires'; -$GLOBALS['__l10n']['delete entries and comments'] = 'supprimer des billets et des commentaires'; -$GLOBALS['__l10n']['manage all entries and comments'] = 'gérer tous les billets et commentaires'; -$GLOBALS['__l10n']['manage categories'] = 'gérer les catégories'; -$GLOBALS['__l10n']['manage their own media items'] = 'gérer ses propres médias'; -$GLOBALS['__l10n']['manage all media items'] = 'gérer tous les médias'; -$GLOBALS['__l10n']['That user does not exist in the database.'] = 'Cet utilisateur n\'existe pas dans la base de données.'; -$GLOBALS['__l10n']['That key does not exist in the database.'] = 'Cette clé n\'existe pas dans la base de données.'; -$GLOBALS['__l10n']['You are not allowed to add categories'] = 'Vous n\'êtes pas autorisé à créer des catégories'; -$GLOBALS['__l10n']['You are not allowed to update categories'] = 'Vous n\'êtes pas autorisé à modifier des catégories'; -$GLOBALS['__l10n']['You are not allowed to delete categories'] = 'Vous n\'êtes pas autorisé à supprimer des catégories'; -$GLOBALS['__l10n']['This category is not empty.'] = 'Cette catégorie n\'est pas vide.'; -$GLOBALS['__l10n']['Category URL must be unique.'] = 'L\'URL de chaque catégorie doit être unique.'; -$GLOBALS['__l10n']['You must provide a category title'] = 'Vous devez indiquer un titre de catégorie'; -$GLOBALS['__l10n']['You must provide a category URL'] = 'Vous devez indiquer une URL de catégorie'; -$GLOBALS['__l10n']['You are not allowed to create an entry'] = 'Vous n\'êtes pas autorisé à créer des billets'; -$GLOBALS['__l10n']['You are not allowed to update entries'] = 'Vous n\'êtes pas autorisé à modifier les billets'; -$GLOBALS['__l10n']['No such entry ID'] = 'Identifiant du billet inconnu'; -$GLOBALS['__l10n']['You are not allowed to edit this entry'] = 'Vous n\'êtes pas autorisé à modifier ce billet'; -$GLOBALS['__l10n']['You are not allowed to change this entry status'] = 'Vous n\'êtes pas autorisé à modifier l\'état de ce billet'; -$GLOBALS['__l10n']['You are not allowed to change this entry category'] = 'Vous n\'êtes pas autorisé à modifier la catégorie de ce billet'; -$GLOBALS['__l10n']['You are not allowed to mark this entry as selected'] = 'Vous n\'êtes pas autorisé à marquer ce billet comme sélectionné'; -$GLOBALS['__l10n']['You are not allowed to delete entries'] = 'Vous n\'êtes pas autorisé à supprimer des billets'; -$GLOBALS['__l10n']['You are not allowed to delete this entry'] = 'Vous n\'êtes pas autorisé à supprimer ce billet'; -$GLOBALS['__l10n']['No entry title'] = 'Pas de titre de billet'; -$GLOBALS['__l10n']['No entry content'] = 'Pas de contenu de billet'; -$GLOBALS['__l10n']['Empty entry URL'] = 'URL du billet vide'; -$GLOBALS['__l10n']['You are not allowed to update comments'] = 'Vous n\'êtes pas autorisé à modifier des commentaires'; -$GLOBALS['__l10n']['No such comment ID'] = 'Identifiant du commentaire inconnu'; -$GLOBALS['__l10n']['You are not allowed to update this comment'] = 'Vous n\'êtes pas autorisé à modifier ce commentaire'; -$GLOBALS['__l10n']['You are not allowed to change this comment\'s status'] = 'Vous n\'êtes pas autorisé à changer l\'état de ce commentaire'; -$GLOBALS['__l10n']['You are not allowed to delete comments'] = 'Vous n\'êtes pas autorisé à supprimer des commentaires'; -$GLOBALS['__l10n']['You are not allowed to delete this comment'] = 'Vous n\'êtes pas autorisé à supprimer ce commentaire'; -$GLOBALS['__l10n']['You must provide a comment'] = 'Vous devez indiquer un commentaire'; -$GLOBALS['__l10n']['You must provide an author name'] = 'Vous devez indiquer un nom d\'auteur'; -$GLOBALS['__l10n']['Email address is not valid.'] = 'Adresse email invalide.'; -$GLOBALS['__l10n']['online'] = 'en ligne'; -$GLOBALS['__l10n']['offline'] = 'hors ligne'; -$GLOBALS['__l10n']['removed'] = 'supprimé'; -$GLOBALS['__l10n']['You are not an administrator'] = 'Vous n\'êtes pas administrateur'; -$GLOBALS['__l10n']['Invalid user language code'] = 'Code langue de l\'utilisateur invalide'; -$GLOBALS['__l10n']['Blog ID must contain at least 2 characters using letters, numbers or symbols.'] = 'L\'identifiant du blog doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles.'; -$GLOBALS['__l10n']['No blog name'] = 'Pas de nom de blog'; -$GLOBALS['__l10n']['No blog URL'] = 'Pas d\'URL de blog'; -$GLOBALS['__l10n']['No blog defined.'] = 'Aucun blog défini.'; -$GLOBALS['__l10n']['Directory %s does not exist.'] = 'Le répertoire %s n\'existe pas.'; -$GLOBALS['__l10n']['You are not a super administrator.'] = 'Vous n\'êtes pas super administrateur.'; -$GLOBALS['__l10n']['Permission denied.'] = 'Permission refusée.'; -$GLOBALS['__l10n']['You are not the file owner.'] = 'Vous n\'êtes pas le propriétaire de ce fichier.'; -$GLOBALS['__l10n']['New file already exists.'] = 'Le nouveau fichier existe déjà .'; -$GLOBALS['__l10n']['File does not exist in the database.'] = 'Ce fichier n\'existe pas dans la base de données.'; -$GLOBALS['__l10n']['Extract destination directory %s already exists.'] = 'Le répertoire de destination d\'extraction %s existe déjà .'; -$GLOBALS['__l10n']['Empty module zip file.'] = 'Fichier zip de module vide.'; -$GLOBALS['__l10n']['The zip file does not appear to be a valid Dotclear module.'] = 'Le fichier zip ne semble pas être un fichier valide de module Dotclear.'; -$GLOBALS['__l10n']['An error occurred during module deletion.'] = 'Une erreur est survenue durant la suppression du module.'; -$GLOBALS['__l10n']['Unable to upgrade "%s". (same version)'] = 'Impossible de mettre à jour "%s" (même version).'; -$GLOBALS['__l10n']['Unable to read new _define.php file'] = 'Impossible de lire le nouveau fichier _define.php.'; -$GLOBALS['__l10n']['No such module.'] = 'Module inexistant.'; -$GLOBALS['__l10n']['Cannot remove module files'] = 'Impossible de supprimer les fichiers du module'; -$GLOBALS['__l10n']['Cannot deactivate plugin.'] = 'L\'extension ne peut pas être désactivée.'; -$GLOBALS['__l10n']['Cannot activate plugin.'] = 'L\'extension ne peut pas être activée.'; -$GLOBALS['__l10n']['Unable to retrieve settings:'] = 'Impossible d\'obtenir les paramètres :'; -$GLOBALS['__l10n']['Invalid setting namespace: %s'] = 'Espace de nommage du paramètre invalide : %s'; -$GLOBALS['__l10n']['No namespace specified'] = 'Aucun espace de nommage spécifié'; -$GLOBALS['__l10n']['%s is not a valid setting id'] = '%s n\'est pas un identifiant de paramètre valide'; -$GLOBALS['__l10n']['%s has still been pinged'] = 'Un rétrolien vers %s a déjà été fait'; -$GLOBALS['__l10n']['Unable to ping URL'] = 'Impossible de réaliser le rétrolien'; -$GLOBALS['__l10n']['%s is not a ping URL'] = '%s n\'est pas une URL de rétrolien'; -$GLOBALS['__l10n']['%s, ping error:'] = '%s, erreur de rétrolien :'; -$GLOBALS['__l10n']['Digests file not found.'] = 'Fichier de contrôle introuvable.'; -$GLOBALS['__l10n']['No file to download'] = 'Aucun fichier à télécharger.'; -$GLOBALS['__l10n']['Root directory is not writable.'] = 'Le répertoire principal n\'est pas accessible en écriture.'; -$GLOBALS['__l10n']['An error occurred while downloading archive.'] = 'Une erreur est survenue lors du téléchargement de l\'archive.'; -$GLOBALS['__l10n']['Archive not found.'] = 'L\'archive n\'a pas été trouvée.'; -$GLOBALS['__l10n']['Unable to read current digests file.'] = 'Impossible de lire le fichier de contrôle actuel.'; -$GLOBALS['__l10n']['Downloaded file seems not to be a valid archive.'] = 'Le fichier téléchargé ne semble pas être une archive valide.'; -$GLOBALS['__l10n']['Incomplete archive.'] = 'Archive incomplète.'; -$GLOBALS['__l10n']['Unable to read digests file.'] = 'Impossible de lire le fichier de contrôle.'; -$GLOBALS['__l10n']['Invalid digests file.'] = 'Fichier de contrôle invalide.'; -$GLOBALS['__l10n']['SQLite Database Schema cannot be upgraded.'] = 'Le schema de base de données SQLite ne peut pas être mis à jour.'; -$GLOBALS['__l10n']['Something went wrong with auto upgrade:'] = 'Une erreur est survenue durant la mise à jour automatique :'; -?> \ No newline at end of file +'; +L10n::$locales['Send an e-mail'] = 'Envoyer un email'; +L10n::$locales['Information collected'] = 'Informations recueillies'; +L10n::$locales['Date:'] = 'Date :'; +L10n::$locales['Comment submitted'] = 'Commentaire déposé'; +L10n::$locales['Comment:'] = 'Commentaire :'; +L10n::$locales['Spam comments have been successfully deleted.'] = 'Les commentaires indésirables ont été supprimés.'; +L10n::$locales['You have one spam comment.'] = 'Vous avez un commentaire indésirable.'; +L10n::$locales['Show it.'] = 'L\'afficher.'; +L10n::$locales['You have %s spam comments.'] = 'Vous avez %s commentaires indésirables.'; +L10n::$locales['Show them.'] = 'Les afficher.'; +L10n::$locales['Delete all spams'] = 'Supprimer tous les indésirables'; +L10n::$locales['Selected comments action:'] = 'Action sur les commentaires sélectionnés :'; +L10n::$locales['The following plugins have been disabled :'] = 'Les plugins suivants ont été désactivés :'; +L10n::$locales['Documentation and support'] = 'Documentation et support'; +L10n::$locales['Dashboard area\'s drag and drop is disabled'] = 'L\'ordonnancement par glisser-déposer des zones du tableau de bord est désactivé'; +L10n::$locales['Dashboard area\'s drag and drop is enabled'] = 'L\'ordonnancement par glisser-déposer des zones du tableau de bord est activé'; +L10n::$locales['Dashboard'] = 'Tableau de bord'; +L10n::$locales['Make this blog my default blog'] = 'Définir comme blog par défaut'; +L10n::$locales['This blog is offline'] = 'Ce blog est hors ligne'; +L10n::$locales['This blog is removed'] = 'Ce blog est retiré de la publication'; +L10n::$locales['%s is not defined, you should edit your configuration file.'] = '%s n\'est pas défini, vous devriez corriger votre fichier de configuration.'; +L10n::$locales['See documentation for more information.'] = 'Voir la documentation pour plus d\'information.'; +L10n::$locales['The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to "DC_TPL_CACHE" in inc/config.php file.'] = 'Le répertoire de cache n\'existe pas ou n\'est pas accessible en écriture. Vous devez créer ce répertoire avec les droits suffisants et affecter celui-ci à "DC_TPL_CACHE" dans le fichier inc/config.php.'; +L10n::$locales['The cache directory does not exist or is not writable. You should contact your administrator.'] = 'Le répertoire de cache n\'existe pas ou n\'est pas accessible en écriture. Vous devriez contacter votre administrateur·rice.'; +L10n::$locales['Following plugins have been installed:'] = 'Les plugins suivants ont été installés :'; +L10n::$locales['Following plugins have not been installed:'] = 'Les plugins suivants n\'ont pas été installés :'; +L10n::$locales['Errors have occured with following plugins:'] = 'Des erreurs se sont produites avec les plugins suivants :'; +L10n::$locales['Quick post'] = 'Billet rapide'; +L10n::$locales['Content:'] = 'Contenu :'; +L10n::$locales['Content'] = 'Contenu'; +L10n::$locales['Add a new category'] = 'Créer une nouvelle catégorie'; +L10n::$locales['This category will be created when you will save your post.'] = 'Cette catégorie sera créée lorsque vous enregistrerez votre billet.'; +L10n::$locales['Save and publish'] = 'Enregister et publier'; +L10n::$locales['Invalid language zip file.'] = 'Fichier zip de langue invalide.'; +L10n::$locales['The zip file does not appear to be a valid Dotclear language pack.'] = 'Le fichier zip ne semble pas être un fichier de langue Dotclear valide.'; +L10n::$locales['An error occurred during language upgrade.'] = 'Une erreur est survenue durant la mise à jour de la langue.'; +L10n::$locales['No such installed language'] = 'Cette langue n\'est pas installée'; +L10n::$locales['You can\'t remove English language.'] = 'Vous ne pouvez pas supprimer la langue anglaise.'; +L10n::$locales['Permissions to delete language denied.'] = 'Permission de supprimer la langue refusée.'; +L10n::$locales['Language has been successfully deleted.'] = 'La langue a été supprimée.'; +L10n::$locales['Invalid language file URL.'] = 'URL de fichier de langue invalide.'; +L10n::$locales['Language has been successfully upgraded'] = 'La langue a été mise à jour.'; +L10n::$locales['Language has been successfully installed.'] = 'La langue a été installée.'; +L10n::$locales['Languages management'] = 'Gestion des langues'; +L10n::$locales['Here you can install, upgrade or remove languages for your Dotclear installation.'] = 'Sur cette page, vous pouvez installer, mettre à jour ou supprimer des langues de votre installation de Dotclear.'; +L10n::$locales['You can change your user language in your preferences or change your blog\'s main language in your blog settings.'] = 'Vous pouvez changer votre langue d\'utilisateur·rice dans vos préférences ou changer la langue principale de votre blog dans vos Paramètres du blog.'; +L10n::$locales['Installed languages'] = 'Langues installées'; +L10n::$locales['No additional language is installed.'] = 'Aucune langue supplémentaire n\'est installée.'; +L10n::$locales['Language'] = 'Langue'; +L10n::$locales['Install or upgrade languages'] = 'Installer ou mettre à jour une langue'; +L10n::$locales['You can install or remove a language by adding or removing the relevant directory in your %s folder.'] = 'Vous pouvez installer ou supprimer une langue en ajoutant ou supprimant le répertoire correspondant dans votre répertoire %s.'; +L10n::$locales['Available languages'] = 'Langues disponibles'; +L10n::$locales['You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s.'] = 'Vous pouvez télécharger et installer une langue supplémentaire directement depuis Dotclear.net. Les langues proposées sont basées sur votre version : %s.'; +L10n::$locales['Language:'] = 'Langue :'; +L10n::$locales['Install language'] = 'Installer la langue'; +L10n::$locales['You can install languages by uploading zip files.'] = 'Vous pouvez installer des langues en déposant des fichiers zip.'; +L10n::$locales['Language zip file:'] = 'Fichier zip de la langue :'; +L10n::$locales['Upload language'] = 'Déposer la langue'; +L10n::$locales['Add a link'] = 'Ajouter un lien'; +L10n::$locales['Link URL:'] = 'URL du lien :'; +L10n::$locales['Link title:'] = 'Titre du lien :'; +L10n::$locales['Link language:'] = 'Langue du lien :'; +L10n::$locales['Insert'] = 'Insérer'; +L10n::$locales['Not a valid directory'] = 'Répertoire invalide'; +L10n::$locales['Directory or file "%s" already exists.'] = 'Le répertoire ou le fichier "%s" existe déjà .'; +L10n::$locales['Directory "%s" has been successfully created.'] = 'Le répertoire "%s" a été créé.'; +L10n::$locales['Files have been successfully uploaded.'] = 'Le fichier a été chargé.'; +L10n::$locales['Successfully delete one media.'] = [ + 'Suppression d\'un média effectuée.', + 'Suppression de %d médias effectuée.', +]; +L10n::$locales['Directory has been successfully removed.'] = 'Le répertoire a été supprimé.'; +L10n::$locales['File has been successfully removed.'] = 'Le fichier a été supprimé.'; +L10n::$locales['Directory "%s" has been successfully completed.'] = 'Les miniatures manquantes du répertoire "%s" ont été construites.'; +L10n::$locales['confirm removal'] = 'Confirmer la suppression'; +L10n::$locales['Are you sure you want to remove %s?'] = 'Ãtes-vous certain·e de vouloir supprimer %s ?'; +L10n::$locales['Yes'] = 'oui'; +L10n::$locales['Remove this folder from your favorites'] = 'Retirer ce dossier de vos favoris'; +L10n::$locales['Add this folder to your favorites'] = 'Ajouter ce dossier à vos favoris'; +L10n::$locales['Goto recent folder:'] = 'Aller au dossier récent :'; +L10n::$locales['You do not have sufficient permissions to write to this folder.'] = 'Vous n\'avez pas les droits suffisants pour écrire dans ce répertoire.'; +L10n::$locales['Select a file by clicking on %s'] = 'Choisissez un fichier en cliquant sur %s'; +L10n::$locales['Choose selected medias'] = 'Choisir les médias sélectionnés'; +L10n::$locales['Select files and click on %s button'] = 'Selectionnez les fichiers et cliquez sur le bouton %s'; +L10n::$locales['or'] = 'ou'; +L10n::$locales['upload a new file'] = 'envoyez un nouveau fichier'; +L10n::$locales['Choose a file to attach to entry %s by clicking on %s'] = 'Choisissez un fichier à attacher au billet %s en cliquant sur %s'; +L10n::$locales['Choose a file to insert into entry by clicking on %s'] = 'Choisissez un fichier à insérer dans le billet en cliquant sur %s'; +L10n::$locales['Grid display mode'] = 'Afficher sous forme de grille'; +L10n::$locales['List display mode'] = 'Afficher sous forme de liste'; +L10n::$locales['Remove selected medias'] = 'Supprimer les médias sélectionnés'; +L10n::$locales['In %s:'] = 'Dans %s :'; +L10n::$locales['Create new directory'] = 'Créer un répertoire'; +L10n::$locales['Directory Name:'] = 'Nom du répertoire :'; +L10n::$locales['Build missing thumbnails in directory'] = 'Construire les miniatures manquantes des images du répertoire'; +L10n::$locales['Build'] = 'Construire'; +L10n::$locales['Backup content of %s'] = 'Sauvegarder le contenu de %s'; +L10n::$locales['Download zip file'] = 'Télécharger un fichier zip'; +L10n::$locales['Add files'] = 'Ajouter des fichiers'; +L10n::$locales['Please take care to publish media that you own and that are not protected by copyright.'] = 'Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés par le droit d\'auteur.'; +L10n::$locales['Maximum file size allowed:'] = 'Taille maximale de fichier autorisée :'; +L10n::$locales['Private'] = 'Privé'; +L10n::$locales['To send several files at the same time, you can activate the enhanced uploader in'] = 'Pour envoyer plusieurs fichiers à la fois, vous pouvez activer l\'interface avancée dans'; +L10n::$locales['Refresh'] = 'Actualiser'; +L10n::$locales['Clear all'] = 'Tout annuler'; +L10n::$locales['Current settings for medias and images are defined in %s'] = 'Les réglages actuels pour les médias et les images sont définis dans les %s'; +L10n::$locales['Not a valid file'] = 'Fichier invalide'; +L10n::$locales['File has been successfully updated.'] = 'Le fichier a été mis à jour.'; +L10n::$locales['Thumbnails have been successfully updated.'] = 'Les miniatures ont été mises à jour.'; +L10n::$locales['Zip file has been successfully extracted.'] = 'Le fichier zip a été extrait.'; +L10n::$locales['Default media insertion settings have been successfully updated.'] = 'Les paramètres par défaut d\'insertion des médias ont été mis à jour.'; +L10n::$locales['Media insertion settings have been successfully registered for this folder.'] = 'Les réglages d\'insertion ont été enregistrés pour ce dossier.'; +L10n::$locales['Media insertion settings have been successfully removed for this folder.'] = 'Les réglages d\'insertion ont été supprimés pour ce dossier.'; +L10n::$locales['Select media item'] = 'Insérer un média'; +L10n::$locales['Image size:'] = 'Taille de l\'image :'; +L10n::$locales['Select'] = 'Sélectionner'; +L10n::$locales['Insert media item'] = 'Insérer un média'; +L10n::$locales['Image legend and title'] = 'Légende et titre de l\'image'; +L10n::$locales['Title: '] = 'Titre : '; +L10n::$locales['Image alignment'] = 'Alignement de l\'image'; +L10n::$locales['Image insertion'] = 'Insertion de l\'image'; +L10n::$locales['As a single image'] = 'En tant qu\'image uniquement'; +L10n::$locales['As a link to the original image'] = 'En tant que lien vers l\'image originale'; +L10n::$locales['MP3 disposition'] = 'Disposition du MP3'; +L10n::$locales['Please note that you cannot insert mp3 files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier mp3 avec l\'éditeur visuel.'; +L10n::$locales['Please note that you cannot insert video files with visual editor.'] = 'Merci de noter que vous ne pouvez pas insérer de fichier vidéo avec l\'éditeur visuel.'; +L10n::$locales['Video size'] = 'Taille de la vidéo'; +L10n::$locales['Width:'] = 'Largeur :'; +L10n::$locales['Height:'] = 'Hauteur :'; +L10n::$locales['Video disposition'] = 'Disposition de la vidéo'; +L10n::$locales['Media item will be inserted as a link.'] = 'Le média sera inséré en tant que lien.'; +L10n::$locales['Make current settings as default'] = 'Mémoriser ces réglages d\'insertion'; +L10n::$locales['For the blog'] = 'Pour le blog'; +L10n::$locales['For this folder only'] = 'Pour ce dossier seulement'; +L10n::$locales['Settings exist for this folder:'] = 'Des réglages d\'insertion existent pour ce dossier :'; +L10n::$locales['Remove them'] = 'Les supprimer'; +L10n::$locales['Media details'] = 'Détails du média'; +L10n::$locales['Available sizes:'] = 'Tailles disponibles :'; +L10n::$locales['Thumbnail details'] = 'Détails de la miniature'; +L10n::$locales['Image width:'] = 'Largeur de l\'image :'; +L10n::$locales['Image height:'] = 'Hauteur de l\'image :'; +L10n::$locales['File size:'] = 'Taille du fichier :'; +L10n::$locales['File URL:'] = 'URL du fichier :'; +L10n::$locales['File owner:'] = 'Propriétaire du fichier :'; +L10n::$locales['File type:'] = 'Type de fichier :'; +L10n::$locales['Show entries containing this media'] = 'Afficher les publications contenant ce média'; +L10n::$locales['Entries containing this media'] = 'publications contenant ce média'; +L10n::$locales['No entry seems contain this media.'] = 'Aucune publication ne semble contenir ce média.'; +L10n::$locales['published'] = 'publié'; +L10n::$locales['unpublished'] = 'non publié'; +L10n::$locales['scheduled'] = 'programmé'; +L10n::$locales['pending'] = 'en attente'; +L10n::$locales['Image details'] = 'Détails de l\'image'; +L10n::$locales['No detail'] = 'Aucun détail'; +L10n::$locales['Updates and modifications'] = 'Mises à jour et modifications'; +L10n::$locales['Update thumbnails'] = 'Mettre à jour les miniatures'; +L10n::$locales['This will create or update thumbnails for this image.'] = 'Ceci va créer ou mettre à jour les miniatures pour cette image.'; +L10n::$locales['Extract in a new directory'] = 'Extraire dans un nouveau répertoire'; +L10n::$locales['Extract in current directory'] = 'Extraire dans le répertoire actuel'; +L10n::$locales['Extract archive'] = 'Extraire l\'archive'; +L10n::$locales['This will extract archive in a new directory that should not exist yet.'] = 'Ceci va extraire l\'archive dans un nouveau répertoire qui ne doit pas encore exister.'; +L10n::$locales['This will extract archive in current directory and will overwrite existing files or directory.'] = 'Ceci va extraire l\'archive dans le répertoire actuel et écrasera les fichiers ou répertoires existants.'; +L10n::$locales['Extract mode:'] = 'Mode d\'extraction :'; +L10n::$locales['Extract'] = 'Extraire'; +L10n::$locales['Change media properties'] = 'Changer les propriétés du média'; +L10n::$locales['File name:'] = 'Nom du fichier :'; +L10n::$locales['File title:'] = 'Titre du fichier :'; +L10n::$locales['File description:'] = 'Description du fichier :'; +L10n::$locales['File date:'] = 'Date du fichier :'; +L10n::$locales['New directory:'] = 'Nouveau répertoire :'; +L10n::$locales['Change file'] = 'Changer le fichier'; +L10n::$locales['Choose a file:'] = 'Choisir un fichier :'; +L10n::$locales['Maximum size %s'] = 'Taille maximale %s'; +L10n::$locales['Delete this media'] = 'Supprimer ce média'; +L10n::$locales['No content found on this plugin.'] = 'Aucun contenu pour ce plugin.'; +L10n::$locales['Plugin not found'] = 'Plugin introuvable'; +L10n::$locales['The plugin you reached does not exist or does not have an admin page.'] = 'Le plugin que vous essayez d\'atteindre n\'existe pas ou n\'a pas de page d\'administration.'; +L10n::$locales['Manual checking of plugins update done successfully.'] = 'La vérification manuelle de mise à jour des plugins a été effectuée.'; +L10n::$locales['Force checking update of plugins'] = 'Forcer la vérification de mise à jour des plugins'; +L10n::$locales['Update plugins'] = 'Mise à jour des plugins'; +L10n::$locales['There is one plugin to update available from repository.'] = [ + 'Il y a un plugin à mettre à jour depuis le dépôt.', + 'Il y a %s plugins à mettre à jour depuis le dépôt.', +]; +L10n::$locales['Installed plugins'] = 'Plugins installés'; +L10n::$locales['Activated plugins'] = 'Plugins activés'; +L10n::$locales['You can configure and manage installed plugins from this list.'] = 'Vous pouvez configurer et gérer les plugins installés depuis cette liste.'; +L10n::$locales['Deactivated plugins'] = 'Plugins désactivés'; +L10n::$locales['Deactivated plugins are installed but not usable. You can activate them from here.'] = 'Les plugins désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page.'; +L10n::$locales['Add plugins'] = 'Ajouter des plugins'; +L10n::$locales['Add plugins from repository'] = 'Ajouter des plugins depuis le dépôt'; +L10n::$locales['Add plugins from a package'] = 'Ajouter des plugins depuis un package'; +L10n::$locales['You can install plugins by uploading or downloading zip files.'] = 'Vous pouvez installer des plugins en déposant ou téléchargeant des fichiers zip.'; +L10n::$locales['Some functions are disabled, please give write access to your plugins directory to enable them.'] = 'Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de plugins pour les activer.'; +L10n::$locales['Plugin configuration'] = 'Configuration du plugin'; +L10n::$locales['Edit post'] = 'Modifier le billet'; +L10n::$locales['This entry does not exist.'] = 'Ce billet n\'existe pas.'; +L10n::$locales['Next entry'] = 'Billet suivant'; +L10n::$locales['Previous entry'] = 'Billet précédent'; +L10n::$locales['All pings sent.'] = 'Tous les rétroliens ont été envoyés.'; +L10n::$locales['Invalid publication date'] = 'Date de publication invalide'; +L10n::$locales['The post "%s" has been successfully updated'] = 'Le billet "%s" a été mis à jour.'; +L10n::$locales['“%s”'] = '“%s”'; +L10n::$locales['Entry has been successfully updated.'] = 'Le billet a été mis à jour.'; +L10n::$locales['File has been successfully attached.'] = 'Le fichier a été attaché.'; +L10n::$locales['Attachment has been successfully removed.'] = 'L\'annexe a été retirée.'; +L10n::$locales['Don\'t forget to validate your XHTML conversion by saving your post.'] = 'Enregistrez votre billet pour valider la transformation en HTML.'; +L10n::$locales['Go to this entry on the site'] = 'Voir ce billet sur le site'; +L10n::$locales['Entry status'] = 'Ãtat du billet'; +L10n::$locales['Publication date and hour'] = 'Date et heure de publication'; +L10n::$locales['Entry language'] = 'Langue du billet'; +L10n::$locales['Text formatting'] = 'Formatage du texte'; +L10n::$locales['Convert to HTML'] = 'Convertir en HTML'; +L10n::$locales['Filing'] = 'Classement'; +L10n::$locales['Selected entry'] = 'Billet sélectionné'; +L10n::$locales['Options'] = 'Options'; +L10n::$locales['Comments and trackbacks list'] = 'Liste des commentaires et des rétroliens'; +L10n::$locales['Warning: Comments are not more accepted for this entry.'] = 'Attention : les commentaires ne sont plus acceptés pour ce billet.'; +L10n::$locales['Comments are not accepted on this blog so far.'] = 'Les commentaires ne sont pas acceptés sur ce blog pour le moment.'; +L10n::$locales['Warning: Trackbacks are not more accepted for this entry.'] = 'Attention : les rétroliens ne sont plus acceptés pour ce billet.'; +L10n::$locales['Trackbacks are not accepted on this blog so far.'] = 'Les rétroliens sont fermés sur ce blog pour le moment.'; +L10n::$locales['Edit basename'] = 'URL spécifique'; +L10n::$locales['Warning: If you set the URL manually, it may conflict with another entry.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec un autre billet.'; +L10n::$locales['Excerpt:'] = 'Extrait :'; +L10n::$locales['Introduction to the post.'] = 'Introduction au billet.'; +L10n::$locales['Personal notes:'] = 'Notes personnelles :'; +L10n::$locales['Unpublished notes.'] = 'Notes non publiées.'; +L10n::$locales['Add a comment'] = 'Ajouter un commentaire'; +L10n::$locales['Trackbacks received'] = 'Rétroliens reçus'; +L10n::$locales['No trackback'] = 'Aucun rétrolien'; +L10n::$locales['Selected trackbacks action:'] = 'Action sur les rétroliens sélectionnés :'; +L10n::$locales['Ping blogs'] = 'Envoyer des rétroliens'; +L10n::$locales['URLs to ping:'] = 'URLs à rétrolier :'; +L10n::$locales['Excerpt to send:'] = 'Extrait à envoyer :'; +L10n::$locales['Auto discover ping URLs'] = 'Découverte automatique des URL à rétrolier'; +L10n::$locales['Previously sent pings'] = 'Rétroliens déjà envoyés'; +L10n::$locales['select this comment'] = 'Sélectionner ce commentaire'; +L10n::$locales['select this trackback'] = 'Sélectionner ce rétrolien'; +L10n::$locales['Edit this comment'] = 'Modifier ce commentaire'; +L10n::$locales['This attachment does not exist'] = 'Cette annexe n\'existe pas'; +L10n::$locales['Remove attachment'] = 'Supprimer l\'annexe'; +L10n::$locales['Attachment'] = 'Annexe'; +L10n::$locales['Are you sure you want to remove this attachment?'] = 'Ãtes-vous certain·e de vouloir supprimer cette annexe ?'; +L10n::$locales['Selected entries have been successfully updated.'] = 'Les publications sélectionnées ont été modifiées.'; +L10n::$locales['Selected entries have been successfully deleted.'] = 'Les publications sélectionnées ont été supprimées.'; +L10n::$locales['Selected entries action:'] = 'Action sur les billets sélectionnés :'; +L10n::$locales['Add a link to an entry'] = 'Ajouter un lien vers une publication'; +L10n::$locales['Entry type:'] = 'Type de publications :'; +L10n::$locales['Ok'] = 'Ok'; +L10n::$locales['Search entry:'] = 'Rechercher une publication :'; +L10n::$locales['cancel'] = 'annuler'; +L10n::$locales['Dotclear news not available'] = 'Nouvelles de Dotclear non disponibles'; +L10n::$locales['Dotclear news'] = 'Actualité de Dotclear'; +L10n::$locales['%d %B %Y:'] = '%d %B %Y :'; +L10n::$locales['Dotclear update not available'] = 'Mise à jour de Dotclear non disponible'; +L10n::$locales['Dotclear %s is available!'] = 'Dotclear %s est disponible !'; +L10n::$locales['Upgrade now'] = 'Mettre à jour maintenant'; +L10n::$locales['Remind me later'] = 'Me le rappeler plus tard'; +L10n::$locales['Information about this version'] = 'Informations sur cette version'; +L10n::$locales['This update may potentially require some precautions, you should carefully read the information post associated with this release (see above).'] = 'Cette mise à jour peut potentiellement nécessiter des précautions, vous devriez lire attentivement le billet d\'information associé à cette version (voir ci-dessus).'; +L10n::$locales['A new version of Dotclear is available but needs PHP version ⥠%s, your\'s is currently %s'] = 'Une nouvelle version de Dotclear est disponible mais nécessite une version de PHP ⥠%s, la votre est actuellement la %s'; +L10n::$locales['The next versions of Dotclear will not support PHP version < %s, your\'s is currently %s'] = 'Les prochaines versions de Dotclear ne supporteront pas les versions de PHP < %s, la votre est actuellement la %s'; +L10n::$locales['No updates are available'] = 'Aucune mise à jour n\'est disponible'; +L10n::$locales['An update is available'] = [ + 'Une mise à jour est disponible.', + '%s mises à jour sont disponibles.', +]; +L10n::$locales['List options saved'] = 'Options de liste sauvegardées'; +L10n::$locales['Search options'] = 'Options de recherche'; +L10n::$locales['Query:'] = 'Requête :'; +L10n::$locales['In:'] = 'Où :'; +L10n::$locales['No results found'] = 'Pas de résultats'; +L10n::$locales['Search in entries'] = 'Rechercher dans les billets'; +L10n::$locales['Search in comments'] = 'Rechercher dans les commentaires'; +L10n::$locales['one entry found'] = [ + 'un billet trouvé', + '%d billets trouvés', +]; +L10n::$locales['one comment found'] = [ + 'un commentaire trouvé', + '%d commentaires trouvés', +]; +L10n::$locales['Dotclear update'] = 'Mise à jour de Dotclear'; +L10n::$locales['Precheck update error'] = 'Erreur avant mise à jour'; +L10n::$locales['Backup directory does not exist'] = 'Le répertoire de sauvegarde est inexistant'; +L10n::$locales['Access denied'] = 'L\'accès est refusé'; +L10n::$locales['Unable to delete file %s'] = 'Impossible de supprimer le fichier %s'; +L10n::$locales['Downloaded Dotclear archive seems to be corrupted. Try download it again.'] = 'L\'archive de Dotclear téléchargée semble être corrompue. Essayer de la télécharger à nouveau.'; +L10n::$locales['If this problem persists try to update manually.'] = 'Si le problème persiste essayer de mettre à jour manuellement.'; +L10n::$locales['The following files of your Dotclear installation have been modified so we won\'t try to update your installation. Please try to update manually.'] = 'Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement.'; +L10n::$locales['The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être lus. Veuillez corriger ceci ou créer un fichier de backup nommé %s manuellement.'; +L10n::$locales['The following files of your Dotclear installation cannot be written. Please fix this or try to update manually.'] = 'Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger la situation ou mettre à jour manuellement.'; +L10n::$locales['Manual checking of update done successfully.'] = 'La vérification manuelle de mise à jour a été effectuée.'; +L10n::$locales['No newer Dotclear version available.'] = 'Aucune nouvelle version de Dotclear n\'est disponible.'; +L10n::$locales['Force checking update Dotclear'] = 'Forcer la vérification de mise à jour de Dotclear'; +L10n::$locales['Dotclear %s is available.'] = 'Dotclear %s est disponible.'; +L10n::$locales['To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory.'] = 'Pour mettre à jour votre installation de Dotclear, cliquez sur le bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera créé dans votre répertoire principal.'; +L10n::$locales['Update Dotclear'] = 'Mettre à jour Dotclear'; +L10n::$locales['Manage backup files'] = 'Gestion des fichiers de sauvegarde'; +L10n::$locales['Update backup files'] = 'Sauvegardes des mises à jour'; +L10n::$locales['The following files are backups of previously updates. You can revert your previous installation or delete theses files.'] = 'Les fichiers suivants sont des sauvegardes de mises à jour précédentes. Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers.'; +L10n::$locales['Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version.'] = 'Merci de noter que rétablir votre version de Dotclear peut avoir des effets indésirables. N\'envisagez ceci que si vous rencontrez d\'importantes difficultés avec cette nouvelle version.'; +L10n::$locales['You should not revert to version prior to last one (%s).'] = 'Vous ne devez pas rétablir une version précédant la dernière (%s).'; +L10n::$locales['Delete selected file'] = 'Supprimer le fichier sélectionné'; +L10n::$locales['Revert to selected file'] = 'Rétablir le fichier sélectionné'; +L10n::$locales['Congratulations, you\'re one click away from the end of the update.'] = 'Félicitations, vous êtes à un clic de la fin de la mise à jour.'; +L10n::$locales['Finish the update.'] = 'Finir la mise à jour.'; +L10n::$locales['New user'] = 'Nouvel utilisateur·rice'; +L10n::$locales['User has been successfully updated.'] = 'L\'utilisateur·rice a été mis·e à jour.'; +L10n::$locales['User "%s" already exists.'] = 'L\'utilisateur·rice "%s" existe déjà .'; +L10n::$locales['User has been successfully created.'] = 'L\'utilisateur·rice a été créé·e.'; +L10n::$locales['User has no permission, he will not be able to login yet. See below to add some.'] = 'L\'utilisateur·rice n\'a aucune permission, elle ou il ne sera pas en mesure de se connecter. Voir plus bas pour en ajouter.'; +L10n::$locales['User profile'] = 'Profil utilisateur·rice'; +L10n::$locales['User ID:'] = 'Identifiant (login) :'; +L10n::$locales['Login'] = 'Identifiant'; +L10n::$locales['Warning:'] = 'Attention :'; +L10n::$locales['If you change your username, you will have to log in again.'] = 'Si vous changez votre login, vous devrez vous identifier à nouveau.'; +L10n::$locales['Password change required to connect'] = 'Changement de mot de passe requis à la prochaine connexion'; +L10n::$locales['Last Name:'] = 'Nom :'; +L10n::$locales['First Name:'] = 'Prénom :'; +L10n::$locales['Display name:'] = 'Pseudonyme :'; +L10n::$locales['Mandatory for password recovering procedure.'] = 'Indispensable pour la procédure de récupération de mot de passe.'; +L10n::$locales['Alternate emails (comma separated list):'] = 'Emails alternatifs (liste séparée par des virgules) :'; +L10n::$locales['Invalid emails will be automatically removed from list.'] = 'Les emails invalides seront automatiquement retirés de la liste.'; +L10n::$locales['Alternate URLs (comma separated list):'] = 'URLs alternatives (liste séparée par des virgules) :'; +L10n::$locales['Invalid URLs will be automatically removed from list.'] = 'Les URLs invalides seront automatiquement retirées de la liste.'; +L10n::$locales['Interface'] = 'Interface'; +L10n::$locales['Timezone:'] = 'Fuseau horaire :'; +L10n::$locales['Edition'] = 'Ãdition'; +L10n::$locales['Preferred format:'] = 'Format d\'édition préféré :'; +L10n::$locales['Default entry status:'] = 'Ãtat des billets par défaut :'; +L10n::$locales['Entry edit field height:'] = 'Taille de la zone d\'édition :'; +L10n::$locales['Save and create another'] = 'Enregistrer et créer un·e nouveau·elle'; +L10n::$locales['Permissions'] = 'Permissions'; +L10n::$locales['Add new permissions'] = 'Ajouter de nouvelles permissions'; +L10n::$locales['No permissions so far.'] = 'Aucune permission pour le moment.'; +L10n::$locales['%s is super admin (all rights on all blogs).'] = '%s est super administrateur·rice (tous les droits sur tous les blogs).'; +L10n::$locales['Direct links'] = 'Liens directs'; +L10n::$locales['List of posts'] = 'Liste des billets'; +L10n::$locales['List of comments'] = 'Liste des commentaires'; +L10n::$locales['Light'] = 'Clair'; +L10n::$locales['Dark'] = 'Sombre'; +L10n::$locales['Automatic'] = 'Automatique'; +L10n::$locales['Smallest'] = 'Très petite'; +L10n::$locales['Smaller'] = 'Petite'; +L10n::$locales['Larger'] = 'Grande'; +L10n::$locales['Largest'] = 'Très grande'; +L10n::$locales['Blog description (in blog parameters)'] = 'La description du blog (paramètres du blog)'; +L10n::$locales['Category description'] = 'La description des catégories'; +L10n::$locales['If you want to change your email or password you must provide your current password.'] = 'Si vous voulez modifier votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel.'; +L10n::$locales['Personal information has been successfully updated.'] = 'Vos informations personnelles ont été enregistrées.'; +L10n::$locales['Personal options has been successfully updated.'] = 'Vos options personnelles ont été enregistrées.'; +L10n::$locales['Dashboard options has been successfully updated.'] = 'Vos options du tableau de bord ont été enregistrées.'; +L10n::$locales['No favorite selected'] = 'Aucun favori sélectionné'; +L10n::$locales['Favorites have been successfully added.'] = 'Les favoris ont été ajoutés.'; +L10n::$locales['Favorites have been successfully removed.'] = 'Les favoris ont été retirés.'; +L10n::$locales['Favorites have been successfully updated.'] = 'Les favoris ont été mis à jour.'; +L10n::$locales['Default favorites have been successfully updated.'] = 'Les favoris par défaut ont été enregistrés.'; +L10n::$locales['Dashboard items order have been successfully reset.'] = 'Le positionnement des éléments du tableau de bord a été réinitialisé.'; +L10n::$locales['My profile'] = 'Mon profil'; +L10n::$locales['Language for my interface:'] = 'Langue de mon interface :'; +L10n::$locales['My timezone:'] = 'Mon fuseau horaire :'; +L10n::$locales['Change my password'] = 'Changer mon mot de passe'; +L10n::$locales['Confirm new password:'] = 'Confirmer le nouveau mot de passe :'; +L10n::$locales['Your current password:'] = 'Votre mot de passe actuel :'; +L10n::$locales['If you have changed your email or password you must provide your current password to save these modifications.'] = 'Si vous avez modifié votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel pour enregistrer ces modifications.'; +L10n::$locales['Update my profile'] = 'Mettre à jour mon profil'; +L10n::$locales['My options'] = 'Mes options'; +L10n::$locales['Theme:'] = 'Thème :'; +L10n::$locales['Activate enhanced uploader in media manager'] = 'Activer l\'interface avancée de la médiathèque'; +L10n::$locales['Preview the entry being edited in a blank window or tab (depending on your browser settings).'] = 'Prévisualiser l\'entrée en cours d\'édition dans une fenêtre ou un onglet vierge (selon les paramètres de votre navigateur).'; +L10n::$locales['Disable javascript powered drag and drop for ordering items'] = 'Désactiver le glisser-déposer pour ordonnancer les éléments'; +L10n::$locales['If checked, numeric fields will allow to type the elements\' ordering number.'] = 'Si cette option est cochée, des champs numériques permettront d\'indiquer la position des éléments.'; +L10n::$locales['Hide all secondary information and notes'] = 'Cacher les informations secondaires et les notes'; +L10n::$locales['Hide help button'] = 'Cacher le bouton d\'aide'; +L10n::$locales['Show asynchronous requests indicator'] = 'Afficher l\'indicateur de requête asynchrone'; +L10n::$locales['Font size:'] = 'Taille de police de caractère :'; +L10n::$locales['Use operating system font'] = 'Utiliser la police système'; +L10n::$locales['Number of recent folders proposed in media manager:'] = 'Nombre de dossiers récents proposés dans la médiathèque :'; +L10n::$locales['Leave empty to ignore, displayed only if Javascript is enabled in your browser.'] = 'Laisser vide pour ignorer ; affiché seulement si Javascript est activé dans votre navigateur.'; +L10n::$locales['Do not use standard favicon'] = 'Ne pas utiliser le favicon standard de Dotclear'; +L10n::$locales['This will be applied for all users'] = 'Ce choix sera appliqué pour tous les utilisateur·rice·s'; +L10n::$locales['Disable Ad-blocker check'] = 'Désactiver la détection de bloqueurs de publicité'; +L10n::$locales['Some ad-blockers (Ghostery, Adblock plus, uBloc origin, â¦) may interfere with some feature as inserting link or media in entries with CKEditor; in this case you should disable it for this Dotclear installation (backend only). Note that Dotclear do not add ads ot trackers in the backend.'] = 'Certains bloqueurs de publicité (Ghostery, Adblock plus, uBloc origin, â¦) peuvent interférer avec certaines fonctionnalités comme l\'insertion de lien ou de média dans les entrées avec CKEditor ; dans ce cas vous devriez les désactiver pour cette installation Dotclear (administration seulement). Notez que Dotclear n\'ajoute aucune publicité ou pisteur dans les pages de l\'administration.'; +L10n::$locales['Optional columns displayed in lists'] = 'Colonnes optionnelles affichées dans les listes'; +L10n::$locales['Options for lists'] = 'Options des listes'; +L10n::$locales['Apply filters on the fly'] = 'Appliquer les filtres à la volée'; +L10n::$locales['Preferred editor for %s:'] = 'Ãditeur préféré pour le format %s :'; +L10n::$locales['Choose an editor'] = 'Choisissez un éditeur'; +L10n::$locales['Enable WYSIWYG mode'] = 'Activer l\'éditeur visuel'; +L10n::$locales['Display editor\'s toolbar at bottom of textarea (if possible)'] = 'Afficher la barre d\'outil des éditeurs en bas de la zone de saisie (si possible)'; +L10n::$locales['Use HTML editor for:'] = 'Utiliser l\'éditeur HTML pour :'; +L10n::$locales['Other options'] = 'Autres options'; +L10n::$locales['Save my options'] = 'Enregistrer mes options'; +L10n::$locales['position of %s'] = 'position de %s'; +L10n::$locales['Save order'] = 'Enregistrer l\'ordre'; +L10n::$locales['Delete selected favorites'] = 'Retirer les favoris sélectionnés'; +L10n::$locales['Are you sure you want to remove selected favorites?'] = 'Ãtes-vous sûr·e de vouloir retirer les favoris sélectionnés ?'; +L10n::$locales['If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation.'] = 'Si vous êtes super administrateur·rice, vous pouvez faire de ces favoris le jeu par défaut pour tous les blogs de l\'installation.'; +L10n::$locales['Define as default favorites'] = 'Définir comme favoris par défaut'; +L10n::$locales['Currently no personal favorites.'] = 'La liste de vos favoris est vide pour le moment.'; +L10n::$locales['Other available favorites'] = 'Autres favoris disponibles'; +L10n::$locales['(default favorite)'] = '(favori par défaut)'; +L10n::$locales['Add to my favorites'] = 'Ajouter à mes favoris'; +L10n::$locales['Menu'] = 'Menu'; +L10n::$locales['Display favorites at the top of the menu'] = 'Afficher les favoris en haut du menu'; +L10n::$locales['Dashboard icons'] = 'Icônes du tableau de bord'; +L10n::$locales['Display dashboard icons'] = 'Afficher les icônes du tableau de bord'; +L10n::$locales['Dashboard modules'] = 'Modules du tableau de bord'; +L10n::$locales['Display documentation links'] = 'Afficher les liens vers la documentation'; +L10n::$locales['Display Dotclear news'] = 'Afficher les nouvelles de Dotclear'; +L10n::$locales['Display quick entry form'] = 'Afficher le formulaire de billet rapide'; +L10n::$locales['Do not display Dotclear updates'] = 'Ne pas afficher les mises à jour de Dotclear'; +L10n::$locales['Save my dashboard options'] = 'Enregistrer les options de mon tableau de bord'; +L10n::$locales['Dashboard items order'] = 'Positionnement des éléments du tableau de bord'; +L10n::$locales['Reset dashboard items order'] = 'Réinitialiser le positionnement des éléments du tableau de bord'; +L10n::$locales['Set permissions'] = 'Définir les permissions'; +L10n::$locales['User has been successfully removed.'] = 'L\'utilisateur·rice a été supprimé·e.'; +L10n::$locales['The permissions have been successfully updated.'] = 'Les permissions ont été mises à jour.'; +L10n::$locales['Selected users action:'] = 'Action sur les utilisateur·rice·s sélectionné·e·s :'; +L10n::$locales['No blog or user given.'] = 'Vous n\'avez pas indiqué de blog ou d\'utilisateur'; +L10n::$locales['You cannot delete yourself.'] = 'Vous ne pouvez pas vous supprimer vous-même.'; +L10n::$locales['User has been successfully deleted.'] = 'L\'utilisateur·rice a été supprimé·e.'; +L10n::$locales['Back to user profile'] = 'Retour au profil de l\'utilisateur·rice'; +L10n::$locales['Choose one or more blogs to which you want to give permissions to users %s.'] = 'Choisissez un ou plusieurs blogs pour lesquels les utilisateur·rice·s suivant·e·s auront des permissions : %s.'; +L10n::$locales['Entries'] = 'Publications'; +L10n::$locales['select'] = 'sélectionner'; +L10n::$locales['You are about to change permissions on the following blogs for users %s.'] = 'Vous allez changer les permissions des utilisateur·rice·s %s pour ces blogs.'; +L10n::$locales['Validate permissions'] = 'Valider les permissions'; +L10n::$locales['Please set a master key (DC_MASTER_KEY) in configuration file.'] = 'Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration.'; +L10n::$locales['Dotclear is already installed.'] = 'Dotclear est déjà installé.'; +L10n::$locales['Dotclear cannot be installed.'] = 'Dotclear ne peut pas être installé.'; +L10n::$locales['Invalid email address'] = 'Adresse email incorrecte'; +L10n::$locales['My first blog'] = 'Mon premier blog'; +L10n::$locales['%A, %B %e %Y'] = '%A %e %B %Y'; +L10n::$locales['Welcome to Dotclear!'] = 'Bienvenue sur Dotclear !'; +L10n::$locales['This is your first entry. When you\'re ready to blog, log in to edit or delete it.'] = 'Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer.'; +L10n::$locales['Dotclear Team'] = 'L\'équipe Dotclear'; +L10n::$locales['This is a comment.
+To delete it, log in and view your blog\'s comments. Then you might remove or edit it.
'] = 'Ceci est un commentaire
+Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.
'; +L10n::$locales['Dotclear Install'] = 'Installation de Dotclear'; +L10n::$locales['show'] = 'voir'; +L10n::$locales['Dotclear installation'] = 'Installation de Dotclear'; +L10n::$locales['Cache directory %s is not writable.'] = 'Le répertoire de cache %s n\'est pas accessible en écriture.'; +L10n::$locales['Configuration file has been successfully created.'] = 'Le fichier de configuration a été créé.'; +L10n::$locales['User information'] = 'Informations utilisateur'; +L10n::$locales['Please provide the following information needed to create the first user.'] = 'Merci de fournir les informations suivantes pour créer le ou la premier·ière utilisateur·rice.'; +L10n::$locales['Username and password'] = 'Identifiant et mot de passe'; +L10n::$locales['All done!'] = 'C\'est terminé !'; +L10n::$locales['Dotclear has been successfully installed. Here is some useful information you should keep.'] = 'Dotclear est installé. Conservez les informations suivantes précieusement.'; +L10n::$locales['Your account'] = 'Votre compte'; +L10n::$locales['Your blog'] = 'Votre blog'; +L10n::$locales['Blog address:'] = 'Adresse du blog :'; +L10n::$locales['Administration interface:'] = 'Interface d\'administration :'; +L10n::$locales['Manage your blog now'] = 'Gérez votre blog'; +L10n::$locales['Installation can not be completed'] = 'L\'installation ne peut pas être terminée'; +L10n::$locales['For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem.'] = 'Pour les raisons ci-dessus, Dotclear ne peut pas être installé. Référez-vous à la documentation pour savoir comment corriger le problème.'; +L10n::$locales['Path %s is not writable.'] = 'Le chemin %s n\'est pas accessible en écriture.'; +L10n::$locales['Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this.'] = 'L\'assistant d\'installation Dotclear n\'a pas pu créer le fichier de configuration à votre place. Vous devez changer les droits du répertoire ou créer le fichier config.php manuellement. Référez-vous à la documentation pour voir comment procéder.'; +L10n::$locales['Cannot write "%s" directory.'] = 'Impossible d\'écrire dans le répertoire "%s".'; +L10n::$locales['Master email is not valid.'] = 'Adresse email principale incorrecte.'; +L10n::$locales['File %s does not exist.'] = 'Le fichier %s n\'existe pas.'; +L10n::$locales['Cannot write %s file.'] = 'Impossible d\'écrire le fichier %s.'; +L10n::$locales['Dotclear installation wizard'] = 'Assistant d\'installation de Dotclear'; +L10n::$locales['Welcome'] = 'Bienvenue'; +L10n::$locales['To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done.'] = 'Pour achever votre installation de Dotclear, il ne manque plus que les informations concernant votre base de données, puis vos informations personnelles. Remplissez simplement les deux formulaires suivants et vous pourrez commencer à utiliser votre blog.'; +L10n::$locales['Attention:'] = 'Attention :'; +L10n::$locales['this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually.'] = 'cet assistant peut ne pas fonctionner chez tous les hébergeurs. Si vous rencontrez un problème, vous trouverez comment créer le fichier de configuration dans la documentation.'; +L10n::$locales['System information'] = 'Informations système'; +L10n::$locales['Please provide the following information needed to create your configuration file.'] = 'Merci de fournir les informations suivantes qui sont nécessaires pour créer votre fichier de configuration.'; +L10n::$locales['Database type:'] = 'Type de base de données :'; +L10n::$locales['MySQLi'] = 'MySQLi'; +L10n::$locales['MySQLi (full UTF-8)'] = 'MySQLi (UTF-8 complet)'; +L10n::$locales['PostgreSQL'] = 'PostgreSQL'; +L10n::$locales['SQLite'] = 'SQLite'; +L10n::$locales['Driver'] = 'Pilote'; +L10n::$locales['Database Host Name:'] = 'Nom d\'hôte de la base de données :'; +L10n::$locales['Database Name:'] = 'Nom de la base de données :'; +L10n::$locales['Database User Name:'] = 'Nom d\'utilisateur·rice de la base de données :'; +L10n::$locales['Database Password:'] = 'Mot de passe de la base de données :'; +L10n::$locales['Database Tables Prefix:'] = 'Préfixe des tables de la base de données :'; +L10n::$locales['Prefix'] = 'Préfixe'; +L10n::$locales['Master Email: (used as sender for password recovery)'] = 'Email principal : (utilisé pour l\'envoi pour la récupération de mot de passe)'; +L10n::$locales['Continue'] = 'Continuer'; diff --git a/locales/fr/main.po b/locales/fr/main.po index dc99596..5d11158 100644 --- a/locales/fr/main.po +++ b/locales/fr/main.po @@ -1,2485 +1,6046 @@ -# French translation of DotClear -# Copyright (C) 2006. -# Olivier MeunierWe apologize for this temporary unavailability.
Thank you for your understanding.
Veuillez nous excuser pour cette indisponibilité momentanée.
Merci de votre compréhension.
This either means that the username and password information in your config.php file is incorrect or we can't contact the database server at \"%s\". This could mean your host's database server is down.
If you're unsure what these terms mean you should probably contact your host. If you still need help you can always visit the Dotclear Support Forums.
" +msgstr "Cela signifie soit que les informations d'identifiant ou de mot de passe de votre fichier config.php sont incorrects, soit que nous ne pouvons pas contacter le serveur de base de données à l'adresse \"%s\". Cela peut vouloir dire que le serveur en question est éteint.
Si vous n'êtes pas sûr·e de la signification de ces termes, vous devriez probablement contacter votre hébergeur·euse. Si vous avez besoin d'une aide supplémentaire, vous pouvez vous rendre sur le forum d'entraide Dotclear.
" + +#: src/App.php:502 src/Core/Frontend/Utility.php:132 +msgid "The following error was encountered while trying to read the database:" +msgstr "L'erreur suivante a été rencontrée lors de la tentative d'accès à la base de données :" + +#: src/App.php:592 +#, php-format +msgid "Unable to find or initialize class %s" +msgstr "Impossible de trouver ou d'initialiser la classe %s" + +#: src/Core/Backend/Action/Actions.php:109 +#: src/Core/Backend/Action/ActionsComments.php:118 +#: src/Core/Backend/Combos.php:257 src/Core/Backend/Listing/ListingPosts.php:87 +#: src/Core/Backend/Listing/ListingPostsMini.php:40 +#: src/Process/Backend/BlogPref.php:152 src/Process/Backend/BlogPref.php:187 +#: src/Process/Backend/Home.php:431 src/Process/Backend/MediaItem.php:604 +#: src/Process/Backend/Post.php:735 +msgid "Title" +msgstr "Titre" + +#: src/Core/Backend/Action/ActionsBlogs.php:36 +#: src/Core/Backend/Action/ActionsBlogs.php:62 +#: src/Core/Backend/Action/ActionsBlogs.php:69 +#: src/Core/Backend/Action/ActionsBlogs.php:102 +#: src/Core/Backend/Favorites.php:489 src/Core/Backend/Menus.php:241 +#: src/Core/Backend/UserPref.php:133 src/Process/Backend/Blog.php:100 +#: src/Process/Backend/BlogDel.php:90 src/Process/Backend/BlogPref.php:418 +msgid "Blogs" +msgstr "Blogs" + +#: src/Core/Backend/Action/ActionsBlogs.php:75 +msgid "Back to blogs list" +msgstr "Retour à la liste des blogs" + +#: src/Core/Backend/Action/ActionsBlogs.php:103 +msgid "Blogs actions" +msgstr "Actions sur les blogs" + +#: src/Core/Backend/Action/ActionsBlogs.php:135 +#: src/Core/Backend/Listing/ListingBlogs.php:52 +msgid "Blog id" +msgstr "Identifiant du blog" + +#: src/Core/Backend/Action/ActionsBlogs.php:135 src/Core/Backend/Combos.php:303 +#: src/Core/Backend/Listing/ListingBlogs.php:53 +#: src/Process/Backend/Blog.php:140 src/Process/Backend/BlogPref.php:471 +#: src/Process/Backend/UsersActions.php:226 +msgid "Blog name" +msgstr "Nom du blog" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:32 +#: src/Core/Backend/Action/ActionsCommentsDefault.php:34 +#: src/Core/Backend/Action/ActionsPostsDefault.php:39 +#: src/Core/Backend/Combos.php:260 src/Core/Backend/Combos.php:278 +#: src/Core/Backend/Combos.php:305 src/Core/Backend/Listing/ListingBlogs.php:57 +#: src/Core/Backend/Listing/ListingComments.php:112 +#: src/Core/Backend/Listing/ListingPosts.php:95 +#: src/Core/Backend/Listing/ListingPostsMini.php:43 +#: src/Process/Backend/Post.php:639 src/Process/Backend/Post.php:1085 +#: src/Process/Backend/UsersActions.php:229 +msgid "Status" +msgstr "Ãtat" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:33 +msgid "Set online" +msgstr "Mettre en ligne" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:34 +msgid "Set offline" +msgstr "Mettre hors-ligne" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:35 +msgid "Set as removed" +msgstr "Mettre à l'état retiré" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:40 +#: src/Core/Backend/Action/ActionsBlogsDefault.php:41 +#: src/Core/Backend/Action/ActionsCommentsDefault.php:49 +#: src/Core/Backend/Action/ActionsCommentsDefault.php:50 +#: src/Core/Backend/Action/ActionsPostsDefault.php:93 +#: src/Core/Backend/Action/ActionsPostsDefault.php:94 +#: src/Core/Backend/Listing/ListingMedia.php:200 +#: src/Core/Backend/ModulesList.php:1222 src/Process/Backend/Comment.php:311 +#: src/Process/Backend/Langs.php:271 src/Process/Backend/Post.php:823 +#: src/Process/Backend/Users.php:40 +msgid "Delete" +msgstr "Supprimer" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:61 +#: src/Core/Backend/Action/ActionsBlogsDefault.php:111 +msgid "No blog selected" +msgstr "Pas de blog sélectionné" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:92 +msgid "Selected blogs have been successfully updated." +msgstr "Les blogs sélectionnés ont été modifiées." + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:115 +#: src/Core/Backend/ModulesList.php:1557 src/Core/Backend/ThemesList.php:644 +#: src/Process/Backend/BlogDel.php:66 src/Process/Backend/Langs.php:130 +#: src/Process/Backend/Langs.php:171 src/Process/Backend/User.php:102 +#: src/Process/Backend/UsersActions.php:109 +msgid "Password verification failed" +msgstr "La vérification du mot de passe a échoué" + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:121 +#: src/Process/Backend/BlogPref.php:918 +msgid "The current blog cannot be deleted." +msgstr "Le blog courant ne peut être détruit." + +#: src/Core/Backend/Action/ActionsBlogsDefault.php:138 +#, php-format +msgid "%d blog has been successfully deleted" +msgid_plural "%d blogs have been successfully deleted" +msgstr[0] "%d blog a été supprimé" +msgstr[1] "Les %d blogs ont été supprimés" + +#: src/Core/Backend/Action/ActionsComments.php:36 +#: src/Core/Backend/Action/ActionsComments.php:62 +#: src/Core/Backend/Action/ActionsComments.php:69 +#: src/Core/Backend/Action/ActionsComments.php:102 +#: src/Core/Backend/Favorites.php:433 +#: src/Core/Backend/Listing/ListingPosts.php:91 +#: src/Core/Backend/Listing/ListingPosts.php:92 src/Core/Backend/Menus.php:151 +#: src/Core/Backend/UserPref.php:48 src/Core/Backend/UserPref.php:126 +#: src/Process/Backend/Post.php:869 src/Process/Backend/Post.php:878 +msgid "Comments" +msgstr "Commentaires" + +#: src/Core/Backend/Action/ActionsComments.php:75 +msgid "Back to comments list" +msgstr "Retour à la liste des commentaires" + +#: src/Core/Backend/Action/ActionsComments.php:103 +msgid "Comments actions" +msgstr "Action sur les commentaires" + +#: src/Core/Backend/Action/ActionsComments.php:118 +#: src/Core/Backend/Combos.php:259 src/Core/Backend/Combos.php:277 +#: src/Core/Backend/Listing/ListingComments.php:110 +#: src/Core/Backend/Listing/ListingPosts.php:90 +#: src/Core/Backend/Listing/ListingPostsMini.php:42 +#: src/Core/Backend/UserPref.php:47 src/Process/Backend/Comment.php:269 +#: src/Process/Backend/Post.php:912 src/Process/Backend/Post.php:1082 +msgid "Author" +msgstr "Auteur·rice" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:35 +#: src/Core/Backend/Action/ActionsPostsDefault.php:40 +msgid "Publish" +msgstr "Publier" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:36 +#: src/Core/Backend/Action/ActionsPostsDefault.php:41 +msgid "Unpublish" +msgstr "Mettre hors ligne" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:37 +#: src/Core/Backend/Action/ActionsPostsDefault.php:43 +msgid "Mark as pending" +msgstr "Mettre en attente" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:38 +msgid "Mark as junk" +msgstr "Mettre en indésirable" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:65 +msgid "Blocklist IP" +msgstr "Ajouter en liste de blocage" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:67 +msgid "Blocklist IP (global)" +msgstr "Ajouter en liste de blocage (pour tous les blogs)" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:71 +#: src/Process/Backend/Post.php:1084 +msgid "IP address" +msgstr "Adresse IP" + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:88 +#: src/Core/Backend/Action/ActionsCommentsDefault.php:127 +#: src/Core/Backend/Action/ActionsCommentsDefault.php:155 +msgid "No comment selected" +msgstr "Aucun commentaire sélectionné." + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:112 +#: src/Process/Backend/Comments.php:128 +msgid "Selected comments have been successfully updated." +msgstr "Les publications sélectionnées ont été modifiées." + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:140 +#: src/Process/Backend/Comments.php:130 +msgid "Selected comments have been successfully deleted." +msgstr "Les commentaires sélectionnés ont été supprimés." + +#: src/Core/Backend/Action/ActionsCommentsDefault.php:189 +msgid "IP addresses for selected comments have been blocklisted." +msgstr "Les adresses IP des commentaires sélectionnés ont été ajoutées en liste de blocage." + +#: src/Core/Backend/Action/ActionsPosts.php:72 +msgid "Back to entries list" +msgstr "Retour à la liste des billets" + +#: src/Core/Backend/Action/ActionsPosts.php:100 +msgid "Posts actions" +msgstr "Action sur les publications" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:42 +msgid "Schedule" +msgstr "Programmer" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:53 +msgid "First publication" +msgstr "Première publication" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:54 +#: src/Core/Backend/Action/ActionsPostsDefault.php:205 +msgid "Never published" +msgstr "Jamais publié" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:55 +#: src/Core/Backend/Action/ActionsPostsDefault.php:205 +msgid "Already published" +msgstr "Déjà publié" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:61 +msgid "Mark" +msgstr "Marquer" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:62 +msgid "Mark as selected" +msgstr "Sélectionner" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:63 +msgid "Mark as unselected" +msgstr "Désélectionner" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:68 +#: src/Core/Backend/Action/ActionsPostsDefault.php:74 +#: src/Core/Backend/Action/ActionsPostsDefault.php:83 +msgid "Change" +msgstr "Changer" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:69 +msgid "Change category" +msgstr "Changer la catégorie" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:75 +msgid "Change language" +msgstr "Changer la langue" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:84 +msgid "Change author" +msgstr "Changer l'auteur·rice" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:130 +#: src/Core/Backend/Action/ActionsPostsDefault.php:191 +#: src/Core/Backend/Action/ActionsPostsDefault.php:223 +#: src/Core/Backend/Action/ActionsPostsDefault.php:265 +#: src/Core/Backend/Action/ActionsPostsDefault.php:304 +#: src/Core/Backend/Action/ActionsPostsDefault.php:405 +#: src/Core/Backend/Action/ActionsPostsDefault.php:483 +msgid "No entry selected" +msgstr "Aucune publication sélectionnée" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:149 +msgid "Published entries cannot be set to scheduled" +msgstr "Les billets publiés ne peuvent être positionnés au statut programmé" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:158 +#, php-format +msgid "%d entry has been successfully updated to status : \"%s\"" +msgid_plural "%d entries have been successfully updated to status : \"%s\"" +msgstr[0] "%d billet a été positionné au statut \"%s\"" +msgstr[1] "%d billets ont été positionnés au statut \"%s\"" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:200 +#, php-format +msgid "%d entry has been successfully updated as: \"%s\"" +msgid_plural "%d entries have been successfully updated as: \"%s\"" +msgstr[0] "%d billet a été positionné au statut \"%s\"" +msgstr[1] "%d billets ont été positionnés au statut \"%s\"" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:232 +#, php-format +msgid "%d entry has been successfully marked as selected" +msgid_plural "%d entries have been successfully marked as selected" +msgstr[0] "%d billet a été marqué sélectionné" +msgstr[1] "%d billets ont été marqués sélectionnés" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:243 +#, php-format +msgid "%d entry has been successfully marked as unselected" +msgid_plural "%d entries have been successfully marked as unselected" +msgstr[0] "%d billet a été marqué désélectionné" +msgstr[1] "%d billets ont été marqués désélectionnés" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:280 +#, php-format +msgid "%d entry has been successfully deleted" +msgid_plural "%d entries have been successfully deleted" +msgstr[0] "%d publication a été supprimée" +msgstr[1] "%d publications ont été supprimées" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:327 +#: src/Core/Backend/Combos.php:41 src/Core/Backend/Filter/FilterPosts.php:112 +#: src/Core/Backend/Listing/ListingPosts.php:162 +msgid "(No cat)" +msgstr "(aucune)" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:334 +#, php-format +msgid "%d entry has been successfully moved to category \"%s\"" +msgid_plural "%d entries have been successfully moved to category \"%s\"" +msgstr[0] "%d billet a été déplacé dans la catégorie \"%s\"" +msgstr[1] "%d billets ont été déplacés dans la catégorie \"%s\"." + +#: src/Core/Backend/Action/ActionsPostsDefault.php:350 +msgid "Change category for this selection" +msgstr "Changer la catégorie pour cette sélection" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:362 +#: src/Core/Backend/Filter/FilterPosts.php:123 src/Process/Backend/Home.php:438 +#: src/Process/Backend/Post.php:675 +msgid "Category:" +msgstr "Catégorie :" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:370 +msgid "Create a new category for the post(s)" +msgstr "Créer une nouvelle catégorie pour ce(s) billet(s)" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:371 +#: src/Process/Backend/Home.php:428 src/Process/Backend/Home.php:445 +#: src/Process/Backend/Media.php:519 src/Process/Backend/Post.php:683 +#: src/Process/Backend/Post.php:731 +msgid "Title:" +msgstr "Titre :" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:373 +#: src/Process/Backend/Category.php:242 src/Process/Backend/Category.php:296 +#: src/Process/Backend/Home.php:447 src/Process/Backend/Post.php:685 +msgid "Parent:" +msgstr "Parent :" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:383 +#: src/Core/Backend/Action/ActionsPostsDefault.php:465 +#: src/Core/Backend/Action/ActionsPostsDefault.php:537 +#: src/Core/Backend/ModulesList.php:1786 src/Process/Backend/BlogPref.php:903 +#: src/Process/Backend/Category.php:274 src/Process/Backend/Category.php:306 +#: src/Process/Backend/Category.php:340 src/Process/Backend/Comment.php:307 +#: src/Process/Backend/Home.php:453 src/Process/Backend/MediaItem.php:1052 +#: src/Process/Backend/Post.php:801 src/Process/Backend/Post.php:937 +#: src/Process/Backend/User.php:418 src/Process/Backend/UsersActions.php:340 +#: src/Process/Install/Install.php:424 +msgid "Save" +msgstr "Enregistrer" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:408 +msgid "This user does not exist" +msgstr "Cet·te utilisateur·rice n'existe pas" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:417 +#, php-format +msgid "%d entry has been successfully set to user \"%s\"" +msgid_plural "%d entries have been successfully set to user \"%s\"" +msgstr[0] "%d billet a été affecté à l'utilisateur·rice \"%s\"." +msgstr[1] "%d billets ont été affectés à l'utilisateur·rice \"%s\"." + +#: src/Core/Backend/Action/ActionsPostsDefault.php:450 +msgid "Change author for this selection" +msgstr "Changer l'auteur·rice pour cette sélection" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:459 +msgid "New author (author ID):" +msgstr "Nouvel auteur·rice (identifiant utilisateur·rice) :" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:493 +#, php-format +msgid "%d entry has been successfully set to language \"%s\"" +msgid_plural "%d entries have been successfully set to language \"%s\"" +msgstr[0] "%d billet mis à jour avec la langue \"%s\"." +msgstr[1] "%d billets mis à jour avec la langue \"%s\"." + +#: src/Core/Backend/Action/ActionsPostsDefault.php:508 +msgid "Change language for this selection" +msgstr "Changer la langue de cette sélection" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:516 +#: src/Core/Backend/Action/ActionsPostsDefault.php:520 +#: src/Core/Backend/Combos.php:130 src/Core/Backend/Combos.php:134 +msgid "Available" +msgstr "Disponible" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:516 +#: src/Core/Backend/Action/ActionsPostsDefault.php:519 +#: src/Core/Backend/Action/ActionsPostsDefault.php:522 +#: src/Core/Backend/Combos.php:130 src/Core/Backend/Combos.php:133 +#: src/Core/Backend/Combos.php:136 +msgid "Most used" +msgstr "Plus utilisées" + +#: src/Core/Backend/Action/ActionsPostsDefault.php:531 +msgid "Entry language:" +msgstr "Langue du billet :" + +#: src/Core/Backend/Combos.php:248 src/Process/Backend/UserPreferences.php:165 +msgid "Descending" +msgstr "Décroissant" + +#: src/Core/Backend/Combos.php:249 src/Process/Backend/UserPreferences.php:166 +msgid "Ascending" +msgstr "Croissant" + +#: src/Core/Backend/Combos.php:256 src/Core/Backend/Combos.php:274 +#: src/Core/Backend/Listing/ListingComments.php:111 +#: src/Core/Backend/Listing/ListingMedia.php:84 +#: src/Core/Backend/Listing/ListingPosts.php:88 +#: src/Core/Backend/Listing/ListingPostsMini.php:41 +#: src/Core/Backend/UserPref.php:45 src/Core/Backend/UserPref.php:144 +#: src/Process/Backend/Post.php:1083 +msgid "Date" +msgstr "Date" + +#: src/Core/Backend/Combos.php:258 src/Core/Backend/Listing/ListingPosts.php:89 +#: src/Core/Backend/UserPref.php:46 src/Process/Backend/Post.php:674 +msgid "Category" +msgstr "Catégorie" + +#: src/Core/Backend/Combos.php:261 src/Core/Backend/Filter/FilterPosts.php:192 +#: src/Core/Backend/Listing/ListingPosts.php:128 +#: src/Core/Backend/Listing/ListingPosts.php:198 +#: src/Core/Backend/Listing/ListingPostsMini.php:114 +msgid "Selected" +msgstr "Sélectionné" + +#: src/Core/Backend/Combos.php:262 +msgid "Number of comments" +msgstr "Nombre de commentaires" + +#: src/Core/Backend/Combos.php:263 +msgid "Number of trackbacks" +msgstr "Nombre de rétroliens" + +#: src/Core/Backend/Combos.php:275 +msgid "Entry title" +msgstr "Titre de la publication" + +#: src/Core/Backend/Combos.php:276 +msgid "Entry date" +msgstr "Date de la publication" + +#: src/Core/Backend/Combos.php:279 +#: src/Core/Backend/Listing/ListingComments.php:118 +msgid "Spam filter" +msgstr "Filtre antispam" + +#: src/Core/Backend/Combos.php:290 +#: src/Core/Backend/Listing/ListingComments.php:116 +msgid "IP" +msgstr "IP" + +#: src/Core/Backend/Combos.php:302 src/Core/Backend/Listing/ListingBlogs.php:56 +msgid "Last update" +msgstr "Dernière mise à jour" + +#: src/Core/Backend/Combos.php:304 src/Process/Backend/Blog.php:121 +#: src/Process/Backend/BlogPref.php:785 +#: src/Process/Backend/UsersActions.php:225 +msgid "Blog ID" +msgstr "Identifiant du blog" + +#: src/Core/Backend/Combos.php:318 src/Core/Backend/Listing/ListingUsers.php:50 +#: src/Process/Install/Install.php:404 +msgid "Username" +msgstr "Identifiant" + +#: src/Core/Backend/Combos.php:319 src/Core/Backend/Listing/ListingUsers.php:52 +msgid "Last Name" +msgstr "Nom" + +#: src/Core/Backend/Combos.php:320 src/Core/Backend/Listing/ListingUsers.php:51 +msgid "First Name" +msgstr "Prénom" + +#: src/Core/Backend/Combos.php:321 src/Core/Backend/Listing/ListingUsers.php:53 +msgid "Display name" +msgstr "Pseudonyme" + +#: src/Core/Backend/Combos.php:322 +msgid "Number of entries" +msgstr "Nombre de publications" + +#: src/Core/Backend/Favorites.php:302 +#: src/Process/Backend/UserPreferences.php:804 +msgid "My favorites" +msgstr "Mes favoris" + +#: src/Core/Backend/Favorites.php:404 src/Core/Backend/Menus.php:191 +#: src/Core/Backend/Page.php:284 src/Process/Backend/Media.php:526 +#: src/Process/Backend/UserPreferences.php:39 +msgid "My preferences" +msgstr "Mes préférences" + +#: src/Core/Backend/Favorites.php:409 src/Core/Backend/Menus.php:177 +#: src/Process/Backend/Home.php:427 src/Process/Backend/Post.php:74 +#: src/Process/Backend/Post.php:784 src/Process/Backend/Posts.php:99 +msgid "New post" +msgstr "Nouveau billet" + +#: src/Core/Backend/Favorites.php:429 src/Process/Backend/Rest.php:80 +#, php-format +msgid "%d post" +msgid_plural "%d posts" +msgstr[0] "%d billet" +msgstr[1] "%d billets" + +#: src/Core/Backend/Favorites.php:443 src/Process/Backend/Rest.php:94 +#, php-format +msgid "%d comment" +msgid_plural "%d comments" +msgstr[0] "%d commentaire" +msgstr[1] "%d commentaires" + +#: src/Core/Backend/Favorites.php:447 src/Core/Backend/Menus.php:138 +#: src/Core/Backend/UserPref.php:152 src/Process/Backend/PostsPopup.php:101 +#: src/Process/Backend/Search.php:94 src/Process/Backend/Search.php:99 +#: src/Process/Backend/Search.php:111 +msgid "Search" +msgstr "Rechercher" + +#: src/Core/Backend/Favorites.php:456 src/Core/Backend/Menus.php:126 +#: src/Process/Backend/Categories.php:140 +#: src/Process/Backend/Categories.php:145 src/Process/Backend/Category.php:200 +msgid "Categories" +msgstr "Catégories" + +#: src/Core/Backend/Favorites.php:464 src/Core/Backend/MediaPage.php:340 +#: src/Core/Backend/MediaPage.php:342 src/Core/Backend/MediaPage.php:392 +#: src/Core/Backend/Menus.php:113 src/Core/Backend/UserPref.php:141 +#: src/Process/Backend/Media.php:441 src/Process/Backend/Media.php:480 +#: src/Process/Backend/MediaItem.php:434 src/Process/Backend/MediaItem.php:440 +msgid "Media manager" +msgstr "Médiathèque" + +#: src/Core/Backend/Favorites.php:473 src/Core/Backend/Menus.php:101 +#: src/Process/Backend/BlogPref.php:411 src/Process/Backend/BlogPref.php:419 +#: src/Process/Backend/BlogPref.php:432 +msgid "Blog settings" +msgstr "Paramètres du blog" + +#: src/Core/Backend/Favorites.php:481 src/Core/Backend/Menus.php:89 +#: src/Process/Backend/BlogTheme.php:80 src/Process/Backend/BlogTheme.php:89 +#: src/Process/Backend/BlogTheme.php:161 +msgid "Blog appearance" +msgstr "Apparence du blog" + +#: src/Core/Backend/Favorites.php:498 src/Core/Backend/Menus.php:231 +#: src/Core/Backend/UserPref.php:109 src/Process/Backend/BlogPref.php:933 +#: src/Process/Backend/User.php:233 src/Process/Backend/Users.php:98 +#: src/Process/Backend/Users.php:103 src/Process/Backend/UsersActions.php:146 +#: src/Process/Backend/UsersActions.php:154 +#: src/Process/Backend/UsersActions.php:161 +msgid "Users" +msgstr "Utilisateur·rice·s" + +#: src/Core/Backend/Favorites.php:503 src/Core/Backend/Menus.php:221 +#: src/Process/Backend/Plugins.php:90 src/Process/Backend/Plugins.php:103 +#: src/Process/Backend/Plugins.php:322 src/Process/Backend/Plugins.php:329 +msgid "Plugins management" +msgstr "Gestion des plugins" + +#: src/Core/Backend/Favorites.php:508 src/Core/Backend/Menus.php:211 +msgid "Languages" +msgstr "Langues" + +#: src/Core/Backend/Favorites.php:513 src/Core/Backend/Page.php:456 +#: src/Process/Backend/Help.php:109 src/Process/Backend/Help.php:116 +#: src/Process/Backend/Help.php:122 +msgid "Global help" +msgstr "Aide générale" + +#: src/Core/Backend/Filter/FilterBlogs.php:48 +#: src/Core/Backend/Filter/FilterComments.php:80 +#: src/Core/Backend/Filter/FilterPosts.php:135 +#: src/Process/Backend/Comment.php:282 +msgid "Status:" +msgstr "Ãtat :" + +#: src/Core/Backend/Filter/FilterComments.php:34 src/Core/Backend/Page.php:972 +#: src/Process/Backend/Auth.php:376 src/Process/Backend/BlogPref.php:972 +#: src/Process/Backend/Comment.php:273 src/Process/Backend/Post.php:916 +#: src/Process/Backend/User.php:342 src/Process/Backend/UserPreferences.php:537 +#: src/Process/Install/Install.php:391 +msgid "Email:" +msgstr "Email :" + +#: src/Core/Backend/Filter/FilterComments.php:35 src/Core/Backend/Page.php:971 +#: src/Process/Backend/Comment.php:278 src/Process/Backend/Post.php:920 +msgid "Web site:" +msgstr "Site web :" + +#: src/Core/Backend/Filter/FilterComments.php:54 +#: src/Core/Backend/Filter/FilterPosts.php:84 +#: src/Core/Backend/ModulesList.php:998 src/Core/Backend/Page.php:1013 +#: src/Process/Backend/Comment.php:266 +msgid "Author:" +msgstr "Auteur·rice :" + +#: src/Core/Backend/Filter/FilterComments.php:64 +msgid "Type:" +msgstr "Type :" + +#: src/Core/Backend/Filter/FilterComments.php:67 +#: src/Process/Backend/Post.php:930 +msgid "Comment" +msgstr "Commentaire" + +#: src/Core/Backend/Filter/FilterComments.php:68 +msgid "Trackback" +msgstr "Rétrolien" + +#: src/Core/Backend/Filter/FilterComments.php:102 src/Core/Backend/Page.php:973 +#: src/Process/Backend/Comment.php:256 +msgid "IP address:" +msgstr "Adresse IP :" + +#: src/Core/Backend/Filter/FilterMedia.php:131 +msgid "Media type:" +msgstr "Type de média :" + +#: src/Core/Backend/Filter/FilterMedia.php:135 +msgid "image" +msgstr "image" + +#: src/Core/Backend/Filter/FilterMedia.php:136 +msgid "text" +msgstr "texte" + +#: src/Core/Backend/Filter/FilterMedia.php:137 +msgid "audio" +msgstr "audio" + +#: src/Core/Backend/Filter/FilterMedia.php:138 +msgid "video" +msgstr "vidéo" + +#: src/Core/Backend/Filter/FilterPosts.php:158 +msgid "Format:" +msgstr "Format :" + +#: src/Core/Backend/Filter/FilterPosts.php:173 src/Process/Backend/Auth.php:136 +#: src/Process/Backend/Auth.php:457 src/Process/Backend/User.php:274 +#: src/Process/Install/Install.php:454 +msgid "Password:" +msgstr "Mot de passe :" + +#: src/Core/Backend/Filter/FilterPosts.php:176 +msgid "With password" +msgstr "Avec mot de passe" + +#: src/Core/Backend/Filter/FilterPosts.php:177 +msgid "Without password" +msgstr "Sans mot de passe" + +#: src/Core/Backend/Filter/FilterPosts.php:189 +msgid "Selected:" +msgstr "Sélectionné :" + +#: src/Core/Backend/Filter/FilterPosts.php:193 +msgid "Not selected" +msgstr "Non sélectionné" + +#: src/Core/Backend/Filter/FilterPosts.php:205 +msgid "Attachments:" +msgstr "Annexes :" + +#: src/Core/Backend/Filter/FilterPosts.php:208 +msgid "With attachments" +msgstr "Avec annexe(s)" + +#: src/Core/Backend/Filter/FilterPosts.php:209 +msgid "Without attachments" +msgstr "Sans annexes" + +#: src/Core/Backend/Filter/FilterPosts.php:237 +msgid "Month:" +msgstr "Mois :" + +#: src/Core/Backend/Filter/FilterPosts.php:264 +msgid "Lang:" +msgstr "Langue :" + +#: src/Core/Backend/Filter/FilterPosts.php:278 +msgid "Comments:" +msgstr "Commentaires :" + +#: src/Core/Backend/Filter/FilterPosts.php:281 +#: src/Core/Backend/Filter/FilterPosts.php:296 +msgid "Opened" +msgstr "Ouverts" + +#: src/Core/Backend/Filter/FilterPosts.php:282 +#: src/Core/Backend/Filter/FilterPosts.php:297 +msgid "Closed" +msgstr "Fermés" + +#: src/Core/Backend/Filter/FilterPosts.php:293 +msgid "Trackbacks:" +msgstr "Rétroliens :" + +#: src/Core/Backend/Filter/Filters.php:332 src/Core/Backend/Page.php:1204 +msgid "Show filters and display options" +msgstr "Afficher les filtres et options d'affichage" + +#: src/Core/Backend/Filter/Filters.php:350 +msgid "Filters" +msgstr "Filtres" + +#: src/Core/Backend/Filter/Filters.php:360 +msgid "Display options" +msgstr "Options d'affichage" + +#: src/Core/Backend/Filter/Filters.php:363 +#: src/Process/Backend/UserPreferences.php:717 +msgid "Order by:" +msgstr "Trier par :" + +#: src/Core/Backend/Filter/Filters.php:376 +#: src/Process/Backend/UserPreferences.php:722 +msgid "Sort:" +msgstr "Ordre :" + +#: src/Core/Backend/Filter/Filters.php:398 +#: src/Process/Backend/UserPreferences.php:727 +msgid "Show" +msgstr "Afficher" + +#: src/Core/Backend/Filter/Filters.php:406 +msgid "Save current options" +msgstr "Sauvegarder ces options" + +#: src/Core/Backend/Filter/Filters.php:414 +msgid "Apply filters and display options" +msgstr "Appliquer les filtres et options d'affichage" + +#: src/Core/Backend/Filter/FiltersLibrary.php:65 +#: src/Core/Backend/MediaPage.php:379 src/Core/Backend/Page.php:467 +msgid "Search:" +msgstr "Chercher :" + +#: src/Core/Backend/Listing/Listing.php:48 +msgid "« prev." +msgstr "« préc." + +#: src/Core/Backend/Listing/Listing.php:49 +msgid "next »" +msgstr "suiv. »" + +#: src/Core/Backend/Listing/ListingBlogs.php:35 +msgid "No blog matches the filter" +msgstr "Aucun blog correspondant au filtre" + +#: src/Core/Backend/Listing/ListingBlogs.php:37 +#: src/Process/Backend/UsersActions.php:219 +msgid "No blog" +msgstr "Pas de blog" + +#: src/Core/Backend/Listing/ListingBlogs.php:54 +#: src/Core/Backend/ModulesList.php:1630 src/Process/Backend/LinkPopup.php:62 +#: src/Process/Backend/UsersActions.php:227 +msgid "URL" +msgstr "URL" + +#: src/Core/Backend/Listing/ListingBlogs.php:55 +#: src/Core/Backend/Listing/ListingUsers.php:54 +msgid "Entries (all types)" +msgstr "Entrées (tous types)" + +#: src/Core/Backend/Listing/ListingBlogs.php:68 +#, php-format +msgid "%d blog matches the filter." +msgid_plural "%d blogs match the filter." +msgstr[0] "%d blog correspondant au filtre" +msgstr[1] "%d blogs correspondants au filtre" + +#: src/Core/Backend/Listing/ListingBlogs.php:71 +msgid "Blogs list" +msgstr "Liste des blogs" + +#: src/Core/Backend/Listing/ListingBlogs.php:92 +#: src/Core/Backend/Listing/ListingComments.php:145 +#: src/Core/Backend/Listing/ListingPosts.php:122 +#: src/Core/Backend/Listing/ListingUsers.php:79 +#: src/Process/Backend/MediaItem.php:615 +msgid "Legend: " +msgstr "Légende : " + +#: src/Core/Backend/Listing/ListingBlogs.php:123 +#, php-format +msgid "Edit blog settings for %s" +msgstr "Modifier les paramètres de %s" + +#: src/Core/Backend/Listing/ListingBlogs.php:124 +msgid "Edit blog settings" +msgstr "Modifier les paramètres du blog" + +#: src/Core/Backend/Listing/ListingBlogs.php:129 +#, php-format +msgid "Switch to blog %s" +msgstr "Passer au blog %s" + +#: src/Core/Backend/Listing/ListingComments.php:38 +msgid "No comments or trackbacks matches the filter" +msgstr "aucun commentaire ou rétrolien ne correspond au filtre" + +#: src/Core/Backend/Listing/ListingComments.php:40 +#: src/Process/Backend/Comment.php:130 src/Process/Backend/Post.php:883 +msgid "No comments" +msgstr "Aucun commentaire" + +#: src/Core/Backend/Listing/ListingComments.php:69 +#, php-format +msgid "Comment or trackback matching the filter." +msgid_plural "List of %s comments or trackbacks matching the filter." +msgstr[0] "Commentaire ou rétrolien correspondant au filtre." +msgstr[1] "Liste des %s commentaires ou rétroliens correspondants au filtre." + +#: src/Core/Backend/Listing/ListingComments.php:80 +#, php-format +msgid "List of comments and trackbacks (%s)" +msgstr "Liste des commentaires et rétroliens (%s)" + +#: src/Core/Backend/Listing/ListingComments.php:83 +#: src/Core/Backend/Listing/ListingPosts.php:61 +#, php-format +msgid ", published (1)" +msgid_plural ", published (%s)" +msgstr[0] ", publié (1)" +msgstr[1] ", publiés (%s)" + +#: src/Core/Backend/Listing/ListingComments.php:89 +#, php-format +msgid ", spam (1)" +msgid_plural ", spam (%s)" +msgstr[0] ", indésirable (1)" +msgstr[1] ", indésirables (%s)" + +#: src/Core/Backend/Listing/ListingComments.php:95 +#: src/Core/Backend/Listing/ListingPosts.php:67 +#, php-format +msgid ", pending (1)" +msgid_plural ", pending (%s)" +msgstr[0] ", en attente (1)" +msgstr[1] ", en attente (%s)" + +#: src/Core/Backend/Listing/ListingComments.php:101 +#: src/Core/Backend/Listing/ListingPosts.php:79 +#, php-format +msgid ", unpublished (1)" +msgid_plural ", unpublished (%s)" +msgstr[0] ", non publié (1)" +msgstr[1] ", non publiés (%s)" + +#: src/Core/Backend/Listing/ListingComments.php:109 +msgid "Type" +msgstr "Type" + +#: src/Core/Backend/Listing/ListingComments.php:120 +msgid "Entry" +msgstr "Billet" + +#: src/Core/Backend/Listing/ListingComments.php:208 +#, php-format +msgid "Edit the %1$s from %2$s" +msgstr "Modifier le %1$s de %2$s" + +#: src/Core/Backend/Listing/ListingComments.php:209 +#: src/Core/Backend/Listing/ListingComments.php:223 +msgid "comment" +msgstr "commentaire" + +#: src/Core/Backend/Listing/ListingComments.php:209 +#: src/Core/Backend/Listing/ListingComments.php:223 +msgid "trackback" +msgstr "rétrolien" + +#: src/Core/Backend/Listing/ListingComments.php:220 +msgid "Type and author" +msgstr "Type et auteur·rice" + +#: src/Core/Backend/Listing/ListingComments.php:222 +#: src/Process/Backend/Post.php:1086 src/Process/Backend/Post.php:1157 +msgid "Edit" +msgstr "Modifier" + +#: src/Core/Backend/Listing/ListingMedia.php:39 +msgid "No file matches the filter" +msgstr "Aucun fichier correspondant au filtre" + +#: src/Core/Backend/Listing/ListingMedia.php:41 +msgid "No file." +msgstr "Aucun fichier." + +#: src/Core/Backend/Listing/ListingMedia.php:60 +#, php-format +msgid "%d file matches the filter." +msgid_plural "%d files match the filter." +msgstr[0] "%d fichier correspondant au filtre" +msgstr[1] "%d fichiers correspondants au filtre" + +#: src/Core/Backend/Listing/ListingMedia.php:63 +#, php-format +msgid "Nb of items: %d â %d folder(s) + %d file(s)" +msgstr "Nb d'éléments : %d â %d dossier(s) + %d fichier(s)" + +#: src/Core/Backend/Listing/ListingMedia.php:64 +#, php-format +msgid "Nb of items: %d" +msgstr "Nb d'éléments : %d" + +#: src/Core/Backend/Listing/ListingMedia.php:83 +#: src/Core/Backend/ModulesList.php:780 src/Core/Backend/UserPref.php:143 +#: src/Process/Backend/Category.php:235 +msgid "Name" +msgstr "Nom :" + +#: src/Core/Backend/Listing/ListingMedia.php:85 +#: src/Core/Backend/UserPref.php:145 +msgid "Size" +msgstr "Taille" + +#: src/Core/Backend/Listing/ListingMedia.php:164 +#: src/Core/Backend/Listing/ListingMedia.php:165 +#: src/Process/Backend/Media.php:342 +msgid "Select this file" +msgstr "Sélectionner ce fichier" + +#: src/Core/Backend/Listing/ListingMedia.php:174 +#: src/Core/Backend/Listing/ListingMedia.php:180 +#: src/Process/Backend/Media.php:358 src/Process/Backend/Media.php:371 +msgid "Attach this file to entry" +msgstr "Attacher ce fichier au billet" + +#: src/Core/Backend/Listing/ListingMedia.php:185 +#: src/Core/Backend/Listing/ListingMedia.php:186 +msgid "Insert this file into entry" +msgstr "Insérer ce fichier dans le billet" + +#: src/Core/Backend/Listing/ListingMedia.php:200 +msgid "delete" +msgstr "supprimer" + +#: src/Core/Backend/Listing/ListingMedia.php:214 +#: src/Core/Backend/Listing/ListingMedia.php:238 +msgid "private media" +msgstr "Média privé" + +#: src/Core/Backend/Listing/ListingMedia.php:221 +#: src/Core/Backend/Listing/ListingMedia.php:246 +msgid "open" +msgstr "ouvrir" + +#: src/Core/Backend/Listing/ListingPosts.php:35 +msgid "No entry matches the filter" +msgstr "Aucun résultat correspondant au filtre" + +#: src/Core/Backend/Listing/ListingPosts.php:37 +#: src/Core/Backend/Listing/ListingPostsMini.php:32 +msgid "No entry" +msgstr "Pas de résultat" + +#: src/Core/Backend/Listing/ListingPosts.php:51 +#, php-format +msgid "List of %s entries matching the filter." +msgstr "Liste des %s billets correspondant au filtre" + +#: src/Core/Backend/Listing/ListingPosts.php:58 +#, php-format +msgid "List of entries (%s)" +msgstr "Liste des billets (%s)" + +#: src/Core/Backend/Listing/ListingPosts.php:73 +#, php-format +msgid ", programmed (1)" +msgid_plural ", programmed (%s)" +msgstr[0] ", programmé (1)" +msgstr[1] ", programmés (%s)" + +#: src/Core/Backend/Listing/ListingPosts.php:93 +#: src/Core/Backend/Listing/ListingPosts.php:94 +#: src/Core/Backend/UserPref.php:49 src/Process/Backend/Post.php:960 +msgid "Trackbacks" +msgstr "Rétroliens" + +#: src/Core/Backend/Listing/ListingPosts.php:127 +#: src/Core/Backend/Listing/ListingPosts.php:193 +#: src/Core/Backend/Listing/ListingPostsMini.php:109 +msgid "Protected" +msgstr "Protégé" + +#: src/Core/Backend/Listing/ListingPosts.php:129 +msgid "Attachments" +msgstr "Annexes" + +#: src/Core/Backend/Listing/ListingPosts.php:204 +#: src/Core/Backend/Listing/ListingPostsMini.php:120 +#, php-format +msgid "%d attachment" +msgstr "%d annexe" + +#: src/Core/Backend/Listing/ListingPosts.php:204 +#: src/Core/Backend/Listing/ListingPostsMini.php:120 +#, php-format +msgid "%d attachments" +msgstr "%d annexes" + +#: src/Core/Backend/Listing/ListingPostsMini.php:37 +msgid "Entries list" +msgstr "Liste des publications" + +#: src/Core/Backend/Listing/ListingUsers.php:33 +msgid "No user matches the filter" +msgstr "Aucun·e utilisateur·rice correspondant·e au filtre" + +#: src/Core/Backend/Listing/ListingUsers.php:35 +msgid "No user" +msgstr "Aucun·e utilisateur·rice" + +#: src/Core/Backend/Listing/ListingUsers.php:44 +#, php-format +msgid "List of %s users match the filter." +msgstr "%s utilisateur·rice·s correspondent au filtre." + +#: src/Core/Backend/Listing/ListingUsers.php:46 +msgid "Users list" +msgstr "Liste des utilisateur·rice·s" + +#: src/Core/Backend/Listing/ListingUsers.php:80 +#: src/Core/Backend/Listing/ListingUsers.php:103 +msgid "admin" +msgstr "administrateur·rice" + +#: src/Core/Backend/Listing/ListingUsers.php:81 +#: src/Core/Backend/Listing/ListingUsers.php:106 +msgid "superadmin" +msgstr "Super administrateur·rice" + +#: src/Core/Backend/Listing/Pager.php:113 +msgid "First page" +msgstr "Première page" + +#: src/Core/Backend/Listing/Pager.php:121 +msgid "Previous page" +msgstr "Page précédente" + +#: src/Core/Backend/Listing/Pager.php:129 +msgid "Next page" +msgstr "Page suivante" + +#: src/Core/Backend/Listing/Pager.php:137 +msgid "Last page" +msgstr "Dernière page" + +#: src/Core/Backend/Listing/Pager.php:141 +#, php-format +msgid "Page %s / %s" +msgstr "Page %s / %s" + +#: src/Core/Backend/Listing/Pager.php:146 +#, php-format +msgid "Direct access page %s" +msgstr "Aller à la page : %s" + +#: src/Core/Backend/Listing/Pager.php:149 src/Core/Backend/Page.php:128 +#: src/Process/Backend/Blogs.php:147 src/Process/Backend/Comments.php:187 +#: src/Process/Backend/Post.php:896 src/Process/Backend/Post.php:988 +#: src/Process/Backend/Posts.php:117 src/Process/Backend/Search.php:198 +#: src/Process/Backend/Search.php:261 src/Process/Backend/Users.php:150 +msgid "ok" +msgstr "ok" + +#: src/Core/Backend/MediaPage.php:379 +#, php-format +msgid "%s file found" +msgid_plural "%s files found" +msgstr[0] "%s fichier trouvé" +msgstr[1] "%s fichiers trouvés" + +#: src/Core/Backend/Menus.php:82 +msgid "Blog" +msgstr "Blog" + +#: src/Core/Backend/Menus.php:83 +msgid "System settings" +msgstr "Réglages système" + +#: src/Core/Backend/Menus.php:84 +msgid "Plugins" +msgstr "Plugins" + +#: src/Core/Backend/Menus.php:201 src/Core/Backend/ModulesList.php:1246 +msgid "Update" +msgstr "Mise à jour" + +#: src/Core/Backend/ModulesList.php:195 +msgid "other" +msgstr "autres" + +#: src/Core/Backend/ModulesList.php:399 +msgid "Search in repository:" +msgstr "Rechercher dans le dépôt :" + +#: src/Core/Backend/ModulesList.php:402 src/Core/Backend/Page.php:469 +#: src/Process/Backend/Categories.php:203 +msgid "OK" +msgstr "Ok" + +#: src/Core/Backend/ModulesList.php:406 +msgid "Reset search" +msgstr "réinitialiser la recherche" + +#: src/Core/Backend/ModulesList.php:412 +msgid "Search is allowed on multiple terms longer than 2 chars, terms must be separated by space." +msgstr "La recherche est autorisée sur plusieurs mots de 2 caractères minimum, séparés par un espace." + +#: src/Core/Backend/ModulesList.php:419 +#, php-format +msgid "Found %d result for search \"%s\":" +msgid_plural "Found %d results for search \"%s\":" +msgstr[0] "%d résultat trouvé pour la recherche \"%s\" :" +msgstr[1] "%d résultats trouvés pour la recherche \"%s\" :" + +#: src/Core/Backend/ModulesList.php:491 +msgid "current selection" +msgstr "sélection courante" + +#: src/Core/Backend/ModulesList.php:495 +#, php-format +msgid "%d result" +msgid_plural "%d results" +msgstr[0] "%d résultat" +msgstr[1] "%d résultats" + +#: src/Core/Backend/ModulesList.php:500 +msgid "no results" +msgstr "pas de résultats" + +#: src/Core/Backend/ModulesList.php:504 +msgid "Browse index:" +msgstr "Parcourir l'index :" + +#: src/Core/Backend/ModulesList.php:769 +msgid "Plugins list" +msgstr "Liste des plugins" + +#: src/Core/Backend/ModulesList.php:785 +msgid "Score" +msgstr "Score" + +#: src/Core/Backend/ModulesList.php:790 +msgid "Version" +msgstr "Version" + +#: src/Core/Backend/ModulesList.php:795 +msgid "Current version" +msgstr "Version courante" + +#: src/Core/Backend/ModulesList.php:800 src/Core/Backend/ModulesList.php:1003 +#: src/Core/Backend/Page.php:1014 src/Core/Backend/ThemesList.php:132 +#: src/Core/Backend/ThemesList.php:191 +msgid "Details" +msgstr "Détails" + +#: src/Core/Backend/ModulesList.php:805 +msgid "Repository" +msgstr "Dépôt" + +#: src/Core/Backend/ModulesList.php:815 src/Process/Backend/Langs.php:253 +msgid "Action" +msgstr "Action" + +#: src/Core/Backend/ModulesList.php:891 src/Core/Backend/ModulesList.php:895 +#: src/Core/Backend/ModulesList.php:900 +#, php-format +msgid " (%s)" +msgstr " (%s)" + +#: src/Core/Backend/ModulesList.php:932 +#, php-format +msgid "This module cannot be disabled nor deleted, since the following modules are also enabled : %s" +msgstr "Ce module ne peut être désactivé ou supprimé car les modules suivants sont actifs : %s" + +#: src/Core/Backend/ModulesList.php:938 +msgid "This module cannot be enabled, because of the following reasons :" +msgstr "Ce module ne peut activé pour les raisons suivantes :" + +#: src/Core/Backend/ModulesList.php:955 src/Core/Backend/ThemesList.php:178 +msgid "Official repository" +msgstr "Dépôt officiel" + +#: src/Core/Backend/ModulesList.php:955 src/Core/Backend/ModulesList.php:1039 +#: src/Core/Backend/ThemesList.php:178 +msgid "Third-party repository" +msgstr "Dépôt alternatif" + +#: src/Core/Backend/ModulesList.php:963 src/Core/Backend/ModulesList.php:964 +msgid "Plugin from official distribution" +msgstr "Plugin de la distribution officielle" + +#: src/Core/Backend/ModulesList.php:967 src/Core/Backend/ModulesList.php:968 +msgid "Plugin in development" +msgstr "Plugin en développement" + +#: src/Core/Backend/ModulesList.php:1007 src/Core/Backend/Page.php:1015 +#: src/Core/Backend/ThemesList.php:195 +msgid "Support" +msgstr "Assistance" + +#: src/Core/Backend/ModulesList.php:1011 src/Core/Backend/ThemesList.php:182 +msgid "update locked" +msgstr "mise à jour verrouillée" + +#: src/Core/Backend/ModulesList.php:1044 src/Core/Backend/Page.php:1017 +msgid "Section:" +msgstr "Section : " + +#: src/Core/Backend/ModulesList.php:1049 src/Core/Backend/Page.php:1018 +msgid "Tags:" +msgstr "Mots-clés:" + +#: src/Core/Backend/ModulesList.php:1067 +msgid "No plugins matched your search." +msgstr "Aucun plugin ne correspond à votre recherche." + +#: src/Core/Backend/ModulesList.php:1117 +msgid "Configure plugin" +msgstr "Configurer le plugin" + +#: src/Core/Backend/ModulesList.php:1129 +msgid "Plugin settings (in blog parameters)" +msgstr "Réglages du plugin (paramètres du blog)" + +#: src/Core/Backend/ModulesList.php:1140 +msgid "Plugin settings (in user preferences)" +msgstr "Réglages du plugin (mes préférences)" + +#: src/Core/Backend/ModulesList.php:1149 src/Core/Backend/ModulesList.php:1160 +msgid "Plugin settings" +msgstr "Réglages du plugin" + +#: src/Core/Backend/ModulesList.php:1171 +msgid "Plugin main page" +msgstr "Page principale du plugin" + +#: src/Core/Backend/ModulesList.php:1205 +msgid "Activate" +msgstr "Activer" + +#: src/Core/Backend/ModulesList.php:1213 +msgid "Deactivate" +msgstr "Désactiver" + +#: src/Core/Backend/ModulesList.php:1230 +msgid "Clone" +msgstr "Dupliquer" + +#: src/Core/Backend/ModulesList.php:1238 +msgid "Install" +msgstr "Installer" + +#: src/Core/Backend/ModulesList.php:1288 +msgid "Activate selected plugins" +msgstr "Activer les plugins sélectionnés" + +#: src/Core/Backend/ModulesList.php:1289 +msgid "Activate all plugins from this list" +msgstr "Activer tous les plugins de cette liste" + +#: src/Core/Backend/ModulesList.php:1300 +msgid "Deactivate selected plugins" +msgstr "Désactiver les plugins sélectionnés" + +#: src/Core/Backend/ModulesList.php:1301 +msgid "Deactivate all plugins from this list" +msgstr "Désactiver tous les plugins de cette liste" + +#: src/Core/Backend/ModulesList.php:1312 +msgid "Update selected plugins" +msgstr "Mettre à jour les plugins sélectionnés" + +#: src/Core/Backend/ModulesList.php:1313 +msgid "Update all plugins from this list" +msgstr "Mettre à jour tous les plugins de cette liste" + +#: src/Core/Backend/ModulesList.php:1364 src/Core/Backend/ModulesList.php:1418 +#: src/Core/Backend/ModulesList.php:1449 src/Core/Backend/ModulesList.php:1487 +#: src/Core/Backend/ModulesList.php:1548 +msgid "No such plugin." +msgstr "Plugin inexistant." + +#: src/Core/Backend/ModulesList.php:1384 +msgid "You don't have permissions to delete this plugin." +msgstr "Vous n'avez pas les permissions pour supprimer ce plugin." + +#: src/Core/Backend/ModulesList.php:1386 +msgid "Some plugins have not been delete." +msgstr "Certains plugins n'ont pas pu être supprimés." + +#: src/Core/Backend/ModulesList.php:1389 +msgid "Plugin has been successfully deleted." +msgid_plural "Plugins have been successuflly deleted." +msgstr[0] "Ce plugin a été supprimé." +msgstr[1] "Ces plugins ont été supprimés." + +#: src/Core/Backend/ModulesList.php:1422 +msgid "Plugin has been successfully installed." +msgid_plural "Plugins have been successfully installed." +msgstr[0] "Ce plugin a été installé." +msgstr[1] "Ces plugins ont été installés." + +#: src/Core/Backend/ModulesList.php:1453 +msgid "Plugin has been successfully activated." +msgid_plural "Plugins have been successuflly activated." +msgstr[0] "Ce plugin a été activé." +msgstr[1] "Ces plugins ont été activés." + +#: src/Core/Backend/ModulesList.php:1491 +msgid "Some plugins have not been deactivated." +msgstr "Certains plugins n'ont pas pu être désactivés." + +#: src/Core/Backend/ModulesList.php:1494 +msgid "Plugin has been successfully deactivated." +msgid_plural "Plugins have been successuflly deactivated." +msgstr[0] "Ce plugin a été désactivé." +msgstr[1] "Ces plugins ont été désactivés." + +#: src/Core/Backend/ModulesList.php:1541 +msgid "Plugin has been successfully updated." +msgid_plural "Plugins have been successfully updated." +msgstr[0] "Ce plugin a été mis à jour." +msgstr[1] "Ces plugins ont été mis à jour." + +#: src/Core/Backend/ModulesList.php:1545 +#, php-format +msgid "Following plugins updates are locked: %s" +msgstr "Les mises à jour de plugins suivantes sont verrouillées : %s" + +#: src/Core/Backend/ModulesList.php:1565 src/Core/Backend/ThemesList.php:652 +#: src/Process/Backend/Langs.php:177 +msgid "Unable to move uploaded file." +msgstr "Impossible de déplacer le fichier téléchargé." + +#: src/Core/Backend/ModulesList.php:1583 +msgid "The plugin has been successfully updated." +msgstr "Ce plugin a été mis à jour." + +#: src/Core/Backend/ModulesList.php:1584 +msgid "The plugin has been successfully installed." +msgstr "Ce plugin a été installé." + +#: src/Core/Backend/ModulesList.php:1607 src/Process/Backend/Langs.php:324 +msgid "Upload a zip file" +msgstr "Déposer un fichier zip" + +#: src/Core/Backend/ModulesList.php:1608 src/Core/Backend/ModulesList.php:1610 +#: src/Core/Backend/ModulesList.php:1628 src/Core/Backend/ModulesList.php:1633 +#: src/Process/Backend/Blog.php:124 src/Process/Backend/Blog.php:145 +#: src/Process/Backend/Blog.php:161 src/Process/Backend/BlogPref.php:464 +#: src/Process/Backend/BlogPref.php:784 src/Process/Backend/BlogPref.php:789 +#: src/Process/Backend/Category.php:232 src/Process/Backend/Comment.php:266 +#: src/Process/Backend/Home.php:428 src/Process/Backend/Home.php:435 +#: src/Process/Backend/Langs.php:305 src/Process/Backend/Langs.php:326 +#: src/Process/Backend/Langs.php:328 src/Process/Backend/LinkPopup.php:59 +#: src/Process/Backend/Post.php:731 src/Process/Backend/Post.php:753 +#: src/Process/Backend/Post.php:909 src/Process/Backend/Post.php:924 +#: src/Process/Backend/User.php:254 src/Process/Backend/User.php:273 +#: src/Process/Backend/User.php:288 src/Process/Backend/User.php:408 +#: src/Process/Backend/UsersActions.php:330 src/Process/Install/Install.php:401 +#: src/Process/Install/Install.php:409 src/Process/Install/Install.php:416 +#: src/Process/Install/Wizard.php:216 src/Process/Install/Wizard.php:234 +msgid "Required field" +msgstr "Champ obligatoire" + +#: src/Core/Backend/ModulesList.php:1608 +msgid "Zip file path:" +msgstr "Chemin du fichier zip :" + +#: src/Core/Backend/ModulesList.php:1610 src/Core/Backend/ModulesList.php:1633 +#: src/Process/Backend/BlogDel.php:122 src/Process/Backend/Langs.php:305 +#: src/Process/Backend/Langs.php:328 src/Process/Backend/User.php:408 +#: src/Process/Backend/UsersActions.php:330 +msgid "Your password:" +msgstr "Votre mot de passe :" + +#: src/Core/Backend/ModulesList.php:1616 src/Core/Backend/ModulesList.php:1639 +#: src/Process/Backend/Langs.php:311 src/Process/Backend/Langs.php:334 +#: src/Process/Backend/Post.php:714 src/Process/Backend/User.php:281 +#: src/Process/Backend/User.php:294 src/Process/Backend/User.php:414 +#: src/Process/Backend/UsersActions.php:336 src/Process/Install/Install.php:412 +#: src/Process/Install/Install.php:418 +msgid "Password" +msgstr "Mot de passe" + +#: src/Core/Backend/ModulesList.php:1620 src/Core/Backend/Page.php:1156 +#: src/Process/Backend/Media.php:532 +msgid "Upload" +msgstr "Envoyer" + +#: src/Core/Backend/ModulesList.php:1627 +msgid "Download a zip file" +msgstr "Télécharger un fichier zip" + +#: src/Core/Backend/ModulesList.php:1628 +msgid "Zip file URL:" +msgstr "URL du fichier zip :" + +#: src/Core/Backend/ModulesList.php:1643 +msgid "Download" +msgstr "Télécharger" + +#: src/Core/Backend/ModulesList.php:1684 +msgid "Unknown plugin ID" +msgstr "ID de plugin inconnu" + +#: src/Core/Backend/ModulesList.php:1695 +msgid "This plugin has no configuration file." +msgstr "Ce plugin n'a pas de fichier de configuration." + +#: src/Core/Backend/ModulesList.php:1703 src/Process/Backend/Auth.php:273 +msgid "Insufficient permissions" +msgstr "Permissions insuffisantes" + +#: src/Core/Backend/ModulesList.php:1778 +#, php-format +msgid "Configure \"%s\"" +msgstr "Configurer \"%s\"" + +#: src/Core/Backend/ModulesList.php:1779 +msgid "Back" +msgstr "Retour" + +#: src/Core/Backend/Notices.php:68 src/Core/Backend/Page.php:974 +#: src/Core/Backend/Page.php:1151 src/Process/Backend/Home.php:263 +msgid "Error:" +msgstr "Erreur :" + +#: src/Core/Backend/Notices.php:68 src/Process/Install/Install.php:364 +#: src/Process/Install/Install.php:472 src/Process/Install/Wizard.php:197 +msgid "Errors:" +msgstr "Erreurs :" + +#: src/Core/Backend/Notices.php:224 src/Core/Backend/Notices.php:257 +msgid "%H:%M:%S" +msgstr "%H:%M:%S" + +#: src/Core/Backend/Page.php:112 src/Process/Backend/User.php:454 +msgid "Blog:" +msgstr "Blog :" + +#: src/Core/Backend/Page.php:116 +msgid "Change blog" +msgstr "Changer de blog" + +#: src/Core/Backend/Page.php:125 +msgid "Blogs:" +msgstr "Blogs :" + +#: src/Core/Backend/Page.php:269 +msgid "Go to the content" +msgstr "Aller au contenu" + +#: src/Core/Backend/Page.php:270 +msgid "Go to the menu" +msgstr "Aller au menu" + +#: src/Core/Backend/Page.php:271 +msgid "Go to help" +msgstr "Aller à l'aide" + +#: src/Core/Backend/Page.php:274 src/Process/Backend/UserPreferences.php:799 +#: src/Process/Backend/UserPreferences.php:800 +msgid "My dashboard" +msgstr "Mon tableau de bord" + +#: src/Core/Backend/Page.php:279 src/Core/Backend/Page.php:280 +msgid "Go to site" +msgstr "Aller sur le site" + +#: src/Core/Backend/Page.php:285 +#, php-format +msgid "Logout %s" +msgstr "Déconnecter %s" + +#: src/Core/Backend/Page.php:293 +msgid "Hide main menu" +msgstr "Masquer le menu principal" + +#: src/Core/Backend/Page.php:294 +msgid "Show main menu" +msgstr "Afficher le menu principal" + +#: src/Core/Backend/Page.php:305 +msgid "Safe mode" +msgstr "Mode de secours" + +#: src/Core/Backend/Page.php:306 +msgid "You are in safe mode. All plugins have been temporarily disabled. Remind to log out then log in again normally to get back all functionalities" +msgstr "Vous êtes en mode de secours. Tous les plugins ont été temporairement désactivés. N'oubliez-pas de vous déconnecter puis de vous reconnecter normalement pour retrouver toutes les fonctionnalités" + +#: src/Core/Backend/Page.php:476 +#, php-format +msgid "Thank you for using %s." +msgstr "Merci d'utiliser %s." + +#: src/Core/Backend/Page.php:489 src/Core/Backend/Page.php:614 +msgid "Page top" +msgstr "Haut de page" + +#: src/Core/Backend/Page.php:656 src/Core/Backend/Page.php:657 +msgid "Go to dashboard" +msgstr "Mon tableau de bord" + +#: src/Core/Backend/Page.php:817 +msgid "Help about this page" +msgstr "Aide à propos de cette page" + +#: src/Core/Backend/Page.php:822 +#, php-format +msgid "See also %s" +msgstr "Voir aussi %s" + +#: src/Core/Backend/Page.php:822 +msgid "the global help" +msgstr "Aide générale" + +#: src/Core/Backend/Page.php:956 +msgid "uncover" +msgstr "récupérer" + +#: src/Core/Backend/Page.php:960 +msgid "hide" +msgstr "cacher" + +#: src/Core/Backend/Page.php:964 +msgid "Need help?" +msgstr "Besoin d'aide ?" + +#: src/Core/Backend/Page.php:965 +msgid "new window" +msgstr "nouvelle fenêtre" + +#: src/Core/Backend/Page.php:966 +msgid "Hide" +msgstr "Cacher" + +#: src/Core/Backend/Page.php:967 +msgid "Select:" +msgstr "Sélectionner :" + +#: src/Core/Backend/Page.php:968 +msgid "No selection" +msgstr "Pas de sélection" + +#: src/Core/Backend/Page.php:969 +msgid "Select all" +msgstr "Tout sélectionner" + +#: src/Core/Backend/Page.php:970 +msgid "Invert selection" +msgstr "Inverser la sélection" + +#: src/Core/Backend/Page.php:975 src/Process/Backend/Post.php:450 +#: src/Process/Backend/Post.php:577 +msgid "Entry has been successfully created." +msgstr "Le billet a été créé." + +#: src/Core/Backend/Page.php:976 +msgid "Edit entry" +msgstr "Ãditer la publication" + +#: src/Core/Backend/Page.php:977 +msgid "view entry" +msgstr "Voir la publication" + +#: src/Core/Backend/Page.php:978 +#, php-format +msgid "Are you sure you want to delete selected entries (%s)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les publications sélectionnées (%s) ?" + +#: src/Core/Backend/Page.php:979 +#, php-format +msgid "Are you sure you want to delete selected medias (%d)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les médias sélectionnés (%d) ?" + +#: src/Core/Backend/Page.php:980 +#, php-format +msgid "Are you sure you want to delete selected categories (%s)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les catégories sélectionnées (%s) ?" + +#: src/Core/Backend/Page.php:981 +msgid "Are you sure you want to delete this entry?" +msgstr "Ãtes-vous certain·e de vouloir supprimer cette publication ?" + +#: src/Core/Backend/Page.php:982 +msgid "Click here to unlock the field" +msgstr "Cliquez ici pour déverrouiller le champ" + +#: src/Core/Backend/Page.php:983 +msgid "Are you sure you want to delete all spams?" +msgstr "Ãtes-vous certain·e de vouloir supprimer tous les indésirables ?" + +#: src/Core/Backend/Page.php:984 +#, php-format +msgid "Are you sure you want to delete selected comments (%s)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les commentaires sélectionnés (%s) ?" + +#: src/Core/Backend/Page.php:985 +msgid "Are you sure you want to delete this comment?" +msgstr "Ãtes-vous certain·e de vouloir supprimer ce commentaire ?" + +#: src/Core/Backend/Page.php:986 +msgid "Users with posts cannot be deleted." +msgstr "Une utilisatrice ou un utilisateur avec des publications ne peut être supprimé." + +#: src/Core/Backend/Page.php:987 +#, php-format +msgid "Are you sure you want to delete selected users (%s)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les utilisatrices et les utilisateurs sélectionnées (%s) ?" + +#: src/Core/Backend/Page.php:988 +#, php-format +msgid "Are you sure you want to delete selected blogs (%s)?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les blogs sélectionnés (%s) ?" + +#: src/Core/Backend/Page.php:989 +#, php-format +msgid "Are you sure you want to delete category \"%s\"?" +msgstr "Ãtes-vous certain·e de vouloir supprimer la catégorie \"%s\" ?" + +#: src/Core/Backend/Page.php:990 +msgid "Are you sure you want to reorder all categories?" +msgstr "Ãtes-vous sûr·e de vouloir réordonner toutes les catégories ?" + +#: src/Core/Backend/Page.php:991 +#, php-format +msgid "Are you sure you want to remove media \"%s\"?" +msgstr "Ãtes-vous certain·e de vouloir supprimer le média \"%s\" ?" + +#: src/Core/Backend/Page.php:992 +#, php-format +msgid "Are you sure you want to remove directory \"%s\"?" +msgstr "Ãtes-vous certain·e de vouloir supprimer le répertoire \"%s\" ?" + +#: src/Core/Backend/Page.php:993 +msgid "Are you sure you want to extract archive in current directory?" +msgstr "Ãtes-vous certain·e de vouloir extraire cette archive dans le répertoire courant ?" + +#: src/Core/Backend/Page.php:994 +#, php-format +msgid "Are you sure you want to remove attachment \"%s\"?" +msgstr "Ãtes-vous certain·e de vouloir supprimer l'annexe \"%s\" ?" + +#: src/Core/Backend/Page.php:995 +#, php-format +msgid "Are you sure you want to delete \"%s\" language?" +msgstr "Ãtes-vous certain·e de vouloir supprimer la langue \"%s\" ?" + +#: src/Core/Backend/Page.php:996 +#, php-format +msgid "Are you sure you want to delete \"%s\" plugin?" +msgstr "Ãtes-vous certain·e de vouloir supprimer le plugin \"%s\" ?" + +#: src/Core/Backend/Page.php:997 +msgid "Are you sure you want to delete selected plugins?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les plugins sélectionnés ?" + +#: src/Core/Backend/Page.php:998 +msgid "Use this theme" +msgstr "Utiliser ce thème" + +#: src/Core/Backend/Page.php:999 +msgid "Remove this theme" +msgstr "Supprimer ce thème" + +#: src/Core/Backend/Page.php:1000 +#, php-format +msgid "Are you sure you want to delete \"%s\" theme?" +msgstr "Ãtes-vous certain·e de vouloir supprimer le thème \"%s\" ?" + +#: src/Core/Backend/Page.php:1001 +msgid "Are you sure you want to delete selected themes?" +msgstr "Ãtes-vous sûr·e de vouloir supprimer les thèmes sélectionnés ?" + +#: src/Core/Backend/Page.php:1002 +msgid "Are you sure you want to delete this backup?" +msgstr "Ãtes-vous certain·e de vouloir supprimer cette sauvegarde ?" + +#: src/Core/Backend/Page.php:1003 +msgid "Are you sure you want to revert to this backup?" +msgstr "Ãtes-vous certain·e de vouloir restaurer cette sauvegarde ?" + +#: src/Core/Backend/Page.php:1004 +msgid "Zip file content" +msgstr "Contenu de l'archive Zip" + +#: src/Core/Backend/Page.php:1005 +msgid "HTML markup validator" +msgstr "Validateur HTML" + +#: src/Core/Backend/Page.php:1006 +msgid "HTML content is valid." +msgstr "Le contenu HTML est valide." + +#: src/Core/Backend/Page.php:1007 +msgid "There are HTML markup errors." +msgstr "Il y a des erreurs de balisage HTML." + +#: src/Core/Backend/Page.php:1008 +msgid "Attention: an audit of a content not yet registered." +msgstr "Attention : audit d'un contenu qui n'est pas encore enregistré." + +#: src/Core/Backend/Page.php:1009 +msgid "You have unsaved changes. Switch post format will loose these changes. Proceed anyway?" +msgstr "Vous avez des modifications non enregistrées. Changer le format de publication va perdre ces modifications. Continuer quand même ?" + +#: src/Core/Backend/Page.php:1010 +msgid "Warning: post format change will not convert existing content. You will need to apply new format by yourself. Proceed anyway?" +msgstr "Attention : la modification du format de publication ne convertira pas le contenu existant. Vous devrez appliquer le nouveau format par vous-même. Continuer quand même ?" + +#: src/Core/Backend/Page.php:1011 +msgid "Loading enhanced uploader, please wait." +msgstr "Chargement de l'interface améliorée, veuillez patienter." + +#: src/Core/Backend/Page.php:1016 +msgid "Help:" +msgstr "Aide :" + +#: src/Core/Backend/Page.php:1020 +msgid "Hide this notice" +msgstr "Masquer ce message" + +#: src/Core/Backend/Page.php:1022 +msgid "Show password" +msgstr "Montrer le mot de passe" + +#: src/Core/Backend/Page.php:1023 +msgid "Hide password" +msgstr "Cacher le mot de passe" + +#: src/Core/Backend/Page.php:1025 +msgid "Reset to now" +msgstr "Réinitialiser à maintenant" + +#: src/Core/Backend/Page.php:1027 +msgid "An ad blocker has been detected on this Dotclear dashboard (Ghostery, Adblock plus, uBlock origin, â¦) and it may interfere with some features. In this case you should disable it. Note that this detection may be disabled in your preferences." +msgstr "Une bloqueur de publicité a été détecté sur ce tableau de bord de Dotclear (Ghostery, Adblock plus, uBlock origin, â¦) et il peut perturber certaines fonctionnalités. Dans ce cas vous devriez le désactiver. Notez que vous pouvez désactiver cette détection dans vos préférences." + +#: src/Core/Backend/Page.php:1081 +msgid "You have unsaved changes." +msgstr "Vous avez des modifications non sauvegardées." + +#: src/Core/Backend/Page.php:1082 +msgid "your battery charge seems low (%d%) and you have unsaved changes, you should save them." +msgstr "la charge de votre batterie semble faible (%d%) et vous avez des modifications non enregistrées, vous devriez les enregistrer." + +#: src/Core/Backend/Page.php:1142 +msgid "Temporarily activate enhanced uploader" +msgstr "Activer temporairement l'interface avancée de la médiathèque" + +#: src/Core/Backend/Page.php:1143 +msgid "Temporarily disable enhanced uploader" +msgstr "Désactiver temporairement l'interface améliorée" + +#: src/Core/Backend/Page.php:1147 +msgid "Limit exceeded." +msgstr "La limite est dépassée." + +#: src/Core/Backend/Page.php:1148 +msgid "File size exceeds allowed limit." +msgstr "La taille du fichier dépasse la limite autorisée." + +#: src/Core/Backend/Page.php:1149 +msgid "Canceled." +msgstr "Annulé." + +#: src/Core/Backend/Page.php:1150 +msgid "HTTP Error:" +msgstr "Erreur HTTP :" + +#: src/Core/Backend/Page.php:1152 src/Process/Backend/Media.php:513 +msgid "Choose file" +msgstr "Choisir un fichier" + +#: src/Core/Backend/Page.php:1153 src/Process/Backend/Media.php:514 +msgid "Choose files" +msgstr "Choisir des fichiers" + +#: src/Core/Backend/Page.php:1154 src/Process/Backend/Blog.php:191 +#: src/Process/Backend/BlogDel.php:134 src/Process/Backend/BlogPref.php:904 +#: src/Process/Backend/Category.php:275 src/Process/Backend/Comment.php:308 +#: src/Process/Backend/LinkPopup.php:73 src/Process/Backend/Media.php:230 +#: src/Process/Backend/Media.php:569 src/Process/Backend/MediaItem.php:531 +#: src/Process/Backend/MediaItem.php:731 src/Process/Backend/MediaItem.php:1093 +#: src/Process/Backend/Post.php:817 src/Process/Backend/Post.php:820 +#: src/Process/Backend/PostMedia.php:113 src/Process/Backend/Search.php:112 +#: src/Process/Backend/User.php:421 src/Process/Backend/UserPreferences.php:610 +#: src/Process/Backend/UserPreferences.php:793 +#: src/Process/Backend/UserPreferences.php:972 +msgid "Cancel" +msgstr "Annuler" + +#: src/Core/Backend/Page.php:1155 +msgid "Clean" +msgstr "Vider" + +#: src/Core/Backend/Page.php:1157 src/Process/Backend/MediaItem.php:1064 +msgid "Send" +msgstr "Envoyer" + +#: src/Core/Backend/Page.php:1158 +msgid "File successfully uploaded." +msgstr "Le fichier a été chargé." + +#: src/Core/Backend/Page.php:1159 +msgid "No file in queue." +msgstr "Aucun fichier en attente." + +#: src/Core/Backend/Page.php:1160 +msgid "1 file in queue." +msgstr "1 fichier en file d'attente." + +#: src/Core/Backend/Page.php:1161 +#, php-format +msgid "%d files in queue." +msgstr "%d fichiers dans la file d'attente." + +#: src/Core/Backend/Page.php:1162 +msgid "Queue error:" +msgstr "Erreur de file d'attente :" + +#: src/Core/Backend/Page.php:1205 +msgid "Cancel filters and display options" +msgstr "Annuler les filtres et options d'affichage" + +#: src/Core/Backend/ThemeConfig.php:139 +#, php-format +msgid "(%s)" +msgstr "(%s)" + +#: src/Core/Backend/ThemeConfig.php:139 +#, php-format +msgid "ratio %.1f" +msgstr "ratio %.1f" + +#: src/Core/Backend/ThemeConfig.php:267 src/Core/Backend/ThemeConfig.php:415 +msgid "The 'public' directory does not exist." +msgstr "Le répertoire 'public' n'existe pas." + +#: src/Core/Backend/ThemeConfig.php:274 src/Core/Backend/ThemeConfig.php:286 +#: src/Core/Backend/ThemeConfig.php:422 src/Core/Backend/ThemeConfig.php:434 +#, php-format +msgid "The '%s' directory cannot be modified." +msgstr "Le répertoire %s ne peut pas être modifié." + +#: src/Core/Backend/ThemeConfig.php:408 +msgid "At least one of the following functions is not available: imagecreatetruecolor, imagepng & imagecreatefrompng." +msgstr "Au moins une des fonctions suivantes n'est pas disponible : imagecreatetruecolor, imagepng & imagecreatefrompng." + +#: src/Core/Backend/ThemeConfig.php:454 +msgid "Unable to create images." +msgstr "Impossible de créer des images." + +#: src/Core/Backend/ThemeConfig.php:461 +msgid "Invalid file type." +msgstr "Type de fichier invalide." + +#: src/Core/Backend/ThemeConfig.php:467 src/Helper/File/Manager.php:361 +#: src/Helper/File/Manager.php:401 +msgid "An error occurred while writing the file." +msgstr "Une erreur est survenue pendant l'écriture du fichier." + +#: src/Core/Backend/ThemeConfig.php:473 +#, php-format +msgid "Uploaded image is not %s pixels wide." +msgstr "L'image envoyée n'a pas %s pixels de large." + +#: src/Core/Backend/ThemesList.php:111 +#, php-format +msgid "Score: %s" +msgstr "Score : %s" + +#: src/Core/Backend/ThemesList.php:129 +#, php-format +msgid "%s screenshot." +msgstr "Capture d'écran de %s." + +#: src/Core/Backend/ThemesList.php:158 +#, php-format +msgid "by %s" +msgstr "par %s" + +#: src/Core/Backend/ThemesList.php:162 +#, php-format +msgid "version %s" +msgstr "version %s" + +#: src/Core/Backend/ThemesList.php:166 +#, php-format +msgid "(current version %s)" +msgstr "(version courante %s)" + +#: src/Core/Backend/ThemesList.php:171 +#, php-format +msgid "(built on \"%s\")" +msgstr "(basé sur \"%s\")" + +#: src/Core/Backend/ThemesList.php:173 +#, php-format +msgid "(requires \"%s\")" +msgstr "(nécessite \"%s\")" + +#: src/Core/Backend/ThemesList.php:212 +msgid "View stylesheet" +msgstr "Feuille de style" + +#: src/Core/Backend/ThemesList.php:227 +msgid "Configure theme" +msgstr "Personnaliser le thème" + +#: src/Core/Backend/ThemesList.php:257 +msgid "No themes matched your search." +msgstr "Aucun thème ne correspond à votre recherche." + +#: src/Core/Backend/ThemesList.php:297 +msgid "Use this one" +msgstr "Utiliser celui-ci" + +#: src/Core/Backend/ThemesList.php:310 src/Process/Backend/Post.php:816 +msgid "Preview" +msgstr "Prévisualiser" + +#: src/Core/Backend/ThemesList.php:355 +msgid "Update selected themes" +msgstr "Mettre à jour les thèmes selectionnés" + +#: src/Core/Backend/ThemesList.php:356 +msgid "Update all themes from this list" +msgstr "Mettre à jour tous les thèmes de cette liste" + +#: src/Core/Backend/ThemesList.php:399 src/Core/Backend/ThemesList.php:437 +#: src/Core/Backend/ThemesList.php:475 src/Core/Backend/ThemesList.php:510 +#: src/Core/Backend/ThemesList.php:551 src/Core/Backend/ThemesList.php:585 +#: src/Core/Backend/ThemesList.php:635 +msgid "No such theme." +msgstr "Thème inexistant." + +#: src/Core/Backend/ThemesList.php:405 +#, php-format +msgid "Theme %s has been successfully selected." +msgstr "Le thème %s a été sélectionné." + +#: src/Core/Backend/ThemesList.php:441 +msgid "Theme has been successfully activated." +msgid_plural "Themes have been successuflly activated." +msgstr[0] "Ce thème a été activé." +msgstr[1] "Ces thèmes ont été activés." + +#: src/Core/Backend/ThemesList.php:479 +msgid "Some themes have not been deactivated." +msgstr "Certains thèmes n'ont pas pu être désactivés." + +#: src/Core/Backend/ThemesList.php:482 +msgid "Theme has been successfully deactivated." +msgid_plural "Themes have been successuflly deactivated." +msgstr[0] "Ce thème a été désactivé." +msgstr[1] "Ces thèmes ont été désactivés." + +#: src/Core/Backend/ThemesList.php:514 +msgid "Theme has been successfully cloned." +msgid_plural "Themes have been successuflly cloned." +msgstr[0] "Ce thème a été dupliqué." +msgstr[1] "Ces thèmes ont été dupliqués." + +#: src/Core/Backend/ThemesList.php:549 +msgid "You don't have permissions to delete this theme." +msgstr "Vous n'avez pas les permissions pour supprimer ce thème." + +#: src/Core/Backend/ThemesList.php:553 +msgid "Some themes have not been delete." +msgstr "Certains thèmes n'ont pas pu être effacés." + +#: src/Core/Backend/ThemesList.php:556 +msgid "Theme has been successfully deleted." +msgid_plural "Themes have been successuflly deleted." +msgstr[0] "Ce thème a été supprimé." +msgstr[1] "Ces thèmes ont été supprimés." + +#: src/Core/Backend/ThemesList.php:589 +msgid "Theme has been successfully installed." +msgid_plural "Themes have been successfully installed." +msgstr[0] "Ce thème a été installé." +msgstr[1] "Ces thèmes ont été installés." + +#: src/Core/Backend/ThemesList.php:628 +msgid "Theme has been successfully updated." +msgid_plural "Themes have been successfully updated." +msgstr[0] "Ce thème a été mis à jour." +msgstr[1] "Ces thèmes ont été mis à jour." + +#: src/Core/Backend/ThemesList.php:632 +#, php-format +msgid "Following themes updates are locked: %s" +msgstr "Les mises à jour des thèmes suivants sont verrouillées : %s" + +#: src/Core/Backend/ThemesList.php:670 +msgid "The theme has been successfully updated." +msgstr "Ce thème a été mis à jour." + +#: src/Core/Backend/ThemesList.php:671 +msgid "The theme has been successfully installed." +msgstr "Ce thème a été installé." + +#: src/Core/Backend/UserPref.php:113 +msgid "users per page" +msgstr "utilisateur·rice·s par page" + +#: src/Core/Backend/UserPref.php:123 +msgid "entries per page" +msgstr "billets par page" + +#: src/Core/Backend/UserPref.php:130 +msgid "comments per page" +msgstr "commentaires par page" + +#: src/Core/Backend/UserPref.php:137 +msgid "blogs per page" +msgstr "blogs par page" + +#: src/Core/Backend/UserPref.php:149 +msgid "media per page" +msgstr "médias par page" + +#: src/Core/Backend/UserPref.php:156 +msgid "results per page" +msgstr "résultats par page" + +#: src/Core/Backend/Utility.php:108 +msgid "Database error" +msgstr "Erreur de base de données" + +#: src/Core/Backend/Utility.php:108 +msgid "There seems to be no Session table in your database. Is Dotclear completly installed?" +msgstr "Il semble de la table Session n'existe pas dans votre base de données. Dotclear est-il bien installé correctement ?" + +#: src/Core/Backend/Utility.php:126 +msgid "Precondition Failed" +msgstr "Ãchec de la précondition" + +#: src/Core/Frontend/Utility.php:131 +msgid "Database problem" +msgstr "Problème de base de données" + +#: src/Core/Frontend/Utility.php:133 +msgid "Something went wrong while trying to read the database." +msgstr "Un problème s'est produit lors de la lecture de la base de données." + +#: src/Core/Frontend/Utility.php:138 +msgid "Blog is not defined." +msgstr "Le blog n'est pas défini." + +#: src/Core/Frontend/Utility.php:138 +msgid "Did you change your Blog ID?" +msgstr "Avez-vous changé l'identifiant de votre blog ?" + +#: src/Core/Frontend/Utility.php:143 +msgid "Blog is offline." +msgstr "Le blog est hors ligne." + +#: src/Core/Frontend/Utility.php:143 +msgid "This blog is offline. Please try again later." +msgstr "Ce blog est hors ligne. Veuillez réessayer plus tard." + +#: src/Core/Frontend/Utility.php:186 +msgid "Can't create template files." +msgstr "Impossible de créer des fichiers modèles." + +#: src/Core/Frontend/Utility.php:238 +msgid "Default theme not found." +msgstr "Thème par défaut introuvable." + +#: src/Core/Frontend/Utility.php:238 +msgid "This either means you removed your default theme or set a wrong theme path in your blog configuration. Please check theme_path value in about:config module or reinstall default theme. (" +msgstr "Cela signifie que vous avez supprimé votre thème par défaut ou que vous avez défini un mauvais chemin d'accès au thème dans la configuration de votre blog. Veuillez vérifier la valeur theme_path dans le module about:config ou réinstallez le thème par défaut. (" + +#: src/Core/Frontend/Utility.php:304 +msgid "Something went wrong while loading template file for your blog." +msgstr "Un problème s'est produit lors du chargement du fichier modèle de votre blog." + +#: src/Core/Install/Utils.php:32 src/Process/Backend/Update.php:284 +#, php-format +msgid "PHP version is %s (%s or earlier needed)." +msgstr "La version de PHP est %s (%s ou plus récente nécessaire)." + +#: src/Core/Install/Utils.php:36 +msgid "Multibyte string module (mbstring) is not available." +msgstr "Le support des chaînes multi-octets (mbstring) n'est pas disponible." + +#: src/Core/Install/Utils.php:40 +msgid "Iconv module is not available." +msgstr "Le module iconv n'est pas disponible." + +#: src/Core/Install/Utils.php:44 +msgid "Output control functions are not available." +msgstr "Les fonctions de bufferisation de sortie ne sont pas disponibles." + +#: src/Core/Install/Utils.php:48 +msgid "SimpleXML module is not available." +msgstr "Le module SimpleXML n'est pas disponible." + +#: src/Core/Install/Utils.php:52 +msgid "DOM XML module is not available." +msgstr "Le module DOM XML n'est pas disponible." + +#: src/Core/Install/Utils.php:57 +msgid "PCRE engine does not support UTF-8 strings." +msgstr "Le moteur d'expressions rationnelles PCRE n'accepte pas les chaînes UTF-8." + +#: src/Core/Install/Utils.php:61 +msgid "SPL module is not available." +msgstr "Le module SPL n'est pas disponible." + +#: src/Core/Install/Utils.php:66 +#, php-format +msgid "MySQL version is %s (%s or earlier needed)." +msgstr "La version de PHP est %s (%s ou plus récente nécessaire)." + +#: src/Core/Install/Utils.php:79 +msgid "MySQL InnoDB engine is not available." +msgstr "Le gestionnaire de stockage InnoDB de MySQL n'est pas disponible." + +#: src/Core/Install/Utils.php:84 +#, php-format +msgid "PostgreSQL version is %s (%s or earlier needed)." +msgstr "La version de PHP est %s (%s ou plus récente nécessaire)." + +#: src/Core/Upgrade/Upgrade.php:72 +msgid "Something went wrong with auto upgrade:" +msgstr "Une erreur est survenue durant la mise à jour automatique :" + +#: src/Database/Statement/DeleteStatement.php:34 +msgid "SQL DELETE requires a FROM source" +msgstr "SQL DELETE requiert une source FROM" + +#: src/Database/Statement/DropStatement.php:34 +msgid "SQL DROP TABLE requires a FROM source" +msgstr "SQL DROP TABLE requiert une table source" + +#: src/Database/Statement/InsertStatement.php:129 +msgid "SQL INSERT requires an INTO source" +msgstr "SQL INSERT requiert une source INTO" + +#: src/Database/Statement/JoinStatement.php:93 +msgid "SQL JOIN requires a FROM source" +msgstr "SQL JOIN requiert une source" + +#: src/Database/Statement/SelectStatement.php:242 +msgid "SQL SELECT requires a FROM source" +msgstr "SQL SELECT requiert une source FROM" + +#: src/Database/Statement/TruncateStatement.php:34 +msgid "SQL TRUNCATE TABLE requires a FROM source" +msgstr "SQL TRUNCATE TABLE requiert une table source" + +#: src/Database/Statement/UpdateStatement.php:195 +msgid "SQL UPDATE requires a FROM source" +msgstr "SQL UPDATE requiert une source FROM" + +#: src/Helper/Diff/Diff.php:247 +msgid "Bad range" +msgstr "Bornes incorrectes" + +#: src/Helper/Diff/Diff.php:251 src/Helper/Diff/Diff.php:322 +msgid "Invalid range" +msgstr "Bornes invalides" + +#: src/Helper/Diff/Diff.php:259 src/Helper/Diff/Diff.php:329 +msgid "Invalid line number" +msgstr "Numéro de ligne invalide" + +#: src/Helper/Diff/Diff.php:263 src/Helper/Diff/Diff.php:297 +#: src/Helper/Diff/Diff.php:333 src/Helper/Diff/Diff.php:367 +msgid "Chunk is out of range" +msgstr "Le fragment est hors des bornes" + +#: src/Helper/Diff/Diff.php:272 +msgid "Bad context" +msgstr "Contexte incorrect" + +#: src/Helper/Diff/Diff.php:286 +msgid "Bad context (in deletion)" +msgstr "Contexte incorrect (en suppression)" + +#: src/Helper/Diff/Diff.php:292 src/Helper/Diff/Diff.php:362 +msgid "Invalid diff format" +msgstr "Fichier de patch invalide" + +#: src/Helper/File/Files.php:180 src/Helper/File/Files.php:535 +msgid "Unable to open directory." +msgstr "Impossible de lire le répertoire." + +#: src/Helper/File/Files.php:356 +msgid "Unable to create directory." +msgstr "Impossible de créer le répertoire." + +#: src/Helper/File/Files.php:399 +msgid "File is not writable." +msgstr "Le fichier n'est pas accessible en écriture." + +#: src/Helper/File/Files.php:405 +msgid "Unable to open file." +msgstr "Impossible d'ouvrir le fichier." + +#: src/Helper/File/Files.php:477 +msgid "Not an uploaded file." +msgstr "Fichier invalide" + +#: src/Helper/File/Files.php:485 +msgid "The uploaded file exceeds the maximum file size allowed." +msgstr "La taille du fichier envoyé excède la taille maximale autorisée." + +#: src/Helper/File/Files.php:487 +msgid "The uploaded file was only partially uploaded." +msgstr "Le fichier a été partiellement envoyé." + +#: src/Helper/File/Files.php:489 +msgid "No file was uploaded." +msgstr "Aucun fichier n'a été envoyé." + +#: src/Helper/File/Files.php:491 +msgid "Missing a temporary folder." +msgstr "Un répertoire temporaire est manquant." + +#: src/Helper/File/Files.php:493 +msgid "Failed to write file to disk." +msgstr "Impossible d'écrire le fichier sur le disque." + +#: src/Helper/File/Files.php:495 +msgid "A PHP extension stopped the file upload." +msgstr "Une extension PHP a stoppé l'envoi du fichier." + +#: src/Helper/File/Files.php:528 +#, php-format +msgid "%s is not a directory." +msgstr "%s n'est pas un répertoire." + +#: src/Helper/File/Files.php:581 +msgid "Can't get file path" +msgstr "Impossible d'obtenir le chemin d'accès au fichier" + +#: src/Helper/File/Files.php:588 +msgid "Can't lock a directory" +msgstr "Impossible de verrouiller un répertoire" + +#: src/Helper/File/Files.php:600 +msgid "Can't call php function named flock" +msgstr "Impossible d'appeler la fonction PHP nommée flock" + +#: src/Helper/File/Files.php:614 +msgid "Can't create file" +msgstr "Impossible de créer un fichier" + +#: src/Helper/File/Files.php:624 +msgid "Can't open file" +msgstr "Impossible d'ouvrir le fichier" + +#: src/Helper/File/Files.php:632 +msgid "Can't lock file" +msgstr "Impossible de verrouiller le fichier" + +#: src/Helper/File/Files.php:654 src/Helper/File/Manager.php:492 +#: src/Helper/File/Manager.php:496 +msgid "File cannot be removed." +msgstr "Le fichier ne peut être supprimé." + +#: src/Helper/File/Image/ImageTools.php:177 +msgid "Not enough memory to open image." +msgstr "Pas assez de mémoire pour ouvrir l'image" + +#: src/Helper/File/Manager.php:345 src/Helper/File/Manager.php:388 +msgid "Uploading this file is not allowed." +msgstr "L'envoi de ce fichier n'est pas autorisé." +#: src/Helper/File/Manager.php:349 src/Helper/File/Manager.php:392 +msgid "Destination directory is not in jail." +msgstr "Le répertoire de destination n'est pas interdit." + +#: src/Helper/File/Manager.php:353 +msgid "File already exists." +msgstr "Le fichier existe déjà ." + +#: src/Helper/File/Manager.php:357 src/Helper/File/Manager.php:396 +msgid "Cannot write in this directory." +msgstr "Impossible d'écrire dans ce répertoire." + +#: src/Helper/File/Manager.php:437 +msgid "Source file does not exist." +msgstr "Le fichier source n'existe pas." + +#: src/Helper/File/Manager.php:443 src/Helper/File/Manager.php:446 +#: src/Helper/File/Manager.php:488 +msgid "File is not in jail." +msgstr "Le fichier n'est pas interdit." + +#: src/Helper/File/Manager.php:450 +msgid "Destination directory is not writable." +msgstr "Le répertoire de destination n'est pas accessible en écriture." + +#: src/Helper/File/Manager.php:454 +msgid "Unable to rename file." +msgstr "Impossible de renommer le fichier." + +#: src/Helper/File/Manager.php:512 +msgid "Directory is not in jail." +msgstr "Le répertoire n'est pas interdit." + +#: src/Helper/File/Manager.php:516 src/Helper/File/Manager.php:520 +msgid "Directory cannot be removed." +msgstr "Le répertoire ne peut pas être retiré." + +#: src/Helper/File/Zip/Unzip.php:89 +#, php-format +msgid "File %s is not compressed in the zip." +msgstr "Le fichier %s n'existe pas dans l'archive zip." + +#: src/Helper/File/Zip/Unzip.php:97 +#, php-format +msgid "Trying to unzip a folder name %s" +msgstr "Tentative de décompression du dossier %s" + +#: src/Helper/File/Zip/Unzip.php:231 +msgid "Unable to write destination file." +msgstr "Impossible d'écrire le fichier de destination." + +#: src/Helper/File/Zip/Unzip.php:244 +msgid "Unable to write in target directory, permission denied." +msgstr "Impossible d'écrire dans le repertoire de destination, les permissions sont insuffisantes." + +#: src/Helper/File/Zip/Unzip.php:536 src/Helper/File/Zip/Zip.php:349 +msgid "Not enough memory to open file." +msgstr "Pas assez de mémoire pour ouvrir le fichier." + +#: src/Helper/File/Zip/Zip.php:75 +msgid "File does not exist" +msgstr "Le fichier n'existe pas." + +#: src/Helper/File/Zip/Zip.php:78 +msgid "Cannot read file" +msgstr "Impossible de lire le fichier" + +#: src/Helper/File/Zip/Zip.php:125 +msgid "Directory does not exist" +msgstr "Le répertoire est inexistant" + +#: src/Helper/File/Zip/Zip.php:128 +msgid "Cannot read directory" +msgstr "Impossible de lire le répertoire" + +#: src/Helper/Html/Template/Template.php:572 +#: src/Helper/Html/Template/Template.php:621 +#, php-format +msgid "Did not find closing tag for block%s return a %s status)."
+msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (%s retourne un statut %s)"
+#: src/Process/Backend/BlogPref.php:832
#, php-format
-msgid "(requires \"%s\")"
-msgstr "(nécessite \"%s\")"
+msgid "The URL of blog or the URL scan method might not be well set (%s does not return an ATOM feed)."
+msgstr "L'URL du blog ou la méthode de lecture de l'URL ne semblent pas être bien réglées (%s ne retourne pas un flux ATOM)"
-msgid "Stylesheet"
-msgstr "Feuille de style"
+#: src/Process/Backend/BlogPref.php:847
+msgid "New post URL format:"
+msgstr "Format d'URL des nouveaux billets :"
-msgid "Theme configuration"
-msgstr "Configuration du thème"
+#: src/Process/Backend/BlogPref.php:850
+msgid "Dotclear"
+msgstr "Dotclear"
-msgid "Blog themes"
-msgstr "Thèmes du blog"
+#: src/Process/Backend/BlogPref.php:853
+msgid "HTML tag for the title of the notes on the blog:"
+msgstr "Balise HTML pour le titre des notes sur le blog :"
-msgid "Blog aspect"
-msgstr "Apparence du blog"
+#: src/Process/Backend/BlogPref.php:860
+msgid "Search engines robots policy"
+msgstr "Paramètres d'indexation par les moteurs de recherche"
-msgid "Theme has been successfully changed."
-msgstr "Thème changé avec succès."
+#: src/Process/Backend/BlogPref.php:873
+msgid "jQuery javascript library"
+msgstr "Bibliothèque javascript jQuery"
-msgid "Theme has been successfully installed."
-msgstr "Le thème a été installé avec succès."
+#: src/Process/Backend/BlogPref.php:876
+msgid "Load the jQuery library"
+msgstr "Charger la bibliothèque jQuery"
-msgid "Theme has been successfully upgraded"
-msgstr "Le thème a été mis à jour avec succès."
+#: src/Process/Backend/BlogPref.php:878
+msgid "jQuery version to be loaded for this blog:"
+msgstr "Version de la bibliothèque jQuery à charger pour ce blog :"
-msgid "Theme has been successfully deleted."
-msgstr "Le thème a été supprimé avec succès."
+#: src/Process/Backend/BlogPref.php:884
+msgid "Blog security"
+msgstr "Sécurité du blog"
-#, php-format
-msgid "You can find additional themes for your blog on %s."
-msgstr "Vous pouvez trouver de nouveaux thèmes pour votre blog sur %s."
+#: src/Process/Backend/BlogPref.php:888
+msgid "Protect the blog from Clickjacking (see Wikipedia)"
+msgstr "Protéger le blog des détournements de clic ou Clickjacking (voir Wikipedia)"
-msgid "To install or upgrade a theme you generally just need to upload it in \"Install or upgrade a theme\" section."
-msgstr "Tout ce que vous avez à faire pour installer ou mettre à jour un thème est généralement de le déposer dans la section \"Installer ou mettre à jour un thème\"."
+#: src/Process/Backend/BlogPref.php:896
+msgid "Plugins parameters"
+msgstr "Paramètres des plugins pour ce blog"
-msgid "Themes"
-msgstr "Thèmes"
+#: src/Process/Backend/BlogPref.php:920
+msgid "Only superadmin can delete a blog."
+msgstr "Seul un ou une super-administrateur·rice peut supprimer un blog."
-#, php-format
-msgid "You are currently using \"%s\""
-msgstr "Vous utilisez actuellement \"%s\""
+#: src/Process/Backend/BlogPref.php:934
+msgid "Users on this blog"
+msgstr "Utilisateur·rice·s de ce blog"
-msgid "use selected theme"
-msgstr "utiliser le thème sélectionné"
+#: src/Process/Backend/BlogPref.php:937
+msgid "No users"
+msgstr "Aucun utilisateur·rice"
-msgid "delete selected theme"
-msgstr "Supprimer le thème sélectionné"
+#: src/Process/Backend/BlogPref.php:978
+msgid "Publications on this blog:"
+msgstr "Publications sur ce blog :"
-msgid "Install or upgrade a theme"
-msgstr "Installer ou mettre à jour un thème"
+#: src/Process/Backend/BlogPref.php:985
+#, php-format
+msgid "%1$s: %2$s"
+msgstr "%1$s : %2$s"
-msgid "You can install themes by uploading or downloading zip files."
-msgstr "Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip."
+#: src/Process/Backend/BlogPref.php:990
+msgid "Permissions:"
+msgstr "Permissions :"
-msgid "Upload a zip file"
-msgstr "Déposer un fichier zip"
+#: src/Process/Backend/BlogPref.php:993 src/Process/Backend/User.php:318
+msgid "Super administrator"
+msgstr "Super administrateur·rice"
-msgid "Theme zip file:"
-msgstr "Fichier zip du thème :"
+#: src/Process/Backend/BlogPref.php:994
+msgid "All rights on all blogs."
+msgstr "Tous les droits sur tous les blogs."
-msgid "Upload theme"
-msgstr "Déposer un thème"
+#: src/Process/Backend/BlogPref.php:1000
+#: src/Process/Backend/UsersActions.php:321
+#, php-format
+msgid "[%s] (unreferenced permission)"
+msgstr "[%s] (permission non référencée)"
-msgid "Download a zip file"
-msgstr "Télécharger un fichier zip"
+#: src/Process/Backend/BlogPref.php:1004
+msgid "All rights on this blog."
+msgstr "Tous les droits sur ce blog."
-msgid "Theme zip file URL:"
-msgstr "URL du fichier zip du thème :"
+#: src/Process/Backend/BlogPref.php:1015 src/Process/Backend/User.php:468
+msgid "Change permissions"
+msgstr "Changer les permissions"
-msgid "Download theme"
-msgstr "Télécharger le thème"
+#: src/Process/Backend/BlogTheme.php:57
+msgid "The following themes have been disabled :"
+msgstr "Les thèmes suivants ont été désactivés :"
-msgid "To enable this function, please give write access to your themes directory."
-msgstr "Pour activer cette fonction, donnez un accès en écriture à votre répertoire de thèmes."
+#: src/Process/Backend/BlogTheme.php:91
+msgid "Theme configuration"
+msgstr "Personnaliser ce thème"
-msgid "back"
-msgstr "retour"
+#: src/Process/Backend/BlogTheme.php:147
+msgid "Themes management"
+msgstr "Gestion des thèmes"
-msgid "Last update"
-msgstr "Dernière mise à jour"
+#: src/Process/Backend/BlogTheme.php:169 src/Process/Backend/Plugins.php:141
+msgid "Official repository could not be updated as there is no URL set in configuration."
+msgstr "Le dépôt officiel n'a pas pu être mis à jour car il n'y a pas d'URL définie dans la configuration."
-msgid "Blog name"
-msgstr "Nom du blog"
+#: src/Process/Backend/BlogTheme.php:173
+msgid "Manual checking of themes update done successfully."
+msgstr "La vérification manuelle de mise à jour des thèmes a été effectuée."
-msgid "Blog ID"
-msgstr "Identifiant du blog"
+#: src/Process/Backend/BlogTheme.php:185
+msgid "Force checking update of themes"
+msgstr "Forcer la vérification de mise à jour des thèmes"
-msgid "Descending"
-msgstr "Décroissant"
+#: src/Process/Backend/BlogTheme.php:194 src/Process/Backend/BlogTheme.php:195
+msgid "Update themes"
+msgstr "Mettre à jour les thèmes"
-msgid "Ascending"
-msgstr "Croissant"
+#: src/Process/Backend/BlogTheme.php:197
+#, php-format
+msgid "There is one theme to update available from repository."
+msgid_plural "There are %s themes to update available from repository."
+msgstr[0] "Il y a un thème à mettre à jour depuis le dépôt."
+msgstr[1] "Il y a %s thèmes à mettre à jour depuis le dépôt."
-msgid "List of blogs"
-msgstr "Liste des blogs"
+#: src/Process/Backend/BlogTheme.php:214 src/Process/Backend/BlogTheme.php:300
+#: src/Process/Backend/Plugins.php:186 src/Process/Backend/Plugins.php:273
+#, php-format
+msgid "Visit %s repository, the resources center for Dotclear."
+msgstr "Visitez le dépôt %s, le centre de ressources pour Dotclear"
-msgid "Blog has been successfully deleted."
-msgstr "Blog supprimé avec succès."
+#: src/Process/Backend/BlogTheme.php:228 src/Process/Backend/BlogTheme.php:230
+msgid "Installed themes"
+msgstr "Thèmes installés"
-msgid "Create a new blog"
-msgstr "Créer un nouveau blog"
+#: src/Process/Backend/BlogTheme.php:230
+msgid "Activated themes"
+msgstr "Thèmes activés"
-msgid "Filters"
-msgstr "Filtres"
+#: src/Process/Backend/BlogTheme.php:231 src/Process/Backend/Plugins.php:206
+msgid "(in normal mode)"
+msgstr "(en mode normal)"
-msgid "Order by:"
-msgstr "Trier par :"
+#: src/Process/Backend/BlogTheme.php:233
+msgid "You can configure and manage installed themes from this list."
+msgstr "Vous pouvez configurer et gérer les thèmes de cette liste."
-msgid "Sort:"
-msgstr "Trier :"
+#: src/Process/Backend/BlogTheme.php:254 src/Process/Backend/BlogTheme.php:255
+msgid "Deactivated themes"
+msgstr "Thèmes désactivés"
-msgid "Search:"
-msgstr "Chercher :"
+#: src/Process/Backend/BlogTheme.php:256
+msgid "Deactivated themes are installed but not usable. You can activate them from here."
+msgstr "Les thèmes désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page."
-msgid "Blogs per page"
-msgstr "Blogs par page"
+#: src/Process/Backend/BlogTheme.php:280
+msgid "Add themes"
+msgstr "Ajouter des thèmes"
-msgid "filter"
-msgstr "filtre"
+#: src/Process/Backend/BlogTheme.php:281
+msgid "Add themes from repository"
+msgstr "Ajouter des thèmes depuis le dépôt"
-msgid "No blog"
-msgstr "Pas de blog"
+#: src/Process/Backend/BlogTheme.php:309 src/Process/Backend/Plugins.php:283
+msgid "Install or upgrade manually"
+msgstr "Installer ou mettre à jour manuellement"
-msgid "Page(s)"
-msgstr "Page(s)"
+#: src/Process/Backend/BlogTheme.php:310
+msgid "Add themes from a package"
+msgstr "Ajouter des thèmes depuis un package"
-msgid "Entries"
-msgstr "Billets"
+#: src/Process/Backend/BlogTheme.php:311
+msgid "You can install themes by uploading or downloading zip files."
+msgstr "Vous pouvez installer des thèmes en déposant ou téléchargeant des fichiers zip."
-msgid "Status"
-msgstr "Ãtat"
+#: src/Process/Backend/BlogTheme.php:325
+msgid "Some functions are disabled, please give write access to your themes directory to enable them."
+msgstr "Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de thèmes pour les activer."
-#, php-format
-msgid "Edit blog %s"
-msgstr "Modifier le blog %s"
+#: src/Process/Backend/Blogs.php:94 src/Process/Backend/Blogs.php:99
+msgid "List of blogs"
+msgstr "Liste des blogs"
+
+#: src/Process/Backend/Blogs.php:113
+msgid "Create a new blog"
+msgstr "Créer un nouveau blog"
-msgid "edit"
-msgstr "modifier"
+#: src/Process/Backend/Blogs.php:136 src/Process/Backend/Comments.php:184
+#: src/Process/Backend/Users.php:139 src/Process/Backend/UsersActions.php:155
+msgid "Actions"
+msgstr "Actions"
-#, php-format
-msgid "Switch to blog %s"
-msgstr "Passer au blog %s"
+#: src/Process/Backend/Blogs.php:139
+msgid "Selected blogs action:"
+msgstr "Action sur les blogs sélectionnés :"
+#: src/Process/Backend/Blogs.php:157
+msgid "Please give your password to confirm blog(s) deletion:"
+msgstr "Veuillez indiquer votre mot de passe pour confirmer la suppression du ou des blogs :"
+
+#: src/Process/Backend/Categories.php:46
msgid "This category does not exist."
msgstr "Cette catégorie n'existe pas."
-msgid "Categories"
-msgstr "Catégories"
-
-msgid "The category has been successfully created."
-msgstr "Catégorie créée avec succès."
+#: src/Process/Backend/Categories.php:56
+#, php-format
+msgid "The category \"%s\" has been successfully deleted."
+msgstr "La catégorie \"%s\" a été supprimée."
-msgid "The category has been successfully removed."
-msgstr "Catégorie supprimée avec succès."
+#: src/Process/Backend/Categories.php:77
+msgid "Category where to move entries does not exist"
+msgstr "La catégorie où les publications seront déplacées n'existe pas."
+
+#: src/Process/Backend/Categories.php:86
+#, php-format
+msgid "The entries have been successfully moved to category \"%s\""
+msgstr "Les billets ont été déplacés dans la catégorie \"%s\"."
+#: src/Process/Backend/Categories.php:103
+#: src/Process/Backend/Categories.php:154
msgid "Categories have been successfully reordered."
-msgstr "Catégories réordonnées avec succès."
+msgstr "Les catégories ont été réordonnées."
-msgid "The category has been successfully moved."
-msgstr "Catégorie déplacée avec succès."
+#: src/Process/Backend/Categories.php:111
+msgid "Categories order has been successfully reset."
+msgstr "Les catégories ont été réordonnées par défaut."
-msgid "No category yet."
-msgstr "Pas encore de catégorie."
+#: src/Process/Backend/Categories.php:151
+msgid "The category has been successfully removed."
+msgstr "La catégorie a été supprimée."
+
+#: src/Process/Backend/Categories.php:157
+msgid "Entries have been successfully moved to the category you choose."
+msgstr "Les publications ont été déplacés dans la catégorie choisie."
+
+#: src/Process/Backend/Categories.php:163 src/Process/Backend/Category.php:196
+msgid "New category"
+msgstr "Nouvelle catégorie"
-msgid "Categories list"
-msgstr "Liste des catégories"
+#: src/Process/Backend/Categories.php:168
+msgid "No category so far."
+msgstr "Pas de catégorie pour le moment."
+#: src/Process/Backend/Categories.php:190
#, php-format
msgid "%d entries"
-msgstr "%d billets"
+msgstr "%d publications"
+#: src/Process/Backend/Categories.php:190
#, php-format
msgid "%d entry"
-msgstr "%d billet"
+msgstr "%d publication"
+#: src/Process/Backend/Categories.php:190
msgid "total:"
msgstr "total :"
+#: src/Process/Backend/Categories.php:191 src/Process/Backend/Category.php:255
+#: src/Process/Backend/User.php:358 src/Process/Backend/UserPreferences.php:551
msgid "URL:"
msgstr "URLÂ :"
-msgid "Add a new category"
-msgstr "Créer une nouvelle catégorie"
-
-msgid "Title:"
-msgstr "Titre :"
-
-msgid "Parent:"
-msgstr "Parent :"
-
-msgid "Top level"
-msgstr "Premier niveau"
+#: src/Process/Backend/Categories.php:198
+msgid "Move entries to"
+msgstr "Déplacer les publications vers"
-msgid "Save"
-msgstr "Enregistrer"
+#: src/Process/Backend/Categories.php:212
+msgid "Delete category"
+msgstr "Supprimer la catégorie"
-msgid "Remove a category"
-msgstr "Supprimer une catégorie"
+#: src/Process/Backend/Categories.php:230
+msgid "To rearrange categories order, move items by drag and drop, then click on âSave categories orderâ button."
+msgstr "Pour modifier l'ordre des catégories, déplacez les items par glisser-déposer puis cliquez sur le bouton \"Enregistrer l'ordre des catégories\"."
-msgid "Choose a category to remove:"
-msgstr "Choisissez une catégorie à supprimer :"
+#: src/Process/Backend/Categories.php:235
+msgid "Save categories order"
+msgstr "Enregistrer l'ordre des catégories"
-msgid "ok"
-msgstr "ok"
+#: src/Process/Backend/Categories.php:242
+msgid "Reorder all categories on the top level"
+msgstr "Replacer toutes les catégories au premier niveau"
-msgid "Reorder categories"
-msgstr "Réordonner les catégories"
+#: src/Process/Backend/Category.php:80
+msgid "Top level"
+msgstr "Premier niveau"
-msgid "This will relocate all categories on the top level"
-msgstr "Ceci va déplacer toutes les catégories au premier niveau"
+#: src/Process/Backend/Category.php:121 src/Process/Backend/Category.php:133
+msgid "The category has been successfully moved"
+msgstr "La catégorie a été déplacée."
-msgid "Reorder"
-msgstr "Réordonner"
+#: src/Process/Backend/Category.php:166
+msgid "The category has been successfully updated."
+msgstr "La catégorie a été mise à jour."
-msgid "New category"
-msgstr "Nouvelle catégorie"
+#: src/Process/Backend/Category.php:181
+#, php-format
+msgid "The category \"%s\" has been successfully created."
+msgstr "La catégorie \"%s\" a été créée."
+#: src/Process/Backend/Category.php:226
msgid "Category has been successfully updated."
-msgstr "Catégorie mise à jour avec succès."
+msgstr "La catégorie a été mise à jour."
+#: src/Process/Backend/Category.php:231
msgid "Category information"
msgstr "Détails de la catégorie"
+#: src/Process/Backend/Category.php:232 src/Process/Backend/Post.php:909
+msgid "Name:"
+msgstr "Nom :"
+
+#: src/Process/Backend/Category.php:259
msgid "Warning: If you set the URL manually, it may conflict with another category."
msgstr "Attention : si vous indiquez l'URL manuellement, celle-ci peut entrer en conflit avec une autre catégorie."
+#: src/Process/Backend/Category.php:262
msgid "Description:"
msgstr "Description :"
+#: src/Process/Backend/Category.php:283
msgid "Move this category"
msgstr "Déplacer cette catégorie"
+#: src/Process/Backend/Category.php:294
msgid "Category parent"
msgstr "Catégorie parente"
+#: src/Process/Backend/Category.php:323
msgid "Category sibling"
msgstr "Catégorie voisine"
+#: src/Process/Backend/Category.php:325
msgid "Move current category"
msgstr "Déplacer la catégorie"
+#: src/Process/Backend/Category.php:330
+msgid "before"
+msgstr "avant"
+
+#: src/Process/Backend/Category.php:331
msgid "after"
msgstr "après"
-msgid "before"
-msgstr "avant"
+#: src/Process/Backend/Category.php:333
+msgid "position: "
+msgstr "position : "
+#: src/Process/Backend/Comment.php:71
msgid "Entry does not exist."
-msgstr "Ce billet n'existe pas."
+msgstr "Cette publication n'existe pas."
-msgid "No comment"
-msgstr "Aucun commentaire"
+#: src/Process/Backend/Comment.php:90 src/Process/Backend/Post.php:585
+msgid "Comment has been successfully created."
+msgstr "Le commentaire a été créé."
+#: src/Process/Backend/Comment.php:179 src/Process/Backend/Comment.php:239
+msgid "Comment has been successfully updated."
+msgstr "Le commentaire a été mis à jour."
+
+#: src/Process/Backend/Comment.php:195
+msgid "Comment has been successfully deleted."
+msgstr "Le commentaire a été effacé."
+
+#: src/Process/Backend/Comment.php:203
msgid "You can't edit this comment."
msgstr "Vous ne pouvez pas modifier ce commentaire."
+#: src/Process/Backend/Comment.php:224 src/Process/Backend/Comment.php:227
msgid "Edit comment"
msgstr "Modifier le commentaire"
-msgid "Comment has been successfully updated."
-msgstr "Commentaire mis à jour avec succès."
-
+#: src/Process/Backend/Comment.php:245
#, php-format
msgid "Your comment on my blog %s"
msgstr "Votre commentaire sur mon blog %s"
+#: src/Process/Backend/Comment.php:246
#, php-format
-msgid ""
-"Hi!\n"
-"\n"
+msgid "Hi!\n\n"
"You wrote a comment on:\n"
-"%s\n"
-"\n"
-"\n"
-msgstr ""
-"Bonjour,\n"
-"\n"
-"Vous avez déposé un commentaire sur \n"
-"%s\n"
-"\n"
-"\n"
+"%s\n\n\n"
+msgstr "Bonjour,\n\n"
+"Vous avez déposé un commentaire sur :\n"
+"%s\n\n\n"
+#: src/Process/Backend/Comment.php:246
msgid "Send an e-mail"
msgstr "Envoyer un email"
-#, php-format
-msgid "Back to \"%s\""
-msgstr "Retour à \"%s\""
-
-msgid "IP address:"
-msgstr "Adresse IPÂ :"
+#: src/Process/Backend/Comment.php:252
+msgid "Information collected"
+msgstr "Informations recueillies"
+#: src/Process/Backend/Comment.php:261
msgid "Date:"
msgstr "Date :"
-msgid "Author:"
-msgstr "Auteur :"
-
-msgid "Web site:"
-msgstr "Site web :"
-
-msgid "Status:"
-msgstr "Ãtat :"
+#: src/Process/Backend/Comment.php:265
+msgid "Comment submitted"
+msgstr "Commentaire déposé"
+#: src/Process/Backend/Comment.php:293 src/Process/Backend/Post.php:925
msgid "Comment:"
msgstr "Commentaire :"
-msgid "delete"
-msgstr "supprimer"
-
-msgid "comment"
-msgstr "commentaire"
-
-msgid "trackback"
-msgstr "rétrolien"
-
-msgid "Date"
-msgstr "Date"
-
-msgid "Entry title"
-msgstr "Titre du billet"
-
-msgid "Author"
-msgstr "Auteur"
-
-msgid "publish"
-msgstr "publier"
-
-msgid "unpublish"
-msgstr "hors ligne"
-
-msgid "mark as pending"
-msgstr "en attente"
-
-msgid "mark as junk"
-msgstr "indésirable"
-
-msgid "Comments"
-msgstr "Commentaires"
-
-msgid "Type:"
-msgstr "Type :"
-
-msgid "Comments per page"
-msgstr "Commentaires par page"
+#: src/Process/Backend/Comments.php:135
+msgid "Spam comments have been successfully deleted."
+msgstr "Les commentaires indésirables ont été supprimés."
-msgid "Comment author:"
-msgstr "Auteur du commentaire :"
-
-msgid "You have one spam comments."
+#: src/Process/Backend/Comments.php:146
+msgid "You have one spam comment."
msgstr "Vous avez un commentaire indésirable."
+#: src/Process/Backend/Comments.php:147
msgid "Show it."
-msgstr "L'afficher"
+msgstr "L'afficher."
+#: src/Process/Backend/Comments.php:149
#, php-format
msgid "You have %s spam comments."
msgstr "Vous avez %s commentaires indésirables."
+#: src/Process/Backend/Comments.php:150
msgid "Show them."
msgstr "Les afficher."
+#: src/Process/Backend/Comments.php:157
+msgid "Delete all spams"
+msgstr "Supprimer tous les indésirables"
+
+#: src/Process/Backend/Comments.php:180 src/Process/Backend/Post.php:891
+#: src/Process/Backend/Search.php:259
msgid "Selected comments action:"
msgstr "Action sur les commentaires sélectionnés :"
-#, php-format
-msgid "%d comment"
-msgstr "%d commentaire"
-
-#, php-format
-msgid "%d comments"
-msgstr "%d commentaires"
+#: src/Process/Backend/Home.php:53 src/Process/Backend/Plugins.php:47
+msgid "The following plugins have been disabled :"
+msgstr "Les plugins suivants ont été désactivés :"
-msgid "New entry"
-msgstr "Nouveau billet"
-
-msgid "User preferences"
-msgstr "Préférences utilisateur"
+#: src/Process/Backend/Home.php:131
+msgid "Documentation and support"
+msgstr "Documentation et support"
-msgid "Documentation"
-msgstr "Documentation"
+#: src/Process/Backend/Home.php:176
+msgid "Dashboard area's drag and drop is disabled"
+msgstr "L'ordonnancement par glisser-déposer des zones du tableau de bord est désactivé"
-msgid "Latest news"
-msgstr "Actualités"
+#: src/Process/Backend/Home.php:177
+msgid "Dashboard area's drag and drop is enabled"
+msgstr "L'ordonnancement par glisser-déposer des zones du tableau de bord est activé"
+#: src/Process/Backend/Home.php:190 src/Process/Backend/Home.php:203
msgid "Dashboard"
msgstr "Tableau de bord"
+#: src/Process/Backend/Home.php:211
msgid "Make this blog my default blog"
msgstr "Définir comme blog par défaut"
+#: src/Process/Backend/Home.php:215
msgid "This blog is offline"
msgstr "Ce blog est hors ligne"
+#: src/Process/Backend/Home.php:217
msgid "This blog is removed"
-msgstr "Ce blog est supprimé"
-
-msgid "DC_ADMIN_URL is not defined, you should edit your configuration file."
-msgstr "DC_ADMIN_URL n'est pas défini, vous devriez corriger votre fichier de configuration."
-
-msgid "Following plugins have been installed:"
-msgstr "Les extensions suivantes ont été installés :"
-
-msgid "Following plugins have not been installed:"
-msgstr "Les extensions suivantes suivants n'ont pas été installés :"
-
-msgid "Quick entry"
-msgstr "Billet rapide"
-
-msgid "Content:"
-msgstr "Contenu :"
-
-msgid "Category:"
-msgstr "Catégorie :"
-
-msgid "save and publish"
-msgstr "enregister et publier"
-
-#, php-format
-msgid "Dotclear %s is available!"
-msgstr "Dotclear %s est disponible !"
-
-msgid "Upgrade now"
-msgstr "Mettre à jour maintenant"
-
-msgid "Remind me later"
-msgstr "Me le rappeler plus tard"
-
-#, php-format
-msgid "PHP version is %s (5.0 or earlier needed)."
-msgstr "La version de PHP est %s (5.0 ou plus récent nécessaire.)"
-
-msgid "Multibyte string module (mbstring) is not available."
-msgstr "Le support des chaînes multi-octets (mbstring) n'est pas disponible."
-
-msgid "Iconv module is not available."
-msgstr "Le module iconv n'est pas disponible."
-
-msgid "Output control functions are not available."
-msgstr "Les fonctions de bufferisation de sortie ne sont pas disponibles."
-
-msgid "SimpleXML module is not available."
-msgstr "Le module SimpleXML n'est pas disponible."
-
-msgid "DOM XML module is not available."
-msgstr "Le module DOM XML n'est pas disponible."
-
-msgid "PCRE engine does not support UTF-8 strings."
-msgstr "Le moteur d'expressions rationnelles PCRE ne gère pas les chaînes UTF-8."
-
-msgid "SPL module is not available."
-msgstr "Le module SPL n'est pas disponible."
-
-#, php-format
-msgid "MySQL version is %s (4.1 or earlier needed)."
-msgstr "La version de MySQL est %s (4.1 ou plus récent nécessaire)."
-
-msgid "MySQL InnoDB engine is not available."
-msgstr "Le gestionnaire de stockage InnoDB de MySQL n'est pas disponible."
-
-#, php-format
-msgid "PostgreSQL version is %s (8.0 or earlier needed)."
-msgstr "La version de PostgreSQL est %s (8.0 ou plus récent nécessaire)."
-
-msgid "Please set a master key (DC_MASTER_KEY) in configuration file."
-msgstr "Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration."
-
-msgid "Dotclear is already installed."
-msgstr "Dotclear est déjà installé."
-
-msgid "Dotclear cannot be installed."
-msgstr "Dotclear ne peut pas être installé."
-
-msgid "No user ID given"
-msgstr "Aucun identifiant utilisateur spécifié"
-
-msgid "User ID must contain at least 2 characters using letters, numbers or symbols."
-msgstr "L'identifiant utilisateur doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles."
-
-msgid "Invalid email address"
-msgstr "Adresse email incorrecte"
-
-msgid "No password given"
-msgstr "Aucun mot de passe spécifié"
-
-msgid "Passwords don't match"
-msgstr "Les mots de passe ne correspondent pas"
-
-msgid "Password must contain at least 6 characters."
-msgstr "Le mot de passe doit contenir au moins 6 caractères."
-
-msgid "My first blog"
-msgstr "Mon premier blog"
-
-msgid "Welcome to Dotclear!"
-msgstr "Bienvenue sur Dotclear !"
-
-msgid "This is your first entry. When you're ready to blog, log in to edit or delete it."
-msgstr "Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer."
-
-msgid "Dotclear Team"
-msgstr "L'équipe Dotclear"
-
-msgid ""
-"This is a comment.
\n" -"To delete it, log in and view your blog's comments. Then you might remove or edit it.
" -msgstr "Ceci est un commentaire
Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.
" - -msgid "Dotclear installation" -msgstr "Installation de Dotclear" +msgstr "Ce blog est retiré de la publication" +#: src/Process/Backend/Home.php:222 src/Process/Backend/Home.php:230 #, php-format -msgid "Cache directory %s is not writable." -msgstr "Le répertoire de cache %s n'est pas accessible en écriture." +msgid "%s is not defined, you should edit your configuration file." +msgstr "%s n'est pas défini, vous devriez corriger votre fichier de configuration." -msgid "Errors:" -msgstr "Erreurs :" - -msgid "Configuration file has been successfully created." -msgstr "Le fichier de configuration a été créé avec succès." - -msgid "User information" -msgstr "Informations utilisateur" - -msgid "Please provide the following information needed to create the first user." -msgstr "Merci de fournir les informations suivantes pour créer le premier utilisateur." - -msgid "First Name:" -msgstr "Prénom :" - -msgid "Last Name:" -msgstr "Nom" - -msgid "Username and password" -msgstr "Identifiant ou mot de passe incorrect" - -msgid "Confirm password:" -msgstr "Confirmez le mot de passe :" - -msgid "All done!" -msgstr "Terminé !" - -msgid "Dotclear has been successfully installed. Here is some useful information you should keep." -msgstr "Dotclear a été installé avec succès. Conservez les informations suivantes précieusement." - -msgid "Your account" -msgstr "Votre compte" - -msgid "Your blog" -msgstr "Votre blog" - -msgid "Blog address:" -msgstr "Adresse du blog :" +#: src/Process/Backend/Home.php:223 src/Process/Backend/Home.php:231 +msgid "See documentation for more information." +msgstr "Voir la documentation pour plus d'information." -msgid "Administration interface:" -msgstr "Interface d'administration :" +#: src/Process/Backend/Home.php:241 +msgid "The cache directory does not exist or is not writable. You must create this directory with sufficient rights and affect this location to \"DC_TPL_CACHE\" in inc/config.php file." +msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devez créer ce répertoire avec les droits suffisants et affecter celui-ci à \"DC_TPL_CACHE\" dans le fichier inc/config.php." -msgid "Manage your blog now" -msgstr "Gérez votre blog" +#: src/Process/Backend/Home.php:245 +msgid "The cache directory does not exist or is not writable. You should contact your administrator." +msgstr "Le répertoire de cache n'existe pas ou n'est pas accessible en écriture. Vous devriez contacter votre administrateur·rice." -#, php-format -msgid "The file %s already exists. If you need to reset any of the configuration items in this file, please delete it first or you may continue to install." -msgstr "Le fichier %s existe déjà . Pour réinitialiser votre configuration, supprimez d'abord ce fichier ou bien continuez l'installation." +#: src/Process/Backend/Home.php:280 src/Process/Backend/Plugins.php:116 +#: src/Process/Install/Install.php:430 +msgid "Following plugins have been installed:" +msgstr "Les plugins suivants ont été installés :" -#, php-format -msgid "File %s does not exist." -msgstr "Le fichier %s n'existe pas." +#: src/Process/Backend/Home.php:294 src/Process/Backend/Plugins.php:130 +#: src/Process/Install/Install.php:437 +msgid "Following plugins have not been installed:" +msgstr "Les plugins suivants n'ont pas été installés :" -#, php-format -msgid "Cannot write %s file." -msgstr "Impossible d'écrire le fichier %s." +#: src/Process/Backend/Home.php:307 +msgid "Errors have occured with following plugins:" +msgstr "Des erreurs se sont produites avec les plugins suivants :" -msgid "Dotclear installation wizard" -msgstr "Assistant d'installation de Dotclear" +#: src/Process/Backend/Home.php:425 +msgid "Quick post" +msgstr "Billet rapide" -msgid "System information" -msgstr "Informations système" +#: src/Process/Backend/Home.php:435 src/Process/Backend/Post.php:753 +msgid "Content:" +msgstr "Contenu :" -msgid "Please provide the following information needed to create your configuration file." -msgstr "Merci de fournir les informations suivantes pour créer votre fichier de configuration." +#: src/Process/Backend/Home.php:436 src/Process/Backend/Post.php:760 +msgid "Content" +msgstr "Contenu" -msgid "Database type:" -msgstr "Type de base de données :" +#: src/Process/Backend/Home.php:444 src/Process/Backend/Post.php:682 +msgid "Add a new category" +msgstr "Créer une nouvelle catégorie" -msgid "Database Host Name:" -msgstr "Nom d'hôte de la base de données :" +#: src/Process/Backend/Home.php:450 +msgid "This category will be created when you will save your post." +msgstr "Cette catégorie sera créée lorsque vous enregistrerez votre billet." -msgid "Database Name:" -msgstr "Nom de la base de données :" +#: src/Process/Backend/Home.php:457 +msgid "Save and publish" +msgstr "Enregister et publier" -msgid "Database User Name:" -msgstr "Nom d'utilisateur de la base de données :" +#: src/Process/Backend/Langs.php:80 +msgid "Invalid language zip file." +msgstr "Fichier zip de langue invalide." -msgid "Database Password:" -msgstr "Mot de passe de la base de données :" +#: src/Process/Backend/Langs.php:84 +msgid "The zip file does not appear to be a valid Dotclear language pack." +msgstr "Le fichier zip ne semble pas être un fichier de langue Dotclear valide." -msgid "Database Tables Prefix:" -msgstr "Préfixe des tables de la base de données :" +#: src/Process/Backend/Langs.php:93 +msgid "An error occurred during language upgrade." +msgstr "Une erreur est survenue durant la mise à jour de la langue." +#: src/Process/Backend/Langs.php:108 msgid "No such installed language" msgstr "Cette langue n'est pas installée" +#: src/Process/Backend/Langs.php:112 msgid "You can't remove English language." msgstr "Vous ne pouvez pas supprimer la langue anglaise." +#: src/Process/Backend/Langs.php:116 msgid "Permissions to delete language denied." msgstr "Permission de supprimer la langue refusée." +#: src/Process/Backend/Langs.php:119 src/Process/Backend/Langs.php:217 +msgid "Language has been successfully deleted." +msgstr "La langue a été supprimée." + +#: src/Process/Backend/Langs.php:136 msgid "Invalid language file URL." msgstr "URL de fichier de langue invalide." -msgid "Languages management" -msgstr "Gestion des langues" - -msgid "Language has been successfully deleted." -msgstr "La langue a été supprimée avec succès." +#: src/Process/Backend/Langs.php:157 src/Process/Backend/Langs.php:190 +#: src/Process/Backend/Langs.php:221 +msgid "Language has been successfully upgraded" +msgstr "La langue a été mise à jour." +#: src/Process/Backend/Langs.php:159 src/Process/Backend/Langs.php:192 +#: src/Process/Backend/Langs.php:221 msgid "Language has been successfully installed." -msgstr "La langue a été installée avec succès." +msgstr "La langue a été installée." -msgid "Language has been successfully upgraded" -msgstr "La langue a été mise à jour avec succès." +#: src/Process/Backend/Langs.php:206 src/Process/Backend/Langs.php:211 +msgid "Languages management" +msgstr "Gestion des langues" +#: src/Process/Backend/Langs.php:225 msgid "Here you can install, upgrade or remove languages for your Dotclear installation." msgstr "Sur cette page, vous pouvez installer, mettre à jour ou supprimer des langues de votre installation de Dotclear." +#: src/Process/Backend/Langs.php:227 #, php-format msgid "You can change your user language in your preferences or change your blog's main language in your blog settings." -msgstr "Vous pouvez changer votre langue d'utilisateur dans vos préférences ou changer la langue principale de votre blog dans vos paramètres de blog." +msgstr "Vous pouvez changer votre langue d'utilisateur·rice dans vos préférences ou changer la langue principale de votre blog dans vos Paramètres du blog." +#: src/Process/Backend/Langs.php:233 msgid "Installed languages" msgstr "Langues installées" +#: src/Process/Backend/Langs.php:247 msgid "No additional language is installed." msgstr "Aucune langue supplémentaire n'est installée." +#: src/Process/Backend/Langs.php:252 msgid "Language" msgstr "Langue" -msgid "Action" -msgstr "Action" - -msgid "Delete" -msgstr "Supprimer" - +#: src/Process/Backend/Langs.php:283 msgid "Install or upgrade languages" msgstr "Installer ou mettre à jour une langue" +#: src/Process/Backend/Langs.php:286 #, php-format msgid "You can install or remove a language by adding or removing the relevant directory in your %s folder." msgstr "Vous pouvez installer ou supprimer une langue en ajoutant ou supprimant le répertoire correspondant dans votre répertoire %s." +#: src/Process/Backend/Langs.php:300 msgid "Available languages" msgstr "Langues disponibles" +#: src/Process/Backend/Langs.php:301 #, php-format msgid "You can download and install a additional language directly from Dotclear.net. Proposed languages are based on your version: %s." msgstr "Vous pouvez télécharger et installer une langue supplémentaire directement depuis Dotclear.net. Les langues proposées sont basées sur votre version : %s." +#: src/Process/Backend/Langs.php:303 src/Process/Backend/User.php:378 msgid "Language:" msgstr "Langue :" +#: src/Process/Backend/Langs.php:314 msgid "Install language" msgstr "Installer la langue" +#: src/Process/Backend/Langs.php:325 msgid "You can install languages by uploading zip files." msgstr "Vous pouvez installer des langues en déposant des fichiers zip." +#: src/Process/Backend/Langs.php:326 msgid "Language zip file:" msgstr "Fichier zip de la langue :" +#: src/Process/Backend/Langs.php:337 msgid "Upload language" msgstr "Déposer la langue" -msgid "Invalid language zip file." -msgstr "Fichier zip de langue invalide." +#: src/Process/Backend/LinkPopup.php:53 src/Process/Backend/LinkPopup.php:55 +msgid "Add a link" +msgstr "Ajouter un lien" -msgid "The zip file does not appear to be a valid Dotclear language pack." -msgstr "Le fichier zip ne semble pas être un fichier valide de langue Dotclear." +#: src/Process/Backend/LinkPopup.php:59 +msgid "Link URL:" +msgstr "URL du lien :" -msgid "An error occurred during language upgrade." -msgstr "Une erreur est survenue durant la mise à jour de la langue." +#: src/Process/Backend/LinkPopup.php:65 +msgid "Link title:" +msgstr "Titre du lien :" -msgid "Error:" -msgstr "Erreur :" +#: src/Process/Backend/LinkPopup.php:67 +msgid "Link language:" +msgstr "Langue du lien :" + +#: src/Process/Backend/LinkPopup.php:74 src/Process/Backend/MediaItem.php:730 +msgid "Insert" +msgstr "Insérer" + +#: src/Process/Backend/Media.php:67 +msgid "Not a valid directory" +msgstr "Répertoire invalide" -msgid "By names, ascendant" -msgstr "Par noms, croissants" +#: src/Process/Backend/Media.php:88 +#, php-format +msgid "Directory or file \"%s\" already exists." +msgstr "Le répertoire ou le fichier \"%s\" existe déjà ." + +#: src/Process/Backend/Media.php:95 +#, php-format +msgid "Directory \"%s\" has been successfully created." +msgstr "Le répertoire \"%s\" a été créé." -msgid "By names, descendant" -msgstr "Par noms, décroissants" +#: src/Process/Backend/Media.php:149 +msgid "Files have been successfully uploaded." +msgstr "Le fichier a été chargé." -msgid "By dates, ascendant" -msgstr "Par dates, croissantes" +#: src/Process/Backend/Media.php:165 +#, php-format +msgid "Successfully delete one media." +msgid_plural "Successfully delete %d medias." +msgstr[0] "Suppression d'un média effectuée." +msgstr[1] "Suppression de %d médias effectuée." -msgid "By dates, descendant" -msgstr "Par dates, décroissantes" +#: src/Process/Backend/Media.php:185 +msgid "Directory has been successfully removed." +msgstr "Le répertoire a été supprimé." -msgid "Media manager" -msgstr "Gestionnaire de médias" +#: src/Process/Backend/Media.php:189 +msgid "File has been successfully removed." +msgstr "Le fichier a été supprimé." +#: src/Process/Backend/Media.php:210 +#, php-format +msgid "Directory \"%s\" has been successfully completed." +msgstr "Les miniatures manquantes du répertoire \"%s\" ont été construites." + +#: src/Process/Backend/Media.php:222 src/Process/Backend/PostMedia.php:99 msgid "confirm removal" msgstr "Confirmer la suppression" +#: src/Process/Backend/Media.php:227 #, php-format msgid "Are you sure you want to remove %s?" -msgstr "Ãtes-vous certain de vouloir supprimer %s ?" - -msgid "cancel" -msgstr "annuler" +msgstr "Ãtes-vous certain·e de vouloir supprimer %s ?" -msgid "yes" +#: src/Process/Backend/Media.php:231 src/Process/Backend/PostMedia.php:114 +msgid "Yes" msgstr "oui" -msgid "Directory has been successfully created." -msgstr "Répertoire créé avec succès." +#: src/Process/Backend/Media.php:269 +msgid "Remove this folder from your favorites" +msgstr "Retirer ce dossier de vos favoris" -msgid "Files have been successfully uploaded." -msgstr "Fichier chargé avec succès." +#: src/Process/Backend/Media.php:292 +msgid "Add this folder to your favorites" +msgstr "Ajouter ce dossier à vos favoris" -msgid "File has been successfully removed." -msgstr "Fichier supprimé avec succès." +#: src/Process/Backend/Media.php:298 +msgid "Goto recent folder:" +msgstr "Aller au dossier récent :" -msgid "Directory has been successfully removed." -msgstr "Répertoire supprimé avec succès." +#: src/Process/Backend/Media.php:328 +msgid "You do not have sufficient permissions to write to this folder." +msgstr "Vous n'avez pas les droits suffisants pour écrire dans ce répertoire." -msgid "Directory has been successfully rebuilt." -msgstr "Répertoire reconstruit avec succès." +#: src/Process/Backend/Media.php:342 +#, php-format +msgid "Select a file by clicking on %s" +msgstr "Choisissez un fichier en cliquant sur %s" -msgid "Zip file has been successfully extracted." -msgstr "Le fichier zip a été extrait avec succès." +#: src/Process/Backend/Media.php:345 src/Process/Backend/Media.php:411 +msgid "Choose selected medias" +msgstr "Choisir les médias sélectionnés" +#: src/Process/Backend/Media.php:345 #, php-format -msgid "Choose a file to attach to entry %s by clicking on %s." -msgstr "Choisissez un fichier à attacher au billet %s en cliquant sur %s." +msgid "Select files and click on %s button" +msgstr "Selectionnez les fichiers et cliquez sur le bouton %s" -msgid "Attach this file to entry" -msgstr "Attacher ce fichier au billet" +#: src/Process/Backend/Media.php:349 src/Process/Backend/Media.php:362 +#: src/Process/Backend/Media.php:375 src/Process/Backend/MediaItem.php:746 +msgid "or" +msgstr "ou" +#: src/Process/Backend/Media.php:349 src/Process/Backend/Media.php:362 +#: src/Process/Backend/Media.php:375 +msgid "upload a new file" +msgstr "envoyez un nouveau fichier" + +#: src/Process/Backend/Media.php:356 #, php-format -msgid "Choose a file to insert into entry by clicking on %s." -msgstr "Choisissez un fichier à insérer dans le billet en cliquant sur %s." +msgid "Choose a file to attach to entry %s by clicking on %s" +msgstr "Choisissez un fichier à attacher au billet %s en cliquant sur %s" -msgid "No file." -msgstr "Aucun fichier." +#: src/Process/Backend/Media.php:370 +#, php-format +msgid "Choose a file to insert into entry by clicking on %s" +msgstr "Choisissez un fichier à insérer dans le billet en cliquant sur %s" -msgid "Sort files:" -msgstr "Trier les fichiers :" +#: src/Process/Backend/Media.php:388 src/Process/Backend/Media.php:389 +msgid "Grid display mode" +msgstr "Afficher sous forme de grille" -msgid "Add files" -msgstr "Ajouter des fichiers" +#: src/Process/Backend/Media.php:391 src/Process/Backend/Media.php:392 +msgid "List display mode" +msgstr "Afficher sous forme de liste" -msgid "Choose a file:" -msgstr "Choisissez un fichier :" +#: src/Process/Backend/Media.php:414 +msgid "Remove selected medias" +msgstr "Supprimer les médias sélectionnés" +#: src/Process/Backend/Media.php:441 #, php-format -msgid "Maximum size %s" -msgstr "Taille maximale %s" +msgid "In %s:" +msgstr "Dans %s :" -msgid "Private" -msgstr "Privé" +#: src/Process/Backend/Media.php:453 +msgid "Create new directory" +msgstr "Créer un répertoire" + +#: src/Process/Backend/Media.php:455 +msgid "Directory Name:" +msgstr "Nom du répertoire :" + +#: src/Process/Backend/Media.php:468 +msgid "Build missing thumbnails in directory" +msgstr "Construire les miniatures manquantes des images du répertoire" + +#: src/Process/Backend/Media.php:470 +msgid "Build" +msgstr "Construire" + +#: src/Process/Backend/Media.php:480 +#, php-format +msgid "Backup content of %s" +msgstr "Sauvegarder le contenu de %s" + +#: src/Process/Backend/Media.php:484 +msgid "Download zip file" +msgstr "Télécharger un fichier zip" -msgid "send" -msgstr "envoyer" +#: src/Process/Backend/Media.php:504 +msgid "Add files" +msgstr "Ajouter des fichiers" +#: src/Process/Backend/Media.php:505 msgid "Please take care to publish media that you own and that are not protected by copyright." -msgstr "Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés contre la copie." +msgstr "Veuillez prendre garde à ne publier que des médias que vous possédez ou qui ne sont pas protégés par le droit d'auteur." -msgid "New directory" -msgstr "Nouveau répertoire" +#: src/Process/Backend/Media.php:517 +msgid "Maximum file size allowed:" +msgstr "Taille maximale de fichier autorisée :" -msgid "Directory Name:" -msgstr "Nom du répertoire :" +#: src/Process/Backend/Media.php:520 src/Process/Backend/MediaItem.php:1049 +msgid "Private" +msgstr "Privé" -msgid "Download this directory as a zip file" -msgstr "Télécharger ce répertoire dans un fichier zip" +#: src/Process/Backend/Media.php:525 +msgid "To send several files at the same time, you can activate the enhanced uploader in" +msgstr "Pour envoyer plusieurs fichiers à la fois, vous pouvez activer l'interface avancée dans" -msgid "open" -msgstr "ouvrir" +#: src/Process/Backend/Media.php:530 +msgid "Refresh" +msgstr "Actualiser" -msgid "Insert this file into entry" -msgstr "Insérer ce fichier dans le billet" +#: src/Process/Backend/Media.php:531 +msgid "Clear all" +msgstr "Tout annuler" +#: src/Process/Backend/Media.php:563 +#, php-format +msgid "Current settings for medias and images are defined in %s" +msgstr "Les réglages actuels pour les médias et les images sont définis dans les %s" + +#: src/Process/Backend/MediaItem.php:117 msgid "Not a valid file" msgstr "Fichier invalide" +#: src/Process/Backend/MediaItem.php:156 src/Process/Backend/MediaItem.php:211 +#: src/Process/Backend/MediaItem.php:461 msgid "File has been successfully updated." -msgstr "Fichier mis à jour avec succès." +msgstr "Le fichier a été mis à jour." +#: src/Process/Backend/MediaItem.php:228 src/Process/Backend/MediaItem.php:464 msgid "Thumbnails have been successfully updated." -msgstr "Les miniatures ont été mises à jour avec succès." +msgstr "Les miniatures ont été mises à jour." -msgid "Insert media item" +#: src/Process/Backend/MediaItem.php:245 +msgid "Zip file has been successfully extracted." +msgstr "Le fichier zip a été extrait." + +#: src/Process/Backend/MediaItem.php:275 src/Process/Backend/MediaItem.php:467 +msgid "Default media insertion settings have been successfully updated." +msgstr "Les paramètres par défaut d'insertion des médias ont été mis à jour." + +#: src/Process/Backend/MediaItem.php:301 +msgid "Media insertion settings have been successfully registered for this folder." +msgstr "Les réglages d'insertion ont été enregistrés pour ce dossier." + +#: src/Process/Backend/MediaItem.php:312 +msgid "Media insertion settings have been successfully removed for this folder." +msgstr "Les réglages d'insertion ont été supprimés pour ce dossier." + +#: src/Process/Backend/MediaItem.php:486 src/Process/Backend/MediaItem.php:487 +msgid "Select media item" msgstr "Insérer un média" +#: src/Process/Backend/MediaItem.php:503 src/Process/Backend/MediaItem.php:572 msgid "Image size:" msgstr "Taille de l'image :" -msgid "original" -msgstr "originale" - -msgid "Image alignment" -msgstr "Alignement de l'image" +#: src/Process/Backend/MediaItem.php:530 +msgid "Select" +msgstr "Sélectionner" -msgid "None" -msgstr "Aucun" +#: src/Process/Backend/MediaItem.php:554 src/Process/Backend/MediaItem.php:555 +msgid "Insert media item" +msgstr "Insérer un média" -msgid "Left" -msgstr "Gauche" +#: src/Process/Backend/MediaItem.php:591 +msgid "Image legend and title" +msgstr "Légende et titre de l'image" -msgid "Right" -msgstr "Droite" +#: src/Process/Backend/MediaItem.php:613 +msgid "Title: " +msgstr "Titre : " -msgid "Center" -msgstr "Centre" +#: src/Process/Backend/MediaItem.php:620 +msgid "Image alignment" +msgstr "Alignement de l'image" +#: src/Process/Backend/MediaItem.php:640 msgid "Image insertion" msgstr "Insertion de l'image" +#: src/Process/Backend/MediaItem.php:643 msgid "As a single image" msgstr "En tant qu'image uniquement" -msgid "As a link to original image" +#: src/Process/Backend/MediaItem.php:645 +msgid "As a link to the original image" msgstr "En tant que lien vers l'image originale" +#: src/Process/Backend/MediaItem.php:653 msgid "MP3 disposition" msgstr "Disposition du MP3" +#: src/Process/Backend/MediaItem.php:654 msgid "Please note that you cannot insert mp3 files with visual editor." msgstr "Merci de noter que vous ne pouvez pas insérer de fichier mp3 avec l'éditeur visuel." +#: src/Process/Backend/MediaItem.php:682 msgid "Please note that you cannot insert video files with visual editor." msgstr "Merci de noter que vous ne pouvez pas insérer de fichier vidéo avec l'éditeur visuel." +#: src/Process/Backend/MediaItem.php:686 msgid "Video size" msgstr "Taille de la vidéo" +#: src/Process/Backend/MediaItem.php:687 msgid "Width:" msgstr "Largeur :" +#: src/Process/Backend/MediaItem.php:689 msgid "Height:" msgstr "Hauteur :" +#: src/Process/Backend/MediaItem.php:696 msgid "Video disposition" msgstr "Disposition de la vidéo" +#: src/Process/Backend/MediaItem.php:725 msgid "Media item will be inserted as a link." msgstr "Le média sera inséré en tant que lien." -msgid "Cancel" -msgstr "Annuler" +#: src/Process/Backend/MediaItem.php:745 +msgid "Make current settings as default" +msgstr "Mémoriser ces réglages d'insertion" -msgid "Insert" -msgstr "Insérer" +#: src/Process/Backend/MediaItem.php:746 +msgid "For the blog" +msgstr "Pour le blog" + +#: src/Process/Backend/MediaItem.php:747 +msgid "For this folder only" +msgstr "Pour ce dossier seulement" + +#: src/Process/Backend/MediaItem.php:756 +msgid "Settings exist for this folder:" +msgstr "Des réglages d'insertion existent pour ce dossier :" + +#: src/Process/Backend/MediaItem.php:757 +msgid "Remove them" +msgstr "Les supprimer" +#: src/Process/Backend/MediaItem.php:776 src/Process/Backend/MediaItem.php:779 +#: src/Process/Backend/MediaItem.php:864 msgid "Media details" msgstr "Détails du média" +#: src/Process/Backend/MediaItem.php:811 msgid "Available sizes:" msgstr "Tailles disponibles :" -msgid "File owner:" -msgstr "Propriétaire du fichier :" +#: src/Process/Backend/MediaItem.php:840 +msgid "Thumbnail details" +msgstr "Détails de la miniature" -msgid "File type:" -msgstr "Type de fichier :" +#: src/Process/Backend/MediaItem.php:844 src/Process/Backend/MediaItem.php:872 +msgid "Image width:" +msgstr "Largeur de l'image :" +#: src/Process/Backend/MediaItem.php:845 src/Process/Backend/MediaItem.php:873 +msgid "Image height:" +msgstr "Hauteur de l'image :" + +#: src/Process/Backend/MediaItem.php:848 src/Process/Backend/MediaItem.php:877 msgid "File size:" msgstr "Taille du fichier :" +#: src/Process/Backend/MediaItem.php:849 src/Process/Backend/MediaItem.php:878 msgid "File URL:" msgstr "URL du fichier :" +#: src/Process/Backend/MediaItem.php:866 +msgid "File owner:" +msgstr "Propriétaire du fichier :" + +#: src/Process/Backend/MediaItem.php:867 +msgid "File type:" +msgstr "Type de fichier :" + +#: src/Process/Backend/MediaItem.php:884 msgid "Show entries containing this media" -msgstr "Afficher les billets contenant ce média" +msgstr "Afficher les publications contenant ce média" +#: src/Process/Backend/MediaItem.php:887 msgid "Entries containing this media" -msgstr "Billets contenant ce média" +msgstr "publications contenant ce média" +#: src/Process/Backend/MediaItem.php:917 msgid "No entry seems contain this media." -msgstr "Aucun billet ne semble contenir ce média." +msgstr "Aucune publication ne semble contenir ce média." + +#: src/Process/Backend/MediaItem.php:926 +msgid "published" +msgstr "publié" + +#: src/Process/Backend/MediaItem.php:930 +msgid "unpublished" +msgstr "non publié" + +#: src/Process/Backend/MediaItem.php:934 +msgid "scheduled" +msgstr "programmé" +#: src/Process/Backend/MediaItem.php:938 +msgid "pending" +msgstr "en attente" + +#: src/Process/Backend/MediaItem.php:955 msgid "Image details" msgstr "Détails de l'image" +#: src/Process/Backend/MediaItem.php:970 msgid "No detail" msgstr "Aucun détail" +#: src/Process/Backend/MediaItem.php:977 +msgid "Updates and modifications" +msgstr "Mises à jour et modifications" + +#: src/Process/Backend/MediaItem.php:983 src/Process/Backend/MediaItem.php:985 msgid "Update thumbnails" msgstr "Mettre à jour les miniatures" +#: src/Process/Backend/MediaItem.php:984 msgid "This will create or update thumbnails for this image." msgstr "Ceci va créer ou mettre à jour les miniatures pour cette image." -msgid "update thumbnails" -msgstr "mettre à jour les miniatures" - +#: src/Process/Backend/MediaItem.php:993 src/Process/Backend/MediaItem.php:1001 msgid "Extract in a new directory" msgstr "Extraire dans un nouveau répertoire" +#: src/Process/Backend/MediaItem.php:994 src/Process/Backend/MediaItem.php:1003 msgid "Extract in current directory" msgstr "Extraire dans le répertoire actuel" +#: src/Process/Backend/MediaItem.php:999 msgid "Extract archive" msgstr "Extraire l'archive" -msgid "This will extract archive in a new directory that should not exists yet." +#: src/Process/Backend/MediaItem.php:1002 +msgid "This will extract archive in a new directory that should not exist yet." msgstr "Ceci va extraire l'archive dans un nouveau répertoire qui ne doit pas encore exister." +#: src/Process/Backend/MediaItem.php:1004 msgid "This will extract archive in current directory and will overwrite existing files or directory." -msgstr "Ceci va extraire l'archive dans le répertoire actuel et va écraser les fichiers ou répertoires existants." +msgstr "Ceci va extraire l'archive dans le répertoire actuel et écrasera les fichiers ou répertoires existants." +#: src/Process/Backend/MediaItem.php:1006 msgid "Extract mode:" msgstr "Mode d'extraction :" -msgid "extract" -msgstr "extraire" +#: src/Process/Backend/MediaItem.php:1008 +msgid "Extract" +msgstr "Extraire" +#: src/Process/Backend/MediaItem.php:1016 msgid "Change media properties" msgstr "Changer les propriétés du média" +#: src/Process/Backend/MediaItem.php:1017 msgid "File name:" msgstr "Nom du fichier :" +#: src/Process/Backend/MediaItem.php:1019 msgid "File title:" msgstr "Titre du fichier :" +#: src/Process/Backend/MediaItem.php:1032 +msgid "File description:" +msgstr "Description du fichier :" + +#: src/Process/Backend/MediaItem.php:1042 msgid "File date:" msgstr "Date du fichier :" +#: src/Process/Backend/MediaItem.php:1050 msgid "New directory:" msgstr "Nouveau répertoire :" +#: src/Process/Backend/MediaItem.php:1058 msgid "Change file" msgstr "Changer le fichier" -msgid "No blog or user given." -msgstr "Vous n'avez pas indiqué de blog ou d'utilisateur" - -msgid "permissions" -msgstr "permissions" - -msgid "Permissions" -msgstr "Permissions" - -msgid "The permissions have been successfully updated." -msgstr "Permissions mises à jour avec succès." - -#, php-format -msgid "You are about to change permissions on the following blogs for users %s." -msgstr "Vous allez changer les permissions des utilisateurs %s pour ces blogs." - -msgid "choose a blog" -msgstr "choisissez un blog" - -msgid "Choose a blog" -msgstr "Choisissez un blog" - -msgid "Entries per page" -msgstr "Billets par page" +#: src/Process/Backend/MediaItem.php:1060 +msgid "Choose a file:" +msgstr "Choisir un fichier :" +#: src/Process/Backend/MediaItem.php:1061 #, php-format -msgid "Choose one or more blogs to which you want to give permissions to users %s." -msgstr "Choisissez un ou plusieurs blogs pour lesquels les utilisateurs suivants auront des permissions : %s." +msgid "Maximum size %s" +msgstr "Taille maximale %s" -msgid "set permissions" -msgstr "définir les permissions" +#: src/Process/Backend/MediaItem.php:1072 +msgid "Delete this media" +msgstr "Supprimer ce média" +#: src/Process/Backend/Plugin.php:80 msgid "No content found on this plugin." -msgstr "Aucun contenu pour cette extension." +msgstr "Aucun contenu pour ce plugin." +#: src/Process/Backend/Plugin.php:130 src/Process/Backend/Plugin.php:135 msgid "Plugin not found" -msgstr "Extension introuvable" +msgstr "Plugin introuvable" +#: src/Process/Backend/Plugin.php:139 msgid "The plugin you reached does not exist or does not have an admin page." -msgstr "L'extension que vous essayez d'atteindre n'existe pas ou n'a pas de page d'administration." - -msgid "No such plugin." -msgstr "Extension inexistante." - -msgid "You don't have permissions to delete this plugin." -msgstr "Vous n'avez pas les permissions pour effacer cette extension" - -msgid "You don't have permissions to deactivate this plugin." -msgstr "Vous n'avez pas les permissions pour désactiver cette extension." - -msgid "Plugins management" -msgstr "Gestion des extensions" - -msgid "Plugin has been successfully deleted." -msgstr "L'extension a été supprimée avec succès." +msgstr "Le plugin que vous essayez d'atteindre n'existe pas ou n'a pas de page d'administration." -msgid "Plugin has been successfully installed." -msgstr "L'extension a été installée avec succès." +#: src/Process/Backend/Plugins.php:145 +msgid "Manual checking of plugins update done successfully." +msgstr "La vérification manuelle de mise à jour des plugins a été effectuée." -msgid "Plugin has been successfully upgraded" -msgstr "L'extension a été mise à jour avec succès." +#: src/Process/Backend/Plugins.php:157 +msgid "Force checking update of plugins" +msgstr "Forcer la vérification de mise à jour des plugins" -msgid "Plugins add new functionalities to Dotclear. Here you can activate or deactivate installed plugins." -msgstr "Les extensions ajoutent de nouvelles fonctionnalités à Dotclear. Ici, vous pouvez activer ou désactiver les extensions installées." +#: src/Process/Backend/Plugins.php:166 src/Process/Backend/Plugins.php:167 +msgid "Update plugins" +msgstr "Mise à jour des plugins" +#: src/Process/Backend/Plugins.php:169 #, php-format -msgid "You can find additional plugins for your blog on %s." -msgstr "Vous pouvez trouver de nouvelles extensions pour votre blog sur %s." - -msgid "To install or upgrade a plugin you generally just need to upload it in \"Install or upgrade a plugin\" section." -msgstr "Tout ce que vous avez à faire pour installer ou mettre à jour une extension est généralement de la déposer dans la section \"Installer ou mettre à jour une extension\"." - -msgid "To install or upgrade a plugin you just need to extract it in your plugins directory." -msgstr "Tout ce que vous avez à faire pour installer une extension est de l'extraire dans votre répertoire d'extensions." +msgid "There is one plugin to update available from repository." +msgid_plural "There are %s plugins to update available from repository." +msgstr[0] "Il y a un plugin à mettre à jour depuis le dépôt." +msgstr[1] "Il y a %s plugins à mettre à jour depuis le dépôt." -msgid "Plugins" -msgstr "Extensions" +#: src/Process/Backend/Plugins.php:196 src/Process/Backend/Plugins.php:205 +msgid "Installed plugins" +msgstr "Plugins installés" +#: src/Process/Backend/Plugins.php:205 msgid "Activated plugins" -msgstr "Extensions activées" - -msgid "Plugin" -msgstr "Extension" - -msgid "Version" -msgstr "Version" - -msgid "Details" -msgstr "Détails" +msgstr "Plugins activés" -msgid "Deactivate" -msgstr "Désactiver" +#: src/Process/Backend/Plugins.php:208 +msgid "You can configure and manage installed plugins from this list." +msgstr "Vous pouvez configurer et gérer les plugins installés depuis cette liste." +#: src/Process/Backend/Plugins.php:227 msgid "Deactivated plugins" -msgstr "Extensions désactivées" - -msgid "Activate" -msgstr "Activer" - -msgid "Install or upgrade a plugin" -msgstr "Installer ou mettre à jour une extension" - -msgid "You can install plugins by uploading or downloading zip files." -msgstr "Vous pouvez installer des extensions en déposant ou téléchargeant des fichiers zip." +msgstr "Plugins désactivés" -msgid "Plugin zip file:" -msgstr "Fichier zip de l'extension :" +#: src/Process/Backend/Plugins.php:228 +msgid "Deactivated plugins are installed but not usable. You can activate them from here." +msgstr "Les plugins désactivés sont installés mais non utilisables. Vous pouvez les activer depuis cette page." -msgid "Upload plugin" -msgstr "Déposer l'extension" +#: src/Process/Backend/Plugins.php:253 +msgid "Add plugins" +msgstr "Ajouter des plugins" -msgid "Plugin zip file URL:" -msgstr "URL du fichier zip de l'extension :" +#: src/Process/Backend/Plugins.php:254 +msgid "Add plugins from repository" +msgstr "Ajouter des plugins depuis le dépôt" -msgid "Download plugin" -msgstr "Télécharger l'extension" - -msgid "To enable this function, please give write access to your plugins directory." -msgstr "Pour activer cette fonction, donnez un accès en écriture à votre répertoire d'extensions." - -msgid "Add a link" -msgstr "Ajouter un lien" +#: src/Process/Backend/Plugins.php:284 +msgid "Add plugins from a package" +msgstr "Ajouter des plugins depuis un package" -msgid "Available" -msgstr "Disponible" +#: src/Process/Backend/Plugins.php:285 +msgid "You can install plugins by uploading or downloading zip files." +msgstr "Vous pouvez installer des plugins en déposant ou téléchargeant des fichiers zip." -msgid "Most used" -msgstr "Plus utilisées" +#: src/Process/Backend/Plugins.php:299 +msgid "Some functions are disabled, please give write access to your plugins directory to enable them." +msgstr "Certaines fonctions sont désactivées, donnez un accès en écriture à votre répertoire de plugins pour les activer." -msgid "Link URL:" -msgstr "URL du lien :" +#: src/Process/Backend/Plugins.php:330 +msgid "Plugin configuration" +msgstr "Configuration du plugin" -msgid "Link language:" -msgstr "Langue du lien :" +#: src/Process/Backend/Post.php:135 src/Process/Backend/Post.php:784 +#: src/Process/Backend/Post.php:789 +msgid "Edit post" +msgstr "Modifier le billet" -msgid "insert" -msgstr "insérer" +#: src/Process/Backend/Post.php:142 +msgid "This entry does not exist." +msgstr "Ce billet n'existe pas." -msgid "Add a link to an entry" -msgstr "Ajouter un lien vers un billet" +#: src/Process/Backend/Post.php:174 +msgid "Next entry" +msgstr "Billet suivant" -msgid "Search entry:" -msgstr "Rechercher un billet :" +#: src/Process/Backend/Post.php:189 +msgid "Previous entry" +msgstr "Billet précédent" -msgid "This entry does not exist." -msgstr "Ce billet n'existe pas." +#: src/Process/Backend/Post.php:276 src/Process/Backend/Post.php:588 +msgid "All pings sent." +msgstr "Tous les rétroliens ont été envoyés." -msgid "Edit entry" -msgstr "Modifier le billet" +#: src/Process/Backend/Post.php:306 +msgid "Invalid publication date" +msgstr "Date de publication invalide" -msgid "next entry" -msgstr "billet suivant" +#: src/Process/Backend/Post.php:430 +#, php-format +msgid "The post \"%s\" has been successfully updated" +msgstr "Le billet \"%s\" a été mis à jour." -msgid "previous entry" -msgstr "billet précédent" +#: src/Process/Backend/Post.php:504 +#, php-format +msgid "“%s”" +msgstr "“%s”" +#: src/Process/Backend/Post.php:575 msgid "Entry has been successfully updated." -msgstr "Billet mis à jour avec succès." - -msgid "Entry has been successfully created." -msgstr "Billet créé avec succès." +msgstr "Le billet a été mis à jour." +#: src/Process/Backend/Post.php:579 msgid "File has been successfully attached." -msgstr "Fichier attaché avec succès." +msgstr "Le fichier a été attaché." +#: src/Process/Backend/Post.php:581 src/Process/Backend/PostMedia.php:90 msgid "Attachment has been successfully removed." -msgstr "Pièce jointe retirée avec succès." - -msgid "Comment has been successfully created." -msgstr "Commentaire créé avec succès." +msgstr "L'annexe a été retirée." +#: src/Process/Backend/Post.php:597 msgid "Don't forget to validate your XHTML conversion by saving your post." -msgstr "Enregistrez votre billet pour valider la transformation en XHTML." +msgstr "Enregistrez votre billet pour valider la transformation en HTML." -msgid "View entry" -msgstr "Voir le billet" +#: src/Process/Backend/Post.php:602 +msgid "Go to this entry on the site" +msgstr "Voir ce billet sur le site" -msgid "Preview entry" -msgstr "Prévisualiser le billet" +#: src/Process/Backend/Post.php:641 +msgid "Entry status" +msgstr "Ãtat du billet" -msgid "Entry status:" -msgstr "Ãtat du billet :" +#: src/Process/Backend/Post.php:648 +msgid "Publication date and hour" +msgstr "Date et heure de publication" -msgid "Published on:" -msgstr "Publié le :" +#: src/Process/Backend/Post.php:654 +msgid "Entry language" +msgstr "Langue du billet" -msgid "Text formating:" -msgstr "Format du texte :" +#: src/Process/Backend/Post.php:658 +msgid "Text formatting" +msgstr "Formatage du texte" -msgid "Convert to XHTML" -msgstr "Convertir en XHTML" +#: src/Process/Backend/Post.php:664 +msgid "Convert to HTML" +msgstr "Convertir en HTML" +#: src/Process/Backend/Post.php:668 +msgid "Filing" +msgstr "Classement" + +#: src/Process/Backend/Post.php:672 msgid "Selected entry" msgstr "Billet sélectionné" -msgid "Entry lang:" -msgstr "Langue du billet :" +#: src/Process/Backend/Post.php:694 src/Process/Backend/User.php:376 +msgid "Options" +msgstr "Options" -msgid "Entry password:" -msgstr "Mot de passe du billet :" +#: src/Process/Backend/Post.php:697 +msgid "Comments and trackbacks list" +msgstr "Liste des commentaires et des rétroliens" -msgid "Basename:" -msgstr "URL spécifique :" +#: src/Process/Backend/Post.php:703 +msgid "Warning: Comments are not more accepted for this entry." +msgstr "Attention : les commentaires ne sont plus acceptés pour ce billet." -msgid "Warning: If you set the URL manually, it may conflict with another entry." -msgstr "Attention : si vous indiquez l'URL manuellement, celle-ci peut entrer en conflit avec un autre billet." +#: src/Process/Backend/Post.php:705 +msgid "Comments are not accepted on this blog so far." +msgstr "Les commentaires ne sont pas acceptés sur ce blog pour le moment." -msgid "Attachments" -msgstr "Pièces jointes" +#: src/Process/Backend/Post.php:711 +msgid "Warning: Trackbacks are not more accepted for this entry." +msgstr "Attention : les rétroliens ne sont plus acceptés pour ce billet." -msgid "remove" -msgstr "supprimer" +#: src/Process/Backend/Post.php:712 +msgid "Trackbacks are not accepted on this blog so far." +msgstr "Les rétroliens sont fermés sur ce blog pour le moment." -msgid "No attachment." -msgstr "Aucune pièce jointe" +#: src/Process/Backend/Post.php:718 +msgid "Edit basename" +msgstr "URL spécifique" -msgid "Add files to this entry" -msgstr "Ajouter un fichier au billet" +#: src/Process/Backend/Post.php:722 +msgid "Warning: If you set the URL manually, it may conflict with another entry." +msgstr "Attention : si vous indiquez l'URL manuellement, celle-ci peut entrer en conflit avec un autre billet." +#: src/Process/Backend/Post.php:739 msgid "Excerpt:" msgstr "Extrait :" -msgid "Notes:" -msgstr "Notes :" +#: src/Process/Backend/Post.php:740 +msgid "Introduction to the post." +msgstr "Introduction au billet." -msgid "Ping blogs" -msgstr "Faire des rétroliens" +#: src/Process/Backend/Post.php:765 +msgid "Personal notes:" +msgstr "Notes personnelles :" -msgid "Trackbacks" -msgstr "Rétroliens" +#: src/Process/Backend/Post.php:766 +msgid "Unpublished notes." +msgstr "Notes non publiées." + +#: src/Process/Backend/Post.php:870 src/Process/Backend/Post.php:905 +msgid "Add a comment" +msgstr "Ajouter un commentaire" +#: src/Process/Backend/Post.php:969 +msgid "Trackbacks received" +msgstr "Rétroliens reçus" + +#: src/Process/Backend/Post.php:975 msgid "No trackback" msgstr "Aucun rétrolien" -msgid "Add a comment" -msgstr "Ajouter un commentaire" +#: src/Process/Backend/Post.php:983 +msgid "Selected trackbacks action:" +msgstr "Action sur les rétroliens sélectionnés :" -msgid "Name:" -msgstr "Nom :" +#: src/Process/Backend/Post.php:1000 src/Process/Backend/Post.php:1011 +msgid "Ping blogs" +msgstr "Envoyer des rétroliens" -msgid "IP address" -msgstr "Adresse IP" +#: src/Process/Backend/Post.php:1002 +msgid "URLs to ping:" +msgstr "URLs à rétrolier :" -msgid "published" -msgstr "publié" +#: src/Process/Backend/Post.php:1006 +msgid "Excerpt to send:" +msgstr "Extrait à envoyer :" -msgid "unpublished" -msgstr "non publié" +#: src/Process/Backend/Post.php:1012 +msgid "Auto discover ping URLs" +msgstr "Découverte automatique des URL à rétrolier" -msgid "pending" -msgstr "en attente" +#: src/Process/Backend/Post.php:1020 +msgid "Previously sent pings" +msgstr "Rétroliens déjà envoyés" -msgid "junk" -msgstr "indésirable" +#: src/Process/Backend/Post.php:1137 +msgid "select this comment" +msgstr "Sélectionner ce commentaire" +#: src/Process/Backend/Post.php:1137 +msgid "select this trackback" +msgstr "Sélectionner ce rétrolien" + +#: src/Process/Backend/Post.php:1157 msgid "Edit this comment" msgstr "Modifier ce commentaire" +#: src/Process/Backend/PostMedia.php:76 msgid "This attachment does not exist" -msgstr "Cette pièce jointe n'existe pas" +msgstr "Cette annexe n'existe pas" +#: src/Process/Backend/PostMedia.php:97 msgid "Remove attachment" -msgstr "Supprimer la pièce jointe" +msgstr "Supprimer l'annexe" +#: src/Process/Backend/PostMedia.php:99 msgid "Attachment" -msgstr "Pièce jointe" +msgstr "Annexe" +#: src/Process/Backend/PostMedia.php:108 msgid "Are you sure you want to remove this attachment?" -msgstr "Ãtes-vous certain de vouloir supprimer cette pièce jointe ?" - -msgid "selected" -msgstr "sélectionné" - -msgid "not selected" -msgstr "non sélectionné" - -msgid "Category" -msgstr "Catégorie" - -msgid "Selected" -msgstr "Sélectionné" - -msgid "schedule" -msgstr "programmer" - -msgid "mark as selected" -msgstr "marquer sélectionné" - -msgid "mark as unselected" -msgstr "marquer non sélectionné" +msgstr "Ãtes-vous certain·e de vouloir supprimer cette annexe ?" -msgid "change category" -msgstr "changer la catégorie" +#: src/Process/Backend/Posts.php:93 +msgid "Selected entries have been successfully updated." +msgstr "Les publications sélectionnées ont été modifiées." -msgid "change author" -msgstr "changer l'auteur" +#: src/Process/Backend/Posts.php:95 +msgid "Selected entries have been successfully deleted." +msgstr "Les publications sélectionnées ont été supprimées." -msgid "Selected:" -msgstr "Sélectionné :" +#: src/Process/Backend/Posts.php:115 src/Process/Backend/Search.php:196 +msgid "Selected entries action:" +msgstr "Action sur les billets sélectionnés :" -msgid "Month:" -msgstr "Mois :" +#: src/Process/Backend/PostsPopup.php:79 src/Process/Backend/PostsPopup.php:86 +msgid "Add a link to an entry" +msgstr "Ajouter un lien vers une publication" -msgid "Lang:" -msgstr "Langue :" +#: src/Process/Backend/PostsPopup.php:90 +msgid "Entry type:" +msgstr "Type de publications :" -msgid "Selected entries action:" -msgstr "Action sur les billets sélectionnés :" +#: src/Process/Backend/PostsPopup.php:91 +msgid "Ok" +msgstr "Ok" -msgid "This user does not exist" -msgstr "Cet utilisateur n'existe pas" +#: src/Process/Backend/PostsPopup.php:100 +msgid "Search entry:" +msgstr "Rechercher une publication :" -msgid "Change category for entries" -msgstr "Changer de catégorie pour les billets" +#: src/Process/Backend/PostsPopup.php:124 +msgid "cancel" +msgstr "annuler" -msgid "Change author for entries" -msgstr "Changer l'auteur des billets" +#: src/Process/Backend/Rest.php:111 +msgid "Dotclear news not available" +msgstr "Nouvelles de Dotclear non disponibles" -msgid "Author ID:" -msgstr "Identifiant de l'utilisateur" +#: src/Process/Backend/Rest.php:125 +msgid "Dotclear news" +msgstr "Actualité de Dotclear" -msgid "If you want to change your email or password you must provide your current password." -msgstr "Si vous voulez changer votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe." +#: src/Process/Backend/Rest.php:133 +msgid "%d %B %Y:" +msgstr "%d %B %Y :" -msgid "Personal information has been successfully updated." -msgstr "Informations personnelles mises à jour avec succès." +#: src/Process/Backend/Rest.php:165 +msgid "Dotclear update not available" +msgstr "Mise à jour de Dotclear non disponible" -msgid "Display name:" -msgstr "Pseudonyme :" +#: src/Process/Backend/Rest.php:176 +#, php-format +msgid "Dotclear %s is available!" +msgstr "Dotclear %s est disponible !" -msgid "Preferred format:" -msgstr "Format d'édition préféré :" +#: src/Process/Backend/Rest.php:177 +msgid "Upgrade now" +msgstr "Mettre à jour maintenant" -msgid "Default entry status:" -msgstr "Ãtat des billets par défaut :" +#: src/Process/Backend/Rest.php:178 +msgid "Remind me later" +msgstr "Me le rappeler plus tard" -msgid "Entry edit field height:" -msgstr "Taille de la zone d'édition :" +#: src/Process/Backend/Rest.php:180 src/Process/Backend/Update.php:279 +#: src/Process/Backend/Update.php:280 +msgid "Information about this version" +msgstr "Informations sur cette version" -msgid "User language:" -msgstr "Langue de l'utilisateur :" +#: src/Process/Backend/Rest.php:181 src/Process/Backend/Update.php:288 +msgid "This update may potentially require some precautions, you should carefully read the information post associated with this release (see above)." +msgstr "Cette mise à jour peut potentiellement nécessiter des précautions, vous devriez lire attentivement le billet d'information associé à cette version (voir ci-dessus)." -msgid "User timezone:" -msgstr "Fuseau horaire de l'utilisateur :" +#: src/Process/Backend/Rest.php:186 +#, php-format +msgid "A new version of Dotclear is available but needs PHP version ⥠%s, your's is currently %s" +msgstr "Une nouvelle version de Dotclear est disponible mais nécessite une version de PHP ⥠%s, la votre est actuellement la %s" -msgid "Enable WYSIWYG mode" -msgstr "Activer l'éditeur visuel" +#: src/Process/Backend/Rest.php:201 src/Process/Backend/Update.php:262 +#, php-format +msgid "The next versions of Dotclear will not support PHP version < %s, your's is currently %s" +msgstr "Les prochaines versions de Dotclear ne supporteront pas les versions de PHP < %s, la votre est actuellement la %s" -msgid "Change your password" -msgstr "Changer votre mot de passe" +#: src/Process/Backend/Rest.php:233 +msgid "No updates are available" +msgstr "Aucune mise à jour n'est disponible" -msgid "New password:" -msgstr "Nouveau mot de passe :" +#: src/Process/Backend/Rest.php:271 +#, php-format +msgid "An update is available" +msgid_plural "%s updates are available." +msgstr[0] "Une mise à jour est disponible." +msgstr[1] "%s mises à jour sont disponibles." -msgid "Search" -msgstr "Rechercher" +#: src/Process/Backend/Rest.php:867 +msgid "List options saved" +msgstr "Options de liste sauvegardées" +#: src/Process/Backend/Search.php:106 msgid "Search options" msgstr "Options de recherche" +#: src/Process/Backend/Search.php:107 msgid "Query:" msgstr "Requête :" -msgid "search entries" -msgstr "rechercher des billets" +#: src/Process/Backend/Search.php:109 +msgid "In:" +msgstr "Où :" -msgid "search comments" -msgstr "recherche des commentaires" +#: src/Process/Backend/Search.php:126 +msgid "No results found" +msgstr "Pas de résultats" -#, php-format -msgid "%d entries found" -msgstr "%d billets trouvés" +#: src/Process/Backend/Search.php:138 +msgid "Search in entries" +msgstr "Rechercher dans les billets" -#, php-format -msgid "%d entry found" -msgstr "%d billet trouvé" +#: src/Process/Backend/Search.php:139 +msgid "Search in comments" +msgstr "Rechercher dans les commentaires" +#: src/Process/Backend/Search.php:183 #, php-format -msgid "%d comment found" -msgstr "%d commentaire trouvé" +msgid "one entry found" +msgid_plural "%d entries found" +msgstr[0] "un billet trouvé" +msgstr[1] "%d billets trouvés" +#: src/Process/Backend/Search.php:238 #, php-format -msgid "%d comments found" -msgstr "%d commentaires trouvés" - -msgid "This entry does not exist or is not published" -msgstr "Ce billet n'existe pas ou n'est pas publié" - -msgid "All pings sent." -msgstr "Tous les rétroliens ont été envoyés." - -msgid "Auto discover ping URLs" -msgstr "Découverte automatique des URL à rétrolier" - -msgid "URLs to ping:" -msgstr "URLs à rétrolier :" +msgid "one comment found" +msgid_plural "%d comments found" +msgstr[0] "un commentaire trouvé" +msgstr[1] "%d commentaires trouvés" + +#: src/Process/Backend/Update.php:39 src/Process/Backend/Update.php:44 +#: src/Process/Backend/Update.php:58 src/Process/Backend/Update.php:63 +#: src/Process/Backend/Update.php:236 src/Process/Backend/Update.php:244 +#: src/Process/Backend/Update.php:255 +msgid "Dotclear update" +msgstr "Mise à jour de Dotclear" -msgid "Send excerpt:" -msgstr "Envoyer l'extrait :" +#: src/Process/Backend/Update.php:49 src/Process/Backend/Update.php:68 +msgid "Precheck update error" +msgstr "Erreur avant mise à jour" -msgid "Previously sent pings" -msgstr "Rétroliens déjà envoyés" +#: src/Process/Backend/Update.php:50 +msgid "Backup directory does not exist" +msgstr "Le répertoire de sauvegarde est inexistant" -msgid "Dotclear update" -msgstr "Mise à jour de Dotclear" +#: src/Process/Backend/Update.php:69 +msgid "Access denied" +msgstr "L'accès est refusé" +#: src/Process/Backend/Update.php:126 #, php-format msgid "Unable to delete file %s" msgstr "Impossible de supprimer le fichier %s" +#: src/Process/Backend/Update.php:158 #, php-format msgid "Downloaded Dotclear archive seems to be corrupted. Try download it again." -msgstr "L'archive téléchargée de Dotclear semble être corrompue. Essayer de la télécharger à nouveau." +msgstr "L'archive de Dotclear téléchargée semble être corrompue. Essayer de la télécharger à nouveau." -msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to update manually." -msgstr "Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement." +#: src/Process/Backend/Update.php:162 +msgid "If this problem persists try to update manually." +msgstr "Si le problème persiste essayer de mettre à jour manuellement." +#: src/Process/Backend/Update.php:198 +msgid "The following files of your Dotclear installation have been modified so we won't try to update your installation. Please try to update manually." +msgstr "Comme les fichiers suivants de votre installation de Dotclear ont été modifiés, votre installation ne peut être mise à jour. Merci de mettre à jour manuellement." + +#: src/Process/Backend/Update.php:201 #, php-format msgid "The following files of your Dotclear installation are not readable. Please fix this or try to make a backup file named %s manually." msgstr "Les fichiers suivants de votre installation de Dotclear ne peuvent pas être lus. Veuillez corriger ceci ou créer un fichier de backup nommé %s manuellement." -msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to update manually." -msgstr "Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger ceci ou mettre à jour manuellement." +#: src/Process/Backend/Update.php:205 +msgid "The following files of your Dotclear installation cannot be written. Please fix this or try to update manually." +msgstr "Les fichiers suivants de votre installation de Dotclear ne peuvent pas être écrits. Veuillez corriger la situation ou mettre à jour manuellement." + +#: src/Process/Backend/Update.php:250 +msgid "Manual checking of update done successfully." +msgstr "La vérification manuelle de mise à jour a été effectuée." +#: src/Process/Backend/Update.php:270 msgid "No newer Dotclear version available." msgstr "Aucune nouvelle version de Dotclear n'est disponible." +#: src/Process/Backend/Update.php:274 +msgid "Force checking update Dotclear" +msgstr "Forcer la vérification de mise à jour de Dotclear" + +#: src/Process/Backend/Update.php:278 #, php-format msgid "Dotclear %s is available." msgstr "Dotclear %s est disponible." +#: src/Process/Backend/Update.php:291 msgid "To upgrade your Dotclear installation simply click on the following button. A backup file of your current installation will be created in your root directory." msgstr "Pour mettre à jour votre installation de Dotclear, cliquez sur le bouton suivant. Un fichier de sauvegarde de votre installation actuelle sera créé dans votre répertoire principal." +#: src/Process/Backend/Update.php:295 msgid "Update Dotclear" msgstr "Mettre à jour Dotclear" +#: src/Process/Backend/Update.php:305 +msgid "Manage backup files" +msgstr "Gestion des fichiers de sauvegarde" + +#: src/Process/Backend/Update.php:308 msgid "Update backup files" msgstr "Sauvegardes des mises à jour" +#: src/Process/Backend/Update.php:309 msgid "The following files are backups of previously updates. You can revert your previous installation or delete theses files." msgstr "Les fichiers suivants sont des sauvegardes de mises à jour précédentes. Vous pouvez rétablir votre installation précédente ou supprimer ces fichiers." +#: src/Process/Backend/Update.php:320 msgid "Please note that reverting your Dotclear version may have some unwanted side-effects. Consider reverting only if you experience strong issues with this new version." -msgstr "Merci de noter que rétablir votre version de Dotclear peut avoir des effets non désirés. N'envisagez ceci que si vous rencontrez d'importantes difficultés avec cette nouvelle version." +msgstr "Merci de noter que rétablir votre version de Dotclear peut avoir des effets indésirables. N'envisagez ceci que si vous rencontrez d'importantes difficultés avec cette nouvelle version." +#: src/Process/Backend/Update.php:321 #, php-format msgid "You should not revert to version prior to last one (%s)." msgstr "Vous ne devez pas rétablir une version précédant la dernière (%s)." +#: src/Process/Backend/Update.php:322 msgid "Delete selected file" msgstr "Supprimer le fichier sélectionné" +#: src/Process/Backend/Update.php:323 msgid "Revert to selected file" msgstr "Rétablir le fichier sélectionné" +#: src/Process/Backend/Update.php:333 msgid "Congratulations, you're one click away from the end of the update." msgstr "Félicitations, vous êtes à un clic de la fin de la mise à jour." +#: src/Process/Backend/Update.php:334 msgid "Finish the update." msgstr "Finir la mise à jour." -msgid "new user" -msgstr "nouvel utilisateur" +#: src/Process/Backend/User.php:35 src/Process/Backend/Users.php:116 +msgid "New user" +msgstr "Nouvel utilisateur·rice" +#: src/Process/Backend/User.php:170 src/Process/Backend/User.php:240 +#: src/Process/Backend/UsersActions.php:131 +msgid "User has been successfully updated." +msgstr "L'utilisateur·rice a été mis·e à jour." + +#: src/Process/Backend/User.php:176 #, php-format msgid "User \"%s\" already exists." -msgstr "L'utilisateur \"%s\" existe déjà ." - -msgid "User has been successfully updated." -msgstr "Utilisateur mis à jour avec succès." +msgstr "L'utilisateur·rice \"%s\" existe déjà ." +#: src/Process/Backend/User.php:200 src/Process/Backend/User.php:244 msgid "User has been successfully created." -msgstr "Utilisateur créé avec succès." - -msgid "Warning:" -msgstr "Attention :" - -msgid "If you change your username, you will have to log in again." -msgstr "Si vous changez votre login, vous devrez vous identifier à nouveau." - -msgid "No permissions." -msgstr "Aucune permission." - -msgid "Add new permissions" -msgstr "Ajouter de nouvelles permissions" - -msgid "Username" -msgstr "Identifiant :" - -msgid "Last Name" -msgstr "Nom" - -msgid "First Name" -msgstr "Prénom" - -msgid "Display name" -msgstr "Pseudonyme" - -msgid "Number of entries" -msgstr "Nombre de billets" - -msgid "users" -msgstr "utilisateurs" - -msgid "User has been successfully removed." -msgstr "Utilisateur supprimé avec succès." - -msgid "Create a new user" -msgstr "Créer un nouvel utilisateur" - -msgid "Users per page" -msgstr "Utilisateurs par page" - -msgid "Selected users action:" -msgstr "Action sur les utilisateurs sélectionnés :" - -msgid "Set permissions" -msgstr "Définir les permissions" - -msgid "Blog:" -msgstr "Blog :" - -msgid "Change blog" -msgstr "Changer de blog" - -msgid "Blogs:" -msgstr "Blogs :" - -msgid "View site" -msgstr "Voir le site" - -msgid "User:" -msgstr "Utilisateur :" +msgstr "L'utilisateur·rice a été créé·e." -msgid "Logout" -msgstr "Déconnexion" +#: src/Process/Backend/User.php:201 +msgid "User has no permission, he will not be able to login yet. See below to add some." +msgstr "L'utilisateur·rice n'a aucune permission, elle ou il ne sera pas en mesure de se connecter. Voir plus bas pour en ajouter." -#, php-format -msgid "Thank you for using %s." -msgstr "Merci d'utiliser %s." +#: src/Process/Backend/User.php:252 +msgid "User profile" +msgstr "Profil utilisateur·rice" -msgid "Help" -msgstr "Aide" +#: src/Process/Backend/User.php:254 +msgid "User ID:" +msgstr "Identifiant (login) :" -msgid "uncover" -msgstr "dévoiler" +#: src/Process/Backend/User.php:257 +msgid "Login" +msgstr "Identifiant" -msgid "hide" -msgstr "cacher" +#: src/Process/Backend/User.php:265 +msgid "Warning:" +msgstr "Attention :" -msgid "help" -msgstr "aide" +#: src/Process/Backend/User.php:266 +msgid "If you change your username, you will have to log in again." +msgstr "Si vous changez votre login, vous devrez vous identifier à nouveau." -msgid "No selection" -msgstr "Aucune sélection" +#: src/Process/Backend/User.php:303 +msgid "Password change required to connect" +msgstr "Changement de mot de passe requis à la prochaine connexion" -msgid "select all" -msgstr "tout sélectionner" +#: src/Process/Backend/User.php:321 src/Process/Backend/UserPreferences.php:516 +#: src/Process/Install/Install.php:385 +msgid "Last Name:" +msgstr "Nom :" -msgid "invert selection" -msgstr "inverser la sélection" +#: src/Process/Backend/User.php:328 src/Process/Backend/UserPreferences.php:523 +#: src/Process/Install/Install.php:379 +msgid "First Name:" +msgstr "Prénom :" -msgid "view entry" -msgstr "voir le billet" +#: src/Process/Backend/User.php:335 src/Process/Backend/UserPreferences.php:530 +msgid "Display name:" +msgstr "Pseudonyme :" -msgid "Are you sure you want to delete selected entries?" -msgstr "Ãtes-vous certain de vouloir supprimer les billets sélectionnés ?" +#: src/Process/Backend/User.php:349 +msgid "Mandatory for password recovering procedure." +msgstr "Indispensable pour la procédure de récupération de mot de passe." -msgid "Are you sure you want to delete this entry?" -msgstr "Ãtes-vous certain de vouloir supprimer ce billet ?" +#: src/Process/Backend/User.php:351 src/Process/Backend/UserPreferences.php:544 +msgid "Alternate emails (comma separated list):" +msgstr "Emails alternatifs (liste séparée par des virgules) :" -msgid "Are you sure you want to delete selected comments?" -msgstr "Ãtes-vous certain de vouloir supprimer les commentaires sélectionnés ?" +#: src/Process/Backend/User.php:356 src/Process/Backend/UserPreferences.php:549 +msgid "Invalid emails will be automatically removed from list." +msgstr "Les emails invalides seront automatiquement retirés de la liste." -msgid "Are you sure you want to delete this comment?" -msgstr "Ãtes-vous certain de vouloir supprimer ce commentaire ?" +#: src/Process/Backend/User.php:366 src/Process/Backend/UserPreferences.php:559 +msgid "Alternate URLs (comma separated list):" +msgstr "URLs alternatives (liste séparée par des virgules) :" -msgid "Users with posts cannot be deleted." -msgstr "Les utilisateurs ayant écrit des billets ne peuvent être effacées." +#: src/Process/Backend/User.php:371 src/Process/Backend/UserPreferences.php:564 +msgid "Invalid URLs will be automatically removed from list." +msgstr "Les URLs invalides seront automatiquement retirées de la liste." -msgid "Are you sure you want to delete selected users?" -msgstr "Ãtes-vous certain de vouloir supprimer les utilisateurs sélectionnés ?" +#: src/Process/Backend/User.php:377 src/Process/Backend/UserPreferences.php:623 +msgid "Interface" +msgstr "Interface" -#, php-format -msgid "Are you sure you want to delete category \"%s\"?" -msgstr "Ãtes-vous certain de vouloir supprimer la catégorie \"%s\" ?" +#: src/Process/Backend/User.php:382 +msgid "Timezone:" +msgstr "Fuseau horaire :" -msgid "Are you sure you want to reorder all categories?" -msgstr "Ãtes-vous certain de vouloir réinitialiser l'ordre des catégories ?" +#: src/Process/Backend/User.php:386 src/Process/Backend/UserPreferences.php:739 +msgid "Edition" +msgstr "Ãdition" -#, php-format -msgid "Are you sure you want to remove media \"%s\"?" -msgstr "Ãtes-vous certain de vouloir supprimer le média \"%s\" ?" +#: src/Process/Backend/User.php:387 src/Process/Backend/UserPreferences.php:753 +msgid "Preferred format:" +msgstr "Format d'édition préféré :" -msgid "Are you sure you want to extract archive in current directory?" -msgstr "Ãtes-vous certain de vouloir extraire l'archive dans le répertoire actuel ?" +#: src/Process/Backend/User.php:391 src/Process/Backend/UserPreferences.php:756 +msgid "Default entry status:" +msgstr "Ãtat des billets par défaut :" -#, php-format -msgid "Are you sure you want to remove attachment \"%s\"?" -msgstr "Ãtes-vous certain de vouloir supprimer la pièce jointe \"%s\" ?" +#: src/Process/Backend/User.php:395 src/Process/Backend/UserPreferences.php:759 +msgid "Entry edit field height:" +msgstr "Taille de la zone d'édition :" -#, php-format -msgid "Are you sure you want to delete \"%s\" language?" -msgstr "Ãtes-vous certain de vouloir supprimer la langue \"%s\" ?" +#: src/Process/Backend/User.php:419 +msgid "Save and create another" +msgstr "Enregistrer et créer un·e nouveau·elle" -#, php-format -msgid "Are you sure you want to delete \"%s\" plugin?" -msgstr "Ãtes-vous certain de vouloir supprimer l'extension \"%s\" ?" +#: src/Process/Backend/User.php:430 src/Process/Backend/UsersActions.php:147 +msgid "Permissions" +msgstr "Permissions" -msgid "Use this theme" -msgstr "Utiliser ce thème" +#: src/Process/Backend/User.php:435 +msgid "Add new permissions" +msgstr "Ajouter de nouvelles permissions" -msgid "Remove this theme" -msgstr "Supprimer ce thème" +#: src/Process/Backend/User.php:448 +msgid "No permissions so far." +msgstr "Aucune permission pour le moment." +#: src/Process/Backend/User.php:481 #, php-format -msgid "Are you sure you want to delete \"%s\" theme?" -msgstr "Ãtes-vous certain de vouloir supprimer le thème \"%s\" ?" - -msgid "Zip file content" -msgstr "Contenu du fichier zip" - -msgid "XHTML markup validator" -msgstr "Validation XHTML" - -msgid "XHTML content is valid." -msgstr "Le contenu XHTML est valide." - -msgid "There are XHTML markup errors." -msgstr "Il y a des erreurs XHTML." - -msgid "You have unsaved changes." -msgstr "Vous n'avez pas enregistré vos modifications." - -msgid "close" -msgstr "fermer" - -msgid "now" -msgstr "maintenant" - -msgid "visual" -msgstr "visuel" - -msgid "source" -msgstr "source" - -msgid "You can use the following shortcuts to format your text." -msgstr "Vous pouvez utiliser les raccourcis suivants pour formater votre texte." - -msgid "-- none --" -msgstr "-- aucun --" - -msgid "-- block format --" -msgstr "-- format bloc --" - -msgid "Paragraph" -msgstr "Paragraphe" - -msgid "Level 1 header" -msgstr "Titre de niveau 1" +msgid "%s is super admin (all rights on all blogs)." +msgstr "%s est super administrateur·rice (tous les droits sur tous les blogs)." -msgid "Level 2 header" -msgstr "Titre de niveau 2" +#: src/Process/Backend/User.php:489 +msgid "Direct links" +msgstr "Liens directs" -msgid "Level 3 header" -msgstr "Titre de niveau 3" +#: src/Process/Backend/User.php:493 +msgid "List of posts" +msgstr "Liste des billets" -msgid "Level 4 header" -msgstr "Titre de niveau 4" +#: src/Process/Backend/User.php:503 +msgid "List of comments" +msgstr "Liste des commentaires" -msgid "Level 5 header" -msgstr "Titre de niveau 5" +#: src/Process/Backend/UserPreferences.php:118 +msgid "Light" +msgstr "Clair" -msgid "Level 6 header" -msgstr "Titre de niveau 6" +#: src/Process/Backend/UserPreferences.php:119 +msgid "Dark" +msgstr "Sombre" -msgid "Strong emphasis" -msgstr "Forte emphase" +#: src/Process/Backend/UserPreferences.php:120 +msgid "Automatic" +msgstr "Automatique" -msgid "Emphasis" -msgstr "Emphase" +#: src/Process/Backend/UserPreferences.php:125 +msgid "Smallest" +msgstr "Très petite" -msgid "Inserted" -msgstr "Insertion" +#: src/Process/Backend/UserPreferences.php:126 +msgid "Smaller" +msgstr "Petite" -msgid "Deleted" -msgstr "Suppression" +#: src/Process/Backend/UserPreferences.php:128 +msgid "Larger" +msgstr "Grande" -msgid "Inline quote" -msgstr "Citation en ligne" +#: src/Process/Backend/UserPreferences.php:129 +msgid "Largest" +msgstr "Très grande" -msgid "Code" -msgstr "Code" +#: src/Process/Backend/UserPreferences.php:141 +msgid "Blog description (in blog parameters)" +msgstr "La description du blog (paramètres du blog)" -msgid "Line break" -msgstr "Passage à la ligne" +#: src/Process/Backend/UserPreferences.php:142 +msgid "Category description" +msgstr "La description des catégories" -msgid "Blockquote" -msgstr "Bloc de citation" - -msgid "Preformated text" -msgstr "Texte préformaté" - -msgid "Unordered list" -msgstr "Liste à puces" - -msgid "Ordered list" -msgstr "Liste numérotée" - -msgid "Link" -msgstr "Lien" - -msgid "URL?" -msgstr "URL ?" - -msgid "Language?" -msgstr "Langue ?" - -msgid "External image" -msgstr "Image externe" - -msgid "Media chooser" -msgstr "Sélecteur de média" - -msgid "Link to an entry" -msgstr "Lien vers un billet" - -msgid "Activate enhanced uploader" -msgstr "Activer l'interface avancée" - -msgid "Disable enhanced uploader" -msgstr "Désactiver l'interface avancée" - -msgid "File successfully uploaded." -msgstr "Fichier envoyé avec succès." - -msgid "Maximum file size allowed:" -msgstr "Taille maximale de fichier autorisée :" - -msgid "Limit exceeded." -msgstr "Limite dépassée." - -msgid "File size exceeds allowed limit." -msgstr "La taille du fichier dépasse la limite autorisée." - -msgid "Canceled." -msgstr "Annulé." - -msgid "HTTP Error:" -msgstr "Erreur HTTP :" - -msgid "Choose file" -msgstr "Choisir un fichier" - -msgid "Choose files" -msgstr "Choisir des fichiers" - -msgid "Clean" -msgstr "Nettoyer" - -msgid "Upload" -msgstr "Envoyer" - -msgid "No file in queue." -msgstr "Aucun fichier en file d'attente." - -msgid "1 file in queue." -msgstr "1 fichier en attente." - -#, php-format -msgid "%d files in queue." -msgstr "%d fichiers en attente." - -msgid "Queue error:" -msgstr "Erreur de file d'attente :" - -msgid "«prev." -msgstr "«préc." - -msgid "next»" -msgstr "suiv.»" - -msgid "No entry" -msgstr "Pas de billet" - -msgid "scheduled" -msgstr "programmé" +#: src/Process/Backend/UserPreferences.php:183 +#: src/Process/Backend/UserPreferences.php:200 +msgid "If you want to change your email or password you must provide your current password." +msgstr "Si vous voulez modifier votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel." -msgid "protected" -msgstr "protégé" +#: src/Process/Backend/UserPreferences.php:231 +msgid "Personal information has been successfully updated." +msgstr "Vos informations personnelles ont été enregistrées." -#, php-format -msgid "%d attachment" -msgstr "%d annexe" +#: src/Process/Backend/UserPreferences.php:342 +msgid "Personal options has been successfully updated." +msgstr "Vos options personnelles ont été enregistrées." -#, php-format -msgid "%d attachments" -msgstr "%d annexes" +#: src/Process/Backend/UserPreferences.php:369 +msgid "Dashboard options has been successfully updated." +msgstr "Vos options du tableau de bord ont été enregistrées." -msgid "Type" -msgstr "Type" +#: src/Process/Backend/UserPreferences.php:381 +#: src/Process/Backend/UserPreferences.php:405 +msgid "No favorite selected" +msgstr "Aucun favori sélectionné" -msgid "No user" -msgstr "Pas d'utilisateur" +#: src/Process/Backend/UserPreferences.php:392 +msgid "Favorites have been successfully added." +msgstr "Les favoris ont été ajoutés." -msgid "System" -msgstr "Système" +#: src/Process/Backend/UserPreferences.php:418 +msgid "Favorites have been successfully removed." +msgstr "Les favoris ont été retirés." -msgid "Blog" -msgstr "Blog" +#: src/Process/Backend/UserPreferences.php:448 +msgid "Favorites have been successfully updated." +msgstr "Les favoris ont été mis à jour." -msgid "Updates" -msgstr "Mises à jour" +#: src/Process/Backend/UserPreferences.php:460 +msgid "Default favorites have been successfully updated." +msgstr "Les favoris par défaut ont été enregistrés." -msgid "Languages" -msgstr "Langues" +#: src/Process/Backend/UserPreferences.php:474 +msgid "Dashboard items order have been successfully reset." +msgstr "Le positionnement des éléments du tableau de bord a été réinitialisé." -msgid "Unable to open directory." -msgstr "Impossible d'ouvrir le répertoire." +#: src/Process/Backend/UserPreferences.php:511 +#: src/Process/Backend/UserPreferences.php:513 +msgid "My profile" +msgstr "Mon profil" + +#: src/Process/Backend/UserPreferences.php:566 +msgid "Language for my interface:" +msgstr "Langue de mon interface :" + +#: src/Process/Backend/UserPreferences.php:569 +msgid "My timezone:" +msgstr "Mon fuseau horaire :" + +#: src/Process/Backend/UserPreferences.php:574 +msgid "Change my password" +msgstr "Changer mon mot de passe" -msgid "Unable to create directory." -msgstr "Impossible de créer le répertoire." +#: src/Process/Backend/UserPreferences.php:584 +msgid "Confirm new password:" +msgstr "Confirmer le nouveau mot de passe :" -msgid "File is not writable." -msgstr "Le fichier n'est pas accessible en écriture." +#: src/Process/Backend/UserPreferences.php:592 +msgid "Your current password:" +msgstr "Votre mot de passe actuel :" -msgid "Unable to open file." -msgstr "Impossible d'ouvrir le fichier." +#: src/Process/Backend/UserPreferences.php:603 +msgid "If you have changed your email or password you must provide your current password to save these modifications." +msgstr "Si vous avez modifié votre adresse email ou votre mot de passe, vous devez indiquer votre mot de passe actuel pour enregistrer ces modifications." -# pas compris -msgid "Not an uploaded file." -msgstr "Pas un fichier déposé." +#: src/Process/Backend/UserPreferences.php:609 +msgid "Update my profile" +msgstr "Mettre à jour mon profil" -msgid "The uploaded file exceeds the maximum file size allowed." -msgstr "Le fichier déposé est plus grand que la taille maximale autorisée." +#: src/Process/Backend/UserPreferences.php:617 +#: src/Process/Backend/UserPreferences.php:620 +msgid "My options" +msgstr "Mes options" -msgid "The uploaded file was only partially uploaded." -msgstr "Le fichier n'a été chargé qu'en partie." +#: src/Process/Backend/UserPreferences.php:625 +msgid "Theme:" +msgstr "Thème :" -msgid "No file was uploaded." -msgstr "Aucun fichier chargé." +#: src/Process/Backend/UserPreferences.php:630 +msgid "Activate enhanced uploader in media manager" +msgstr "Activer l'interface avancée de la médiathèque" -msgid "Missing a temporary folder." -msgstr "Il manque un répertoire temporaire." +#: src/Process/Backend/UserPreferences.php:634 +msgid "Preview the entry being edited in a blank window or tab (depending on your browser settings)." +msgstr "Prévisualiser l'entrée en cours d'édition dans une fenêtre ou un onglet vierge (selon les paramètres de votre navigateur)." -msgid "Failed to write file to disk." -msgstr "Impossible d'écrire le fichier." +#: src/Process/Backend/UserPreferences.php:638 +msgid "Disable javascript powered drag and drop for ordering items" +msgstr "Désactiver le glisser-déposer pour ordonnancer les éléments" -#, php-format -msgid "%s is not a directory." -msgstr "%s n'est pas un répertoire." +#: src/Process/Backend/UserPreferences.php:639 +msgid "If checked, numeric fields will allow to type the elements' ordering number." +msgstr "Si cette option est cochée, des champs numériques permettront d'indiquer la position des éléments." -msgid "Uploading this file is not allowed." -msgstr "L'envoi de ce fichier n'est pas autorisé." +#: src/Process/Backend/UserPreferences.php:643 +msgid "Hide all secondary information and notes" +msgstr "Cacher les informations secondaires et les notes" -# "en jail" ? c'est du geek ? -msgid "Destination directory is not in jail." -msgstr "Le répertoire cible n'est pas en jail." +#: src/Process/Backend/UserPreferences.php:647 +msgid "Hide help button" +msgstr "Cacher le bouton d'aide" -msgid "File already exists." -msgstr "Le nouveau fichier existe déjà ." +#: src/Process/Backend/UserPreferences.php:651 +msgid "Show asynchronous requests indicator" +msgstr "Afficher l'indicateur de requête asynchrone" -msgid "Cannot write in this directory." -msgstr "Impossible d'écrire dans ce répertoire." +#: src/Process/Backend/UserPreferences.php:653 +msgid "Font size:" +msgstr "Taille de police de caractère :" -msgid "An error occurred while writing the file." -msgstr "Une erreur est survenue pendant l'écriture du fichier." +#: src/Process/Backend/UserPreferences.php:658 +msgid "Use operating system font" +msgstr "Utiliser la police système" -msgid "Source file does not exist." -msgstr "Le fichier source n'existe pas" +#: src/Process/Backend/UserPreferences.php:660 +msgid "Number of recent folders proposed in media manager:" +msgstr "Nombre de dossiers récents proposés dans la médiathèque :" -# geek ? -msgid "File is not in jail." -msgstr "Le fichier n'est pas en jail." +#: src/Process/Backend/UserPreferences.php:662 +msgid "Leave empty to ignore, displayed only if Javascript is enabled in your browser." +msgstr "Laisser vide pour ignorer ; affiché seulement si Javascript est activé dans votre navigateur." -msgid "Destination directory is not writable." -msgstr "Le répertoire cible n'est pas accessible en écriture." +#: src/Process/Backend/UserPreferences.php:668 +msgid "Do not use standard favicon" +msgstr "Ne pas utiliser le favicon standard de Dotclear" -msgid "Unable to rename file." -msgstr "Impossible de renommer le fichier." +#: src/Process/Backend/UserPreferences.php:669 +msgid "This will be applied for all users" +msgstr "Ce choix sera appliqué pour tous les utilisateur·rice·s" -msgid "File cannot be removed." -msgstr "Ce fichier ne peut pas être supprimé." +#: src/Process/Backend/UserPreferences.php:676 +msgid "Disable Ad-blocker check" +msgstr "Désactiver la détection de bloqueurs de publicité" -# décidément ! mais que veut dire "jail" ? -msgid "Directory is not in jail." -msgstr "Le répertoire n'est pas en jail." +#: src/Process/Backend/UserPreferences.php:677 +msgid "Some ad-blockers (Ghostery, Adblock plus, uBloc origin, â¦) may interfere with some feature as inserting link or media in entries with CKEditor; in this case you should disable it for this Dotclear installation (backend only). Note that Dotclear do not add ads ot trackers in the backend." +msgstr "Certains bloqueurs de publicité (Ghostery, Adblock plus, uBloc origin, â¦) peuvent interférer avec certaines fonctionnalités comme l'insertion de lien ou de média dans les entrées avec CKEditor ; dans ce cas vous devriez les désactiver pour cette installation Dotclear (administration seulement). Notez que Dotclear n'ajoute aucune publicité ou pisteur dans les pages de l'administration." -msgid "Directory cannot be removed." -msgstr "Ce répertoire ne peut pas être supprimé." +#: src/Process/Backend/UserPreferences.php:682 +msgid "Optional columns displayed in lists" +msgstr "Colonnes optionnelles affichées dans les listes" -msgid "Not enough memory to open image." -msgstr "Mémoire insuffisante pour ouvrir l'image." +#: src/Process/Backend/UserPreferences.php:701 +msgid "Options for lists" +msgstr "Options des listes" -#, php-format -msgid "File %s is not compressed in the zip." -msgstr "Le fichier %s n'est pas compressé dans le zip." +#: src/Process/Backend/UserPreferences.php:704 +msgid "Apply filters on the fly" +msgstr "Appliquer les filtres à la volée" +#: src/Process/Backend/UserPreferences.php:744 #, php-format -msgid "Trying to unzip a folder name %s" -msgstr "Tentative de décompresser un répertoire %s" +msgid "Preferred editor for %s:" +msgstr "Ãditeur préféré pour le format %s :" -msgid "Unable to write destination file." -msgstr "Impossible d'écrire le fichier de destination" +#: src/Process/Backend/UserPreferences.php:747 +msgid "Choose an editor" +msgstr "Choisissez un éditeur" -msgid "Unable to write in target directory, permission denied." -msgstr "Impossible d'écrire dans le répertoire cible, permission refusée." +#: src/Process/Backend/UserPreferences.php:764 +msgid "Enable WYSIWYG mode" +msgstr "Activer l'éditeur visuel" -msgid "Not enough memory to open file." -msgstr "Mémoire insuffisante pour ouvrir le fichier." +#: src/Process/Backend/UserPreferences.php:768 +msgid "Display editor's toolbar at bottom of textarea (if possible)" +msgstr "Afficher la barre d'outil des éditeurs en bas de la zone de saisie (si possible)" -msgid "File does not exist" -msgstr "Le fichier n'existe pas" +#: src/Process/Backend/UserPreferences.php:774 +msgid "Use HTML editor for:" +msgstr "Utiliser l'éditeur HTML pour :" -msgid "Cannot read file" -msgstr "Impossible de lire le fichier" +#: src/Process/Backend/UserPreferences.php:784 +msgid "Other options" +msgstr "Autres options" -msgid "Directory does not exist" -msgstr "Le répertoire n'existe pas" +#: src/Process/Backend/UserPreferences.php:792 +msgid "Save my options" +msgstr "Enregistrer mes options" -msgid "Cannot read directory" -msgstr "Impossible de lire le répertoire" +#: src/Process/Backend/UserPreferences.php:830 +#, php-format +msgid "position of %s" +msgstr "position de %s" -msgid "administrator" -msgstr "administrateur" +#: src/Process/Backend/UserPreferences.php:847 +msgid "Save order" +msgstr "Enregistrer l'ordre" -msgid "manage their own entries and comments" -msgstr "gérer ses propres billets et commentaires" +#: src/Process/Backend/UserPreferences.php:850 +msgid "Delete selected favorites" +msgstr "Retirer les favoris sélectionnés" -msgid "publish entries and comments" -msgstr "publier des billets et des commentaires" +#: src/Process/Backend/UserPreferences.php:852 +msgid "Are you sure you want to remove selected favorites?" +msgstr "Ãtes-vous sûr·e de vouloir retirer les favoris sélectionnés ?" -msgid "delete entries and comments" -msgstr "supprimer des billets et des commentaires" +#: src/Process/Backend/UserPreferences.php:857 +msgid "If you are a super administrator, you may define this set of favorites to be used by default on all blogs of this installation." +msgstr "Si vous êtes super administrateur·rice, vous pouvez faire de ces favoris le jeu par défaut pour tous les blogs de l'installation." -msgid "manage all entries and comments" -msgstr "gérer tous les billets et commentaires" +#: src/Process/Backend/UserPreferences.php:858 +msgid "Define as default favorites" +msgstr "Définir comme favoris par défaut" -msgid "manage categories" -msgstr "gérer les catégories" +#: src/Process/Backend/UserPreferences.php:865 +msgid "Currently no personal favorites." +msgstr "La liste de vos favoris est vide pour le moment." -msgid "manage their own media items" -msgstr "gérer ses propres médias" +#: src/Process/Backend/UserPreferences.php:879 +msgid "Other available favorites" +msgstr "Autres favoris disponibles" -msgid "manage all media items" -msgstr "gérer tous les médias" +#: src/Process/Backend/UserPreferences.php:907 +msgid "(default favorite)" +msgstr "(favori par défaut)" -msgid "That user does not exist in the database." -msgstr "Cet utilisateur n'existe pas dans la base de données." +#: src/Process/Backend/UserPreferences.php:918 +msgid "Add to my favorites" +msgstr "Ajouter à mes favoris" -msgid "That key does not exist in the database." -msgstr "Cette clé n'existe pas dans la base de données." +#: src/Process/Backend/UserPreferences.php:927 +msgid "Menu" +msgstr "Menu" -msgid "You are not allowed to add categories" -msgstr "Vous n'êtes pas autorisé à créer des catégories" +#: src/Process/Backend/UserPreferences.php:930 +msgid "Display favorites at the top of the menu" +msgstr "Afficher les favoris en haut du menu" -msgid "You are not allowed to update categories" -msgstr "Vous n'êtes pas autorisé à modifier des catégories" +#: src/Process/Backend/UserPreferences.php:933 +msgid "Dashboard icons" +msgstr "Icônes du tableau de bord" -msgid "You are not allowed to delete categories" -msgstr "Vous n'êtes pas autorisé à supprimer des catégories" +#: src/Process/Backend/UserPreferences.php:936 +msgid "Display dashboard icons" +msgstr "Afficher les icônes du tableau de bord" -msgid "This category is not empty." -msgstr "Cette catégorie n'est pas vide." +#: src/Process/Backend/UserPreferences.php:940 +msgid "Dashboard modules" +msgstr "Modules du tableau de bord" -msgid "Category URL must be unique." -msgstr "L'URL de chaque catégorie doit être unique." +#: src/Process/Backend/UserPreferences.php:944 +msgid "Display documentation links" +msgstr "Afficher les liens vers la documentation" -msgid "You must provide a category title" -msgstr "Vous devez indiquer un titre de catégorie" +#: src/Process/Backend/UserPreferences.php:948 +msgid "Display Dotclear news" +msgstr "Afficher les nouvelles de Dotclear" -msgid "You must provide a category URL" -msgstr "Vous devez indiquer une URL de catégorie" +#: src/Process/Backend/UserPreferences.php:952 +msgid "Display quick entry form" +msgstr "Afficher le formulaire de billet rapide" -msgid "You are not allowed to create an entry" -msgstr "Vous n'êtes pas autorisé à créer des billets" +#: src/Process/Backend/UserPreferences.php:958 +msgid "Do not display Dotclear updates" +msgstr "Ne pas afficher les mises à jour de Dotclear" -msgid "You are not allowed to update entries" -msgstr "Vous n'êtes pas autorisé à modifier les billets" +#: src/Process/Backend/UserPreferences.php:971 +msgid "Save my dashboard options" +msgstr "Enregistrer les options de mon tableau de bord" -msgid "No such entry ID" -msgstr "Identifiant du billet inconnu" +#: src/Process/Backend/UserPreferences.php:978 +msgid "Dashboard items order" +msgstr "Positionnement des éléments du tableau de bord" -msgid "You are not allowed to edit this entry" -msgstr "Vous n'êtes pas autorisé à modifier ce billet" +#: src/Process/Backend/UserPreferences.php:981 +msgid "Reset dashboard items order" +msgstr "Réinitialiser le positionnement des éléments du tableau de bord" -msgid "You are not allowed to change this entry status" -msgstr "Vous n'êtes pas autorisé à modifier l'état de ce billet" +#: src/Process/Backend/Users.php:39 src/Process/Backend/UsersActions.php:260 +msgid "Set permissions" +msgstr "Définir les permissions" -msgid "You are not allowed to change this entry category" -msgstr "Vous n'êtes pas autorisé à modifier la catégorie de ce billet" +#: src/Process/Backend/Users.php:110 +msgid "User has been successfully removed." +msgstr "L'utilisateur·rice a été supprimé·e." -msgid "You are not allowed to mark this entry as selected" -msgstr "Vous n'êtes pas autorisé à marquer ce billet comme sélectionné" +#: src/Process/Backend/Users.php:113 +msgid "The permissions have been successfully updated." +msgstr "Les permissions ont été mises à jour." -msgid "You are not allowed to delete entries" -msgstr "Vous n'êtes pas autorisé à supprimer des billets" +#: src/Process/Backend/Users.php:142 +msgid "Selected users action:" +msgstr "Action sur les utilisateur·rice·s sélectionné·e·s :" -msgid "You are not allowed to delete this entry" -msgstr "Vous n'êtes pas autorisé à supprimer ce billet" +#: src/Process/Backend/UsersActions.php:77 +msgid "No blog or user given." +msgstr "Vous n'avez pas indiqué de blog ou d'utilisateur" -msgid "No entry title" -msgstr "Pas de titre de billet" +#: src/Process/Backend/UsersActions.php:88 +msgid "You cannot delete yourself." +msgstr "Vous ne pouvez pas vous supprimer vous-même." -msgid "No entry content" -msgstr "Pas de contenu de billet" +#: src/Process/Backend/UsersActions.php:100 +msgid "User has been successfully deleted." +msgstr "L'utilisateur·rice a été supprimé·e." -msgid "Empty entry URL" -msgstr "URL du billet vide" +#: src/Process/Backend/UsersActions.php:189 +msgid "Back to user profile" +msgstr "Retour au profil de l'utilisateur·rice" -msgid "You are not allowed to update comments" -msgstr "Vous n'êtes pas autorisé à modifier des commentaires" +#: src/Process/Backend/UsersActions.php:214 +#, php-format +msgid "Choose one or more blogs to which you want to give permissions to users %s." +msgstr "Choisissez un ou plusieurs blogs pour lesquels les utilisateur·rice·s suivant·e·s auront des permissions : %s." -msgid "No such comment ID" -msgstr "Identifiant du commentaire inconnu" +#: src/Process/Backend/UsersActions.php:228 +msgid "Entries" +msgstr "Publications" -msgid "You are not allowed to update this comment" -msgstr "Vous n'êtes pas autorisé à modifier ce commentaire" +#: src/Process/Backend/UsersActions.php:244 +msgid "select" +msgstr "sélectionner" -msgid "You are not allowed to change this comment's status" -msgstr "Vous n'êtes pas autorisé à changer l'état de ce commentaire" +#: src/Process/Backend/UsersActions.php:281 +#, php-format +msgid "You are about to change permissions on the following blogs for users %s." +msgstr "Vous allez changer les permissions des utilisateur·rice·s %s pour ces blogs." -msgid "You are not allowed to delete comments" -msgstr "Vous n'êtes pas autorisé à supprimer des commentaires" +#: src/Process/Backend/UsersActions.php:329 +msgid "Validate permissions" +msgstr "Valider les permissions" -msgid "You are not allowed to delete this comment" -msgstr "Vous n'êtes pas autorisé à supprimer ce commentaire" +#: src/Process/Install/Install.php:68 +msgid "Please set a master key (DC_MASTER_KEY) in configuration file." +msgstr "Veuillez indiquer une clé de référence (DC_MASTER_KEY) dans le fichier de configuration." -msgid "You must provide a comment" -msgstr "Vous devez indiquer un commentaire" +#: src/Process/Install/Install.php:75 src/Process/Install/Wizard.php:106 +msgid "Dotclear is already installed." +msgstr "Dotclear est déjà installé." -msgid "You must provide an author name" -msgstr "Vous devez indiquer un nom d'auteur" +#: src/Process/Install/Install.php:81 src/Process/Install/Wizard.php:100 +msgid "Dotclear cannot be installed." +msgstr "Dotclear ne peut pas être installé." -msgid "Email address is not valid." -msgstr "Adresse email invalide." +#: src/Process/Install/Install.php:110 +msgid "Invalid email address" +msgstr "Adresse email incorrecte" -msgid "online" -msgstr "en ligne" +#: src/Process/Install/Install.php:173 +msgid "My first blog" +msgstr "Mon premier blog" -msgid "offline" -msgstr "hors ligne" +#: src/Process/Install/Install.php:186 +msgid "%A, %B %e %Y" +msgstr "%A %e %B %Y" -msgid "removed" -msgstr "supprimé" +#: src/Process/Install/Install.php:262 +msgid "Welcome to Dotclear!" +msgstr "Bienvenue sur Dotclear !" -msgid "You are not an administrator" -msgstr "Vous n'êtes pas administrateur" +#: src/Process/Install/Install.php:263 +msgid "This is your first entry. When you're ready to blog, log in to edit or delete it." +msgstr "Ceci est votre premier billet. Quand vous serez prêt à bloguer, connectez-vous pour le modifier ou le supprimer." -msgid "Invalid user language code" -msgstr "Code langue de l'utilisateur invalide" +#: src/Process/Install/Install.php:275 +msgid "Dotclear Team" +msgstr "L'équipe Dotclear" -msgid "Blog ID must contain at least 2 characters using letters, numbers or symbols." -msgstr "L'identifiant du blog doit contenir au moins 2 caractères composés de lettres, chiffres ou symboles." +#: src/Process/Install/Install.php:278 +msgid "This is a comment.
\n" +"To delete it, log in and view your blog's comments. Then you might remove or edit it.
" +msgstr "Ceci est un commentaire
\n" +"Pour le supprimer, connectez-vous et affichez les commentaires de votre blog. Vous pourrez alors le supprimer ou le modifier.
" -msgid "No blog name" -msgstr "Pas de nom de blog" +#: src/Process/Install/Install.php:334 +msgid "Dotclear Install" +msgstr "Installation de Dotclear" -msgid "No blog URL" -msgstr "Pas d'URL de blog" +#: src/Process/Install/Install.php:348 +msgid "show" +msgstr "voir" -msgid "No blog defined." -msgstr "Aucun blog défini." +#: src/Process/Install/Install.php:356 +msgid "Dotclear installation" +msgstr "Installation de Dotclear" +#: src/Process/Install/Install.php:360 #, php-format -msgid "Directory %s does not exist." -msgstr "Le répertoire %s n'existe pas." - -msgid "You are not a super administrator." -msgstr "Vous n'êtes pas super administrateur." +msgid "Cache directory %s is not writable." +msgstr "Le répertoire de cache %s n'est pas accessible en écriture." -msgid "Permission denied." -msgstr "Permission refusée." +#: src/Process/Install/Install.php:368 +msgid "Configuration file has been successfully created." +msgstr "Le fichier de configuration a été créé." -msgid "You are not the file owner." -msgstr "Vous n'êtes pas le propriétaire de ce fichier." +#: src/Process/Install/Install.php:373 src/Process/Install/Install.php:378 +msgid "User information" +msgstr "Informations utilisateur" -msgid "New file already exists." -msgstr "Le nouveau fichier existe déjà ." +#: src/Process/Install/Install.php:375 +msgid "Please provide the following information needed to create the first user." +msgstr "Merci de fournir les informations suivantes pour créer le ou la premier·ière utilisateur·rice." -msgid "File does not exist in the database." -msgstr "Ce fichier n'existe pas dans la base de données." +#: src/Process/Install/Install.php:400 +msgid "Username and password" +msgstr "Identifiant et mot de passe" -#, php-format -msgid "Extract destination directory %s already exists." -msgstr "Le répertoire de destination d'extraction %s existe déjà ." +#: src/Process/Install/Install.php:445 +msgid "All done!" +msgstr "C'est terminé !" -msgid "Empty module zip file." -msgstr "Fichier zip de module vide." +#: src/Process/Install/Install.php:449 +msgid "Dotclear has been successfully installed. Here is some useful information you should keep." +msgstr "Dotclear est installé. Conservez les informations suivantes précieusement." -msgid "The zip file does not appear to be a valid Dotclear module." -msgstr "Le fichier zip ne semble pas être un fichier valide de module Dotclear." +#: src/Process/Install/Install.php:451 +msgid "Your account" +msgstr "Votre compte" -msgid "An error occurred during module deletion." -msgstr "Une erreur est survenue durant la suppression du module." +#: src/Process/Install/Install.php:457 +msgid "Your blog" +msgstr "Votre blog" -#, php-format -msgid "Unable to upgrade \"%s\". (same version)" -msgstr "Impossible de mettre à jour \"%s\" (même version)." +#: src/Process/Install/Install.php:459 +msgid "Blog address:" +msgstr "Adresse du blog :" -msgid "Unable to read new _define.php file" -msgstr "Impossible de lire le nouveau fichier _define.php." +#: src/Process/Install/Install.php:460 +msgid "Administration interface:" +msgstr "Interface d'administration :" -msgid "No such module." -msgstr "Module inexistant." +#: src/Process/Install/Install.php:464 +msgid "Manage your blog now" +msgstr "Gérez votre blog" -msgid "Cannot remove module files" -msgstr "Impossible de supprimer les fichiers du module" +#: src/Process/Install/Install.php:471 +msgid "Installation can not be completed" +msgstr "L'installation ne peut pas être terminée" -msgid "Cannot deactivate plugin." -msgstr "L'extension ne peut pas être désactivée." +#: src/Process/Install/Install.php:473 +msgid "For the said reasons, Dotclear can not be installed. Please refer to the documentation to learn how to correct the problem." +msgstr "Pour les raisons ci-dessus, Dotclear ne peut pas être installé. Référez-vous à la documentation pour savoir comment corriger le problème." -msgid "Cannot activate plugin." -msgstr "L'extension ne peut pas être activée." +#: src/Process/Install/Wizard.php:51 +#, php-format +msgid "Path %s is not writable." +msgstr "Le chemin %s n'est pas accessible en écriture." -msgid "Unable to retrieve settings:" -msgstr "Impossible d'obtenir les paramètres :" +#: src/Process/Install/Wizard.php:52 +msgid "Dotclear installation wizard could not create configuration file for you. You must change folder right or create the config.php file manually, please refer to the documentation to learn how to do this." +msgstr "L'assistant d'installation Dotclear n'a pas pu créer le fichier de configuration à votre place. Vous devez changer les droits du répertoire ou créer le fichier config.php manuellement. Référez-vous à la documentation pour voir comment procéder." +#: src/Process/Install/Wizard.php:84 #, php-format -msgid "Invalid setting namespace: %s" -msgstr "Espace de nommage du paramètre invalide : %s" +msgid "Cannot write \"%s\" directory." +msgstr "Impossible d'écrire dans le répertoire \"%s\"." -msgid "No namespace specified" -msgstr "Aucun espace de nommage spécifié" +#: src/Process/Install/Wizard.php:110 +msgid "Master email is not valid." +msgstr "Adresse email principale incorrecte." +#: src/Process/Install/Wizard.php:116 #, php-format -msgid "%s is not a valid setting id" -msgstr "%s n'est pas un identifiant de paramètre valide" +msgid "File %s does not exist." +msgstr "Le fichier %s n'existe pas." +#: src/Process/Install/Wizard.php:121 src/Process/Install/Wizard.php:142 #, php-format -msgid "%s has still been pinged" -msgstr "Un rétrolien vers %s a déjà été fait" +msgid "Cannot write %s file." +msgstr "Impossible d'écrire le fichier %s." -msgid "Unable to ping URL" -msgstr "Impossible de réaliser le rétrolien" +#: src/Process/Install/Wizard.php:185 src/Process/Install/Wizard.php:193 +msgid "Dotclear installation wizard" +msgstr "Assistant d'installation de Dotclear" -#, php-format -msgid "%s is not a ping URL" -msgstr "%s n'est pas une URL de rétrolien" +#: src/Process/Install/Wizard.php:199 +msgid "Welcome" +msgstr "Bienvenue" -#, php-format -msgid "%s, ping error:" -msgstr "%s, erreur de rétrolien :" +#: src/Process/Install/Wizard.php:200 +msgid "To complete your Dotclear installation and start writing on your blog, we just need to know how to access your database and who you are. Just fill this two steps wizard with this information and we will be done." +msgstr "Pour achever votre installation de Dotclear, il ne manque plus que les informations concernant votre base de données, puis vos informations personnelles. Remplissez simplement les deux formulaires suivants et vous pourrez commencer à utiliser votre blog." -msgid "Digests file not found." -msgstr "Fichier de contrôle introuvable." +#: src/Process/Install/Wizard.php:203 +msgid "Attention:" +msgstr "Attention :" -msgid "No file to download" -msgstr "Aucun fichier à télécharger." +#: src/Process/Install/Wizard.php:204 +msgid "this wizard may not function on every host. If it does not work for you, please refer to the documentation to learn how to create the config.php file manually." +msgstr "cet assistant peut ne pas fonctionner chez tous les hébergeurs. Si vous rencontrez un problème, vous trouverez comment créer le fichier de configuration dans la documentation." -msgid "Root directory is not writable." -msgstr "Le répertoire principal n'est pas accessible en écriture." +#: src/Process/Install/Wizard.php:211 +msgid "System information" +msgstr "Informations système" -msgid "An error occurred while downloading archive." -msgstr "Une erreur est survenue lors du téléchargement de l'archive." +#: src/Process/Install/Wizard.php:213 +msgid "Please provide the following information needed to create your configuration file." +msgstr "Merci de fournir les informations suivantes qui sont nécessaires pour créer votre fichier de configuration." -msgid "Archive not found." -msgstr "L'archive n'a pas été trouvée." +#: src/Process/Install/Wizard.php:216 +msgid "Database type:" +msgstr "Type de base de données :" -msgid "Unable to read current digests file." -msgstr "Impossible de lire le fichier de contrôle actuel." +#: src/Process/Install/Wizard.php:220 +msgid "MySQLi" +msgstr "MySQLi" -msgid "Downloaded file seems not to be a valid archive." -msgstr "Le fichier téléchargé ne semble pas être une archive valide." +#: src/Process/Install/Wizard.php:221 +msgid "MySQLi (full UTF-8)" +msgstr "MySQLi (UTF-8 complet)" -msgid "Incomplete archive." -msgstr "Archive incomplète." +#: src/Process/Install/Wizard.php:222 +msgid "PostgreSQL" +msgstr "PostgreSQL" -msgid "Unable to read digests file." -msgstr "Impossible de lire le fichier de contrôle." +#: src/Process/Install/Wizard.php:223 +msgid "SQLite" +msgstr "SQLite" -msgid "Invalid digests file." -msgstr "Fichier de contrôle invalide." +#: src/Process/Install/Wizard.php:224 +msgid "Driver" +msgstr "Pilote" -msgid "SQLite Database Schema cannot be upgraded." -msgstr "Le schema de base de données SQLite ne peut pas être mis à jour." +#: src/Process/Install/Wizard.php:226 +msgid "Database Host Name:" +msgstr "Nom d'hôte de la base de données :" -msgid "Something went wrong with auto upgrade:" -msgstr "Une erreur est survenue durant la mise à jour automatique :" +#: src/Process/Install/Wizard.php:228 +msgid "Database Name:" +msgstr "Nom de la base de données :" + +#: src/Process/Install/Wizard.php:230 +msgid "Database User Name:" +msgstr "Nom d'utilisateur·rice de la base de données :" + +#: src/Process/Install/Wizard.php:232 +msgid "Database Password:" +msgstr "Mot de passe de la base de données :" + +#: src/Process/Install/Wizard.php:234 +msgid "Database Tables Prefix:" +msgstr "Préfixe des tables de la base de données :" + +#: src/Process/Install/Wizard.php:237 +msgid "Prefix" +msgstr "Préfixe" + +#: src/Process/Install/Wizard.php:240 +msgid "Master Email: (used as sender for password recovery)" +msgstr "Email principal : (utilisé pour l'envoi pour la récupération de mot de passe)" -#~ msgid "Login:" -#~ msgstr "Login :" -#~ msgid "Login and password" -#~ msgstr "Identifiant et mot de passe" -#~ msgid "User ID" -#~ msgstr "Identifiant utilisateur" -#~ msgid "Name" -#~ msgstr "Nom" +#: src/Process/Install/Wizard.php:248 +msgid "Continue" +msgstr "Continuer" diff --git a/locales/fr/plugins.lang.php b/locales/fr/plugins.lang.php index e84f570..6c499cd 100644 --- a/locales/fr/plugins.lang.php +++ b/locales/fr/plugins.lang.php @@ -1,457 +1,701 @@ DC1 redirect plugin and activate it in your blog configuration.'] = 'Veuillez noter que Dotclear 2 a un nouveau format d\'URL. Vous pouvez éviter les liens morts en installant le plugin DC1 redirect et en l\'activant dans la configuration de votre blog.'; -$GLOBALS['__l10n']['next step'] = 'étape suivante'; -$GLOBALS['__l10n']['Dotclear tables not found'] = 'Tables Dotclear non trouvées'; -$GLOBALS['__l10n']['Feed import'] = 'Importer depuis un flux'; -$GLOBALS['__l10n']['Imports a feed as new entries.'] = 'Importe un flux comme nouveaux billets.'; -$GLOBALS['__l10n']['Cannot retrieve feed URL.'] = 'Impossible d\'atteindre l\'URL du fil.'; -$GLOBALS['__l10n']['No items in feed.'] = 'Aucun élément dans le feed.'; -$GLOBALS['__l10n']['Content successfully imported.'] = 'Contenu importé avec succès.'; -$GLOBALS['__l10n']['Import from a feed'] = 'Importer depuis un fil de nouvelles'; -$GLOBALS['__l10n']['This will import a feed (RSS or Atom) a as new content in the current blog: %s.'] = 'Ceci va importer un fil (RSS ou Atom) comme un nouveau contenu dans le blog en cours : %s.'; -$GLOBALS['__l10n']['Feed URL:'] = 'URL du fil'; -$GLOBALS['__l10n']['Send'] = 'Envoyer'; -$GLOBALS['__l10n']['Flat file import'] = 'Importer depuis un fichier texte'; -$GLOBALS['__l10n']['Imports a blog or a full Dotclear installation from flat file.'] = 'Importe un blog ou toutes les données depuis un fichier texte.'; -$GLOBALS['__l10n']['Single blog successfully imported.'] = 'Blog importé avec succès.'; -$GLOBALS['__l10n']['Are you sure you want to import a full backup file?'] = 'Ãtes-vous certain de vouloir charger un fichier de sauvegarde complet ?'; -$GLOBALS['__l10n']['Import a single blog'] = 'Importer un blog'; -$GLOBALS['__l10n']['This will import a single blog backup as new content in the current blog: %s.'] = 'Ceci va charger une sauvegarde de blog comme un nouveau contenu dans le blog en cours : %s.'; -$GLOBALS['__l10n']['Upload a backup file'] = 'Charger un fichier de sauvegarde'; -$GLOBALS['__l10n']['or pick up a local file in your public directory'] = 'ou choisissez un fichier local dans votre répertoire public'; -$GLOBALS['__l10n']['Import a full backup file'] = 'Import d\'un fichier de sauvegarde complet'; -$GLOBALS['__l10n']['Warning: This will reset all the content of your database, except users.'] = 'Attention : Ceci va remettre à zéro tout le contenu, sauf les utilisateurs.'; -$GLOBALS['__l10n']['WordPress import'] = 'Importer depuis WordPress'; -$GLOBALS['__l10n']['Import a WordPress installation into your current blog.'] = 'Importe un blog WordPress dans votre blog en cours.'; -$GLOBALS['__l10n']['This will import your WordPress content as new content in the current blog: %s.'] = 'Ceci va importer votre blog WordPress comme un nouveau contenu dans le blog en cours : %s.'; -$GLOBALS['__l10n']['We first need some information about your old WordPress installation.'] = 'Nous avons d\'abord besoin de renseignements à propos de votre ancienne installation WordPress.'; -$GLOBALS['__l10n']['WordPress and Dotclear\'s handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like "One category, several tags." Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix.'] = 'WordPress et Dotclear gèrent les catégories différemment. Dans WordPress, un article peut être classé dans plusieurs catégories, alors que dans Dotclear, on voit ça plutôt comme "Une catégorie, plusieurs mots-clefs." Dotclear ne peut donc importer qu\'une seule catégorie par article et choisira dans ce cas la première créée. Si vous désirez garder une trace de chaque catégorie, vous pouvez les importer en tant que mots-clefs, avec un préfixe optionnel.'; -$GLOBALS['__l10n']['On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised "Uncategorized". If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized.'] = 'Par contre, il est impossible dans WordPress de ne pas assigner une catégorie à un article, c\'est pourquoi lors de l\'installation est créée une première catégorie appelée "Non classée". Si vous n\'avez pas modifié cette catégorie, l\'importation peut simplement l\'ignorer. En effet, Dotclear vous permet d\'avoir des articles sans catégorie.'; -$GLOBALS['__l10n']['Ignore the first category:'] = 'Ignorer la première catégorie :'; -$GLOBALS['__l10n']['Import lowest numbered category on posts:'] = 'Importer la catégorie la plus ancienne sur les articles :'; -$GLOBALS['__l10n']['Import all categories as tags:'] = 'Importer les catégories comme des tags :'; -$GLOBALS['__l10n']['Prefix such tags with:'] = 'Préfixer ces tags avec :'; -$GLOBALS['__l10n']['Content filters'] = 'Filtres de contenu'; -$GLOBALS['__l10n']['You may want to process your post and/or comment content with the following filters.'] = 'Vous pouvez utiliser les filtres suivants sur vos articles et/ou commentaires.'; -$GLOBALS['__l10n']['Post content formatter:'] = 'Formatage des articles :'; -$GLOBALS['__l10n']['Comment content formatter:'] = 'Formatage des commentaires :'; -$GLOBALS['__l10n']['WordPress tables not found'] = 'Tables WordPress non trouvées'; -$GLOBALS['__l10n']['No file to read.'] = 'Aucun fichier lisible.'; -$GLOBALS['__l10n']['File is not a DotClear backup.'] = 'Le fichier n\'est pas une sauvegarde DotClear.'; -$GLOBALS['__l10n']['File is not a single blog export.'] = 'Le fichier n\'est pas un fichier d\'export simple.'; -$GLOBALS['__l10n']['File is not a full export.'] = 'Le fichier n\'est pas un fichier d\'export complet.'; -$GLOBALS['__l10n']['Please wait...'] = 'Veuillez patienter...'; -$GLOBALS['__l10n']['Import'] = 'Importer'; -$GLOBALS['__l10n']['Maintenance'] = 'Maintenance'; -$GLOBALS['__l10n']['Optimization successful.'] = 'Optimisation réalisée avec succès.'; -$GLOBALS['__l10n']['Comments and trackback counted.'] = 'Commentaires et rétroliens comptés.'; -$GLOBALS['__l10n']['Templates cache directory emptied.'] = 'Répertoire du cache des templates vidé.'; -$GLOBALS['__l10n']['Indexing entry %d to %d.'] = 'Index des billets %d à %d'; -$GLOBALS['__l10n']['next'] = 'suivant'; -$GLOBALS['__l10n']['Entries index done.'] = 'Index des billets complet.'; -$GLOBALS['__l10n']['Back'] = 'Retour'; -$GLOBALS['__l10n']['Indexing comment %d to %d.'] = 'Index des commentaires %d à %d'; -$GLOBALS['__l10n']['Comments index done.'] = 'Index des commentaires complet.'; -$GLOBALS['__l10n']['Optimize database room'] = 'Optimiser l\'espace de la base de donnée'; -$GLOBALS['__l10n']['Vacuum tables'] = 'Nettoyer les tables'; -$GLOBALS['__l10n']['Counters'] = 'Compteurs'; -$GLOBALS['__l10n']['Reset comments and ping counters'] = 'Réinitialiser les compteurs des commentaires et rétroliens'; -$GLOBALS['__l10n']['Search engine index'] = 'Index du moteur de recherche'; -$GLOBALS['__l10n']['This may take a very long time'] = 'Ceci peut prendre beaucoup de temps'; -$GLOBALS['__l10n']['Index all posts'] = 'Indexer tous les billets'; -$GLOBALS['__l10n']['Index all comments'] = 'Indexer tous les commentaires'; -$GLOBALS['__l10n']['Empty templates cache directory'] = 'Vider le répertoire du cache des templates'; -$GLOBALS['__l10n']['Empty directory'] = 'Vider le répertoire'; -$GLOBALS['__l10n']['Tags'] = 'Tags'; -$GLOBALS['__l10n']['Tags:'] = 'Tags :'; -$GLOBALS['__l10n']['Are you sure you want to remove this %s?'] = 'Ãtes vous certain de vouloir supprimer ce %s ?'; -$GLOBALS['__l10n']['Add a %s to this entry'] = 'Ajouter un %s à ce billet'; -$GLOBALS['__l10n']['Choose from list'] = 'Choisir depuis la liste'; -$GLOBALS['__l10n']['all'] = 'tous'; -$GLOBALS['__l10n']['Tag'] = 'Tag'; -$GLOBALS['__l10n']['add tags'] = 'ajouter des tags'; -$GLOBALS['__l10n']['remove tags'] = 'supprimer des tags'; -$GLOBALS['__l10n']['Add tags to entries'] = 'Ajouter des tags aux billets'; -$GLOBALS['__l10n']['Tags to add:'] = 'Tags à ajouter :'; -$GLOBALS['__l10n']['Remove selected tags from entries'] = 'Supprimer les tags sélectionnés des billets'; -$GLOBALS['__l10n']['No tags for selected entries'] = 'Aucun tag pour les billets sélectionnés'; -$GLOBALS['__l10n']['Following tags have been found in selected entries:'] = 'Les tags suivants ont été trouvés dans les billets sélectionnés :'; -$GLOBALS['__l10n']['This tag\'s comments Atom feed'] = 'Fil Atom des commentaires de ce tag'; -$GLOBALS['__l10n']['This tag\'s entries Atom feed'] = 'Fil Atom des billets de ce tag'; -$GLOBALS['__l10n']['All tags'] = 'Tous les tags'; -$GLOBALS['__l10n']['Limit (empty means no limit):'] = 'Limite (laisser vide pour aucune limite)'; -$GLOBALS['__l10n']['Entries count'] = 'Nombre de billets'; -$GLOBALS['__l10n']['Tag name'] = 'Nom du tag'; -$GLOBALS['__l10n']['Edit tag'] = 'Modifier un tag'; -$GLOBALS['__l10n']['Tag has been successfully renamed'] = 'Tag renommé avec succès'; -$GLOBALS['__l10n']['Back to tags list'] = 'Retour à la liste des tags'; -$GLOBALS['__l10n']['Rename this tag:'] = 'Renommer ce tag :'; -$GLOBALS['__l10n']['Delete this tag'] = 'Supprimer ce tag'; -$GLOBALS['__l10n']['Tag has been successfully removed'] = 'Tag supprimé avec succès'; -$GLOBALS['__l10n']['entries'] = 'billets'; -$GLOBALS['__l10n']['No tags on this blog.'] = 'Aucun tag sur ce blog'; -$GLOBALS['__l10n']['Pages'] = 'Pages'; -$GLOBALS['__l10n']['manage pages'] = 'gérer les pages'; -$GLOBALS['__l10n']['Published on'] = 'Publié le'; -$GLOBALS['__l10n']['This page\'s comments feed'] = 'Fil des commentaires de cette page'; -$GLOBALS['__l10n']['You must provide a valid email address.'] = 'Vous devez indiquer une adresse email valide.'; -$GLOBALS['__l10n']['Page title'] = 'Titre de la page'; -$GLOBALS['__l10n']['Page position'] = 'Position de la page'; -$GLOBALS['__l10n']['Publication date'] = 'Date de publication'; -$GLOBALS['__l10n']['No page'] = 'Aucune page'; -$GLOBALS['__l10n']['Are you sure you want to delete selected pages?'] = 'Ãtes-vous certain de vouloir supprimer les pages sélectionnées ?'; -$GLOBALS['__l10n']['New page'] = 'Nouvelle page'; -$GLOBALS['__l10n']['Selected pages action:'] = 'Action sur les pages sélectionnées :'; -$GLOBALS['__l10n']['This page does not exist.'] = 'Cette page n\'existe pas.'; -$GLOBALS['__l10n']['Edit page'] = 'Modifier la page'; -$GLOBALS['__l10n']['next page'] = 'page suivante'; -$GLOBALS['__l10n']['previous page'] = 'page précédente'; -$GLOBALS['__l10n']['Are you sure you want to delete this page?'] = 'Ãtes-vous certain de vouloir supprimer cette pages ?'; -$GLOBALS['__l10n']['Page has been successfully updated.'] = 'La page a été mise à jour avec succès.'; -$GLOBALS['__l10n']['Page has been successfully created.'] = 'La page a été créée avec succès.'; -$GLOBALS['__l10n']['View page'] = 'Voir la page'; -$GLOBALS['__l10n']['Preview page'] = 'Prévisualiser la page'; -$GLOBALS['__l10n']['Page status:'] = 'Ãtat de la page :'; -$GLOBALS['__l10n']['Page position:'] = 'Position de la page :'; -$GLOBALS['__l10n']['Page lang:'] = 'Langue de la page :'; -$GLOBALS['__l10n']['Page password:'] = 'Mot de passe de la page :'; -$GLOBALS['__l10n']['Warning: If you set the URL manually, it may conflict with another page.'] = 'Attention : si vous indiquez l\'URL manuellement, celle-ci peut entrer en conflit avec une autre page.'; -$GLOBALS['__l10n']['Add files to this page'] = 'Ajouter un fichier à la page'; -$GLOBALS['__l10n']['Pings'] = 'Pings'; -$GLOBALS['__l10n']['Pings configuration'] = 'Configuration des pings'; -$GLOBALS['__l10n']['Settings have been successfully updated.'] = 'Paramètres enregistrés avec succès.'; -$GLOBALS['__l10n']['Activate pings extension'] = 'Activer le module de ping'; -$GLOBALS['__l10n']['Service name:'] = 'Nom du service :'; -$GLOBALS['__l10n']['Service URI:'] = 'URI du service :'; -$GLOBALS['__l10n']['error'] = 'erreur'; -$GLOBALS['__l10n']['Test ping services'] = 'Tester les services de ping'; -$GLOBALS['__l10n']['Pings:'] = 'Pings :'; -$GLOBALS['__l10n']['Theme Editor'] = 'Ãditeur de thème'; -$GLOBALS['__l10n']['No file'] = 'Aucun fichier'; -$GLOBALS['__l10n']['File does not exist.'] = 'Le fichier n\'existe pas.'; -$GLOBALS['__l10n']['File %s is not readable'] = 'Le fichier %s n\'est pas lisible'; -$GLOBALS['__l10n']['Unable to write file %s. Please check your theme files and folders permissions.'] = 'Impossible d\'écrire le fichier %s. Veuillez vérifier les permissions des fichiers et répertoires de votre thème.'; -$GLOBALS['__l10n']['Saving document...'] = 'Sauvegarde du document...'; -$GLOBALS['__l10n']['Document saved'] = 'Document sauvegardé'; -$GLOBALS['__l10n']['An error occurred:'] = 'Une erreur s\'est produite :'; -$GLOBALS['__l10n']['Your current theme on this blog is "%s".'] = 'Le thème utilisé actuellement sur votre blog est "%s".'; -$GLOBALS['__l10n']['You can\'t edit default theme.'] = 'Vous ne pouvez pas modifier le thème par défaut.'; -$GLOBALS['__l10n']['Please select a file to edit.'] = 'Veuillez sélectionner un fichier à modifier.'; -$GLOBALS['__l10n']['File editor'] = 'Ãditeur de fichier'; -$GLOBALS['__l10n']['Editing file %s'] = 'Modification du fichier %s'; -$GLOBALS['__l10n']['This file is not writable. Please check your theme files permissions.'] = 'Ce fichier ne peut pas être modifié. Veuillez vérifier les permissions des fichiers de votre thème.'; -$GLOBALS['__l10n']['Templates files'] = 'Fichiers template'; -$GLOBALS['__l10n']['CSS files'] = 'Fichiers CSS'; -$GLOBALS['__l10n']['JavaScript files'] = 'Fichiers JavaScript'; -$GLOBALS['__l10n']['Presentation widgets'] = 'Widgets de présentation'; -$GLOBALS['__l10n']['Search engine'] = 'Moteur de recherche'; -$GLOBALS['__l10n']['Navigation links'] = 'Liens de navigation'; -$GLOBALS['__l10n']['Selected entries'] = 'Billets sélectionnés'; -$GLOBALS['__l10n']['Best of me'] = 'à retenir'; -$GLOBALS['__l10n']['Blog languages'] = 'Langues du blog'; -$GLOBALS['__l10n']['With entries counts'] = 'Afficher le nombre de billets'; -$GLOBALS['__l10n']['Subscribe links'] = 'Liens d\'abonnement'; -$GLOBALS['__l10n']['Subscribe'] = 'S\'abonner'; -$GLOBALS['__l10n']['Feeds type:'] = 'Types de fil :'; -$GLOBALS['__l10n']['Feed reader'] = 'Lecteur de fils de nouvelles'; -$GLOBALS['__l10n']['Somewhere else'] = 'Ailleurs'; -$GLOBALS['__l10n']['Entries limit:'] = 'Nombre de billets maximum :'; -$GLOBALS['__l10n']['Text'] = 'Texte'; -$GLOBALS['__l10n']['Text:'] = 'Texte :'; -$GLOBALS['__l10n']['Last entries'] = 'Derniers billets'; -$GLOBALS['__l10n']['Uncategorized'] = 'Non catégorisé'; -$GLOBALS['__l10n']['Tag:'] = 'Tag :'; -$GLOBALS['__l10n']['Last comments'] = 'Derniers commentaires'; -$GLOBALS['__l10n']['Comments limit:'] = 'Nombre de commentaires maximum :'; -$GLOBALS['__l10n']['Home'] = 'Accueil'; -$GLOBALS['__l10n']['Archives'] = 'Archives'; -$GLOBALS['__l10n']['This blog\'s entries %s feed'] = 'Fil %s des billets de ce blog'; -$GLOBALS['__l10n']['This blog\'s comments %s feed'] = 'Fil %s des commentaires de ce blog'; -$GLOBALS['__l10n']['Entries feed'] = 'Fil des billets'; -$GLOBALS['__l10n']['Comments feed'] = 'Fil des commentaires'; -$GLOBALS['__l10n']['navigation'] = 'navigation'; -$GLOBALS['__l10n']['extra'] = 'extra'; -$GLOBALS['__l10n']['Widgets'] = 'Widgets'; -$GLOBALS['__l10n']['Are you sure you want to reset sidebars?'] = 'Ãtes-vous certain de vouloir réinitialiser les bandeaux ?'; -$GLOBALS['__l10n']['Available widgets'] = 'Widgets disponibles'; -$GLOBALS['__l10n']['Append to:'] = 'Ajouter à  :'; -$GLOBALS['__l10n']['add widgets to sidebars'] = 'ajouter les widgets aux bandeaux'; -$GLOBALS['__l10n']['Navigation sidebar'] = 'Bandeau de navigation'; -$GLOBALS['__l10n']['Extra sidebar'] = 'Bandeau d\'extra'; -$GLOBALS['__l10n']['update sidebars'] = 'Mettre à jour les bandeaux'; -$GLOBALS['__l10n']['reset sidebars'] = 'Réinitialiser les bandeaux'; -$GLOBALS['__l10n']['Widget templates tags'] = 'Marqueurs de template des widgets'; -$GLOBALS['__l10n']['If you are allowed to edit your theme templates, you can directly add widgets as templates tags, with their own configuration.'] = 'Si vous avez le droit de modifier les templates de votre thème, vous pouvez directement ajouter des widgets à l\'aide de marqueurs de template, avec leur propre configuration.'; -$GLOBALS['__l10n']['To add a widget in your template, you need to write code like this:'] = 'Pour ajouter un widget dans votre template, vous devez écrire un code comme ceci :'; -$GLOBALS['__l10n']['Widget ID'] = 'Identifiant du widget'; -$GLOBALS['__l10n']['Setting name'] = 'Nom du paramètre'; -$GLOBALS['__l10n']['Setting value'] = 'Valeur du paramètre'; -$GLOBALS['__l10n']['Here are the following available widgets for your blog:'] = 'Voici les widgets disponibles pour votre blog :'; -$GLOBALS['__l10n']['Widget ID:'] = 'Identifiant du widget :'; -$GLOBALS['__l10n']['No setting for this widget'] = 'Aucun paramètre pour ce widget'; -$GLOBALS['__l10n']['Setting name:'] = 'Nom du paramètre :'; -$GLOBALS['__l10n']['No widget.'] = 'Aucun widget.'; -$GLOBALS['__l10n']['order'] = 'ordre'; -$GLOBALS['__l10n']['Remove widget'] = 'Supprimer le widget'; -?> \ No newline at end of file +L10n::$locales['Cope with old core classes (< 2.26)'] = 'Compatibilité avec les classes obsolètes (< 2.26)'; +L10n::$locales['Generic antispam plugin for Dotclear'] = 'Antispam générique pour Dotclear'; +L10n::$locales['Akismet interface for Dotclear'] = 'Interface Akismet pour Dotclear'; +L10n::$locales['Trackback validity check'] = 'Contrôle de validité des rétroliens'; +L10n::$locales['Manage post attachments'] = 'Gestion des fichiers attachés'; +L10n::$locales['Serve entries as simple web pages'] = 'Publie des billets comme de simples pages web'; +L10n::$locales['Manage every blog configuration directive'] = 'Gestion des directives de configuration des blogs'; +L10n::$locales['dotclear legacy editor'] = 'éditeur standard de Dotclear'; +L10n::$locales['Theme Editor'] = 'Ãditeur de thème'; +L10n::$locales['Simple menu for Dotclear'] = 'Menu simple pour Dotclear'; +L10n::$locales['Import and Export your blog'] = 'Importez et exportez votre blog'; +L10n::$locales['Manage every user preference directive'] = 'Gestion des préférences utilisateur·rice'; +L10n::$locales['dotclear CKEditor integration'] = 'éditeur CKEditor pour Dotclear'; +L10n::$locales['Maintain your installation'] = 'Maintenez votre installation'; +L10n::$locales['Breadcrumb for Dotclear'] = 'Fil d\'Ariane pour Dotclear'; +L10n::$locales['Manage your blogroll'] = 'Gestion de votre liste de liens'; +L10n::$locales['Ping services'] = 'Services de signalement'; +L10n::$locales['Tags for posts'] = 'Mots-clés pour les billets'; +L10n::$locales['Widgets for your blog sidebars'] = 'Widgets pour les volets de votre blog'; +L10n::$locales['Cope with function/method footprint V1 (< 2.24, 2.25)'] = 'Compatibilité avec les signatures de fonctions/méthodes V1 (< 2.24, 2.25)'; +L10n::$locales['Search engine form'] = 'Formulaire de recherche'; +L10n::$locales['List of navigation links'] = 'Liste des liens de navigation'; +L10n::$locales['List of selected entries'] = 'Liste des billets sélectionnés'; +L10n::$locales['List of available languages'] = 'Liste des langues disponibles'; +L10n::$locales['List of categories'] = 'Liste des catégories'; +L10n::$locales['Feed subscription links (RSS or Atom)'] = 'Liens de souscription aux flux (RSS ou Atom)'; +L10n::$locales['List of last entries from feed (RSS or Atom)'] = 'Liste des derniers billets d\'un flux (RSS ou Atom)'; +L10n::$locales['Simple text'] = 'Texte simple'; +L10n::$locales['List of last entries published'] = 'Liste des derniers billets publiés'; +L10n::$locales['List of last comments published'] = 'Liste des derniers commentaires publiés'; +L10n::$locales['List of published pages'] = 'Liste des pages publiées'; +L10n::$locales['List of simple menu items'] = 'Liste des éléments de menu simple'; +L10n::$locales['Blogroll list'] = 'Liste de liens'; +L10n::$locales['Tags cloud'] = 'Nuage de mots-clés'; +L10n::$locales['about:config'] = 'about:config'; +L10n::$locales['Configuration successfully updated'] = 'La configuration a été mise à jour'; +L10n::$locales['Settings for %s'] = 'Réglages pour %s'; +L10n::$locales['Global settings'] = 'Réglages généraux'; +L10n::$locales['Setting ID'] = 'ID de paramètre'; +L10n::$locales['Value'] = 'Valeur'; +L10n::$locales['Description'] = 'Description'; +L10n::$locales['Goto:'] = 'Aller à  :'; +L10n::$locales['no'] = 'non'; +L10n::$locales['yes'] = 'oui'; +L10n::$locales['Akismet spam filter'] = 'Filtre d\'indésirable Akismet'; +L10n::$locales['Filtered by %s.'] = 'Filtré par %s.'; +L10n::$locales['Filter configuration have been successfully saved.'] = 'La configuration du filtre a été enregistrée.'; +L10n::$locales['Akismet API key:'] = 'Clé API Akismet :'; +L10n::$locales['API key verified'] = 'Clé API vérifiée'; +L10n::$locales['API key not verified'] = 'Clé API non vérifiée'; +L10n::$locales['Get your own API key'] = 'Obtenez votre propre clé API'; +L10n::$locales['Akismet'] = 'Akismet'; +L10n::$locales['This comment is a spam:'] = 'Ce commentaire est indésirable :'; +L10n::$locales['(including %d spam comment)'] = '(dont %d indésirable)'; +L10n::$locales['(including %d spam comments)'] = '(dont %d indésirables)'; +L10n::$locales['Antispam'] = 'Antispam'; +L10n::$locales['All spam comments older than %s day(s) will be automatically deleted.'] = 'Tous les commentaires indésirables âgés d\'au moins %s jour(s) seront supprimés automatiquement.'; +L10n::$locales['You can modify this duration in the %s'] = 'Vous pouvez modifier cette durée dans les %s'; +L10n::$locales['Delete junk comments older than'] = 'Supprimer les commentaires indésirables âgés de plus de'; +L10n::$locales['days'] = 'jours'; +L10n::$locales['Set -1 to disabled this feature ; Leave empty to use default 7 days delay.'] = 'Mettez -1 pour désactiver cette fonction ; laissez vide pour utiliser le délai de 7 jours par défaut.'; +L10n::$locales['Set spam filters.'] = 'Régler les filtres de spam.'; +L10n::$locales['IP Blocklist / Allowlist Filter'] = 'Filtre de liste de blocage et d\'autorisation d\'IP'; +L10n::$locales['Filtered by %1$s with rule %2$s.'] = 'Filtré par %1$s avec la règle %2$s.'; +L10n::$locales['IP address has been successfully added.'] = 'L\'adresse IP a été ajoutée.'; +L10n::$locales['IP addresses have been successfully removed.'] = 'L\'adresse IP a été retirée.'; +L10n::$locales['Blocklist'] = 'Liste de blocage'; +L10n::$locales['Allowlist'] = 'Liste d\'autorisation'; +L10n::$locales['Add an IP address: '] = 'Ajouter une adresse IP : '; +L10n::$locales['Global IP (used for all blogs)'] = 'IP globale (valable pour tous les blogs)'; +L10n::$locales['Add'] = 'Ajouter'; +L10n::$locales['No IP address in list.'] = 'Pas d\'adresse IP dans la liste.'; +L10n::$locales['IP list'] = 'Liste IP'; +L10n::$locales['Local IPs (used only for this blog)'] = 'IP locales (valables seulement pour ce blog)'; +L10n::$locales['Global IPs (used for all blogs)'] = 'IP globales (valables pour tous les blogs)'; +L10n::$locales['Checks sender IP address against DNSBL servers'] = 'Contrôle l\'adresse IP de l\'émetteur·rice via les serveurs DNSBL'; +L10n::$locales['Filtered by %1$s with server %2$s.'] = 'Filtré par %1$s par le serveur %2$s.'; +L10n::$locales['The list of DNSBL servers has been succesfully updated.'] = 'La liste des serveurs DNSBL a été mise à jour.'; +L10n::$locales['IP Lookup servers'] = 'Serveurs de contrôle d\'IP'; +L10n::$locales['Add here a coma separated list of servers.'] = 'Ajouter ici la liste des serveurs séparés par des virgules.'; +L10n::$locales['IP v6 Blocklist / Allowlist Filter'] = 'Filtre de liste de blocage et d\'autorisation d\'IP v6'; +L10n::$locales['Checks links in comments against surbl.org'] = 'Contrôle les liens des commentaires via surbl.org'; +L10n::$locales['Words Blocklist'] = 'Liste de mots interdits'; +L10n::$locales['Filtered by %1$s with word %2$s.'] = 'Filtré par %1$s à cause du mot %2$s.'; +L10n::$locales['Words have been successfully added.'] = 'Les mots ont été ajoutés.'; +L10n::$locales['Word has been successfully added.'] = 'Le mot a été ajouté.'; +L10n::$locales['Words have been successfully removed.'] = 'Les mots ont été retirés.'; +L10n::$locales['Add a word '] = 'Ajouter un mot '; +L10n::$locales['Global word (used for all blogs)'] = 'Mot global (valable pour tous les blogs)'; +L10n::$locales['No word in list.'] = 'Aucun mot dans la liste.'; +L10n::$locales['List of bad words'] = 'Liste de mots interdits'; +L10n::$locales['Local words (used only for this blog)'] = 'Mots locaux (valables seulement pour ce blog)'; +L10n::$locales['Global words (used for all blogs)'] = 'Mots globaux (valables pour tous les blogs)'; +L10n::$locales['Delete selected words'] = 'Supprimer les mots sélectionnés'; +L10n::$locales['Create default wordlist'] = 'Créer une liste de mots par défaut'; +L10n::$locales['This word exists'] = 'Ce mot est déjà présent'; +L10n::$locales['Spam moderation'] = 'Modération des indésirables'; +L10n::$locales['Spam'] = 'Indésirable'; +L10n::$locales['Ham'] = 'Désirable'; +L10n::$locales['Filter does not exist.'] = 'Ce filtre n\'existe pas.'; +L10n::$locales['Filter has no user interface.'] = 'Ce filtre n\'a pas de réglages.'; +L10n::$locales['Filters configuration has been successfully saved.'] = 'La configuration des filtres a été enregistrée.'; +L10n::$locales['%s configuration'] = 'Configuration de %s'; +L10n::$locales['%s filter configuration'] = 'Configuration du filtre %s'; +L10n::$locales['Back to filters list'] = 'Retour à la liste des filtres'; +L10n::$locales['Information'] = 'Informations'; +L10n::$locales['Junk comments:'] = 'Commentaires indésirables :'; +L10n::$locales['Published comments:'] = 'Commentaires publiés :'; +L10n::$locales['Available spam filters'] = 'Filtres d\'indésirable disponibles'; +L10n::$locales['Order'] = 'Ordre'; +L10n::$locales['Active'] = 'Actif'; +L10n::$locales['Auto Del.'] = 'Auto suppr.'; +L10n::$locales['Filter name'] = 'Nom du filtre'; +L10n::$locales['Filter configuration'] = 'Configuration du filtre'; +L10n::$locales['position'] = 'position'; +L10n::$locales['Syndication'] = 'Syndication'; +L10n::$locales['Junk comments RSS feed'] = 'Fil RSS des commentaires indésirables'; +L10n::$locales['Published comments RSS feed'] = 'Fil RSS des commentaires publiés'; +L10n::$locales['No description'] = 'Pas de description'; +L10n::$locales['Filtered by %1$s (%2$s)'] = 'Filtré par %1$s (%2$s)'; +L10n::$locales['Unknown filter.'] = 'Filtre inconnu.'; +L10n::$locales['attachments'] = 'pièces jointes'; +L10n::$locales['Attachments (%d)'] = 'Annexes (%d)'; +L10n::$locales['remove'] = 'supprimer'; +L10n::$locales['No attachment.'] = 'Pas de fichier attaché.'; +L10n::$locales['Add files to this entry'] = 'Ajouter des fichiers à la page'; +L10n::$locales['Blogroll'] = 'Liste des liens'; +L10n::$locales['manage blogroll'] = 'Gestion de la liste des liens'; +L10n::$locales['You must provide a link title'] = 'Vous devez fournir un titre de lien'; +L10n::$locales['You must provide a link URL'] = 'Vous devez fournir une URL de lien'; +L10n::$locales['Nothing to import'] = 'Rien à importer'; +L10n::$locales['links have been successfully imported.'] = 'Les liens ont été importés.'; +L10n::$locales['Import operation cancelled.'] = 'L\'importation a été annulée.'; +L10n::$locales['Link has been successfully created.'] = 'Le lien a été créé.'; +L10n::$locales['category has been successfully created.'] = 'La catégorie a été créée.'; +L10n::$locales['Items have been successfully removed.'] = 'Les éléments ont été retirés.'; +L10n::$locales['Items order has been successfully updated'] = 'L\'ordre des éléments a été mis à jour.'; +L10n::$locales['Lang'] = 'Langue'; +L10n::$locales['select this link'] = 'sélectionner ce lien'; +L10n::$locales['Are you sure you want to delete selected links?'] = 'Ãtes-vous sûr·e de vouloir supprimer ces liens ?'; +L10n::$locales['Delete selected links'] = 'Supprimer les liens sélectionnés'; +L10n::$locales['The link list is empty.'] = 'La liste des liens est vide.'; +L10n::$locales['Add a new link'] = 'Ajouter un nouveau lien'; +L10n::$locales['Add a category'] = 'Ajouter une catégorie'; +L10n::$locales['Import links'] = 'Importer des liens'; +L10n::$locales['OPML or XBEL File:'] = 'Fichier OPML ou XBEL :'; +L10n::$locales['Import'] = 'Importer'; +L10n::$locales['No such link or title'] = 'Pas de lien ou de titre'; +L10n::$locales['Link has been successfully updated'] = 'Le lien a été mis à jour.'; +L10n::$locales['Category has been successfully updated'] = 'La catégorie a été mise à jour.'; +L10n::$locales['Return to blogroll'] = 'Retourner à la liste des liens'; +L10n::$locales['Edit category'] = 'Modifier la catégorie'; +L10n::$locales['Edit link'] = 'Modifier le lien'; +L10n::$locales['XFN information'] = 'Informations XFN'; +L10n::$locales['More information on Wikipedia website'] = 'Plus d\'information sur le site Wikipedia'; +L10n::$locales['_xfn_Me'] = 'Identité'; +L10n::$locales['_xfn_Another link for myself'] = 'Une autre de mes adresses Web'; +L10n::$locales['_xfn_Friendship'] = 'Amitié'; +L10n::$locales['_xfn_Contact'] = 'Contact'; +L10n::$locales['_xfn_Acquaintance'] = 'Connaissance'; +L10n::$locales['_xfn_Friend'] = 'Ami·e'; +L10n::$locales['_xfn_Physical'] = 'Physique'; +L10n::$locales['_xfn_Met'] = 'Rencontré·e'; +L10n::$locales['_xfn_Professional'] = 'Professionnel'; +L10n::$locales['_xfn_Co-worker'] = 'Collègue de travail'; +L10n::$locales['_xfn_Colleague'] = 'ConsÅur ou Confrère'; +L10n::$locales['_xfn_Geographical'] = 'Géographique'; +L10n::$locales['_xfn_Co-resident'] = 'Colocataire'; +L10n::$locales['_xfn_Neighbor'] = 'Voisin'; +L10n::$locales['_xfn_Family'] = 'Famille'; +L10n::$locales['_xfn_Child'] = 'Enfant'; +L10n::$locales['_xfn_Parent'] = 'Parent'; +L10n::$locales['_xfn_Sibling'] = 'SÅur/frère'; +L10n::$locales['_xfn_Spouse'] = 'Conjoint·e'; +L10n::$locales['_xfn_Kin'] = 'Famille'; +L10n::$locales['_xfn_Romantic'] = 'Romantique'; +L10n::$locales['_xfn_Muse'] = 'Muse'; +L10n::$locales['_xfn_Crush'] = 'Coup de foudre'; +L10n::$locales['_xfn_Date'] = 'Petit·e ami·e'; +L10n::$locales['_xfn_Sweetheart'] = 'Ãtre aimé'; +L10n::$locales['You need to provide a XBEL or OPML file.'] = 'Vous devez fournir un fichier XBEL ou OPML.'; +L10n::$locales['File is not in XML format.'] = 'Ce fichier n\'est pas au format XML.'; +L10n::$locales['All categories'] = 'Toutes les catégories'; +L10n::$locales['Links'] = 'Liens'; +L10n::$locales['Breadcrumb'] = 'Fil d\'Ariane'; +L10n::$locales['Enable breadcrumb for this blog'] = 'Activer l\'affichage du fil d\'Ariane pour ce blog'; +L10n::$locales['The {{tpl:Breadcrumb [separator=" › "]}} tag should be present (or inserted if not) in the template.'] = 'La balise {{tpl:Breadcrumb [separator=" › "]}} doit être présente (ou insérée dans le cas contraire) dans le ou les fichiers template du thème.'; +L10n::$locales['Do not encapsulate breadcrumb in a <p id="breadcrumb">...</p> tag.'] = 'Ne pas encadrer le fil d\'Ariane avec une balise <p id="breadcrumb">...</p>.'; +L10n::$locales['Home'] = 'Accueil'; +L10n::$locales['page %d'] = 'page %d'; +L10n::$locales['Archives'] = 'Archives'; +L10n::$locales['All tags'] = 'Tous les mots-clés'; +L10n::$locales['404'] = '404'; +L10n::$locales['Generate fake l10n'] = 'Générer un faux l10n'; +L10n::$locales['fake l10n file generated.'] = 'faux fichier l10n généré.'; +L10n::$locales['Failed to generate fake l10n file.'] = 'Ãchec de la génération d\'un faux fichier l10n.'; +L10n::$locales['Generate a php file that contents strings to translate that are not be done with core tools.'] = 'Générer un fichier php qui contient des chaînes à traduire qui ne peuvent pas être traduites avec les outils de base.'; +L10n::$locales['dcCKEditor'] = 'dcCKEditor'; +L10n::$locales['HTML'] = 'HTML'; +L10n::$locales['Media chooser'] = 'Sélecteur de média'; +L10n::$locales['m'] = 'm'; +L10n::$locales['Link to an entry'] = 'Lien vers une publication'; +L10n::$locales['Link'] = 'Lien'; +L10n::$locales['l'] = 'l'; +L10n::$locales['External image'] = 'Image externe'; +L10n::$locales['URL field cannot be empty.'] = 'Le champ URL ne peut être vide.'; +L10n::$locales['The configuration has been updated.'] = 'La configuration a été enregistrée.'; +L10n::$locales['Note(s)'] = 'Note(s)'; +L10n::$locales['Settings'] = 'Réglages'; +L10n::$locales['Plugin activation'] = 'Activation'; +L10n::$locales['Enable dcCKEditor plugin'] = 'Activer le plugin dcCKEditor'; +L10n::$locales['Add alignment buttons'] = 'Ajouter les boutons d\'alignement'; +L10n::$locales['Add lists buttons'] = 'Ajouter les boutons de listes'; +L10n::$locales['Add text color button'] = 'Ajouter le bouton pour changer la couleur du texte'; +L10n::$locales['Add background text color button'] = 'Ajouter le bouton pour changer la couleur de fond du texte'; +L10n::$locales['Custom colors list:'] = 'Liste de couleurs personnalisée :'; +L10n::$locales['Add colors without # separated by a comma.'] = 'Listez les couleurs sans # ni espaces, séparées par des virgules.'; +L10n::$locales['Leave empty to use the default palette:'] = 'Laissez vide pour utiliser la palette par défaut :'; +L10n::$locales['Example of custom color list:'] = 'Exemple de liste de couleurs personnalisée :'; +L10n::$locales['Colors per row in palette:'] = 'Nombre de couleurs par ligne dans la palette :'; +L10n::$locales['Valid range: 4 to 16'] = 'Valeurs autorisées : 4 à 16'; +L10n::$locales['Add collapse button'] = 'Ajouter le bouton pour masquer les boutons'; +L10n::$locales['Add format selection'] = 'Ajouter le bouton pour ajouter les formats'; +L10n::$locales['Custom formats'] = 'Formats personnalisés'; +L10n::$locales['Default formats are p;h1;h2;h3;h4;h5;h6;pre;address'] = 'Les formats par défaut sont p;h1;h2;h3;h4;h5;h6;pre;address'; +L10n::$locales['Add table button'] = 'Ajouter le bouton pour ajouter des tableaux'; +L10n::$locales['Add clipboard buttons'] = 'Ajouter les boutons de copier/coller'; +L10n::$locales['Copy, Paste, Paste Text, Paste from Word'] = 'Copier, Coller, Coller sans mise en forme, Copier depuis word'; +L10n::$locales['Add undo/redo buttons'] = 'Ajouter les boutons défaire/refaire'; +L10n::$locales['Disables the built-in spell checker if the browser provides one'] = 'Désactiver la vérification orthographique si le navigateur en fournit un'; +L10n::$locales['Save configuration'] = 'Enregistrer la configuration'; +L10n::$locales['dcLegacyEditor'] = 'éditeur standard de Dotclear'; +L10n::$locales['Dotclear wiki'] = 'Wiki Dotclear'; +L10n::$locales['visual'] = 'visuel'; +L10n::$locales['source'] = 'source'; +L10n::$locales['You can use the following shortcuts to format your text.'] = 'Vous pouvez utiliser les raccourcis suivants pour formater votre texte.'; +L10n::$locales['Block format'] = 'Format de bloc'; +L10n::$locales['-- none --'] = '-- aucun --'; +L10n::$locales['-- block format --'] = '-- format de bloc --'; +L10n::$locales['Paragraph'] = 'Paragraphe'; +L10n::$locales['Level 1 header'] = 'Entête de niveau 1'; +L10n::$locales['Level 2 header'] = 'Entête de niveau 2'; +L10n::$locales['Level 3 header'] = 'Entête de niveau 3'; +L10n::$locales['Level 4 header'] = 'Entête de niveau 4'; +L10n::$locales['Level 5 header'] = 'Entête de niveau 5'; +L10n::$locales['Level 6 header'] = 'Entête de niveau 6'; +L10n::$locales['Strong emphasis'] = 'Emphase forte'; +L10n::$locales['Emphasis'] = 'Emphase'; +L10n::$locales['Inserted'] = 'Inséré'; +L10n::$locales['Deleted'] = 'Supprimé'; +L10n::$locales['Inline quote'] = 'Citation en ligne'; +L10n::$locales['Code'] = 'Code'; +L10n::$locales['Line break'] = 'Retour à la ligne'; +L10n::$locales['Blockquote'] = 'Bloc de citation'; +L10n::$locales['Preformated text'] = 'Texte préformaté'; +L10n::$locales['Unordered list'] = 'Liste non ordonnée'; +L10n::$locales['Ordered list'] = 'Liste ordonnée'; +L10n::$locales['URL?'] = 'URL ?'; +L10n::$locales['Language?'] = 'Langue ?'; +L10n::$locales['Remove text formating'] = 'Retirer le formatage du texte'; +L10n::$locales['Enable dcLegacyEditor plugin'] = 'Activer le plugin dcLegacyEditor'; +L10n::$locales['Checks trackback source for a link to the post'] = 'Contrôle si la source du rétrolien comporte un lien vers le billet'; +L10n::$locales['Fair Trackbacks'] = 'Trackbacks équitables'; +L10n::$locales['Import / Export'] = 'Import / Export'; +L10n::$locales['Database export'] = 'Exporter la base de données'; +L10n::$locales['Download database of current blog'] = 'Télécharger les contenus et réglages du blog courant'; +L10n::$locales['Compress file'] = 'Compresser le fichier'; +L10n::$locales['Download database of all blogs'] = 'Télécharger les contenus et réglages de tous les blogs'; +L10n::$locales['No file to read.'] = 'Aucun fichier à lire.'; +L10n::$locales['Unable to create output file.'] = 'Impossible de créer le fichier d\'exportation.'; +L10n::$locales['File is not a DotClear backup.'] = 'Ce fichier n\'est pas un fichier de sauvegarde Dotclear.'; +L10n::$locales['File is not a single blog export.'] = 'Ce fichier n\'est pas une exportation d\'un blog.'; +L10n::$locales['Error raised at line %s'] = 'Erreur détectée ligne %s'; +L10n::$locales['File is not a full export.'] = 'Ce fichier n\'est pas un fichier de sauvegarde complet.'; +L10n::$locales['ID of "%3$s" does not match on record "%1$s" at line %2$s of backup file.'] = 'L\'ID de "%3$s" ne correspond pas dans l\'enregistrement "%1$s" à la ligne %2$s du fichier de sauvegarde.'; +L10n::$locales['Please wait...'] = 'Veuillez patientezâ¦'; +L10n::$locales['Export'] = 'Export'; +L10n::$locales['Export functions are in the page %s.'] = 'Les fonctions d\'export sont dans la page de %s.'; +L10n::$locales['Maintenance'] = 'Entretien'; +L10n::$locales['Congratulation!'] = 'Bravo !'; +L10n::$locales['Your blog has been successfully imported. Welcome on Dotclear 2!'] = 'Votre blog a été importé. Bienvenue sur Dotclear 2 !'; +L10n::$locales['Why don\'t you blog this now?'] = 'Pourquoi ne bloguez-vous pas cela maintenant ?'; +L10n::$locales['visit your dashboard'] = 'voir votre tableau de bord'; +L10n::$locales['Flat file export'] = 'Fichier d\'exportation « à plat »'; +L10n::$locales['Exports a blog or a full Dotclear installation to flat file.'] = 'Exporte un blog ou une installation Dotclear complète vers un fichier « à plat ».'; +L10n::$locales['Export file not found.'] = 'Le fichier d\'export n\'a pas été trouvé.'; +L10n::$locales['Failed to compress export file.'] = 'Impossible de compresser le fichier d\'export.'; +L10n::$locales['Single blog'] = 'Blog simple'; +L10n::$locales['This will create an export of your current blog: %s'] = 'Cela créera un export du blog courant : %s'; +L10n::$locales['You may also want to download your media directory as a zip file'] = 'Vous pouvez également télécharger votre répertoire de média sous forme de fichier archive zip'; +L10n::$locales['Multiple blogs'] = 'Tous les blogs'; +L10n::$locales['This will create an export of all the content of your database.'] = 'Cela créera un export avec tout le contenu de votre base de données.'; +L10n::$locales['Dotclear 1.2 import'] = 'Importation depuis Dotclear 1.2'; +L10n::$locales['Import a Dotclear 1.2 installation into your current blog.'] = 'Importer une installation Dotclear 1.2 dans votre blog courant.'; +L10n::$locales['Import the content of a Dotclear 1.2\'s blog in the current blog: %s.'] = 'Importer le contenu d\'un blog Dotclear 1.2 comme nouveau contenu dans le blog courant : %s.'; +L10n::$locales['Please note that this process will empty your categories, blogroll, entries and comments on the current blog.'] = 'Notez que cela supprimera les catégories, liste de liens, billets et commentaires actuels du blog courant. '; +L10n::$locales['General information'] = 'Informations générales'; +L10n::$locales['Import my blog now'] = 'Importer mon blog maintenant'; +L10n::$locales['We first need some information about your old Dotclear 1.2 installation.'] = 'Nous avons besoin au préalable de quelques informations à propos de votre installation Dotclear 1.2.'; +L10n::$locales['Database driver:'] = 'Moteur de la base de données :'; +L10n::$locales['Entries import options'] = 'Options d\'importation des billets'; +L10n::$locales['Number of entries to import at once:'] = 'Nombre d\'éléments à importer à chaque passe :'; +L10n::$locales['Importing users'] = 'Importation des utilisateurs'; +L10n::$locales['Importing categories'] = 'Importation des catégories'; +L10n::$locales['Importing blogroll'] = 'Importation de la liste des liens'; +L10n::$locales['Importing entries from %d to %d / %d'] = 'Importation des éléments %d à %d / %d'; +L10n::$locales['Please read carefully'] = 'Lisez soigneusement'; +L10n::$locales['Every newly imported user has received a random password and will need to ask for a new one by following the "I forgot my password" link on the login page (Their registered email address has to be valid.)'] = 'Chaque utilisateur·rice nouvellement importé·e a reçu un mot de passe aléatoire et devra en demander un nouveau en cliquant sur le lien « J\'ai oublié mon mot de passe » sur la page d\'authentification (son adresse email doit être valide).'; +L10n::$locales['Please note that Dotclear 2 has a new URL layout. You can avoid broken links by installing DC1 redirect plugin and activate it in your blog configuration.'] = 'Notez que Dotclear a un nouveau schéma d\'URL. Vous pouvez éviter les liens brisés en installant le plugin DC1 redirect et en l\'activant dans la configuration de votre blog.'; +L10n::$locales['next step'] = 'Ãtape suivante'; +L10n::$locales['Depending on the size of your blog, it could take a few minutes.'] = 'Cela peut prendre plusieurs minutes en fonction de la taille de votre blog.'; +L10n::$locales['Dotclear tables not found'] = 'Les tables Dotclear n\'ont pas été trouvées'; +L10n::$locales['RSS or Atom feed import'] = 'Importation d\'un flux RSS ou Atom'; +L10n::$locales['Add a feed content to the blog.'] = 'Ajouter les contenus d\'un flux au blog.'; +L10n::$locales['Cannot retrieve feed URL.'] = 'Impossible de trouver l\'URL du flux.'; +L10n::$locales['No items in feed.'] = 'Aucun élément dans le flux'; +L10n::$locales['Content successfully imported.'] = 'Le contenu a été importé.'; +L10n::$locales['Add a feed content to the current blog: %s.'] = 'Ajouter les contenus d\'un flux au blog courant : %s.'; +L10n::$locales['Feed URL:'] = 'URL du flux :'; +L10n::$locales['Flat file import'] = 'Importation d\'un fichier « à plat »'; +L10n::$locales['Imports a blog or a full Dotclear installation from flat file.'] = 'Importe un blog ou une installation Dotclear complète depuis un fichier « à plat ».'; +L10n::$locales['Single blog successfully imported.'] = 'Le blog a été importé.'; +L10n::$locales['Are you sure you want to import a full backup file?'] = 'Ãtes-vous sûr·e de vouloir importer un fichier de sauvegarde complet ?'; +L10n::$locales['This will import a single blog backup as new content in the current blog: %s.'] = 'Cela importera une sauvegarde d\'un blog comme nouveau contenu du blog courant : %s.'; +L10n::$locales['Upload a backup file'] = 'Téléversez un fichier de sauvegarde'; +L10n::$locales['maximum size %s'] = 'taille maximum de %s'; +L10n::$locales['or pick up a local file in your public directory'] = 'ou sélectionnez un fichier local présent dans votre répertoire de médias'; +L10n::$locales['This will reset all the content of your database, except users.'] = 'Attention : Cela supprimera au préalable tout le contenu de votre base de données à l\'exception des utilisateurs.'; +L10n::$locales['Another file with same name exists.'] = 'Un autre fichier portant ce nom existe déjà .'; +L10n::$locales['Failed to extract backup file.'] = 'Impossible d\'extraire le fichier de sauvegarde.'; +L10n::$locales['No backup in compressed file.'] = 'Aucune sauvegarde dans le fichier compressé.'; +L10n::$locales['WordPress import'] = 'Importation WordPress'; +L10n::$locales['Import a WordPress installation into your current blog.'] = 'Importe une installation WordPress dans le blog courant.'; +L10n::$locales['This will import your WordPress content as new content in the current blog: %s.'] = 'Cela importera le contenu WordPress comme un nouveau contenu dans le blog courant : %s.'; +L10n::$locales['We first need some information about your old WordPress installation.'] = 'Nous avons besoin au préalable de quelques informations au sujet de votre ancienne installation WordPress.'; +L10n::$locales['WordPress and Dotclear\'s handling of categories are quite different. You can assign several categories to a single post in WordPress. In the Dotclear world, we see it more like "One category, several tags." Therefore Dotclear can only import one category per post and will chose the lowest numbered one. If you want to keep a trace of every category, you can import them as tags, with an optional prefix.'] = 'La gestion des catégories chez WordPress et Dotclear est tout à fait différente. Vous pouvez assigner plusieurs catégories à un seul billet dans WordPress. Dans le monde Dotclear, nous le voyons davantage comme « une catégorie, plusieurs mots-clés ». Par conséquent Dotclear peut seulement importer une catégorie par billet et il choisira celui de plus petit numéro. Si vous voulez conserver une trace de chaque catégorie, vous pouvez les importer sous forme de mots-clés, avec un préfixe optionnel.'; +L10n::$locales['On the other hand, in WordPress, a post can not be uncategorized, and a default installation has a first category labelised "Uncategorized".If you did not change that category, you can just ignore it while importing your blog, as Dotclear allows you to actually keep your posts uncategorized.'] = 'D\'autre part, dans WordPress, un billet ne peut pas être sans catégorie, et une installation par défaut possède systématiquement une première catégorie nommée « sans catégorie ». Si vous n\'avez pas changé cette catégorie, vous pouvez simplement l\'ignorer lors de l\'importation sur votre blog, puisque Dotclear vous permet réellement de conserver votre message sans catégorie.'; +L10n::$locales['Ignore the first category:'] = 'Ignorer la première catégorie :'; +L10n::$locales['Import lowest numbered category on posts:'] = 'Importer la catégorie ayant le plus faible numéro dans les billets :'; +L10n::$locales['Import all categories as tags:'] = 'Importer toutes les catégories comme des mots-clés :'; +L10n::$locales['Prefix such tags with:'] = 'Préfixer les mots-clés avec :'; +L10n::$locales['Content filters'] = 'Filtres de contenu'; +L10n::$locales['You may want to process your post and/or comment content with the following filters.'] = 'Vous pouvez formater le contenu de vos billets et commentaires avec les filtres suivants.'; +L10n::$locales['Post content formatter:'] = 'Formatage du contenu des billets :'; +L10n::$locales['Comment content formatter:'] = 'Formatage du contenu des commentaires :'; +L10n::$locales['WordPress tables not found'] = 'Les tables WordPress n\'ont pu être trouvées.'; +L10n::$locales['Servicing'] = 'Entretien'; +L10n::$locales['Tools to maintain the performance of your blogs.'] = 'Outils pour maintenir les performances de vos blogs.'; +L10n::$locales['Backup'] = 'Sauvegarde'; +L10n::$locales['Tools to back up your content.'] = 'Outils de sauvegarde du contenu'; +L10n::$locales['Development'] = 'Développement'; +L10n::$locales['Tools to assist in development of plugins, themes and core.'] = 'Outils pour aider au développement de plugins, thèmes et au cÅur de l\'application.'; +L10n::$locales['Optimize'] = 'Optimiser'; +L10n::$locales['Count and index'] = 'Compter et indexer'; +L10n::$locales['Purge'] = 'Purger'; +L10n::$locales['Other'] = 'Autre'; +L10n::$locales['Current blog'] = 'Blog courant'; +L10n::$locales['All blogs'] = 'Tous les blogs'; +L10n::$locales['Maintain translations'] = 'Maintenir les traductions'; +L10n::$locales['Translations'] = 'Traductions'; +L10n::$locales['One task to execute'] = [ + 'Une tâche à exécuter', + '%s tâches à exécuter', +]; +L10n::$locales['This task has never been executed.'] = 'Cette tâche n\'a jamais été exécutée.'; +L10n::$locales['Last execution of this task was on %s.'] = 'La dernière exécution de cette tâches était le %s.'; +L10n::$locales['There is a task to execute.'] = [ + 'Il y a une tâche à exécuter.', + 'Il y a %s tâches à exécuter.', +]; +L10n::$locales['Manage tasks'] = 'Gérer les tâches'; +L10n::$locales['Display overdue tasks counter on maintenance dashboard icon'] = 'Afficher le nombre de tâches en retard sur l\'icône Maintenance du tableau de bord'; +L10n::$locales['Display overdue tasks list on dashboard items'] = 'Afficher la liste des tâches en retard dans un module du tableau de bord'; +L10n::$locales['Failed to execute task.'] = 'Impossible d\'exécuter la tâche.'; +L10n::$locales['Task successfully executed.'] = 'La tâche a été exécutée.'; +L10n::$locales['Maintenance plugin has been successfully configured.'] = 'La configuration du plugin de maintenance a été enregistrée.'; +L10n::$locales['System settings have been saved.'] = 'Les réglages système ont été enregistrés.'; +L10n::$locales['All blog\'s Content-Security-Policy settings have been reset to default.'] = 'Tous les réglages Content-Security-Policy des blogs ont été remis aux valeurs par défaut.'; +L10n::$locales['Every week'] = 'Chaque semaine'; +L10n::$locales['Every two weeks'] = 'Toutes les deux semaines'; +L10n::$locales['Every month'] = 'Chaque mois'; +L10n::$locales['Every two months'] = 'Tous les deux mois'; +L10n::$locales['You have not sufficient permissions to view this page.'] = 'Vous n\'avez pas les autorisations suffisantes pour accéder à cette page.'; +L10n::$locales['You should execute it now.'] = 'Vous devriez l\'exécuter dès maintenant.'; +L10n::$locales['Execute task'] = 'Exécuter cette tâche'; +L10n::$locales['This may take a very long time.'] = 'Cela peut prendre un certain temps.'; +L10n::$locales['Alert settings'] = 'Réglage des alertes'; +L10n::$locales['Activation'] = 'Activation'; +L10n::$locales['Display alert messages on late tasks'] = 'Afficher des messages d\'alerte pour les tâches en retard'; +L10n::$locales['You can place list of late tasks on your %s.'] = 'Vous pouvez placer la liste des tâches en retard sur votre %s.'; +L10n::$locales['Frequency'] = 'Périodicité'; +L10n::$locales['Use one recall time for all tasks'] = 'Utiliser le même délai de rappel pour toutes les tâches'; +L10n::$locales['Recall time for all tasks:'] = 'Délai de rappel pour toutes les tâches :'; +L10n::$locales['Use one recall time per task'] = 'Utiliser un délai de rappel différent pour chaque tâche'; +L10n::$locales['Content-Security-Policy'] = 'Content-Security-Policy'; +L10n::$locales['Enable Content-Security-Policy system'] = 'Activer le système Content-Security-Policy'; +L10n::$locales['Enable Content-Security-Policy report only'] = 'Activer le rapport seul pour le système Content-Security-Policy'; +L10n::$locales['Enable Content-Security-Policy system by default'] = 'Activer par défaut le système Content-Security-Policy'; +L10n::$locales['Enable Content-Security-Policy report only by default'] = 'Activer par défaut le rapport seul pour le système Content-Security-Policy'; +L10n::$locales['Also apply these settings to all blogs'] = 'Appliquer également ces réglages à tous les blogs'; +L10n::$locales['Delete the Content-Security-Policy report file'] = 'Supprimer le rapport de violation des Content-Security-Policy'; +L10n::$locales['Content-Security-Policy report file has been deleted.'] = 'Le rapport de violation des Content-Security-Policy a été supprimé.'; +L10n::$locales['Failed to delete the Content-Security-Policy report file.'] = 'Impossible de supprimer le rapport de violation des Content-Security-Policy.'; +L10n::$locales['Remove the Content-Security-Policy report file.'] = 'Supprime le rapport de violation des Content-Security-Policy.'; +L10n::$locales['Empty templates cache directory'] = 'Vider le répertoire de cache des « templates »'; +L10n::$locales['Templates cache directory emptied.'] = 'Le répertoire de cache des « templates » a été vidé.'; +L10n::$locales['Failed to empty templates cache directory.'] = 'Impossible de vider le répertoire de cache des « templates ».'; +L10n::$locales['It may be useful to empty this cache when modifying a theme\'s .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory %s directly on the server with your FTP software.'] = 'La suppression du répertoire du cache des templates peut se révéler nécessaire lors de modifications dans les fichiers .html ou .css d\'un thème (voire lors d\'un changement de thème ou de mise à jour de plugin). Attention : chez certains hébergeur·euse·s (Free par exemple), le cache du répertoire des templates ne peut pas être vidé grâce à l\'extension Maintenance, il faut supprimer le répertoire cbtpl situé dans le répertoire cache (dotclear/cache par défaut) avec un logiciel FTP.'; +L10n::$locales['Count again comments and trackbacks'] = 'Recompter les commentaires et rétroliens'; +L10n::$locales['Comments and trackback counted.'] = 'Les commentaires et rétroliens ont été recomptés.'; +L10n::$locales['Failed to count comments and trackbacks.'] = 'Impossible de recompter les commentaires et rétroliens.'; +L10n::$locales['Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2).'] = 'Recompter les commentaires et les rétroliens a pour effet de donner le nombre exact de ceux-ci pour chaque billet. Cette opération peut se révéler utile lors de l\'import d\'un blog d\'une autre plateforme (ou d\'une migration de Dotclear 1 vers Dotclear 2).'; +L10n::$locales['Search engine index'] = 'Index du moteur de recherche'; +L10n::$locales['Index all comments for search engine'] = 'Indexer tous les commentaires pour le moteur de recherche'; +L10n::$locales['Next'] = 'Suivant'; +L10n::$locales['Indexing comment %d to %d.'] = 'Indexation des commentaires %d à %d.'; +L10n::$locales['Comments index done.'] = 'L\'indexation des commentaires a été effectuée.'; +L10n::$locales['Failed to index comments.'] = 'Impossible d\'indexer les commentaires.'; +L10n::$locales['Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = 'Indexer tous les commentaires et rétroliens dans le moteur de recherche. Cette opération s\'effectue généralement suite à un import afin d\'obtenir des résultats lors des recherches, aussi bien depuis l\'administration du blog qu\'en partie publique.'; +L10n::$locales['Index all entries for search engine'] = 'Indexer tous les billets pour le moteur de recherche'; +L10n::$locales['Indexing entry %d to %d.'] = 'Indexation des billets %d à %d.'; +L10n::$locales['Entries index done.'] = 'L\'indexation des billets a été effectuée.'; +L10n::$locales['Failed to index entries.'] = 'Impossible d\'indexer les billets.'; +L10n::$locales['Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.'] = 'Indexer tous les billets dans le moteur de recherche. Cette opération s\'effectue généralement suite à un import afin d\'obtenir des résultats lors des recherches, aussi bien depuis l\'administration du blog qu\'en partie publique.'; +L10n::$locales['Delete all logs'] = 'Supprimer tous les journaux (logs)'; +L10n::$locales['Logs deleted.'] = 'Les journaux ont été supprimés.'; +L10n::$locales['Failed to delete logs.'] = 'Impossible de supprimer les journaux.'; +L10n::$locales['Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time.'] = 'Sauf si vous avez un besoin précis de conservation des activités de connexion sur votre blog, pensez à vider régulièrement la table des journaux : elle contient l\'enregistrement de chaque connexion à l\'administration et des opérations qui s\'y sont déroulées.'; +L10n::$locales['Entries metadata'] = 'Métadonnées des billets'; +L10n::$locales['Synchronize entries metadata'] = 'Synchroniser les métadonnées des billets'; +L10n::$locales['Synchronize entry %d to %d.'] = 'Synchronisation des billets %d à %d.'; +L10n::$locales['Entries metadata synchronize done.'] = 'La synchronisation des métadonnées des billets a été effectuée.'; +L10n::$locales['Failed to synchronize entries metadata.'] = 'Impossible de synchroniser les métadonnées des billets.'; +L10n::$locales['Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables.'] = 'La synchronisation des métadonnées des billets peut être utile après l\'import de contenu dans votre blog ou après une mauvaise opération sur la base de données.'; +L10n::$locales['Optimise database'] = 'Optimise la base de données'; +L10n::$locales['optimize tables'] = 'Optimiser les tables'; +L10n::$locales['Optimization successful.'] = 'L\'optimisation a été effectuée.'; +L10n::$locales['Failed to optimize tables.'] = 'Impossible d\'optimiser les tables.'; +L10n::$locales['After numerous delete or update operations on Dotclear\'s database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data\'s integrity. It is recommended to optimize before any blog export.'] = 'Au fur at à mesure des suppressions ou modifications dans vos billets, les tables de la base de données se fragmentent. L\'opération d\'optimisation permet de compacter celles-ci. Cette opération n\'a aucun impact sur l\'intégrité de vos données. Il est fortement conseillé d\'optimiser la base de données avant tout export de blog.'; +L10n::$locales['Download media folder of current blog'] = 'Télécharger la médiathèque du blog courant'; +L10n::$locales['It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big.'] = 'Il peut être utile de sauvegarder votre médiathèque. Ceci comprime tout le contenu du répertoire de média dans un seul fichier Zip. Remarque : chez certains hébergeur·euse·s, la médiathèque ne peut pas être compressée avec ce plugin si elle est trop grande.'; +L10n::$locales['Download active theme of current blog'] = 'Télécharger le theme actif du blog courant'; +L10n::$locales['It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file.'] = 'Il peut être utile de sauvegarder le thème courant avant tout changement ou mise à jour. Ceci comprime tout le contenu du répertoire du thème dans un seul fichier Zip.'; +L10n::$locales['manage pages'] = 'gestion des pages'; +L10n::$locales['%d page'] = '%d page'; +L10n::$locales['%d pages'] = '%d pages'; +L10n::$locales['New page'] = 'Nouvelle page'; +L10n::$locales['Pages actions'] = 'Action sur les pages'; +L10n::$locales['Back to pages list'] = 'Retour à la liste des pages'; +L10n::$locales['Selected pages have been successfully reordered.'] = 'Les pages sélectionnées ont été réordonnées.'; +L10n::$locales['No page'] = 'Aucune page'; +L10n::$locales['Hidden'] = 'Masqué'; +L10n::$locales['Select this page'] = 'Sélectionner cette page'; +L10n::$locales['Published on'] = 'Publié le'; +L10n::$locales['This page\'s comments feed'] = 'Fil des commentaires de cette page'; +L10n::$locales['You must provide a valid email address.'] = 'Vous devez indiquer une adresse e-mail valide.'; +L10n::$locales['My first page'] = 'Ma première page'; +L10n::$locales['This is your first page. When you\'re ready to blog, log in to edit or delete it.'] = 'Ceci est votre première page. Quand vous serez prêt à bloguer, connectez-vous pour l\'éditer ou la supprimer.'; +L10n::$locales['Are you sure you want to delete selected pages?'] = 'Ãtes-vous sûr·e de vouloir supprimer les pages sélectionnées ?'; +L10n::$locales['Selected pages have been successfully updated.'] = 'Les pages sélectionnées ont été modifiées.'; +L10n::$locales['Selected pages have been successfully deleted.'] = 'Les pages sélectionnées ont été supprimées.'; +L10n::$locales['Selected pages action:'] = 'Action sur les pages sélectionnées :'; +L10n::$locales['To rearrange pages order, change number at the begining of the line, then click on âSave pages orderâ button.'] = 'Pour réordonner les pages, modifier le numéro dans le champ au début de la ligne puis cliquez sur âEnregistrer l\'ordre des pagesâ.'; +L10n::$locales['To rearrange pages order, move items by drag and drop, then click on âSave pages orderâ button.'] = 'Pour réordonner les pages, déplacez les items par glisser déposer puis cliquez sur âEnregistrer l\'ordre des pagesâ.'; +L10n::$locales['Save pages order'] = 'Enregistrer l\'ordre des pages'; +L10n::$locales['This page does not exist.'] = 'Cette page n\'existe pas.'; +L10n::$locales['Edit page'] = 'Modifier la page'; +L10n::$locales['Are you sure you want to delete this page?'] = 'Ãtes-vous sûr·e de vouloir supprimer cette page ?'; +L10n::$locales['Page has been successfully updated.'] = 'La page a été modifiée.'; +L10n::$locales['Page has been successfully created.'] = 'La page a été créée.'; +L10n::$locales['Don\'t forget to validate your HTML conversion by saving your post.'] = 'Enregistrez votre billet pour valider la transformation en HTML.'; +L10n::$locales['Go to this page on the site'] = 'Voir cette page sur le site'; +L10n::$locales['Page status'] = 'Ãtat de la page'; +L10n::$locales['Page language'] = 'Langue de la page'; +L10n::$locales['Page position'] = 'Position de la page'; +L10n::$locales['Hide in widget Pages'] = 'Ne pas lister dans le widget Pages'; +L10n::$locales['Warning: If you set the URL manually, it may conflict with another page.'] = 'Attention : si vous définissez vous-même l\'URL, elle peut entrer en conflit avec celle d\'une autre page.'; +L10n::$locales['Introduction to the page.'] = 'Introduction à la page.'; +L10n::$locales['Select this comment'] = 'Sélectionner ce commentaire'; +L10n::$locales['Page title'] = 'Titre de la page'; +L10n::$locales['Publication date'] = 'Date de publication'; +L10n::$locales['Pings'] = 'Signalements (pings)'; +L10n::$locales['Settings have been successfully updated.'] = 'Les réglages ont été enregistrés.'; +L10n::$locales['Pings configuration'] = 'Configuration des signalements'; +L10n::$locales['Activate pings extension'] = 'Activer le plugin de signalement'; +L10n::$locales['Service name:'] = 'Nom du service :'; +L10n::$locales['Service URI:'] = 'URI du service :'; +L10n::$locales['Error'] = 'Erreur'; +L10n::$locales['Auto pings all services on first publication of entry (current blog only)'] = 'Signaler automatiquement à tous ces services la première publication des publications (blog courant seulement)'; +L10n::$locales['Test ping services'] = 'Tester les services de signalement'; +L10n::$locales['Simple menu'] = 'Menu simple'; +L10n::$locales['Active page'] = 'Page active'; +L10n::$locales['active page'] = 'page active'; +L10n::$locales['All months'] = 'Tous les mois'; +L10n::$locales['Archive'] = 'Archive'; +L10n::$locales['Page'] = 'Page'; +L10n::$locales['Tags'] = 'Mots-clés'; +L10n::$locales['User defined'] = 'Saisie libre'; +L10n::$locales['Configuration successfully updated.'] = 'La configuration a été mise à jour'; +L10n::$locales['Label'] = 'Libellé'; +L10n::$locales['Home page'] = 'Page d\'accueil'; +L10n::$locales['Recent posts'] = 'Billets récents'; +L10n::$locales['Switch to %s language'] = 'Basculer vers le %s'; +L10n::$locales['Recent Posts from this category'] = 'Billets récents de cette catégorie'; +L10n::$locales['Posts from %s'] = 'Billets de %s'; +L10n::$locales['Recent posts for %s tag'] = 'Billets récent pour le mot-clé %s'; +L10n::$locales['Menu item has been successfully added.'] = 'L\'item de menu a été ajouté.'; +L10n::$locales['Label and URL of menu item are mandatory.'] = 'Les libellés et URL sont obligatoires.'; +L10n::$locales['Menu items have been successfully removed.'] = 'Le ou les items de menu ont été supprimés.'; +L10n::$locales['No menu items selected.'] = 'Aucun item de menu sélectionné.'; +L10n::$locales['Label is mandatory.'] = 'Le libellé est obligatoire.'; +L10n::$locales['URL is mandatory.'] = 'lâURL est obligatoire.'; +L10n::$locales['Menu items have been successfully updated.'] = 'Le ou les items de menu ont été mis à jour.'; +L10n::$locales['Step #1'] = 'Ãtape 1'; +L10n::$locales['Step #2'] = 'Ãtape 2'; +L10n::$locales['Step #3'] = 'Ãtape 3'; +L10n::$locales['Add item'] = 'Ajouter un item de menu'; +L10n::$locales['Select type'] = 'Sélection du type'; +L10n::$locales['Type of item menu:'] = 'Type d\'item de menu :'; +L10n::$locales['Continue...'] = 'Continuerâ¦'; +L10n::$locales['Select language:'] = 'Sélectionnez la langue :'; +L10n::$locales['Select category:'] = 'Sélectionnez la catégorie :'; +L10n::$locales['Select month (if necessary):'] = 'Sélectionnez le mois (si nécessaire) :'; +L10n::$locales['Select page:'] = 'Sélectionnez la page :'; +L10n::$locales['Select tag (if necessary):'] = 'Sélectionnez le mot clé (si nécessaire) :'; +L10n::$locales['Label of item menu:'] = 'Libellé de l\'item de menu :'; +L10n::$locales['Description of item menu:'] = 'Description de l\'item de menu :'; +L10n::$locales['URL of item menu:'] = 'URL de l\'item de menu :'; +L10n::$locales['Open URL on a new tab'] = 'S\'ouvre dans un nouvel onglet'; +L10n::$locales['Add this item'] = 'Ajouter cet item'; +L10n::$locales['Enable simple menu for this blog'] = 'Activer le menu simple pour ce blog'; +L10n::$locales['Add an item'] = 'Ajouter un item de menu'; +L10n::$locales['Menu items list'] = 'Liste des items de menu'; +L10n::$locales['Update menu'] = 'Mettre à jour le menu'; +L10n::$locales['Delete selected menu items'] = 'Supprimer les items de menu sélectionnés'; +L10n::$locales['Are you sure you want to remove selected menu items?'] = 'Ãtes-vous sûr de vouloir supprimer les items de menu sélectionnés ?'; +L10n::$locales['No menu items so far.'] = 'Aucun item de menu pour l\'instant.'; +L10n::$locales['Item description'] = 'Description des items de menu'; +L10n::$locales['Displayed in link'] = 'Affichée dans le lien'; +L10n::$locales['Used as link title'] = 'Utilisée comme titre du lien'; +L10n::$locales['Displayed in link and used as title'] = 'Affichée dans le lien et utilisée comme titre'; +L10n::$locales['Not displayed nor used'] = 'Ignorée'; +L10n::$locales['Tag'] = 'Mot-clé'; +L10n::$locales['Add tags'] = 'Ajouter des mots-clés'; +L10n::$locales['Remove tags'] = 'Retirer des mots-clés'; +L10n::$locales['Tag has been successfully added to selected entries'] = [ + 'Le mot-clé a été ajouté aux publications sélectionnées', + 'Les mot-clés ont été ajoutés aux publications sélectionnées', +]; +L10n::$locales['Are you sure you want to remove this tag?'] = 'Ãtes-vous sûr·e de vouloir supprimer ce mot-clé ?'; +L10n::$locales['Add a tag to this entry'] = 'Ajouter un mot-clé à ce billet'; +L10n::$locales['Choose from list'] = 'Choisir dans la liste'; +L10n::$locales['all'] = 'tous'; +L10n::$locales['Enter tags separated by comma'] = 'Séparez les mot-clés par des virgules'; +L10n::$locales['used in %e - frequency %p%'] = 'utilisé dans %e - fréquence %p%'; +L10n::$locales['entry'] = 'billet'; +L10n::$locales['entries'] = 'billets'; +L10n::$locales['Add tags to this selection'] = 'Ajouter des mots-clés à cette sélection'; +L10n::$locales['Tags to add:'] = 'Mots-clés à ajouter :'; +L10n::$locales['Tag has been successfully removed from selected entries'] = [ + 'Le mot-clé a été retiré des publications sélectionnées', + 'Les mot-clés ont été retirés des publications sélectionnées', +]; +L10n::$locales['No tags for selected entries'] = 'Aucun mot-clé pour les billets sélectionnés'; +L10n::$locales['Remove selected tags from this selection'] = 'Retirer les mots-clés de cette sélection'; +L10n::$locales['Following tags have been found in selected entries:'] = 'Les mots-clés suivants ont été trouvés pour les billets sélectionnés :'; +L10n::$locales['Short'] = 'Court'; +L10n::$locales['Extended'] = 'Ãtendu'; +L10n::$locales['Tags list format:'] = 'Format de la liste des mots-clés :'; +L10n::$locales['This tag\'s comments Atom feed'] = 'Flux Atom des commentaires associés à ce mot-clé'; +L10n::$locales['This tag\'s entries Atom feed'] = 'Flux Atom des billets associés à ce mot-clé'; +L10n::$locales['No tags on this blog.'] = 'Aucun mot-clé sur ce blog.'; +L10n::$locales['Tag has been successfully renamed'] = 'Le mot-clé a été renommé.'; +L10n::$locales['Tag has been successfully removed'] = 'Le mot-clé a été retiré.'; +L10n::$locales['Are you sure you want to remove tag: â%sâ?'] = 'Ãtes-vous sûr·e de vouloir supprimer le mot-clé â%sâ ?'; +L10n::$locales['Back to tags list'] = 'Retour à la liste des mots-clés'; +L10n::$locales['Rename'] = 'Renommer'; +L10n::$locales['Delete this tag'] = 'Supprimer ce mot-clé'; +L10n::$locales['List of entries with the tag â%sâ'] = 'Liste des billets avec le mot-clé â%sâ'; +L10n::$locales['Limit (empty means no limit):'] = 'Limite (laisser vide si pas de limite) :'; +L10n::$locales['Tag name'] = 'Nom du mot-clé'; +L10n::$locales['Entries count'] = 'Nombre de billets'; +L10n::$locales['Newest entry'] = 'Billet le plus récent'; +L10n::$locales['Oldest entry'] = 'Billet le plus ancien'; +L10n::$locales['Link to all tags:'] = 'Lien vers tous les mots-clés :'; +L10n::$locales['themeEditor'] = 'themeEditor'; +L10n::$locales['Edit theme files'] = 'Modifier les fichiers du thème'; +L10n::$locales['Syntax highlighting'] = 'Coloration syntaxique'; +L10n::$locales['Syntax highlighting in theme editor'] = 'Coloration syntaxique de l\'éditeur de thème'; +L10n::$locales['The theme update has been locked.'] = 'La mise à jour du thème a été verrouillée.'; +L10n::$locales['The theme update has been unocked.'] = 'La mise à jour du thème a été débloquée.'; +L10n::$locales['The file has been reset.'] = 'Le fichier a été réinitialisé.'; +L10n::$locales['Unlock update'] = 'Mise à jour du déverrouillage'; +L10n::$locales['Lock update'] = 'Mise à jour du verrouillage'; +L10n::$locales['Lock update of the theme does not prevent to modify its files, only to update it globally.'] = 'Le verrouillage de la mise à jour du thème n\'empêche pas de modifier ses fichiers, mais seulement de le mettre à jour globalement.'; +L10n::$locales['Saving document...'] = 'Enregistrement du documentâ¦'; +L10n::$locales['Document saved'] = 'Document enregistré'; +L10n::$locales['An error occurred:'] = 'Une erreur est survenue :'; +L10n::$locales['Are you sure you want to reset this file?'] = 'Ãtes-vous sûr·e de vouloir réinitialiser ce fichier ?'; +L10n::$locales['Your current theme on this blog is "%s".'] = 'Actuellement votre thème sur ce blog est « %s ».'; +L10n::$locales['Please select a file to edit.'] = 'Sélectionnez un fichier à modifier.'; +L10n::$locales['File editor'] = 'Ãditeur de fichier'; +L10n::$locales['Editing file %s'] = 'Ãdition du fichier %s'; +L10n::$locales['Reset'] = 'Réinitialiser'; +L10n::$locales['This file is not writable. Please check your theme files permissions.'] = 'Ce fichier n\'est pas modifiable. Contrôlez les permissions de vos fichiers de thème.'; +L10n::$locales['Templates files'] = 'Fichiers du thème'; +L10n::$locales['CSS files'] = 'Fichiers CSS'; +L10n::$locales['JavaScript files'] = 'Fichiers JavaScript'; +L10n::$locales['Locales files'] = 'Fichiers de traduction'; +L10n::$locales['PHP files'] = 'Fichiers PHP'; +L10n::$locales['You can\'t edit a distributed theme.'] = 'Vous ne pouvez pas modifier un thème distribué.'; +L10n::$locales['No file'] = 'Aucun fichier'; +L10n::$locales['From theme:'] = 'Du thème :'; +L10n::$locales['From parent:'] = 'Du thème parent :'; +L10n::$locales['From template set:'] = 'Du jeu de template :'; +L10n::$locales['File does not exist.'] = 'Ce fichier n\'existe pas.'; +L10n::$locales['File %s is not readable'] = 'Le fichier %s n\'est pas lisible'; +L10n::$locales['user:preferences'] = 'user:preferences'; +L10n::$locales['Preferences successfully updated'] = 'Les préférences ont été mises à jour.'; +L10n::$locales['User preferences'] = 'Préférences utilisateur·rice'; +L10n::$locales['Global preferences'] = 'Préférences globales'; +L10n::$locales['Widgets'] = 'Widgets'; +L10n::$locales['Widget\'s textareas'] = 'Les zones de texte multilignes des widgets'; +L10n::$locales['Unable to initialize default widgets.'] = 'Impossible d\'initialiser les widgets par défaut.'; +L10n::$locales['navigation'] = 'Volet de navigation'; +L10n::$locales['extra'] = 'Volet d\'extra'; +L10n::$locales['custom'] = 'Volet supplémentaire'; +L10n::$locales['Sidebars and their widgets have been saved.'] = 'Les volets et leurs widgets ont été enregistrés.'; +L10n::$locales['Sidebars have been resetting.'] = 'Les volets ont été réinitialisés.'; +L10n::$locales['Are you sure you want to reset sidebars?'] = 'Ãtes-vous sûr·e de vouloir réinitialiser les volets ?'; +L10n::$locales['Available widgets'] = 'Widgets disponibles'; +L10n::$locales['Drag widgets from this list to one of the sidebars, for add.'] = 'Déplacez des widgets de cette liste vers l\'un des volets.'; +L10n::$locales['order'] = 'ordre'; +L10n::$locales['Append to:'] = 'Ajouter à  :'; +L10n::$locales['Add widgets to sidebars'] = 'Ajouter les widgets aux volets'; +L10n::$locales['Navigation sidebar'] = 'Volet de navigation'; +L10n::$locales['Extra sidebar'] = 'Volet d\'extra'; +L10n::$locales['Custom sidebar'] = 'Volet supplémentaire'; +L10n::$locales['Update sidebars'] = 'Mettre à jour les volets'; +L10n::$locales['Reset sidebars'] = 'Réinitialiser les volets'; +L10n::$locales['Widget ID:'] = 'Identifiant du widget :'; +L10n::$locales['No setting for this widget'] = 'Aucun réglage pour ce widget'; +L10n::$locales['boolean'] = 'booléen'; +L10n::$locales['possible values:'] = 'valeurs possibles :'; +L10n::$locales['empty string'] = 'chaîne vide'; +L10n::$locales['listitem'] = 'élément de liste'; +L10n::$locales['string'] = 'chaîne de caractères'; +L10n::$locales['Setting name:'] = 'Nom de l\'élément de réglage :'; +L10n::$locales['No widget as far.'] = 'Aucun widget pour le moment.'; +L10n::$locales['Up the widget'] = 'Monter le widget'; +L10n::$locales['Down the widget'] = 'Descendre le widget'; +L10n::$locales['Remove the widget'] = 'Retirer le widget'; +L10n::$locales['Remove widget'] = 'Retirer le widget'; +L10n::$locales['Drag widgets here to remove.'] = 'Glisser les widgets ici pour les retirer du volet.'; +L10n::$locales['Search engine'] = 'Moteur de recherche'; +L10n::$locales['Placeholder (HTML5 only, optional):'] = 'Texte indicatif (HTML5 seulement, optionnel) :'; +L10n::$locales['Navigation links'] = 'Liens de navigation'; +L10n::$locales['Selected entries'] = 'Billets sélectionnés'; +L10n::$locales['Best of me'] = 'à retenir'; +L10n::$locales['Blog languages'] = 'Langues du blog'; +L10n::$locales['With entries counts'] = 'Avec le nombre de billets'; +L10n::$locales['Include sub cats in count'] = 'Inclure les sous-catégories dans les compteurs'; +L10n::$locales['Include empty categories'] = 'Inclure les catégories vides'; +L10n::$locales['Subscribe links'] = 'Liens de souscription'; +L10n::$locales['Subscribe'] = 'S\'abonner'; +L10n::$locales['Feeds type:'] = 'Type de flux :'; +L10n::$locales['Feed reader'] = 'Lecteur de flux'; +L10n::$locales['Somewhere else'] = 'Autre part'; +L10n::$locales['Entries limit:'] = 'Limite du nombre de billets :'; +L10n::$locales['Text'] = 'Texte'; +L10n::$locales['Text:'] = 'Texte :'; +L10n::$locales['Uncategorized'] = 'Sans catégorie'; +L10n::$locales['Last entries'] = 'Derniers billets'; +L10n::$locales['Tag:'] = 'Mot-clé :'; +L10n::$locales['Last comments'] = 'Derniers commentaires'; +L10n::$locales['Comments limit:'] = 'Limite du nombre de commentaires :'; +L10n::$locales['This blog\'s entries %s feed'] = 'Flux %s des billets de ce blog'; +L10n::$locales['This blog\'s comments %s feed'] = 'Flux %s des commentaires de ce blog'; +L10n::$locales['Entries feed'] = 'Fil des billets'; +L10n::$locales['Comments feed'] = 'Fil des commentaires'; +L10n::$locales['Title (optional)'] = 'Titre (optionnel)'; +L10n::$locales['All pages'] = 'Sur toutes les pages'; +L10n::$locales['Home page only'] = 'En page d\'accueil seulement'; +L10n::$locales['Except on home page'] = 'Sauf en page d\'accueil'; +L10n::$locales['Display on:'] = 'Afficher :'; +L10n::$locales['Content only'] = 'Contenu seul (sans boîte englobante)'; +L10n::$locales['CSS class:'] = 'Classe CSS supplémentaire pour la boîte englobante :'; +L10n::$locales['Offline'] = 'Hors ligne'; diff --git a/locales/fr/plugins.po b/locales/fr/plugins.po index 3a65ac9..8331584 100644 --- a/locales/fr/plugins.po +++ b/locales/fr/plugins.po @@ -1,1358 +1,2909 @@ -# French translation of DotClear -# Copyright (C) 2006. -# Olivier MeunierتÙÙØ± ÙØ°Ù Ø§ÙØµÙØØ© Ù
عÙÙÙ
ات تÙÙÙØ© ع٠تÙÙÙ٠اÙÙ
دÙÙØ© Ø§ÙØØ§ÙÙØ© (ÙØ¶Ùا Ø¹Ù Ø§ÙØªÙÙÙ٠اÙÙ
Ø´ØªØ±Ù ÙØ¬Ù
ÙØ¹ اÙÙ
دÙÙØ©). ÙØªØ¯Ø§Ø± ÙØ°Ù Ø§ÙØ¨Ø§Ø±Ø§Ù
ترات عادة Ø¨ÙØ§Ø³Ø·Ø© ØµÙØØ§Øª أخر٠Ù٠اÙÙØ§Ø¬ÙØ© Ø§ÙØ¥Ø¯Ø§Ø±ÙØ©.
+ ÙÙ
بتعدÙÙ Ø´ÙØ¡ ÙÙØ§ ÙÙØ· إذا ÙÙØª تعر٠Ù
اذا ØªÙØ¹Ù!
ÙÙ Ù٠تعدÙ٠بعض اÙ٠عÙ٠ات ÙÙØ· ÙÙ ÙØ°Ù Ø§ÙØµÙØØ©.
+ +ØªØØªÙÙ Ø§ÙØµÙØØ© عÙÙ Ø¹ÙØ§Ù ات تبÙÙØ¨: إعدادات اÙ٠دÙÙØ© Ø§ÙØØ§ÙÙØ© (اس٠اÙ٠دÙÙØ©) Ù Ø§ÙØ¥Ø¹Ø¯Ø§Ø¯Ø§Øª Ø§ÙØ¹Ø§Ù Ø© ÙØ¥Ø¯Ø§Ø±Ø© إعدادات اÙ٠دÙÙØ© Ø§ÙØØ§ÙÙØ© ÙØ§Ùإعدادات Ø§ÙØ¹Ø§Ù Ø©Ø Ø¹ÙÙ Ø§ÙØªÙاÙÙ.
+ +ÙÙ ÙÙ٠اÙÙØµÙ٠٠باشرة Ø¥ÙÙ Ø£ÙØ³Ø§Ù Ø§ÙØµÙØØ§Øª اÙ٠ختÙÙØ© Ø¨Ø§Ø³ØªØ®Ø¯Ø§Ù ÙØ§Ø¦Ù Ø© Ø§Ø°ÙØ¨ اÙÙ ÙØ³Ø¯ÙØ©.
+ + diff --git a/plugins/aboutConfig/locales/de/help/help.html b/plugins/aboutConfig/locales/de/help/help.html new file mode 100644 index 0000000..0db4fb6 --- /dev/null +++ b/plugins/aboutConfig/locales/de/help/help.html @@ -0,0 +1,17 @@ + + +Diese Seite enthält technische Informationen über die Konfiguration des aktuellen Blogs (sowie über die gemeinsame Konfiguration aller Blogs). Diese Parameter werden in der Regel auf anderen Seiten der Verwaltungsoberfläche verwaltet.
+ Ãndern Sie hier nur etwas, wenn Sie wissen, was Sie tun!
Einige Parameter können nur auf dieser Seite geändert werden.
+ +Die Seite hat zwei Registerkarten: Einstellungen für das aktuelle Blog (Blogname) und Globale Einstellungen zur Verwaltung der aktuellen Blog-Einstellungen bzw. der globalen Einstellungen.
+ +Ãber das Dropdown-Menü Springen können Sie direkt auf die verschiedenen Seitenbereiche zugreifen.
+ + diff --git a/plugins/aboutConfig/locales/el/help/help.html b/plugins/aboutConfig/locales/el/help/help.html new file mode 100644 index 0000000..efdecb2 --- /dev/null +++ b/plugins/aboutConfig/locales/el/help/help.html @@ -0,0 +1,17 @@ + + +ÎÏ
Ïή η Ïελίδα ÏαÏÎÏει ÏεÏνικÎÏ ÏληÏοÏοÏÎ¯ÎµÏ ÏÏεÏικά με ÏÎ¹Ï ÏÏ
θμίÏÎµÎ¹Ï ÏοÏ
ÏÏÎÏονÏÎ¿Ï Î¹ÏÏολογίοÏ
(καθÏÏ ÎºÎ±Î¹ ÏÏ
θμίÏÎµÎ¹Ï ÏοÏ
είναι κοινÎÏ Î³Î¹Î± Ïλα Ïα ιÏÏολÏγια). ÎÏ
ÏÎÏ Î¿Î¹ ÏαÏάμεÏÏοι ÏÏ
νήθÏÏ Î´Î¹Î±ÏειÏίζονÏαι αÏÏ Î¬Î»Î»ÎµÏ ÏÎµÎ»Î¯Î´ÎµÏ ÏÏο ÏεÏιβάλλον διαÏείÏιÏηÏ.
+ ΤÏοÏοÏοιήÏÏε κάÏι ÎµÎ´Ï Î¼Ïνο αν ξÎÏεÏε Ïι κάνεÏε!
ÎÏιÏμÎÎ½ÎµÏ ÏαÏάμεÏÏοι μÏοÏοÏν να ÏÏοÏοÏοιηθοÏν μÏνο Ïε Î±Ï Ïή Ïη Ïελίδα.
+ +Î Ïελίδα ÎÏει δÏο καÏÏÎλεÏ: Î¡Ï Î¸Î¼Î¯ÏÎµÎ¹Ï Î³Î¹Î± Ïο ÏÏÎÏον ιÏÏολÏγιο (Ïνομα ιÏÏÎ¿Î»Î¿Î³Î¯Î¿Ï ) και ΠαγκÏÏÎ¼Î¹ÎµÏ ÏÏ Î¸Î¼Î¯ÏÎµÎ¹Ï Î³Î¹Î± Ïη διαÏείÏιÏη ÏÏν ÏÏ Î¸Î¼Î¯ÏεÏν ÏÎ¿Ï ÏÏÎÏονÏÎ¿Ï Î¹ÏÏÎ¿Î»Î¿Î³Î¯Î¿Ï ÎºÎ±Î¹ ÏÏν ÏαγκÏÏμιÏν ÏÏ Î¸Î¼Î¯ÏεÏν, ανÏίÏÏοιÏα.
+ +ÎÏοÏείÏε να ÎÏεÏε άμεÏη ÏÏÏÏβαÏη ÏÏÎ¹Ï Î´Î¹Î¬ÏοÏÎµÏ ÎµÎ½ÏÏηÏÎµÏ ÏÎ·Ï ÏÎµÎ»Î¯Î´Î±Ï ÏÏηÏιμοÏοιÏνÏÎ±Ï Ïο αναÏÏÏ ÏÏÏμενο Î¼ÎµÎ½Î¿Ï Goto .
+ + diff --git a/plugins/aboutConfig/locales/en/help/help.html b/plugins/aboutConfig/locales/en/help/help.html new file mode 100644 index 0000000..bf05557 --- /dev/null +++ b/plugins/aboutConfig/locales/en/help/help.html @@ -0,0 +1,17 @@ + + +This page provides technical information about the configuration of the current blog (as well as configuration common to all the blogs). These parameters are usually managed by other pages in the administration interface.
+ Only modify something here if you know what you are doing!
Some parameters can only be modified on this page.
+ +The page has two tabs: Settings for the current blog (blog name) and Global settings to manage the current blog settings and the global settings, respectively.
+ +You can directly access the different page sections using the Goto dropdown menu.
+ + diff --git a/plugins/aboutConfig/locales/en/resources.php b/plugins/aboutConfig/locales/en/resources.php new file mode 100644 index 0000000..c0bf999 --- /dev/null +++ b/plugins/aboutConfig/locales/en/resources.php @@ -0,0 +1,11 @@ +resources['help']['aboutConfig'])) { + dcCore::app()->resources['help']['aboutConfig'] = __DIR__ . '/help/help.html'; +} diff --git a/plugins/aboutConfig/locales/es-ar/help/help.html b/plugins/aboutConfig/locales/es-ar/help/help.html new file mode 100644 index 0000000..429f2cd --- /dev/null +++ b/plugins/aboutConfig/locales/es-ar/help/help.html @@ -0,0 +1,17 @@ + + +Esta página proporciona información técnica sobre la configuración del blog actual (asà como la configuración común a todos los blogs). Estos parámetros suelen gestionarse en otras páginas de la interfaz de administración.
+ ¡Sólo modifique algo aquà si sabe lo que está haciendo!
Algunos parámetros sólo pueden modificarse en esta página.
+ +La página tiene dos pestañas: Ajustes del blog actual (nombre del blog) y Ajustes globales para gestionar los ajustes del blog actual y los ajustes globales, respectivamente.
+ +Puede acceder directamente a las distintas secciones de la página utilizando el menú desplegable Ir a .
+ + diff --git a/plugins/aboutConfig/locales/es/help/help.html b/plugins/aboutConfig/locales/es/help/help.html new file mode 100644 index 0000000..429f2cd --- /dev/null +++ b/plugins/aboutConfig/locales/es/help/help.html @@ -0,0 +1,17 @@ + + +Esta página proporciona información técnica sobre la configuración del blog actual (asà como la configuración común a todos los blogs). Estos parámetros suelen gestionarse en otras páginas de la interfaz de administración.
+ ¡Sólo modifique algo aquà si sabe lo que está haciendo!
Algunos parámetros sólo pueden modificarse en esta página.
+ +La página tiene dos pestañas: Ajustes del blog actual (nombre del blog) y Ajustes globales para gestionar los ajustes del blog actual y los ajustes globales, respectivamente.
+ +Puede acceder directamente a las distintas secciones de la página utilizando el menú desplegable Ir a .
+ + diff --git a/plugins/aboutConfig/locales/fr/help/help.html b/plugins/aboutConfig/locales/fr/help/help.html new file mode 100644 index 0000000..21a3d03 --- /dev/null +++ b/plugins/aboutConfig/locales/fr/help/help.html @@ -0,0 +1,21 @@ + + +Cette page présente des informations techniques
+ brutes, relatives à la configuration du blog courant (et communes à tous les blogs).
+ Généralement ces paramètres sont gérés par d'autres pages de l'administration.
+ Ne modifiez quelque chose que si vous savez ce que vous faîtes.
Certains paramètres ne sont modifiables que sur cette page.
+ +La page présente deux onglets "Réglages pour le blog courant (nom du blog)" et "Réglages généraux" + qui permettent de gérer (et présenter) respectivement les réglages du blog courant et + ceux communs à tous les blogs.
+ +Vous pouvez accéder directement aux différentes sections de la page avec le menu de sélection.
+ + diff --git a/plugins/aboutConfig/locales/fr/resources.php b/plugins/aboutConfig/locales/fr/resources.php new file mode 100644 index 0000000..c0bf999 --- /dev/null +++ b/plugins/aboutConfig/locales/fr/resources.php @@ -0,0 +1,11 @@ +resources['help']['aboutConfig'])) { + dcCore::app()->resources['help']['aboutConfig'] = __DIR__ . '/help/help.html'; +} diff --git a/plugins/aboutConfig/locales/it/help/help.html b/plugins/aboutConfig/locales/it/help/help.html new file mode 100644 index 0000000..86fddad --- /dev/null +++ b/plugins/aboutConfig/locales/it/help/help.html @@ -0,0 +1,17 @@ + + +Questa pagina fornisce informazioni tecniche sulla configurazione del blog corrente (così come la configurazione comune a tutti i blog). Questi parametri sono di solito gestiti da altre pagine nell'interfaccia di amministrazione.
+ Modifica qui solo qualcosa se sai cosa stai facendo!
Alcuni parametri possono essere modificati solo in questa pagina.
+ +La pagina ha due schede: Impostazioni per il blog attuale (nome del blog) e Impostazioni globali per gestire le impostazioni del blog e le impostazioni globali, rispettivamente.
+ +Ã possibile accedere direttamente alle diverse sezioni della pagina utilizzando il menu a discesa Vai.
+ + diff --git a/plugins/aboutConfig/locales/ja/help/help.html b/plugins/aboutConfig/locales/ja/help/help.html new file mode 100644 index 0000000..da4a7a4 --- /dev/null +++ b/plugins/aboutConfig/locales/ja/help/help.html @@ -0,0 +1,17 @@ + + +ãã®ãã¼ã¸ã§ã¯ãç¾å¨ã®ããã°ã®è¨å®(ããã³ãã¹ã¦ã®ããã°ã«å
±éããè¨å®)ã«é¢ããæè¡æ
å ±ãæä¾ãã¾ãã ãããã®ãã©ã¡ã¼ã¿ã¯é常ã管çã¤ã³ã¿ã¼ãã§ã¤ã¹ã®ä»ã®ãã¼ã¸ã«ãã£ã¦ç®¡çããã¾ãã
+ èªåãä½ããã¦ãããåãã£ã¦ããå ´åã«ã®ã¿ãããã§ä½ãã夿´ãã¦ãã ããï¼
ä¸é¨ã®ãã©ã¡ã¼ã¿ã¯ãã®ãã¼ã¸ã§ã®ã¿å¤æ´ã§ãã¾ãã
+ +ãã¼ã¸ã«ã¯2ã¤ã®ã¿ããããã¾ã: ç¾å¨ã®ããã° (ããã°å) ã¨ç¾å¨ã®ããã°è¨å®ã¨ã°ãã¼ãã«è¨å®ã管çãã ã°ãã¼ãã«è¨å® ã鏿ãã¾ãã
+ +Goto ãããããã¦ã³ã¡ãã¥ã¼ã使ç¨ãã¦ãç°ãªããã¼ã¸ã»ã¯ã·ã§ã³ã«ç´æ¥ã¢ã¯ã»ã¹ã§ãã¾ãã
+ + diff --git a/plugins/aboutConfig/locales/ko/help/help.html b/plugins/aboutConfig/locales/ko/help/help.html new file mode 100644 index 0000000..cdf7d0a --- /dev/null +++ b/plugins/aboutConfig/locales/ko/help/help.html @@ -0,0 +1,17 @@ + + +ì´ íì´ì§ììë íì¬ ë¸ë¡ê·¸ì 구ì±ì ëí 기ì ì ë³´(모ë ë¸ë¡ê·¸ì ê³µíµì¼ë¡ ì ì©ëë 구ì±)를 ì ê³µí©ëë¤. ì´ë¬í 매ê°ë³ìë ì¼ë°ì ì¼ë¡ ê´ë¦¬ ì¸í°íì´ì¤ì ë¤ë¥¸ íì´ì§ìì ê´ë¦¬í©ëë¤.
+ ìì ì´ ë¬´ìì íê³ ìëì§ ìê³ ìë ê²½ì°ìë§ ì¬ê¸°ìì ìì íì¸ì!
ì¼ë¶ 매ê°ë³ìë ì´ íì´ì§ììë§ ìì í ì ììµëë¤.
+ +íì´ì§ìë ë ê°ì íì´ ììµëë¤: íì¬ ë¸ë¡ê·¸ ì¤ì (ë¸ë¡ê·¸ ì´ë¦) ë° ê¸ë¡ë² ì¤ì ìì ê°ê° íì¬ ë¸ë¡ê·¸ ì¤ì ê³¼ ê¸ë¡ë² ì¤ì ì ê´ë¦¬í ì ììµëë¤.
+ +ë°ë¡ê°ê¸° ëë¡ë¤ì´ ë©ë´ë¥¼ ì¬ì©íì¬ ë¤ë¥¸ íì´ì§ ì¹ì ì ì§ì ì¡ì¸ì¤í ì ììµëë¤.
+ + diff --git a/plugins/aboutConfig/locales/pt-br/help/help.html b/plugins/aboutConfig/locales/pt-br/help/help.html new file mode 100644 index 0000000..4ff5b09 --- /dev/null +++ b/plugins/aboutConfig/locales/pt-br/help/help.html @@ -0,0 +1,17 @@ + + +Esta página fornece informações técnicas sobre a configuração do blogue atual (bem como a configuração comum a todos os blogues). Estes parâmetros são normalmente geridos por outras páginas da interface de administração.
+ Só modifique algo aqui se souber o que está a fazer!
Alguns parâmetros só podem ser modificados nesta página.
+ +A página tem dois separadores: Definições para o blogue atual (nome do blogue) e Definições globais para gerir as definições do blogue atual e as definições globais, respetivamente.
+ +Pode aceder diretamente às diferentes secções da página utilizando o menu pendente Goto .
+ + diff --git a/plugins/aboutConfig/locales/pt/help/help.html b/plugins/aboutConfig/locales/pt/help/help.html new file mode 100644 index 0000000..f08d7c2 --- /dev/null +++ b/plugins/aboutConfig/locales/pt/help/help.html @@ -0,0 +1,17 @@ + + +Esta página fornece informações técnicas sobre a configuração do blog atual (assim como uma configuração comum para todos os blogs). Estes parâmetros geralmente são gerenciados por outras páginas na interface de administração.
+ Só modifique algo aqui se você sabe o que está fazendo!
Alguns parâmetros só podem ser modificados nesta página.
+ +A página tem duas abas: Configurações para o atual blog (nome do blog) e Configurações globais para gerenciar as configurações atuais do blog e as configurações globais. respectivamente.
+ +Você pode acessar diretamente as diferentes seções de página usando o menu suspenso Ir.
+ + diff --git a/plugins/aboutConfig/locales/ru/help/help.html b/plugins/aboutConfig/locales/ru/help/help.html new file mode 100644 index 0000000..5a5671b --- /dev/null +++ b/plugins/aboutConfig/locales/ru/help/help.html @@ -0,0 +1,17 @@ + + +Ðа ÑÑой ÑÑÑаниÑе пÑиведена ÑеÑ
ниÑеÑÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ конÑигÑÑаÑии ÑекÑÑего блога (а Ñакже конÑигÑÑаÑÐ¸Ñ Ð¾Ð±Ñего Ð´Ð»Ñ Ð²ÑеÑ
блогов). ÐÑи паÑамеÑÑÑ Ð¾Ð±ÑÑно ÑпÑавлÑÑÑÑÑ Ð´ÑÑгими ÑÑÑаниÑами в инÑеÑÑейÑе админиÑÑÑиÑованиÑ.
+ ТолÑко модиÑиÑиÑÑйÑе ÑÑо-Ñо здеÑÑ, еÑли Ð²Ñ Ð·Ð½Ð°ÐµÑе, ÑÑо делаеÑе!
ÐекоÑоÑÑе паÑамеÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÑолÑко на ÑÑой ÑÑÑаниÑе.
+ +СÑÑаниÑа Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ðµ вкладки: ÐаÑÑÑойки Ð´Ð»Ñ ÑекÑÑего блога (Ð¸Ð¼Ñ Ð±Ð»Ð¾Ð³Ð°) и ÐлобалÑнÑе наÑÑÑойки Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑекÑÑими наÑÑÑойками блога и глобалÑнÑми наÑÑÑойками, ÑооÑвеÑÑÑвенно.
+ +ÐÑ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ Ð¿ÑÑмой доÑÑÑп к ÑазлиÑнÑм Ñазделам ÑÑÑаниÑÑ, иÑполÑзÑÑ Ð²ÑпадаÑÑее Ð¼ÐµÐ½Ñ Goto.
+ + diff --git a/plugins/aboutConfig/locales/sv/help/help.html b/plugins/aboutConfig/locales/sv/help/help.html new file mode 100644 index 0000000..578368a --- /dev/null +++ b/plugins/aboutConfig/locales/sv/help/help.html @@ -0,0 +1,17 @@ + + +Den här sidan innehåller teknisk information om konfigurationen av den aktuella bloggen (samt konfiguration som är gemensam för alla bloggar). Dessa parametrar hanteras vanligtvis av andra sidor i administrationsgränssnittet.
+ Ãndra bara nÃ¥got här om du vet vad du gör!
Vissa parametrar kan endast ändras på denna sida.
+ +Sidan har två flikar: Inställningar för den aktuella bloggen (bloggnamn) och Globala inställningar för att hantera inställningarna för den aktuella bloggen respektive de globala inställningarna.
+ +Du kan komma direkt till de olika sidavsnitten med hjälp av rullgardinsmenyn Goto .
+ + diff --git a/plugins/aboutConfig/locales/tr/help/help.html b/plugins/aboutConfig/locales/tr/help/help.html new file mode 100644 index 0000000..970d6ba --- /dev/null +++ b/plugins/aboutConfig/locales/tr/help/help.html @@ -0,0 +1,17 @@ + + +Bu sayfa, geçerli blogun yapılandırması (ve tüm bloglar için ortak yapılandırma) hakkında teknik bilgiler saÄlar. Bu parametreler genellikle yönetim arayüzündeki diÄer sayfalar tarafından yönetilir.
+ Burada yalnızca ne yaptıÄınızı biliyorsanız bir Åeyler deÄiÅtirin!
Bazı parametreler yalnızca bu sayfada deÄiÅtirilebilir.
+ +Sayfada iki sekme bulunmaktadır: Geçerli blog için ayarlar (blog adı) ve Genel ayarlar sırasıyla geçerli blog ayarlarını ve genel ayarları yönetmek için.
+ +Goto açılır menüsünü kullanarak farklı sayfa bölümlerine doÄrudan eriÅebilirsiniz.
+ + diff --git a/plugins/aboutConfig/locales/uk/help/help.html b/plugins/aboutConfig/locales/uk/help/help.html new file mode 100644 index 0000000..e4fd866 --- /dev/null +++ b/plugins/aboutConfig/locales/uk/help/help.html @@ -0,0 +1,17 @@ + + +Ð¦Ñ ÑÑоÑÑнка мÑÑÑиÑÑ ÑеÑ
нÑÑÐ½Ñ ÑнÑоÑмаÑÑÑ Ð¿Ñо конÑÑгÑÑаÑÑÑ Ð¿Ð¾ÑоÑного Ð±Ð»Ð¾Ð³Ñ (а Ñакож конÑÑгÑÑаÑÑÑ, ÑпÑлÑÐ½Ñ Ð´Ð»Ñ Ð²ÑÑÑ
блогÑв). Цими паÑамеÑÑами зазвиÑай кеÑÑÑÑÑ Ð½Ð° ÑнÑиÑ
ÑÑоÑÑнкаÑ
ÑнÑеÑÑейÑÑ Ð°Ð´Ð¼ÑнÑÑÑÑÑваннÑ.
+ ÐмÑнÑйÑе ÑоÑÑ ÑÑÑ, ÑÑлÑки ÑкÑо ви знаÑÑе, Ñо ÑобиÑе!
ÐеÑÐºÑ Ð¿Ð°ÑамеÑÑи можна змÑниÑи лиÑе на ÑÑй ÑÑоÑÑнÑÑ.
+ +СÑоÑÑнка Ð¼Ð°Ñ Ð´Ð²Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ¸: ÐалаÑÑÑÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑоÑного Ð±Ð»Ð¾Ð³Ñ (назва блогÑ) Ñа ÐлобалÑÐ½Ñ Ð½Ð°Ð»Ð°ÑÑÑÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÐºÐµÑÑÐ²Ð°Ð½Ð½Ñ Ð½Ð°Ð»Ð°ÑÑÑваннÑми поÑоÑного Ð±Ð»Ð¾Ð³Ñ Ñа глобалÑними налаÑÑÑваннÑми вÑдповÑдно.
+ +Ðи можеÑе оÑÑимаÑи пÑÑмий доÑÑÑп до ÑÑÐ·Ð½Ð¸Ñ ÑоздÑлÑв ÑÑоÑÑнки за Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð²Ð¸Ð¿Ð°Ð´Ð°ÑÑого Ð¼ÐµÐ½Ñ Goto .
+ + diff --git a/plugins/aboutConfig/locales/zh-cn/help/help.html b/plugins/aboutConfig/locales/zh-cn/help/help.html new file mode 100644 index 0000000..87a6043 --- /dev/null +++ b/plugins/aboutConfig/locales/zh-cn/help/help.html @@ -0,0 +1,17 @@ + + +è¿ä¸ªé¡µé¢æä¾äºå
³äºå½åå客é
ç½®çææ¯ä¿¡æ¯ï¼ä»¥åææå客çå
±åé
ç½®ï¼ãè¿äºåæ°é常ç±ç®¡ççé¢çå
¶ä»é¡µé¢ç®¡çã
+ åªæå¨ä½ ç¥éä½ å¨åä»ä¹çæ
åµä¸ï¼æå¯ä»¥å¨è¿éä¿®æ¹ä¸äºä¸è¥¿!
æäºåæ°åªè½å¨è¿ä¸ªé¡µé¢ä¸ä¿®æ¹ã
+ +è¯¥é¡µé¢æä¸¤ä¸ªæ ç¾ï¼ å½åå客ç设置ï¼å客åç§°ï¼ å å ¨å±è®¾ç½® ï¼åå«ç®¡çå½åå客ç设置åå ¨å±è®¾ç½®ã
+ +ä½ å¯ä»¥ä½¿ç¨ Goto 䏿èåç´æ¥è®¿é®ä¸åç页é¢é¨åã
+ + diff --git a/plugins/aboutConfig/src/Backend.php b/plugins/aboutConfig/src/Backend.php new file mode 100644 index 0000000..9f1715c --- /dev/null +++ b/plugins/aboutConfig/src/Backend.php @@ -0,0 +1,36 @@ +admin->part = !empty($_GET['part']) && $_GET['part'] === 'global' ? 'global' : 'local'; + } + + return self::status(); + } + + /** + * Processes the request(s). + */ + public static function process(): bool + { + if (!self::status()) { + return false; + } + + // Local navigation + if (!empty($_POST['gs_nav'])) { + My::redirect([], $_POST['gs_nav']); + } + if (!empty($_POST['ls_nav'])) { + My::redirect([], $_POST['ls_nav']); + } + + // Local settings update + if (!empty($_POST['s']) && is_array($_POST['s'])) { + try { + foreach ($_POST['s'] as $ns => $s) { + foreach ($s as $k => $v) { + if ($_POST['s_type'][$ns][$k] === dcNamespace::NS_ARRAY) { + $v = json_decode($v, true, 512, JSON_THROW_ON_ERROR); + } + dcCore::app()->blog->settings->$ns->put($k, $v); + } + dcCore::app()->blog->triggerBlog(); + } + + Notices::addSuccessNotice(__('Configuration successfully updated')); + My::redirect(); + } catch (Exception $e) { + dcCore::app()->error->add($e->getMessage()); + } + } + + // Global settings update + if (!empty($_POST['gs']) && is_array($_POST['gs'])) { + try { + foreach ($_POST['gs'] as $ns => $s) { + foreach ($s as $k => $v) { + if ($_POST['gs_type'][$ns][$k] === dcNamespace::NS_ARRAY) { + $v = json_decode($v, true, 512, JSON_THROW_ON_ERROR); + } + dcCore::app()->blog->settings->$ns->put($k, $v, null, null, true, true); + } + dcCore::app()->blog->triggerBlog(); + } + + Notices::addSuccessNotice(__('Configuration successfully updated')); + My::redirect([ + 'part' => 'global', + ]); + } catch (Exception $e) { + dcCore::app()->error->add($e->getMessage()); + } + } + + return true; + } + + /** + * Renders the page. + */ + public static function render(): void + { + if (!self::status()) { + return; + } + + Page::openModule( + My::name(), + Page::jsPageTabs(dcCore::app()->admin->part) . + My::jsLoad('index.js') + ); + + echo + Page::breadcrumb( + [ + __('System') => '', + Html::escapeHTML(dcCore::app()->blog->name) => '', + My::name() => '', + ] + ) . + Notices::getNotices() . + '| ' . __('Setting ID') . ' | ' . "\n" . + '' . __('Value') . ' | ' . "\n" . + '' . __('Type') . ' | ' . "\n" . + '' . __('Description') . ' | ' . "\n" . + '
|---|
Akismet خد٠ة ÙÙØªØ± Ø§ÙØ¨Ø±Ùد اÙ٠زعج ذات ÙÙØ§Ø¡Ø© خاصة ÙØ§ÙØªÙ ØªØªØ·ÙØ¨ Ù ÙØªØ§Ø API ÙÙØ¹Ù Ù.
+ +ÙÙØØµÙ٠عÙÙ Ù ÙØªØ§Ø APIØ Ø§ÙØªÙ٠إÙÙ ØµÙØØ© تسجÙÙ Ù ÙØªØ§Ø API Akismet ÙØ§Ø®ØªØ± Ø§ÙØ®Ø·Ø© Ø§ÙØªÙ ØªÙØ§Ø³Ø¨Ù Ø£ÙØ«Ø± Ù Ù ØºÙØ±Ù. ÙØ¬Ø¨ عÙÙÙ Ù ÙØ¡ اÙÙÙ ÙØ°Ø¬. ÙØ§ ØªÙØ³Ù ÙØªØ§Ø¨Ø© Ø¥Ø¶Ø§ÙØ§Øª Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ Ø§ÙØ®Ø§Øµ ب٠٠٠أج٠تÙÙÙ Ù ÙØªØ§Ø API. إذا ÙØ§Ù ÙØ¯ÙÙ ØØ³Ø§Ø¨ ÙÙØ±Ø¯Ø¨Ø±ÙØ³Ø ÙÙÙ ÙÙÙ Ø£ÙØ¶Ùا Ø§Ø³ØªØ®Ø¯Ø§Ù Ù Ø¹Ø±ÙØ§ØªÙ ÙÙØØµÙ٠عÙÙ Ù ÙØªØ§Ø API Akismet إذا اخترت Ø§ÙØ®Ø·Ø© "Ø§ÙØ´Ø®ØµÙØ©"Ø Ø³ÙÙÙ٠اÙÙ ÙØªØ§Ø ٠جاÙÙØ§ ÙØ³ØªØªÙ ÙÙ Ù Ù Ø§Ø³ØªØ®Ø¯Ø§Ù ÙØ§ عÙ٠٠دÙÙØ© ٠تعددة. +
+ +Ø£Ø¯Ø®Ù Ù ÙØªØ§Ø API ÙØÙØ¸Ù. إذا ØªÙ Ø§ÙØªØ¹Ø±Ù عÙ٠اÙÙ ÙØªØ§ØØ ÙØ¬Ø¨ Ø£Ù ØªØØµÙ عÙÙ Ø§ÙØ±Ø³Ø§ÙØ© Ø§ÙØªØ§ÙÙØ© "Ù ÙØªØ§Ø API اÙÙ ØØ¯Ø¯". Ø§ÙØ¹Ùدة Ø¥ÙÙ ÙØ§Ø¦Ù Ø© اÙÙÙØ§ØªØ± ÙØªÙعÙÙ Akismet إذا ÙÙ ÙØªÙ ذÙ٠بعد. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/de/help/help.html b/plugins/akismet/locales/de/help/help.html new file mode 100644 index 0000000..e89cda7 --- /dev/null +++ b/plugins/akismet/locales/de/help/help.html @@ -0,0 +1,18 @@ + + +Akismet ist ein besonders effizienter Spam-Filterdienst, der einen API-Schlüssel benötigt, um zu funktionieren.
+ +Um den API-Schlüssel zu erhalten, gehen Sie auf die Akismet-API-Schlüssel-Anmeldeseite und wählen Sie den Plan, der Ihnen am meisten zusagt. Sie müssen dann ein Formular ausfüllen. Vergessen Sie nicht, Ihre E-Mail-Adresse einzutragen, um den API-Schlüssel zu erhalten. Wenn Sie ein Wordpress-Konto haben, können Sie auch Ihre Kennungen verwenden, um den Akismet-API-Schlüssel zu erhalten. Wenn Sie sich für den "Personal"-Plan entscheiden, ist der Schlüssel kostenlos und Sie können ihn für einen Multiblog verwenden. +
+ +Geben Sie den API-Schlüssel ein und speichern Sie. Wenn der Schlüssel erkannt wird, sollten Sie die folgende Meldung erhalten: "API-Schlüssel geprüft". Gehen Sie zurück zur Filterliste, um Akismet zu aktivieren, falls dies noch nicht geschehen ist. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/el/help/help.html b/plugins/akismet/locales/el/help/help.html new file mode 100644 index 0000000..1a0c162 --- /dev/null +++ b/plugins/akismet/locales/el/help/help.html @@ -0,0 +1,18 @@ + + +Το Akismet είναι μια ιδιαίÏεÏα αÏοÏελεÏμαÏική Ï ÏηÏεÏία ÏίλÏÏÎ¿Ï spam ÏÎ¿Ï Î±ÏαιÏεί Îνα κλειδί API για να λειÏÎ¿Ï ÏγήÏει.
+ +Îια να αÏοκÏήÏεÏε Ïο κλειδί API, μεÏαβείÏε ÏÏη Ïελίδα the Akismet API key signup page και εÏιλÎξÏε Ïο ÏακÎÏο ÏÎ¿Ï ÏÎ±Ï ÏαιÏιάζει ÏεÏιÏÏÏÏεÏο. Îα ÏÏÎÏει να ÏÏ Î¼ÏληÏÏÏεÏε μια ÏÏÏμα. Îην ξεÏάÏεÏε να γÏάÏεÏε Ïην ηλεκÏÏονική ÏÎ±Ï Î´Î¹ÎµÏÎ¸Ï Î½Ïη για να λάβεÏε Ïο κλειδί API. Îν ÎÏεÏε λογαÏιαÏÎ¼Ï Wordpress, μÏοÏείÏε εÏίÏÎ·Ï Î½Î± ÏÏηÏιμοÏοιήÏεÏε Ïα αναγνÏÏιÏÏικά ÏÎ±Ï Î³Î¹Î± να λάβεÏε Ïο κλειδί Akismet API. Îν εÏιλÎξεÏε Ïο ÏακÎÏο "Personal", Ïο κλειδί θα είναι δÏÏεάν και θα μÏοÏείÏε να Ïο ÏÏηÏιμοÏοιήÏεÏε Ïε Îνα multiblog. +
+ +ÎιÏάγεÏε Ïο κλειδί API και αÏοθηκεÏÏÏε. Îάν Ïο κλειδί αναγνÏÏιÏÏεί, θα εμÏανιÏÏεί Ïο ακÏÎ»Î¿Ï Î¸Î¿ Î¼Î®Î½Ï Î¼Î± "API key checked". ÎÏιÏÏÏÎÏÏε ÏÏη λίÏÏα ÏίλÏÏÏν για να ενεÏγοÏοιήÏεÏε Ïο Akismet αν δεν ÎÏει γίνει ακÏμα. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/en/help/help.html b/plugins/akismet/locales/en/help/help.html new file mode 100644 index 0000000..81417e0 --- /dev/null +++ b/plugins/akismet/locales/en/help/help.html @@ -0,0 +1,18 @@ + + +Akismet is a particularly efficient spam filter service that requires an API key to work.
+ +To get the API key, go to the Akismet API key signup page and choose the plan that suits you the most. You'll have to fill a form. Don't forget to write down your email addres in order to receive the API key. If you have a Wordpress account, you can also use your identifiers to get the Akismet API key. If you choose the "Personal" plan, the key will be free and you'll be able to use it on a multiblog. +
+ +Enter the API key and save. If the key is recognised, you should get the following message "API key checked". Go back to the filter list to activate Akismet if it's not done yet. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/en/resources.php b/plugins/akismet/locales/en/resources.php new file mode 100644 index 0000000..448b873 --- /dev/null +++ b/plugins/akismet/locales/en/resources.php @@ -0,0 +1,11 @@ +resources['help']['akismet-filter'])) { + dcCore::app()->resources['help']['akismet-filter'] = __DIR__ . '/help/help.html'; +} diff --git a/plugins/akismet/locales/es-ar/help/help.html b/plugins/akismet/locales/es-ar/help/help.html new file mode 100644 index 0000000..ff83fc7 --- /dev/null +++ b/plugins/akismet/locales/es-ar/help/help.html @@ -0,0 +1,18 @@ + + +Akismet es un servicio de filtro de spam particularmente eficaz que requiere una clave API para funcionar.
+ +Para obtener la clave API, visita la página de registro de la clave API de Akismet y elige el plan que más te convenga. Tendrás que rellenar un formulario. No olvides escribir tu dirección de correo electrónico para recibir la clave API. Si tienes una cuenta de Wordpress, también puedes utilizar tus identificadores para obtener la clave API de Akismet. Si eliges el plan "Personal", la clave será gratuita y podrás utilizarla en un multiblog. +
+ +Introduzca la clave API y guarde. Si la clave es reconocida, deberÃas recibir el siguiente mensaje "Clave API comprobada". Vuelve a la lista de filtros para activar Akismet si aún no lo ha hecho. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/es/help/help.html b/plugins/akismet/locales/es/help/help.html new file mode 100644 index 0000000..ff83fc7 --- /dev/null +++ b/plugins/akismet/locales/es/help/help.html @@ -0,0 +1,18 @@ + + +Akismet es un servicio de filtro de spam particularmente eficaz que requiere una clave API para funcionar.
+ +Para obtener la clave API, visita la página de registro de la clave API de Akismet y elige el plan que más te convenga. Tendrás que rellenar un formulario. No olvides escribir tu dirección de correo electrónico para recibir la clave API. Si tienes una cuenta de Wordpress, también puedes utilizar tus identificadores para obtener la clave API de Akismet. Si eliges el plan "Personal", la clave será gratuita y podrás utilizarla en un multiblog. +
+ +Introduzca la clave API y guarde. Si la clave es reconocida, deberÃas recibir el siguiente mensaje "Clave API comprobada". Vuelve a la lista de filtros para activar Akismet si aún no lo ha hecho. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/fr/help/help.html b/plugins/akismet/locales/fr/help/help.html new file mode 100644 index 0000000..ebc566f --- /dev/null +++ b/plugins/akismet/locales/fr/help/help.html @@ -0,0 +1,18 @@ + + +Akismet est un service de filtrage du spam particulièrement efficace qui nécessite une clé API pour fonctionner.
+ +Pour obtenir la clé API, rendez vous sur la page d'obtention de clé d'Askimet (en anglais) puis faites le choix de blogs personnels (Personal Blogs), un formulaire s'offre à vous, renseignez bien votre e-mail car il servira à recevoir votre clé. Vous pouvez également utiliser les identifiants de votre compte Wordpress si vous en disposez pour obtenir la clé d'API Askimet. En choisissant blogs personnels, cette clé sera gratuite et utilisable sur un multiblog. +
+ +Entrez la clé API obtenue et enregistrez. Si la clé est reconnue, vous devriez voir apparaître le message "Clé API vérifiée. Retournez ensuite à la liste des filtres pour activer Akismet le cas échéant." +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/fr/resources.php b/plugins/akismet/locales/fr/resources.php new file mode 100644 index 0000000..448b873 --- /dev/null +++ b/plugins/akismet/locales/fr/resources.php @@ -0,0 +1,11 @@ +resources['help']['akismet-filter'])) { + dcCore::app()->resources['help']['akismet-filter'] = __DIR__ . '/help/help.html'; +} diff --git a/plugins/akismet/locales/it/help/help.html b/plugins/akismet/locales/it/help/help.html new file mode 100644 index 0000000..43f32cb --- /dev/null +++ b/plugins/akismet/locales/it/help/help.html @@ -0,0 +1,18 @@ + + +Akismet è un servizio di filtro spam particolarmente efficiente che richiede una chiave API per funzionare.
+ +Per ottenere la chiave API, vai a la pagina di registrazione delle chiavi API di Akismet e scegli il piano che più ti piace. Dovrai compilare un modulo. Non dimenticare di scrivere le tue email per ricevere la chiave API. Se si dispone di un account Wordpress, è anche possibile utilizzare i propri identificatori per ottenere la chiave API Akismet. Se scegli il piano "Personale", la chiave sarà gratuita e sarai in grado di utilizzarla su un multiblog. +
+ +Inserisci la chiave API e salva. Se la chiave è riconosciuta, dovresti ottenere il seguente messaggio "API key checked". Torna alla lista dei filtri per attivare Akismet se non è ancora finito. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/ja/help/help.html b/plugins/akismet/locales/ja/help/help.html new file mode 100644 index 0000000..0f5dc9e --- /dev/null +++ b/plugins/akismet/locales/ja/help/help.html @@ -0,0 +1,18 @@ + + +Akismetã¯ç¹ã«å¹ççãªã¹ãã ãã£ã«ã¿ãµã¼ãã¹ã§ãããåä½ããããã«APIãã¼ãå¿ è¦ã¨ãã¾ãã
+ +APIãã¼ãåå¾ããã«ã¯ã the Akismet API key signup page ã«ã¢ã¯ã»ã¹ããæãé©ãããã©ã³ã鏿ãã¦ãã ããããã©ã¼ã ã«å¿ è¦äºé ãè¨å ¥ãã¦ãã ãããAPIãã¼ãåãåãã«ã¯ãEã¡ã¼ã«ã¢ãã¬ã¹ãè¨å ¥ãããã¨ããå¿ããªããWordpressã®ã¢ã«ã¦ã³ãããæã¡ã®å ´åã¯ããã®IDã使ç¨ãã¦Akismet APIãã¼ãåå¾ãããã¨ãã§ãã¾ããPersonal "ãã©ã³ã鏿ããå ´åãAPIãã¼ã¯ç¡æã¨ãªãããã«ãããã°ã§ä½¿ç¨ãããã¨ãã§ãã¾ãã +
+ +API ãã¼ãå ¥åãã¦ä¿åãã¾ãããã¼ãèªèãããå ´åã¯ã次ã®ãããªã¡ãã»ã¼ã¸ã表示ããã¾ãã ãã£ã«ã¿ãªã¹ãã«æ»ããAkismetãã¾ã çµãã£ã¦ããªãå ´åã¯æå¹ã«ãã¦ãã ããã +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/ko/help/help.html b/plugins/akismet/locales/ko/help/help.html new file mode 100644 index 0000000..5584240 --- /dev/null +++ b/plugins/akismet/locales/ko/help/help.html @@ -0,0 +1,18 @@ + + +Akismetì í¹í í¨ì¨ì ì¸ ì¤í¸ íí° ìë¹ì¤ë¡, ìëíë ¤ë©´ API í¤ê° íìí©ëë¤.
+ +API í¤ë¥¼ ë°ì¼ë ¤ë©´ Akismet API í¤ ê°ì íì´ì§ ë¡ ì´ëíì¬ ê°ì¥ ì í©í ìê¸ì 를 ì ííì¸ì. ììì ìì±í´ì¼ í©ëë¤. API í¤ë¥¼ ë°ì¼ë ¤ë©´ ì´ë©ì¼ 주ì를 ì ì´ëë ê²ì ìì§ ë§ì¸ì. ìëíë ì¤ ê³ì ì´ ìë ê²½ì° ìë³ì를 ì¬ì©íì¬ Akismet API í¤ë¥¼ ë°ì ìë ììµëë¤. "ê°ì¸" ìê¸ì 를 ì ííë©´ í¤ê° 무ë£ë¡ ì ê³µëë©° ë©í°ë¸ë¡ê·¸ìì ì¬ì©í ì ììµëë¤. +
+ +API í¤ë¥¼ ì ë ¥íê³ ì ì¥í©ëë¤. í¤ê° ì¸ìëë©´ "API í¤ íì¸ë¨"ì´ë¼ë ë©ìì§ê° íìë©ëë¤. ìì§ ìë£ëì§ ìì ê²½ì° íí° ëª©ë¡ì¼ë¡ ëìê° Akismetì íì±íí©ëë¤. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/pt-br/help/help.html b/plugins/akismet/locales/pt-br/help/help.html new file mode 100644 index 0000000..d879dfd --- /dev/null +++ b/plugins/akismet/locales/pt-br/help/help.html @@ -0,0 +1,18 @@ + + +O Akismet é um serviço de filtragem de spam particularmente eficiente que requer uma chave API para funcionar.
+ +Para obter a chave da API, vá para a página de inscrição da chave da API Akismet e escolha o plano que mais lhe convém. Terá de preencher um formulário. Não se esqueça de escrever o seu endereço de correio eletrónico para receber a chave da API. Se tiver uma conta Wordpress, pode também utilizar os seus identificadores para obter a chave API Akismet. Se escolher o plano "Personal", a chave será gratuita e poderá utilizá-la num multiblog. +
+ +Introduza a chave API e guarde. Se a chave for reconhecida, deve receber a seguinte mensagem "Chave da API verificada". Volte à lista de filtros para ativar o Akismet, se ainda não o tiver feito. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/pt/help/help.html b/plugins/akismet/locales/pt/help/help.html new file mode 100644 index 0000000..e222643 --- /dev/null +++ b/plugins/akismet/locales/pt/help/help.html @@ -0,0 +1,18 @@ + + +Akismet é um serviço de filtro de spam particularmente eficiente que requer uma chave de API para funcionar.
+ +Para obter a chave de API, vá para a página de inscrição da chave de API Akismet e escolha o plano que mais lhe convier. Você precisará preencher um formulário. Não se esqueça de anotar suas extensões de e-mail para receber a chave de API. Se você tiver uma conta do Wordpress, você também pode usar seus identificadores para obter a chave de API do Akismet. Se você escolher o plano "Pessoal", a chave será gratuita e você poderá usá-la em um multiblog. +
+ +Digite a chave da API e salve. Se a chave for reconhecida, você deve obter a seguinte mensagem "Chave de API marcada". Volte para a lista de filtros para ativar o Akismet se ainda não estiver terminado. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/ru/help/help.html b/plugins/akismet/locales/ru/help/help.html new file mode 100644 index 0000000..52c7bf8 --- /dev/null +++ b/plugins/akismet/locales/ru/help/help.html @@ -0,0 +1,18 @@ + + +Akismet ÑвлÑеÑÑÑ Ð¾Ñобенно ÑÑÑекÑивнÑм ÑеÑвиÑом Ñпам-ÑилÑÑÑа, коÑоÑÑй ÑÑебÑÐµÑ API клÑÑ Ð´Ð»Ñ ÑабоÑÑ.
+ +ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ API клÑÑ, пеÑейдиÑе на ÑÑÑаниÑÑ ÑегиÑÑÑаÑии клÑÑа Akismet API и вÑбеÑиÑе план, коÑоÑÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð²Ð°Ð¼ болÑÑе вÑего. ÐÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½Ð¸ÑÑ ÑоÑмÑ. Ðе забÑдÑÑе запиÑаÑÑ Ñвой адÑÐµÑ ÑлекÑÑонной поÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа API. ÐÑли Ñ Ð²Ð°Ñ ÐµÑÑÑ Ð°ÐºÐºÐ°ÑÐ½Ñ Wordpress, Ð²Ñ Ñакже можеÑе иÑполÑзоваÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑоÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Akismet API клÑÑ. ÐÑли Ð²Ñ Ð²ÑбеÑеÑе план "ÐиÑнÑй", клÑÑ Ð±ÑÐ´ÐµÑ ÑвободнÑм, и Ð²Ñ ÑможеÑе иÑполÑзоваÑÑ ÐµÐ³Ð¾ в мÑлÑÑиблоге. +
+ +ÐведиÑе клÑÑ API и ÑÐ¾Ñ ÑаниÑе. ÐÑли клÑÑ ÑаÑпознан, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑледÑÑÑее ÑообÑение "API key checked". ÐеÑниÑеÑÑ Ðº ÑпиÑÐºÑ ÑилÑÑÑов, ÑÑÐ¾Ð±Ñ Ð°ÐºÑивиÑоваÑÑ Akismet, еÑли он еÑе не гоÑов. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/sv/help/help.html b/plugins/akismet/locales/sv/help/help.html new file mode 100644 index 0000000..bbe249a --- /dev/null +++ b/plugins/akismet/locales/sv/help/help.html @@ -0,0 +1,18 @@ + + +Akismet är en särskilt effektiv spamfiltertjänst som kräver en API-nyckel för att fungera.
+ +För att få API-nyckeln, gå till Akismet API key signup page och välj den plan som passar dig bäst. Du kommer att behöva fylla i ett formulär. Glöm inte att skriva ner din e-postadress för att få API-nyckeln. Om du har ett Wordpress-konto kan du också använda dina identifierare för att få Akismets API-nyckel. Om du väljer "Personal"-planen är nyckeln gratis och du kommer att kunna använda den på en multiblogg. +
+ +Ange API-nyckeln och spara. Om nyckeln känns igen bör du få följande meddelande "API-nyckel kontrollerad". Gå tillbaka till filterlistan för att aktivera Akismet om det inte är gjort ännu. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/tr/help/help.html b/plugins/akismet/locales/tr/help/help.html new file mode 100644 index 0000000..8c9871b --- /dev/null +++ b/plugins/akismet/locales/tr/help/help.html @@ -0,0 +1,18 @@ + + +Akismet, çalıÅmak için bir API anahtarı gerektiren özellikle etkili bir spam filtresi hizmetidir.
+ +API anahtarını almak için Akismet API anahtarı kayıt sayfası adresine gidin ve size en uygun planı seçin. Bir form doldurmanız gerekecek. API anahtarını almak için e-posta adresinizi yazmayı unutmayın. EÄer bir Wordpress hesabınız varsa, Akismet API anahtarını almak için tanımlayıcılarınızı da kullanabilirsiniz. "KiÅisel" planı seçerseniz, anahtar ücretsiz olacak ve birden fazla blogda kullanabileceksiniz. +
+ +API anahtarını girin ve kaydedin. Anahtar tanınırsa, aÅaÄıdaki mesajı almalısınız "API anahtarı kontrol edildi". Henüz yapılmadıysa Akismet'i etkinleÅtirmek için filtre listesine geri dönün. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/uk/help/help.html b/plugins/akismet/locales/uk/help/help.html new file mode 100644 index 0000000..f1028e0 --- /dev/null +++ b/plugins/akismet/locales/uk/help/help.html @@ -0,0 +1,18 @@ + + +Akismet - Ñе оÑобливо еÑекÑивний ÑеÑвÑÑ ÑÑлÑÑÑаÑÑÑ ÑпамÑ, Ð´Ð»Ñ ÑобоÑи Ñкого поÑÑÑбен клÑÑ API.
+ +Щоб оÑÑимаÑи API-клÑÑ, пеÑейдÑÑÑ Ð·Ð° поÑиланнÑм на ÑÑоÑÑÐ½ÐºÑ ÑеÑÑÑÑаÑÑÑ API-клÑÑÑв Akismet Ñа обеÑÑÑÑ ÑаÑиÑний план, Ñкий вам найбÑлÑÑе пÑÐ´Ñ Ð¾Ð´Ð¸ÑÑ. Ðам поÑÑÑбно бÑде заповниÑи ÑоÑмÑ. Ðе забÑдÑÑе вказаÑи ÑÐ²Ð¾Ñ ÐµÐ»ÐµÐºÑÑÐ¾Ð½Ð½Ñ Ð°Ð´ÑеÑи, Ñоб оÑÑимаÑи клÑÑ API. ЯкÑо Ñ Ð²Ð°Ñ Ñ Ð¾Ð±Ð»Ñковий Ð·Ð°Ð¿Ð¸Ñ Wordpress, ви Ñакож можеÑе викоÑиÑÑовÑваÑи ÑÐ²Ð¾Ñ ÑденÑиÑÑкаÑоÑи, Ñоб оÑÑимаÑи клÑÑ API Akismet. ЯкÑо ви обиÑаÑÑе ÑаÑиÑний план "ÐеÑÑоналÑний", клÑÑ Ð±Ñде безкоÑÑовним, Ñ Ð²Ð¸ зможеÑе викоÑиÑÑовÑваÑи його в мÑлÑÑиблозÑ. +
+ +ÐведÑÑÑ ÐºÐ»ÑÑ API Ñа збеÑежÑÑÑ Ð¹Ð¾Ð³Ð¾. ЯкÑо клÑÑ Ð±Ñде ÑозпÑзнано, ви Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¾ÑÑимаÑи наÑÑÑпне повÑÐ´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ "API-клÑÑ Ð¿ÐµÑевÑÑено". ÐовеÑнÑÑÑÑÑ Ð´Ð¾ ÑпиÑÐºÑ ÑÑлÑÑÑÑв, Ñоб акÑивÑваÑи Akismet, ÑкÑо Ñе Ñе не зÑоблено. +
+ + + \ No newline at end of file diff --git a/plugins/akismet/locales/zh-cn/help/help.html b/plugins/akismet/locales/zh-cn/help/help.html new file mode 100644 index 0000000..d0de480 --- /dev/null +++ b/plugins/akismet/locales/zh-cn/help/help.html @@ -0,0 +1,18 @@ + + +Akismetæ¯ä¸ä¸ªç¹å«ææçåå¾é®ä»¶è¿æ»¤æå¡ï¼éè¦ä¸ä¸ªAPIå¯é¥æè½å·¥ä½ã
+ +è¦è·å¾APIå¯é¥ï¼è¯·å° Akismet APIå¯é¥æ³¨åé¡µé¢ ï¼éæ©æéåä½ ç计åãä½ å°ä¸å¾ä¸å¡«åä¸ä¸ªè¡¨æ ¼ãä¸è¦å¿è®°åä¸ä½ ççµåé®ä»¶å°åï¼ä»¥ä¾¿æ¶å°APIå¯é¥ãå¦æä½ æä¸ä¸ªWordpressè´¦æ·ï¼ä½ ä¹å¯ä»¥ä½¿ç¨ä½ çæ è¯ç¬¦æ¥è·å¾Akismet APIå¯é¥ãå¦æä½ éæ© "个人 "计åï¼å¯é¥å°æ¯å è´¹çï¼ä½ å°è½å¤å¨å¤ä¸ªå客ä¸ä½¿ç¨å®ã +
+ +è¾å ¥APIå¯é¥å¹¶ä¿åã妿å¯é¥è¢«è¯å«ï¼ä½ åºè¯¥å¾å°ä»¥ä¸ä¿¡æ¯ "APIå¯é¥å·²æ£æ¥"ãåå°è¿æ»¤å¨åè¡¨ï¼æ¿æ´»Akismetï¼å¦æå®è¿æ²¡æå®æã +
+ + + \ No newline at end of file diff --git a/plugins/akismet/src/Akismet.php b/plugins/akismet/src/Akismet.php new file mode 100644 index 0000000..f36e953 --- /dev/null +++ b/plugins/akismet/src/Akismet.php @@ -0,0 +1,212 @@ +blog_url = $blog_url; + $this->ak_key = $api_key; + + $this->ak_path = sprintf($this->ak_path, $this->ak_version, '%s'); + $this->ak_host = $this->ak_key . '.' . $this->base_host; + + parent::__construct($this->ak_host, 80, DC_QUERY_TIMEOUT); + } + + /** + * Verify API key + * + * @return bool + */ + public function verify(): bool + { + $this->host = $this->base_host; + $path = sprintf($this->ak_path, 'verify-key'); + + $data = [ + 'key' => $this->ak_key, + 'blog' => $this->blog_url, + ]; + + if ($this->post($path, $data, 'UTF-8')) { + return $this->getContent() === 'valid'; + } + + return false; + } + + /** + * Check if a comment is valid or not + * + * @param string $permalink The permalink + * @param string $type The type + * @param null|string $author The author + * @param null|string $email The email + * @param null|string $url The url + * @param null|string $content The content + * + * @return bool + */ + public function comment_check(string $permalink, string $type, ?string $author, ?string $email, ?string $url, ?string $content): bool + { + $info_ignore = ['HTTP_COOKIE']; + $info = []; + + foreach ($_SERVER as $k => $v) { + if (strpos($k, 'HTTP_') === 0 && !in_array($k, $info_ignore)) { + $info[$k] = $v; + } + } + + return $this->callFunc('comment-check', $permalink, $type, $author, $email, $url, $content, $info); + } + + /** + * Submit positive (spam) comment to Akismet API + * + * @param string $permalink The permalink + * @param string $type The type + * @param null|string $author The author + * @param null|string $email The email + * @param null|string $url The url + * @param null|string $content The content + * + * @return bool + */ + public function submit_spam(string $permalink, string $type, ?string $author, ?string $email, ?string $url, ?string $content): bool + { + $this->callFunc('submit-spam', $permalink, $type, $author, $email, $url, $content); + + return true; + } + + /** + * Submit negative (not spam) comment to Akismet API + * + * @param string $permalink The permalink + * @param string $type The type + * @param null|string $author The author + * @param null|string $email The email + * @param null|string $url The url + * @param null|string $content The content + * + * @return bool + */ + public function submit_ham(string $permalink, string $type, ?string $author, ?string $email, ?string $url, ?string $content): bool + { + $this->callFunc('submit-ham', $permalink, $type, $author, $email, $url, $content); + + return true; + } + + /** + * Call an Akismet API method + * + * @param string $function The function + * @param string $permalink The permalink + * @param string $type The type + * @param string $author The author + * @param string $email The email + * @param string $url The url + * @param string $content The content + * @param array $info The information + * + * @throws Exception + * + * @return bool + */ + protected function callFunc(string $function, string $permalink, string $type, ?string $author, ?string $email, ?string $url, ?string $content, array $info = []): bool + { + $ua = $info['HTTP_USER_AGENT'] ?? ''; + $referer = $info['HTTP_REFERER'] ?? ''; + + # Prepare comment data + $data = [ + 'blog' => $this->blog_url, + 'user_ip' => Http::realIP(), + 'user_agent' => $ua, + 'referrer' => $referer, + 'permalink' => $permalink, + 'comment_type' => $type, + 'comment_author' => $author, + 'comment_author_email' => $email, + 'comment_author_url' => $url, + 'comment_content' => $content, + ]; + + $data = array_merge($data, $info); + + $this->host = $this->ak_host; + $path = sprintf($this->ak_path, $function); + + if (!$this->post($path, $data, 'UTF-8')) { + throw new Exception('HTTP error: ' . $this->getStatus()); + } + + return $this->getContent() === 'true'; + } +} diff --git a/plugins/akismet/src/AntispamFilterAkismet.php b/plugins/akismet/src/AntispamFilterAkismet.php new file mode 100644 index 0000000..8cd9c23 --- /dev/null +++ b/plugins/akismet/src/AntispamFilterAkismet.php @@ -0,0 +1,246 @@ +auth->isSuperAdmin()) { + $this->has_gui = false; + } + } + + /** + * Sets the filter description. + */ + protected function setInfo() + { + $this->description = __('Akismet spam filter'); + } + + /** + * Gets the status message. + * + * @param string $status The status + * @param int $comment_id The comment identifier + * + * @return string The status message. + */ + public function getStatusMessage(string $status, ?int $comment_id): string + { + return sprintf(__('Filtered by %s.'), $this->guiLink()); + } + + /** + * Return a new akismet instance of false if API key not defined + * + * @return Akismet|bool + */ + private function akInit() + { + if (!My::settings()->ak_key) { + return false; + } + + return new Akismet(dcCore::app()->blog->url, My::settings()->ak_key); + } + + /** + * This method should return if a comment is a spam or not. If it returns true + * or false, execution of next filters will be stoped. If should return nothing + * to let next filters apply. + * + * @param string $type The comment type (comment / trackback) + * @param string $author The comment author + * @param string $email The comment author email + * @param string $site The comment author site + * @param string $ip The comment author IP + * @param string $content The comment content + * @param int $post_id The comment post_id + * @param string $status The comment status + * + * @return mixed + */ + public function isSpam(string $type, ?string $author, ?string $email, ?string $site, ?string $ip, ?string $content, ?int $post_id, string &$status) + { + if (($ak = $this->akInit()) === false) { + return; + } + + try { + if ($ak->verify()) { + $post = dcCore::app()->blog->getPosts(['post_id' => $post_id]); + + $c = $ak->comment_check( + $post->getURL(), + $type, + $author, + $email, + $site, + $content + ); + + if ($c) { + $status = 'Filtered by Akismet'; + + return true; + } + } + } catch (Exception $e) { + // If http or akismet is dead, we don't need to know it + } + } + + /** + * Train the antispam filter + * + * @param string $status The comment status + * @param string $filter The filter + * @param string $type The comment type + * @param string $author The comment author + * @param string $email The comment author email + * @param string $site The comment author site + * @param string $ip The comment author IP + * @param string $content The comment content + * @param MetaRecord $rs The comment record + */ + public function trainFilter(string $status, string $filter, string $type, ?string $author, ?string $email, ?string $site, ?string $ip, ?string $content, MetaRecord $rs) + { + # We handle only false positive from akismet + if ($status === 'spam' && $filter !== 'dcFilterAkismet') { + return; + } + + $f = $status === 'spam' ? 'submit_spam' : 'submit_ham'; + + if (($ak = $this->akInit()) === false) { + return; + } + + try { + if ($ak->verify()) { + $ak->{$f}($rs->getPostURL(), $type, $author, $email, $site, $content); + } + } catch (Exception $e) { + // If http or akismet is dead, we don't need to know it + } + } + + /** + * Filter settings + * + * @param string $url The GUI URL + * + * @return string + */ + public function gui($url): string + { + $ak_key = My::settings()->ak_key; + $ak_verified = null; + + if (isset($_POST['ak_key'])) { + try { + $ak_key = $_POST['ak_key']; + + My::settings()->put('ak_key', $ak_key, 'string'); + + Notices::addSuccessNotice(__('Filter configuration have been successfully saved.')); + Http::redirect($url); + } catch (Exception $e) { + dcCore::app()->error->add($e->getMessage()); + } + } + + if (My::settings()->ak_key) { + try { + $ak = new Akismet(dcCore::app()->blog->url, My::settings()->ak_key); + $ak_verified = $ak->verify(); + } catch (Exception $e) { + dcCore::app()->error->add($e->getMessage()); + } + } + + $res = Notices::getNotices(); + + $res .= ''; + + return $res; + } +} diff --git a/plugins/akismet/src/My.php b/plugins/akismet/src/My.php new file mode 100644 index 0000000..ff08546 --- /dev/null +++ b/plugins/akismet/src/My.php @@ -0,0 +1,19 @@ +spamfilters[] = AntispamFilterAkismet::class; + + return true; + } +} diff --git a/plugins/antispam/_admin.php b/plugins/antispam/_admin.php deleted file mode 100644 index 758b0d9..0000000 --- a/plugins/antispam/_admin.php +++ /dev/null @@ -1,51 +0,0 @@ -addItem(__('Antispam'),'plugin.php?p=antispam','index.php?pf=antispam/icon.png', - preg_match('/plugin.php\?p=antispam(&.*)?$/',$_SERVER['REQUEST_URI']), - $core->auth->check('admin',$core->blog->id)); - -$core->addBehavior('coreAfterCommentUpdate',array('dcAntispam','trainFilters')); -$core->addBehavior('adminAfterCommentDesc',array('dcAntispam','statusMessage')); -$core->addBehavior('adminDashboardIcons',array('dcAntispam','dashboardIcon')); - -if (!DC_ANTISPAM_CONF_SUPER || $core->auth->isSuperAdmin()) { - $core->addBehavior('adminBlogPreferencesForm',array('antispamBehaviors','adminBlogPreferencesForm')); - $core->addBehavior('adminBeforeBlogSettingsUpdate',array('antispamBehaviors','adminBeforeBlogSettingsUpdate')); -} - -class antispamBehaviors -{ - public static function adminBlogPreferencesForm(&$core,&$settings) - { - echo - ''; - } - - public static function adminBeforeBlogSettingsUpdate(&$settings) - { - $settings->setNameSpace('antispam'); - $settings->put('antispam_moderation_ttl',(integer)$_POST['antispam_moderation_ttl']); - $settings->setNameSpace('system'); - } -} -?> \ No newline at end of file diff --git a/plugins/antispam/_define.php b/plugins/antispam/_define.php index 39d91f8..a7b0fdc 100644 --- a/plugins/antispam/_define.php +++ b/plugins/antispam/_define.php @@ -1,22 +1,28 @@ registerModule( - /* Name */ "Antispam", - /* Description*/ "Generic antispam plugin for Dotclear", - /* Author */ "Alain Vagner", - /* Version */ '1.2', - /* Permissions */ 'usage,contentadmin', - /* Priority */ 10 + 'Antispam', // Name + 'Generic antispam plugin for Dotclear', // Description + 'Alain Vagner', // Author + '2.0', // Version + [ + 'type' => 'plugin', + 'permissions' => dcCore::app()->auth->makePermissions([ + dcAuth::PERMISSION_USAGE, + dcAuth::PERMISSION_CONTENT_ADMIN, + ]), + 'priority' => 10, + 'settings' => [ + 'self' => '', + 'blog' => '#params.antispam_params', + ], + ] ); -?> \ No newline at end of file diff --git a/plugins/antispam/_init.php b/plugins/antispam/_init.php new file mode 100644 index 0000000..f393cf6 --- /dev/null +++ b/plugins/antispam/_init.php @@ -0,0 +1,19 @@ +plugins->moduleInfo('antispam','version'); -if (version_compare($core->getVersion('antispam'),$version,'>=')) { - return; -} - -/* Database schema --------------------------------------------------------- */ -$s = new dbStruct($core->con,$core->prefix); - -$s->spamrule - ->rule_id ('bigint', 0, false) - ->blog_id ('varchar', 32, true) - ->rule_type ('varchar', 16, false, "'word'") - ->rule_content ('varchar', 128, false) - - ->primary('pk_spamrule','rule_id') - ; - -$s->spamrule->index('idx_spamrule_blog_id','btree','blog_id'); -$s->spamrule->reference('fk_spamrule_blog','blog_id','blog','blog_id','cascade','cascade'); - -if ($s->driver() == 'pgsql') { - $s->spamrule->index('idx_spamrule_blog_id_null','btree','(blog_id IS NULL)'); -} - -# Schema installation -$si = new dbStruct($core->con,$core->prefix); -$changes = $si->synchronize($s); - -# Creating default wordslist -if ($core->getVersion('antispam') === null) { - $_o = new dcFilterWords($core); - $_o->defaultWordsList(); - unset($_o); -} - -$core->setVersion('antispam',$version); -return true; -?> \ No newline at end of file diff --git a/plugins/antispam/_prepend.php b/plugins/antispam/_prepend.php deleted file mode 100644 index 1f16bbd..0000000 --- a/plugins/antispam/_prepend.php +++ /dev/null @@ -1,30 +0,0 @@ -spamfilters = array('dcFilterIP','dcFilterWords','dcFilterIpLookup','dcFilterLinksLookup'); - -$core->url->register('spamfeed','spamfeed','^spamfeed/(.+)$',array('dcAntispamURL','spamFeed')); -$core->url->register('hamfeed','hamfeed','^hamfeed/(.+)$',array('dcAntispamURL','hamFeed')); -?> \ No newline at end of file diff --git a/plugins/antispam/_public.php b/plugins/antispam/_public.php deleted file mode 100644 index 2d7cf87..0000000 --- a/plugins/antispam/_public.php +++ /dev/null @@ -1,17 +0,0 @@ -addBehavior('publicBeforeCommentCreate',array('dcAntispam','isSpam')); -$core->addBehavior('publicBeforeTrackbackCreate',array('dcAntispam','isSpam')); -$core->addBehavior('publicBeforeDocument',array('dcAntispam','purgeOldSpam')); -?> \ No newline at end of file diff --git a/plugins/antispam/antispam.js b/plugins/antispam/antispam.js deleted file mode 100644 index 8f243e9..0000000 --- a/plugins/antispam/antispam.js +++ /dev/null @@ -1,3 +0,0 @@ - -var dragsort=ToolMan.dragsort();$(function(){$("#filters-list").each(function(){dragsort.makeTableSortable(this,dotclear.sortable.setHandle,dotclear.sortable.saveOrder);});});dotclear.sortable={setHandle:function(item){var handle=$(item).find('td.handle').get(0);while(handle.firstChild){handle.removeChild(handle.firstChild);} -item.toolManDragGroup.setHandle(handle);$(handle).addClass('handler');},saveOrder:function(item){var group=item.toolManDragGroup;var order=$('#filters_order').get(0);group.register('dragend',function(){order.value='';items=item.parentNode.getElementsByTagName('tr');for(var i=0;i'.__('No IP address in list.').'
'; - } - else - { - $res .= - ''; - } - - $res .= ''.__('No word in list.').'
'; - } - else - { - $res .= - ''; - } - - if ($core->auth->isSuperAdmin()) - { - $res .= - ''; - } - - return $res; - } - - private function getRules() - { - $strReq = 'SELECT rule_id, blog_id, rule_content '. - 'FROM '.$this->table.' '. - "WHERE rule_type = 'word' ". - "AND ( blog_id = '".$this->con->escape($this->core->blog->id)."' ". - "OR blog_id IS NULL ) ". - 'ORDER BY blog_id ASC, rule_content ASC '; - - return $this->con->select($strReq); - } - - private function addRule($content,$general=false) - { - $strReq = 'SELECT rule_id FROM '.$this->table.' '. - "WHERE rule_type = 'word' ". - "AND rule_content = '".$this->con->escape($content)."' "; - $rs = $this->con->select($strReq); - - if (!$rs->isEmpty()) { - throw new Exception(__('This word exists')); - } - - $rs = $this->con->select('SELECT MAX(rule_id) FROM '.$this->table); - $id = (integer) $rs->f(0) + 1; - - $cur = $this->con->openCursor($this->table); - $cur->rule_id = $id; - $cur->rule_type = 'word'; - $cur->rule_content = (string) $content; - - if ($general && $this->core->auth->isSuperAdmin()) { - $cur->blog_id = null; - } else { - $cur->blog_id = $this->core->blog->id; - } - - $cur->insert(); - } - - private function removeRule($ids) - { - $strReq = 'DELETE FROM '.$this->table.' '; - - if (is_array($ids)) { - foreach ($ids as &$v) { - $v = (integer) $v; - } - $strReq .= 'WHERE rule_id IN ('.implode(',',$ids).') '; - } else { - $ids = (integer) $ids; - $strReq .= 'WHERE rule_id = '.$ids.' '; - } - - if (!$this->core->auth->isSuperAdmin()) { - $strReq .= "AND blog_id = '".$this->con->escape($this->core->blog->id)."' "; - } - - $this->con->execute($strReq); - } - - public function defaultWordsList() - { - $words = array( - '/-credit(\s+|$)/', - '/-digest(\s+|$)/', - '/-loan(\s+|$)/', - '/-online(\s+|$)/', - '4u', - 'adipex', - 'advicer', - 'ambien', - 'baccarat', - 'baccarrat', - 'blackjack', - 'bllogspot', - 'bolobomb', - 'booker', - 'byob', - 'car-rental-e-site', - 'car-rentals-e-site', - 'carisoprodol', - 'cash', - 'casino', - 'casinos', - 'chatroom', - 'cialis', - 'craps', - 'credit-card', - 'credit-report-4u', - 'cwas', - 'cyclen', - 'cyclobenzaprine', - 'dating-e-site', - 'day-trading', - 'debt', - 'digest-', - 'discount', - 'discreetordering', - 'duty-free', - 'dutyfree', - 'estate', - 'favourits', - 'fioricet', - 'flowers-leading-site', - 'freenet', - 'freenet-shopping', - 'gambling', - 'gamias', - 'health-insurancedeals-4u', - 'holdem', - 'holdempoker', - 'holdemsoftware', - 'holdemtexasturbowilson', - 'hotel-dealse-site', - 'hotele-site', - 'hotelse-site', - 'incest', - 'insurance-quotesdeals-4u', - 'insurancedeals-4u', - 'jrcreations', - 'levitra', - 'macinstruct', - 'mortgage', - 'online-gambling', - 'onlinegambling-4u', - 'ottawavalleyag', - 'ownsthis', - 'palm-texas-holdem-game', - 'paxil', - 'pharmacy', - 'phentermine', - 'pills', - 'poker', - 'poker-chip', - 'poze', - 'prescription', - 'rarehomes', - 'refund', - 'rental-car-e-site', - 'roulette', - 'shemale', - 'slot', - 'slot-machine', - 'soma', - 'taboo', - 'tamiflu', - 'texas-holdem', - 'thorcarlson', - 'top-e-site', - 'top-site', - 'tramadol', - 'trim-spa', - 'ultram', - 'v1h', - 'vacuum', - 'valeofglamorganconservatives', - 'viagra', - 'vicodin', - 'vioxx', - 'xanax', - 'zolus' - ); - - foreach ($words as $w) { - try { - $this->addRule($w,true); - } catch (Exception $e) {} - } - } -} -?> \ No newline at end of file diff --git a/plugins/antispam/icon-dark.svg b/plugins/antispam/icon-dark.svg new file mode 100644 index 0000000..b4ebf93 --- /dev/null +++ b/plugins/antispam/icon-dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/antispam/icon.png b/plugins/antispam/icon.png deleted file mode 100644 index 2011311..0000000 Binary files a/plugins/antispam/icon.png and /dev/null differ diff --git a/plugins/antispam/icon.svg b/plugins/antispam/icon.svg new file mode 100644 index 0000000..8f90212 --- /dev/null +++ b/plugins/antispam/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/plugins/antispam/inc/class.dc.spamfilter.php b/plugins/antispam/inc/class.dc.spamfilter.php deleted file mode 100644 index 6e657d5..0000000 --- a/plugins/antispam/inc/class.dc.spamfilter.php +++ /dev/null @@ -1,161 +0,0 @@ -dcCore Dotclear core object - */ - public function __construct(&$core) - { - $this->core =& $core; - $this->setInfo(); - - if (!$this->name) { - $this->name = get_class($this); - } - - $this->gui_url = 'plugin.php?p=antispam&f='.get_class($this); - } - - /** - This method is called by the constructor and allows you to change some - object properties without overloading object constructor. - */ - protected function setInfo() - { - $this->description = __('No description'); - } - - /** - This method should return if a comment is a spam or not. If it returns true - or false, execution of next filters will be stoped. If should return nothing - to let next filters apply. - - Your filter should also fill $status variable with its own information if - comment is a spam. - - @param type string Comment type (comment or trackback) - @param author string Comment author - @param email string Comment author email - @param site string Comment author website - @param ip string Comment author IP address - @param content string Comment content - @param post_id integer Comment post_id - @param[out] status integer Comment status - @return boolean - */ - public function isSpam($type,$author,$email,$site,$ip,$content,$post_id,&$status) - { - } - - /** - This method is called when a non-spam (ham) comment becomes spam or when a - spam becomes a ham. - - @param type string Comment type (comment or trackback) - @param filter string Filter name - @param author string Comment author - @param email string Comment author email - @param site string Comment author website - @param ip string Comment author IP address - @param content string Comment content - @param post_url string Post URL - @param rs record Comment record - @return boolean - */ - public function trainFilter($status,$filter,$type,$author,$email,$site,$ip,$content,$rs) - { - } - - /** - This method returns filter status message. You can overload this method to - return a custom message. Message is shown in comment details and in - comments list. - - @param status string Filter status. - @param comment_id record Comment record - @return string - */ - public function getStatusMessage($status,$comment_id) - { - return sprintf(__('Filtered by %1$s (%2$s)'),$this->guiLink(),$status); - } - - /** - This method is called when you enter filter configuration. Your class should - have $has_gui property set to "true" to enable GUI. - - In this method you should put everything related to filter configuration. - $url variable is the URL of GUI unescaped. - - @param url string GUI URL. - */ - public function gui($url) - { - } - - public function hasGUI() - { - if (!$this->core->auth->check('admin',$this->core->blog->id)) { - return false; - } - - if (!$this->has_gui) { - return false; - } - - return true; - } - - public function guiURL() - { - if (!$this->hasGui()) { - return false; - } - - return $this->gui_url; - } - - /** - Returns a link to filter GUI if exists or only filter name if has_gui - property is false. - - @return string - */ - public function guiLink() - { - if (($url = $this->guiURL()) !== false) { - $url = html::escapeHTML($url); - $link = '%1$s'; - } else { - $link = '%1$s'; - } - - return sprintf($link,$this->name,$url); - } -} -?> \ No newline at end of file diff --git a/plugins/antispam/inc/class.dc.spamfilters.php b/plugins/antispam/inc/class.dc.spamfilters.php deleted file mode 100644 index e921d7f..0000000 --- a/plugins/antispam/inc/class.dc.spamfilters.php +++ /dev/null @@ -1,164 +0,0 @@ -core =& $core; - } - - public function init($filters) - { - foreach ($filters as $f) - { - if (!class_exists($f)) { - continue; - } - - $r = new ReflectionClass($f); - $p = $r->getParentClass(); - - if (!$p || $p->name != 'dcSpamFilter') { - continue; - } - - $this->filters[$f] = new $f($this->core); - } - - $this->setFilterOpts(); - if (!empty($this->filters_opt)) { - uasort($this->filters,array($this,'orderCallBack')); - } - } - - public function getFilters() - { - return $this->filters; - } - - public function isSpam(&$cur) - { - foreach ($this->filters as $fid => $f) - { - if (!$f->active) { - continue; - } - - $type = $cur->comment_trackback ? 'trackback' : 'comment'; - $author = $cur->comment_author; - $email = $cur->comment_email; - $site = $cur->comment_site; - $ip = $cur->comment_ip; - $content = $cur->comment_content; - $post_id = $cur->post_id; - - $is_spam = $f->isSpam($type,$author,$email,$site,$ip,$content,$post_id,$status); - - if ($is_spam === true) { - if ($f->auto_delete) { - $cur->clean(); - } else { - $cur->comment_status = -2; - $cur->comment_spam_status = $status; - $cur->comment_spam_filter = $fid; - } - return true; - } elseif ($is_spam === false) { - return false; - } - } - - return false; - } - - public function trainFilters(&$rs,$status,$filter_name) - { - foreach ($this->filters as $fid => $f) - { - if (!$f->active) { - continue; - } - - $type = $rs->comment_trackback ? 'trackback' : 'comment'; - $author = $rs->comment_author; - $email = $rs->comment_email; - $site = $rs->comment_site; - $ip = $rs->comment_ip; - $content = $rs->comment_content; - - $f->trainFilter($status,$filter_name,$type,$author,$email,$site,$ip,$content,$rs); - } - } - - public function statusMessage(&$rs,$filter_name) - { - $f = isset($this->filters[$filter_name]) ? $this->filters[$filter_name] : null; - - if ($f === null) - { - return __('Unknown filter.'); - } - else - { - $status = $rs->exists('comment_spam_status') ? $rs->comment_spam_status : null; - - return $f->getStatusMessage($status,$rs->comment_id); - } - } - - public function saveFilterOpts($opts,$global=false) - { - $this->core->blog->settings->setNameSpace('antispam'); - if ($global) { - $this->core->blog->settings->drop('antispam_filters'); - } - $this->core->blog->settings->put('antispam_filters',serialize($opts),'string','Antispam Filters',true,$global); - } - - private function setFilterOpts() - { - if ($this->core->blog->settings->antispam_filters !== null) { - $this->filters_opt = @unserialize($this->core->blog->settings->antispam_filters); - } - - # Create default options if needed - if (!is_array($this->filters_opt)) { - $this->saveFilterOpts(array(),true); - $this->filters_opt = array(); - } - - foreach ($this->filters_opt as $k => $o) - { - if (isset($this->filters[$k]) && is_array($o)) { - $this->filters[$k]->active = isset($o[0])?$o[0]:false; - $this->filters[$k]->order = isset($o[1])?$o[1]:0; - $this->filters[$k]->auto_delete = isset($o[2])?$o[2]:false; - } - } - } - - private function orderCallBack($a,$b) - { - if ($a->order == $b->order) { - return 0; - } - - return $a->order > $b->order ? 1 : -1; - } -} -?> \ No newline at end of file diff --git a/plugins/antispam/inc/lib.dc.antispam.php b/plugins/antispam/inc/lib.dc.antispam.php deleted file mode 100644 index 04adfb4..0000000 --- a/plugins/antispam/inc/lib.dc.antispam.php +++ /dev/null @@ -1,195 +0,0 @@ -spamfilters)) { - return; - } - - self::$filters = new dcSpamFilters($core); - self::$filters->init($core->spamfilters); - } - - public static function isSpam(&$cur) - { - self::initFilters(); - self::$filters->isSpam($cur); - } - - public static function trainFilters(&$blog,&$cur,&$rs) - { - $status = null; - # From ham to spam - if ($rs->comment_status != -2 && $cur->comment_status == -2) { - $status = 'spam'; - } - - # From spam to ham - if ($rs->comment_status == -2 && $cur->comment_status == 1) { - $status = 'ham'; - } - - # the status of this comment has changed - if ($status) - { - $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null; - - self::initFilters(); - self::$filters->trainFilters($rs,$status,$filter_name); - } - } - - public static function statusMessage(&$rs) - { - if ($rs->exists('comment_status') && $rs->comment_status == -2) - { - $filter_name = $rs->exists('comment_spam_filter') ? $rs->comment_spam_filter : null; - - self::initFilters(); - - return - ''.__('This comment is a spam:').' '. - self::$filters->statusMessage($rs,$filter_name).'
'; - } - } - - public static function dashboardIcon(&$core, &$icons) - { - if (($count = self::countSpam($core)) > 0) { - $str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)'); - $icons['comments'][0] .= 'IP: '.$rs->comment_ip;
-
- if (trim($rs->comment_site)) {
- $content .= '
URL: '.$rs->comment_site.'';
- }
- $content .= "
Ø§ÙØ±Ø³Ø§Ø¦Ù ØºÙØ± اÙÙ Ø±ØºÙØ¨ ÙÙÙØ§Ø عادة ٠ا تÙÙÙ Ø§ÙØªØ¹ÙÙÙØ§Øª اÙÙ ÙØ´Ùرة Ø¨ÙØ§Ø³Ø·Ø© Ø§ÙØ±ÙØ¨ÙØªØ§Øª.
+ +ÙÙØ¯ Ø§ÙØªÙÙ Ø§ÙØªØ°Ù ر ÙÙ Ø§ÙØªØ¹ÙÙÙØ§Øª ÙØ§ÙØ±Ø¯ÙØ¯ Ù Ù Ù Ø³Ø£ÙØ© ØÙØ§ÙØ© Ø¥ÙÙ Ù Ø´ÙÙØ© ÙØ§Ø¦ÙØ©. ÙÙ ÙØ°Ù Ø§ÙØ£ÙØ§Ù Ø Ù Ù Ø§ÙØ¥Ø¬Ø¨Ø§Ø±Ù Ø§ÙØØµÙ٠عÙÙ Ù Ø¬Ù ÙØ¹Ø© Ù Ù Ø¹ÙØ§Ù Ù Ø§ÙØªØµÙÙØ© ÙÙØªØÙ٠٠٠ا إذا ÙØ§Ù Ø§ÙØªØ¹ÙÙÙ ÙØ¯ ÙÙÙÙ ØºÙØ± Ù Ø±ØºÙØ¨ ÙÙÙ Ø£Ù ÙØ§. ÙØ°Ø§ ÙÙ Ø§ÙØºØ±Ø¶ Ù Ù Ø§ÙØ¨Ø±Ùا٠ج اÙ٠ساعد ÙÙ ÙØ§ÙØØ© Ø§ÙØ¨Ø±Ùد اÙ٠زعج.
+ +ÙØ°Ø§ اÙÙÙØªØ± ÙØ³Ù Ø Ù٠باÙÙØ§Ø¦Ù Ø© Ø§ÙØ³Ùداء Ø£Ù Ø¹ÙØ§ÙÙÙ IP اÙÙØ§Ø¦Ù Ø© Ø§ÙØ¨Ùضاء ÙØ¯ÙÙÙØ§. Ø§ÙØªØ¹ÙÙ٠اÙÙØ§Ø¯Ù ٠٠عÙÙØ§Ù IP اÙÙØ§Ø±Ø¯ ÙÙ ÙØ³Ù اÙÙØ§Ø¦Ù Ø© Ø§ÙØ³Ùداء Ø³ÙØ¹ØªØ¨Ø± ÙÙØ±Ø§Ù ØºÙØ± Ù Ø±ØºÙØ¨ ÙÙÙ. Ø§ÙØªØ¹ÙÙ٠اÙÙØ§Ø¯Ù ٠٠عÙÙØ§Ù IP اÙÙØ§Ø±Ø¯ ÙÙ ÙØ³Ù اÙÙØ§Ø¦Ù Ø© Ø§ÙØ¨Ùضاء سÙÙ ÙØ¹ØªØ¨Ø± Ù ÙØ«ÙÙØ§ ب٠٠ÙÙØ§ØªØ± Ù ÙØ§ÙØØ© Ø§ÙØ¨Ø±Ùد اÙ٠زعج Ø§ÙØ£Ø®Ø±Ù ÙÙ ØªØ¹Ø§ÙØ¬Ù.
+ +ÙØ¥Ø¶Ø§ÙØ© IP Ø Ø£ÙÙØ§Ù ØØ¯Ø¯ Ø¹ÙØ§Ù Ø© Ø§ÙØªØ¨ÙÙØ¨ Ø§ÙØªÙ ØªØ±ÙØ¯Ùا (اÙÙØ§Ø¦Ù Ø© Ø§ÙØ³Ùداء أ٠اÙÙØ§Ø¦Ù Ø© Ø§ÙØ¨ÙØ¶Ø§Ø¡ÙØ£Ø¯Ø®Ù عÙÙØ§Ù IP ٠ربع Ø§ÙØ§Ø®ØªÙار Ø§ÙØ¹Ø§ÙÙ Ù ÙÙIP Ù ØªØ§Ø Ø¥Ø°Ø§ ÙÙØª اÙ٠سؤÙ٠اÙ٠٠تاز ÙØ³ØªØ³Ù Ø ÙÙ Ø¨Ø¥Ø¶Ø§ÙØ© عÙÙØ§Ù IP Ø¥ÙÙ Ø¬Ù ÙØ¹ ٠دÙÙØ§Øª ØªØ«Ø¨ÙØª Dotclear.
+ +ÙÙ ÙÙÙ Ø¥Ø¶Ø§ÙØ© Ø¹ÙØ§ÙÙÙ IP ٠ع ÙÙØ§Ø¹ Ø§ÙØ´Ø¨ÙØ© ÙÙ ÙØ¹ Ø£Ù Ø§ÙØ³Ù Ø§Ø Ø¨Ù Ø¬Ù ÙØ¹Ø© Ù Ù Ø¹ÙØ§ÙÙÙ IP عÙ٠سبÙ٠اÙ٠ثاÙ:
+127.0.0.0/255.0.0 أ٠اÙÙÙ
ÙØ°Ø¬ اÙÙ
ختصر 127/8 سÙÙ ÙØªØ¹Ø±Ù عÙ٠جÙ
ÙØ¹ Ø¹ÙØ§ÙÙÙ IP Ù
ث٠127.xxx.xxx.xxxx127.0.0.0/255.0.0 أ٠اÙÙÙ
ÙØ°Ø¬ اÙÙ
ختصر 127.0/16 Ø³ÙØªØ¹Ø±Ù عÙ٠جÙ
ÙØ¹ Ø¹ÙØ§ÙÙÙ IP Ù
ث٠127.0.xxxx.xxx127.0.0.0/255.255.255.0 أ٠اÙÙÙ
ÙØ°Ø¬ اÙÙ
ختصر 127.0.0/24 سÙÙ ÙØªØ¹Ø±Ù عÙ٠جÙ
ÙØ¹ Ø¹ÙØ§ÙÙÙ IP Ù
ث٠127.0.xxxØ§ÙØ¨ØØ« ع٠IP Ù٠عاÙ
٠تصÙÙØ© ÙÙØØµ عÙÙØ§Ù IP ÙÙØ§ØªØ¨ Ø§ÙØªØ¹ÙÙ٠عÙÙ ÙÙØ§Ø¦Ù
Ù
Ø´ØªØ±ÙØ© تسÙ
Ù ÙØ§Ø¦Ù
Ø© Ø§ÙØÙØ± اÙÙØ§Ø¦Ù
Ø© عÙÙ DNS (DNSBL) (اÙÙ
عرÙÙØ© Ø£ÙØ¶Ùا باسÙ
ÙØ§Ø¦Ù
Ø© Ø§ÙØÙØ± Ø§ÙØ³Ùداء Ù٠اÙÙÙØª Ø§ÙØÙÙÙÙ). بشÙÙ Ø§ÙØªØ±Ø§Ø¶ÙØ ÙØ³ØªØ®Ø¯Ù
اÙÙÙØªØ± Ø§ÙØ®ÙادÙ
Ø§ÙØªØ§ÙÙØ©: sbl-xbl.spamhaus.org Ù bsb. pamlookup.net. ÙÙ
ÙÙÙ Ø§ÙØ¹Ø«Ùر عÙÙ ÙØ§Ø¦Ù
Ø© Ø¨Ø§ÙØ®ÙادÙ
اÙÙ
ÙØ¬Ùدة ÙÙ ÙØ°Ù Ø§ÙØµÙØØ©.
ÙÙ ÙÙÙ Ø¥Ø¶Ø§ÙØ© Ø£ÙØ¨Ø± عدد Ù Ù Ø§ÙØ®Ùاد٠Ù٠ا ØªØ±ÙØ¯Ø Ù ÙØµÙÙØ© بÙÙØ§ØµÙ. ÙØ§ ØªÙØ³Ù أ٠تÙÙØ± عÙÙ ØÙظ ÙØ£Ø®Ø° Ø§ÙØªØ¹Ø¯ÙÙØ§Øª Ø§ÙØ®Ø§ØµØ© ب٠ÙÙ Ø§ÙØ§Ø¹ØªØ¨Ø§Ø±.
+ + + \ No newline at end of file diff --git a/plugins/antispam/locales/ar/help/words.html b/plugins/antispam/locales/ar/help/words.html new file mode 100644 index 0000000..c29384a --- /dev/null +++ b/plugins/antispam/locales/ar/help/words.html @@ -0,0 +1,21 @@ + +
+Ø³ÙØ¤Ø¯Ù ÙØ°Ø§ Ø¥Ù٠تصÙÙØ© Ø§ÙØªØ¹ÙÙÙØ§Øª Ø§Ø³ØªÙØ§Ø¯Ø§ Ø¥Ù٠اÙÙÙ٠ات اÙ٠ستخد٠ة Ù٠اس٠اÙ٠ستخد٠أ٠عÙÙØ§Ù Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙ٠أ٠عÙÙØ§Ù اÙÙ ÙÙØ¹ Ø§ÙØ´Ø¨ÙÙ Ø£Ù Ù ØØªÙÙ Ø§ÙØªØ¹ÙÙÙ.
+ +/ ÙÙ Ø¨Ø¯Ø§ÙØ© اÙÙÙÙ
Ø© ÙÙÙØ§ÙØªÙØ§. عÙ٠سبÙ٠اÙÙ
Ø«Ø§ÙØ /foo/ سÙÙÙÙ
بتصÙÙØ© جÙ
ÙØ¹ اÙÙÙÙ
ات Ø§ÙØªÙ ØªØØªÙ٠عÙÙ foo.Junk-Nachrichten, die gemeinhin als Spam bezeichnet werden, sind in der Regel von Robotern verfasste Kommentare.
+ +Spam in Kommentaren und Trackbacks hat sich von einer anekdotischen Angelegenheit zu einem massiven Problem entwickelt. Heutzutage ist es zwingend erforderlich, eine Reihe von Filtern zu haben, um zu prüfen, ob ein Kommentar potenziell Müll ist oder nicht. Dies ist der Zweck des Antispam-Plugins.
+ +Mit diesem Filter können Sie IP-Adressen manuell auf eine Blacklist oder Whitelist setzen. Ein Kommentar, der von einer IP-Adresse stammt, die in der schwarzen Liste aufgeführt ist, wird sofort als Junk angesehen. Ein Kommentar, der von einer IP-Adresse stammt, die in der weiÃen Liste aufgeführt ist, wird als vertrauenswürdig angesehen und von den anderen Antispam-Filtern nicht verarbeitet.
+ +Um eine IP hinzuzufügen, wählen Sie zunächst die gewünschte Registerkarte (Blacklist oder Whitelist) und geben Sie die IP-Adresse ein. Das Kontrollkästchen Globale IP ist verfügbar, wenn Sie ein Superadministrator sind, und ermöglicht es Ihnen, die IP-Adresse zu allen Blogs Ihrer Dotclear-Installation hinzuzufügen.
+ +Sie können IP-Adressen mit einer Netzwerkmaske hinzufügen, um einen Bereich von IP-Adressen zu blockieren oder zuzulassen. Zum Beispiel:
+127.0.0.0/255.0.0.0 oder die abgekürzte Form 127/8 erkennt alle IP-Adressen wie 127.xxx.xxx.xxx127.0.0.0/255.255.0.0 oder die abgekürzte Form 127.0/16 erkennt alle IP-Adressen wie 127.0.xxx.xxx127.0.0.0/255.255.255.0 oder die abgekürzte Form 127.0.0/24 erkennt alle IP-Adressen wie 127.0.0.xxxIP Lookup ist ein Filter, der die IP-Adresse des Verfassers eines Kommentars auf gemeinsam genutzten Listen namens DNS-based Blackhole List (DNSBL) (auch bekannt als Real-time Blackhole List (RBL)) überprüft. StandardmäÃig verwendet der Filter die folgenden Server: sbl-xbl.spamhaus.org und bsb.spamlookup.net. Eine Liste der vorhandenen Server finden Sie auf dieser Seite.
Sie können so viele Server hinzufügen, wie Sie möchten, getrennt durch Kommas. Vergessen Sie nicht, auf Save zu klicken, um Ihre Ãnderungen zu übernehmen.
+ + + \ No newline at end of file diff --git a/plugins/antispam/locales/de/help/words.html b/plugins/antispam/locales/de/help/words.html new file mode 100644 index 0000000..5b9b097 --- /dev/null +++ b/plugins/antispam/locales/de/help/words.html @@ -0,0 +1,21 @@ + +
+Dadurch werden Kommentare auf der Grundlage der Wörter gefiltert, die im Benutzernamen, in der E-Mail-Adresse, in der Website-URL oder im Kommentarinhalt verwendet werden.
+ +/ am Anfang und am Ende des Wortes hinzufügen. Zum Beispiel: /foo/ filtert alle Wörter, die fooenthalten.Τα ανεÏιθÏμηÏα μηνÏμαÏα, ÏÎ¿Ï ÏÏ Î½Î®Î¸ÏÏ Î±ÏοκαλοÏνÏαι spam, είναι ÏÏ Î½Î®Î¸ÏÏ ÏÏÏλια ÏÎ¿Ï Î´Î·Î¼Î¿ÏιεÏονÏαι αÏÏ ÏομÏÏÏ.
+ +ΠανεÏιθÏμηÏη αλληλογÏαÏία Ïε ÏÏÏλια και trackbacks μεÏαÏÏάÏηκε αÏÏ Îνα ανεκδοÏÎ¿Î»Î¿Î³Î¹ÎºÏ Î¶Î®Ïημα Ïε Îνα ÏεÏάÏÏιο ÏÏÏβλημα. ΣήμεÏα, είναι Ï ÏοÏÏεÏÏÎ¹ÎºÏ Î½Î± Ï ÏάÏÏει Îνα ÏÏνολο ÏίλÏÏÏν για να ελÎγÏεÏαι αν Îνα ÏÏÏλιο είναι ενδεÏομÎνÏÏ Î±Î½ÎµÏιθÏμηÏο ή ÏÏι. ÎÏ ÏÏÏ ÎµÎ¯Î½Î±Î¹ ο ÏκοÏÏÏ ÏÎ¿Ï ÏÏÏÏθεÏÎ¿Ï Antispam.
+ +ÎÏ ÏÏ Ïο ÏίλÏÏο ÏÎ±Ï ÎµÏιÏÏÎÏει να βάλεÏε ÏειÏοκίνηÏα Î´Î¹ÎµÏ Î¸ÏνÏÎµÎ¹Ï IP Ïε μαÏÏη ή Î»ÎµÏ ÎºÎ® λίÏÏα. Îνα ÏÏÏλιο ÏÎ¿Ï ÏÏοÎÏÏεÏαι αÏÏ Î¼Î¹Î± διεÏÎ¸Ï Î½Ïη IP ÏÎ¿Ï ÏεÏιλαμβάνεÏαι ÏÏην ενÏÏηÏα ÏÎ·Ï Î¼Î±ÏÏÎ·Ï Î»Î¯ÏÏÎ±Ï Î¸Î± θεÏÏείÏαι αμÎÏÏÏ Î±Î½ÎµÏιθÏμηÏο. Îνα ÏÏÏλιο ÏÎ¿Ï ÏÏοÎÏÏεÏαι αÏÏ Î¼Î¹Î± διεÏÎ¸Ï Î½Ïη IP ÏÎ¿Ï ÏεÏιλαμβάνεÏαι ÏÏην ενÏÏηÏα ÏÎ·Ï Î»ÎµÏ ÎºÎ®Ï Î»Î¯ÏÏÎ±Ï Î¸Î± θεÏÏείÏαι αξιÏÏιÏÏο και Ïα άλλα ÏίλÏÏα antispam δεν θα Ïο εÏεξεÏγάζονÏαι.
+ +Îια να ÏÏοÏθÎÏεÏε μια IP, εÏιλÎξÏε ÏÏÏÏα Ïην καÏÏÎλα ÏÎ¿Ï Î¸ÎλεÏε (ÎαÏÏη λίÏÏα ή ÎÎµÏ ÎºÎ® λίÏÏα) και ειÏαγάγεÏε Ïη διεÏÎ¸Ï Î½Ïη IP. Το ÏλαίÏιο ελÎγÏÎ¿Ï Global IP είναι διαθÎÏιμο εάν είÏÏε Ï ÏεÏδιαÏειÏιÏÏÎ®Ï ÎºÎ±Î¹ θα ÏÎ±Ï ÎµÏιÏÏÎÏει να ÏÏοÏθÎÏεÏε Ïη διεÏÎ¸Ï Î½Ïη IP Ïε Ïλα Ïα blogs ÏÎ·Ï ÎµÎ³ÎºÎ±ÏάÏÏαÏÎ·Ï ÏÎ¿Ï Dotclear.
+ +ÎÏοÏείÏε να ÏÏοÏθÎÏεÏε Î´Î¹ÎµÏ Î¸ÏνÏÎµÎ¹Ï IP με μάÏκα δικÏÏÎ¿Ï Î³Î¹Î± να αÏοκλείÏεÏε ή να εÏιÏÏÎÏεÏε Îνα εÏÏÎ¿Ï Î´Î¹ÎµÏ Î¸ÏνÏεÏν IP. Îια ÏαÏάδειγμα:
+127.0.0.0/255.0.0.0.0 ή η ÏÏνÏομη μοÏÏή 127/8 θα αναγνÏÏίÏει ÏÎ»ÎµÏ ÏÎ¹Ï Î´Î¹ÎµÏ
θÏνÏÎµÎ¹Ï IP ÏÏÏÏ 127.xxx.xxx.xxx.xxx127.0.0.0/255.255.0.0.0 ή η ÏÏνÏομη μοÏÏή 127.0/16 θα αναγνÏÏίÏει ÏÎ»ÎµÏ ÏÎ¹Ï Î´Î¹ÎµÏ
θÏνÏÎµÎ¹Ï IP ÏÏÏÏ 127.0.xxx.xxx127.0.0.0/255.255.255.255.0 ή η ÏÏνÏομη μοÏÏή 127.0.0.0/24 θα αναγνÏÏίÏει ÏÎ»ÎµÏ ÏÎ¹Ï Î´Î¹ÎµÏ
θÏνÏÎµÎ¹Ï IP ÏÏÏÏ 127.0.0.0.xxxΤο IP Lookup είναι Îνα ÏίλÏÏο ÏοÏ
ελÎγÏει Ïη διεÏθÏ
νÏη IP ÏοÏ
ÏÏ
νÏάκÏη ενÏÏ ÏÏολίοÏ
Ïε κοινÏÏÏηÏÏÎµÏ Î»Î¯ÏÏÎµÏ ÏοÏ
ονομάζονÏαι DNS-based Blackhole List (DNSBL) (εÏίÏÎ·Ï Î³Î½ÏÏÏή ÏÏ Real-time Blackhole List (RBL)). ÎÏÏ ÏÏοεÏιλογή, Ïο ÏίλÏÏο ÏÏηÏιμοÏοιεί ÏοÏ
Ï Î±ÎºÏλοÏ
θοÏ
Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏÏÎÏ: sbl-xbl.spamhaus.org και bsb.spamlookup.net. ÎÏοÏείÏε να βÏείÏε μια λίÏÏα με ÏοÏ
Ï Ï
ÏάÏÏονÏÎµÏ Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏÏÎÏ Ïε αÏ
Ïή Ïη Ïελίδα.
ÎÏοÏείÏε να ÏÏοÏθÎÏεÏε ÏÏÎ¿Ï Ï Î´Î¹Î±ÎºÎ¿Î¼Î¹ÏÏÎÏ Î¸ÎλεÏε, διαÏÏÏιÏμÎÎ½Î¿Ï Ï Î¼Îµ κÏμμαÏα. Îην ξεÏάÏεÏε να κάνεÏε κλικ ÏÏο ÎÏÎ¿Î¸Î®ÎºÎµÏ Ïη για να λάβεÏε Ï ÏÏÏη ÏÎ¹Ï ÏÏοÏοÏοιήÏÎµÎ¹Ï ÏαÏ.
+ + + \ No newline at end of file diff --git a/plugins/antispam/locales/el/help/words.html b/plugins/antispam/locales/el/help/words.html new file mode 100644 index 0000000..2788086 --- /dev/null +++ b/plugins/antispam/locales/el/help/words.html @@ -0,0 +1,21 @@ + +
+ÎÏ ÏÏ Î¸Î± ÏιλÏÏάÏει Ïα ÏÏÏλια με βάÏη ÏÎ¹Ï Î»ÎÎ¾ÎµÎ¹Ï ÏÎ¿Ï ÏÏηÏιμοÏοιοÏνÏαι ÏÏο Ïνομα ÏÏήÏÏη, διεÏÎ¸Ï Î½Ïη ηλεκÏÏÎ¿Î½Î¹ÎºÎ¿Ï ÏαÏÏ Î´ÏÎ¿Î¼ÎµÎ¯Î¿Ï , διεÏÎ¸Ï Î½Ïη URL ιÏÏοÏÎµÎ»Î¯Î´Î±Ï Î® Ïο ÏεÏιεÏÏμενο ÏÏÎ¿Î»Î¯Î¿Ï .
+ +/ ÏÏην αÏÏή και ÏÏο ÏÎÎ»Î¿Ï ÏÎ·Ï Î»ÎξηÏ. Îια ÏαÏάδειγμα, Ïο /foo/ θα ÏιλÏÏάÏει ÏÎ»ÎµÏ ÏÎ¹Ï Î»ÎÎ¾ÎµÎ¹Ï ÏοÏ
ÏεÏιÎÏοÏ
ν foo.Junk messages, commonly called spams, are usually comments posted by robots.
+ +Spam in comments and trackbacks went from an anecdotic issue to a massive problem. Nowadays, it is mandatory to have a set of filters to check if a comment is potentially a junk or not. This is the purpose of the Antispam plugin.
+ +This filter allows you to manually blacklist or whitelist IP addresses. A comment coming from an IP address listed in the black list section will immediately be considered as junk. A comment coming from an IP address listed in the white list section will be considered as trusted and the other antispam filters won't process it.
+ +To add an IP, first select the tab you want (Blacklist or Whitelist) and enter the IP address. The Global IP checkbox is available if you are a super administrator and will allow you to add the IP address to all the blogs of your Dotclear installation.
+ +You can add IP addresses with a network mask to block or allow a range of IP addresses. For example:
+127.0.0.0/255.0.0.0 or the abbreviated form 127/8 will recognize all the IP addresses like 127.xxx.xxx.xxx127.0.0.0/255.255.0.0 or the abbreviated form 127.0/16 will recognize all the IP addresses like 127.0.xxx.xxx127.0.0.0/255.255.255.0 or the abbreviated form 127.0.0/24 will recognize all the IP addresses like 127.0.0.xxxIP Lookup is a filter that checks the IP address of a comment's author on shared lists called DNS-based Blackhole List (DNSBL) (also known as Real-time Blackhole List (RBL)). By default, the filter uses the following servers: sbl-xbl.spamhaus.org and bsb.spamlookup.net. You can find a list of existing servers on this page.
You can add as many servers as you want, separated by commas. Don't forget to click on Save to take your modifications into account.
+ + + \ No newline at end of file diff --git a/plugins/antispam/locales/en/help/words.html b/plugins/antispam/locales/en/help/words.html new file mode 100644 index 0000000..c47f8f2 --- /dev/null +++ b/plugins/antispam/locales/en/help/words.html @@ -0,0 +1,21 @@ + +
+This will filter comments based on the words that are used in the user name, e-mail address, website URL or the comment content.
+ +/ at the beginning and the end of the word. For instance, /foo/ will filter all the words containing foo.Los mensajes basura, comúnmente llamados spam, suelen ser comentarios publicados por robots.
+ +El spam en comentarios y trackbacks pasó de ser una cuestión anecdótica a convertirse en un problema masivo. Hoy en dÃa, es obligatorio disponer de un conjunto de filtros para comprobar si un comentario es potencialmente basura o no. Este es el propósito del plugin Antispam.
+ +Este filtro le permite crear manualmente una lista negra o blanca de direcciones IP. Un comentario procedente de una dirección IP incluida en la sección de la lista negra se considerará inmediatamente como basura. Un comentario procedente de una dirección IP incluida en la sección de la lista blanca se considerará de confianza y los demás filtros antispam no lo procesarán.
+ +Para añadir una IP, seleccione primero la pestaña que desee (Lista negra o Lista blanca) e introduzca la dirección IP. La casilla IP Global está disponible si eres superadministrador y te permitirá añadir la dirección IP a todos los blogs de tu instalación de Dotclear.
+ +Puede añadir direcciones IP con una máscara de red para bloquear o permitir un rango de direcciones IP. Por ejemplo:
+127.0.0.0/255.0.0 o la forma abreviada 127/8 reconocerá todas las direcciones IP como 127.xxx.xxx.xxx127.0.0.0/255.255.0.0 o la forma abreviada 127.0/16 reconocerá todas las direcciones IP como 127.0.xxx.xxx127.0.0.0/255.255.255.0 o la forma abreviada 127.0.0/24 reconocerá todas las direcciones IP como 127.0.0.xxxIP Lookup es un filtro que comprueba la dirección IP del autor de un comentario en listas compartidas denominadas DNS-based Blackhole List (DNSBL) (también conocida como Real-time Blackhole List (RBL)). Por defecto, el filtro utiliza los siguientes servidores: sbl-xbl.spamhaus.org y bsb.spamlookup.net. Puede encontrar una lista de los servidores existentes en en esta página.
Puedes añadir tantos servidores como quieras, separados por comas. No olvides hacer clic en Guardar para que se tengan en cuenta tus modificaciones.
+ + + \ No newline at end of file diff --git a/plugins/antispam/locales/es-ar/help/words.html b/plugins/antispam/locales/es-ar/help/words.html new file mode 100644 index 0000000..d5884d9 --- /dev/null +++ b/plugins/antispam/locales/es-ar/help/words.html @@ -0,0 +1,21 @@ + +
+Esto filtrará los comentarios en función de las palabras utilizadas en el nombre de usuario, la dirección de correo electrónico, la URL del sitio web o el contenido del comentario.
+ +/ al principio y al final de la palabra. Por ejemplo, /foo/ filtrará todas las palabras que contengan foo.Los mensajes basura, comúnmente llamados spam, suelen ser comentarios publicados por robots.
+ +El spam en comentarios y trackbacks pasó de ser una cuestión anecdótica a convertirse en un problema masivo. Hoy en dÃa, es obligatorio disponer de un conjunto de filtros para comprobar si un comentario es potencialmente basura o no. Este es el propósito del plugin Antispam.
+ +Este filtro le permite crear manualmente una lista negra o blanca de direcciones IP. Un comentario procedente de una dirección IP incluida en la sección de la lista negra se considerará inmediatamente como basura. Un comentario procedente de una dirección IP incluida en la sección de la lista blanca se considerará de confianza y los demás filtros antispam no lo procesarán.
+ +Para añadir una IP, seleccione primero la pestaña que desee (Lista negra o Lista blanca) e introduzca la dirección IP. La casilla IP Global está disponible si eres superadministrador y te permitirá añadir la dirección IP a todos los blogs de tu instalación de Dotclear.
+ +Puede añadir direcciones IP con una máscara de red para bloquear o permitir un rango de direcciones IP. Por ejemplo:
+
{{tpl:EntryCommentCount count_all="1" none="no reactions" one="one reaction" more="%s reactions"}}
+{{tpl:lang This post's comments feed}}
++ + +
+
+
+ -
+
+
+ -
+
+
+
+
+
+ {{tpl:SysBehavior behavior="publicCommentBeforeContent"}}
+ {{tpl:CommentContent}}
+
+ {{tpl:SysBehavior behavior="publicCommentAfterContent"}}
+
+
+
+
+
+
+
+{{tpl:CommentOrderNumber}} + {{tpl:lang From}} {{tpl:CommentAuthorLink}} - +
+