Ported Franck & Kozlika updates for user prefs, dedicated branch

2.3
Dsls 2011-04-27 09:06:30 +02:00
parent 0a84ccca32
commit 8c6aa387e7
151 changed files with 2944 additions and 6454 deletions

View File

@ -1,3 +1,9 @@
Dotclear 2.2.3 - 2011-04-01
===========================================================
* Security fix in media manager. Thx to Raphaël
* Bugfix : 2.2.2 was preventing manual thumbnail regeneration.
* Database handling bugfixes
Dotclear 2.2.2 - 2011-01-17 Dotclear 2.2.2 - 2011-01-17
=========================================================== ===========================================================
* Bugfix: 2.2.1 was blocking new installations * Bugfix: 2.2.1 was blocking new installations

2
README
View File

@ -5,7 +5,7 @@ WHAT YOU NEED TO RUN DOTCLEAR
In order to run Dotclear you need: In order to run Dotclear you need:
* A web server (Apache, Cheerokee, lightHttpd, etc.) * A web server (Apache, Cheerokee, lightHttpd, etc.)
* PHP 5 with the following modules: * PHP 5.2 with the following modules:
* mbstring * mbstring
* iconv * iconv
* simplexml * simplexml

View File

@ -62,7 +62,7 @@ if (!$core->error->flag())
'<div>'.$core->formNonce().'</div>'. '<div>'.$core->formNonce().'</div>'.
'<p><label>'.__('Your password:').' '. '<p><label>'.__('Your password:').' '.
form::password('pwd',20,255).'</label></p>'. form::password('pwd',20,255).'</label></p>'.
'<p><input type="submit" name="del" value="'.__('Delete this blog').'" />'. '<p><input type="submit" class="delete" name="del" value="'.__('Delete this blog').'" />'.
form::hidden('blog_id',$blog_id).'</p>'. form::hidden('blog_id',$blog_id).'</p>'.
'</form>'; '</form>';
} }

View File

