From 80020dd7564f25f4af5d994df5690b1088456b41 Mon Sep 17 00:00:00 2001 From: rvelices Date: Thu, 25 Jan 2007 02:18:56 +0000 Subject: - user profiles available from admin page - user creation from admin page with email (bug 514) - some language cleanup - small template enhancements - php syntax corrections (my mistake) git-svn-id: http://piwigo.org/svn/trunk@1753 68402e56-0260-453c-a942-63ccdbb3a9ee --- admin/profile.php | 46 ++++++ admin/user_list.php | 28 +--- include/template.php | 19 ++- language/en_UK.iso-8859-1/admin.lang.php | 5 - language/fr_FR.iso-8859-1/admin.lang.php | 5 - profile.php | 258 +++++++++++++++++-------------- register.php | 6 +- template/yoga/admin/profile.tpl | 5 + template/yoga/admin/user_list.tpl | 30 ++-- template/yoga/icon/edit_s.png | Bin 0 -> 585 bytes template/yoga/profile.tpl | 112 +------------- template/yoga/profile_content.tpl | 113 ++++++++++++++ 12 files changed, 347 insertions(+), 280 deletions(-) create mode 100644 admin/profile.php create mode 100644 template/yoga/admin/profile.tpl create mode 100644 template/yoga/icon/edit_s.png create mode 100644 template/yoga/profile_content.tpl diff --git a/admin/profile.php b/admin/profile.php new file mode 100644 index 000000000..0cf36e42c --- /dev/null +++ b/admin/profile.php @@ -0,0 +1,46 @@ +set_filename('profile', 'admin/profile.tpl'); +$template->assign_var_from_handle('ADMIN_CONTENT', 'profile'); +?> diff --git a/admin/user_list.php b/admin/user_list.php index 69d46e6d2..84efc057f 100644 --- a/admin/user_list.php +++ b/admin/user_list.php @@ -193,7 +193,8 @@ $page['direction_items'] = array( if (isset($_POST['submit_add'])) { - $page['errors'] = register_user($_POST['login'], $_POST['password'], ''); + $page['errors'] = register_user( + $_POST['login'], $_POST['password'], $_POST['email']); if (count($page['errors']) == 0) { @@ -455,25 +456,6 @@ else $template->assign_vars( array( - 'L_AUTH_USER'=>$lang['permuser_only_private'], - 'L_GROUP_ADD_USER' => $lang['group_add_user'], - 'L_STATUS'=>$lang['user_status'], - 'L_ORDER_BY' => $lang['order_by'], - 'L_ACTIONS' => $lang['actions'], - 'L_PROPERTIES' => $lang['properties'], - 'L_PERMISSIONS' => $lang['permissions'], - 'L_USERS_LIST' => $lang['title_liste_users'], - 'L_NB_IMAGE_LINE' => $lang['nb_image_per_row'], - 'L_NB_LINE_PAGE' => $lang['nb_row_per_page'], - 'L_TEMPLATE' => $lang['theme'], - 'L_RECENT_PERIOD' => $lang['recent_period'], - 'L_EXPAND' => $lang['auto_expand'], - 'L_SHOW_NB_COMMENTS' => $lang['show_nb_comments'], - 'L_MAXWIDTH' => $lang['maxwidth'], - 'L_MAXHEIGHT' => $lang['maxheight'], - 'L_DELETE' => $lang['user_delete'], - 'L_DELETE_HINT' => $lang['user_delete_hint'], - 'U_HELP' => PHPWG_ROOT_PATH.'popuphelp.php?page=user_list', 'F_ADD_ACTION' => $base_url, @@ -773,8 +755,8 @@ $template->assign_vars(array('NAVBAR' => $navbar)); // | user list | // +-----------------------------------------------------------------------+ -$profile_url = PHPWG_ROOT_PATH.'admin.php?page=profile&user_id='; -$perm_url = PHPWG_ROOT_PATH.'admin.php?page=user_perm&user_id='; +$profile_url = get_root_url().'admin.php?page=profile&user_id='; +$perm_url = get_root_url().'admin.php?page=user_perm&user_id='; foreach ($page['filtered_users'] as $num => $local_user) { @@ -814,7 +796,7 @@ foreach ($page['filtered_users'] as $num => $local_user) 'CLASS' => ($num % 2 == 1) ? 'row2' : 'row1', 'ID' => $local_user['id'], 'CHECKED' => $checked, - 'U_MOD' => $profile_url.$local_user['id'], + 'U_PROFILE' => $profile_url.$local_user['id'], 'U_PERM' => $perm_url.$local_user['id'], 'USERNAME' => $local_user['username'], 'STATUS' => $lang['user_status_'.$local_user['status']].(($local_user['adviser'] == 'true') ? ' ['.$lang['adviser'].']' : ''), diff --git a/include/template.php b/include/template.php index 276464a22..d5e296edd 100644 --- a/include/template.php +++ b/include/template.php @@ -101,6 +101,14 @@ class Template { return true; } + /** + * Sets the template filename for handle. + */ + function set_filename($handle, $filename) + { + return $this->set_filenames( array($handle=>$filename) ); + } + /** * Sets the template filenames for handles. $filename_array should be a * hash of handle => filename pairs. @@ -115,7 +123,16 @@ class Template { reset($filename_array); while(list($handle, $filename) = each($filename_array)) { - $this->files[$handle] = $this->make_filename($filename); + if (is_null($filename)) + { + unset( $this->files[$handle] ); + } + else + { + $this->files[$handle] = $this->make_filename($filename); + } + unset($this->compiled_code[$handle]); + unset($this->uncompiled_code[$handle]); } return true; diff --git a/language/en_UK.iso-8859-1/admin.lang.php b/language/en_UK.iso-8859-1/admin.lang.php index 918812495..c60681709 100644 --- a/language/en_UK.iso-8859-1/admin.lang.php +++ b/language/en_UK.iso-8859-1/admin.lang.php @@ -251,7 +251,6 @@ $lang['group "%s" updated'] = 'group "%s" updated'; $lang['group'] = 'group'; $lang['group_add_error1'] = 'The name of a group must not contain " or \' or be empty.'; $lang['group_add_error2'] = 'This name is already used by another group.'; -$lang['group_add_user']= 'Add user'; $lang['group_id URL parameter is missing'] = 'group_id URL parameter is missing'; $lang['groups'] = 'Groups'; $lang['history'] = 'History'; @@ -336,11 +335,9 @@ $lang['nbm_user_not_change_enabled_true'] = 'User %s [%s] not added to the subsc $lang['nbm_user_x_added'] = 'User %s [%s] added.'; $lang['nbm_warning_subscribe_unsubcribe'] = 'Warning: subscribing or unsubcribing will send mails to users'; $lang['no_write_access'] = 'no write access'; -$lang['order_by'] = 'order by'; $lang['path'] = 'path'; $lang['permissions'] = 'Permissions'; $lang['permuser_info'] = 'Only private categories are listed. Private/Public category status can be set in screen "Categories > Public / Private"'; -$lang['permuser_only_private'] = 'Only private categories are shown'; $lang['private'] = 'private'; $lang['properties'] = 'Properties'; $lang['public'] = 'public'; @@ -478,8 +475,6 @@ $lang['update_wrong_dirname_info'] = 'The name of directories and files must be $lang['update_wrong_dirname_short'] = 'wrong filename'; $lang['upload'] = 'Upload'; $lang['user "%s" added'] = 'user "%s" added'; -$lang['user_delete'] = 'Delete user'; -$lang['user_delete_hint'] = 'Click here to delete this user. Warning! This operation cannot be undone!'; $lang['user_id URL parameter is missing'] = 'user_id URL parameter is missing'; $lang['user_status'] = 'User status'; $lang['user_status_admin'] = 'Administrator'; diff --git a/language/fr_FR.iso-8859-1/admin.lang.php b/language/fr_FR.iso-8859-1/admin.lang.php index f378ffceb..70abaac55 100644 --- a/language/fr_FR.iso-8859-1/admin.lang.php +++ b/language/fr_FR.iso-8859-1/admin.lang.php @@ -251,7 +251,6 @@ $lang['group "%s" updated'] = 'groupe "%s" mis $lang['group'] = 'groupe'; $lang['group_add_error1'] = 'Le nom du groupe ne doit pas contenir " or \' et ne doit pas être vide.'; $lang['group_add_error2'] = 'Ce nom est déjà utilisé par un autre groupe.'; -$lang['group_add_user']= 'Ajouter un utilisateur'; $lang['group_id URL parameter is missing'] = 'Le paramètre d\'URL "group_id" est manquant'; $lang['groups'] = 'Groupes'; $lang['history'] = 'Historique'; @@ -336,11 +335,9 @@ $lang['nbm_user_not_change_enabled_true'] = 'L\'utilisateur %s [%s] n\'a pas $lang['nbm_user_x_added'] = 'Utilisateur %s [%s] ajouté.'; $lang['nbm_warning_subscribe_unsubcribe'] = 'Attention, l\'inscription ou la désincription entraine l\'envoi de mails aux utilisateurs concernés'; $lang['no_write_access'] = 'pas d\'accès en écriture'; -$lang['order_by'] = 'trier selon'; $lang['path'] = 'chemin'; $lang['permissions'] = 'Permissions'; $lang['permuser_info'] = 'Seules les catégories privées sont listées.'; -$lang['permuser_only_private'] = 'Seules les catégories privées sont listées.'; $lang['private'] = 'privée'; $lang['properties'] = 'Propriétés'; $lang['public'] = 'publique'; @@ -478,8 +475,6 @@ $lang['update_wrong_dirname_info'] = 'Le nom des r $lang['update_wrong_dirname_short'] = 'nom de fichier erroné'; $lang['upload'] = 'Ajout'; $lang['user "%s" added'] = 'utilisateur "%s" ajouté'; -$lang['user_delete'] = 'Supprimer utilisateur'; -$lang['user_delete_hint'] = 'Cliquer ici pour supprimer cet utilisateur. Attention : cette opération ne peut pas être annulée !'; $lang['user_id URL parameter is missing'] = 'le paramètre d\'URL "user_id" manque'; $lang['user_status'] = 'Statut de l\'utilisateur'; $lang['user_status_admin'] = 'Administrateur'; diff --git a/profile.php b/profile.php index 5284dbe78..df2d46ae3 100644 --- a/profile.php +++ b/profile.php @@ -30,56 +30,94 @@ // | initialization | // +-----------------------------------------------------------------------+ -define('PHPWG_ROOT_PATH','./'); -include_once(PHPWG_ROOT_PATH.'include/common.inc.php'); +if (!defined('PHPWG_ROOT_PATH')) +{//direct script access + define('PHPWG_ROOT_PATH','./'); + include_once(PHPWG_ROOT_PATH.'include/common.inc.php'); -// +-----------------------------------------------------------------------+ -// | Check Access and exit when user status is not ok | -// +-----------------------------------------------------------------------+ -check_status(ACCESS_CLASSIC); + // +-----------------------------------------------------------------------+ + // | Check Access and exit when user status is not ok | + // +-----------------------------------------------------------------------+ + check_status(ACCESS_CLASSIC); + + $userdata = $user; + + save_profile_from_post($userdata, $errors); -$userdata = $user; + $title= $lang['customize_page_title']; + $page['body_id'] = 'theProfilePage'; + include(PHPWG_ROOT_PATH.'include/page_header.php'); + + load_profile_in_template( + get_root_url().'profile.php', // action + make_index_url(), // for redirect + $userdata ); + + $template->assign_var('U_RETURN', make_index_url() ); + + // +-----------------------------------------------------------------------+ + // | errors display | + // +-----------------------------------------------------------------------+ + if (count($errors) != 0) + { + $template->assign_block_vars('errors',array()); + foreach ($errors as $error) + { + $template->assign_block_vars('errors.error', array('ERROR'=>$error)); + } + } + $template->set_filename('profile', 'profile.tpl'); + $template->parse('profile'); + include(PHPWG_ROOT_PATH.'include/page_tail.php'); +} //------------------------------------------------------ update & customization -$errors = array(); -if (isset($_POST['validate'])) +function save_profile_from_post(&$userdata, &$errors) { + global $conf; + $errors = array(); + + if (!isset($_POST['validate'])) + { + return; + } + $int_pattern = '/^\d+$/'; if (empty($_POST['nb_image_line']) or (!preg_match($int_pattern, $_POST['nb_image_line']))) { - array_push($errors, $lang['nb_image_line_error']); + $errors[] = l10n('nb_image_line_error'); } if (empty($_POST['nb_line_page']) or (!preg_match($int_pattern, $_POST['nb_line_page']))) { - array_push($errors, $lang['nb_line_page_error']); + $errors[] = l10n('nb_line_page_error'); } if ($_POST['maxwidth'] != '' and (!preg_match($int_pattern, $_POST['maxwidth']) or $_POST['maxwidth'] < 50)) { - array_push($errors, $lang['maxwidth_error']); + $errors[] = l10n('maxwidth_error'); } if ($_POST['maxheight'] and (!preg_match($int_pattern, $_POST['maxheight']) or $_POST['maxheight'] < 50)) { - array_push($errors, $lang['maxheight_error']); + $errors[] = l10n('maxheight_error'); } // periods must be integer values, they represents number of days if (!preg_match($int_pattern, $_POST['recent_period']) or $_POST['recent_period'] <= 0) { - array_push($errors, $lang['periods_error']); + $errors[] = l10n('periods_error') ; } $mail_error = validate_mail_address($_POST['mail_address']); if (!empty($mail_error)) { - array_push($errors, $mail_error); + $errors[] = $mail_error; } if (!empty($_POST['use_new_pwd'])) @@ -87,21 +125,22 @@ if (isset($_POST['validate'])) // password must be the same as its confirmation if ($_POST['use_new_pwd'] != $_POST['passwordConf']) { - array_push($errors, - l10n('New password confirmation does not correspond')); + $errors[] = l10n('New password confirmation does not correspond'); } - // changing password requires old password - $query = ' -SELECT '.$conf['user_fields']['password'].' AS password - FROM '.USERS_TABLE.' - WHERE '.$conf['user_fields']['id'].' = \''.$userdata['id'].'\' -;'; - list($current_password) = mysql_fetch_row(pwg_query($query)); - - if ($conf['pass_convert']($_POST['password']) != $current_password) - { - array_push($errors, l10n('Current password is wrong')); + if ( !defined('IN_ADMIN') ) + {// changing password requires old password + $query = ' + SELECT '.$conf['user_fields']['password'].' AS password + FROM '.USERS_TABLE.' + WHERE '.$conf['user_fields']['id'].' = \''.$userdata['id'].'\' + ;'; + list($current_password) = mysql_fetch_row(pwg_query($query)); + + if ($conf['pass_convert']($_POST['password']) != $current_password) + { + $errors[] = l10n('Current password is wrong'); + } } } @@ -151,113 +190,96 @@ SELECT '.$conf['user_fields']['password'].' AS password array($data)); // redirection - redirect(make_index_url()); + redirect($_POST['redirect']); } } -// +-----------------------------------------------------------------------+ -// | page header and options | -// +-----------------------------------------------------------------------+ - -$title= $lang['customize_page_title']; -$page['body_id'] = 'theProfilePage'; -include(PHPWG_ROOT_PATH.'include/page_header.php'); - -$url_action = PHPWG_ROOT_PATH.'profile.php'; - -//----------------------------------------------------- template initialization -$template->set_filenames(array('profile_body'=>'profile.tpl')); -$expand = ($userdata['expand'] == 'true') ? 'EXPAND_TREE_YES':'EXPAND_TREE_NO'; -$nb_comments = -($userdata['show_nb_comments'] == 'true') ? 'NB_COMMENTS_YES':'NB_COMMENTS_NO'; - -$template->assign_vars( - array( - 'USERNAME'=>$userdata['username'], - 'USERID'=>$userdata['id'], - 'EMAIL'=>@$userdata['email'], - 'NB_IMAGE_LINE'=>$userdata['nb_image_line'], - 'NB_ROW_PAGE'=>$userdata['nb_line_page'], - 'RECENT_PERIOD'=>$userdata['recent_period'], - 'MAXWIDTH'=>@$userdata['maxwidth'], - 'MAXHEIGHT'=>@$userdata['maxheight'], - - $expand=>'checked="checked"', - $nb_comments=>'checked="checked"', +function load_profile_in_template($url_action, $url_redirect, $userdata) +{ + global $template; - 'U_RETURN' => make_index_url(), + $template->set_filename('profile_content', 'profile_content.tpl'); - 'F_ACTION'=>$url_action, - )); + $expand = ($userdata['expand'] == 'true') ? 'EXPAND_TREE_YES':'EXPAND_TREE_NO'; -$blockname = 'template_option'; + $nb_comments = + ($userdata['show_nb_comments'] == 'true') ? 'NB_COMMENTS_YES':'NB_COMMENTS_NO'; -foreach (get_pwg_themes() as $pwg_template) -{ - if (isset($_POST['submit'])) - { - $selected = $_POST['template']==$pwg_template ? 'selected="selected"' : ''; - } - else if ($userdata['template'].'/'.$userdata['theme'] == $pwg_template) - { - $selected = 'selected="selected"'; - } - else - { - $selected = ''; - } - - $template->assign_block_vars( - $blockname, + $template->assign_vars( array( - 'VALUE'=> $pwg_template, - 'CONTENT' => $pwg_template, - 'SELECTED' => $selected + 'USERNAME'=>$userdata['username'], + 'USERID'=>$userdata['id'], + 'EMAIL'=>@$userdata['email'], + 'NB_IMAGE_LINE'=>$userdata['nb_image_line'], + 'NB_ROW_PAGE'=>$userdata['nb_line_page'], + 'RECENT_PERIOD'=>$userdata['recent_period'], + 'MAXWIDTH'=>@$userdata['maxwidth'], + 'MAXHEIGHT'=>@$userdata['maxheight'], + + $expand=>'checked="checked"', + $nb_comments=>'checked="checked"', + + 'REDIRECT' => $url_redirect, + + 'F_ACTION'=>$url_action, )); -} -$blockname = 'language_option'; + $blockname = 'template_option'; -foreach (get_languages() as $language_code => $language_name) -{ - if (isset($_POST['submit'])) - { - $selected = $_POST['language']==$language_code ? 'selected="selected"':''; - } - else if ($userdata['language'] == $language_code) - { - $selected = 'selected="selected"'; - } - else + foreach (get_pwg_themes() as $pwg_template) { - $selected = ''; + if (isset($_POST['submit'])) + { + $selected = $_POST['template']==$pwg_template ? 'selected="selected"' : ''; + } + else if ($userdata['template'].'/'.$userdata['theme'] == $pwg_template) + { + $selected = 'selected="selected"'; + } + else + { + $selected = ''; + } + + $template->assign_block_vars( + $blockname, + array( + 'VALUE'=> $pwg_template, + 'CONTENT' => $pwg_template, + 'SELECTED' => $selected + )); } - $template->assign_block_vars( - $blockname, - array( - 'VALUE'=> $language_code, - 'CONTENT' => $language_name, - 'SELECTED' => $selected - )); -} + $blockname = 'language_option'; -// +-----------------------------------------------------------------------+ -// | errors display | -// +-----------------------------------------------------------------------+ -if (count($errors) != 0) -{ - $template->assign_block_vars('errors',array()); - foreach ($errors as $error) + foreach (get_languages() as $language_code => $language_name) { - $template->assign_block_vars('errors.error', array('ERROR'=>$error)); + if (isset($_POST['submit'])) + { + $selected = $_POST['language']==$language_code ? 'selected="selected"':''; + } + else if ($userdata['language'] == $language_code) + { + $selected = 'selected="selected"'; + } + else + { + $selected = ''; + } + + $template->assign_block_vars( + $blockname, + array( + 'VALUE'=> $language_code, + 'CONTENT' => $language_name, + 'SELECTED' => $selected + )); } + if ( !defined('IN_ADMIN') ) + { + $template->assign_block_vars( 'not_admin', array() ); + } + $template->assign_var_from_handle('PROFILE_CONTENT', 'profile_content'); } -// +-----------------------------------------------------------------------+ -// | html code display | -// +-----------------------------------------------------------------------+ -$template->assign_block_vars('profile',array()); -$template->parse('profile_body'); -include(PHPWG_ROOT_PATH.'include/page_tail.php'); ?> diff --git a/register.php b/register.php index aeb98fbd9..0218119fa 100644 --- a/register.php +++ b/register.php @@ -2,10 +2,10 @@ // +-----------------------------------------------------------------------+ // | PhpWebGallery - a PHP based picture gallery | // | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net | -// | Copyright (C) 2003-2005 PhpWebGallery Team - http://phpwebgallery.net | +// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net | // +-----------------------------------------------------------------------+ // | branch : BSF (Best So Far) -// | file : $RCSfile$ +// | file : $Id$ // | last update : $Date$ // | last modifier : $Author$ // | revision : $Revision$ @@ -60,7 +60,7 @@ if (isset($_POST['submit'])) { include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php'); $username = $_POST['login']; - $admin_url = get_absolute_root_url(). + $admin_url = get_absolute_root_url() .'admin.php?page=user_list&username='.$username; $content = diff --git a/template/yoga/admin/profile.tpl b/template/yoga/admin/profile.tpl new file mode 100644 index 000000000..5de3efd5a --- /dev/null +++ b/template/yoga/admin/profile.tpl @@ -0,0 +1,5 @@ +
+

