chg: refactored deletion of accounts and sites

This commit is contained in:
Tobi Schäfer 2018-05-21 15:00:57 +02:00
parent a978ad7c59
commit c36302a83f
21 changed files with 1251 additions and 1390 deletions

View file

@ -207,7 +207,7 @@
</div>
<div>
<% gettext '{0} sites sorted by {1} in {2} order.'
<% admin.dropdown name="display" <% markgettext all %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext open %> <% markgettext restricted %> <% markgettext public %> <% markgettext closed %> <% markgettext deleted %> %>
<% admin.dropdown name="display" <% markgettext all %> <% markgettext deleted %> <% markgettext blocked %> <% markgettext trusted %> <% markgettext open %> <% markgettext restricted %> <% markgettext public %> <% markgettext closed %> %>
<% admin.dropdown name="sorting" <% markgettext modified %> <% markgettext created %> <% markgettext name %> %>
<% admin.dropdown name="order" <% markgettext descending %> <% markgettext ascending %> %>
%>
@ -411,7 +411,7 @@
<div class='uk-badge uk-badge-success'><% gettext Trusted %></div>
<% #deletedSite %>
<i class='uk-icon-ban'></i>
<div class='uk-badge'><% gettext Deleted %></div>
<% #closedSite %>
<i class='uk-icon-lock'></i>
@ -423,7 +423,7 @@
<i class='uk-icon-globe'></i>
<% #deletedUser %>
<div class='uk-badge'><% gettext Deleted %></div>
<div class='uk-badge uk-badge-warning'><% gettext Deleted %></div>
<% #blockedUser %>
<div class='uk-badge uk-badge-danger'><% gettext Blocked %></div>

View file

