Used the term suspended instead of banned.

This commit is contained in:
Neil Lalonde 2013-11-07 13:53:32 -05:00
parent 706f96af0a
commit 0c6f794eb0
57 changed files with 318 additions and 312 deletions

View File

@ -1,24 +1,24 @@
/**
The modal for banning a user.
The modal for suspending a user.
@class AdminBanUserController
@class AdminSuspendUserController
@extends Discourse.Controller
@namespace Discourse
@uses Discourse.ModalFunctionality
@module Discourse
**/
Discourse.AdminBanUserController = Discourse.ObjectController.extend(Discourse.ModalFunctionality, {
Discourse.AdminSuspendUserController = Discourse.ObjectController.extend(Discourse.ModalFunctionality, {
actions: {
ban: function() {
suspend: function() {
var duration = parseInt(this.get('duration'), 10);
if (duration > 0) {
var self = this;
this.send('hideModal');
this.get('model').ban(duration, this.get('reason')).then(function() {
this.get('model').suspend(duration, this.get('reason')).then(function() {
window.location.reload();
}, function(e) {
var error = I18n.t('admin.user.ban_failed', { error: "http: " + e.status + " - " + e.body });
var error = I18n.t('admin.user.suspend_failed', { error: "http: " + e.status + " - " + e.body });
bootbox.alert(error, function() { self.send('showModal'); });
});
}

View File

@ -133,31 +133,31 @@ Discourse.AdminUser = Discourse.User.extend({
this.set('trustLevel.id', this.get('originalTrustLevel'));
},
isBanned: Em.computed.equal('is_banned', true),
canBan: Em.computed.not('staff'),
isSuspended: Em.computed.equal('suspended', true),
canSuspend: Em.computed.not('staff'),
banDuration: function() {
var banned_at = moment(this.banned_at);
var banned_till = moment(this.banned_till);
return banned_at.format('L') + " - " + banned_till.format('L');
}.property('banned_till', 'banned_at'),
suspendDuration: function() {
var suspended_at = moment(this.suspended_at);
var suspended_till = moment(this.suspended_till);
return suspended_at.format('L') + " - " + suspended_till.format('L');
}.property('suspended_till', 'suspended_at'),
ban: function(duration, reason) {
return Discourse.ajax("/admin/users/" + this.id + "/ban", {
suspend: function(duration, reason) {
return Discourse.ajax("/admin/users/" + this.id + "/suspend", {
type: 'PUT',
data: {duration: duration, reason: reason}
});
},
unban: function() {
Discourse.ajax("/admin/users/" + this.id + "/unban", {
unsuspend: function() {
Discourse.ajax("/admin/users/" + this.id + "/unsuspend", {
type: 'PUT'
}).then(function() {
// succeeded
window.location.reload();
}, function(e) {
// failed
var error = I18n.t('admin.user.unban_failed', { error: "http: " + e.status + " - " + e.body });
var error = I18n.t('admin.user.unsuspend_failed', { error: "http: " + e.status + " - " + e.body });
bootbox.alert(error);
});
},

View File

@ -32,7 +32,7 @@ Discourse.AdminDashboardRoute = Discourse.Route.extend({
c.set('top_referrers', topReferrers);
}
['admins', 'moderators', 'blocked', 'banned', 'top_traffic_sources', 'top_referred_topics', 'updated_at'].forEach(function(x) {
['admins', 'moderators', 'blocked', 'suspended', 'top_traffic_sources', 'top_referred_topics', 'updated_at'].forEach(function(x) {
c.set(x, d[x]);
});

View File

@ -42,7 +42,7 @@ Discourse.Route.buildRoutes(function() {
this.resource('adminUsers', { path: '/users' }, function() {
this.resource('adminUser', { path: '/:username' });
this.resource('adminUsersList', { path: '/list' }, function() {
_.each(['active', 'new', 'pending', 'admins', 'moderators', 'blocked', 'banned',
_.each(['active', 'new', 'pending', 'admins', 'moderators', 'blocked', 'suspended',
'newuser', 'basic', 'regular', 'leaders', 'elders'], function(x) {
this.route(x, { path: '/' + x });
}, this);

View File

@ -31,9 +31,9 @@ Discourse.AdminUserRoute = Discourse.Route.extend({
},
actions: {
showBanModal: function(user) {
Discourse.Route.showModal(this, 'admin_ban_user', user);
this.controllerFor('modal').set('modalClass', 'ban-user-modal');
showSuspendModal: function(user) {
Discourse.Route.showModal(this, 'admin_suspend_user', user);
this.controllerFor('modal').set('modalClass', 'suspend-user-modal');
}
}

View File

@ -111,15 +111,15 @@ Discourse.AdminUsersListBlockedRoute = Discourse.Route.extend({
});
/**
Handles the route that lists banned users.
Handles the route that lists suspended users.
@class AdminUsersListBannedRoute
@class AdminUsersListSuspendedRoute
@extends Discourse.Route
@namespace Discourse
@module Discourse
**/
Discourse.AdminUsersListBannedRoute = Discourse.Route.extend({
Discourse.AdminUsersListSuspendedRoute = Discourse.Route.extend({
setupController: function() {
return this.controllerFor('adminUsersList').show('banned');
return this.controllerFor('adminUsersList').show('suspended');
}
});

View File

@ -132,8 +132,8 @@
<tr>
<td class="title"><i class='icon icon-trophy'></i> {{i18n admin.dashboard.admins}}</td>
<td class="value">{{#link-to 'adminUsersList.admins'}}{{admins}}{{/link-to}}</td>
<td class="title"><i class='icon icon-ban-circle'></i> {{i18n admin.dashboard.banned}}</td>
<td class="value">{{#link-to 'adminUsersList.banned'}}{{banned}}{{/link-to}}</td>
<td class="title"><i class='icon icon-ban-circle'></i> {{i18n admin.dashboard.suspended}}</td>
<td class="value">{{#link-to 'adminUsersList.suspended'}}{{suspended}}{{/link-to}}</td>
</tr>
<tr>
<td class="title"><i class='icon icon-magic'></i> {{i18n admin.dashboard.moderators}}</td>

View File

@ -1,15 +1,15 @@
<div class="modal-body">
<form>
{{i18n admin.user.ban_duration}}
{{i18n admin.user.suspend_duration}}
{{textField value=duration maxlength="5" autofocus="autofocus" class="span2"}}
{{i18n admin.user.ban_duration_units}}
{{i18n admin.user.suspend_duration_units}}
<br/>
{{i18n admin.user.ban_reason_label}}
{{i18n admin.user.suspend_reason_label}}
<br/>
{{textField value=reason class="span8"}}
</form>
</div>
<div class="modal-footer">
<button class='btn btn-danger' {{action ban}}><i class='icon icon-ban-circle'></i>{{i18n admin.user.ban}}</button>
<button class='btn btn-danger' {{action suspend}}><i class='icon icon-ban-circle'></i>{{i18n admin.user.suspend}}</button>
<a {{action closeModal}}>{{i18n cancel}}</a>
</div>

View File

@ -198,39 +198,39 @@
</div>
</div>
<div {{bindAttr class=":display-row isBanned:highlight-danger"}}>
<div class='field'>{{i18n admin.user.banned}}</div>
<div class='value'>{{isBanned}}</div>
<div {{bindAttr class=":display-row isSuspended:highlight-danger"}}>
<div class='field'>{{i18n admin.user.suspended}}</div>
<div class='value'>{{isSuspended}}</div>
<div class='controls'>
{{#if isBanned}}
<button class='btn btn-danger' {{action unban target="content"}}>
{{#if isSuspended}}
<button class='btn btn-danger' {{action unsuspend target="content"}}>
<i class='icon icon-ban-circle'></i>
{{i18n admin.user.unban}}
{{i18n admin.user.unsuspend}}
</button>
{{banDuration}}
{{i18n admin.user.banned_explanation}}
{{suspendDuration}}
{{i18n admin.user.suspended_explanation}}
{{else}}
{{#if canBan}}
<button class='btn btn-danger' {{action showBanModal this}}>
{{#if canSuspend}}
<button class='btn btn-danger' {{action showSuspendModal this}}>
<i class='icon icon-ban-circle'></i>
{{i18n admin.user.ban}}
{{i18n admin.user.suspend}}
</button>
{{i18n admin.user.banned_explanation}}
{{i18n admin.user.suspended_explanation}}
{{/if}}
{{/if}}
</div>
</div>
{{#if isBanned}}
{{#if isSuspended}}
<div class='display-row highlight-danger'>
<div class='field'>{{i18n admin.user.banned_by}}</div>
<div class='field'>{{i18n admin.user.suspended_by}}</div>
<div class='value'>
{{#link-to 'adminUser' banned_by}}{{avatar banned_by imageSize="tiny"}}{{/link-to}}
{{#link-to 'adminUser' banned_by}}{{banned_by.username}}{{/link-to}}
{{#link-to 'adminUser' suspended_by}}{{avatar suspended_by imageSize="tiny"}}{{/link-to}}
{{#link-to 'adminUser' suspended_by}}{{suspended_by.username}}{{/link-to}}
</div>
<div class='controls'>
<b>{{i18n admin.user.ban_reason}}</b>:
{{ban_reason}}
<b>{{i18n admin.user.suspend_reason}}</b>:
{{suspend_reason}}
</div>
</div>
{{/if}}

View File

@ -8,7 +8,7 @@
{{/if}}
<li>{{#link-to 'adminUsersList.admins'}}{{i18n admin.users.nav.admins}}{{/link-to}}</li>
<li>{{#link-to 'adminUsersList.moderators'}}{{i18n admin.users.nav.moderators}}{{/link-to}}</li>
<li>{{#link-to 'adminUsersList.banned'}}{{i18n admin.users.nav.banned}}{{/link-to}}</li>
<li>{{#link-to 'adminUsersList.suspended'}}{{i18n admin.users.nav.suspended}}{{/link-to}}</li>
<li>{{#link-to 'adminUsersList.blocked'}}{{i18n admin.users.nav.blocked}}{{/link-to}}</li>
</ul>
</div>

View File

@ -1,12 +0,0 @@
/**
A modal view for banning a user.
@class AdminBanUserView
@extends Discourse.ModalBodyView
@namespace Discourse
@module Discourse
**/
Discourse.AdminBanUserView = Discourse.ModalBodyView.extend({
templateName: 'admin/templates/modal/admin_ban_user',
title: I18n.t('admin.user.ban_modal_title')
});

View File

@ -0,0 +1,12 @@
/**
A modal view for suspending a user.
@class AdminSuspendUserView
@extends Discourse.ModalBodyView
@namespace Discourse
@module Discourse
**/
Discourse.AdminSuspendUserView = Discourse.ModalBodyView.extend({
templateName: 'admin/templates/modal/admin_suspend_user',
title: I18n.t('admin.user.suspend_modal_title')
});

View File

@ -4,8 +4,8 @@ require_dependency 'boost_trust_level'
class Admin::UsersController < Admin::AdminController
before_filter :fetch_user, only: [:ban,
:unban,
before_filter :fetch_user, only: [:suspend,
:unsuspend,
:refresh_browsers,
:revoke_admin,
:grant_admin,
@ -37,21 +37,21 @@ class Admin::UsersController < Admin::AdminController
render nothing: true
end
def ban
guardian.ensure_can_ban!(@user)
@user.banned_till = params[:duration].to_i.days.from_now
@user.banned_at = DateTime.now
def suspend
guardian.ensure_can_suspend!(@user)
@user.suspended_till = params[:duration].to_i.days.from_now
@user.suspended_at = DateTime.now
@user.save!
StaffActionLogger.new(current_user).log_user_ban(@user, params[:reason])
StaffActionLogger.new(current_user).log_user_suspend(@user, params[:reason])
render nothing: true
end
def unban
guardian.ensure_can_ban!(@user)
@user.banned_till = nil
@user.banned_at = nil
def unsuspend
guardian.ensure_can_suspend!(@user)
@user.suspended_till = nil
@user.suspended_at = nil
@user.save!
StaffActionLogger.new(current_user).log_user_unban(@user)
StaffActionLogger.new(current_user).log_user_unsuspend(@user)
render nothing: true
end

View File

@ -27,11 +27,11 @@ class SessionController < ApplicationController
# If their password is correct
if @user.confirm_password?(password)
if @user.is_banned?
if reason = @user.ban_reason
render json: { error: I18n.t("login.banned_with_reason", {date: I18n.l(@user.banned_till, format: :date_only), reason: reason}) }
if @user.suspended?
if reason = @user.suspend_reason
render json: { error: I18n.t("login.suspended_with_reason", {date: I18n.l(@user.suspended_till, format: :date_only), reason: reason}) }
else
render json: { error: I18n.t("login.banned", {date: I18n.l(@user.banned_till, format: :date_only)}) }
render json: { error: I18n.t("login.suspended", {date: I18n.l(@user.suspended_till, format: :date_only)}) }
end
return
end

View File

@ -14,7 +14,7 @@ module Jobs
# Find the user
user = User.where(id: args[:user_id]).first
return unless user
return if user.is_banned? && args[:type] != :user_private_message
return if user.suspended? && args[:type] != :user_private_message
seen_recently = (user.last_seen_at.present? && user.last_seen_at > SiteSetting.email_time_window_mins.minutes.ago)
seen_recently = false if user.email_always
@ -38,7 +38,7 @@ module Jobs
notification = Notification.where(id: args[:notification_id]).first if args[:notification_id].present?
if notification.present?
# Don't email a user about a post when we've seen them recently.
return if seen_recently && !user.is_banned?
return if seen_recently && !user.suspended?
# Load the post if present
email_args[:post] ||= notification.post
@ -69,7 +69,7 @@ module Jobs
post &&
(post.topic.blank? ||
post.user_deleted? ||
(user.is_banned? && !post.user.try(:staff?)) ||
(user.suspended? && !post.user.try(:staff?)) ||
PostTiming.where(topic_id: post.topic_id, post_number: post.post_number, user_id: user.id).present?)
end

View File

@ -64,7 +64,7 @@ class AdminDashboardData
reports: REPORTS.map { |type| Report.find(type).as_json },
admins: User.admins.count,
moderators: User.moderators.count,
banned: User.banned.count,
suspended: User.suspended.count,
blocked: User.blocked.count,
top_referrers: IncomingLinksReport.find('top_referrers').as_json,
top_traffic_sources: IncomingLinksReport.find('top_traffic_sources').as_json,

View File

@ -78,8 +78,8 @@ class User < ActiveRecord::Base
attr_accessor :notification_channel_position
scope :blocked, -> { where(blocked: true) } # no index
scope :banned, -> { where('banned_till IS NOT NULL AND banned_till > ?', Time.zone.now) } # no index
scope :not_banned, -> { where('banned_till IS NULL') }
scope :suspended, -> { where('suspended_till IS NOT NULL AND suspended_till > ?', Time.zone.now) } # no index
scope :not_suspended, -> { where('suspended_till IS NULL') }
# excluding fake users like the community user
scope :real, -> { where('id > 0') }
@ -356,16 +356,16 @@ class User < ActiveRecord::Base
end
end
def is_banned?
banned_till && banned_till > DateTime.now
def suspended?
suspended_till && suspended_till > DateTime.now
end
def ban_record
UserHistory.for(self, :ban_user).order('id DESC').first
def suspend_record
UserHistory.for(self, :suspend_user).order('id DESC').first
end
def ban_reason
ban_record.try(:details) if is_banned?
def suspend_reason
suspend_record.try(:details) if suspended?
end
# Use this helper to determine if the user has a particular trust level.
@ -623,8 +623,8 @@ end
# approved_at :datetime
# digest_after_days :integer
# previous_visit_at :datetime
# banned_at :datetime
# banned_till :datetime
# suspended_at :datetime
# suspended_till :datetime
# date_of_birth :date
# auto_track_topics_after_msecs :integer
# views :integer default(0), not null

View File

@ -19,8 +19,8 @@ class UserHistory < ActiveRecord::Base
:notified_about_avatar,
:notified_about_sequential_replies,
:notitied_about_dominating_topic,
:ban_user,
:unban_user)
:suspend_user,
:unsuspend_user)
end
# Staff actions is a subset of all actions, used to audit actions taken by staff users.
@ -30,8 +30,8 @@ class UserHistory < ActiveRecord::Base
:change_site_setting,
:change_site_customization,
:delete_site_customization,
:ban_user,
:unban_user]
:suspend_user,
:unsuspend_user]
end
def self.staff_action_ids

View File

@ -14,11 +14,11 @@ class AdminDetailedUserSerializer < AdminUserSerializer
:private_topics_count,
:can_delete_all_posts,
:can_be_deleted,
:ban_reason
:suspend_reason
has_one :approved_by, serializer: BasicUserSerializer, embed: :objects
has_one :api_key, serializer: ApiKeySerializer, embed: :objects
has_one :banned_by, serializer: BasicUserSerializer, embed: :objects
has_one :suspended_by, serializer: BasicUserSerializer, embed: :objects
def can_revoke_admin
scope.can_revoke_admin?(object)
@ -56,8 +56,8 @@ class AdminDetailedUserSerializer < AdminUserSerializer
api_key.present?
end
def banned_by
object.ban_record.try(:acting_user)
def suspended_by
object.suspend_record.try(:acting_user)
end
end

View File

@ -15,9 +15,9 @@ class AdminUserSerializer < BasicUserSerializer
:avatar_template,
:can_approve,
:approved,
:banned_at,
:banned_till,
:is_banned,
:suspended_at,
:suspended_till,
:suspended,
:ip_address,
:can_send_activation_email,
:can_activate,
@ -32,8 +32,8 @@ class AdminUserSerializer < BasicUserSerializer
end
end
def is_banned
object.is_banned?
def suspended
object.suspended?
end
def can_impersonate

View File

@ -57,19 +57,19 @@ class StaffActionLogger
}))
end
def log_user_ban(user, reason, opts={})
def log_user_suspend(user, reason, opts={})
raise Discourse::InvalidParameters.new('user is nil') unless user
UserHistory.create( params(opts).merge({
action: UserHistory.actions[:ban_user],
action: UserHistory.actions[:suspend_user],
target_user_id: user.id,
details: reason
}))
end
def log_user_unban(user, opts={})
def log_user_unsuspend(user, opts={})
raise Discourse::InvalidParameters.new('user is nil') unless user
UserHistory.create( params(opts).merge({
action: UserHistory.actions[:unban_user],
action: UserHistory.actions[:unsuspend_user],
target_user_id: user.id
}))
end

View File

@ -1086,7 +1086,7 @@ cs:
moderators: 'Moderátoři:'
admins: 'Administrátoři:'
blocked: 'Blokováno:'
banned: 'Zakázáno:'
suspended: 'Zakázáno:'
private_messages_short: "SZ"
private_messages_title: "Soukromé zprávy"
@ -1229,7 +1229,7 @@ cs:
pending: "Čeká na schválení"
admins: "Administrátoři"
moderators: "Moderátoři"
banned: "Zakázaní"
suspended: "Zakázaní"
blocked: "Blokovaní"
approved: "Schválen?"
approved_selected:
@ -1248,16 +1248,16 @@ cs:
admins: 'Admininstrátoři'
moderators: 'Moderátoři'
blocked: 'Blokovaní uživatelé'
banned: "Zakázaní uživatelé"
suspended: "Zakázaní uživatelé"
user:
ban_failed: "Nastala chyba při zakazování uživatele {{error}}"
unban_failed: "Nastala chyba při povolování uživatele {{error}}"
ban_duration: "Jak dlouho má zákaz platit? (dny)"
suspend_failed: "Nastala chyba při zakazování uživatele {{error}}"
unsuspend_failed: "Nastala chyba při povolování uživatele {{error}}"
suspend_duration: "Jak dlouho má zákaz platit? (dny)"
delete_all_posts: "Smazat všechny příspěvky"
ban: "Zakázat"
unban: "Povolit"
banned: "Zakázán?"
suspend: "Zakázat"
unsuspend: "Povolit"
suspended: "Zakázán?"
moderator: "Moderátor?"
admin: "Administrátor?"
blocked: "Zablokovaný?"

View File

@ -791,13 +791,13 @@ da:
other: "approve users ({{count}})"
user:
ban_failed: "Something went wrong banning this user {{error}}"
unban_failed: "Something went wrong unbanning this user {{error}}"
ban_duration: "How long would you like to ban the user for? (days)"
suspend_failed: "Something went wrong banning this user {{error}}"
unsuspend_failed: "Something went wrong unbanning this user {{error}}"
suspend_duration: "How long would you like to ban the user for? (days)"
delete_all_posts: "Delete all posts"
ban: "Ban"
unban: "Unban"
banned: "Banned?"
suspend: "Ban"
unsuspend: "Unban"
suspended: "Banned?"
moderator: "Moderator?"
admin: "Admin?"
show_admin_profile: "Admin"

View File

@ -1074,7 +1074,7 @@ de:
moderators: 'Moderatoren:'
admins: 'Administratoren:'
blocked: 'Gesperrt:'
banned: "Gebannt:"
suspended: "Gebannt:"
private_messages_short: "PNs"
private_messages_title: "Private Nachrichten"
@ -1251,7 +1251,7 @@ de:
pending: "Unerledigt"
admins: "Administratoren"
moderators: "Moderatoren"
banned: "Gebannt"
suspended: "Gebannt"
blocked: "Blockiert"
approved: "Zugelassen?"
approved_selected:
@ -1272,7 +1272,7 @@ de:
admins: 'Administratoren'
moderators: 'Moderatoren'
blocked: 'Gesperrte Benutzer'
banned: "Gebannte Benutzer"
suspended: "Gebannte Benutzer"
reject_successful:
one: "Erfolgreich 1 Benutzer abgelehnt."
other: "Erfolgreich %{count} Benutzer abgelehnt."
@ -1281,14 +1281,14 @@ de:
other: "Konnte %{count} Benutzer nicht ablehnen."
user:
ban_failed: "Beim Sperren dieses Benutzers ist etwas schief gegangen {{error}}"
unban_failed: "Beim Entsperren dieses Benutzers ist etwas schief gegangen {{error}}"
ban_duration: "Wie lange soll dieser Benutzer gesperrt werden? (Tage)"
suspend_failed: "Beim Sperren dieses Benutzers ist etwas schief gegangen {{error}}"
unsuspend_failed: "Beim Entsperren dieses Benutzers ist etwas schief gegangen {{error}}"
suspend_duration: "Wie lange soll dieser Benutzer gesperrt werden? (Tage)"
delete_all_posts: "Lösche alle Beiträge"
delete_all_posts_confirm: "Du löschst %{posts} Beiträge und %{topics} Themen. Bist du sicher?"
ban: "Sperren"
unban: "Entsperren"
banned: "Gesperrt?"
suspend: "Sperren"
unsuspend: "Entsperren"
suspended: "Gesperrt?"
moderator: "Moderator?"
admin: "Administrator?"
blocked: "Geblockt?"

View File

@ -1105,7 +1105,7 @@ en:
moderators: 'Moderators:'
admins: 'Admins:'
blocked: 'Blocked:'
banned: 'Banned:'
suspended: 'Suspended:'
private_messages_short: "PMs"
private_messages_title: "Private Messages"
@ -1265,8 +1265,8 @@ en:
change_site_setting: "change site setting"
change_site_customization: "change site customization"
delete_site_customization: "delete site customization"
ban_user: "ban user"
unban_user: "unban user"
suspend_user: "suspend user"
unsuspend_user: "unsuspend user"
screened_emails:
title: "Screened Emails"
description: "When someone tries to create a new account, the following email addresses will be checked and the registration will be blocked, or some other action performed."
@ -1307,7 +1307,7 @@ en:
pending: "Pending"
admins: 'Admins'
moderators: 'Mods'
banned: 'Banned'
suspended: 'Suspended'
blocked: 'Blocked'
approved: "Approved?"
approved_selected:
@ -1328,7 +1328,7 @@ en:
admins: 'Admin Users'
moderators: 'Moderators'
blocked: 'Blocked Users'
banned: 'Banned Users'
suspended: 'Suspended Users'
reject_successful:
one: "Successfully rejected 1 user."
other: "Successfully rejected %{count} users."
@ -1337,18 +1337,18 @@ en:
other: "Failed to reject %{count} users."
user:
ban_failed: "Something went wrong banning this user {{error}}"
unban_failed: "Something went wrong unbanning this user {{error}}"
ban_duration: "How long would you like to ban the user for?"
ban_duration_units: "(days)"
ban_reason_label: "Why are you banning? When the user tries to log in, they will see this text. Keep it short."
ban_reason: "Reason for Ban"
banned_by: "Banned by"
suspend_failed: "Something went wrong suspending this user {{error}}"
unsuspend_failed: "Something went wrong unsuspending this user {{error}}"
suspend_duration: "How long would you like to suspend the user for?"
suspend_duration_units: "(days)"
suspend_reason_label: "Why are you suspending? When the user tries to log in, they will see this text. Keep it short."
suspend_reason: "Reason"
suspended_by: "Suspended by"
delete_all_posts: "Delete all posts"
delete_all_posts_confirm: "You are about to delete %{posts} posts and %{topics} topics. Are you sure?"
ban: "Ban"
unban: "Unban"
banned: "Banned?"
suspend: "Suspend"
unsuspend: "Unsuspend"
suspended: "Suspended?"
moderator: "Moderator?"
admin: "Admin?"
blocked: "Blocked?"
@ -1400,10 +1400,10 @@ en:
unblock_failed: 'There was a problem unblocking the user.'
block_failed: 'There was a problem blocking the user.'
deactivate_explanation: "A deactivated user must re-validate their email."
banned_explanation: "A banned user can't log in."
suspended_explanation: "A suspended user can't log in."
block_explanation: "A blocked user can't post or start topics."
trust_level_change_failed: "There was a problem changing the user's trust level."
ban_modal_title: "Ban User"
suspend_modal_title: "Suspend User"
site_content:
none: "Choose a type of content to begin editing."

View File

@ -891,13 +891,13 @@ es:
other: "aprobar usuarios ({{count}})"
user:
ban_failed: "Algo salió mal baneando este usuario {{error}}"
unban_failed: "Algo salió mal quitando ban a este usuario {{error}}"
ban_duration: "¿Cuánto tiempo le gustaría aplicar ban al usuario? (days)"
suspend_failed: "Algo salió mal baneando este usuario {{error}}"
unsuspend_failed: "Algo salió mal quitando ban a este usuario {{error}}"
suspend_duration: "¿Cuánto tiempo le gustaría aplicar ban al usuario? (days)"
delete_all_posts: "Eliminar todos los mensajes"
ban: "Banear"
unban: "Quitar ban"
banned: "Baneado?"
suspend: "Banear"
unsuspend: "Quitar ban"
suspended: "Baneado?"
moderator: "Moderador?"
admin: "Administrador?"
show_admin_profile: "Administrador"

View File

@ -1055,7 +1055,7 @@ fr:
moderators: 'Modérateurs :'
admins: 'Administateurs :'
blocked: 'Bloqués :'
banned: 'Banni :'
suspended: 'Banni :'
private_messages_short: "MPs"
private_messages_title: "Messages Privés"
reports:
@ -1246,7 +1246,7 @@ fr:
pending: "En attente"
admins: 'Administrateurs'
moderators: 'Modérateurs'
banned: 'Banni'
suspended: 'Banni'
blocked: 'Bloqué'
approved: "Approuvé ?"
approved_selected:
@ -1267,7 +1267,7 @@ fr:
admins: 'Administrateurs'
moderators: 'Modérateurs'
blocked: 'Utilisateurs bloqués'
banned: 'Utilisateurs bannis'
suspended: 'Utilisateurs bannis'
reject_successful:
one: "Utilisateur rejeté avec succès."
other: "%{count} utilisateurs rejetés avec succès."
@ -1275,14 +1275,14 @@ fr:
one: "Utilisateur dont le rejet a échoué."
other: "%{count} utilisateurs dont le rejet a échoué."
user:
ban_failed: "Il y a eu un problème pendant le bannissement de cet utilisateur {{error}}"
unban_failed: "Il y a eu un problème pendant le débannissement de cet utilisateur {{error}}"
ban_duration: "Pour combien de temps voulez-vous bannir cet utilisateur ? (jours)"
suspend_failed: "Il y a eu un problème pendant le bannissement de cet utilisateur {{error}}"
unsuspend_failed: "Il y a eu un problème pendant le débannissement de cet utilisateur {{error}}"
suspend_duration: "Pour combien de temps voulez-vous bannir cet utilisateur ? (jours)"
delete_all_posts: "Supprimer tous les messages"
delete_all_posts_confirm: "Vous allez supprimer supprimer %{posts} messages et %{topics} discussions. Êtes-vous sûr ?"
ban: "Bannir"
unban: "Débannir"
banned: "Banni ?"
suspend: "Bannir"
unsuspend: "Débannir"
suspended: "Banni ?"
moderator: "Modérateur ?"
admin: "Admin ?"
blocked: "Bloqué ?"

View File

@ -726,13 +726,13 @@ id:
other: "approve users ({{count}})"
user:
ban_failed: "Something went wrong banning this user {{error}}"
unban_failed: "Something went wrong unbanning this user {{error}}"
ban_duration: "How long would you like to ban the user for? (days)"
suspend_failed: "Something went wrong banning this user {{error}}"
unsuspend_failed: "Something went wrong unbanning this user {{error}}"
suspend_duration: "How long would you like to ban the user for? (days)"
delete_all_posts: "Delete all posts"
ban: "Ban"
unban: "Unban"
banned: "Banned?"
suspend: "Ban"
unsuspend: "Unban"
suspended: "Banned?"
moderator: "Moderator?"
admin: "Admin?"
show_admin_profile: "Admin"

View File

@ -1132,13 +1132,13 @@ it:
moderators: 'Moderatori'
user:
ban_failed: "Qualcosa è andato storto nel bannare questo utente {{error}}"
unban_failed: "Qualcosa è andato rimuovendo il ban a questo utente {{error}}"
ban_duration: "Per quanto tempo vuoi bannare l'utente? (giorni)"
suspend_failed: "Qualcosa è andato storto nel bannare questo utente {{error}}"
unsuspend_failed: "Qualcosa è andato rimuovendo il ban a questo utente {{error}}"
suspend_duration: "Per quanto tempo vuoi bannare l'utente? (giorni)"
delete_all_posts: "Cancella tutti i post"
ban: "Ban"
unban: "Rimuovi Ban"
banned: "Bannato?"
suspend: "Ban"
unsuspend: "Rimuovi Ban"
suspended: "Bannato?"
moderator: "Moderatore?"
admin: "Amministratore?"
show_admin_profile: "Amministratore"

View File

@ -1099,7 +1099,7 @@ ko:
moderators: '중간 관리자:'
admins: '운영자:'
blocked: '블락됨:'
banned: '접근금지:'
suspended: '접근금지:'
private_messages_short: "PMs"
private_messages_title: "개인 메시지"
@ -1301,7 +1301,7 @@ ko:
pending: "보류"
admins: "운영자들"
moderators: '중간 관리자들'
banned: '접근 금지'
suspended: '접근 금지'
blocked: '블락됨'
approved: "승인?"
approved_selected:
@ -1322,7 +1322,7 @@ ko:
admins: '운영자 사용자'
moderators: '중간 관리자'
blocked: '블락된 사용자들'
banned: '접근 금지된 사용자들'
suspended: '접근 금지된 사용자들'
reject_successful:
other: "성공적으로 1명의 사용자를 거절하였습니다."
other: "성공적으로 ${count}명의 사용자를 거절하였습니다."
@ -1331,18 +1331,18 @@ ko:
other: "%{count}명의 사용자를 거절하는데 실패했습니다."
user:
ban_failed: "이 사용자를 접근 금지하는데 오류 발생 {{error}}"
unban_failed: "이 사용자를 접근 허용 하는데 오류 발생 {{error}}"
ban_duration: "사용자를 몇일 접근 금지 하시겠습니까?"
suspend_failed: "이 사용자를 접근 금지하는데 오류 발생 {{error}}"
unsuspend_failed: "이 사용자를 접근 허용 하는데 오류 발생 {{error}}"
suspend_duration: "사용자를 몇일 접근 금지 하시겠습니까?"
ban_duration_units: "(일)"
ban_reason_label: "왜 접근 금지 합니까? 사용자가 로그인을 시도하면 그들은 이 메시지를 보게 됩니다."
ban_reason: "접근 금지 이유"
banned_by: "접근 금지자"
delete_all_posts: "모든 글을 삭제합니다"
delete_all_posts_confirm: "당신은 %{posts} 개의 게시글과 %{topics} 개의 토픽를 삭제합니다. 확실합니까?"
ban: "접근 금지"
unban: "접근 허용"
banned: "접근 금지?"
suspend: "접근 금지"
unsuspend: "접근 허용"
suspended: "접근 금지?"
moderator: "중간 관리자?"
admin: "운영자?"
blocked: "블락"

View File

@ -1045,13 +1045,13 @@ nb_NO:
moderators: 'Moderatorer'
user:
ban_failed: "Noe gikk galt ved å bannlyse denne brukeren {{error}}"
unban_failed: "Noe gikk galt ved å gjeninsette denne brukeren {{error}}"
ban_duration: "Hvor lenge vil du bannlyse denne brukeren? (dager)"
suspend_failed: "Noe gikk galt ved å bannlyse denne brukeren {{error}}"
unsuspend_failed: "Noe gikk galt ved å gjeninsette denne brukeren {{error}}"
suspend_duration: "Hvor lenge vil du bannlyse denne brukeren? (dager)"
delete_all_posts: "Slett alle innlegg"
ban: "Bannlyst"
unban: Gjeninnsett"
banned: "Banlyst?"
suspend: "Bannlyst"
unsuspend: Gjeninnsett"
suspended: "Banlyst?"
moderator: "Moderator?"
admin: "Admin?"
show_admin_profile: "Admin"

View File

@ -1103,7 +1103,7 @@ nl:
moderators: "Moderators:"
admins: "Admins:"
blocked: "Geblokkeerd:"
banned: "Geband:"
suspended: "Geband:"
private_messages_short: PBs
private_messages_title: Privé-berichten
@ -1304,7 +1304,7 @@ nl:
pending: Te beoordelen
admins: Admins
moderators: Moderatoren
banned: Verbannen
suspended: Verbannen
blocked: Geblokt
approved: Goedgekeurd?
approved_selected:
@ -1325,7 +1325,7 @@ nl:
admins: Administrators
moderators: Moderators
blocked: Geblokkeerde leden
banned: Verbannen leden
suspended: Verbannen leden
reject_successful:
one: "1 Gebruiker met succes geweigerd"
other: "%{count} Gebruikers met succes geweigerd"
@ -1334,18 +1334,18 @@ nl:
other: "Weigering van %{count} gebruikers is niet gelukt"
user:
ban_failed: "Er ging iets fout met het blokkeren van deze gebruiker: {{error}}"
unban_failed: "Er ging iets fout bij het deblokkeren van deze gebruiker: {{error}}"
ban_duration: "Hoe lang wil je deze gebruiker blokkeren?"
suspend_failed: "Er ging iets fout met het blokkeren van deze gebruiker: {{error}}"
unsuspend_failed: "Er ging iets fout bij het deblokkeren van deze gebruiker: {{error}}"
suspend_duration: "Hoe lang wil je deze gebruiker blokkeren?"
ban_duretion_units: (dagen)
ban_reason_label: "Waarom ban je? Als de gebruiker in probeert te loggen, zullen ze deze tekst zien. Hou het kort."
ban_reason: Reden voor ban
banned_by: Verbannen door
delete_all_posts: Verwijder alle berichten
delete_all_posts_confirm: "Je gaat %{posts} en %{topics} verwijderen. Zeker weten?"
ban: Blokkeer
unban: Deblokkeer
banned: Geblokkeerd?
suspend: Blokkeer
unsuspend: Deblokkeer
suspended: Geblokkeerd?
moderator: Moderator?
admin: Beheerder?
blocked: Geblokkeerd?

View File

@ -990,7 +990,7 @@ pseudo:
moderators: '[[ Ϻóďéřáťóřš: ]]'
admins: '[[ Áďɱíɳš: ]]'
blocked: '[[ Ɓłóčǩéď: ]]'
banned: '[[ Ɓáɳɳéď: ]]'
suspended: '[[ Ɓáɳɳéď: ]]'
private_messages_short: '[[ РϺš ]]'
private_messages_title: '[[ Рříνáťé Ϻéššáǧéš ]]'
reports:
@ -1121,7 +1121,7 @@ pseudo:
pending: '[[ Рéɳďíɳǧ ]]'
admins: '[[ Áďɱíɳš ]]'
moderators: '[[ Ϻóďš ]]'
banned: '[[ Ɓáɳɳéď ]]'
suspended: '[[ Ɓáɳɳéď ]]'
blocked: '[[ Ɓłóčǩéď ]]'
approved: '[[ Áƿƿřóνéď? ]]'
approved_selected:
@ -1139,15 +1139,15 @@ pseudo:
admins: '[[ Áďɱíɳ Ůšéřš ]]'
moderators: '[[ Ϻóďéřáťóřš ]]'
blocked: '[[ Ɓłóčǩéď Ůšéřš ]]'
banned: '[[ Ɓáɳɳéď Ůšéřš ]]'
suspended: '[[ Ɓáɳɳéď Ůšéřš ]]'
user:
ban_failed: '[[ Šóɱéťĥíɳǧ ŵéɳť ŵřóɳǧ ƀáɳɳíɳǧ ťĥíš ůšéř {{error}} ]]'
unban_failed: '[[ Šóɱéťĥíɳǧ ŵéɳť ŵřóɳǧ ůɳƀáɳɳíɳǧ ťĥíš ůšéř {{error}} ]]'
ban_duration: '[[ Ĥóŵ łóɳǧ ŵóůłď ýóů łíǩé ťó ƀáɳ ťĥé ůšéř ƒóř? (ďáýš) ]]'
suspend_failed: '[[ Šóɱéťĥíɳǧ ŵéɳť ŵřóɳǧ ƀáɳɳíɳǧ ťĥíš ůšéř {{error}} ]]'
unsuspend_failed: '[[ Šóɱéťĥíɳǧ ŵéɳť ŵřóɳǧ ůɳƀáɳɳíɳǧ ťĥíš ůšéř {{error}} ]]'
suspend_duration: '[[ Ĥóŵ łóɳǧ ŵóůłď ýóů łíǩé ťó ƀáɳ ťĥé ůšéř ƒóř? (ďáýš) ]]'
delete_all_posts: '[[ Ďéłéťé áłł ƿóšťš ]]'
ban: '[[ Ɓáɳ ]]'
unban: '[[ Ůɳƀáɳ ]]'
banned: '[[ Ɓáɳɳéď? ]]'
suspend: '[[ Ɓáɳ ]]'
unsuspend: '[[ Ůɳƀáɳ ]]'
suspended: '[[ Ɓáɳɳéď? ]]'
moderator: '[[ Ϻóďéřáťóř? ]]'
admin: '[[ Áďɱíɳ? ]]'
blocked: '[[ Ɓłóčǩéď? ]]'

View File

@ -682,13 +682,13 @@ pt:
other: "aprovar utilizadores ({{count}})"
user:
ban_failed: "Algo correu mal ao banir este utilizador {{error}}"
unban_failed: "Algo não correu bem ao desbanir este utilizador {{error}}"
ban_duration: "Por quanto tempo gostarias de banir a pessoa? (dias)"
suspend_failed: "Algo correu mal ao banir este utilizador {{error}}"
unsuspend_failed: "Algo não correu bem ao desbanir este utilizador {{error}}"
suspend_duration: "Por quanto tempo gostarias de banir a pessoa? (dias)"
delete_all_posts: "Apagar todos os posts"
ban: "Banir"
unban: "Desbanir"
banned: "Banido?"
suspend: "Banir"
unsuspend: "Desbanir"
suspended: "Banido?"
moderator: "Moderador?"
admin: "Admin?"
show_admin_profile: "Admin"

View File

@ -1094,7 +1094,7 @@ pt_BR:
moderators: 'Moderadores:'
admins: 'Admins:'
blocked: 'Bloqueado:'
banned: 'Banido:'
suspended: 'Banido:'
private_messages_short: "MPs"
private_messages_title: "Mensagens Particulares"
@ -1273,7 +1273,7 @@ pt_BR:
pending: "Pendentes"
admins: 'Administradores'
moderators: 'Moderadores'
banned: 'Banidos'
suspended: 'Banidos'
blocked: 'Bloqueados'
approved: "Aprovado?"
approved_selected:
@ -1294,7 +1294,7 @@ pt_BR:
admins: 'Usuários Administradores'
moderators: 'Moderadores'
blocked: 'Usuários Boqueados'
banned: 'Usuários Banidos'
suspended: 'Usuários Banidos'
reject_successful:
one: "1 usuário rejeitado com sucesso."
other: "%{count} usuários rejeitados com sucesso"
@ -1303,14 +1303,14 @@ pt_BR:
other: "Falha ao rejeitar %{count} usuários."
user:
ban_failed: "Ocorreu um erro ao banir este usuário {{error}}"
unban_failed: "Ocorreu um erro ao desbanir este usuário {{error}}"
ban_duration: "Por quanto tempo gostaria de banir a pessoa? (dias)"
suspend_failed: "Ocorreu um erro ao banir este usuário {{error}}"
unsuspend_failed: "Ocorreu um erro ao desbanir este usuário {{error}}"
suspend_duration: "Por quanto tempo gostaria de banir a pessoa? (dias)"
delete_all_posts: "Apagar todas postagens"
delete_all_posts_confirm: "Você irá deletar %{posts} posts e %{topics} tópicos. Tem certeza?"
ban: "Banir"
unban: "Desbanir"
banned: "Banido?"
suspend: "Banir"
unsuspend: "Desbanir"
suspended: "Banido?"
moderator: "Moderador?"
admin: "Admin?"
blocked: "Bloqueado?"

View File

@ -1108,7 +1108,7 @@ ru:
moderators: 'Модераторы:'
admins: 'Администраторы:'
blocked: 'Заблокированы:'
banned: 'Забанены:'
suspended: 'Забанены:'
private_messages_short: ЛС
private_messages_title: 'Личные сообщения'
reports:
@ -1304,7 +1304,7 @@ ru:
pending: Ожидает одобрения
admins: Администраторы
moderators: Модераторы
banned: Забаненые
suspended: Забаненые
blocked: Заблокированные
approved: 'Подтвердить?'
approved_selected:
@ -1329,7 +1329,7 @@ ru:
admins: 'Администраторы'
moderators: Модераторы
blocked: 'Заблокированные пользователи'
banned: 'Забаненые пользователи'
suspended: 'Забаненые пользователи'
reject_successful:
one: 'Отказано одному пользователю.'
other: 'Отказано %{count} пользователей.'
@ -1341,14 +1341,14 @@ ru:
few: 'Ошибка отказа %{count} пользователям.'
many: 'Ошибка отказа %{count} пользователям.'
user:
ban_failed: 'Ошибка при наложении бана {{error}}'
unban_failed: 'Ошибка при снятии бана {{error}}'
ban_duration: 'Насколько вы хотите забанить пользователя? (в днях)'
suspend_failed: 'Ошибка при наложении бана {{error}}'
unsuspend_failed: 'Ошибка при снятии бана {{error}}'
suspend_duration: 'Насколько вы хотите забанить пользователя? (в днях)'
delete_all_posts: 'Удалить все сообщения'
delete_all_posts_confirm: 'Вы собираетесь удалить %{posts} сообщений и %{topics} тем. Вы уверены?'
ban: Забанить
unban: Разбанить
banned: 'Забанен?'
suspend: Забанить
unsuspend: Разбанить
suspended: 'Забанен?'
moderator: 'Модератор?'
admin: 'Администратор?'
blocked: 'Заблокирован?'

View File

@ -900,13 +900,13 @@ sv:
other: "godkänd användare ({{count}})"
user:
ban_failed: "Någonting gick fel under avstängningen av denna användare {{error}}"
unban_failed: "Någonting gick fel under upplåsningen av denna användare {{error}}"
ban_duration: "Hur länge vill du stänga av denna användare? (dagar)"
suspend_failed: "Någonting gick fel under avstängningen av denna användare {{error}}"
unsuspend_failed: "Någonting gick fel under upplåsningen av denna användare {{error}}"
suspend_duration: "Hur länge vill du stänga av denna användare? (dagar)"
delete_all_posts: "Radera alla inlägg"
ban: "Stäng av"
unban: "Lås upp"
banned: "Avstängd?"
suspend: "Stäng av"
unsuspend: "Lås upp"
suspended: "Avstängd?"
moderator: "Moderator?"
admin: "Administratör?"
show_admin_profile: "Administratör"

View File

@ -1105,7 +1105,7 @@ zh_CN:
moderators: '版主:'
admins: '管理员:'
blocked: '禁止参与讨论:'
banned: "禁止登录"
suspended: "禁止登录"
private_messages_short: "私信"
private_messages_title: "私密信息"
@ -1307,7 +1307,7 @@ zh_CN:
pending: "待定"
admins: "管理员"
moderators: "版主"
banned: "禁止登录"
suspended: "禁止登录"
blocked: "禁止参与讨论"
approved: "已批准?"
approved_selected:
@ -1328,7 +1328,7 @@ zh_CN:
admins: '管理员'
moderators: '版主'
blocked: '被封用户'
banned: '被禁用户'
suspended: '被禁用户'
reject_successful:
one: "1名用户已被拒绝。"
other: "%{count}名用户已被拒绝。"
@ -1337,18 +1337,18 @@ zh_CN:
other: "%{count}名用户决绝失败。"
user:
ban_failed: "禁止此用户时发生了错误 {{error}}"
unban_failed: "解禁此用户时发生了错误 {{error}}"
ban_duration: "你计划禁止该用户多久?"
suspend_failed: "禁止此用户时发生了错误 {{error}}"
unsuspend_failed: "解禁此用户时发生了错误 {{error}}"
suspend_duration: "你计划禁止该用户多久?"
ban_duration_units: "(天)"
ban_reason_label: "为什么禁止该用户?当其尝试登入时,会看到这条理由。"
ban_reason: "禁止的理由"
banned_by: "禁止操作者:"
delete_all_posts: "删除所有帖子"
delete_all_posts_confirm: "你将删除 %{posts} 个帖子和 %{topics} 个主题,确认吗?"
ban: "禁止"
unban: "解禁"
banned: "已禁止?"
suspend: "禁止"
unsuspend: "解禁"
suspended: "已禁止?"
moderator: "版主?"
admin: "管理员?"
blocked: "已封?"

View File

@ -992,7 +992,7 @@ zh_TW:
moderators: '版主:'
admins: '管理員:'
blocked: '已封鎖:'
banned: '已禁止:'
suspended: '已禁止:'
private_messages_short: "私信"
private_messages_title: "私密信息"
@ -1152,7 +1152,7 @@ zh_TW:
pending: "待定"
admins: '管理員'
moderators: '版主'
banned: '已禁止'
suspended: '已禁止'
blocked: '已封鎖'
approved: "已批准?"
approved_selected:
@ -1169,17 +1169,17 @@ zh_TW:
elder: '信用等級爲4的用戶年長用戶'
admins: '管理員'
moderators: '版主'
banned: '已禁止的用戶'
suspended: '已禁止的用戶'
blocked: '已封鎖的用戶'
user:
ban_failed: "禁止此用戶時發生了錯誤 {{error}}"
unban_failed: "解禁此用戶時發生了錯誤 {{error}}"
ban_duration: "你計劃禁止該用戶多久?(天)"
suspend_failed: "禁止此用戶時發生了錯誤 {{error}}"
unsuspend_failed: "解禁此用戶時發生了錯誤 {{error}}"
suspend_duration: "你計劃禁止該用戶多久?(天)"
delete_all_posts: "刪除所有帖子"
ban: "禁止"
unban: "解禁"
banned: "已禁止?"
suspend: "禁止"
unsuspend: "解禁"
suspended: "已禁止?"
moderator: "版主?"
admin: "管理員?"
show_admin_profile: "管理員"

View File

@ -743,7 +743,7 @@ cs:
active: "Váš účet je aktivní a připraven k používání."
activate_email: "Už to skoro bude! Zaslali jsme vám aktivační email na <b>%{email}</b>. Prosím následujte instrukce v tomto emailu a aktivujte si tak svůj účet."
not_activated: "Ještě se nemůžete přihlásit. Zaslali jsme vám aktivační email na <b>%{email}</b>. Prosím následujte instrukce v tomto emailu a aktivujte si tak svůj účet."
banned: "Máte zakázáno přihlášení až do %{date}."
suspended: "Máte zakázáno přihlášení až do %{date}."
errors: "%{errors}"
not_available: "Není k dispozici. Nechcete zkusit %{suggestion}?"
something_already_taken: "Nastala chyba při zpracování, zřejmě je dané uživatelské jméno nebo email již zaregistrován. Zkuste odkaz pro obnovení hesla."

View File

@ -718,7 +718,7 @@ de:
active: "Dein Konto ist nun freigeschaltet und einsatzbereit."
activate_email: "Fast fertig! Wir haben eine Aktivierungsmail an <b>%{email}</b> verschickt. Bitte folge den Anweisungen in der Mail, um Dein Konto zu aktivieren."
not_activated: "Du kannst Dich noch nicht anmelden. Wir haben Dir eine Aktivierungsmail geschickt. Bitte folge zunächst den Anweisungen aus der Mail, um Dein Konto zu aktivieren."
banned: "Du kannst dich bis am %{date} nicht mehr anmelden."
suspended: "Du kannst dich bis am %{date} nicht mehr anmelden."
errors: "%{errors}"
not_available: " Nicht verfügbar. Versuche %{suggestion}?"
something_already_taken: "Etwas ist schief gelaufen. Möglicherweise ist der Benutzername bereits registriert. Probiere den 'Passwort vergessen'-Link."

View File

@ -778,8 +778,8 @@ en:
active: "Your account is activated and ready to use."
activate_email: "You're almost done! We sent an activation email to <b>%{email}</b>. Please follow the instructions in the email to activate your account."
not_activated: "You can't log in yet. We sent an activation email to you. Please follow the instructions in the email to activate your account."
banned: "You can't log in until %{date}."
banned_with_reason: "You can't log in until %{date}. The reason you were banned: %{reason}"
suspended: "You can't log in until %{date}."
suspended_with_reason: "You can't log in until %{date}. The reason you were suspended: %{reason}"
errors: "%{errors}"
not_available: "Not available. Try %{suggestion}?"
something_already_taken: "Something went wrong, perhaps the username or email is already registered. Try the forgot password link."

View File

@ -675,7 +675,7 @@ fr:
active: "Votre compte est activé et prêt à l'emploi."
activate_email: "Vous avez presque fini ! Un mail de confirmation a été envoyé à <b>%{email}</b>. Suivez les instructions pour activer votre compte."
not_activated: "Vous ne pouvez pas vous connecter pour le moment. Nous vous avons envoyé un mail d'activation. Merci de suivre les instructions qui y sont contenues pour activer votre compte."
banned: "Vous ne pouvez pas vous connecter jusqu'au %{date}."
suspended: "Vous ne pouvez pas vous connecter jusqu'au %{date}."
errors: "%{errors}"
not_available: "Pas disponible. Essayez %{suggestion} ?"
something_already_taken: "Quelque chose s'est mal passé. Peut-être que votre nom d'utilisateur ou adresse email est déjà enregistré ? Essayez le lien : j'ai oublié mon mot de passe."

View File

@ -779,7 +779,7 @@ nl:
active: "Je account is actief en klaar voor gebruik!"
activate_email: "Je bent er bijna! We hebben een activatiemail verstuurd naar <b>%{email}</b>. Volg de instructies in de mail om je account te activeren."
not_activated: "Je kan nog niet inloggen. We hebben je een activatiemail gestuurd. Volg de instructies in de mail om je account te activeren."
banned: "Je kan tot %{date} niet inloggen."
suspended: "Je kan tot %{date} niet inloggen."
banned_with_reason: "Je kan tot %{date} niet inloggen. Je hebt een ban om de volgende reden: %{reden}"
errors: "%{errors}"
not_available: "Niet beschikbaar. Probeer %{suggestion}?"

View File

@ -859,7 +859,7 @@ pseudo:
Рłéášé ƒółłóŵ ťĥé íɳšťřůčťíóɳš íɳ ťĥé éɱáíł ťó áčťíνáťé ýóůř áččóůɳť. ]]'
not_activated: '[[ Ýóů čáɳ''ť łóǧ íɳ ýéť. Ŵé šéɳť áɳ áčťíνáťíóɳ éɱáíł ťó ýóů.
Рłéášé ƒółłóŵ ťĥé íɳšťřůčťíóɳš íɳ ťĥé éɱáíł ťó áčťíνáťé ýóůř áččóůɳť. ]]'
banned: '[[ Ýóů čáɳ''ť łóǧ íɳ ůɳťíł %{date}. ]]'
suspended: '[[ Ýóů čáɳ''ť łóǧ íɳ ůɳťíł %{date}. ]]'
errors: '[[ %{errors} ]]'
not_available: '[[ Ѝóť áνáíłáƀłé. Ťřý %{suggestion}? ]]'
something_already_taken: '[[ Šóɱéťĥíɳǧ ŵéɳť ŵřóɳǧ, ƿéřĥáƿš ťĥé ůšéřɳáɱé óř éɱáíł

View File

@ -765,7 +765,7 @@ pt_BR:
active: "A sua conta está ativa e pronta."
activate_email: "Estamos quase prontos! Enviamos um email de ativação para <b>%{email}</b>. Por favor siga as instruções no email para ativar a sua conta."
not_activated: "Ainda não podes fazer log in. Enviamos um email de ativação para você. Por favor siga as instruções no email para ativar a sua conta."
banned: "Você não pode entrar antes de %{date}."
suspended: "Você não pode entrar antes de %{date}."
errors: "%{errors}"
not_available: "Não disponível. Tente %{suggestion}?"
something_already_taken: "Algo deu errado, talvez o nome de usuário ou o email já estejam registrados. Tente o link Esqueci minha Senha."

View File

@ -717,7 +717,7 @@ ru:
active: 'Ваша учетная запись активирована и готова к использованию.'
activate_email: 'Почти готово! Мы послали письмо с инструкциями по активации учетной записи на <b>%{email}</b>.'
not_activated: 'Вы пока что не можете войти на сайт. Пожалуйста, следуйте инструкциям по активации учетной записи, которые мы отправили вам по электронной почтой.'
banned: 'Вы не можете войти до %{date}.'
suspended: 'Вы не можете войти до %{date}.'
errors: '%{errors}'
not_available: 'Недоступно. Попробуйте %{suggestion}?'
something_already_taken: 'Что-то пошло не так, возможно, имя пользователя или электронный ящик уже используются. Попробуйте восстановить ваш пароль.'

View File

@ -38,9 +38,9 @@ Discourse::Application.routes.draw do
put 'approve-bulk' => 'users#approve_bulk'
delete 'reject-bulk' => 'users#reject_bulk'
end
put 'ban'
put 'suspend'
put 'delete_all_posts'
put 'unban'
put 'unsuspend'
put 'revoke_admin', constraints: AdminConstraint.new
put 'grant_admin', constraints: AdminConstraint.new
post 'generate_api_key', constraints: AdminConstraint.new

View File

@ -0,0 +1,6 @@
class RenameBannedToSuspended < ActiveRecord::Migration
def change
rename_column :users, :banned_at, :suspended_at
rename_column :users, :banned_till, :suspended_till
end
end

View File

@ -29,8 +29,8 @@ class AdminUserIndexQuery
when 'admins' then @query.where('admin = ?', true)
when 'moderators' then @query.where('moderator = ?', true)
when 'blocked' then @query.blocked
when 'banned' then @query.banned
when 'pending' then @query.not_banned.where('approved = false')
when 'suspended' then @query.suspended
when 'pending' then @query.not_suspended.where('approved = false')
end
end

View File

@ -26,7 +26,7 @@ class Auth::DefaultCurrentUserProvider
current_user = User.where(auth_token: auth_token).first
end
if current_user && current_user.is_banned?
if current_user && current_user.suspended?
current_user = nil
end

View File

@ -115,10 +115,10 @@ class Guardian
end
alias :can_activate? :can_approve?
def can_ban?(user)
def can_suspend?(user)
user && is_staff? && user.regular?
end
alias :can_deactivate? :can_ban?
alias :can_deactivate? :can_suspend?
def can_clear_flags?(post)
is_staff? && post

View File

@ -51,9 +51,9 @@ describe AdminUserIndexQuery do
expect(query.find_users.count).to eq(1)
end
context 'and a banned pending user' do
let!(:banned_user) { Fabricate(:user, approved: false, banned_at: 1.hour.ago, banned_till: 20.years.from_now) }
it "doesn't return the banned user" do
context 'and a suspended pending user' do
let!(:suspended_user) { Fabricate(:user, approved: false, suspended_at: 1.hour.ago, suspended_till: 20.years.from_now) }
it "doesn't return the suspended user" do
query = ::AdminUserIndexQuery.new({ query: 'pending' })
expect(query.find_users.count).to eq(1)
end

View File

@ -802,21 +802,21 @@ describe Guardian do
end
context 'can_ban?' do
it 'returns false when a user tries to ban another user' do
Guardian.new(user).can_ban?(coding_horror).should be_false
context 'can_suspend?' do
it 'returns false when a user tries to suspend another user' do
Guardian.new(user).can_suspend?(coding_horror).should be_false
end
it 'returns true when an admin tries to ban another user' do
Guardian.new(admin).can_ban?(coding_horror).should be_true
it 'returns true when an admin tries to suspend another user' do
Guardian.new(admin).can_suspend?(coding_horror).should be_true
end
it 'returns true when a moderator tries to ban another user' do
Guardian.new(moderator).can_ban?(coding_horror).should be_true
it 'returns true when a moderator tries to suspend another user' do
Guardian.new(moderator).can_suspend?(coding_horror).should be_true
end
it 'returns false when staff tries to ban staff' do
Guardian.new(admin).can_ban?(moderator).should be_false
it 'returns false when staff tries to suspend staff' do
Guardian.new(admin).can_suspend?(moderator).should be_false
end
end

View File

@ -23,10 +23,10 @@ describe SessionController do
end
end
describe 'banned user' do
describe 'suspended user' do
it 'should return an error' do
User.any_instance.stubs(:is_banned?).returns(true)
User.any_instance.stubs(:banned_till).returns(2.days.from_now)
User.any_instance.stubs(:suspended?).returns(true)
User.any_instance.stubs(:suspended_till).returns(2.days.from_now)
xhr :post, :create, login: user.username, password: 'myawesomepassword'
::JSON.parse(response.body)['error'].should be_present
end

View File

@ -8,7 +8,7 @@ describe Jobs::UserEmail do
end
let(:user) { Fabricate(:user, last_seen_at: 11.minutes.ago ) }
let(:banned) { Fabricate(:user, last_seen_at: 10.minutes.ago, banned_at: 5.minutes.ago, banned_till: 7.days.from_now ) }
let(:suspended) { Fabricate(:user, last_seen_at: 10.minutes.ago, suspended_at: 5.minutes.ago, suspended_till: 7.days.from_now ) }
let(:mailer) { Mail::Message.new(to: user.email) }
it "raises an error when there is no user" do
@ -83,17 +83,17 @@ describe Jobs::UserEmail do
Jobs::UserEmail.new.execute(type: :private_message, user_id: user.id, post_id: post.id)
end
context 'user is banned' do
context 'user is suspended' do
it "doesn't send email for a pm from a regular user" do
Email::Sender.any_instance.expects(:send).never
Jobs::UserEmail.new.execute(type: :private_message, user_id: banned.id, post_id: post.id)
Jobs::UserEmail.new.execute(type: :private_message, user_id: suspended.id, post_id: post.id)
end
it "doesn't send email for a pm from a staff user" do
pm_from_staff = Fabricate(:post, user: Fabricate(:moderator))
pm_from_staff.topic.topic_allowed_users.create!(user_id: banned.id)
pm_from_staff.topic.topic_allowed_users.create!(user_id: suspended.id)
Email::Sender.any_instance.expects(:send).never
Jobs::UserEmail.new.execute(type: :private_message, user_id: banned.id, post_id: pm_from_staff.id)
Jobs::UserEmail.new.execute(type: :private_message, user_id: suspended.id, post_id: pm_from_staff.id)
end
end
end
@ -121,28 +121,28 @@ describe Jobs::UserEmail do
Jobs::UserEmail.new.execute(type: :user_mentioned, user_id: user.id, notification_id: notification.id)
end
context 'user is banned' do
context 'user is suspended' do
it "doesn't send email for a pm from a regular user" do
Email::Sender.any_instance.expects(:send).never
Jobs::UserEmail.new.execute(type: :user_private_message, user_id: banned.id, notification_id: notification.id)
Jobs::UserEmail.new.execute(type: :user_private_message, user_id: suspended.id, notification_id: notification.id)
end
context 'pm from staff' do
before do
@pm_from_staff = Fabricate(:post, user: Fabricate(:moderator))
@pm_from_staff.topic.topic_allowed_users.create!(user_id: banned.id)
@pm_notification = Fabricate(:notification, user: banned, topic: @pm_from_staff.topic, post_number: @pm_from_staff.post_number)
UserNotifications.expects(:user_private_message).with(banned, notification: @pm_notification, post: @pm_from_staff).returns(mailer)
@pm_from_staff.topic.topic_allowed_users.create!(user_id: suspended.id)
@pm_notification = Fabricate(:notification, user: suspended, topic: @pm_from_staff.topic, post_number: @pm_from_staff.post_number)
UserNotifications.expects(:user_private_message).with(suspended, notification: @pm_notification, post: @pm_from_staff).returns(mailer)
end
subject(:execute_user_email_job) { Jobs::UserEmail.new.execute(type: :user_private_message, user_id: banned.id, notification_id: @pm_notification.id) }
subject(:execute_user_email_job) { Jobs::UserEmail.new.execute(type: :user_private_message, user_id: suspended.id, notification_id: @pm_notification.id) }
it "sends an email" do
execute_user_email_job
end
it "sends an email even if user was last seen recently" do
banned.update_column(:last_seen_at, 1.minute.ago)
suspended.update_column(:last_seen_at, 1.minute.ago)
execute_user_email_job
end
end

View File

@ -116,36 +116,36 @@ describe StaffActionLogger do
end
end
describe "log_user_ban" do
describe "log_user_suspend" do
let(:user) { Fabricate(:user) }
it "raises an error when arguments are missing" do
expect { logger.log_user_ban(nil, nil) }.to raise_error(Discourse::InvalidParameters)
expect { logger.log_user_ban(nil, "He was bad.") }.to raise_error(Discourse::InvalidParameters)
expect { logger.log_user_suspend(nil, nil) }.to raise_error(Discourse::InvalidParameters)
expect { logger.log_user_suspend(nil, "He was bad.") }.to raise_error(Discourse::InvalidParameters)
end
it "reason arg is optional" do
expect { logger.log_user_ban(user, nil) }.to_not raise_error
expect { logger.log_user_suspend(user, nil) }.to_not raise_error
end
it "creates a new UserHistory record" do
reason = "He was a big meanie."
log_record = logger.log_user_ban(user, reason)
log_record = logger.log_user_suspend(user, reason)
log_record.should be_valid
log_record.details.should == reason
log_record.target_user.should == user
end
end
describe "log_user_unban" do
let(:user) { Fabricate(:user, banned_at: 1.day.ago, banned_till: 7.days.from_now) }
describe "log_user_unsuspend" do
let(:user) { Fabricate(:user, suspended_at: 1.day.ago, suspended_till: 7.days.from_now) }
it "raises an error when argument is missing" do
expect { logger.log_user_unban(nil) }.to raise_error(Discourse::InvalidParameters)
expect { logger.log_user_unsuspend(nil) }.to raise_error(Discourse::InvalidParameters)
end
it "creates a new UserHistory record" do
log_record = logger.log_user_unban(user)
log_record = logger.log_user_unsuspend(user)
log_record.should be_valid
log_record.target_user.should == user
end