{lang:Profile}

+
+ +{PROFILE_CONTENT} diff --git a/template/yoga/admin/user_list.tpl b/template/yoga/admin/user_list.tpl index fc7c26a04..08b981882 100644 --- a/template/yoga/admin/user_list.tpl +++ b/template/yoga/admin/user_list.tpl @@ -10,6 +10,7 @@ {lang:Add a user} + @@ -69,11 +70,11 @@   {lang:Username} - {L_STATUS} + {lang:user_status} {lang:Email address} {lang:Groups} - {L_PROPERTIES} - {L_ACTIONS} + {lang:properties} + {lang:actions} @@ -84,7 +85,8 @@ {user.GROUPS} {user.PROPERTIES} - {L_PERMISSIONS} + {lang:permissions} + {lang:Profile} @@ -104,7 +106,7 @@ - +
{L_STATUS}{lang:Status} @@ -165,7 +167,7 @@
- {L_PROPERTIES} + {lang:properties} @@ -190,7 +192,7 @@
- + - + - + - + - + - + - + - +
{L_NB_IMAGE_LINE}{lang:nb_image_per_row} @@ -200,7 +202,7 @@
{L_NB_LINE_PAGE}{lang:nb_row_per_page} @@ -210,7 +212,7 @@
{L_TEMPLATE}{lang:theme} @@ -236,7 +238,7 @@
{L_RECENT_PERIOD}{lang:recent_period} @@ -246,7 +248,7 @@
{L_EXPAND}{lang:auto_expand} / {lang:set to} @@ -256,7 +258,7 @@
{L_SHOW_NB_COMMENTS}{lang:show_nb_comments} / {lang:set to} @@ -266,7 +268,7 @@
{L_MAXWIDTH}{lang:maxwidth} @@ -278,7 +280,7 @@
{L_MAXHEIGHT}{lang:maxheight} diff --git a/template/yoga/icon/edit_s.png b/template/yoga/icon/edit_s.png new file mode 100644 index 000000000..e4951d22f Binary files /dev/null and b/template/yoga/icon/edit_s.png differ diff --git a/template/yoga/profile.tpl b/template/yoga/profile.tpl index 1b2037d71..f48a711c1 100644 --- a/template/yoga/profile.tpl +++ b/template/yoga/profile.tpl @@ -17,115 +17,5 @@

