mirror of
https://github.com/Piwigo/Piwigo.git
synced 2026-07-21 00:53:04 +02:00
issue #1265 user manager new design by @GitBluub and @MatthieuLP
Because we had a ghost page user_list_new, I didn't simply merged the feature branch, but I reproduced the new code in a single commit on master.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
+2278
-1190
File diff suppressed because it is too large
Load Diff
@@ -1925,6 +1925,8 @@ h2:lang(en) { text-transform:capitalize; }
|
||||
.infos .submit {margin-left:30px;}
|
||||
|
||||
.checkActions {text-align:left;padding:0;margin:0;}
|
||||
#user-table-content #checkActions {margin:0; display:flex; flex-wrap:wrap; align-items:center;}
|
||||
#user-table-content #checkActions a {padding:10px; margin: 0 4px};
|
||||
#checkActions {text-align:left; margin:0 0 20px 0;}
|
||||
.ActionUserList #checkActions {margin: 20px 0 20px 0;}
|
||||
|
||||
@@ -2688,20 +2690,27 @@ a#showPermissions:hover {text-decoration: none;}
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.user-list-checkbox .select-checkbox,
|
||||
.tag-container .tag-box .select-checkbox {
|
||||
display: none;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
border-radius: 100%;
|
||||
margin: 2px 0px;
|
||||
/* margin: 2px 0px; */
|
||||
margin-left: 3.4px;
|
||||
border: solid #ffa646 2px;
|
||||
}
|
||||
|
||||
.user-list-checkbox .select-checkbox {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.tag-container.selection .tag-box .select-checkbox {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.user-list-checkbox:hover .select-checkbox,
|
||||
.user-list-checkbox[data-selected='1'] .select-checkbox,
|
||||
.tag-container .tag-box:hover .select-checkbox,
|
||||
.tag-container .tag-box[data-selected='1'] .select-checkbox {
|
||||
background-color: #ffa646;
|
||||
@@ -2711,6 +2720,7 @@ a#showPermissions:hover {text-decoration: none;}
|
||||
display: block;
|
||||
}
|
||||
|
||||
.user-list-checkbox .select-checkbox i,
|
||||
.tag-container .tag-box .select-checkbox i {
|
||||
display: none;
|
||||
font-size: 14px;
|
||||
@@ -2722,6 +2732,7 @@ a#showPermissions:hover {text-decoration: none;}
|
||||
animation-timing-function: ease-out;
|
||||
}
|
||||
|
||||
.user-list-checkbox[data-selected='1'] .select-checkbox i,
|
||||
.tag-container .tag-box[data-selected='1'] .select-checkbox i {
|
||||
display: inline;
|
||||
}
|
||||
@@ -4616,18 +4627,23 @@ li.plupload_delete a:hover {background: url("images/cancelhover.svg")!important;
|
||||
#action_delete_derivatives label, #action_generate_derivatives label {display: flex; margin-top: 4px; width: 50%;}
|
||||
#action_delete_derivatives input[name="del_derivatives_type[]"], #action_generate_derivatives input[name="generate_derivatives_type[]"] {margin-right: 3px;}
|
||||
.actionButtons:first-child::after,#filter_prefilter::before,#filter_category::before,#filter_level::before,
|
||||
.permitActionListButton div::before, #action_level::after, .pictureLevels::before {
|
||||
.permitActionListButton div::before, #action_level::after, .pictureLevels::before,
|
||||
.user-action-select-container::before, .advanced-filter-select-container::before,
|
||||
.user-property-select-container::before {
|
||||
content: '\e835'; font-size: 17px; position: absolute; font-family: "fontello"; color: #6E6E6E; pointer-events: none;
|
||||
}
|
||||
.permitActionListButton div::before {margin-left: 250px; margin-top: 11px;}
|
||||
.pictureLevels::before {margin-left: 216px; margin-top: 10px;}
|
||||
.permitActionListButton div.hidden::after {display: none;}
|
||||
.user-action-select-container::before {top: 5px; right:10px}
|
||||
.user-property-select-container::before {margin-top: 10px; margin-left:270px;}
|
||||
.advanced-filter-select-container::before {top: 5px; right:10px}
|
||||
#filter_prefilter::before {margin-left: 257px; margin-top: 35px;}
|
||||
#filter_category .selectize-control.single .selectize-input::after {content: none;}
|
||||
#filter_category {width: 600px;}
|
||||
#filter_category::before {margin-left: 565px;margin-top: 33px; z-index: 2;}
|
||||
#filter_level::before {margin-top: 34px; margin-left: 260px;}
|
||||
#action_level::after {margin-top: -56px; margin-left: 254px;}
|
||||
#batchManagerGlobal #action_level::after {margin-top: -56px; margin-left: 254px;}
|
||||
#filter_search input {width: 300px; box-sizing: border-box; padding: 11px 18px;}
|
||||
#applyFilter, #addFilter,#filterList select, #filter_tags .selectize-input.items.not-full.has-options, .pictureLevels select, #permitAction select{
|
||||
font-family: "Open Sans", "Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
|
||||
|
||||
@@ -43,11 +43,34 @@ while ($row = pwg_db_fetch_assoc($result))
|
||||
$groups[$row['id']] = $row['name'];
|
||||
}
|
||||
|
||||
// +-----------------------------------------------------------------------+
|
||||
// | Dates for filtering |
|
||||
// +-----------------------------------------------------------------------+
|
||||
|
||||
$query = '
|
||||
SELECT DISTINCT
|
||||
month(registration_date) as registration_month,
|
||||
year(registration_date) as registration_year
|
||||
FROM '.USER_INFOS_TABLE.'
|
||||
ORDER BY registration_date
|
||||
;';
|
||||
$result = pwg_query($query);
|
||||
|
||||
$register_dates = array();
|
||||
while ($row = pwg_db_fetch_assoc($result))
|
||||
{
|
||||
$register_dates[] = $row['registration_month'].' '.$row['registration_year'];
|
||||
}
|
||||
|
||||
$template->assign('register_dates', implode(',' , $register_dates));
|
||||
|
||||
|
||||
// +-----------------------------------------------------------------------+
|
||||
// | template |
|
||||
// +-----------------------------------------------------------------------+
|
||||
$template->assign(
|
||||
array(
|
||||
'ADMIN_PAGE_TITLE' => l10n('Manage users'),
|
||||
'ACTIVATE_COMMENTS' => $conf['activate_comments'],
|
||||
'Double_Password' => $conf['double_password_type_in_admin']
|
||||
)
|
||||
@@ -97,6 +120,7 @@ $template->assign(
|
||||
'password_protected_users' => implode(',', array_unique($password_protected_users)),
|
||||
'guest_user' => $conf['guest_id'],
|
||||
'filter_group' => (isset($_GET['group']) ? $_GET['group'] : null),
|
||||
'connected_user' => $user["id"]
|
||||
)
|
||||
);
|
||||
|
||||
@@ -132,6 +156,24 @@ foreach ($conf['available_permission_levels'] as $level)
|
||||
$template->assign('level_options', $level_options);
|
||||
$template->assign('level_selected', $default_user['level']);
|
||||
|
||||
$query = '
|
||||
SELECT id, name, is_default
|
||||
FROM `'.GROUPS_TABLE.'`
|
||||
ORDER BY name ASC
|
||||
;';
|
||||
$result = pwg_query($query);
|
||||
|
||||
$groups_arr_id = [];
|
||||
$groups_arr_name = [];
|
||||
while ($row = pwg_db_fetch_assoc($result))
|
||||
{
|
||||
$groups_arr_name[] = '"'.pwg_db_real_escape_string($row["name"]).'"';
|
||||
$groups_arr_id[] = $row["id"];
|
||||
}
|
||||
|
||||
$template->assign('groups_arr_id', implode(',', $groups_arr_id));
|
||||
$template->assign('groups_arr_name', implode(',', $groups_arr_name));
|
||||
$template->assign('guest_id', $conf["guest_id"]);
|
||||
|
||||
// +-----------------------------------------------------------------------+
|
||||
// | html code display |
|
||||
|
||||
@@ -14,11 +14,16 @@
|
||||
* @option string username (optional)
|
||||
* @option string[] status (optional)
|
||||
* @option int min_level (optional)
|
||||
* @option int max_level (optional)
|
||||
* @option int[] group_id (optional)
|
||||
* @option int per_page
|
||||
* @option int page
|
||||
* @option string order
|
||||
* @option string display
|
||||
* @option string filter
|
||||
* @option int[] exclude (optional)
|
||||
* @option string min_register
|
||||
* @option string max_register
|
||||
*/
|
||||
function ws_users_getList($params, &$service)
|
||||
{
|
||||
@@ -36,6 +41,44 @@ function ws_users_getList($params, &$service)
|
||||
$where_clauses[] = 'u.'.$conf['user_fields']['username'].' LIKE \''.pwg_db_real_escape_string($params['username']).'\'';
|
||||
}
|
||||
|
||||
$filtered_groups = array();
|
||||
if (!empty($params['filter']))
|
||||
{
|
||||
$filter_query = 'SELECT id FROM '. GROUPS_TABLE .' WHERE name LIKE \''. $params['filter'] . '\';';
|
||||
$filtered_groups_res = pwg_query($filter_query);
|
||||
while ($row = pwg_db_fetch_assoc($filtered_groups_res))
|
||||
{
|
||||
$filtered_groups[] = $row['id'];
|
||||
}
|
||||
$filter_where_clause = '('.'u.'.$conf['user_fields']['username'].' LIKE \''.
|
||||
pwg_db_real_escape_string($params['filter']).'\' OR '
|
||||
.'u.'.$conf['user_fields']['email'].' LIKE \''.
|
||||
pwg_db_real_escape_string($params['filter']).'\'';
|
||||
|
||||
if (!empty($filtered_groups)) {
|
||||
$filter_where_clause .= 'OR ug.group_id IN ('. implode(',', $filtered_groups).')';
|
||||
}
|
||||
$where_clauses[] = $filter_where_clause.')';
|
||||
}
|
||||
|
||||
|
||||
if (!empty($params['min_register'])) {
|
||||
list($min_register_month, $min_register_year) = explode(' ', $params["min_register"]);
|
||||
if (strlen($min_register_month) == 1) {
|
||||
$min_register_month = "0".$min_register_month;
|
||||
}
|
||||
$where_clauses[] = 'ui.registration_date >= \''.$min_register_year.'-'.$min_register_month.'-01 00:00:00\'';
|
||||
}
|
||||
|
||||
|
||||
if (!empty($params['max_register'])) {
|
||||
list($max_register_month, $max_register_year) = explode(' ', $params["max_register"]);
|
||||
if (strlen($max_register_month) == 1) {
|
||||
$max_register_month = "0".$max_register_month;
|
||||
}
|
||||
$where_clauses[] = 'ui.registration_date <= adddate(\''.$max_register_year.'-'.$max_register_month.'-01 00:00:00\', interval 1 month)';
|
||||
}
|
||||
|
||||
if (!empty($params['status']))
|
||||
{
|
||||
$params['status'] = array_intersect($params['status'], get_enums(USER_INFOS_TABLE, 'status'));
|
||||
@@ -54,11 +97,25 @@ function ws_users_getList($params, &$service)
|
||||
$where_clauses[] = 'ui.level >= '.$params['min_level'];
|
||||
}
|
||||
|
||||
if (!empty($params['max_level']))
|
||||
{
|
||||
if ( !in_array($params['max_level'], $conf['available_permission_levels']) )
|
||||
{
|
||||
return new PwgError(WS_ERR_INVALID_PARAM, 'Invalid level');
|
||||
}
|
||||
$where_clauses[] = 'ui.level <= '.$params['max_level'];
|
||||
}
|
||||
|
||||
if (!empty($params['group_id']))
|
||||
{
|
||||
$where_clauses[] = 'ug.group_id IN('. implode(',', $params['group_id']) .')';
|
||||
}
|
||||
|
||||
if (!empty($params['exclude']))
|
||||
{
|
||||
$where_clauses[] = 'u.'.$conf['user_fields']['id'].' NOT IN('. implode(',', $params['exclude']) .')';
|
||||
}
|
||||
|
||||
$display = array('u.'.$conf['user_fields']['id'] => 'id');
|
||||
|
||||
if ($params['display'] != 'none')
|
||||
@@ -72,7 +129,7 @@ function ws_users_getList($params, &$service)
|
||||
'nb_image_page','recent_period','expand','show_nb_comments','show_nb_hits',
|
||||
'enabled_high','registration_date','registration_date_string',
|
||||
'registration_date_since', 'last_visit', 'last_visit_string',
|
||||
'last_visit_since'
|
||||
'last_visit_since', 'total_count'
|
||||
);
|
||||
}
|
||||
else if (in_array('basics', $params['display']))
|
||||
@@ -81,6 +138,10 @@ function ws_users_getList($params, &$service)
|
||||
'username','email','status','level','groups',
|
||||
));
|
||||
}
|
||||
else if (in_array('only_id', $params["display"]))
|
||||
{
|
||||
$params['display'] = array();
|
||||
}
|
||||
$params['display'] = array_flip($params['display']);
|
||||
|
||||
// if registration_date_string or registration_date_since is requested,
|
||||
@@ -127,6 +188,10 @@ function ws_users_getList($params, &$service)
|
||||
$query = '
|
||||
SELECT DISTINCT ';
|
||||
|
||||
// ADD SQL_CALC_FOUND_ROWS if display total_count is requested
|
||||
if (isset($params['display']['total_count'])) {
|
||||
$query .= 'SQL_CALC_FOUND_ROWS ';
|
||||
}
|
||||
$first = true;
|
||||
foreach ($display as $field => $name)
|
||||
{
|
||||
@@ -140,7 +205,6 @@ SELECT DISTINCT ';
|
||||
if (!$first) $query.= ', ';
|
||||
$query.= 'ui.last_visit_from_history AS last_visit_from_history';
|
||||
}
|
||||
|
||||
$query.= '
|
||||
FROM '. USERS_TABLE .' AS u
|
||||
INNER JOIN '. USER_INFOS_TABLE .' AS ui
|
||||
@@ -149,13 +213,21 @@ SELECT DISTINCT ';
|
||||
ON u.'. $conf['user_fields']['id'] .' = ug.user_id
|
||||
WHERE
|
||||
'. implode(' AND ', $where_clauses) .'
|
||||
ORDER BY '. $params['order'] .'
|
||||
LIMIT '. $params['per_page'] .'
|
||||
OFFSET '. ($params['per_page']*$params['page']) .'
|
||||
;';
|
||||
|
||||
ORDER BY '. $params['order'];
|
||||
if ($params["per_page"] != 0 || !empty($params["display"])) {
|
||||
$query .= '
|
||||
LIMIT '. $params['per_page'].'
|
||||
OFFSET '. ($params['per_page']*$params['page']) .';
|
||||
;';
|
||||
}
|
||||
$users = array();
|
||||
$result = pwg_query($query);
|
||||
|
||||
/* GET THE RESULT OF SQL_CALC_FOUND_ROWS if display total_count is requested*/
|
||||
if (isset($params['display']['total_count'])) {
|
||||
$total_count_query_result = pwg_query('SELECT FOUND_ROWS();');
|
||||
list($total_count) = pwg_db_fetch_row($total_count_query_result);
|
||||
}
|
||||
while ($row = pwg_db_fetch_assoc($result))
|
||||
{
|
||||
$row['id'] = intval($row['id']);
|
||||
@@ -165,24 +237,55 @@ SELECT DISTINCT ';
|
||||
}
|
||||
$users[ $row['id'] ] = $row;
|
||||
}
|
||||
|
||||
|
||||
$users_id_arr = array();
|
||||
if (count($users) > 0)
|
||||
{
|
||||
if (isset($params['display']['groups']))
|
||||
{
|
||||
$query = '
|
||||
SELECT user_id, group_id
|
||||
SELECT user_id, group_id
|
||||
FROM '. USER_GROUP_TABLE .'
|
||||
WHERE user_id IN ('. implode(',', array_keys($users)) .')
|
||||
;';
|
||||
$result = pwg_query($query);
|
||||
|
||||
while ($row = pwg_db_fetch_assoc($result))
|
||||
{
|
||||
$users[ $row['user_id'] ]['groups'][] = intval($row['group_id']);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($users as $cur_user)
|
||||
{
|
||||
$users_id_arr[] = $cur_user['id'];
|
||||
if (isset($params['display']['registration_date_string'])) {
|
||||
$users[$cur_user['id']]['registration_date_string'] = format_date($cur_user['registration_date'], array('day', 'month', 'year'));
|
||||
}
|
||||
if (isset($params['display']['registration_date_since'])) {
|
||||
$users[ $cur_user['id'] ]['registration_date_since'] = time_since($cur_user['registration_date'], 'month');
|
||||
}
|
||||
if (isset($params['display']['last_visit'])) {
|
||||
$last_visit = $cur_user['last_visit'];
|
||||
$users[ $cur_user['id'] ]['last_visit'] = $last_visit;
|
||||
|
||||
if (!get_boolean($cur_user['last_visit_from_history']) and empty($last_visit))
|
||||
{
|
||||
$last_visit = get_user_last_visit_from_history($cur_user['id'], true);
|
||||
$users[ $cur_user['id'] ]['last_visit'] = $last_visit;
|
||||
}
|
||||
|
||||
if (isset($params['display']['last_visit_string']))
|
||||
{
|
||||
$users[ $cur_user['id'] ]['last_visit_string'] = format_date($last_visit, array('day', 'month', 'year'));
|
||||
}
|
||||
|
||||
if (isset($params['display']['last_visit_since']))
|
||||
{
|
||||
$users[ $cur_user['id'] ]['last_visit_since'] = time_since($last_visit, 'day');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Removed for optimization above, dont go through the $users array for evert display
|
||||
if (isset($params['display']['registration_date_string']))
|
||||
{
|
||||
foreach ($users as $cur_user)
|
||||
@@ -221,22 +324,27 @@ SELECT user_id, group_id
|
||||
{
|
||||
$users[ $cur_user['id'] ]['last_visit_since'] = time_since($last_visit, 'day');
|
||||
}
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
$users = trigger_change('ws_users_getList', $users);
|
||||
|
||||
return array(
|
||||
'paging' => new PwgNamedStruct(
|
||||
array(
|
||||
'page' => $params['page'],
|
||||
'per_page' => $params['per_page'],
|
||||
'count' => count($users)
|
||||
)
|
||||
),
|
||||
'users' => new PwgNamedArray(array_values($users), 'user')
|
||||
if ($params["per_page"] == 0 && empty($params["display"])) {
|
||||
$method_result = $users_id_arr;
|
||||
} else {
|
||||
$method_result = array(
|
||||
'paging' => new PwgNamedStruct(
|
||||
array(
|
||||
'page' => $params['page'],
|
||||
'per_page' => $params['per_page'],
|
||||
'count' => count($users)
|
||||
)
|
||||
),
|
||||
'users' => new PwgNamedArray(array_values($users), 'user')
|
||||
);
|
||||
}
|
||||
if (isset($params['display']['total_count'])) {
|
||||
$method_result['total_count'] = $total_count;
|
||||
}
|
||||
return $method_result;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1076,6 +1076,42 @@ $lang['Please upgrade your PHP version before any update.'] = 'Please upgrade yo
|
||||
$lang['Requires PHP %s'] = 'Requires PHP %s';
|
||||
$lang['%s MB used'] = '%s MB used';
|
||||
$lang['%s GB used'] = '%s GB used';
|
||||
$lang['Manage users'] = 'Manage users';
|
||||
$lang['between %s and %s'] = 'between %s and %s';
|
||||
$lang['Edit guest user'] = 'Edit guest user';
|
||||
$lang['New user added'] = 'New user added';
|
||||
$lang['Edit'] = 'Edit';
|
||||
$lang['Advanced filter'] = 'Advanced filter';
|
||||
$lang['Registered'] = 'Registered';
|
||||
$lang['Email Adress'] = 'Email Adress';
|
||||
$lang['Select groups or type them'] = 'Select groups or type them';
|
||||
$lang['Update'] = 'Update';
|
||||
$lang['Close'] = 'Close';
|
||||
$lang['User updated'] = 'User updated';
|
||||
$lang['Delete user'] = 'Delete user';
|
||||
$lang['Theme'] = 'Theme';
|
||||
$lang['Language'] = 'Language';
|
||||
$lang['Add a new user'] = 'Add a new user';
|
||||
$lang['Show'] = 'Show';
|
||||
$lang['Generate random password'] = 'Generate random password';
|
||||
$lang['Email'] = 'Email';
|
||||
$lang['Add User'] = 'Add User';
|
||||
$lang['Jan'] = 'Jan';
|
||||
$lang['Feb'] = 'Feb';
|
||||
$lang['Mar'] = 'Mar';
|
||||
$lang['Apr'] = 'Apr';
|
||||
$lang['May'] = 'May';
|
||||
$lang['Jun'] = 'Jun';
|
||||
$lang['Jul'] = 'Jul';
|
||||
$lang['Aug'] = 'Aug';
|
||||
$lang['Sep'] = 'Sep';
|
||||
$lang['Oct'] = 'Oct';
|
||||
$lang['Nov'] = 'Nov';
|
||||
$lang['Dec'] = 'Dec';
|
||||
$lang['Change Password'] = 'Change Password';
|
||||
$lang['Photos per page'] = 'Photos per page';
|
||||
$lang['Users not logged in will have these settings applied, these settings are used by default for new users'] = 'Users not logged in will have these settings applied, these settings are used by default for new users';
|
||||
$lang['Last visit'] = 'Last visit';
|
||||
$lang['Activity peak in the last weeks'] = 'Activity peak in the last weeks';
|
||||
$lang['%d Activities'] = '%d Activities';
|
||||
$lang['%d Activity'] = '%d Activity';
|
||||
|
||||
@@ -1078,6 +1078,42 @@ $lang['Please upgrade your PHP version before any update.'] = 'Il faudra mettre
|
||||
$lang['Requires PHP %s'] = 'Requiert PHP %s';
|
||||
$lang['%s MB used'] = '%s MB utilisés';
|
||||
$lang['%s GB used'] = '%s GB utilisés';
|
||||
$lang['Manage users'] = 'Gérer les utilisateurs';
|
||||
$lang['between %s and %s'] = 'entre %s et %s';
|
||||
$lang['Edit guest user'] = 'Editer l\'utilisateur invité';
|
||||
$lang['New user added'] = 'Nouvel utilisateur ajouté';
|
||||
$lang['Edit'] = 'Editer';
|
||||
$lang['Advanced filter'] = 'Filtres avancés';
|
||||
$lang['Registered'] = 'Enregistré';
|
||||
$lang['Email Adress'] = 'Adresse mail';
|
||||
$lang['Select groups or type them'] = 'Sélectionne des groupes ou écris les';
|
||||
$lang['Update'] = 'Modifier';
|
||||
$lang['Close'] = 'Fermer';
|
||||
$lang['User updated'] = 'Utilisateur modifié';
|
||||
$lang['Delete user'] = 'Supprimer l\'utilitsateur';
|
||||
$lang['Theme'] = 'Thème';
|
||||
$lang['Language'] = 'Langue';
|
||||
$lang['Add a new user'] = 'Ajouter un nouvel utilisateur';
|
||||
$lang['Show'] = 'Montrer';
|
||||
$lang['Generate random password'] = 'Générer un mot de passe aléatoire';
|
||||
$lang['Email'] = 'Email';
|
||||
$lang['Add User'] = 'Ajouter l\'utlisateur';
|
||||
$lang['Jan'] = 'Jan';
|
||||
$lang['Feb'] = 'Fev';
|
||||
$lang['Mar'] = 'Mar';
|
||||
$lang['Apr'] = 'Avr';
|
||||
$lang['May'] = 'Mai';
|
||||
$lang['Jun'] = 'Jun';
|
||||
$lang['Jul'] = 'Jul';
|
||||
$lang['Aug'] = 'Aou';
|
||||
$lang['Sep'] = 'Sep';
|
||||
$lang['Oct'] = 'Oct';
|
||||
$lang['Nov'] = 'Nov';
|
||||
$lang['Dec'] = 'Dec';
|
||||
$lang['Change Password'] = 'Modifier le mot de passe';
|
||||
$lang['Photos per page'] = 'Photos par page';
|
||||
$lang['Users not logged in will have these settings applied, these settings are used by default for new users'] = 'Les utilisateurs non connectés vont avoir ces paramètres appliqués, ces paramètres sont utilisés par défaut pour les nouveaux utilisateurs';
|
||||
$lang['Last visit'] = 'Dernière visite';
|
||||
$lang['Activity peak in the last weeks'] = 'Pics d\'activité des dernières semaines';
|
||||
$lang['%d Activities'] = '%d Activités';
|
||||
$lang['%d Activity'] = '%d Activité';
|
||||
|
||||
Reference in New Issue
Block a user