@ -146,10 +146,8 @@ Admin.dequeue = function() {
app.log('Processing queued job ' + (i + 1) + ' of ' + max);
switch (job.method) {
case 'remove':
if (job.target.deleted) {
if (job.target.constructor === Site) Site.remove.call(job.target);
if (job.target.constructor === User) User.remove.call(job.target);
}
if (job.target.constructor === Site) Site.remove.call(job.target);
if (job.target.constructor === User) User.remove.call(job.target);
break;
case 'import':
Importer.run(job.target, job.user);
@ -179,10 +177,8 @@ Admin.purgeAccounts = function() {
var now = Date.now();
root.admin.deletedUsers.forEach(function() {
if (!this.deleted) return; // already gone
if (now - this.deleted > 0 && !this.job) {
this.job = Admin.queue(this, 'remove', this);
}
if (this.job || this.deleted) return; // already gone
this.job = Admin.queue(this, 'remove', this);
});
};
@ -190,10 +186,8 @@ Admin.purgeSites = function() {
var now = new Date;
root.admin.deletedSites.forEach(function() {
if (!this.deleted) return;
if (now > this.deleted > 0 && !this.job) {
this.job = Admin.queue(this, 'remove', this.modifier);
}
if (this.job) return;
this.job = Admin.queue(this, 'remove', this.modifier);
});
var notificationPeriod = root.phaseOutNotificationPeriod * Date.ONEDAY;
@ -217,7 +211,7 @@ Admin.purgeSites = function() {
});
this.notified = now;
} else if (now - this.notified > gracePeriod) {
this.mode = Site.DELETED;
this.status = Site.DELETED;
this.deleted = now;
this.notified = null;
}
@ -639,12 +633,12 @@ Admin.prototype.filterSites = function(data) {
var displays = {
1: "status = 'blocked'",
2: "status = 'trusted'",
3: "mode = 'open'",
4: "mode = 'restricted'",
5: "mode = 'public'",
6: "mode = 'closed'",
7: "mode = 'deleted'"
2: "status = 'deleted'",
3: "status = 'trusted'",
4: "mode = 'open'",
5: "mode = 'restricted'",
6: "mode = 'public'",
7: "mode = 'closed'"
};
var sortings = {
@ -812,7 +806,7 @@ Admin.prototype.renderActivity = function (item, skin) {
case User:
return item.status !== User.BLOCKED && item.status !== User.DELETED && item.created - item.modified < 1;
case Site:
return item.mode !== Site.DELETED && item.created - item.modified < 1;
return item.status !== Site.DELETED && item.created - item.modified < 1;
}
return false;
}
@ -905,7 +899,7 @@ Admin.prototype.link_macro = function (param, action, text, target) {
switch (action) {
case 'block':
var user = target.creator || target;
if (user.status !== User.PRIVILEGED && user.status !== User.BLOCKED && (user.status !== User.DELETED || user.deleted)) {
if (user.status !== User.PRIVILEGED && user.status !== User.BLOCKED && user.status !== User.DELETED) {
var url = user.href('block');
return renderLink.call(global, param, url, text || String.EMPTY, this);
}
@ -913,7 +907,7 @@ Admin.prototype.link_macro = function (param, action, text, target) {
case 'delete':
var site = target.constructor === Site ? target : target.site;
if (site && site.getPermission(action) && site.mode !== Site.DELETED) {
if (site && site.getPermission(action) && site.status !== Site.DELETED) {
var url = site.href('delete') + '?safemode';
return renderLink.call(global, param, url, text || String.EMPTY, this);
}

View file

@ -28,7 +28,7 @@ restrictedSites = collection(Site)
restrictedSites.filter = mode = 'restricted' and status <> 'blocked'
deletedSites = collection(Site)
deletedSites.filter = mode = 'deleted'
deletedSites.filter = status = 'deleted'
deletedSites.order = modified desc
users = collection(User)

View file

@ -235,7 +235,7 @@ Comment.prototype.getConfirmText = function() {
if (this.status === Comment.DELETED && size > 1) {
return gettext('You are about to delete a comment thread consisting of {0} postings.', size);
}
return gettext('You are about to delete a comment by user {0}.', this.creator.name);
return gettext('You are about to delete a comment by {0}.', this.creator.name);
};
Comment.prototype.getConfirmExtra = function () {

View file

@ -36,7 +36,7 @@
<div class="uk-width-1-1 av-upload-controls">
<input class='uk-width-1-2' type="text" value="<% param.value %>">
<button class='uk-button' id="<% param.name %>_control" name="<% param.name %>_control" type="button">
<% gettext "Browse" suffix=… %>
<% gettext "Select" suffix=… %>
</button>
</div>
</div>

View file

@ -109,7 +109,7 @@ HopObject.prototype.onRequest = function() {
res.handlers.membership = User.getMembership();
// Logout persisting session if account has been deleted
if (User.getCurrentStatus() === User.DELETED && !session.user.deleted) {
if (User.getCurrentStatus() === User.DELETED) {
User.logout();
}
@ -124,7 +124,7 @@ HopObject.prototype.onRequest = function() {
if (!User.require(User.PRIVILEGED)) {
// Simulate 404 for sites which are due for deletion by cronjob
if (res.handlers.site.mode === Site.DELETED) {
if (res.handlers.site.status === Site.DELETED) {
res.handlers.site = root;
root.notfound_action();
res.stop();
@ -143,7 +143,6 @@ HopObject.prototype.onRequest = function() {
HopObject.confirmConstructor(Layout);
res.handlers.layout = res.handlers.site.layout || new Layout;
res.skinpath = res.handlers.layout.getSkinPath();
//res.skinpath = [app.dir];
if (!this.getPermission(req.action)) {
if (!session.user) {
@ -177,6 +176,7 @@ markgettext('Image');
markgettext('Membership');
markgettext('Poll');
markgettext('Story');
markgettext('User');
HopObject.prototype.delete_action = function() {
if (req.postParams.proceed) {

View file

@ -118,11 +118,11 @@ Members.prototype.reset_action = function() {
if (req.postParams.reset) {
try {
if (!req.postParams.name || !req.postParams.email) {
throw Error(gettext('Please enter a user name and e-mail address.'));
throw Error(gettext('Please enter a username and e-mail address.'));
}
var user = User.getByName(req.postParams.name);
if (!user || user.email !== req.postParams.email) {
throw Error(gettext('User name and e-mail address do not match.'))
throw Error(gettext('Username and e-mail address do not match.'))
}
var token = User.getSalt();
user.setMetadata('resetToken', token);
@ -409,7 +409,7 @@ Members.prototype.search = function(searchString, limit) {
Members.prototype.addMembership = function(data) {
var user = root.users.get(data.name);
if (!user) {
throw Error(gettext('Sorry, your input did not match any registered user.'));
throw Error(gettext('Sorry, your input did not match any registered account.'));
/*} else if (this.get(data.name)) {
throw Error(gettext('This user is already a member of this site.'));*/
}

View file

@ -194,8 +194,8 @@ Membership.prototype.contact_action = function() {
}
Recaptcha.verify(req.postParams);
this.notify(req.action, this.creator.email, session.user ?
gettext('[{0}] Message from user {1}', root.title, session.user.name) :
gettext('[{0}] Message from anonymous user', root.title));
gettext('[{0}] Message from {1}', root.title, session.user.name) :
gettext('[{0}] Message from anonymous', root.title));
res.message = gettext('Your message was sent successfully.');
res.redirect(this._parent.getPermission() ?
this._parent.href() : this.site.href());
@ -274,7 +274,7 @@ Membership.prototype.notify = function(action, recipient, subject) {
* @returns {String}
*/
Membership.prototype.getConfirmText = function() {
return gettext('You are about to delete the membership of user {0}.',
return gettext('You are about to delete the membership of {0}.',
this.creator.name);
}

View file

@ -1185,15 +1185,6 @@ a.gs-title:hover {
</td>
</tr>
<% #deleted %>
<h1><% gettext 'Deleted Site' %></h1>
<p>
<% gettext "This site is scheduled for deletion." %>
</p>
<div class='uk-alert'>
<% gettext 'You still can revert the request for deletion in the {0}site settings{1}.' <% site.href edit prefix='<a href="' suffix='">' %> '</a>' %>
</div>
<% #export %>
<h1><% gettext "Export Site Data" %></h1>
<p>

View file

@ -29,7 +29,6 @@ this.handleMetadata('callbackUrl');
this.handleMetadata('closed');
this.handleMetadata('commentMode');
this.handleMetadata('configured');
this.handleMetadata('deleted');
this.handleMetadata('export');
this.handleMetadata('imageDimensionLimits');
this.handleMetadata('import_id');
@ -51,23 +50,21 @@ this.handleMetadata('trollFilter');
* @returns {String[]}
* @see defineConstants
*/
Site.getStatus = defineConstants(Site, markgettext('Blocked'),
Site.getStatus = defineConstants(Site, markgettext('Deleted'), markgettext('Blocked'),
markgettext('Regular'), markgettext('Trusted'));
/**
* @function
* @returns {String[]}
* @see defineConstants
*/
Site.getModes = defineConstants(Site, markgettext('Deleted'),
markgettext('Closed'), markgettext('Restricted'),
Site.getModes = defineConstants(Site, markgettext('Closed'), markgettext('Restricted'),
markgettext('Public'), markgettext('Open'));
/**
* @function
* @returns {String[]}
* @see defineConstants
*/
Site.getPageModes = defineConstants(Site, markgettext('days') /* ,
markgettext('stories') */ );
Site.getPageModes = defineConstants(Site, markgettext('days')/*, markgettext('stories') */ );
/**
* @function
* @returns {String[]}
@ -98,13 +95,6 @@ Site.getNotificationModes = defineConstants(Site, markgettext('Nobody'),
Site.getCallbackModes = defineConstants(Site, markgettext('disabled'),
markgettext('enabled'));
/**
*
*/
Site.getDeletionDate = function() {
return new Date(Date.now() + Date.ONEDAY * 0);
};
/**
* @param {String} name A unique identifier also used in the URL of a site
* @param {String} title An arbitrary string branding a site
@ -225,7 +215,6 @@ Site.require = function(mode) {
* @property {String} commentMode The way comments of a site are displayed
* @property {Date} created The date and time of site creation
* @property {User} creator A reference to a user who created a site
* @property {Date} deleted
* @property {String} export
* @property {Files} files
* @property {Tags} galleries
@ -292,7 +281,7 @@ Site.prototype.getPermission = function(action) {
User.require(User.PRIVILEGED);
case 'delete':
return this !== root && this.getPermission('edit');
return this !== root && this.status !== Site.DELETED && this.getPermission('edit');
case 'edit':
case 'export':
@ -321,7 +310,7 @@ Site.prototype.main_action = function() {
schema: 'http://schema.org/WebSite',
title: this.getTitle(),
description: this.tagline || String.EMPTY,
body: this.renderSkinAsString(this.mode === Site.DELETED ? '$Site#deleted' : 'Site#main'),
body: this.renderSkinAsString('Site#main'),
images: [(this.layout.images.get('favicon') || Images.Default['favicon.png']).getUrl()],
links: this.renderSkinAsString('$Site#links')
});
@ -355,16 +344,15 @@ Site.prototype.delete_action = function () {
HopObject.prototype.delete_action.call(this);
} else {
// Otherwise, queue for deletion
this.deleted = Site.getDeletionDate();
this.mode = Site.DELETED;
res.message = gettext('The site {0} is queued for deletion.', this.name);
this.status = Site.DELETED;
res.message = gettext('The site {0} is being deleted.', this.name);
}
this.log(root, 'Deleted site ' + this.name);
res.redirect(this.href());
res.redirect(root.href());
} else {
HopObject.prototype.delete_action.call(this);
}
}
};
/**
*
@ -428,8 +416,10 @@ Site.prototype.getConfirmExtra = function () {
* @param {Object} data
*/
Site.prototype.update = function(data) {
if (this.mode !== data.mode) {
this.deleted = data.mode === Site.DELETED ? new Date() : null;
// Remove the corresponding job if site deletion is cancelled
if (this.job && this.status === Site.DELETED && this.status !== data.status) {
let job = new Admin.Job(this.job);
if (job.method === 'remove') job.remove();
}
data.maxImageWidth = Math.abs(data.maxImageWidth) || Infinity;

View file

@ -788,6 +788,6 @@ Story.prototype.markdown_filter = function (value, param) {
* @returns {String}
*/
Story.prototype.getConfirmText = function() {
return gettext("You are about to delete a story by user {0}.",
return gettext("You are about to delete a story by {0}.",
this.creator ? this.creator.name : 'null');
}

View file

@ -45,7 +45,7 @@
<% #edit %>
<h1><% response.title %></h1>
<div class='uk-article-meta'>
<% if <% user.status %> is 'deleted' then <% user.skin $User#deleted %> else <% user.skin $User#meta %> %>
<% if <% user.status %> is deleted then <% user.skin $User#deleted %> else <% user.skin $User#meta %> %>
</div>
<div class='uk-margin-top uk-margin-bottom'>
<% context.link timeline <% gettext Timeline %> %> |
@ -75,7 +75,7 @@
<div class='uk-form-row'>
<label class='uk-form-label' for='url'>
<% gettext "Personal URL" %>
<i class='uk-icon-info-circle uk-text-muted' title='<% gettext "If you enter a URL here your user name will appear as link next to your posted items." %>' data-uk-tooltip="{pos: 'right'}"></i>
<i class='uk-icon-info-circle uk-text-muted' title='<% gettext "If you enter a URL here your username will appear as link next to your posted items." %>' data-uk-tooltip="{pos: 'right'}"></i>
</label>
<div class='uk-form-controls'>
<% user.input url type=url class='uk-form uk-width-2-3' %>
@ -199,11 +199,9 @@
<% #deleted %>
<% if <% user.deleted %> is null then
<% gettext 'Deleted on {0}' <% user.created short %> %>
<% gettext 'Account is being deleted' %>
else
<% gettext 'Scheduled for deletion {0}' <% user.deleted | format expiry %>
suffix=<% context.link 'edit?undelete=1' <% gettext "Click to cancel deletion" prefix="<i class='uk-icon-times-circle uk-margin-small-left' data-uk-tooltip=\"{pos: 'right'}\" title='" suffix="'></i>" %> %>
%>
<% gettext 'Deleted on {0}' <% user.created short %> %>
%>
<% #notify_reset %>

View file

@ -71,7 +71,8 @@ User.remove = function() {
sql.execute("delete from metadata where parent_type = '$0' and parent_id in (select id from $1 where creator_id = $2)", type, table, id);
};
const getAnotherOwner = site => {
const getNewCreator = site => {
if (!site) return null;
const owners = site.members.owners;
if (owners.size() < 1) return null;
return owners.list().filter(owner => owner.name !== this.name)[0].creator;
@ -81,6 +82,7 @@ User.remove = function() {
const id = this._id;
app.log('Removing data from account #' + id);
sql.execute("delete from metadata where parent_type = 'User' and parent_id = $0", id);
// Remove sites
this.ownerships.forEach(function() {
@ -95,7 +97,7 @@ User.remove = function() {
sql.retrieve('select id from site where creator_id = $0', id);
sql.traverse(function() {
const site = Site.getById(this.id);
const creator = getAnotherOwner(site);
const creator = getNewCreator(site);
sql.execute('update site set creator_id = $0 where creator_id = $1', creator._id, id);
});
sql.execute('update site set modifier_id = creator_id where modifier_id = $0', id);
@ -124,8 +126,8 @@ User.remove = function() {
// Remove and re-assign files
sql.retrieve('select id from file where creator_id = $0', id);
sql.traverse(function() {
const file = File.getById(this.id);
app.log('Removing file #' + this.id + ' from file system');
const file = File.getById(this.id);
file.getFile().remove();
});
deleteMetadata('File', 'file', id);
@ -139,8 +141,8 @@ User.remove = function() {
if (image.parent_type === 'Layout') {
if (!image.parent) return;
// Instead of deleting, assign layout images to another site owner
const creator = getAnotherOwner(image.parent.site);
app.log('Assigning new creator: layout image #' + this.id);
const creator = getNewCreator(image.parent.site);
sql.execute('update image set creator_id = $0 where creator_id = $1', creator._id, id);
} else {
app.log('Removing image #' + this.id + ' from file system')
@ -155,9 +157,9 @@ User.remove = function() {
sql.retrieve('select id from skin where creator_id = $0', id);
sql.traverse(function() {
// Instead of deleting, assign skins to another site owner
const skin = Skin.getById(this.id);
const creator = getAnotherOwner(skin.layout.site);
app.log('Assigning new creator: skin #' + this.id);
const skin = Skin.getById(this.id);
const creator = getNewCreator(skin.layout.site);
sql.execute('update skin set creator_id = $0 where creator_id = $1', creator._id, id);
});
sql.execute('update skin set modifier_id = creator_id where modifier_id = $0', id);
@ -166,20 +168,18 @@ User.remove = function() {
sql.retrieve('select id from layout where creator_id = $0', id);
sql.traverse(function() {
// Instead of deleting, assign layouts to another site owner
const layout = Layout.getById(this.id);
const creator = getAnotherOwner(layout.site);
app.log('Assigning new creator: layout #' + this.id);
const layout = Layout.getById(this.id);
const creator = getNewCreator(layout.site);
sql.execute('update layout set creator_id = $0 where creator_id = $1', creator._id, id);
});
sql.execute('update layout set modifier_id = creator_id where modifier_id = $0', id);
app.clearCache();
this.deleted = null; // Work-around for persisting metadata (tried invalidate and clearCache to no avail)
this.deleted = new Date();
this.email = String.EMPTY;
// We gonna use the creation date as the deletion date from now on (until restoration of course)
this.created = this.modified = new Date();
return User.require(User.PRIVILEGED) ? this.href('edit') : root.href();
};
@ -226,7 +226,7 @@ User.register = function(data) {
} else if (data.name !== stripTags(data.name) || NAMEPATTERN.test(data.name)) {
throw Error(gettext('Please avoid special characters or HTML code in the name field.'));
} else if (data.name !== root.users.getAccessName(data.name)) {
throw Error(gettext('Sorry, the user name you entered already exists. Please enter a different one.'));
throw Error(gettext('Sorry, the username you entered already exists. Please enter a different one.'));
}
data.email && (data.email = data.email.trim());
@ -460,10 +460,6 @@ User.rename = function(currentName, newName) {
return currentName;
}
User.getDeletionDate = function() {
return new Date(Date.now() + Date.ONEDAY * 0);
};
/**
* A User object represents a login to Antville.
* @name User
@ -506,7 +502,7 @@ User.prototype.onLogout = function() { /* ... */ }
User.prototype.getPermission = function(action) {
switch (action) {
case 'delete':
return this.status !== User.PRIVILEGED && this.status !== User.DELETED && !this.deleted;
return this.status !== User.PRIVILEGED && this.status !== User.DELETED;
default:
return User.require(User.PRIVILEGED);
@ -514,15 +510,8 @@ User.prototype.getPermission = function(action) {
}
User.prototype.edit_action = function () {
console.log(this.countContributions());
if (!res.handlers.context) res.handlers.context = this;
if (req.data.undelete) {
this.deleted = null;
this.status = User.REGULAR;
res.redirect(res.handlers.context.href('edit'));
}
if (req.postParams.save) {
try {
this.update(req.postParams);
@ -532,8 +521,10 @@ User.prototype.edit_action = function () {
res.message = err.toString();
}
}
session.data.token = User.getSalt();
session.data.salt = this.salt;
res.data.title = this.name;
res.data.body = this.renderSkinAsString('$User#edit');
res.handlers.site.renderSkin('Site#page');
@ -614,18 +605,18 @@ User.prototype.delete_action = function() {
if (!res.handlers.context) res.handlers.context = this;
res.data.action = res.handlers.context.href(req.action);
if (req.postParams.proceed) {
this.hash = String.EMPTY;
this.status = User.DELETED;
this.deleted = null;
if (this.countContributions() < 1) {
// If an account contains no content, delete it immediately
HopObject.prototype.delete_action.call(this);
} else {
// Otherwise, queue for deletion
this.deleted = User.getDeletionDate();
this.status = User.DELETED;
res.message = gettext('The account {0} is being deleted.', this.name);
}
this.log(root, 'Deleted account ' + this.name);
res.redirect(res.handlers.context.href('edit'));
res.redirect(User.require(User.PRIVILEGED) ? res.handlers.context.href('edit') : root.href());
} else {
HopObject.prototype.delete_action.call(this);
}
@ -657,29 +648,40 @@ User.prototype.update = function(data) {
if (!data.hash && data.password) {
data.hash = (data.password + session.data.token).md5();
}
if (data.hash) {
this.hash = data.hash;
this.salt = session.data.token;
}
if (!(data.email = validateEmail(data.email))) {
throw Error(gettext('Please enter a valid e-mail address'));
}
if (data.url && !(data.url = validateUrl(data.url))) {
throw Error(gettext('Please enter a valid URL'));
}
if (this.getPermission('edit')) {
if (this.status === User.PRIVILEGED && data.status !== User.PRIVILEGED && root.admins.count() < 2) {
throw Error(gettext('You cannot revoke permissions from the only privileged user.'));
throw Error(gettext('You cannot revoke permissions from the only privileged account.'));
}
if (this.status === User.PRIVILEGED && data.status === User.DELETED) {
throw Error(gettext('You cannot delete a privileged user.'));
throw Error(gettext('You cannot delete a privileged account.'));
}
if (data.status !== this.status) {
this.deleted = data.status === User.DELETED ? User.getDeletionDate() : null;
// Remove the corresponding job if site deletion is cancelled
if (this.job && this.status === User.DELETED && this.status !== data.status) {
let job = new Admin.Job(this.job);
if (job.method === 'remove') job.remove();
this.deleted = null;
this.created = new Date();
}
this.status = data.status;
this.notes = data.notes;
}
this.email = data.email;
this.url = data.url;
if (this === session.user) this.touch();

View file

@ -17,7 +17,7 @@
Members.prototype.sendpwd_action = function() {
res.data.title = gettext("Recover your password");
res.data.body = gettext("Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.");
res.data.body = gettext("Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.");
res.data.body += "<p>" + gettext('If you should really have forgotten your password, you can use the <a href="{0}">password reset</a> option.',
this.href("reset")) + "</p>";
this._parent.renderSkin("Site#page");

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -18,6 +18,7 @@ global.messages['de-x-male'] = {
"Accept": "Akzeptieren",
"Account": "Konto",
"Account Image": "Kontobild",
"Account is being deleted": "Konto wird gelöscht",
"Accounts": "Konten",
"Activity": "Aktivität",
"Add Choice": "Antwortmöglichkeit hinzufügen",
@ -51,7 +52,6 @@ global.messages['de-x-male'] = {
"Blocked": "Gesperrt",
"Bookmarklet": "Bookmarklet",
"Both": "Beides",
"Browse": "Blättern",
"Build": "Gestalt",
"Cache": "Zwischenspeicher",
"Callback URL": "Rückruf-Adresse",
@ -60,7 +60,6 @@ global.messages['de-x-male'] = {
"Choice": "Antwortmöglichkeit",
"Choices": "Antwortmöglichkeiten",
"Claustra": "Claustra",
"Click to cancel deletion": "Löschauftrag widerrufen",
"Click “Cancel” now if you are not really sure you want to proceed.": "Klicken Sie jetzt auf »Abbrechen«, falls Sie nicht sicher sind, ob Sie fortfahren möchten.",
"Close": "Schließen",
"Closed": "Geschlossen",
@ -105,7 +104,6 @@ global.messages['de-x-male'] = {
"Date string in Unix timestamp format": "Datum im Unix-Format",
"Delete": "Löschen",
"Deleted": "Gelöscht",
"Deleted Site": "Gelöschte Site",
"Deleted on {0}": "Gelöscht am {0}",
"Description": "Beschreibung",
"Details": "Einzelheiten",
@ -119,7 +117,7 @@ global.messages['de-x-male'] = {
"Display": "Anzeige",
"Do Androids dream of electric sheep?": "Zählen Androiden elektrische Schäfchen?",
"Drag to Bookmarks Bar": "In die Lesezeichenleiste ziehen",
"Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.",
"Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.",
"E-mail": "E-Mail",
"E.g. if you enter <em>{0}</em> here your site will be reachable via {1}": "Wenn Sie z.B. <em>{0}</em> als Name eingeben, wird die Website unter dieser Adresse erreichbar sein: {1}",
"Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL on a server and in a programming language of their choice.": "Jede Antville-Site bietet in den Einstellungen die Möglichkeit, eine Rückruf-Adresse zu definieren, die bei jeder Änderung des Inhalts aufgerufen wird. Auf diese Weise können Benutzer mittels eigenem Programmcode verschiedene Ereignisse individuell behandeln auf einem Server und in einer Programmiersprache ihrer Wahl.",
@ -162,7 +160,7 @@ global.messages['de-x-male'] = {
"I understand and accept the {0}terms and conditions{1}": "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}",
"If the user did not include contact information in the message itself, you can send your reply via the users contact form [2].": "Falls der Absender der Nachricht keine Kontaktinformationen hinzugefügt hat, können Sie Ihre Antwort über das Kontaktformular senden [2].",
"If you do not specify a name Antville will create one based on the filename.": "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des Dateinamens erstellen.",
"If you enter a URL here your user name will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.",
"If you enter a URL here your username will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.",
"If you should really have forgotten your password, you can use the <a href=\"{0}\">password reset</a> option.": "Falls Sie Ihr Kennwort vergessen haben sollten, können Sie es <a href=\"{0}\">zurücksetzen lassen</a>.",
"If you think you have received this e-mail in error please contact the maintainer of the site.": "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte Verbindung mit dem Eigentümer der Website auf.",
"If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "Sollten Sie die Bildgröße verkleinern wollen, geben Sie bitte die gewünschte Maximalbreite und/oder -höhe in Pixel an. Falls Sie beides angeben, wird versucht beide Angaben zu erfüllen, das Seitenverhältnis wird aber beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, erstellt Antville außerdem automatisch ein Miniaturbild davon.",
@ -244,7 +242,7 @@ global.messages['de-x-male'] = {
"Please enter a new name for this tag": "Bitte geben Sie einen neuen Namen für dieses Stichwort an",
"Please enter a new password.": "Bitte geben Sie ein neues Kennwort ein.",
"Please enter a query in the search form.": "Bitte geben Sie eine Suchanfrage in das Suchformular ein.",
"Please enter a user name and e-mail address.": "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein.",
"Please enter a username and e-mail address.": "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein.",
"Please enter a username.": "Bitte geben Sie einen Namen ein.",
"Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein",
"Please enter a valid e-mail address": "Bitte geben Sie eine gültige E-Mail-Adresse an",
@ -300,9 +298,9 @@ global.messages['de-x-male'] = {
"Running Polls": "Laufende Umfragen",
"Save": "Speichern",
"Save and Run": "Speichern und starten",
"Scheduled for deletion {0}": "Zur Löschung {0} vorgesehen",
"Search": "Suche",
"Search with {0}": "Mit {0} suchen",
"Select": "Auswählen",
"Send": "Senden",
"Send Request": "Anfrage senden",
"Separated by commas": "Durch Komma getrennt",
@ -327,11 +325,11 @@ global.messages['de-x-male'] = {
"Sorry!": "Hoppla!",
"Sorry, logging in is currently not possible.": "Die Anmeldung ist derzeit leider nicht möglich.",
"Sorry, the file exceeds the maximum upload limit of {0} kB.": "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB.",
"Sorry, the user name you entered already exists. Please enter a different one.": "Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie einen anderslautenden Namen ein.",
"Sorry, the username you entered already exists. Please enter a different one.": "Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto registriert. Bitte geben Sie einen anderslautenden Namen ein.",
"Sorry, the username you entered is too long. Please choose a shorter one.": "Leider ist der von Ihnen eingegebene Name zu lang. Bitte geben Sie einen kürzeren ein.",
"Sorry, there is no disk space left. Please try to delete some files or images first.": "Es ist leider kein Speicherplatz mehr frei. Bitte löschen Sie zuerst einige Dateien oder Bilder.",
"Sorry, this layout is not compatible with Antville.": "Leider funktioniert das Layout nicht mit dieser Antville-Installation.",
"Sorry, your input did not match any registered user.": "Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben.",
"Sorry, your input did not match any registered account.": "Leider ist unter diesem Namen kein Konto registriert.",
"Source: {0}": "Quelle: {0}",
"Start": "Start",
"Start Page": "Startseite",
@ -366,7 +364,7 @@ global.messages['de-x-male'] = {
"The URL endpoint for each of these APIs is located at": "Die Internet-Adresse für jede dieser Schnittstellen lautet",
"The account data will be available for download from here within the next days.": "Die Kontodaten stehen demnächst hier zum Download bereit.",
"The account is queued for export.": "Der Export der Kontodaten wird vorbereitet.",
"The account {0} is queued for deletion.": "Das Konto {0} ist zur Löschung vorgesehen.",
"The account {0} is being deleted.": "Das Konto {0} wird gelöscht.",
"The callback URL will be invoked as an HTTP POST request with the following parameters:": "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-Methode aufgerufen:",
"The changes were saved successfully.": "Die Änderungen wurden erfolgreich gespeichert.",
"The chosen name is too long. Please enter a shorter one.": "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein.",
@ -382,13 +380,13 @@ global.messages['de-x-male'] = {
"The path you requested was not found.": "Der angeforderte Pfad wurde nicht gefunden.",
"The poll was created successfully.": "Die Umfrage wurde erfolgreich erstellt.",
"The poll was updated successfully.": "Die Umfrage wurde erfolgreich aktualisiert.",
"The site data will be available for download from here, soon.": "Der Site-Export steh demnächst hier zum Download bereit.",
"The site data will be available for download from here, soon.": "Der Site-Export steht demnächst hier zum Download bereit.",
"The site is queued for export.": "Der Export der Site-Daten wird vorbereitet.",
"The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.": "Der Import der Datei {0} ist vorgesehen. Die eingelesenen Daten sind innerhalb von 24 Stunden verfügbar.",
"The site you requested has been blocked.": "Die von Ihnen angeforderte Website ist gesperrt.",
"The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "Die Website {0} unter {1} wird in {2} gesperrt werden, weil sie schon für zu lange Zeit eingeschränkt ist.",
"The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "Die Website {0} unter {1} wird in {2} gelöscht werden, weil sie verlassen zu sein scheint.",
"The site {0} is queued for deletion.": "Die Website {0} ist zur Löschung vorgesehen.",
"The site {0} is being deleted.": "Die Website {0} wird gelöscht.",
"The story is {0} and {1}": "Der Beitrag ist {0} und {1}",
"The story was successfully created.": "Der Beitrag wurde erfolgreich erstellt.",
"The story was successfully updated.": "Der Beitrag wurde erfolgreich aktualisiert.",
@ -412,7 +410,6 @@ global.messages['de-x-male'] = {
"This message was sent to you by the user {0} of the site {1} [1].": "Diese Nachricht wurde Ihnen von {0} über die Website {1} gesendet [1].",
"This poll was closed {0} by {1}": "Diese Umfrage wurde {0} von {1} beendet",
"This site is currently {0}.": "Die Website ist derzeit {0}.",
"This site is going to be deleted completely and irreversibly {0}.": "Diese Website wird {0} vollständig und unwiderruflich gelöscht.",
"This skin contains additional JavaScript code that will be included in every page.": "Dieser Skin enthält zusätzlichen JavaScript-Code, der in jeder Seite eingebettet wird.",
"This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "Dieser Skin enthält Stilvorlagen, z.B. für Schriftarten und -größen oder Farben. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.",
"This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "Dieser Skin bestimmt die grundlegende Struktur Ihrer Website. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.",
@ -443,7 +440,8 @@ global.messages['de-x-male'] = {
"Updates": "Letzte Änderungen",
"Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Laden Sie ein mit Antville 1.1 erstelltes Layout-Archiv (ZIP-Datei) hoch, um es in ein mit Antville 1.2 kompatibles Archiv umzuwandeln.",
"Uptime": "Betriebszeit",
"User name and e-mail address do not match.": "Es existiert kein Konto für die angegebene Kombination aus Name und E-Mail-Adresse.",
"User": "Konto",
"Username and e-mail address do not match.": "Für die angegebene Kombination aus Name und E-Mail-Adresse ist kein Konto registriert.",
"Version": "Version",
"Via": "Via",
"Vote": "Abstimmen",
@ -459,14 +457,14 @@ global.messages['de-x-male'] = {
"Yes, really erase {0} comment": "Ja, {0} Kommentar soll wirklich gelöscht werden",
"Yes, really erase {0} comments": "Ja, {0} Kommentare sollen wirklich gelöscht werden",
"You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "Sie (oder jemand, der sich für Sie ausgibt) hat beantragt, Ihr Kennwort für die Website {0} unter {1} zurückzusetzen.",
"You are about to delete a comment by user {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.",
"You are about to delete a comment by {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.",
"You are about to delete a comment thread consisting of {0} postings.": "Sie sind im Begriff, einen Diskussionsstrang von {0} Kommentaren zu löschen.",
"You are about to delete a poll by user {0}.": "Sie sind im Begriff, eine Umfrage von {0} zu löschen.",
"You are about to delete a story by user {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.",
"You are about to delete a story by {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.",
"You are about to delete the account {0}.": "Sie sind im Begriff, das Konto {0} zu löschen.",
"You are about to delete the file {0}.": "Sie sind im Begriff, die Datei {0} zu löschen.",
"You are about to delete the image {0}.": "Sie sind im Begriff, das Bild {0} zu löschen.",
"You are about to delete the membership of user {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.",
"You are about to delete the membership of {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.",
"You are about to delete the site {0}.": "Sie sind im Begriff, die Website {0} zu löschen.",
"You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "Sie sind im Begriff, das komplette Konto zu löschen, das zur Zeit {0}, {1}, {2}, {3}, {4} und {5} umfasst.",
"You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "Sie sind im Begriff, die komplette Website zu löschen, die zur Zeit {0}, {1}, {2}, {3} und {4} umfasst.",
@ -482,18 +480,17 @@ global.messages['de-x-male'] = {
"You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Name oder E-Mail-Adresse bearbeiten. Benutzen Sie den Asterisk * als Platzhalter.",
"You can filter the results by site name. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Website-Namen filtern. Verwenden sie den Asterisk * als Platzhalter.",
"You can use the asterisk * as wildcard.": "Sie können den Asterisk * als Platzhalter verwenden.",
"You cannot delete a privileged user.": "Ein privilegiertes Konto kann nicht gelöscht werden.",
"You cannot revoke permissions from the only privileged user.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.",
"You cannot delete a privileged account.": "Ein privilegiertes Konto kann nicht gelöscht werden.",
"You cannot revoke permissions from the only privileged account.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.",
"You denied the request.": "Sie haben die Anfrage abgelehnt.",
"You did not vote, yet. You can vote until the poll is closed.": "Sie haben noch nicht abgestimmt. Sie können abstimmen, bis die Umfrage beendet ist.",
"You need to wait {0} before you are allowed to create a new site.": "Sie müssen {0} warten, bevor Sie eine neue Website erstellen können.",
"You still can revert the request for deletion in the {0}site settings{1}.": "Sie können den Löschauftrag in den {0}Site-Einstellungen{1} widerrufen.",
"You will then be asked to change your password.": "Sie werden dann gebeten, Ihr Kennwort zu ändern.",
"Your account has been blocked.": "Ihr Konto wurde gesperrt.",
"Your message was sent successfully.": "Ihre Nachricht wurde erfolgreich gesendet.",
"Your password was changed.": "Ihr Kennwort wurde geändert.",
"[{0}] Message from anonymous user": "[{0}] Nachricht von unbekanntem Absender",
"[{0}] Message from user {1}": "[{0}] Nachricht von {1}",
"[{0}] Message from anonymous": "[{0}] Nachricht von unbekanntem Absender",
"[{0}] Message from {1}": "[{0}] Nachricht von {1}",
"[{0}] Notification of membership cancellation": "[{0}] Benachrichtigung über Beendigung der Mitgliedschaft",
"[{0}] Notification of membership change": "[{0}] Benachrichtigung über Änderung der Mitgliedschaft",
"[{0}] Notification of site changes": "[{0}] Benachrichtigung über Änderung der Website",

View file

@ -18,6 +18,7 @@ global.messages['de'] = {
"Accept": "Akzeptieren",
"Account": "Konto",
"Account Image": "Kontobild",
"Account is being deleted": "Konto wird gelöscht",
"Accounts": "Konten",
"Activity": "Aktivität",
"Add Choice": "Antwortmöglichkeit hinzufügen",
@ -51,7 +52,6 @@ global.messages['de'] = {
"Blocked": "Gesperrt",
"Bookmarklet": "Bookmarklet",
"Both": "Beides",
"Browse": "Blättern",
"Build": "Gestalt",
"Cache": "Zwischenspeicher",
"Callback URL": "Rückruf-Adresse",
@ -60,7 +60,6 @@ global.messages['de'] = {
"Choice": "Antwortmöglichkeit",
"Choices": "Antwortmöglichkeiten",
"Claustra": "Claustra",
"Click to cancel deletion": "Löschauftrag widerrufen",
"Click “Cancel” now if you are not really sure you want to proceed.": "Klicken Sie jetzt auf »Abbrechen«, falls Sie nicht sicher sind, ob Sie fortfahren möchten.",
"Close": "Schließen",
"Closed": "Geschlossen",
@ -105,7 +104,6 @@ global.messages['de'] = {
"Date string in Unix timestamp format": "Datum im Unix-Format",
"Delete": "Löschen",
"Deleted": "Gelöscht",
"Deleted Site": "Gelöschte Site",
"Deleted on {0}": "Gelöscht am {0}",
"Description": "Beschreibung",
"Details": "Einzelheiten",
@ -119,7 +117,7 @@ global.messages['de'] = {
"Display": "Anzeige",
"Do Androids dream of electric sheep?": "Zählen Androiden elektrische Schäfchen?",
"Drag to Bookmarks Bar": "In die Lesezeichenleiste ziehen",
"Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.",
"Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Aus Sicherheitsgründen werden Kennwörter nicht mehr in der Antville-Datenbank gespeichert. Daher kann Ihnen Ihr Kennwort nicht zugesendet werden.",
"E-mail": "E-Mail",
"E.g. if you enter <em>{0}</em> here your site will be reachable via {1}": "Wenn Sie z.B. <em>{0}</em> als Name eingeben, wird die Website unter dieser Adresse erreichbar sein: {1}",
"Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL on a server and in a programming language of their choice.": "Jede Antville-Site bietet in den Einstellungen die Möglichkeit, eine Rückruf-Adresse zu definieren, die bei jeder Änderung des Inhalts aufgerufen wird. Auf diese Weise können Benutzerinnen mittels eigenem Programmcode verschiedene Ereignisse individuell behandeln auf einem Server und in einer Programmiersprache ihrer Wahl.",
@ -162,7 +160,7 @@ global.messages['de'] = {
"I understand and accept the {0}terms and conditions{1}": "Ich verstehe und akzeptiere die {0}Nutzungsbedingungen{1}",
"If the user did not include contact information in the message itself, you can send your reply via the users contact form [2].": "Falls die Absenderin der Nachricht keine Kontaktinformationen hinzugefügt hat, können Sie Ihre Antwort über das Kontaktformular senden [2].",
"If you do not specify a name Antville will create one based on the filename.": "Falls Sie keinen Namen angeben, wird Antville automatisch einen anhand des Dateinamens erstellen.",
"If you enter a URL here your user name will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.",
"If you enter a URL here your username will appear as link next to your posted items.": "Falls Sie hier eine Internet-Adresse angeben, wird Ihr Kontoname damit verlinkt neben den von Ihnen veröffentlichten Inhalten erscheinen.",
"If you should really have forgotten your password, you can use the <a href=\"{0}\">password reset</a> option.": "Falls Sie Ihr Kennwort vergessen haben sollten, können Sie es <a href=\"{0}\">zurücksetzen lassen</a>.",
"If you think you have received this e-mail in error please contact the maintainer of the site.": "Sollten Sie diese Nachricht irrtümlich erhalten haben, nehmen Sie bitte Verbindung mit der Eigentümerin der Website auf.",
"If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "Sollten Sie die Bildgröße verkleinern wollen, geben Sie bitte die gewünschte Maximalbreite und/oder -höhe in Pixel an. Falls Sie beides angeben, wird versucht beide Angaben zu erfüllen, das Seitenverhältnis wird aber beibehalten. Falls die Breite oder Höhe des Bildes 100 Pixel überschreitet, erstellt Antville außerdem automatisch ein Miniaturbild davon.",
@ -244,7 +242,7 @@ global.messages['de'] = {
"Please enter a new name for this tag": "Bitte geben Sie einen neuen Namen für dieses Stichwort an",
"Please enter a new password.": "Bitte geben Sie ein neues Kennwort ein.",
"Please enter a query in the search form.": "Bitte geben Sie eine Suchanfrage in das Suchformular ein.",
"Please enter a user name and e-mail address.": "Bitte geben Sie einen Namen und eine E-Mail-Adresse ein.",
"Please enter a username and e-mail address.": "Bitte geben Sie einen Kontonamen und eine E-Mail-Adresse ein.",
"Please enter a username.": "Bitte geben Sie einen Namen ein.",
"Please enter a valid URL": "Bitte geben Sie eine gültige Internet-Adresse ein",
"Please enter a valid e-mail address": "Bitte geben Sie eine gültige E-Mail-Adresse an",
@ -300,9 +298,9 @@ global.messages['de'] = {
"Running Polls": "Laufende Umfragen",
"Save": "Speichern",
"Save and Run": "Speichern und starten",
"Scheduled for deletion {0}": "Zur Löschung {0} vorgesehen",
"Search": "Suche",
"Search with {0}": "Mit {0} suchen",
"Select": "Auswählen",
"Send": "Senden",
"Send Request": "Anfrage senden",
"Separated by commas": "Durch Komma getrennt",
@ -327,11 +325,11 @@ global.messages['de'] = {
"Sorry!": "Hoppla!",
"Sorry, logging in is currently not possible.": "Die Anmeldung ist derzeit leider nicht möglich.",
"Sorry, the file exceeds the maximum upload limit of {0} kB.": "Leider überschreitet die Datei die maximal erlaubte Größe von {0} kB.",
"Sorry, the user name you entered already exists. Please enter a different one.": "Leider ist das von Ihnen gewünschte Konto bereits vorhanden. Bitte geben Sie einen anderslautenden Namen ein.",
"Sorry, the username you entered already exists. Please enter a different one.": "Leider ist unter dem von Ihnen gewünschten Namen bereits ein Konto registriert. Bitte geben Sie einen anderslautenden Namen ein.",
"Sorry, the username you entered is too long. Please choose a shorter one.": "Leider ist der von Ihnen eingegebene Name zu lang. Bitte geben Sie einen kürzeren ein.",
"Sorry, there is no disk space left. Please try to delete some files or images first.": "Es ist leider kein Speicherplatz mehr frei. Bitte löschen Sie zuerst einige Dateien oder Bilder.",
"Sorry, this layout is not compatible with Antville.": "Leider funktioniert das Layout nicht mit dieser Antville-Installation.",
"Sorry, your input did not match any registered user.": "Leider hat Ihre Eingabe keine Treffer bei den vorhandenen Konten ergeben.",
"Sorry, your input did not match any registered account.": "Leider ist unter diesem Namen kein Konto registriert.",
"Source: {0}": "Quelle: {0}",
"Start": "Start",
"Start Page": "Startseite",
@ -366,7 +364,7 @@ global.messages['de'] = {
"The URL endpoint for each of these APIs is located at": "Die Internet-Adresse für jede dieser Schnittstellen lautet",
"The account data will be available for download from here within the next days.": "Die Kontodaten stehen demnächst hier zum Download bereit.",
"The account is queued for export.": "Der Export der Kontodaten wird vorbereitet.",
"The account {0} is queued for deletion.": "Das Konto {0} ist zur Löschung vorgesehen.",
"The account {0} is being deleted.": "Das Konto {0} wird gelöscht.",
"The callback URL will be invoked as an HTTP POST request with the following parameters:": "Die Rückruf-Adresse wird mit folgenden Parametern durch die »HTTP Post«-Methode aufgerufen:",
"The changes were saved successfully.": "Die Änderungen wurden erfolgreich gespeichert.",
"The chosen name is too long. Please enter a shorter one.": "Der gewählte Name ist zu lang. Bitte geben Sie einen kürzeren ein.",
@ -382,13 +380,13 @@ global.messages['de'] = {
"The path you requested was not found.": "Der angeforderte Pfad wurde nicht gefunden.",
"The poll was created successfully.": "Die Umfrage wurde erfolgreich erstellt.",
"The poll was updated successfully.": "Die Umfrage wurde erfolgreich aktualisiert.",
"The site data will be available for download from here, soon.": "Der Site-Export steh demnächst hier zum Download bereit.",
"The site data will be available for download from here, soon.": "Der Site-Export steht demnächst hier zum Download bereit.",
"The site is queued for export.": "Der Export der Site-Daten wird vorbereitet.",
"The site is scheduled for importing the file {0}. The imported site data will be available within 24 hours.": "Der Import der Datei {0} ist vorgesehen. Die eingelesenen Daten sind innerhalb von 24 Stunden verfügbar.",
"The site you requested has been blocked.": "Die von Ihnen angeforderte Website ist gesperrt.",
"The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "Die Website {0} unter {1} wird in {2} gesperrt werden, weil sie schon für zu lange Zeit eingeschränkt ist.",
"The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "Die Website {0} unter {1} wird in {2} gelöscht werden, weil sie verlassen zu sein scheint.",
"The site {0} is queued for deletion.": "Die Website {0} ist zur Löschung vorgesehen.",
"The site {0} is being deleted.": "Die Website {0} wird gelöscht.",
"The story is {0} and {1}": "Der Beitrag ist {0} und {1}",
"The story was successfully created.": "Der Beitrag wurde erfolgreich erstellt.",
"The story was successfully updated.": "Der Beitrag wurde erfolgreich aktualisiert.",
@ -412,7 +410,6 @@ global.messages['de'] = {
"This message was sent to you by the user {0} of the site {1} [1].": "Diese Nachricht wurde Ihnen von {0} über die Website {1} gesendet [1].",
"This poll was closed {0} by {1}": "Diese Umfrage wurde {0} von {1} beendet",
"This site is currently {0}.": "Die Website ist derzeit {0}.",
"This site is going to be deleted completely and irreversibly {0}.": "Diese Website wird {0} vollständig und unwiderruflich gelöscht.",
"This skin contains additional JavaScript code that will be included in every page.": "Dieser Skin enthält zusätzlichen JavaScript-Code, der in jeder Seite eingebettet wird.",
"This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "Dieser Skin enthält Stilvorlagen, z.B. für Schriftarten und -größen oder Farben. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.",
"This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "Dieser Skin bestimmt die grundlegende Struktur Ihrer Website. Änderungen an diesem Skin beeinflussen das allgemeine Erscheinungsbild Ihrer Website.",
@ -443,7 +440,8 @@ global.messages['de'] = {
"Updates": "Letzte Änderungen",
"Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Laden Sie ein mit Antville 1.1 erstelltes Layout-Archiv (ZIP-Datei) hoch, um es in ein mit Antville 1.2 kompatibles Archiv umzuwandeln.",
"Uptime": "Betriebszeit",
"User name and e-mail address do not match.": "Es existiert kein Konto für die angegebene Kombination aus Name und E-Mail-Adresse.",
"User": "Konto",
"Username and e-mail address do not match.": "Für die angegebene Kombination aus Name und E-Mail-Adresse ist kein Konto registriert.",
"Version": "Version",
"Via": "Via",
"Vote": "Abstimmen",
@ -459,14 +457,14 @@ global.messages['de'] = {
"Yes, really erase {0} comment": "Ja, {0} Kommentar soll wirklich gelöscht werden",
"Yes, really erase {0} comments": "Ja, {0} Kommentare sollen wirklich gelöscht werden",
"You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "Sie (oder jemand, der sich für Sie ausgibt) hat beantragt, Ihr Kennwort für die Website {0} unter {1} zurückzusetzen.",
"You are about to delete a comment by user {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.",
"You are about to delete a comment by {0}.": "Sie sind im Begriff, einen Kommentar von {0} zu löschen.",
"You are about to delete a comment thread consisting of {0} postings.": "Sie sind im Begriff, einen Diskussionsstrang von {0} Kommentaren zu löschen.",
"You are about to delete a poll by user {0}.": "Sie sind im Begriff, eine Umfrage von {0} zu löschen.",
"You are about to delete a story by user {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.",
"You are about to delete a story by {0}.": "Sie sind im Begriff, einen Beitrag von {0} zu löschen.",
"You are about to delete the account {0}.": "Sie sind im Begriff, das Konto {0} zu löschen.",
"You are about to delete the file {0}.": "Sie sind im Begriff, die Datei {0} zu löschen.",
"You are about to delete the image {0}.": "Sie sind im Begriff, das Bild {0} zu löschen.",
"You are about to delete the membership of user {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.",
"You are about to delete the membership of {0}.": "Sie sind im Begriff, die Mitgliedschaft von {0} zu löschen.",
"You are about to delete the site {0}.": "Sie sind im Begriff, die Website {0} zu löschen.",
"You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "Sie sind im Begriff, das komplette Konto zu löschen, das zur Zeit {0}, {1}, {2}, {3}, {4} und {5} umfasst.",
"You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "Sie sind im Begriff, die komplette Website zu löschen, die zur Zeit {0}, {1}, {2}, {3} und {4} umfasst.",
@ -482,18 +480,17 @@ global.messages['de'] = {
"You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Name oder E-Mail-Adresse bearbeiten. Benutzen Sie den Asterisk * als Platzhalter.",
"You can filter the results by site name. Use the asterisk * as wildcard.": "Sie können die Ergebnisse nach Website-Namen filtern. Verwenden sie den Asterisk * als Platzhalter.",
"You can use the asterisk * as wildcard.": "Sie können den Asterisk * als Platzhalter verwenden.",
"You cannot delete a privileged user.": "Ein privilegiertes Konto kann nicht gelöscht werden.",
"You cannot revoke permissions from the only privileged user.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.",
"You cannot delete a privileged account.": "Ein privilegiertes Konto kann nicht gelöscht werden.",
"You cannot revoke permissions from the only privileged account.": "Sie können keine Berechtigungen vom einzigen privilegierten Konto entfernen.",
"You denied the request.": "Sie haben die Anfrage abgelehnt.",
"You did not vote, yet. You can vote until the poll is closed.": "Sie haben noch nicht abgestimmt. Sie können abstimmen, bis die Umfrage beendet ist.",
"You need to wait {0} before you are allowed to create a new site.": "Sie müssen {0} warten, bevor Sie eine neue Website erstellen können.",
"You still can revert the request for deletion in the {0}site settings{1}.": "Sie können den Löschauftrag in den {0}Site-Einstellungen{1} widerrufen.",
"You will then be asked to change your password.": "Sie werden dann gebeten, Ihr Kennwort zu ändern.",
"Your account has been blocked.": "Ihr Konto wurde gesperrt.",
"Your message was sent successfully.": "Ihre Nachricht wurde erfolgreich gesendet.",
"Your password was changed.": "Ihr Kennwort wurde geändert.",
"[{0}] Message from anonymous user": "[{0}] Nachricht von unbekannter Absenderin",
"[{0}] Message from user {1}": "[{0}] Nachricht von {1}",
"[{0}] Message from anonymous": "[{0}] Nachricht von unbekannter Absenderin",
"[{0}] Message from {1}": "[{0}] Nachricht von {1}",
"[{0}] Notification of membership cancellation": "[{0}] Benachrichtigung über Beendigung der Mitgliedschaft",
"[{0}] Notification of membership change": "[{0}] Benachrichtigung über Änderung der Mitgliedschaft",
"[{0}] Notification of site changes": "[{0}] Benachrichtigung über Änderung der Website",

View file

@ -18,6 +18,7 @@ global.messages['en'] = {
"Accept": "Accept",
"Account": "Account",
"Account Image": "Account Image",
"Account is being deleted": "Account is being deleted",
"Accounts": "Accounts",
"Activity": "Activity",
"Add Choice": "Add Choice",
@ -51,7 +52,6 @@ global.messages['en'] = {
"Blocked": "Blocked",
"Bookmarklet": "Bookmarklet",
"Both": "Both",
"Browse": "Browse",
"Build": "Build",
"Cache": "Cache",
"Callback URL": "Callback URL",
@ -60,7 +60,6 @@ global.messages['en'] = {
"Choice": "Choice",
"Choices": "Choices",
"Claustra": "Claustra",
"Click to cancel deletion": "Click to cancel deletion",
"Click “Cancel” now if you are not really sure you want to proceed.": "Click “Cancel” now if you are not really sure you want to proceed.",
"Close": "Close",
"Closed": "Closed",
@ -105,7 +104,6 @@ global.messages['en'] = {
"Date string in Unix timestamp format": "Date string in Unix timestamp format",
"Delete": "Delete",
"Deleted": "Deleted",
"Deleted Site": "Deleted Site",
"Deleted on {0}": "Deleted on {0}",
"Description": "Description",
"Details": "Details",
@ -119,7 +117,7 @@ global.messages['en'] = {
"Display": "Display",
"Do Androids dream of electric sheep?": "Do Androids dream of electric sheep?",
"Drag to Bookmarks Bar": "Drag to Bookmarks Bar",
"Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Due to security reasons user passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.",
"Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.": "Due to security reasons passwords are not stored in the Antville database any longer. Thus, your password cannot be sent to you, anymore.",
"E-mail": "E-mail",
"E.g. if you enter <em>{0}</em> here your site will be reachable via {1}": "E.g. if you enter <em>{0}</em> here your site will be reachable via {1}",
"Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL on a server and in a programming language of their choice.": "Each Antville site provides a setting to define a callback URL that will be invoked each time the site content has changed. This way users can define custom handlers for different site events with their own code running behind this URL on a server and in a programming language of their choice.",
@ -162,7 +160,7 @@ global.messages['en'] = {
"I understand and accept the {0}terms and conditions{1}": "I understand and accept the {0}terms and conditions{1}",
"If the user did not include contact information in the message itself, you can send your reply via the users contact form [2].": "If the user did not include contact information in the message itself, you can send your reply via the users contact form [2].",
"If you do not specify a name Antville will create one based on the filename.": "If you do not specify a name Antville will create one based on the filename.",
"If you enter a URL here your user name will appear as link next to your posted items.": "If you enter a URL here your user name will appear as link next to your posted items.",
"If you enter a URL here your username will appear as link next to your posted items.": "If you enter a URL here your username will appear as link next to your posted items.",
"If you should really have forgotten your password, you can use the <a href=\"{0}\">password reset</a> option.": "If you should really have forgotten your password, you can use the <a href=\"{0}\">password reset</a> option.",
"If you think you have received this e-mail in error please contact the maintainer of the site.": "If you think you have received this e-mail in error please contact the maintainer of the site.",
"If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.": "If you want to resize the image please specify your desired maximum width and/or maximum height in pixels. If you specify both the image will be resized to match both criterias, but the image ratio will be preserved. If the width or height of your image exceeds 100 pixels Antville automatically creates a thumbnail of it, too.",
@ -244,7 +242,7 @@ global.messages['en'] = {
"Please enter a new name for this tag": "Please enter a new name for this tag",
"Please enter a new password.": "Please enter a new password.",
"Please enter a query in the search form.": "Please enter a query in the search form.",
"Please enter a user name and e-mail address.": "Please enter a user name and e-mail address.",
"Please enter a username and e-mail address.": "Please enter a username and e-mail address.",
"Please enter a username.": "Please enter a username.",
"Please enter a valid URL": "Please enter a valid URL",
"Please enter a valid e-mail address": "Please enter a valid e-mail address",
@ -300,9 +298,9 @@ global.messages['en'] = {
"Running Polls": "Running Polls",
"Save": "Save",
"Save and Run": "Save and Run",
"Scheduled for deletion {0}": "Scheduled for deletion {0}",
"Search": "Search",
"Search with {0}": "Search with {0}",
"Select": "Select",
"Send": "Send",
"Send Request": "Send Request",
"Separated by commas": "Separated by commas",
@ -327,11 +325,11 @@ global.messages['en'] = {
"Sorry!": "Sorry!",
"Sorry, logging in is currently not possible.": "Sorry, logging in is currently not possible.",
"Sorry, the file exceeds the maximum upload limit of {0} kB.": "Sorry, the file exceeds the maximum upload limit of {0} kB.",
"Sorry, the user name you entered already exists. Please enter a different one.": "Sorry, the user name you entered already exists. Please enter a different one.",
"Sorry, the username you entered already exists. Please enter a different one.": "Sorry, the username you entered already exists. Please enter a different one.",
"Sorry, the username you entered is too long. Please choose a shorter one.": "Sorry, the username you entered is too long. Please choose a shorter one.",
"Sorry, there is no disk space left. Please try to delete some files or images first.": "Sorry, there is no disk space left. Please try to delete some files or images first.",
"Sorry, this layout is not compatible with Antville.": "Sorry, this layout is not compatible with Antville.",
"Sorry, your input did not match any registered user.": "Sorry, your input did not match any registered user.",
"Sorry, your input did not match any registered account.": "Sorry, your input did not match any registered account.",
"Source: {0}": "Source: {0}",
"Start": "Start",
"Start Page": "Start Page",
@ -366,7 +364,7 @@ global.messages['en'] = {
"The URL endpoint for each of these APIs is located at": "The URL endpoint for each of these APIs is located at",
"The account data will be available for download from here within the next days.": "The account data will be available for download from here within the next days.",
"The account is queued for export.": "The account is queued for export.",
"The account {0} is queued for deletion.": "The account {0} is queued for deletion.",
"The account {0} is being deleted.": "The account {0} is being deleted.",
"The callback URL will be invoked as an HTTP POST request with the following parameters:": "The callback URL will be invoked as an HTTP POST request with the following parameters:",
"The changes were saved successfully.": "The changes were saved successfully.",
"The chosen name is too long. Please enter a shorter one.": "The chosen name is too long. Please enter a shorter one.",
@ -388,7 +386,7 @@ global.messages['en'] = {
"The site you requested has been blocked.": "The site you requested has been blocked.",
"The site {0} at {1} will be blocked in {2} because it is being restricted for too long.": "The site {0} at {1} will be blocked in {2} because it is being restricted for too long.",
"The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.": "The site {0} at {1} will be deleted in {2} because it has been considered as abandoned.",
"The site {0} is queued for deletion.": "The site {0} is queued for deletion.",
"The site {0} is being deleted.": "The site {0} is being deleted.",
"The story is {0} and {1}": "The story is {0} and {1}",
"The story was successfully created.": "The story was successfully created.",
"The story was successfully updated.": "The story was successfully updated.",
@ -412,7 +410,6 @@ global.messages['en'] = {
"This message was sent to you by the user {0} of the site {1} [1].": "This message was sent to you by the user {0} of the site {1} [1].",
"This poll was closed {0} by {1}": "This poll was closed {0} by {1}",
"This site is currently {0}.": "This site is currently {0}.",
"This site is going to be deleted completely and irreversibly {0}.": "This site is going to be deleted completely and irreversibly {0}.",
"This skin contains additional JavaScript code that will be included in every page.": "This skin contains additional JavaScript code that will be included in every page.",
"This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.": "This skin contains the Cascading Stylesheet (CSS) definitions, e.g. fonts, font sizes, colors etc. Modifying this skin will affect the general appearance of your site.",
"This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.": "This skin defines the basic structure of your site. Modifying it will affect the general appearance of your site.",
@ -443,7 +440,8 @@ global.messages['en'] = {
"Updates": "Updates",
"Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.": "Upload a zipped layout archive created with Antville 1.1 to convert it to an archive working with Antville 1.2.",
"Uptime": "Uptime",
"User name and e-mail address do not match.": "User name and e-mail address do not match.",
"User": "Account",
"Username and e-mail address do not match.": "Username and e-mail address do not match.",
"Version": "Version",
"Via": "Via",
"Vote": "Vote",
@ -459,14 +457,14 @@ global.messages['en'] = {
"Yes, really erase {0} comment": "Yes, really erase {0} comment",
"Yes, really erase {0} comments": "Yes, really erase {0} comments",
"You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.": "You (or someone pretending to be you) requested to reset your account password for the site {0} at {1}.",
"You are about to delete a comment by user {0}.": "You are about to delete a comment by user {0}.",
"You are about to delete a comment by {0}.": "You are about to delete a comment by {0}.",
"You are about to delete a comment thread consisting of {0} postings.": "You are about to delete a comment thread consisting of {0} postings.",
"You are about to delete a poll by user {0}.": "You are about to delete a poll by user {0}.",
"You are about to delete a story by user {0}.": "You are about to delete a story by user {0}.",
"You are about to delete a story by {0}.": "You are about to delete a story by {0}.",
"You are about to delete the account {0}.": "You are about to delete the account {0}.",
"You are about to delete the file {0}.": "You are about to delete the file {0}.",
"You are about to delete the image {0}.": "You are about to delete the image {0}.",
"You are about to delete the membership of user {0}.": "You are about to delete the membership of user {0}.",
"You are about to delete the membership of {0}.": "You are about to delete the membership of {0}.",
"You are about to delete the site {0}.": "You are about to delete the site {0}.",
"You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.": "You are about to delete the whole account which currently contains {0}, {1}, {2}, {3}, {4} and {5}.",
"You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.": "You are about to delete the whole site which currently contains {0}, {1}, {2}, {3} and {4}.",
@ -482,18 +480,17 @@ global.messages['en'] = {
"You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.": "You can filter the results by name or by e-mail address. Use the asterisk * as wildcard.",
"You can filter the results by site name. Use the asterisk * as wildcard.": "You can filter the results by site name. Use the asterisk * as wildcard.",
"You can use the asterisk * as wildcard.": "You can use the asterisk * as wildcard.",
"You cannot delete a privileged user.": "You cannot delete a privileged user.",
"You cannot revoke permissions from the only privileged user.": "You cannot revoke permissions from the only privileged user.",
"You cannot delete a privileged account.": "You cannot delete a privileged account.",
"You cannot revoke permissions from the only privileged account.": "You cannot revoke permissions from the only privileged account.",
"You denied the request.": "You denied the request.",
"You did not vote, yet. You can vote until the poll is closed.": "You did not vote, yet. You can vote until the poll is closed.",
"You need to wait {0} before you are allowed to create a new site.": "You need to wait {0} before you are allowed to create a new site.",
"You still can revert the request for deletion in the {0}site settings{1}.": "You still can revert the request for deletion in the {0}site settings{1}.",
"You will then be asked to change your password.": "You will then be asked to change your password.",
"Your account has been blocked.": "Your account has been blocked.",
"Your message was sent successfully.": "Your message was sent successfully.",
"Your password was changed.": "Your password was changed.",
"[{0}] Message from anonymous user": "[{0}] Message from anonymous user",
"[{0}] Message from user {1}": "[{0}] Message from user {1}",
"[{0}] Message from anonymous": "[{0}] Message from anonymous",
"[{0}] Message from {1}": "[{0}] Message from {1}",
"[{0}] Notification of membership cancellation": "[{0}] Notification of membership cancellation",
"[{0}] Notification of membership change": "[{0}] Notification of membership change",
"[{0}] Notification of site changes": "[{0}] Notification of site changes",