@ -458,7 +458,7 @@ if ($blog_id)
{ {
echo echo
'<form action="blog_del.php" method="post">'. '<form action="blog_del.php" method="post">'.
'<p><input type="submit" value="'.__('Delete this blog').'" />'. '<p><input type="submit" class="delete" value="'.__('Delete this blog').'" />'.
form::hidden(array('blog_id'),$blog_id). form::hidden(array('blog_id'),$blog_id).
$core->formNonce().'</p>'. $core->formNonce().'</p>'.
'</form>'; '</form>';

View File

@ -267,7 +267,7 @@ if (!$theme_conf_mode)
'<p class="col"><input type="submit" name="select" value="'.__('use selected theme').'" /></p>'; '<p class="col"><input type="submit" name="select" value="'.__('use selected theme').'" /></p>';
if ($can_install) { if ($can_install) {
echo '<p class="col right"><input type="submit" name="remove" value="'.__('delete selected theme').'" /></p>'; echo '<p class="col right"><input type="submit" class="delete" name="remove" value="'.__('delete selected theme').'" /></p>';
} }
echo echo
@ -279,7 +279,7 @@ if (!$theme_conf_mode)
if ($can_install) if ($can_install)
{ {
echo echo
'<div class="multi-part" id="add-theme" title="'.__('Install or upgrade a theme').'">'; '<div class="multi-part clear" id="add-theme" title="'.__('Install or upgrade a theme').'">';
if ($is_writable) if ($is_writable)
{ {

View File

@ -83,7 +83,7 @@ echo '<h2>'.__('List of blogs').'</h2>';
if (!$core->error->flag()) if (!$core->error->flag())
{ {
if ($core->auth->isSuperAdmin()) { if ($core->auth->isSuperAdmin()) {
echo '<p><strong><a href="blog.php">'.__('Create a new blog').'</a></strong></p>'; echo '<p class="top-add"><a class="button add" href="blog.php"><img src="images/add.png" alt="" />'.__('Create a new blog').'</a></strong></p>';
} }
if (!$show_filters) { if (!$show_filters) {
@ -109,7 +109,7 @@ if (!$core->error->flag())
'</label></p>'. '</label></p>'.
'<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '. '<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '.
__('Blogs per page').'</label> '. __('Blogs per page').'</label> '.
'<input type="submit" value="'.__('filter').'" /></p>'. '<input type="submit" value="'.__('Apply filters').'" /></p>'.
'</div>'. '</div>'.
'<br class="clear" />'. //Opera sucks '<br class="clear" />'. //Opera sucks

View File

@ -225,7 +225,7 @@ if ($comment_id)
'<input type="submit" accesskey="s" name="update" value="'.__('save').'" /> '; '<input type="submit" accesskey="s" name="update" value="'.__('save').'" /> ';
if ($can_delete) { if ($can_delete) {
echo '<input type="submit" name="delete" value="'.__('delete').'" />'; echo '<input type="submit" class="delete" name="delete" value="'.__('delete').'" />';
} }
echo echo
'</p>'. '</p>'.

View File

@ -184,7 +184,7 @@ if (!$core->error->flag())
'<label>'.__('IP address:').' '. '<label>'.__('IP address:').' '.
form::field('ip',20,39,html::escapeHTML($ip)). form::field('ip',20,39,html::escapeHTML($ip)).
'</label></p>'. '</label></p>'.
'<p><input type="submit" value="'.__('filter').'" /></p>'. '<p><input type="submit" value="'.__('Apply filters').'" /></p>'.
'</div>'. '</div>'.
'</div>'. '</div>'.

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 400 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 762 B

After

Width:  |  Height:  |  Size: 706 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 700 B

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 328 B

After

Width:  |  Height:  |  Size: 571 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 393 B

After

Width:  |  Height:  |  Size: 256 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 467 B

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 738 B

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 B

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 965 B

View File

@ -45,25 +45,46 @@ $plugins_install = $core->plugins->installModules();
# Dashboard icons # Dashboard icons
$__dashboard_icons = new ArrayObject(); $__dashboard_icons = new ArrayObject();
# Dashboard favorites
$post_count = $core->blog->getPosts(array(),true)->f(0); $post_count = $core->blog->getPosts(array(),true)->f(0);
$str_entries = ($post_count > 1) ? __('%d entries') : __('%d entry'); $str_entries = ($post_count > 1) ? __('%d entries') : __('%d entry');
$comment_count = $core->blog->getComments(array(),true)->f(0); $comment_count = $core->blog->getComments(array(),true)->f(0);
$str_comments = ($comment_count > 1) ? __('%d comments') : __('%d comment'); $str_comments = ($comment_count > 1) ? __('%d comments') : __('%d comment');
$__dashboard_icons['new_post'] = new ArrayObject(array(__('New entry'),'post.php','images/menu/edit-b.png')); $ws = $core->auth->user_prefs->addWorkspace('favorites');
$__dashboard_icons['posts'] = new ArrayObject(array(sprintf($str_entries,$post_count),'posts.php','images/menu/entries-b.png')); $count = 0;
$__dashboard_icons['comments'] = new ArrayObject(array(sprintf($str_comments,$comment_count),'comments.php','images/menu/comments-b.png')); foreach ($ws->dumpPrefs() as $k => $v) {
$__dashboard_icons['prefs'] = new ArrayObject(array(__('User preferences'),'preferences.php','images/menu/user-pref-b.png')); // User favorites only
if (!$v['global']) {
if ($core->auth->check('admin',$core->blog->id)) $fav = unserialize($v['value']);
{ if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
$__dashboard_icons['blog_pref'] = new ArrayObject(array(__('Blog settings'),'blog_pref.php','images/menu/blog-pref-b.png')); $count++;
$__dashboard_icons['blog_theme'] = new ArrayObject(array(__('Blog appearance'),'blog_theme.php','images/menu/blog-theme-b.png')); $title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) :
($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
$__dashboard_icons[$fav['name']] = new ArrayObject(array($title,$fav['url'],$fav['large-icon']));
}
}
}
if (!$count) {
// Global favorites if any
foreach ($ws->dumpPrefs() as $k => $v) {
$fav = unserialize($v['value']);
if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
$count++;
$title = ($fav['name'] == 'posts' ? sprintf($str_entries,$post_count) :
($fav['name'] == 'comments' ? sprintf($str_comments,$comment_count) : $fav['title']));
$__dashboard_icons[$fav['name']] = new ArrayObject(array($title,$fav['url'],$fav['large-icon']));
}
}
}
if (!$count) {
// No user or global favorites, add "user pref" and "new entry" fav
if ($core->auth->check('usage,contentadmin',$core->blog->id)) {
$__dashboard_icons['new_post'] = new ArrayObject(array(__('New entry'),'post.php','images/menu/edit-b.png'));
}
$__dashboard_icons['prefs'] = new ArrayObject(array(__('My preferences'),'preferences.php','images/menu/user-pref-b.png'));
} }
$core->callBehavior('adminDashboardIcons', $core, $__dashboard_icons);
# Latest news for dashboard # Latest news for dashboard
$__dashboard_items = new ArrayObject(array(new ArrayObject,new ArrayObject)); $__dashboard_items = new ArrayObject(array(new ArrayObject,new ArrayObject));
@ -111,7 +132,7 @@ try
'<dd>'.dt::dt2str('%d %B %Y',$item->pubdate,'Europe/Paris').'</dd>'; '<dd>'.dt::dt2str('%d %B %Y',$item->pubdate,'Europe/Paris').'</dd>';
} }
$i++; $i++;
if ($i > 7) { break; } if ($i > 3) { break; }
} }
$latest_news .= '</dl>'; $latest_news .= '</dl>';
$__dashboard_items[1][] = $latest_news; $__dashboard_items[1][] = $latest_news;

View File

@ -31,6 +31,7 @@ if ($dlang != 'en')
l10n::init(); l10n::init();
l10n::set(dirname(__FILE__).'/../../locales/'.$dlang.'/date'); l10n::set(dirname(__FILE__).'/../../locales/'.$dlang.'/date');
l10n::set(dirname(__FILE__).'/../../locales/'.$dlang.'/main'); l10n::set(dirname(__FILE__).'/../../locales/'.$dlang.'/main');
l10n::set(dirname(__FILE__).'/../../locales/'.$dlang.'/plugins');
} }
if (!defined('DC_MASTER_KEY') || DC_MASTER_KEY == '') { if (!defined('DC_MASTER_KEY') || DC_MASTER_KEY == '') {
@ -184,6 +185,45 @@ if ($can_install && !empty($_POST))
$core->plugins->loadModules(DC_PLUGINS_ROOT); $core->plugins->loadModules(DC_PLUGINS_ROOT);
$plugins_install = $core->plugins->installModules(); $plugins_install = $core->plugins->installModules();
# Add default favorites
$core->auth->user_prefs->addWorkspace('favorites');
$init_fav = array();
$init_fav['new_post'] = array('new_post',__('New entry'),'post.php',
'images/menu/edit.png','images/menu/edit-b.png',
'usage,contentadmin',null,'menu-new-post');
$init_fav['posts'] = array('posts',__('Entries'),'posts.php',
'images/menu/entries.png','images/menu/entries-b.png',
'usage,contentadmin',null,null);
$init_fav['comments'] = array('comments',__('Comments'),'comments.php',
'images/menu/comments.png','images/menu/comments-b.png',
'usage,contentadmin',null,null);
$init_fav['prefs'] = array('prefs',__('My preferences'),'preferences.php',
'images/menu/user-pref.png','images/menu/user-pref-b.png',
'*',null,null);
$init_fav['blog_pref'] = array('blog_pref',__('Blog settings'),'blog_pref.php',
'images/menu/blog-pref.png','images/menu/blog-pref-b.png',
'admin',null,null);
$init_fav['blog_theme'] = array('blog_theme',__('Blog appearance'),'blog_theme.php',
'images/menu/themes.png','images/menu/blog-theme-b.png',
'admin',null,null);
$init_fav['pages'] = array('pages',__('Pages'),'plugin.php?p=pages',
'index.php?pf=pages/icon.png','index.php?pf=pages/icon-big.png',
'contentadmin,pages',null,null);
$init_fav['blogroll'] = array('blogroll',__('Blogroll'),'plugin.php?p=blogroll',
'index.php?pf=blogroll/icon-small.png','index.php?pf=blogroll/icon.png',
'usage,contentadmin',null,null);
$count = 0;
foreach ($init_fav as $k => $f) {
$t = array('name' => $f[0],'title' => $f[1],'url' => $f[2], 'small-icon' => $f[3],
'large-icon' => $f[4],'permissions' => $f[5],'id' => $f[6],'class' => $f[7]);
$core->auth->user_prefs->favorites->put(sprintf("g%03s",$count),serialize($t),'string',null,true,true);
$count++;
}
$step = 1; $step = 1;
} }
catch (Exception $e) catch (Exception $e)

View File

@ -45,7 +45,7 @@ $(function() {
actions.append(select).append('&nbsp;&nbsp;'); actions.append(select).append('&nbsp;&nbsp;');
} }
if (submit_r.length > 0 && $('input:radio',info).attr('id') != 'theme_default') { if (submit_r.length > 0 && $('input:radio',info).attr('id') != 'theme_default') {
var remove = $('<a href="#" class="button">' + dotclear.msg.remove_this_theme + '</a>'); var remove = $('<a href="#" class="button delete">' + dotclear.msg.remove_this_theme + '</a>');
remove.click(function() { remove.click(function() {
var t_name = $(this).parents('#theme-box').find('div.theme-info h3:first').text(); var t_name = $(this).parents('#theme-box').find('div.theme-info h3:first').text();
t_name = $.trim(t_name); t_name = $.trim(t_name);

View File

@ -10,7 +10,7 @@ $(function() {
}); });
if ($('input[name=save-publish]',f).length > 0) { if ($('input[name=save-publish]',f).length > 0) {
var btn = $('<input type="submit" class="submit" value="' + $('input[name=save-publish]',f).val() + '" tabindex="3" />'); var btn = $('<input type="submit" value="' + $('input[name=save-publish]',f).val() + '" tabindex="3" />');
$('input[name=save-publish]',f).remove(); $('input[name=save-publish]',f).remove();
$('input[name=save]',f).after(btn).after(' '); $('input[name=save]',f).after(btn).after(' ');
btn.click(function() { btn.click(function() {

View File

@ -195,7 +195,7 @@ jQuery.fn.helpViewer = function() {
this.find('h3:first').nextAll('*:not(h3)').hide(); this.find('h3:first').nextAll('*:not(h3)').hide();
sizeBox(); sizeBox();
var img = $('<img src="images/help.png" alt="'+dotclear.msg.help+'" title="'+dotclear.msg.help+'" id="help-button" />'); var img = $('<span id="help-button">'+dotclear.msg.help+'</span>');
var select = $(); var select = $();
img.click(function() { return toggle(); }); img.click(function() { return toggle(); });
@ -338,6 +338,9 @@ $(function() {
$('#plugins-menu h3:first').toggleWithLegend($('#plugins-menu ul:first'), $('#plugins-menu h3:first').toggleWithLegend($('#plugins-menu ul:first'),
$.extend({cookie:'dc_plugins_menu'},menu_settings) $.extend({cookie:'dc_plugins_menu'},menu_settings)
); );
$('#favorites-menu h3:first').toggleWithLegend($('#favorites-menu ul:first'),
$.extend({cookie:'dc_favorites_menu'},menu_settings)
);
$('#help').helpViewer(); $('#help').helpViewer();

View File

@ -448,19 +448,19 @@
}, },
createControls: function() { createControls: function() {
this.ctrl.btn_browse = $('<a href="#">&nbsp;</a>').click(function() { this.ctrl.btn_browse = $('<a href="#" class="button">&nbsp;</a>').click(function() {
return false; return false;
}); });
this.ctrl.btn_cancel = $('<a href="#">' + this.locales.cancel + '</a>').click(function() { this.ctrl.btn_cancel = $('<a href="#" class="button">' + this.locales.cancel + '</a>').click(function() {
return false; return false;
}); });
this.ctrl.btn_clean = $('<a href="#">' + this.locales.clean + '</a>').click(function() { this.ctrl.btn_clean = $('<a href="#" class="button">' + this.locales.clean + '</a>').click(function() {
return false; return false;
}); });
this.ctrl.btn_upload = $('<a href="#">' + this.locales.upload + '</a>').click(function() { this.ctrl.btn_upload = $('<a href="#" class="button">' + this.locales.upload + '</a>').click(function() {
return false; return false;
}); });

View File

@ -121,7 +121,7 @@ if (!$core->error->flag())
'</label></p>'. '</label></p>'.
'<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '. '<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '.
__('Entries per page').'</label> '. __('Entries per page').'</label> '.
'<input type="submit" value="'.__('filter').'" />'. '<input type="submit" value="'.__('Apply filters').'" />'.
$hidden_fields.'</p>'. $hidden_fields.'</p>'.
'</div>'. '</div>'.

View File

@ -253,7 +253,7 @@ if (!empty($p_available))
'<div>'. '<div>'.
$core->formNonce(). $core->formNonce().
form::hidden(array('plugin_id'),html::escapeHTML($k)). form::hidden(array('plugin_id'),html::escapeHTML($k)).
($is_deactivable ? '<input type="submit" class="activate" name="deactivate" value="'.__('Deactivate').'" /> ' : ''). ($is_deactivable ? '<input type="submit" name="deactivate" value="'.__('Deactivate').'" /> ' : '').
($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : ''). ($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
'</div>'. '</div>'.
'</form>'; '</form>';
@ -296,7 +296,7 @@ if (!empty($p_disabled))
$core->formNonce(). $core->formNonce().
form::hidden(array('plugin_id'),html::escapeHTML($k)). form::hidden(array('plugin_id'),html::escapeHTML($k)).
form::hidden(array('deactivated'),1). form::hidden(array('deactivated'),1).
($is_activable ? '<input type="submit" class="activate" name="activate" value="'.__('Activate').'" /> ' : ''). ($is_activable ? '<input type="submit" value="'.__('Activate').'" /> ' : '').
($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : ''). ($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
'</div>'. '</div>'.
'</form>'; '</form>';

View File

@ -476,7 +476,7 @@ if ($can_edit_post)
($post_id ? form::hidden('id',$post_id) : ''). ($post_id ? form::hidden('id',$post_id) : '').
'<input type="submit" value="'.__('save').' (s)" tabindex="4" '. '<input type="submit" value="'.__('save').' (s)" tabindex="4" '.
'accesskey="s" name="save" /> '. 'accesskey="s" name="save" /> '.
($can_delete ? '<input type="submit" value="'.__('delete').'" name="delete" />' : ''). ($can_delete ? '<input type="submit" class="delete" value="'.__('delete').'" name="delete" />' : '').
$core->formNonce(). $core->formNonce().
'</p>'; '</p>';

View File

@ -229,7 +229,9 @@ dcPage::open(__('Entries'),$starting_script);
if (!$core->error->flag()) if (!$core->error->flag())
{ {
echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Entries').'</h2>'; echo
'<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Entries').'</h2>'.
'<p class="top-add"><a class="button add" href="post.php"><img src="images/add.png" alt="" /> '.__('New entry').'</a></p>';
if (!$show_filters) { if (!$show_filters) {
echo '<p><a id="filter-control" class="form-control" href="#">'. echo '<p><a id="filter-control" class="form-control" href="#">'.
@ -264,8 +266,8 @@ if (!$core->error->flag())
'<label>'.__('Sort:'). '<label>'.__('Sort:').
form::combo('order',$order_combo,$order).'</label></p>'. form::combo('order',$order_combo,$order).'</label></p>'.
'<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '. '<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '.
__('Entries per page').'</label> '. __('Entries per page').'</label></p> '.
'<input type="submit" value="'.__('filter').'" /></p>'. '<p><input type="submit" value="'.__('Apply filters').'" /></p>'.
'</div>'. '</div>'.
'</div>'. '</div>'.
'<br class="clear" />'. //Opera sucks '<br class="clear" />'. //Opera sucks

View File

@ -14,7 +14,7 @@ require dirname(__FILE__).'/../inc/admin/prepend.php';
dcPage::check('usage,contentadmin'); dcPage::check('usage,contentadmin');
$page_title = __('User preferences'); $page_title = __('My preferences');
$user_name = $core->auth->getInfo('user_name'); $user_name = $core->auth->getInfo('user_name');
$user_firstname = $core->auth->getInfo('user_firstname'); $user_firstname = $core->auth->getInfo('user_firstname');
@ -27,6 +27,12 @@ $user_post_status = $core->auth->getInfo('user_post_status');
$user_options = $core->auth->getOptions(); $user_options = $core->auth->getOptions();
$default_tab = 'user-profile';
if (!empty($_GET['append']) || !empty($_GET['removed']) || !empty($_GET['neworder'])) {
$default_tab = 'user-favorites';
}
foreach ($core->getFormaters() as $v) { foreach ($core->getFormaters() as $v) {
$formaters_combo[$v] = $v; $formaters_combo[$v] = $v;
} }
@ -103,11 +109,120 @@ if (isset($_POST['user_name']))
} }
} }
# Add selected favorites
if (!empty($_POST['appendaction']) && !empty($_POST['append'])) {
$ws = $core->auth->user_prefs->addWorkspace('favorites');
$user_favs = $ws->DumpLocalPrefs();
$count = count($user_favs);
foreach ($_POST['append'] as $k => $v)
{
try {
$found = false;
foreach ($user_favs as $f) {
$f = unserialize($f['value']);
if ($f['name'] == $v) {
$found = true;
break;
}
}
if (!$found) {
$uid = sprintf("u%03s",$count);
$fav = array('name' => $_fav[$v][0],'title' => $_fav[$v][1],'url' => $_fav[$v][2],'small-icon' => $_fav[$v][3],
'large-icon' => $_fav[$v][4],'permissions' => $_fav[$v][5],'id' => $_fav[$v][6],'class' => $_fav[$v][7]);
$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
$count++;
}
} catch (Exception $e) {
$core->error->add($e->getMessage());
break;
}
}
if (!$core->error->flag()) {
http::redirect('preferences.php?append=1');
}
}
# Delete selected favorites
if (!empty($_POST['removeaction']) && !empty($_POST['remove'])) {
$ws = $core->auth->user_prefs->addWorkspace('favorites');
foreach ($_POST['remove'] as $k => $v)
{
try {
$core->auth->user_prefs->favorites->drop($v);
} catch (Exception $e) {
$core->error->add($e->getMessage());
break;
}
}
// Update pref_id values
try {
$user_favs = $ws->DumpLocalPrefs();
foreach ($user_favs as $k => $v)
{
$core->auth->user_prefs->favorites->drop($k);
}
$count = 0;
foreach ($user_favs as $k => $v)
{
$uid = sprintf("u%03s",$count);
$f = unserialize($v['value']);
$fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
$count++;
}
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
if (!$core->error->flag()) {
http::redirect('preferences.php?removed=1');
}
}
# Order favs
$order = array();
if (empty($_POST['favs_order']) && !empty($_POST['order'])) {
$order = $_POST['order'];
asort($order);
$order = array_keys($order);
} elseif (!empty($_POST['favs_order'])) {
$order = explode(',',$_POST['favs_order']);
}
if (!empty($_POST['saveorder']) && !empty($order))
{
try {
$user_favs = $ws->DumpLocalPrefs();
foreach ($user_favs as $k => $v)
{
$core->auth->user_prefs->favorites->drop($k);
}
$count = 0;
foreach ($order as $i => $k) {
$uid = sprintf("u%03s",$count);
$f = unserialize($user_favs[$k]['value']);
$fav = array('name' => $f['name'],'title' => $f['title'],'url' => $f['url'],'small-icon' => $f['small-icon'],
'large-icon' => $f['large-icon'],'permissions' => $f['permissions'],'id' => $f['id'],'class' => $f['class']);
$core->auth->user_prefs->favorites->put($uid,serialize($fav),'string');
$count++;
}
} catch (Exception $e) {
$core->error->add($e->getMessage());
}
if (!$core->error->flag()) {
http::redirect('preferences.php?&neworder=1');
}
}
/* DISPLAY /* DISPLAY
-------------------------------------------------------- */ -------------------------------------------------------- */
dcPage::open($page_title, dcPage::open($page_title,
dcPage::jsLoad('js/_preferences.js'). dcPage::jsLoad('js/_preferences.js').
dcPage::jsPageTabs($default_tab).
dcPage::jsConfirmClose('user-form'). dcPage::jsConfirmClose('user-form').
# --BEHAVIOR-- adminPreferencesHeaders # --BEHAVIOR-- adminPreferencesHeaders
@ -120,73 +235,70 @@ if (!empty($_GET['upd'])) {
echo '<h2>'.$page_title.'</h2>'; echo '<h2>'.$page_title.'</h2>';
if (!empty($_GET['append'])) {
echo '<p class="message">'.__('Favorites have been successfully added.').'</p>';
}
if (!empty($_GET['neworder'])) {
echo '<p class="message">'.__('Favorites has been successfully updated.').'</p>';
}
if (!empty($_GET['removed'])) {
echo '<p class="message">'.__('Favorites have been successfully removed.').'</p>';
}
# User profile
echo '<div class="multi-part" id="user-profile" title="'.__('My profile').'">';
echo echo
'<form action="preferences.php" method="post" id="user-form">'. '<form action="preferences.php" method="post" id="user-form">'.
'<fieldset><legend>'.__('User preferences').'</legend>'. '<fieldset><legend>'.__('My profile').'</legend>'.
'<div class="two-cols">'. '<div class="two-cols">'.
'<div class="col">'. '<div class="col">'.
'<p><label>'.__('Last Name:'). '<p><label for"user_name">'.__('Last Name:').
form::field('user_name',20,255,html::escapeHTML($user_name),'',2).'</label></p>'. form::field('user_name',20,255,html::escapeHTML($user_name),'',2).'</label></p>'.
'<p><label>'.__('First Name:'). '<p><label for="user_firstname">'.__('First Name:').
form::field('user_firstname',20,255,html::escapeHTML($user_firstname),'',3).'</label></p>'. form::field('user_firstname',20,255,html::escapeHTML($user_firstname),'',3).'</label></p>'.
'<p><label>'.__('Display name:'). '<p><label for="user_displayname">'.__('Display name:').
form::field('user_displayname',20,255,html::escapeHTML($user_displayname),'',4).'</label></p>'. form::field('user_displayname',20,255,html::escapeHTML($user_displayname),'',4).'</label></p>'.
'<p><label>'.__('Email:'). '<p><label for="user_email">'.__('Email:').
form::field('user_email',20,255,html::escapeHTML($user_email),'',5).'</label></p>'. form::field('user_email',20,255,html::escapeHTML($user_email),'',5).'</label></p>'.
'<p><label>'.__('URL:'). '<p><label for="user_url">'.__('URL:').
form::field('user_url',30,255,html::escapeHTML($user_url),'',6).'</label></p>'. form::field('user_url',30,255,html::escapeHTML($user_url),'',6).'</label></p>'.
'</div>'. '</div>'.
'<div class="col">'. '<div class="col">'.
'<p><label>'.__('Preferred format:'). '<p><label for="user_lang">'.__('User language:').
form::combo('user_post_format',$formaters_combo,$user_options['post_format'],'',7).'</label></p>'.
'<p><label>'.__('Default entry status:').
form::combo('user_post_status',$status_combo,$user_post_status,'',8).'</label></p>'.
'<p><label>'.__('Entry edit field height:').
form::field('user_edit_size',5,4,(integer) $user_options['edit_size'],'',9).'</label></p>'.
'<p><label>'.__('User language:').
form::combo('user_lang',$lang_combo,$user_lang,'l10n',10).'</label></p>'. form::combo('user_lang',$lang_combo,$user_lang,'l10n',10).'</label></p>'.
'<p><label>'.__('User timezone:'). '<p><label for="user_tz">'.__('User timezone:').
form::combo('user_tz',dt::getZones(true,true),$user_tz,'',11).'</label></p>'. form::combo('user_tz',dt::getZones(true,true),$user_tz,'',11).'</label></p>'.
'<p><label class="classic">'.
form::checkbox('user_wysiwyg',1,$user_options['enable_wysiwyg'],'',12).' '.
__('Enable WYSIWYG mode').'</label></p>'.
'</div>'. '</div>'.
'</div>'. '</div>'.
'<br class="clear" />'. //Opera sucks '<br class="clear" />'. //Opera sucks
'</fieldset>'; '</fieldset>';
# --BEHAVIOR-- adminPreferencesForm
$core->callBehavior('adminPreferencesForm',$core);
if ($core->auth->allowPassChange()) if ($core->auth->allowPassChange())
{ {
echo echo
'<fieldset>'. '<fieldset>'.
'<legend>'.__('Change your password').'</legend>'. '<legend>'.__('Change your password').'</legend>'.
'<p><label>'.__('New password:'). '<p><label for="new_pwd">'.__('New password:').
form::password('new_pwd',20,255,'','',30).'</label></p>'. form::password('new_pwd',20,255,'','',30).'</label></p>'.
'<p><label>'.__('Confirm password:'). '<p><label for="new_pwd_c">'.__('Confirm password:').
form::password('new_pwd_c',20,255,'','',31).'</label></p>'. form::password('new_pwd_c',20,255,'','',31).'</label></p>'.
'</fieldset>'. '</fieldset>'.
'<fieldset>'. '<fieldset>'.
'<p>'.__('If you want to change your email or password you must provide your current password.').'</p>'. '<p>'.__('If you want to change your email or password you must provide your current password.').'</p>'.
'<p><label>'.__('Your password:'). '<p><label for="cur_pwd">'.__('Your password:').
form::password('cur_pwd',20,255,'','',32).'</label></p>'. form::password('cur_pwd',20,255,'','',32).'</label></p>'.
'</fieldset>'; '</fieldset>';
} }
@ -197,6 +309,134 @@ $core->formNonce().
'<input type="submit" accesskey="s" value="'.__('Save').'" tabindex="33" /></p>'. '<input type="submit" accesskey="s" value="'.__('Save').'" tabindex="33" /></p>'.
'</form>'; '</form>';
echo '</div>';
# User options : some from actual user profile, dashboard modules, ...
echo '<div class="multi-part" id="user-options" title="'.__('My options').'">';
echo
'<form action="preferences.php" method="post" id="user-form">'.
'<fieldset><legend>'.__('My options').'</legend>'.
'<p><label for="user_post_format">'.__('Preferred format:').
form::combo('user_post_format',$formaters_combo,$user_options['post_format'],'',7).'</label></p>'.
'<p><label for="user_post_status">'.__('Default entry status:').
form::combo('user_post_status',$status_combo,$user_post_status,'',8).'</label></p>'.
'<p><label for="user_edit_size">'.__('Entry edit field height:').
form::field('user_edit_size',5,4,(integer) $user_options['edit_size'],'',9).'</label></p>'.
'<p><label for="user_wysiwyg" class="classic">'.
form::checkbox('user_wysiwyg',1,$user_options['enable_wysiwyg'],'',12).' '.
__('Enable WYSIWYG mode').'</label></p>'.
'<br class="clear" />'. //Opera sucks
'</fieldset>';
# --BEHAVIOR-- adminPreferencesForm
$core->callBehavior('adminPreferencesForm',$core);
echo
'<p class="clear">'.
$core->formNonce().
'<input type="submit" accesskey="s" value="'.__('Save').'" tabindex="33" /></p>'.
'</form>';
echo '</div>';
# User favorites
echo '<div class="multi-part" id="user-favorites" title="'.__('My favorites').'">';
$ws = $core->auth->user_prefs->addWorkspace('favorites');
echo '<form action="preferences.php" method="post" id="favs-form">';
echo '<div class="two-cols">';
echo '<div class="col70">';
echo '<fieldset id="my-favs"><legend>'.__('My favorites').'</legend>';
$count = 0;
foreach ($ws->dumpPrefs() as $k => $v) {
// User favorites only
if (!$v['global']) {
$fav = unserialize($v['value']);
if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
if ($count == 0) echo '<ul>';
$count++;
echo '<li id="fu-'.$k.'">'.
'<img src="'.$fav['large-icon'].'" alt="" /> '.
'<span>'.form::field(array('order['.$k.']'),2,3,$count).'</span>'.
'<label for="fuk-'.$k.'">'.form::checkbox(array('remove[]','fuk-'.$k),$k).$fav['title'].'</label>'.
'</li>';
}
}
}
if ($count > 0) echo '</ul>';
if ($count > 0) {
echo
'<div class="clear">'.
'<p class="col">'.form::hidden('favs_order','').
$core->formNonce().
'<input type="submit" name="saveorder" value="'.__('Save order').'"></p>'.
'<p class="right"><input type="submit" class="delete" name="removeaction"'.
'value="'.__('Delete selected favorites').'" '.
'onclick="return window.confirm(\''.html::escapeJS(
__('Are you sure you want to remove selected favorites?')).'\');" /></p>'.
'</div>';
} else {
echo
'<p>'.__('Currently no personal favorites.').'</p>';
}
echo '</fieldset>';
echo '<div id="default-favs"><h3>'.__('Default favorites').'</h3>';
echo '<p class="form-note clear">'.__('Those favorites are displayed when My Favorites list is empty.').'</p>';
$count = 0;
foreach ($ws->dumpPrefs() as $k => $v) {
// Global favorites only
if ($v['global']) {
$fav = unserialize($v['value']);
if (($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)) {
if ($count == 0) echo '<ul class="fav-list">';
$count++;
echo '<li id="fd-'.$k.'">'.
'<img src="'.$fav['small-icon'].'" alt="" /> '.$fav['title'].'</li>';
}
}
}
if ($count > 0) echo '</ul>';
echo '</div>';
echo '</div>';
echo '<div class="col30" id="available-favs">';
# Available favorites
echo '<fieldset><legend>'.__('Available favorites').'</legend>';
$count = 0;
$array = $_fav;
function cmp($a,$b) {
if ($a[1] == $b[1]) {
return 0;
}
return ($a[1] < $b[1]) ? -1 : 1;
}
uasort($array,'cmp');
foreach ($array as $k => $fav) {
if (($fav[5] == '*') || $core->auth->check($fav[5],$core->blog->id)) {
if ($count == 0) echo '<ul class="fav-list">';
$count++;
echo '<li id="fa-'.$fav[0].'">'.'<label for="fak-'.$fav[0].'">'.
'<span class="minimal">'.form::checkbox(array('append[]','fak-'.$fav[0]),$k).'</span>'.
'<img src="'.$fav[3].'" alt="" /> '.'<span class="zoom"><img src="'.$fav[4].'" alt="" /></span>'.$fav[1].
'</label>'.'</li>';
}
}
if ($count > 0) echo '</ul>';
echo
'<p>'.
$core->formNonce().
'<input type="submit" name="appendaction" value="'.__('Add to my favorites').'"></p>';
echo '</div>';
echo '</div>'; # Two-cols
echo '</form>';
echo '</div>'; # user-favorites
dcPage::helpBlock('core_user_pref'); dcPage::helpBlock('core_user_pref');
dcPage::close(); dcPage::close();
?> ?>

View File

@ -1,6 +1,6 @@
div.cu-ctrl { div.cu-ctrl {
background: #fbfbfb; background: #f5f5f5;
padding: 5px 0 0 0; padding: 5px 0 0 0;
margin: 0 0 1em 0; margin: 0 0 1em 0;
overflow: hidden; overflow: hidden;
@ -8,9 +8,6 @@ div.cu-ctrl {
border-width: 1px 0; border-width: 1px 0;
border-style: solid; border-style: solid;
} }
div.cu-ctrl a {
border: none;
}
div.cu-msg { div.cu-msg {
padding: 0 0.5em; padding: 0 0.5em;
@ -64,7 +61,7 @@ div.cu-progress div {
font-size: 0.8em; font-size: 0.8em;
line-height: 1em; line-height: 1em;
height: 1em; height: 1em;
padding: 2px 0; padding: .2em 0;
text-align: right; text-align: right;
background: green url(loader.png) repeat-x top left; background: green url(loader.png) repeat-x top left;
color: white; color: white;
@ -74,31 +71,19 @@ div.cu-progress div {
div.cu-btn { div.cu-btn {
padding: 0 0.5em; padding: 0 0.5em;
line-height: 1em; line-height: 1.2em;
height: 1.6em; height: 1.5em;
margin-top: 1em; margin-top: 1em;
position: relative; position: relative;
} }
div.cu-btn span { div.cu-btn span {
display: block; display: block;
margin: 0 0 0 5px; margin: 0 0 0 .5em;
float: right; float: right;
} }
div.cu-btn span a { div.cu-btn span a {
display: block; display: block;
padding: 2px; padding: .3em 1.5em;
line-height: 127%;
background: #e2dfca;
color: #333;
text-decoration: none;
border: 1px solid #e2dfca !important;
outline: none;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
}
div.cu-btn span a:hover, div.cu-btn span a:focus {
border-color: #ccc;
color: #06c;
} }
div.cu-btn span.cu-btn-browse { div.cu-btn span.cu-btn-browse {
float: none; float: none;
@ -106,15 +91,28 @@ div.cu-btn span.cu-btn-browse {
left: 0.5em; left: 0.5em;
margin: 0; margin: 0;
} }
div.cu-btn span.cu-btn-upload { div.cu-btn span.cu-btn-upload a.button {
font-weight: bold; color: #fff;
border: 1px solid #2373A8;
background: #2373A8;
background: -webkit-gradient(linear, left top, left bottom, from(#2C8FD1), to(#2373A8));
background: -moz-linear-gradient(top, #2C8FD1, #2373A8);
}
div.cu-btn span.cu-btn-upload a.button:hover, div.cu-btn span.cu-btn-upload a.button:focus {
color: #fff;
border: 1px solid #2C8FD1;
background: #2C8FD1;
background: -webkit-gradient(linear, left top, left bottom, from(#2373A8), to(#2C8FD1));
background: -moz-linear-gradient(top, #2373A8, #2C8FD1);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#2373A8', endColorstr='#2C8FD1');
} }
div.cu-maxsize { div.cu-maxsize {
clear: both; clear: both;
margin: 3px 0 0 0.5em; margin: .75em 0 0 0.5em;
font-style: italic;
} }
div.cu-disable { div.cu-disable {
margin: 1em 0;
padding: 0 0 0.5em 0.5em; padding: 0 0 0.5em 0.5em;
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1,124 +1,124 @@
/* /*
loader.css loader.css
Simple CSS rules for NetInstall Simple CSS rules for NetInstall
(c) 2008 - Olivier Meunier & contributors - All rights reserved. (c) 2008 - Olivier Meunier & contributors - All rights reserved.
Please see http://dotclear.net/ for more details. Please see http://dotclear.net/ for more details.
*/ */
body.install { body.install {
font: 0.8em "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif; font: 0.8em "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;
color: #000; color: #000;
background-color: #fff; background-color: #fff;
} }
body.install #content { body.install #content {
width:500px; width:500px;
margin:1em auto; margin:1em auto;
} }
body.install #main { body.install #main {
padding:1em 2em; padding:1em 2em;
border:1px #ccc solid; border:1px #ccc solid;
-moz-border-radius:8px; -moz-border-radius:8px;
-webkit-border-radius:8px; -webkit-border-radius:8px;
} }
body.install h1,h2 { body.install h1,h2 {
font-family: Arial,Helvetica,sans-serif; font-family: Helvetica,arial,sans-serif;
} }
body.install h1 { body.install h1 {
background: url(install/w-logo.png) no-repeat top center; background: url(install/w-logo.png) no-repeat top center;
font-size:1.8em; font-size:1.8em;
font-weight:normal; font-weight:normal;
text-align:center; text-align:center;
color: #666; color: #666;
padding-top: 70px; padding-top: 70px;
margin: 0 0 0.75em 0; margin: 0 0 0.75em 0;
} }
body.install h2 { body.install h2 {
color: #f90; color: #C71585;
} }
body.install h3 { body.install h3 {
margin-top:0; margin-top:0;
} }
body.install label { body.install label {
font-weight: bold; font-weight: bold;
color: #555; color: #555;
} }
body.install .msg { body.install .msg {
padding:10px 10px 10px 42px; padding:10px 10px 10px 42px;
-moz-border-radius:8px; -moz-border-radius:8px;
-webkit-border-radius:8px; -webkit-border-radius:8px;
} }
body.install .warning { body.install .warning {
background: #ffc url(install/important.png) no-repeat 10px 10px; background: #ffc url(install/important.png) no-repeat 10px 10px;
} }
body.install .notice { body.install .notice {
background: #eef url(install/note.png) no-repeat 10px 10px; background: #eef url(install/note.png) no-repeat 10px 10px;
} }
div.error, p.error, div.message, p.message, div.static-msg, p.static-msg { div.error, p.error, div.message, p.message, div.static-msg, p.static-msg {
padding: 0.5em 0.5em 0.5em 40px; padding: 0.5em 0.5em 0.5em 40px;
margin-bottom: 1em; margin-bottom: 1em;
-moz-border-radius: 8px; -moz-border-radius: 8px;
-webkit-border-radius: 8px; -webkit-border-radius: 8px;
} }
p.error, p.message, p.static-msg { p.error, p.message, p.static-msg {
padding-top: 1em; padding-top: 1em;
padding-bottom: 1em; padding-bottom: 1em;
} }
div.error, p.error { div.error, p.error {
background: #e5bfbf url(msg-error.png) no-repeat 5px 5px; background: #e5bfbf url(msg-error.png) no-repeat 5px 5px;
color: #600; color: #600;
} }
div.message, p.message, div.static-msg, p.static-msg { div.message, p.message, div.static-msg, p.static-msg {
background: #666 url(msg-std.png) no-repeat 5px 5px; background: #666 url(msg-std.png) no-repeat 5px 5px;
color: #fff; color: #fff;
} }
div.message a, p.message a, div.static-msg a, p.static-msg a { div.message a, p.message a, div.static-msg a, p.static-msg a {
color: #fff; color: #fff;
} }
label { label {
display : block; display : block;
} }
label input, label select, label span { label input, label select, label span {
display : block; display : block;
} }
label.required { label.required {
font-weight : bold; font-weight : bold;
} }
label.required:before { label.required:before {
content : '* '; content : '* ';
color : #c00; color : #c00;
} }
form { form {
display : block; display : block;
margin : 0; margin : 0;
padding : 0; padding : 0;
} }
fieldset { fieldset {
display : block; display : block;
margin : 0 0 1em 0; margin : 0 0 1em 0;
padding : 1em 0.5em; padding : 1em 0.5em;
border-width : 1px 0; border-width : 1px 0;
border-style: solid; border-style: solid;
border-color: #ccc; border-color: #ccc;
background: #fbfbfb; background: #f5f5f5;
} }
legend { legend {
font-weight : bold; font-weight : bold;
padding: 0.2em 0.6em; padding: 0.2em 0.6em;
border-width: 1px; border-width: 1px;
border-style: solid; border-style: solid;
border-color: #ccc; border-color: #ccc;
background: #fbfbfb; background: #f5f5f5;
margin-bottom: 0.5em; margin-bottom: 0.5em;
} }
a#obfus { a#obfus {
color: #fff; color: #fff;
background-color: #666; background-color: #666;
padding: 0 10px; padding: 0 10px;
-moz-border-radius: 2px; -moz-border-radius: 2px;
-webkit-border-radius: 2px; -webkit-border-radius: 2px;
} }

View File

@ -25,7 +25,7 @@
border-width: 1px 1px 0 1px; border-width: 1px 1px 0 1px;
border-style: solid; border-style: solid;
border-color: #000 #ccc #ccc #000; border-color: #000 #ccc #ccc #000;
background: #eceade; background: #dfdfdf;
} }
.jstElements select, .jstElements button { .jstElements select, .jstElements button {
@ -41,14 +41,14 @@
padding: 0; padding: 0;
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
border-color: #eceade; border-color: #dfdfdf;
background-color : transparent; background-color : transparent;
background-position : 50% 50%; background-position : 50% 50%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.jstElements button:hover { .jstElements button:hover {
border-color : #ccc; border-color : #ccc;
background-color: #dfdbc7; background-color: #fff;
} }
.jstElements button span { .jstElements button span {
display : none; display : none;
@ -68,7 +68,7 @@
list-style: none; list-style: none;
margin: 0 0 0 -5px; margin: 0 0 0 -5px;
padding: 0 0 5px 0; padding: 0 0 5px 0;
background: #eee; background: #dfdfdf;
border-top: 1px solid #999; border-top: 1px solid #999;
font-size: 90%; font-size: 90%;
font-weight: bold; font-weight: bold;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 524 B

View File

@ -197,7 +197,7 @@ if (!$step)
'unwanted side-effects. Consider reverting only if you experience strong issues with this new version.').'</strong> '. 'unwanted side-effects. Consider reverting only if you experience strong issues with this new version.').'</strong> '.
sprintf(__('You should not revert to version prior to last one (%s).'),end($archives)). sprintf(__('You should not revert to version prior to last one (%s).'),end($archives)).
'</p>'. '</p>'.
'<p><input type="submit" name="b_del" value="'.__('Delete selected file').'" /> '. '<p><input type="submit" class="delete" name="b_del" value="'.__('Delete selected file').'" /> '.
'<input type="submit" name="b_revert" value="'.__('Revert to selected file').'" />'. '<input type="submit" name="b_revert" value="'.__('Revert to selected file').'" />'.
$core->formNonce().'</p>'. $core->formNonce().'</p>'.
'</form>'; '</form>';

View File

@ -116,9 +116,9 @@ if (!$core->error->flag())
echo '<p class="message">'.__('User has been successfully removed.').'</p>'; echo '<p class="message">'.__('User has been successfully removed.').'</p>';
} }
echo '<h2>'.__('Users').'</h2>'; echo
'<h2>'.__('Users').'</h2>'.
echo '<p><strong><a href="user.php">'.__('Create a new user').'</a></strong></p>'; '<p class="top-add"><strong><a class="button add" href="user.php"><img src="images/add.png" alt="" />'.__('Create a new user').'</a></strong></p>';
if (!$show_filters) { if (!$show_filters) {
echo '<p><a id="filter-control" class="form-control" href="#">'.__('Filters').'</a></p>'; echo '<p><a id="filter-control" class="form-control" href="#">'.__('Filters').'</a></p>';
@ -143,7 +143,7 @@ if (!$core->error->flag())
'</label></p>'. '</label></p>'.
'<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '. '<p><label class="classic">'. form::field('nb',3,3,$nb_per_page).' '.
__('Users per page').'</label> '. __('Users per page').'</label> '.
'<input type="submit" value="'.__('filter').'" /></p>'. '<input type="submit" value="'.__('Apply filters').'" /></p>'.
'</div>'. '</div>'.
'<br class="clear" />'. //Opera sucks '<br class="clear" />'. //Opera sucks

View File

@ -24,17 +24,17 @@ class dcMenu
$this->items = array(); $this->items = array();
} }
public function addItem($title,$url,$img,$active,$show=true,$id=null) public function addItem($title,$url,$img,$active,$show=true,$id=null,$class=null)
{ {
if($show) { if($show) {
$this->items[] = $this->itemDef($title,$url,$img,$active,$id); $this->items[] = $this->itemDef($title,$url,$img,$active,$id,$class);
} }
} }
public function prependItem($title,$url,$img,$active,$show=true,$id=null) public function prependItem($title,$url,$img,$active,$show=true,$id=null,$class=null)
{ {
if ($show) { if ($show) {
array_unshift($this->items,$this->itemDef($title,$url,$img,$active,$id)); array_unshift($this->items,$this->itemDef($title,$url,$img,$active,$id,$class));
} }
} }
@ -64,7 +64,7 @@ class dcMenu
return $res; return $res;
} }
protected function itemDef($title,$url,$img,$active,$id=null) protected function itemDef($title,$url,$img,$active,$id=null,$class=null)
{ {
if (is_array($url)) { if (is_array($url)) {
$link = $url[0]; $link = $url[0];
@ -75,7 +75,7 @@ class dcMenu
} }
return return
'<li'.(($active) ? ' class="active"' : ''). '<li'.(($active || $class) ? ' class="'.(($active) ? 'active ' : '').(($class) ? $class : '').'"' : '').
(($id) ? ' id="'.$id.'"' : ''). (($id) ? ' id="'.$id.'"' : '').
(($img) ? ' style="background-image: url('.$img.');"' : ''). (($img) ? ' style="background-image: url('.$img.');"' : '').
'>'. '>'.

View File

@ -117,9 +117,12 @@ class dcPage
'<div id="info-box">'. '<div id="info-box">'.
'<form action="index.php" method="post"><div>'. '<form action="index.php" method="post"><div>'.
$blog_box. $blog_box.
' - <a href="'.$core->blog->url.'" class="button">'.__('View site').'</a>'. '<a href="'.$core->blog->url.'"onclick="window.open(this.href);return false;" title="'.__('Go to site').' ('.__('new window').')'.'">'.__('Go to site').' <img src="images/outgoing.png" alt="" /></a>'.
' - '.__('User:').' <strong>'.$core->auth->userID().'</strong>'. '</div></form>'.
' - <a href="index.php?logout=1" class="logout">'.__('Logout').'</a>'. '</div>'.
'<div id="info-box2"><form action="index.php" method="post><div>"'.
' '.__('User:').' <strong>'.$core->auth->userID().'</strong>'.
' - <a href="index.php?logout=1" class="logout">'.__('Logout').' <img src="images/logout.png" alt="" /></a>'.
'</div></form>'. '</div></form>'.
'</div>'; '</div>';
@ -161,8 +164,9 @@ class dcPage
echo echo
'</div>'."\n". // End of #main-menu '</div>'."\n". // End of #main-menu
'<div id="footer"><p><img src="images/dotclear_pw.png" alt="Dotclear" /> '. '<div id="footer"><p>'.
sprintf(__('Thank you for using %s.'),'<a href="http://dotclear.org/">Dotclear</a>'). sprintf(__('Thank you for using %s.'),'<a href="http://dotclear.org/">Dotclear '.DC_VERSION.'</a>').
' <span class="credit"> (Icons by <a href="http://dryicons.com/">Dryicons</a>)</span>'.
'</p></div>'."\n". '</p></div>'."\n".
"</div>\n"; // End of #wrapper "</div>\n"; // End of #wrapper
@ -327,7 +331,7 @@ class dcPage
} }
echo echo
'<div id="help"><hr /><div class="help-content"><h2>'.__('Help').'</h2>'. '<div id="help"><hr /><div class="help-content clear"><h2>'.__('Help').'</h2>'.
$content. $content.
'</div></div>'; '</div></div>';
} }

View File

@ -137,6 +137,15 @@ elseif ($core->auth->sessionExists())
$core->session->destroy(); $core->session->destroy();
http::redirect('auth.php'); http::redirect('auth.php');
} }
/*
# Check add to my fav fired
if (!empty($_REQUEST['add-favorite'])) {
$redir = $_SERVER['REQUEST_URI'];
# Extract admin page from URI
# TO BE COMPLETED
}
*/
} }
if ($core->auth->userID() && $core->blog !== null) if ($core->auth->userID() && $core->blog !== null)
@ -158,22 +167,85 @@ if ($core->auth->userID() && $core->blog !== null)
} }
} }
unset($hfiles,$locales_root); unset($hfiles,$locales_root);
# Standard favorites
$_fav = new ArrayObject();
# [] : Title, URL, small icon, large icon, permissions, id, class
# NB : '*' in permissions means any, null means super admin only
$_fav['prefs'] = new ArrayObject(array('prefs',__('My preferences'),'preferences.php',
'images/menu/user-pref.png','images/menu/user-pref-b.png',
'*',null,null));
$_fav['new_post'] = new ArrayObject(array('new_post',__('New entry'),'post.php',
'images/menu/edit.png','images/menu/edit-b.png',
'usage,contentadmin',null,'menu-new-post'));
$_fav['posts'] = new ArrayObject(array('posts',__('Entries'),'posts.php',
'images/menu/entries.png','images/menu/entries-b.png',
'usage,contentadmin',null,null));
$_fav['comments'] = new ArrayObject(array('comments',__('Comments'),'comments.php',
'images/menu/comments.png','images/menu/comments-b.png',
'usage,contentadmin',null,null));
$_fav['search'] = new ArrayObject(array('search',__('Search'),'search.php',
'images/menu/search.png','images/menu/search-b.png',
'usage,contentadmin',null,null));
$_fav['categories'] = new ArrayObject(array('categories',__('Categories'),'categories.php',
'images/menu/categories.png','images/menu/categories-b.png',
'categories',null,null));
$_fav['media'] = new ArrayObject(array('media',__('Media manager'),'media.php',
'images/menu/media.png','images/menu/media-b.png',
'media,media_admin',null,null));
$_fav['blog_pref'] = new ArrayObject(array('blog_pref',__('Blog settings'),'blog_pref.php',
'images/menu/blog-pref.png','images/menu/blog-pref-b.png',
'admin',null,null));
$_fav['blog_theme'] = new ArrayObject(array('blog_theme',__('Blog appearance'),'blog_theme.php',
'images/menu/themes.png','images/menu/blog-theme-b.png',
'admin',null,null));
$_fav['blogs'] = new ArrayObject(array('blogs',__('Blogs'),'blogs.php',
'images/menu/blogs.png','images/menu/blogs-b.png',
'usage,contentadmin',null,null));
$_fav['users'] = new ArrayObject(array('users',__('Users'),'users.php',
'images/menu/users.png','images/menu/users-b.png',
null,null,null));
$_fav['plugins'] = new ArrayObject(array('plugins',__('Plugins'),'plugins.php',
'images/menu/plugins.png','images/menu/plugins-b.png',
null,null,null));
$_fav['langs'] = new ArrayObject(array('langs',__('Languages'),'langs.php',
'images/menu/langs.png','images/menu/langs-b.png',
null,null,null));
# Menus creation # Menus creation
$_menu['Dashboard'] = new dcMenu('dashboard-menu',null); $_menu['Dashboard'] = new dcMenu('dashboard-menu',null);
$_menu['Favorites'] = new dcMenu('favorites-menu','My favorites');
$_menu['Blog'] = new dcMenu('blog-menu','Blog'); $_menu['Blog'] = new dcMenu('blog-menu','Blog');
$_menu['System'] = new dcMenu('system-menu','System'); $_menu['System'] = new dcMenu('system-menu','System');
$_menu['Plugins'] = new dcMenu('plugins-menu','Plugins'); $_menu['Plugins'] = new dcMenu('plugins-menu','Plugins');
# Loading plugins # Loading plugins
$core->plugins->loadModules(DC_PLUGINS_ROOT,'admin',$_lang); $core->plugins->loadModules(DC_PLUGINS_ROOT,'admin',$_lang);
# Loading favorites info from plugins
$core->callBehavior('adminDashboardFavs', $core, $_fav);
# Set menu titles # Set menu titles
$_menu['System']->title = __('System'); $_menu['System']->title = __('System');
$_menu['Blog']->title = __('Blog'); $_menu['Blog']->title = __('Blog');
$_menu['Plugins']->title = __('Plugins'); $_menu['Plugins']->title = __('Plugins');
$_menu['Favorites']->title = __('My favorites');
/*
if (!preg_match('/index.php$/',$_SERVER['REQUEST_URI'])) {
# Admin index can't be add in fav's
$_menu['Dashboard']->prependItem(__('Add this page to my favorites'),'#','images/menu/add_to_favorites.png',
false,$core->auth->check('usage,contentadmin',$core->blog->id),'fav-add');
}
*/
$_menu['Dashboard']->prependItem(__('My preferences'),'preferences.php','images/menu/user-pref.png',
preg_match('/preferences.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
true);
$_menu['Dashboard']->prependItem(__('Dashboard'),'index.php','images/menu/dashboard.png', $_menu['Dashboard']->prependItem(__('Dashboard'),'index.php','images/menu/dashboard.png',
preg_match('/index.php$/',$_SERVER['REQUEST_URI']), preg_match('/index.php$/',$_SERVER['REQUEST_URI']),
$core->auth->check('usage,contentadmin',$core->blog->id)); $core->auth->check('usage,contentadmin',$core->blog->id));
@ -181,6 +253,9 @@ if ($core->auth->userID() && $core->blog !== null)
$_menu['Blog']->prependItem(__('Blog appearance'),'blog_theme.php','images/menu/themes.png', $_menu['Blog']->prependItem(__('Blog appearance'),'blog_theme.php','images/menu/themes.png',
preg_match('/blog_theme.php(\?.*)?$/',$_SERVER['REQUEST_URI']), preg_match('/blog_theme.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
$core->auth->check('admin',$core->blog->id)); $core->auth->check('admin',$core->blog->id));
$_menu['Blog']->prependItem(__('Blog settings'),'blog_pref.php','images/menu/blog-pref.png',
preg_match('/blog_pref.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
$core->auth->check('admin',$core->blog->id));
$_menu['Blog']->prependItem(__('Media manager'),'media.php','images/menu/media.png', $_menu['Blog']->prependItem(__('Media manager'),'media.php','images/menu/media.png',
preg_match('/media(_item)?.php(\?.*)?$/',$_SERVER['REQUEST_URI']), preg_match('/media(_item)?.php(\?.*)?$/',$_SERVER['REQUEST_URI']),
$core->auth->check('media,media_admin',$core->blog->id)); $core->auth->check('media,media_admin',$core->blog->id));
@ -216,5 +291,36 @@ if ($core->auth->userID() && $core->blog !== null)
preg_match('/blogs.php$/',$_SERVER['REQUEST_URI']), preg_match('/blogs.php$/',$_SERVER['REQUEST_URI']),
$core->auth->isSuperAdmin() || $core->auth->isSuperAdmin() ||
$core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->blog_count > 1); $core->auth->check('usage,contentadmin',$core->blog->id) && $core->auth->blog_count > 1);
// Set favorites menu
$ws = $core->auth->user_prefs->addWorkspace('favorites');
$count = 0;
foreach ($ws->dumpPrefs() as $k => $v) {
// User favorites only
if (!$v['global']) {
$count++;
$fav = unserialize($v['value']);
$_menu['Favorites']->addItem($fav['title'],$fav['url'],$fav['small-icon'],
preg_match('/'.$fav['url'].'(\?.*)?$/',$_SERVER['REQUEST_URI']),
(($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']);
}
}
if (!$count) {
// Global favorites if any
foreach ($ws->dumpPrefs() as $k => $v) {
$count++;
$fav = unserialize($v['value']);
$_menu['Favorites']->addItem($fav['title'],$fav['url'],$fav['small-icon'],
preg_match('/'.$fav['url'].'(\?.*)?$/',$_SERVER['REQUEST_URI']),
(($fav['permissions'] == '*') || $core->auth->check($fav['permissions'],$core->blog->id)),$fav['id'],$fav['class']);
}
}
if (!$count) {
// No user or global favorites, add "new entry" fav
$_menu['Favorites']->addItem(__('New entry'),'post.php','images/menu/edit.png',
preg_match('/post.php$/',$_SERVER['REQUEST_URI']),
$core->auth->check('usage,contentadmin',$core->blog->id),'menu-new-post',null);
}
} }
?> ?>

View File

@ -39,6 +39,8 @@ class dcAuth
protected $perm_types; ///< <b>array</b> Permission types protected $perm_types; ///< <b>array</b> Permission types
public $user_prefs; ///< <b>dcPrefs</b> dcPrefs object
/** /**
Class constructor. Takes dcCore object as single argument. Class constructor. Takes dcCore object as single argument.
@ -135,6 +137,8 @@ class dcAuth
$this->user_options = array_merge($this->core->userDefaults(),$rs->options()); $this->user_options = array_merge($this->core->userDefaults(),$rs->options());
$this->user_prefs = new dcPrefs($this->core,$this->user_id);
# Get permissions on blogs # Get permissions on blogs
if ($this->findUserBlog() === false) { if ($this->findUserBlog() === false) {
return false; return false;

View File

@ -106,6 +106,10 @@ class dcMedia extends filemanager
$this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate')); $this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/jpeg','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/png','recreate',array($this,'imageThumbCreate'));
$this->addFileHandler('image/gif','recreate',array($this,'imageThumbCreate'));
# Thumbnails sizes # Thumbnails sizes
$this->thumb_sizes['m'][0] = abs($core->blog->settings->system->media_img_m_size); $this->thumb_sizes['m'][0] = abs($core->blog->settings->system->media_img_m_size);
$this->thumb_sizes['s'][0] = abs($core->blog->settings->system->media_img_s_size); $this->thumb_sizes['s'][0] = abs($core->blog->settings->system->media_img_s_size);
@ -896,6 +900,17 @@ class dcMedia extends filemanager
/** /**
Calls file handlers registered for recreate event Calls file handlers registered for recreate event
@param f <b>fileItem</b> fileItem object
*/
public function mediaFireRecreateEvent($f)
{
$media_type = files::getMimeType($f->basename);
$this->callFileHandler($media_type,'recreate',null,$f->basename); // Args list to be completed as necessary (Franck)
}
/**
Calls file handlers registered for recreate event
@param f <b>fileItem</b> fileItem object @param f <b>fileItem</b> fileItem object
*/ */
public function mediaFireRecreateEvent($f) public function mediaFireRecreateEvent($f)
@ -906,7 +921,7 @@ class dcMedia extends filemanager
/* Image handlers /* Image handlers
------------------------------------------------------- */ ------------------------------------------------------- */
public function imageThumbCreate($cur,$f,$media_id,$force=true) public function imageThumbCreate($cur,$f,$force=true)
{ {
$file = $this->pwd.'/'.$f; $file = $this->pwd.'/'.$f;

View File

@ -0,0 +1,130 @@
<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
if (!defined('DC_RC_PATH')) { return; }
/**
@ingroup DC_CORE
@brief User prefs handler
dcPrefs provides user preferences management. This class instance exists as
dcAuth $prefs property. You should create a new prefs instance when
updating another user prefs.
*/
class dcPrefs
{
protected $con; ///< <b>connection</b> Database connection object
protected $table; ///< <b>string</b> Prefs table name
protected $user_id; ///< <b>string</b> User ID
protected $workspaces = array(); ///< <b>array</b> Associative workspaces array
protected $ws; ///< <b>string</b> Current workspace
/**
Object constructor. Retrieves user prefs and puts them in $workspaces
array. Local (user) prefs have a highest priority than global prefs.
@param core <b>dcCore</b> dcCore object
@param user_id <b>string</b> User ID
*/
public function __construct($core,$user_id)
{
$this->con =& $core->con;
$this->table = $core->prefix.'pref';
$this->user_id =& $user_id;
$this->loadPrefs();
}
/**
Retrieves all workspaces (and their prefs) from database, with one query.
*/
private function loadPrefs()
{
$strReq = 'SELECT user_id, pref_id, pref_value, '.
'pref_type, pref_label, pref_ws '.
'FROM '.$this->table.' '.
"WHERE user_id = '".$this->con->escape($this->user_id)."' ".
'OR user_id IS NULL '.
'ORDER BY pref_ws ASC, pref_id ASC';
try {
$rs = $this->con->select($strReq);
} catch (Exception $e) {
trigger_error(__('Unable to retrieve workspaces:').' '.$this->con->error(), E_USER_ERROR);
}
/* Prevent empty tables (install phase, for instance) */
if ($rs->isEmpty()) {
return;
}
do {
$ws = trim($rs->f('pref_ws'));
if (!$rs->isStart()) {
// we have to go up 1 step, since workspaces construction performs a fetch()
// at very first time
$rs->movePrev();
}
$this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws,$rs);
} while(!$rs->isStart());
}
/**
Create a new workspace. If the workspace already exists, return it without modification.
@param ws <b>string</b> Workspace name
@return <b>dcWorkspace</b> The workspace created
*/
public function addWorkspace($ws)
{
if (!array_key_exists($ws, $this->workspaces)) {
$this->workspaces[$ws] = new dcWorkspace($GLOBALS['core'], $this->user_id, $ws);
}
return $this->workspaces[$ws];
}
/**
Returns full workspace with all prefs pertaining to it.
@param ws <b>string</b> Workspace name
@return <b>dcWorkspace</b>
*/
public function get($ws)
{
if (array_key_exists($ws, $this->workspaces)) {
return $this->workspaces[$ws];
}
return null;
}
/**
Magic __get method.
@copydoc ::get
*/
public function __get($n)
{
return $this->get($n);
}
/**
Returns $workspaces property content.
@return <b>array</b>
*/
public function dumpWorkspaces()
{
return $this->workspaces;
}
}
?>

View File

@ -0,0 +1,325 @@
<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Dotclear 2.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
if (!defined('DC_RC_PATH')) { return; }
/**
@ingroup DC_CORE
@brief User workspace for preferences handler
*/
class dcWorkspace
{
protected $con; ///< <b>connection</b> Database connection object
protected $table; ///< <b>string</b> Preferences table name
protected $user_id; ///< <b>string</b> User ID
protected $global_prefs = array(); ///< <b>array</b> Global prefs array
protected $local_prefs = array(); ///< <b>array</b> Local prefs array
protected $prefs = array(); ///< <b>array</b> Associative prefs array
protected $ws; ///< <b>string</b> Current workspace
/**
Object constructor. Retrieves user prefs and puts them in $prefs
array. Local (user) prefs have a highest priority than global prefs.
@param name <b>string</b> ID for this workspace
*/
public function __construct(&$core, $user_id, $name, $rs=null)
{
if (preg_match('/^[a-zA-Z][a-zA-Z0-9]+$/',$name)) {
$this->ws = $name;
} else {
throw new Exception(sprintf(__('Invalid dcWorkspace: %s'),$name));
}
$this->con =& $core->con;
$this->table = $core->prefix.'pref';
$this->user_id =& $user_id;
$this->getPrefs($rs);
}
private function getPrefs($rs=null)
{
if ($rs == null) {
$strReq = 'SELECT user_id, pref_id, pref_value, '.
'pref_type, pref_label, pref_ws '.
'FROM '.$this->table.' '.
"WHERE (user_id = '".$this->con->escape($this->user_id)."' ".
'OR user_id IS NULL) '.
"AND pref_ws = '".$this->con->escape($this->ws)."' ".
'ORDER BY pref_id ASC ';
try {
$rs = $this->con->select($strReq);
} catch (Exception $e) {
trigger_error(__('Unable to retrieve prefs:').' '.$this->con->error(), E_USER_ERROR);
}
}
while ($rs->fetch())
{
if ($rs->f('pref_ws') != $this->ws){
break;
}
$id = trim($rs->f('pref_id'));
$value = $rs->f('pref_value');
$type = $rs->f('pref_type');
if ($type == 'float' || $type == 'double') {
$type = 'float';
} elseif ($type != 'boolean' && $type != 'integer') {
$type = 'string';
}
settype($value,$type);
$array = $rs->user_id ? 'local' : 'global';
$this->{$array.'_prefs'}[$id] = array(
'ws' => $this->ws,
'value' => $value,
'type' => $type,
'label' => (string) $rs->f('pref_label'),
'global' => $rs->user_id == ''
);
}
$this->prefs = $this->global_prefs;
foreach ($this->local_prefs as $id => $v) {
$this->prefs[$id] = $v;
}
return true;
}
private function prefExists($id,$global=false)
{
$array = $global ? 'global' : 'local';
return isset($this->{$array.'_prefs'}[$id]);
}
/**
Returns pref value if exists.
@param n <b>string</b> Pref name
@return <b>mixed</b>
*/
public function get($n)
{
if (isset($this->prefs[$n]['value'])) {
return $this->prefs[$n]['value'];
}
return null;
}
/**
Magic __get method.
@copydoc ::get
*/
public function __get($n)
{
return $this->get($n);
}
/**
Sets a pref in $prefs property. This sets the pref for script
execution time only and if pref exists.
@param n <b>string</b> Pref name
@param v <b>mixed</b> Pref value
*/
public function set($n,$v)
{
if (isset($this->prefs[$n])) {
$this->prefs[$n]['value'] = $v;
}
}
/**
Magic __set method.
@copydoc ::set
*/
public function __set($n,$v)
{
$this->set($n,$v);
}
/**
Creates or updates a pref.
$type could be 'string', 'integer', 'float', 'boolean' or null. If $type is
null and pref exists, it will keep current pref type.
$value_change allow you to not change pref. Useful if you need to change
a pref label or type and don't want to change its value.
@param id <b>string</b> Pref ID
@param value <b>mixed</b> Pref value
@param type <b>string</b> Pref type
@param label <b>string</b> Pref label
@param value_change <b>boolean</b> Change pref value or not
@param global <b>boolean</b> Pref is global
*/
public function put($id,$value,$type=null,$label=null,$value_change=true,$global=false)
{
if (!preg_match('/^[a-zA-Z][a-zA-Z0-9_]+$/',$id)) {
throw new Exception(sprintf(__('%s is not a valid pref id'),$id));
}
# We don't want to change pref value
if (!$value_change)
{
if (!$global && $this->prefExists($id,false)) {
$value = $this->local_prefs[$id]['value'];
} elseif ($this->prefExists($id,true)) {
$value = $this->global_prefs[$id]['value'];
}
}
# Pref type
if ($type == 'double')
{
$type = 'float';
}
elseif ($type === null)
{
if (!$global && $this->prefExists($id,false)) {
$type = $this->local_prefs[$id]['type'];
} elseif ($this->prefExists($id,true)) {
$type = $this->global_prefs[$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->prefExists($id,false)) {
$label = $this->local_prefs[$id]['label'];
} elseif ($this->prefExists($id,true)) {
$label = $this->global_prefs[$id]['label'];
}
}
settype($value,$type);
$cur = $this->con->openCursor($this->table);
$cur->pref_value = ($type == 'boolean') ? (string) (integer) $value : (string) $value;
$cur->pref_type = $type;
$cur->pref_label = $label;
#If we are local, compare to global value
if (!$global && $this->prefExists($id,true))
{
$g = $this->global_prefs[$id];
$same_pref = $g['ws'] == $this->ws && $g['value'] == $value
&& $g['type'] == $type && $g['label'] == $label;
# Drop pref if same value as global
if ($same_pref && $this->prefExists($id,false)) {
$this->drop($id);
} elseif ($same_pref) {
return;
}
}
if ($this->prefExists($id,$global) && $this->ws == $this->prefs[$id]['ws'])
{
if ($global) {
$where = 'WHERE user_id IS NULL ';
} else {
$where = "WHERE user_id = '".$this->con->escape($this->user_id)."' ";
}
$cur->update($where."AND pref_id = '".$this->con->escape($id)."' AND pref_ws = '".$this->con->escape($this->ws)."' ");
}
else
{
$cur->pref_id = $id;
$cur->user_id = $global ? null : $this->user_id;
$cur->pref_ws = $this->ws;
$cur->insert();
}
}
/**
Removes an existing pref. Workspace
@param id <b>string</b> Pref ID
*/
public function drop($id)
{
if (!$this->ws) {
throw new Exception(__('No workspace specified'));
}
$strReq = 'DELETE FROM '.$this->table.' ';
if ($this->user_id === null) {
$strReq .= 'WHERE user_id IS NULL ';
$global = true;
} else {
$strReq .= "WHERE user_id = '".$this->con->escape($this->user_id)."' ";
$global = false;
}
$strReq .= "AND pref_id = '".$this->con->escape($id)."' ";
$strReq .= "AND pref_ws = '".$this->con->escape($this->ws)."' ";
$this->con->execute($strReq);
if ($this->prefExists($id,$global)) {
$array = $global ? 'global' : 'local';
unset($this->{$array.'_prefs'}[$id]);
}
}
/**
Returns $prefs property content.
@return <b>array</b>
*/
public function dumpPrefs()
{
return $this->prefs;
}
/**
Returns $local_prefs property content.
@return <b>array</b>
*/
public function dumpLocalPrefs()
{
return $this->local_prefs;
}
/**
Returns $global_prefs property content.
@return <b>array</b>
*/
public function dumpGlobalPrefs()
{
return $this->global_prefs;
}
}
?>

View File

@ -26,7 +26,7 @@ header('Content-Type: text/html; charset=utf-8');
body { body {
font: 62.5%/1.5em "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif; font: 62.5%/1.5em "DejaVu Sans","Lucida Grande","Lucida Sans Unicode",Arial,sans-serif;
color : #000; color : #000;
background : #eceade; background : #E5E3DA;
margin : 0; margin : 0;
padding : 0; padding : 0;
} }

View File

@ -210,6 +210,17 @@ $_s->meta
->primary('pk_meta','meta_id','meta_type','post_id') ->primary('pk_meta','meta_id','meta_type','post_id')
; ;
$_s->pref
->pref_id ('varchar', 255, false)
->user_id ('varchar', 32, true)
->pref_ws ('varchar', 32, false, "'system'")
->pref_value ('text', 0, true, null)
->pref_type ('varchar', 8, false, "'string'")
->pref_label ('text', 0, true)
->unique('uk_pref','pref_ws','pref_id','user_id')
;
/* References indexes /* References indexes
-------------------------------------------------------- */ -------------------------------------------------------- */
$_s->category->index ('idx_category_blog_id', 'btree', 'blog_id'); $_s->category->index ('idx_category_blog_id', 'btree', 'blog_id');
@ -227,6 +238,7 @@ $_s->log->index ('idx_log_user_id', 'btree', 'user_id');
$_s->comment->index ('idx_comment_post_id', 'btree', 'post_id'); $_s->comment->index ('idx_comment_post_id', 'btree', 'post_id');
$_s->meta->index ('idx_meta_post_id', 'btree','post_id'); $_s->meta->index ('idx_meta_post_id', 'btree','post_id');
$_s->meta->index ('idx_meta_meta_type', 'btree','meta_type'); $_s->meta->index ('idx_meta_meta_type', 'btree','meta_type');
$_s->pref->index ('idx_pref_user_id', 'btree', 'user_id');
/* Performance indexes /* Performance indexes
-------------------------------------------------------- */ -------------------------------------------------------- */
@ -255,6 +267,7 @@ $_s->ping->reference('fk_ping_post','post_id','post','post_id','cascade','cascad
$_s->comment->reference('fk_comment_post','post_id','post','post_id','cascade','cascade'); $_s->comment->reference('fk_comment_post','post_id','post','post_id','cascade','cascade');
$_s->log->reference('fk_log_blog','blog_id','blog','blog_id','cascade','set null'); $_s->log->reference('fk_log_blog','blog_id','blog','blog_id','cascade','set null');
$_s->meta->reference('fk_meta_post','post_id','post','post_id','cascade','cascade'); $_s->meta->reference('fk_meta_post','post_id','post','post_id','cascade','cascade');
$_s->pref->reference('fk_pref_user','user_id','user','user_id','cascade','cascade');
/* PostgreSQL specific indexes /* PostgreSQL specific indexes
-------------------------------------------------------- */ -------------------------------------------------------- */
@ -262,5 +275,6 @@ if ($_s->driver() == 'pgsql')
{ {
$_s->setting->index ('idx_setting_blog_id_null', 'btree', '(blog_id IS NULL)'); $_s->setting->index ('idx_setting_blog_id_null', 'btree', '(blog_id IS NULL)');
$_s->media->index ('idx_media_media_path', 'btree', 'media_path', 'media_dir'); $_s->media->index ('idx_media_media_path', 'btree', 'media_path', 'media_dir');
$_s->pref->index ('idx_pref_user_id_null', 'btree', '(user_id IS NULL)');
} }
?> ?>

View File

@ -142,6 +142,45 @@ function dotclearUpgrade($core)
$cur->update($sqlstr); $cur->update($sqlstr);
} }
} }
if (version_compare($version,'2.3','<'))
{
# Add global favorites
$sqlstr = 'INSERT INTO `dc_pref` (`pref_id`, `user_id`, `pref_ws`, `pref_value`, `pref_type`, `pref_label`) VALUES';
$sqlstr .= '(\'g000\', NULL, \'favorites\', \'a:8:{s:4:"name";s:8:"new_post";s:5:"title";'.
's:'.strlen(__('New entry')).':"'.__('New entry').'";s:3:"url";s:8:"post.php";'.
's:10:"small-icon";s:20:"images/menu/edit.png";s:10:"large-icon";s:22:"images/menu/edit-b.png";'.
's:11:"permissions";s:18:"usage,contentadmin";s:2:"id";N;s:5:"class";s:13:"menu-new-post";}\', \'string\', NULL)';
$sqlstr .= '(\'g001\', NULL, \'favorites\', \'a:8:{s:4:"name";s:5:"posts";s:5:"title";'.
's:'.strlen(__('Entries')).':"'.__('Entries').'";s:3:"url";s:9:"posts.php";'.
's:10:"small-icon";s:23:"images/menu/entries.png";s:10:"large-icon";s:25:"images/menu/entries-b.png";'.
's:11:"permissions";s:18:"usage,contentadmin";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g002\', NULL, \'favorites\', \'a:8:{s:4:"name";s:8:"comments";s:5:"title";'.
's:'.strlen(__('Comments')).':"'.__('Comments').'";s:3:"url";s:12:"comments.php";'.
's:10:"small-icon";s:24:"images/menu/comments.png";s:10:"large-icon";s:26:"images/menu/comments-b.png";'.
's:11:"permissions";s:18:"usage,contentadmin";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g003\', NULL, \'favorites\', \'a:8:{s:4:"name";s:5:"prefs";s:5:"title";'.
's:'.strlen(__('My preferences')).':"'.__('My preferences').'";s:3:"url";s:15:"preferences.php";'.
's:10:"small-icon";s:25:"images/menu/user-pref.png";s:10:"large-icon";s:27:"images/menu/user-pref-b.png";'.
's:11:"permissions";s:1:"*";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g004\', NULL, \'favorites\', \'a:8:{s:4:"name";s:9:"blog_pref";s:5:"title";'.
's:'.strlen(__('Blog settings')).':"'.__('Blog settings').'";s:3:"url";s:13:"blog_pref.php";'.
's:10:"small-icon";s:25:"images/menu/blog-pref.png";s:10:"large-icon";s:27:"images/menu/blog-pref-b.png";'.
's:11:"permissions";s:5:"admin";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g005\', NULL, \'favorites\', \'a:8:{s:4:"name";s:10:"blog_theme";s:5:"title";'.
's:'.strlen(__('Blog appearance')).':"'.__('Blog appearance').'";s:3:"url";s:14:"blog_theme.php";'.
's:10:"small-icon";s:22:"images/menu/themes.png";s:10:"large-icon";s:28:"images/menu/blog-theme-b.png";'.
's:11:"permissions";s:5:"admin";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g006\', NULL, \'favorites\', \'a:8:{s:4:"name";s:5:"pages";s:5:"title";'.
's:'.strlen(__('Pages')).':"'.__('Pages').'";s:3:"url";s:18:"plugin.php?p=pages";'.
's:10:"small-icon";s:27:"index.php?pf=pages/icon.png";s:10:"large-icon";s:31:"index.php?pf=pages/icon-big.png";'.
's:11:"permissions";s:18:"contentadmin,pages";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL)';
$sqlstr .= '(\'g007\', NULL, \'favorites\', \'a:8:{s:4:"name";s:8:"blogroll";s:5:"title";'.
's:'.strlen(__('Blogroll')).':"'.__('Blogroll').'";s:3:"url";s:21:"plugin.php?p=blogroll";'.
's:10:"small-icon";s:36:"index.php?pf=blogroll/icon-small.png";s:10:"large-icon";s:30:"index.php?pf=blogroll/icon.png";'.
's:11:"permissions";s:18:"usage,contentadmin";s:2:"id";N;s:5:"class";N;}\', \'string\', NULL);';
$core->con->execute($sqlstr);
}
$core->setVersion('core',DC_VERSION); $core->setVersion('core',DC_VERSION);
$core->blogDefaults(); $core->blogDefaults();

View File

@ -6,8 +6,8 @@ msgstr ""
"Project-Id-Version: Dotclear 2\n" "Project-Id-Version: Dotclear 2\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-15 22:40+0100\n" "POT-Creation-Date: 2011-01-15 22:40+0100\n"
"PO-Revision-Date: 2011-01-16 19:14+0100\n" "PO-Revision-Date: 2011-04-19 13:57+0100\n"
"Last-Translator: xave <xave@dotclear.net>\n" "Last-Translator: Franck Paul <carnet.franck.paul@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -2554,6 +2554,23 @@ msgstr "Impossible d'obtenir les espaces de nommage :"
msgid "Invalid setting namespace: %s" msgid "Invalid setting namespace: %s"
msgstr "Espace de nommage du paramètre invalide : %s" msgstr "Espace de nommage du paramètre invalide : %s"
msgid "Unable to retrieve workspaces:"
msgstr "Impossible d'obtenir les espaces de travail :"
#, php-format
msgid "Invalid dcWorkspace: %s"
msgstr "Espace de travail de la préférence invalide : %s"
msgid "Unable to retrieve prefs:"
msgstr "Impossible d'obtenir les préférences :"
#, php-format
msgid "%s is not a valid pref id"
msgstr "%s n'est pas un identifiant de préférence valide"
msgid "No workspace specified"
msgstr "Aucun espace de travail spécifié"
#, php-format #, php-format
msgid "%s has still been pinged" msgid "%s has still been pinged"
msgstr "Un rétrolien vers %s a déjà été fait" msgstr "Un rétrolien vers %s a déjà été fait"
@ -2629,3 +2646,57 @@ msgstr "L'erreur suivante a été rencontrée lors de la tentative d'accès à l
#~ msgid "Name" #~ msgid "Name"
#~ msgstr "Nom" #~ msgstr "Nom"
msgid "My favorites"
msgstr "Mes favoris"
msgid "Add this page to my favorites"
msgstr "Ajouter cette page à mes favoris"
msgid "My profile"
msgstr "Mon profil"
msgid "My options"
msgstr "Mes options"
msgid "Default favorites"
msgstr "Favoris par défaut"
msgid "My preferences"
msgstr "Mes préférences"
msgid "Apply filters"
msgstr "Appliquer les filtres"
msgid "Go to site"
msgstr "Aller sur le site"
msgid "new window"
msgstr "nouvelle fenêtre"
msgid "Those favorites are displayed when My Favorites list is empty."
msgstr "Favoris affichés quand la liste Mes Favoris est vide."
msgid "Favorites have been successfully added."
msgstr "Les favoris ont été ajoutés avec succès."
msgid "Delete selected favorites"
msgstr "Retirer les favoris sélectionnés"
msgid "Add to my favorites"
msgstr "Ajouter à mes favoris"
msgid "Available favorites"
msgstr "Favoris disponibles"
msgid "Currently no personal favorites."
msgstr "La liste de vos favoris est vide pour le moment."
msgid "Are you sure you want to remove selected favorites?"
msgstr "Êtes-vous sûr de vouloir retirer les favoris sélectionnés ?"
msgid "Favorites have been successfully removed."
msgstr "Les favoris ont été retirés avec succès."
msgid "Favorites has been successfully updated."
msgstr "Les favoris ont été mis à jour avec succès."

View File

@ -7,7 +7,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-14 22:01+0100\n" "POT-Creation-Date: 2011-01-14 22:01+0100\n"
"PO-Revision-Date: \n" "PO-Revision-Date: \n"
"Last-Translator: xave <xave@dotclear.net>\n" "Last-Translator: Franck Paul <carnet.franck.paul@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -1382,6 +1382,18 @@ msgstr "ordre"
msgid "Remove widget" msgid "Remove widget"
msgstr "Supprimer le widget" msgstr "Supprimer le widget"
msgid "Preferences successfully updated"
msgstr "Préférences mises à jour avec succès"
msgid "Preferences definition successfully updated"
msgstr "Définition des préférences mise à jour avec succès"
msgid "user preferences"
msgstr "préférences utilisateur"
msgid "global preferences"
msgstr "préférences globales"
#~ msgid "External media" #~ msgid "External media"
#~ msgstr "Média externe" #~ msgstr "Média externe"

View File

@ -1,134 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Dotclear 2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-04-15 16:27+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "%Y-%m-%d %H:%M"
msgstr ""
msgid "_Jan"
msgstr ""
msgid "_Feb"
msgstr ""
msgid "_Mar"
msgstr ""
msgid "_Apr"
msgstr ""
msgid "_May"
msgstr ""
msgid "_Jun"
msgstr ""
msgid "_Jul"
msgstr ""
msgid "_Aug"
msgstr ""
msgid "_Sep"
msgstr ""
msgid "_Oct"
msgstr ""
msgid "_Nov"
msgstr ""
msgid "_Dec"
msgstr ""
msgid "January"
msgstr ""
msgid "February"
msgstr ""
msgid "March"
msgstr ""
msgid "April"
msgstr ""
msgid "May"
msgstr ""
msgid "June"
msgstr ""
msgid "July"
msgstr ""
msgid "August"
msgstr ""
msgid "September"
msgstr ""
msgid "October"
msgstr ""
msgid "November"
msgstr ""
msgid "December"
msgstr ""
msgid "_Mon"
msgstr ""
msgid "_Tue"
msgstr ""
msgid "_Wed"
msgstr ""
msgid "_Thu"
msgstr ""
msgid "_Fri"
msgstr ""
msgid "_Sat"
msgstr ""
msgid "_Sun"
msgstr ""
msgid "Monday"
msgstr ""
msgid "Tuesday"
msgstr ""
msgid "Wednesday"
msgstr ""
msgid "Thursday"
msgstr ""
msgid "Friday"
msgstr ""
msgid "Saturday"
msgstr ""
msgid "Sunday"
msgstr ""

View File

@ -1,55 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
<title>Blowup theme configuration</title>
</head>
<body>
<p>Modifying Blowup theme configuration allows you to customize your theme very easily. To do so, simply fill in the configuration fields or choose a predefined style.</p>
<h3>Colors</h3>
<p>When you have to enter a color value, you should use the hexadecimal format. For example: "#FF0000" will give you red. You may also use the color picker located next to every color field.</p>
<p>If you lack inspiration, try and visit the following pages:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/List_of_colors">Color code list</a> (Wikipedia)</li>
<li><a href="http://kuler.adobe.com/">Adobe Kuler</a></li>
<li><a href="http://colorblender.com/">ColorBlender</a></li>
<li><a href="http://www.colorcombos.com/">ColorCombos</a></li>
</ul>
<h3>Measurement units</h3>
<p>When you have to indicate a size, it must be followed by a measurement unit. For example: "1em". If you do not include the unit, pixels will be used as default measurement unit.</p>
<p>The following measurement units are available:</p>
<ul>
<li>px</li>
<li>em</li>
<li>ex</li>
<li>pt</li>
<li>%</li>
</ul>
<h3>Header images</h3>
<p>You can choose a header image among the list to use in place of the default one.</p>
<p>When you choose "Custom..." in the image list, you will be able to upload your own image. <strong>The image file must be in JPG or PNG format and must be precisely 800px wide.</strong>
<p>If you upload a JPG image, a border will be added to the image, which is not the case with PNG images (the transparency of which will also be kept).</p>
<h3>Predefined styles</h3>
<p>You can choose a predefined style in the "Predefinite styles" drop-down list.
Once you have chosen the style, you have to submit the form to apply the modifications.</p>
<p>You may then modify the predefined style according to your taste and needs.</p>
<h3>Configuration import / export</h3>
<p>At the end of Blowup options, you can display an area names "Configuration import/export". This text area contains the configuration you are currently using. You can copy it to share it with others.</p>
<p>To apply (import) a configuration, you simply need to replace the content of the text area with the configuration you want to use. Don't forget to click on "apply code".</p>
</body>
</html>

View File

@ -1,148 +0,0 @@
<html>
<head>
<title>Blog settings</title>
</head>
<body>
<h3>Blog details</h3>
<dl>
<dt>Blog ID</dt>
<dd>Unique ID of the blog. Mandatory, can only be modified by a super administrator.</dd>
<dt>Blog name</dt>
<dd>Name of the blog, mandatory.</dd>
<dt>Blog URL</dt>
<dd>Complete blog URL. Mandatory, can only be modified by a super administrator.</dd>
<dt>Blog status</dt>
<dd>
<ul>
<li><strong>online</strong>: blog open to visitors</li>
<li><strong>offline</strong>: blog closed to visitors
but open to writers.</li>
<li><strong>removed</strong>: blog closed to both visitors and writers.</li>
</ul>
</dd>
<dt>Blog description</dt>
<dd>Here you can put any description you want for your blog. This is a
simple text, without formatting.</dd>
</dl>
<h3>Blog configuration</h3>
<dl>
<dt>Blog editor's name</dt>
<dd>Name of the person responsible for the blog. It may be the owner or the
publisher if he exists.</dd>
<dt>Copyright notice</dt>
<dd>Note about the reproduction rights for the blog.</dd>
<dt>Default language</dt>
<dd>Language of the blog interface. Either this language is among the avalaible ones,
and the interface will be translated, or it is not, and the interface will then
default to English.</dd>
<dt>Blog timezone</dt>
<dd>Defines the timezone that will be used for comments and trackbacks.</dd>
<dt>Date formats</dt>
<dd>The date format of the blog posts. See the date and time
format reference section below for further details.</dd>
<dt>Time format</dt>
<dd>The time format of the blog posts. See the date and time
format reference section below for further details.</dd>
<dt>Display .. entries per page</dt>
<dd>The number will be used as the limit for the number of entries
on the homepage, the first page of each category and the rss feeds.</dd>
<dt>Leave comments open for .. days</dt>
<dd>The number of days during wich comments and trackbacks will be open
after the post publication. When empty, the comments will be kept open
indefinitly.</dd>
<dt>Display smilies on entries and comments </dt>
<dd>Display sequences of characters as :-) or ;-) as images.</dd>
<dt>Accept comments</dt>
<dd>Globally accepts comments on the blog. Takes precedence over the
per post setting.</dd>
<dt>Accept trackbacks</dt>
<dd>Globally accepts trackbacks on the blog. Takes precedence over the
per post setting.</dd>
<dt>Moderate comments and trackbacks</dt>
<dd>With such an option, comments and trackbacks will be published after
editor agreement.</dd>
<dt>Add "nofollow" relation on comments and trackbacks links</dt>
<dd>Adds an attribut on the links in comments and trackbacks, instructing the
search bots not to follow those links. This antispam features has yet to
prove its value.</dd>
<dt>Wiki syntax for comments </dt>
<dd>Allows a subset of the wiki syntax to be used in comments.</dd>
</dl>
<h3>Format reference</h3>
<p>Some fields can be configured to format the date and time to your needs.
Here is a reference:</p>
<ul>
<li><strong>%a</strong>: abreviated week day (local).</li>
<li><strong>%A</strong>: complete week day (local).</li>
<li><strong>%b</strong>: abbreviated month name (local).</li>
<li><strong>%B</strong>: complete month name (local).</li>
<li><strong>%c</strong>: default local date and time display.</li>
<li><strong>%C</strong>: century (the year, divided by 100 and
round up beetween 00 and 99)</li>
<li><strong>%d</strong>: numeric month day (from 01 to 31)</li>
<li><strong>%D</strong>: identical to %m/%d/%y</li>
<li><strong>%e</strong>: numeric month day (from 1 to 31)</li>
<li><strong>%g</strong>: identical to %G, 2 digits.</li>
<li><strong>%G</strong>: The year on 4 digits, according to the week number
(cf. %V). Format and value identical to %Y, except that if the number of the
week belongs to the preceding or following year, the current year
will be used instead.</li>
<li><strong>%h</strong>: identical to %b</li>
<li><strong>%H</strong>: digital hour of the day, 24H mode
(from 00 to 23)</li>
<li><strong>%I</strong>: digital hour of the day, 12H mode
(from 01 to 12)</li>
<li><strong>%j</strong>: day of the year, digital (from 001 to 366)</li>
<li><strong>%m</strong>: month, digital (from 1 à 12)</li>
<li><strong>%M</strong>: minute, digital</li>
<li><strong>%n</strong>: newline character</li>
<li><strong>%p</strong>: either `am' or `pm', according to the absolute time,
or depending of the local settings.</li>
<li><strong>%r</strong>: the hour, a.m. and p.m. format</li>
<li><strong>%R</strong>: the hour, 24h format</li>
<li><strong>%S</strong>: seconds, digital</li>
<li><strong>%t</strong>: tab character</li>
<li><strong>%T</strong>: the current time (identical to %H:%M:%S)</li>
<li><strong>%u</strong>: day week, digit, from 1 to 7. (1 stands for monday)</li>
<li><strong>%U</strong>: week number, the first sundqy of the year being the
first day of the first week.</li>
<li><strong>%V</strong>: the week numpber as defined in ISO
8601:1988, digital, from 01 to 53. The week 1 is the first week
with more than 4 days in the current year, whose monday is the first day.
(Use %G or %g for the year elements corresponding to the number of the
week for the considered timestamp.)</li>
<li><strong>%W</strong>: number of the week in the year, the first monday of
the year being the start of the first week</li>
<li><strong>%w</strong>: day of the week, digital, 0 stands for sunday</li>
<li><strong>%x</strong>: prefered format for the date without the time</li>
<li><strong>%X</strong>: prefered format for the time without the date</li>
<li><strong>%y</strong>: the year, two digits (from 00 to 99)</li>
<li><strong>%Y</strong>: the year, four digits</li>
<li><strong>%Z ou %z</strong>: timezone, name or abbreviation</li>
<li><strong>%%</strong>: a litteral `%' character</li>
</ul>
</body>
</html>

View File

@ -1,41 +0,0 @@
<html>
<head>
<title>Categories</title>
</head>
<body>
<h3>Categories list</h3>
<dl>
<dt>Create a new category</dt>
<dd>Choose the name you wish to use for your new category
then click on Save to validate its creation. To modify it,
click on its name in the list.</dd>
<dt>Change category order</dt>
<dd>To change the category order, drag and drop the categories by using
the arrow shaped images then click on <strong>save order</strong>.
If you do not see the arrows, use the numbered fields
beside each category.</dd>
</dl>
<h3>Modifying a category</h3>
<dl>
<dt>Title</dt>
<dd>Choose the name you wish to give to your category
the click on Save to validate.</dd>
<dt>URL</dt>
<dd>DotClear creates a default url for the category, making it reachable
with a path similar to this one :
<strong>http://monblog.tld/category/My-category</strong>. You can click
on the small lock on the right to modify it according to your needs.</dd>
<dt>Description</dt>
<dd>What's inside the description field will be shown when selecting
one of the blog's categories. You can fill it with any kind of content
(paragraphs, lists, etc.) The format used for this field is HTML.</dd>
<!-- question : tous medias acceptés ? -->
</dl>
</body>
</html>

View File

@ -1,58 +0,0 @@
<html>
<head>
<title>Comments</title>
</head>
<body>
<h3>Filters for comment list</h3>
<dl>
<dt>Type:</dt>
<dd>None, comments or trackbacks.</dd>
<dt>Status:</dt>
<dd><ul>
<li><strong>junk</strong>: <!-- Pour spampl' ? --></li>
<li><strong>pending</strong>: <!-- Modération ? --></li>
<li><strong>unpublished</strong>: offline ;</li>
<li><strong>published</strong>: online.</li>
</ul></dd>
<dt>Order by:</dt>
<dd>Choose: date, entry title, author or status, then
choose the sort order.</dd>
<dt>Sort</dt>
<dd>Choose whether the list will be sorted in ascending or descending order.</dd>
<dt>Comment author.</dt>
<dd>The search is not case sensitive. If you want to search only a part of
the name, you can use the <strong>*</strong> generic character.</dd>
<dt>Comments per page :</dt>
<dd>Allows you to choose the number of comments on each page of this list.</dd>
</dl>
<h3>Modify or add a comment</h3>
<dl>
<dt>Author:</dt>
<dd>Author name. This field is mandatory.</dd>
<dt>Email:</dt>
<dd>Author's email address.</dd>
<dt>Web site:</dt>
<dd>URL of the comment author's blog or website.</dd>
<dt>Status:</dt>
<dd><ul>
<li><strong>junk</strong>: <!-- Pour spampl' ? --></li>
<li><strong>pending</strong>: <!-- Modération ? --></li>
<li><strong>unpublished</strong>: offline</li>
<li><strong>published</strong>: online</li>
</ul></dd>
<dt>Comment:</dt>
<dd>Comment's content. This field is html formated.</dd>
</dl>
</body>
</html>

View File

@ -1,89 +0,0 @@
<html>
<head>
<title>Media manager</title>
</head>
<body>
<h3>Media list</h3>
<p>The media manager's main page displays a list of available files (medias)
for the currently selected blog.</p>
<p>You can click the icons or names of the medias in the folder or any
subfolder to display them.</p>
<p>Selecting a MP3 sound file displays a player to immediately play
the file. The Flash plugin must be installed on your browser for
this player to operate.</p>
<p>The images are displayed with a thumbnail when possible.</p>
<h3>Add files</h3>
<dl>
<dt>Choose a file</dt>
<dd>Here you can select one of your local files to send it on your
blog. Should the file be bigger than the maximum size, it will not be sent.</dd>
<dt>Title</dt>
<dd>Optional title for the file you want to send.</dd>
<dt>Private</dt>
<dd>Check this if you want the file to be private, i.e. accessible only by
its owner and not accessible from the blog.</dd>
</dl>
<h3>New folder</h3>
<p>This form allows you to create an new subfolder in the currently displayed
folder. Just choose a name for it as you would do on your own computer.</p>
<h3>Media details</h3>
<p>This page displays a set of informations about the currently selected
file and allows you to perform a few operations.</p>
<dl>
<dt>File name</dt>
<dd>Change the file name of the current file.</dd>
<dt>File title</dt>
<dd>Give a title to the file, or change the current one.</dd>
<dt>File date</dt>
<dd>Change the file date.</dd>
<dt>Private</dt>
<dd>Specify that the file will be hidden to anyone but its owner in the media manager.</dd>
<dt>New directory</dt>
<dd>Allows you to move the file in another folder.</dd>
<dt>Change file</dt>
<dd>With this form, you can replace the file while keeping all the attributes
(name, title...). As always, you have to respect the maximum file size.</dd>
</dl>
<h3>A specific treatment for images</h3>
<p>When you add an image, depending of its size, up to four versions will be made available:</p>
<ul>
<li><strong>square</strong>: a 48x48 pixels square thumbnail,</li>
<li><strong>thumbnail</strong>: the image reduced to 100 pixels on its longest side.</li>
<li><strong>small</strong>: the longuest side is reduced to 240 pixels.</li>
<li><strong>medium</strong>: the longuest side is reduced to 500 pixels.</li>
<li><strong>originale</strong>: the original, unchanged image.</li>
</ul>
<h3>Add a file to an entry</h3>
<p>You can easily attach a file to one of your posts. First, create a new post
and save it. Then click on "Add files to this entry" to open the media manager.</p>
<p>Just click on the [+] icon (Attach this file to entry). The file will then
be attached to the post.</p>
<p>The attached files will be shown on the post page, as a list beside the post content.
The MP3 files will be made available through the Flash player, so that they can easily by read by visitors.</p>
<h3>Podcast and broadcasting of music files</h3>
<p>All attached files will be included in your RSS feeds, allowing for easy
podcasting of any type of file.</p>
</body>
</html>

View File

@ -1,125 +0,0 @@
<html>
<head>
<title>Editing an entry</title>
</head>
<body>
<h3>Editing an entry</h3>
<dl>
<dt>Entry title</dt>
<dd>Type in the entry title. This field is mandatory.</dd>
<dt>Excerpt</dt>
<dd>The content of this field will be shown in pages showing entries as
a list, such as the homepage or categories pages, followed by a "continue reading"
link. It will also be visible at the begining of the page showing the
whole post. Should you leave it blank, the <em>content</em> field will be shown
on the homepage and other entry list pages.</dd>
<dt>Content</dt>
<dd>The content of your entry. This field is mandatory.</dd>
<dt>Notes</dt>
<dd>This text area is for personal use, for notes or memos. What you enter here
will never be displayed on the blog..</dd>
<dt>Category</dt>
<dd>Your entry's category. To create a new category, please see the
"categories" section. You can choose to leave
you entry without a category by selecting the blank line.</dd>
<dt>Entry status</dt>
<dd>Allows you to choose your post's status:
<ul>
<li><strong>pending:</strong> the publication status has not yet been decided.</li>
<li><strong>scheduled:</strong> the post will be set online at the time and date
set in the <em>Published on</em> field.</li>
<li><strong>unpublished:</strong> the post is offline.</li>
<li><strong>published:</strong> the post is online.</li>
</ul>
</dd>
<dt>Published on</dt>
<dd>Here you can change the post's publication date and time. If the post's
status is <em>scheduled</em>, it will come online at the said date and time.</dd>
<dt>Text formating</dt>
<dd>To choose the post syntax. Wiki is a simplified syntax
and will be converted to valid xhtml&nbsp;; Unless you have a perfect
understanding of html, we advise you to choose the wiki syntax.
See the Wiki syntax reference for more information.</dd>
<dt>Accept comments</dt>
<dd>Select this box to allow your visitors to comment the entry. The corresponding
global setting is to be found in the blog settings.</dd>
<dt>Accept trackbacks</dt>
<dd>A trackback is a way to let a portion of your entry as a comment on
another blog. Select this box to allow others to trackback your entry. The
corresponding global setting is to be found in the blog settings.</dd>
<dt>Selected entry</dt>
<dd>The selected entries will be listed on your blog menu, under the title "Best
of me".</dd>
<dt>Entry password</dt>
<dd>You can enter a password for your entry. A password protected entry will
not be displayed on your blog, it will only be reachable to those you will
give the entry url (see the <em>view entry</em> link) and password.</dd>
<dt>Basename</dt>
<dd>By clicking on its lock, you can unprotect this field and and choose another
URL for your entry. If the URL you're trying to use is already used by another
entry, a number will be added to it.</dd>
<dt>Entry lang.</dt>
<dd>The two character language code of your entry. It defaults to your (as a
user) language but you can change it to whatever language code you want, ie.
"en" or "fr-qc". This code is used for the entry's display, no chack is made
on it.</dd>
<dt>Attachments</dt>
<dd>The attachments are all the medias you joined to the entry. The link <em>add
file to this entry</em> allows you to attach other files to the entry. Remember
to save your changes before clicking on this link. For further information,
see the media manager help.</dd>
</dl>
<h3>Comments</h3>
<dl>
<dt>Comment list</dt>
<dd>On the <em>Comments</em> tab, you can read and change the status of
your entry's comments. If you're allowed to by the blog administrator,
you will be able to set your comments online or offline, to delete them or
to mark them as junk.</dd>
<dt>Add a comment</dt>
<dd>On the <em>Add a comment</em> tab, you can reply to one of your entry's
comments without leaving your blog's backend. The syntax to be used here is
plain, unlimited, xhtml. Use the fields as if you were modifying a comment.</dd>
</dl>
<h3>Trackback</h3>
<p>To make a trackback, click on the <em>Ping blogs</em> link.
You will not see this link if your entry's status is not <em>published</em>.</p>
<dl>
<dt>URLs to ping</dt>
<dd>Paste here the trackback URLs you found in the posts you want to ping.</dd>
<dt>Send excerpt</dt>
<dd>This field defaults to your entry's first few sentences. That's wht will be
sent to the blog you're pinging, along with a link to your post. You can modify
the excerpt by editing this field.</dd>
<dt>Auto discover ping URLs</dt>
<dd>If your entries links specific posts and if the blog carrying those posts
is set to allow it, this tool will find the URLs to ping for you.</dd>
</dl>
</body>
</html>

View File

@ -1,65 +0,0 @@
<html>
<head>
<title>Managing entries</title>
</head>
<body>
<h3>Filters for the entry list</h3>
<dl>
<dt>Author</dt>
<dd>Allows you to filter by author.</dd>
<dt>Category</dt>
<dd>Filter by category.</dd>
<dt>Status</dt>
<dd><ul>
<li><strong>pending:</strong> posts whose publication status has not yet
been decided.</li>
<li><strong>scheduled:</strong> post to be set online automatically.</li>
<li><strong>unpublished:</strong> offline posts.</li>
<li><strong>published:</strong> online posts.</li>
</ul></dd>
<dt>Selected</dt>
<dd>Only the selected posts, or the non selected ones.</dd>
<dt>Month</dt>
<dd>Filter on a specific month and year.</dd>
<dt>Language</dt>
<dd>Filter on the different languages used on the blog.</dd>
<dt>Order by</dt>
<dd>Defines the list order, either on the date, the title, the author,
the status or the selected status.</dd>
<dt>Sort</dt>
<dd>Choose whether the list will be sorted in ascending or descending order.</dd>
<dt>Entries per page</dt>
<dd>Number of entries that will be displayed on each page of the resulting
set.</dd>
</dl>
<h3>Selected entry actions</h3>
<p>If your user permission level allows it, you can perform batch operations on the
entries you select in the list.</p>
<ul>
<li><strong>Publish</strong>: set the entries online.</li>
<li><strong>Unpublish</strong>: set the entries offline.</li>
<li><strong>Schedule</strong>: schedule the entries to be set online at their
publication date.</li>
<li><strong>Mark as pending</strong>: erase other publication status.</li>
<li><strong>Change category</strong>: directs you to the category list to choose a
new one for the entries.</li>
<li><strong>Change author</strong>: allows you to change the posts' author by
entering the new author's ID.</li>
<li><strong>Delete</strong>: suppress the posts (this operation cannot be undone).</li>
</ul>
</body>
</html>

View File

@ -1,61 +0,0 @@
<html>
<head>
<title>User preferences</title>
</head>
<body>
<h3>User preferences</h3>
<dl>
<dt>Name, First name</dt>
<dd>If the display name is empty, the author's name will be displayed
as his Firstname and Name as set here.</dd>
<dt>Display name</dt>
<dd>You can choose here how your name will be displayed under your posts.</dd>
<dt>Email</dt>
<dd>Address where will be sent the new comment notifications.</dd>
<dt>URL</dt>
<dd>The user's web site. If set, the author name will be displayed as
a link to the said site.</dd>
<dt>Preferred format</dt>
<dd>To choose the prefered post syntax. Wiki is a simplified syntax
and will be converted to valid xhtml&nbsp;; Unless you have a perfect
understanding of html, we advise you to choose the wiki syntax.</dd>
<dt>Default entry status</dt>
<dd>The default entry status can be set to:
<ul>
<li><strong>pending:</strong> the publication status has not yet been decided.</li>
<li><strong>scheduled:</strong> the post will be set online at the time and date
set in the <em>Published on</em> field.</li>
<li><strong>unpublished:</strong> the post is offline.</li>
<li><strong>published:</strong> the post is online.</li>
</ul>
</dd>
<dt>Entry edit field height</dt>
<dd>The height of the Entry edit field. Defaults to 24.</dd>
<dt>User language</dt>
<dd>The language in wich one publishes his posts. If the translation exists,
the interface will also be displayed in that language.</dd>
<dt>User timezone</dt>
<dd>That choice will define the time displayed on post publication.</dd>
<dt>Enable WYSIWYG mode</dt>
<dd>Allow the use of the WYSIWYG editor for the posts and description fields.</dd>
</dl>
<h3>Change your password</h3>
<p>To change your password, write down twice your password in the fields
<em>New password</em> and <em>Confirm password</em>. The minimal password
lenght is 6 characters.</p>
<p>If no new password is provided, the current one is kept.</p>
</body>
</html>

View File

@ -1,85 +0,0 @@
<html>
<head>
<title>Wiki syntax reference</title>
</head>
<body>
<h3>Wiki syntax reference</h3>
<p>The wiki syntax is a way to enhance your text with a minimal set
of tags, studied to cover the basic needs (titles, paragraphs, quotes,
lists...)</p>
<dl>
<dt>Block elements</dt>
<dd>
<ul>
<li>Leave an empty line between two similar blocks.</li>
<li><strong>Paragraph</strong>: free text, ended by an empty line if
another paragraph is to follow.</li>
<li><strong>Title</strong>: <code>!!! title</code>, <code>!! title</code>
or <code>! title</code>, allowing you to use three different levels of
heading.</li>
<li><strong>Horizontal line</strong>: <code>----</code></li>
<li><strong>Lists</strong>: Start each line with
<code>*</code> or <code>#</code> for unnumbered or numbered lists respectively.
List imbrication is done by mixing list markers this way:
<pre>
* item 1
** item 1.1
* item 2
*# item 2.1
...
</pre>
</li>
<li><strong>Preformatted text</strong>: each line must start with a space.</li>
<li><strong>Block quote</strong>: each line must start with a semicolon (<code>&gt;</code>).</li>
</ul>
</dd>
<dt>Formatting tags</dt>
<dd>
<ul>
<li><strong>Emphasis</strong>: two quotes <code>''text''</code></li>
<li><strong>Strong emphasis</strong>: two underscore <code>__text__</code></li>
<li><strong>New line</strong>: <code>%%%</code></li>
<li><strong>Insertion</strong>: two plusses <code>++text++</code></li>
<li><strong>Deletion</strong>: two minuses <code>--text--</code></li>
<li><strong>Link</strong>: <code>[url]</code>, <code>[name|url]</code>,
<code>[name|url|language]</code> or <code>[name|url|languagee|title]</code></li>
<li><strong>Image</strong>:
<code>((url|alternative text))</code>,
<code>((url|alternative text|position))</code> or
<code>((url|alternative text|position|long description))</code>.
<br />The position can be either L or G (left), R or D (right) or C (centered).</li>
<li><strong>Anchor</strong>: <code>~anchor~</code></li>
<li><strong>Acronym</strong>: <code>??acronym|title??</code></li>
<li><strong>Inline HTML</strong>: two backquotes <code>``html code``</code></li>
<li><strong>Inline quote</strong>: <code>{{quote}}</code>,
<code>{{quote|language}}</code> or <code>{{quote|language|url}}</code></li>
<li><strong>Code</strong>: <code>@@code@@</code></li>
<li><strong>Footnotes</strong>: <code>$$footnote$$</code></li>
</ul>
</dd>
<dt>Unformatted text</dt>
<dd>If you don't want one formatting character to be interpreted as such, add a
<code>\</code> just before it. This way:
<code>\[text in brackets without being a link\]</code>
</dd>
<dt>HTML Code</dt>
<dd>Even if you chose the wiki syntax, you may sometimes need a more
powerful formatting, i.e. HTML syntax. Do it the following way:
<pre>
///html
&lt;p style="color:red"&gt;my text in red&lt;/p&gt;
///
</pre>
</dd>
</dl>
</body>
</html>

View File

@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
<title>Theme Editor</title>
</head>
<body>
<p>The Theme Editor lets you modify the template files, the stylesheets and the JavaScript files of the theme you are currently using..</p>
<p>The file list is divided in three sections&nbsp;:</p>
<ul>
<li>Template files : the templates</li>
<li>CSS files : the stylesheets</li>
<li>JavaScript files</li>
</ul>
<p>The yellow bullet in front of the name of a file indicates that this file is part of the theme. The red bullet means it is a part of the parent theme. The black bullet means it is a part of the "default" theme.</p>
<p>If you modify a file belonging to the "default" theme, it will be copied into the theme you are currently using.</p>
<p>To edit a file, click on its name to display its content in the edition area. If the file can be written, you will be able to save your modifications by ckicking on "save".</p>
<p>The modifications are applied immediately after saving, so be careful.</p>
<p>To help modify your templates, you may consult the <a href="http://doc.dotclear.net/2.0/resources/templates">template tag list</a>.</p>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,240 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# This file is put in the public domain.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Dotclear 2\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2008-10-13 05:22+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
# Not found strings
msgid "To content"
msgstr ""
msgid "To menu"
msgstr ""
msgid "To search"
msgstr ""
msgid "By"
msgstr ""
msgid "by"
msgstr ""
msgid "on"
msgstr ""
msgid "On"
msgstr ""
msgid "Continue reading"
msgstr ""
msgid "no comment"
msgstr ""
msgid "one comment"
msgstr ""
msgid "%d comments"
msgstr ""
msgid "no trackback"
msgstr ""
msgid "one trackback"
msgstr ""
msgid "%d trackbacks"
msgstr ""
msgid "no attachment"
msgstr ""
msgid "one attachment"
msgstr ""
msgid "%d attachments"
msgstr ""
msgid "previous entries"
msgstr ""
msgid "page"
msgstr ""
msgid "of"
msgstr ""
msgid "next entries"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your search for <em>%1$s</em> returned no result."
msgstr ""
msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> result."
msgstr ""
msgid "Your search for <em>%1$s</em> returned <strong>%2$s</strong> results."
msgstr ""
msgid "Home"
msgstr ""
msgid "All keywords"
msgstr ""
msgid "Best of me"
msgstr ""
msgid "Languages"
msgstr ""
msgid "Categories"
msgstr ""
msgid "Subcategories"
msgstr ""
msgid "Archives"
msgstr ""
msgid "Links"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "Entries feed"
msgstr ""
msgid "Comments feed"
msgstr ""
msgid "This blog's comments Atom feed"
msgstr ""
msgid "This category's entries Atom feed"
msgstr ""
msgid "This category's comments Atom feed"
msgstr ""
msgid "This post's comments feed"
msgstr ""
msgid "This post's comments Atom feed"
msgstr ""
msgid "Attachments"
msgstr ""
msgid "Permalink"
msgstr ""
msgid "Comments"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Your comment has been published."
msgstr ""
msgid "Your comment has been submitted and will be reviewed for publication."
msgstr ""
msgid "Add a comment"
msgstr ""
msgid "Name or nickname"
msgstr ""
msgid "Email address"
msgstr ""
msgid "Website"
msgstr ""
msgid "optional"
msgstr ""
msgid "Comment"
msgstr ""
msgid "HTML code is displayed as text and web addresses are automatically converted."
msgstr ""
msgid "Remember me on this blog"
msgstr ""
msgid "preview"
msgstr ""
msgid "send"
msgstr ""
msgid "They posted on the same topic"
msgstr ""
msgid "Trackback URL"
msgstr ""
msgid "You must provide an author name"
msgstr ""
msgid "You must provide a comment"
msgstr ""
msgid "Email address is not valid"
msgstr ""
msgid "Document not found"
msgstr ""
msgid "The document you are looking for does not exist."
msgstr ""
msgid "Powered by %s"
msgstr ""
msgid "Subscribe to"
msgstr ""
msgid "What is an RSS feed?"
msgstr ""
msgid "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 <a href=\"http://en.wikipedia.org/wiki/Aggregator\">aggregator</a>."
msgstr ""
msgid "Simply copy the following URL into your aggregator:"
msgstr ""
msgid "Password needed"
msgstr ""
msgid "You must give a password to access this area."
msgstr ""
msgid "Password:"
msgstr ""
msgid "You must provide a valid email address."
msgstr ""
msgid "Read"
msgstr ""

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More