{lang:Profile}

-
- -
- {lang:register_title} - -
    -
  • - {lang:Username} - {USERNAME} -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
-
- -
- {lang:preferences} - -
    -
  • - - - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
  • - {lang:auto_expand} - - -
  • -
  • - {lang:show_nb_comments} - - -
  • -
  • - - - - -
  • -
  • - - - - -
  • -
-
- -

- - -

- -
- +{PROFILE_CONTENT} diff --git a/template/yoga/profile_content.tpl b/template/yoga/profile_content.tpl new file mode 100644 index 000000000..e738e59c6 --- /dev/null +++ b/template/yoga/profile_content.tpl @@ -0,0 +1,113 @@ +
+ +
+ {lang:register_title} + + +
    +
  • + {lang:Username} + {USERNAME} +
  • +
  • + + + + +
  • + +
  • + + + + +
  • + +
  • + + + + +
  • +
  • + + + + +
  • +
+
+ +
+ {lang:preferences} + +
    +
  • + + + + +
  • +
  • + + + + +
  • +
  • + + + + +
  • +
  • + + + + +
  • +
  • + + + + +
  • +
  • + {lang:auto_expand} + + +
  • +
  • + {lang:show_nb_comments} + + +
  • +
  • + + + + +
  • +
  • + + + + +
  • +
+
+ +

+ + +

+ +
-- cgit v1.2.3