Merge branch 'dev' into 'master'

4.0.5

See merge request crafty-controller/crafty-4!388
This commit is contained in:
Iain Powrie 2022-06-24 03:20:57 +00:00
commit fd9b673819
9 changed files with 318 additions and 179 deletions

View File

@ -1,5 +1,20 @@
# Changelog # Changelog
## --- [4.0.5] - 2022/06/24
### New features
None
### Bug fixes
- Fix cannot delete backup on page 2 ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/382))
- Fix server starting up without stats monitoring after backup shutdown. ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/386))
- Fix pathing issue when launching with just "java" ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/386))
- Fix path issue with update-alternatives ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/387))
### Tweaks
- Rework server list on status page display for use on small screens ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/383))
- Add clone server confirmation ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/384))
### Lang
- German translation review, fixed some spelling issues and added some missing strings ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/385))
<br><br>
## --- [4.0.4-hotfix2] - 2022/06/21 ## --- [4.0.4-hotfix2] - 2022/06/21
### Bug fixes ### Bug fixes
- Fix Traceback on schedule config page ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/381)) - Fix Traceback on schedule config page ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/381))

View File

@ -124,17 +124,24 @@ class Helpers:
# If we get here we're linux so we will use 'update-alternatives' # If we get here we're linux so we will use 'update-alternatives'
# (If distro does not have update-alternatives then manual input.) # (If distro does not have update-alternatives then manual input.)
# Sometimes u-a will be in /sbin on some distros (which is annoying.)
ua_path = "/usr/bin/update-alternatives"
if not os.path.exists(ua_path):
logger.warning("update-alternatives not found! Trying /sbin")
ua_path = "/usr/sbin/update-alternatives"
try: try:
paths = subprocess.check_output( paths = subprocess.check_output(
["/usr/bin/update-alternatives", "--list", "java"], encoding="utf8" [ua_path, "--list", "java"], encoding="utf8"
) )
if re.match("^(/[^/ ]*)+/?$", paths): if re.match("^(/[^/ ]*)+/?$", paths):
return paths.split("\n") return paths.split("\n")
except Exception as e: except Exception as e:
print("Java Detect Error: ", e)
logger.error(f"Java Detect Error: {e}") logger.error(f"Java Detect Error: {e}")
return []
@staticmethod @staticmethod
def float_to_string(gbs: float): def float_to_string(gbs: float):

View File

@ -242,7 +242,7 @@ class ServerInstance:
"Replacing with full java path." "Replacing with full java path."
) )
# Checks for Oracle Java. Only Oracle Java's helper will cause a re-exec. # Checks for Oracle Java. Only Oracle Java's helper will cause a re-exec.
if "/Oracle/Java/" in str(shutil.which("java")): if "/Oracle/Java/" in str(self.helper.wtol_path(shutil.which("java"))):
logger.info( logger.info(
"Oracle Java detected. Changing start command to avoid re-exec." "Oracle Java detected. Changing start command to avoid re-exec."
) )
@ -938,7 +938,7 @@ class ServerInstance:
logger.info( logger.info(
"Backup complete. User had shutdown preference. Starting server." "Backup complete. User had shutdown preference. Starting server."
) )
self.start_server(HelperUsers.get_user_id_by_name("system")) self.run_threaded_server(HelperUsers.get_user_id_by_name("system"))
time.sleep(3) time.sleep(3)
self.last_backup_failed = False self.last_backup_failed = False
except: except:
@ -958,7 +958,7 @@ class ServerInstance:
logger.info( logger.info(
"Backup complete. User had shutdown preference. Starting server." "Backup complete. User had shutdown preference. Starting server."
) )
self.start_server(HelperUsers.get_user_id_by_name("system")) self.run_threaded_server(HelperUsers.get_user_id_by_name("system"))
self.last_backup_failed = True self.last_backup_failed = True
def backup_status(self, source_path, dest_path): def backup_status(self, source_path, dest_path):

View File

@ -295,7 +295,7 @@
</div> </div>
{% end %} {% end %}
{% if len(data['servers']) > 0 %} {% if len(data['servers']) > 0 %}
<!-- Try with Accordion --> <!-- View for Small screen -->
<div class="d-sm-none d-block"> <div class="d-sm-none d-block">
<div class="accordion" id="accordionServers"> <div class="accordion" id="accordionServers">
{% for server in data['servers'] %} {% for server in data['servers'] %}
@ -849,6 +849,30 @@
$(".clone_button").click(function () { $(".clone_button").click(function () {
server_id = $(this).attr("data-id"); server_id = $(this).attr("data-id");
bootbox.confirm({
message: "{{ translate('dashboard', 'cloneConfirm' , data['lang']) }}",
buttons: {
confirm: {
label: "{{ translate('dashboard', 'clone' , data['lang']) }}",
className: 'btn-outline-warning'
},
cancel: {
label: '{% raw translate("panelConfig", "cancel", data["lang"]) %}',
className: 'btn-secondary'
}
},
callback: function (result) {
if (result) {
cloneServer(server_id);
}
}
});
});
});
function cloneServer(server_id) {
send_command(server_id, 'clone_server'); send_command(server_id, 'clone_server');
bootbox.dialog({ bootbox.dialog({
backdrop: true, backdrop: true,
@ -859,9 +883,7 @@
setTimeout(function () { setTimeout(function () {
location.reload(); location.reload();
}, 5000) }, 5000)
}); }
});
</script> </script>
<script src="/static/assets/vendors/js/jquery-ui.js"></script> <script src="/static/assets/vendors/js/jquery-ui.js"></script>
<link rel="stylesheet" href="/static/assets/vendors/css/jquery-ui.css"> <link rel="stylesheet" href="/static/assets/vendors/css/jquery-ui.css">

View File

@ -375,7 +375,7 @@
$('#backup_table').DataTable({ $('#backup_table').DataTable({
"order": [[1, "desc"]], "order": [[1, "desc"]],
"paging": true, "paging": false,
"lengthChange": false, "lengthChange": false,
"searching": true, "searching": true,
"ordering": true, "ordering": true,

View File

@ -6,7 +6,9 @@
{% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard', data['lang']) }}{% end %} {% block title %}Crafty Controller - {{ translate('dashboard', 'dashboard', data['lang']) }}{% end %}
{% block content %} {% block content %}
<div class="content-wrapper col-md login-modal" style="background-color: #222437;"> <!-- View for Large screen -->
<div class="row justify-content-center">
<div class="content-wrapper col-md login-modal d-none d-sm-block" style="background-color: #222437;">
<img src="/static/assets/images/logo_long.png" style='width: 25%; margin-left: 38%;'> <img src="/static/assets/images/logo_long.png" style='width: 25%; margin-left: 38%;'>
<hr /> <hr />
<div class="table-responsive"> <div class="table-responsive">
@ -69,13 +71,88 @@
</td> </td>
</tr> </tr>
{% end %} {% end %}
</tbody> </tbody>
</table> </table>
</div> </div>
<hr /> <hr />
</div> </div>
</div>
<!-- View for Small screen -->
<div class="row justify-content-center align-items-sm-center">
<div class="content-wrapper login-modal d-sm-none d-block">
<img src="/static/assets/images/logo_long.png" style='width: 100%;'>
<hr />
{% if data['running'] != 0 %}
<span id="m_sync" style="margin-left: 5px;"><i class="fas fa-sync fa-spin"></i></span></h4>
{% end %}
<div class="accordion" id="accordionServers">
{% for server in data['servers'] %}
<div class="card mb-0">
<div class="card-header" id="heading-{{server['server_data']['server_id']}}">
<h2 class="mb-0 container overflow-hidden">
<div class="row">
<div class="col-8 mx-0 px-0">
<a id="m_server_name_{{ server['stats']['server_id']['server_id'] }}" class="btn btn-link d-flex justify-content-center" type="button" data-toggle="collapse"
data-target="#collapse-{{server['server_data']['server_id']}}" aria-expanded="false"
aria-controls="collapse-{{server['server_data']['server_id']}}">
<i class="fas fa-server"></i>
{{ server['server_data']['server_name'] }}
</a>
</div>
<div class="col-4 mx-0 px-0">
<a id="m_server_online_status_{{ server['stats']['server_id']['server_id'] }}" class="btn btn-link d-flex justify-content-center" type="button">
{% if server['stats']['running'] %}
<div id="m_server_players_{{ server['stats']['server_id']['server_id'] }}">
<span class="text-success"><i class="fas fa-signal"></i> {{ server['stats']['online'] }} / {{ server['stats']['max'] }}</span>
</div>
{% else %}
<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline', data['lang']) }}</span>
{% end %}
</a>
</div>
</div>
</h2>
</div>
<div id="collapse-{{server['server_data']['server_id']}}" class="collapse"
aria-labelledby="heading-{{server['server_data']['server_id']}}" data-parent="#accordionServers">
<div class="card-body">
{% if server['stats']['int_ping_results'] != 'False' %}
<div id="m_server_motd_{{ server['stats']['server_id']['server_id'] }}" class="media">
{% if server['stats']['desc'] != 'False' %}
<img src="/static/assets/images/pack.png" class="w-25 mr-3" alt="icon" style="-webkit-filter:grayscale(100%); filter:grayscale(100%);" />
{% end %}
<div class="media-body">
{% if server['stats']['desc'] != 'False' %}
<div id="m_server_motd_{{ server['stats']['server_id']['server_id'] }}">
<span id="input_motd_{{ server['stats']['server_id']['server_id'] }}" class="input_motd">{{
server['stats']['desc'] }}</span> <br />
</div>
{% end %}
</div>
</div>
<br />
<div id="m_server_version_{{ server['stats']['server_id']['server_id'] }}">
{% if server['stats']['version'] != 'False' %}
{{ server['stats']['version'] }}
{% end %}
</div>
{% else %}
<div class="row">
<div class="col-12">
<div id="m_server_motd_{{ server['stats']['server_id']['server_id'] }}">
<span class="text-warning"><i class="fas fa-exclamation-triangle"></i> Crafty can't get infos from this Server </span>
</div>
</div>
</div>
{% end %}
</div>
</div>
</div>
{% end %}
</div>
</div>
</div>
{% end %} {% end %}
{% block js %} {% block js %}
@ -90,17 +167,23 @@
} }
function update_one_server_status(server) { function update_one_server_status(server) {
/* Normal Screen view */
server_players = document.getElementById('server_players_' + server.id); server_players = document.getElementById('server_players_' + server.id);
server_motd = document.getElementById('server_motd_' + server.id); server_motd = document.getElementById('server_motd_' + server.id);
server_version = document.getElementById('server_version_' + server.id); server_version = document.getElementById('server_version_' + server.id);
server_online_status = document.getElementById('server_online_status_' + server.id); server_online_status = document.getElementById('server_online_status_' + server.id);
/* Small Screen view */
m_server_players = document.getElementById('m_server_players_' + server.id);
m_server_motd = document.getElementById('m_server_motd_' + server.id);
m_server_version = document.getElementById('m_server_version_' + server.id);
m_server_online_status = document.getElementById('m_server_online_status_' + server.id);
/* TODO Update each element */ /* TODO Update each element */
if (server.int_ping_results) { if (server.int_ping_results) {
document.getElementById('sync').innerHTML = ''; document.getElementById('sync').innerHTML = '';
document.getElementById('m_sync').innerHTML = '';
/* Update Players */ /* Update Players */
if (server.players) if (server.players) {
{
server_players.innerHTML = server.online + ` / ` + server.max + ` {{ translate('dashboard', 'max', data['lang']) }}<br />` server_players.innerHTML = server.online + ` / ` + server.max + ` {{ translate('dashboard', 'max', data['lang']) }}<br />`
} }
@ -109,36 +192,44 @@
if (server.desc) { if (server.desc) {
if (server.icon) { if (server.icon) {
motd = `<img src="data:image/png;base64,` + server.icon + `" alt="icon" /> `; motd = `<img src="data:image/png;base64,` + server.icon + `" alt="icon" /> `;
m_motd = `<img src="data:image/png;base64,` + server.icon + `" alt="icon" /> `;
} }
else { else {
motd = `<img src="/static/assets/images/pack.png" alt="icon" /> `; motd = `<img src="/static/assets/images/pack.png" alt="icon" /> `;
m_motd = `<img class="w-25 mr-3" src="/static/assets/images/pack.png" alt="icon" /> `;
} }
motd = motd + `<span id="input_motd_` + server.id + `" class="input_motd">` + server.desc + `</span> <br />`; motd = motd + `<span id="input_motd_` + server.id + `" class="input_motd">` + server.desc + `</span> <br />`;
m_motd = m_motd + `<div class="media-body"><span id="input_motd_` + server.id + `" class="input_motd">` + server.desc + `</span></div>`;
server_motd.innerHTML = motd; server_motd.innerHTML = motd;
m_server_motd.innerHTML = m_motd;
} }
/* Version */ /* Version */
if (server.version) if (server.version) {
{ server_version.innerHTML = server.version;
server_version.innerHTML = server.version m_server_version.innerHTML = server.version;
} }
} }
else { else {
server_players.innerHTML = `<span class="text-warning"><i class="fas fa-exclamation-triangle"></i></span>`; server_players.innerHTML = `<span class="text-warning"><i class="fas fa-exclamation-triangle"></i></span>`;
server_motd.innerHTML = `<span class="text-warning">Crafty can't get infos from this Server </span>`; server_motd.innerHTML = `<span class="text-warning">Crafty can't get infos from this Server </span>`;
server_version.innerHTML = `<span class="text-warning"><i class="fas fa-question"></i></i></span>` server_version.innerHTML = `<span class="text-warning"><i class="fas fa-question"></i></i></span>`;
m_server_motd.innerHTML = `<span class="text-warning"><i class="fas fa-exclamation-triangle"></i> Crafty can't get infos from this Server </span>`;
} }
/* Update Online Status */ /* Update Online Status */
var online_status = ""; var online_status = "";
if (server.running) { if (server.running) {
online_status = `<span class="text-success"><i class="fas fa-signal"></i> {{ translate('dashboard', 'online', data['lang'])}}</span>`; online_status = `<span class="text-success"><i class="fas fa-signal"></i> {{ translate('dashboard', 'online', data['lang'])}}</span>`;
m_online_status = `<span class="text-success"><i class="fas fa-signal"></i>` + server.online + ` / ` + server.max + `</span>`;
} }
else { else {
online_status = `<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline', data['lang'])}}</span>`; online_status = `<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline', data['lang'])}}</span>`;
m_online_status = `<span class="text-danger"><i class="fas fa-ban"></i> {{ translate('dashboard', 'offline', data['lang'])}}</span>`;
} }
server_online_status.innerHTML = online_status; server_online_status.innerHTML = online_status;
m_server_online_status.innerHTML = m_online_status;
} }
function update_servers_status(data) { function update_servers_status(data) {
@ -150,8 +241,7 @@
$(document).ready(function () { $(document).ready(function () {
console.log("ready!"); console.log("ready!");
if (webSocket) if (webSocket) {
{
webSocket.on('update_server_status', update_servers_status); webSocket.on('update_server_status', update_servers_status);
} }
}()); }());

View File

@ -27,8 +27,7 @@
<body class="dark-theme"> <body class="dark-theme">
<div class="container-scroller"> <div class="container-scroller">
<div class="container-fluid page-body-wrapper full-page-wrapper"> <div class="container-fluid page-body-wrapper full-page-wrapper">
<div class="content-wrapper d-flex align-items-center auth auth-bg-1 theme-one"> <div class="content-wrapper d-flex align-items-sm-center auth auth-bg-1 theme-one">
<div class="row w-100">
<div class="mx-auto"> <div class="mx-auto">
<div class="auto-form-wrapper"> <div class="auto-form-wrapper">
{% block content %} {% block content %}
@ -36,7 +35,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<!-- content-wrapper ends --> <!-- content-wrapper ends -->
</div> </div>
<!-- page-body-wrapper ends --> <!-- page-body-wrapper ends -->

View File

@ -67,8 +67,8 @@
"cannotSeeOnMobile2": "Versuchen Sie, die Tabelle seitlich zu verschieben.", "cannotSeeOnMobile2": "Versuchen Sie, die Tabelle seitlich zu verschieben.",
"clone": "Klonen", "clone": "Klonen",
"cpuCores": "CPU Kerne", "cpuCores": "CPU Kerne",
"cpuCurFreq": "Momentaner CPU-takt", "cpuCurFreq": "Momentaner CPU-Takt",
"cpuMaxFreq": "Maximaler CPU-takt", "cpuMaxFreq": "Maximaler CPU-Takt",
"cpuUsage": "CPU-Nutzung", "cpuUsage": "CPU-Nutzung",
"crashed": "Abgestürzt", "crashed": "Abgestürzt",
"dashboard": "Dashboard", "dashboard": "Dashboard",
@ -90,7 +90,7 @@
"sendingCommand": "Übermittlung Ihres Befehls", "sendingCommand": "Übermittlung Ihres Befehls",
"server": "Server", "server": "Server",
"servers": "Server", "servers": "Server",
"size": "Server-Verzeichniss Größe", "size": "Serververzeichnis Größe",
"start": "Starten", "start": "Starten",
"starting": "Verzögerter Start", "starting": "Verzögerter Start",
"status": "Status", "status": "Status",
@ -101,8 +101,8 @@
"datatables": { "datatables": {
"i18n": { "i18n": {
"aria": { "aria": {
"sortAscending": ": aktivieren, um die Spalte aufsteigend zu sortieren", "sortAscending": ": Aktivieren, um die Spalte aufsteigend zu sortieren",
"sortDescending": ": aktivieren, um die Spalte absteigend zu sortieren" "sortDescending": ": Aktivieren, um die Spalte absteigend zu sortieren"
}, },
"buttons": { "buttons": {
"collection": "Sammlung <span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'/>", "collection": "Sammlung <span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'/>",
@ -127,20 +127,20 @@
}, },
"decimal": "", "decimal": "",
"emptyTable": "Keine Daten in der Tabelle verfügbar", "emptyTable": "Keine Daten in der Tabelle verfügbar",
"info": "Anzeige von _START_ to _END_ of _TOTAL_ Einträge", "info": "Zeige _START_ bis _END_ von insges. _TOTAL_ Einträge(n)",
"infoEmpty": "Zeigt 0 bis 0 von 0 Einträge", "infoEmpty": "Zeige 0 bis 0 von insges. 0 Einträgen",
"infoFiltered": "(gefiltert von _MAX_ maximalen Einträgen)", "infoFiltered": "(gefiltert von _MAX_ maximalen Einträgen)",
"infoPostFix": "", "infoPostFix": "",
"lengthMenu": "Zeige _MENU_ Einträge", "lengthMenu": "Zeige _MENU_ Einträge",
"loadingRecords": "Laden...", "loadingRecords": "Laden...",
"paginate": { "paginate": {
"first": "Erster", "first": "Erste",
"last": "Letzter", "last": "Letzte",
"next": "Nächste", "next": "Nächste",
"previous": "Vorheriger" "previous": "Vorherige"
}, },
"processing": "Verarbeiten...", "processing": "Verarbeiten...",
"search": "Suchen:", "search": "Suche:",
"select": { "select": {
"cells": { "cells": {
"0": "Klicken Sie auf eine Zelle, um sie auszuwählen", "0": "Klicken Sie auf eine Zelle, um sie auszuwählen",
@ -176,7 +176,8 @@
"not-downloaded": "Crafty kann die auszuführende Datei nicht finden. Ist der Download abgeschlossen? Sind die Berechtigungen für Crafty korrekt?", "not-downloaded": "Crafty kann die auszuführende Datei nicht finden. Ist der Download abgeschlossen? Sind die Berechtigungen für Crafty korrekt?",
"portReminder": "Wir haben festgestellt, dass dies das erste Mal ist, dass {} ausgeführt wurde. Stellen Sie sicher, dass Sie Port {} durch Ihren Router/Firewall weiterleiten, um den Fernzugriff aus dem Internet zu ermöglichen.", "portReminder": "Wir haben festgestellt, dass dies das erste Mal ist, dass {} ausgeführt wurde. Stellen Sie sicher, dass Sie Port {} durch Ihren Router/Firewall weiterleiten, um den Fernzugriff aus dem Internet zu ermöglichen.",
"start-error": "Der Server {} konnte wegen dem Fehlercode: {} nicht gestartet werden", "start-error": "Der Server {} konnte wegen dem Fehlercode: {} nicht gestartet werden",
"terribleFailure": "Was für ein furchtbarer Fehler!" "terribleFailure": "Was für ein furchtbarer Fehler!",
"fileTooLarge": "Hochladen fehlgeschlagen. Datei ist zu groß. Wenden Sie sich an Ihren Systemadministrator für weitere Unterstütung."
}, },
"footer": { "footer": {
"allRightsReserved": "Alle Rechte vorbehalten", "allRightsReserved": "Alle Rechte vorbehalten",
@ -194,13 +195,13 @@
"backupComplete": "Backup für Server erfolgreich ausgeführt {}", "backupComplete": "Backup für Server erfolgreich ausgeführt {}",
"backupStarted": "Backup für Server gestartet {}", "backupStarted": "Backup für Server gestartet {}",
"downloadLogs": "Supportprotokolle herunterladen?", "downloadLogs": "Supportprotokolle herunterladen?",
"finishedPreparing": "Wir haben die Bereitstellung der Supportprotokolle abgeschlossen. Bitte klicke Herunterladen um diese Herunterzuladen", "finishedPreparing": "Wir haben die Bereitstellung der Supportprotokolle abgeschlossen. Bitte klicke 'Herunterladen' um diese herunterzuladen",
"logout": "Abmelden", "logout": "Abmelden",
"preparingLogs": " Bitte warten, während wir die Protokolle vorbereiten... Wir schicken eine Benachrichtigung, wenn sie fertig sind. Dies kann bei großen Projekten eine Weile dauern.", "preparingLogs": " Bitte warten, während wir die Protokolle vorbereiten... Wir schicken eine Benachrichtigung, wenn sie fertig sind. Dies kann bei großen Projekten eine Weile dauern.",
"supportLogs": "Supportprotokolle" "supportLogs": "Supportprotokolle"
}, },
"panelConfig": { "panelConfig": {
"adminControls": "Administrations Werkzeuge", "adminControls": "Administrations-Werkzeuge",
"allowedServers": "Erlaubte Server", "allowedServers": "Erlaubte Server",
"assignedRoles": "Zugewiesene Rollen", "assignedRoles": "Zugewiesene Rollen",
"cancel": "Abbrechen", "cancel": "Abbrechen",
@ -213,31 +214,31 @@
"pageTitle": "Panel Konfiguration", "pageTitle": "Panel Konfiguration",
"role": "Rolle", "role": "Rolle",
"roles": "Rollen", "roles": "Rollen",
"roleUsers": "Nutzerrollen", "roleUsers": "Rollen-Benutzer",
"save": "Speichern", "save": "Speichern",
"superConfirm": "Nur fortfahren, wenn dieser Nutzer zugang zu ALLEM haben soll (alle Benutzerkonten, Server, Panel-Konfiguration etc.). Er kann allen Benutzern die Super-Benutzer-Rechte entziehen.", "superConfirm": "Nur fortfahren, wenn dieser Nutzer Zugang zu ALLEM haben soll (alle Benutzerkonten, Server, Panel-Konfiguration etc.). Er kann allen Benutzern die Super-Benutzer-Rechte entziehen.",
"superConfirmTitle": "Super-Benutzer Berechtigung erteilen? Sicher, dass diese Aktion ausgeführt werden soll?", "superConfirmTitle": "Super-Benutzer Berechtigung erteilen? Sicher, dass diese Aktion ausgeführt werden soll?",
"user": "Benutzer", "user": "Benutzer",
"users": "Benutzer" "users": "Benutzer"
}, },
"rolesConfig": { "rolesConfig": {
"config": "Rollen Konfiguration", "config": "Rollen-Konfiguration",
"configDesc": "Hier kann die Konfiguration von Rollen bearbeitet werden", "configDesc": "Hier kann die Konfiguration von Rollen bearbeitet werden",
"configUpdate": "Zuletzt aktualisiert: ", "configUpdate": "Zuletzt aktualisiert: ",
"created": "Erstellt: ", "created": "Erstellt: ",
"delRole": "Rolle löschen", "delRole": "Rolle löschen",
"doesNotExist": "Sie können nichts löschen, was noch nicht existiert!", "doesNotExist": "Sie können nicht löschen, was noch nicht existiert!",
"pageTitle": "Rolle bearbeiten", "pageTitle": "Rolle bearbeiten",
"pageTitleNew": "Neue Rolle", "pageTitleNew": "Neue Rolle",
"permAccess": "Zugriff?", "permAccess": "Zugriff?",
"permName": "Berechtigungs Name", "permName": "Berechtigungs-Name",
"permsServer": "Berechtigungen, die diese Rolle für die angegebenen Server hat", "permsServer": "Berechtigungen, die diese Rolle für die angegebenen Server hat",
"roleConfigArea": "Rollenkonfigurationsbereich", "roleConfigArea": "Rollen-Konfigurationsbereich",
"roleDesc": "Wie soll diese Rolle genannt werden?", "roleDesc": "Wie soll diese Rolle genannt werden?",
"roleName": "Name der Rolle: ", "roleName": "Name der Rolle: ",
"rolePerms": "Rollenberechtigungen", "rolePerms": "Rollen-Berechtigungen",
"roleServers": "Erlaubte Server", "roleServers": "Erlaubte Server",
"roleTitle": "Rollen Einstellungen", "roleTitle": "Rollen-Einstellungen",
"roleUserName": "Benutzername", "roleUserName": "Benutzername",
"roleUsers": "Nutzer mit dieser Rolle: ", "roleUsers": "Nutzer mit dieser Rolle: ",
"serverAccess": "Zugriff?", "serverAccess": "Zugriff?",
@ -253,7 +254,7 @@
"compress": "Backup komprimieren", "compress": "Backup komprimieren",
"confirm": "Bestätigen", "confirm": "Bestätigen",
"confirmDelete": "Möchten Sie diese Backup-Datei löschen? Dies kann nicht rückgängig gemacht werden.", "confirmDelete": "Möchten Sie diese Backup-Datei löschen? Dies kann nicht rückgängig gemacht werden.",
"confirmRestore": "Sicher, dass diese Sicherung wiederherstellgestellt werden soll? Alle aktuellen Serverdateien werden in den Zustand der Sicherung versetzt und können nicht wiederhergestellt werden.", "confirmRestore": "Sicher, dass dieses Backup wiederherstellgestellt werden soll? Alle aktuellen Serverdateien werden in den Zustand von diesem Backup versetzt und können nicht wiederhergestellt werden.",
"currentBackups": "Aktuelle Backups", "currentBackups": "Aktuelle Backups",
"delete": "Löschen", "delete": "Löschen",
"destroyBackup": "Backup löschen \" + file_to_del + \"?", "destroyBackup": "Backup löschen \" + file_to_del + \"?",
@ -270,21 +271,22 @@
"save": "Speichern", "save": "Speichern",
"size": "Größe", "size": "Größe",
"storageLocation": "Speicherort", "storageLocation": "Speicherort",
"storageLocationDesc": "Wo wollen Sie die Backups speichern?" "storageLocationDesc": "Wo wollen Sie die Backups speichern?",
"shutdown": "Server für die Dauer des Backups stoppen"
}, },
"serverConfig": { "serverConfig": {
"bePatientDelete": "Bitte haben Sie etwas Geduld, während wir Ihren Server aus dem Crafty-Panel entfernen. Dieser Bildschirm wird in wenigen Augenblicken geschlossen.", "bePatientDelete": "Bitte haben Sie etwas Geduld, während wir Ihren Server aus dem Crafty-Panel entfernen. Dieser Bildschirm wird in wenigen Augenblicken geschlossen.",
"bePatientDeleteFiles": "Bitte haben Sie etwas Geduld, während wir Ihren Server aus dem Crafty-Panel entfernen und alle Dateien löschen. Dieser Bildschirm wird in wenigen Augenblicken geschlossen.", "bePatientDeleteFiles": "Bitte haben Sie etwas Geduld, während wir Ihren Server aus dem Crafty-Panel entfernen und alle Dateien löschen. Dieser Bildschirm wird in wenigen Augenblicken geschlossen.",
"bePatientUpdate": "Bitte haben Sie etwas Geduld, während wir den Server aktualisieren. Die Downloadzeiten können je nach Ihrer Internetgeschwindigkeit variieren.<br /> Dieser Bildschirm wird sich in einem Moment aktualisieren", "bePatientUpdate": "Bitte haben Sie etwas Geduld, während wir den Server aktualisieren. Die Downloadzeiten können je nach Ihrer Internetgeschwindigkeit variieren.<br /> Dieser Bildschirm wird sich in einem Moment aktualisieren",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"crashTime": "Zeitüberschreitung bei Absturz", "crashTime": "Zeitüberschreitung nach Absturz",
"crashTimeDesc": "Wie lange soll Crafty warten, bevor Crafty den Server als abgestürzt betrachtet?", "crashTimeDesc": "Wie lange soll Crafty warten, bevor Crafty den Server als abgestürzt betrachtet?",
"deleteFilesQuestion": "Serverdateien vom Rechner löschen?", "deleteFilesQuestion": "Serverdateien vom Rechner löschen?",
"deleteFilesQuestionMessage": "Möchten Sie, dass Crafty alle Serverdateien auf dem Hostrechner löscht?", "deleteFilesQuestionMessage": "Möchten Sie, dass Crafty alle Serverdateien auf dem Hostrechner löscht? <br><br><strong>Das schließt die Server-Backups ein.</strong>",
"deleteServer": "Server löschen", "deleteServer": "Server löschen",
"deleteServerQuestion": "Server löschen?", "deleteServerQuestion": "Server löschen?",
"deleteServerQuestionMessage": "Sind Sie sicher, dass Sie diesen Server löschen wollen? Danach gibt es kein Zurück mehr...", "deleteServerQuestionMessage": "Sind Sie sicher, dass Sie diesen Server löschen wollen? Danach gibt es kein Zurück mehr...",
"exeUpdateURL": "Server Ausführbare Update URL", "exeUpdateURL": "Ausführbare Server Update URL",
"exeUpdateURLDesc": "Direkte Download-URL für Updates.", "exeUpdateURLDesc": "Direkte Download-URL für Updates.",
"noDelete": "Nein, zurück", "noDelete": "Nein, zurück",
"noDeleteFiles": "Nein, nur aus dem Panel entfernen", "noDeleteFiles": "Nein, nur aus dem Panel entfernen",
@ -293,25 +295,28 @@
"save": "Speichern", "save": "Speichern",
"sendingDelete": "Lösche den Server", "sendingDelete": "Lösche den Server",
"sendingRequest": "Ihre Anfrage senden...", "sendingRequest": "Ihre Anfrage senden...",
"serverAutoStart": "Server Automatisch starten", "serverAutoStart": "Server automatisch starten",
"serverAutostartDelay": "Server Autostart-Verzögerung", "serverAutostartDelay": "Server Autostart-Verzögerung",
"serverAutostartDelayDesc": "Verzögerung vor dem automatischen Start (falls unten aktiviert)", "serverAutostartDelayDesc": "Verzögerung vor dem automatischen Start (falls unten aktiviert)",
"serverCrashDetection": "Erkennung von Serverabstürzen", "serverCrashDetection": "Erkennung von Serverabstürzen",
"serverExecutable": "Server Ausführbare Datei", "serverExecutable": "Ausführbare Server Datei",
"serverExecutableDesc": "Die ausführbare Datei des Servers", "serverExecutableDesc": "Die ausführbare Datei des Servers",
"javaVersion": "Aktuelle Java Version überschreiben",
"javaVersionDesc": "Wenn Sie die Java-Version überschreiben möchten: Stellen Sie sicher, dass der 'auszuführende Befehl' in Anführungszeichen geschrieben ist (Ausgenommen die Standard-'java'-Variable)",
"javaNoChange": "Nicht überschreiben",
"serverExecutionCommand": "Server Ausführungsbefehl", "serverExecutionCommand": "Server Ausführungsbefehl",
"serverExecutionCommandDesc": "Was wird in einem versteckten Terminal gestartet", "serverExecutionCommandDesc": "Was wird in einer versteckten Konsole gestartet",
"serverIP": "Server IP", "serverIP": "Server IP",
"serverIPDesc": "Die IP, mit der sich Crafty für Statistiken verbinden soll (versuchen Sie eine echte IP anstelle von 127.0.0.1, wenn Sie Probleme haben)", "serverIPDesc": "Die IP, mit der sich Crafty für Statistiken verbinden soll (versuchen Sie eine echte IP anstelle von 127.0.0.1, wenn Sie Probleme haben)",
"serverLogLocation": "Server Log Speicherort", "serverLogLocation": "Server Log Speicherort",
"serverLogLocationDesc": "Absoluter vollständiger Pfad zur Protokolldatei", "serverLogLocationDesc": "Pfad zur Protokolldatei",
"serverName": "Server Name", "serverName": "Server Name",
"serverNameDesc": "Wie möchten Sie diesen Server nennen", "serverNameDesc": "Wie möchten Sie diesen Server nennen",
"serverPath": "Server-Arbeitsverzeichnis", "serverPath": "Server-Arbeitsverzeichnis",
"serverPathDesc": "Absoluter vollständiger Pfad (ohne die ausführbare Datei)", "serverPathDesc": "Absoluter vollständiger Pfad (ohne die ausführbare Datei)",
"serverPort": "Server Port", "serverPort": "Server Port",
"serverPortDesc": "Der Port, mit dem sich Crafty für Statistiken verbinden soll", "serverPortDesc": "Der Port, mit dem sich Crafty für Statistiken verbinden soll",
"serverStopCommand": "Server Stop Befehl", "serverStopCommand": "Server Stopp Befehl",
"serverStopCommandDesc": "Befehl an das Programm, um es zu stoppen", "serverStopCommandDesc": "Befehl an das Programm, um es zu stoppen",
"stopBeforeDeleting": "Bitte stoppen Sie den Server, bevor Sie ihn löschen", "stopBeforeDeleting": "Bitte stoppen Sie den Server, bevor Sie ihn löschen",
"update": "Server Datei aktualisieren", "update": "Server Datei aktualisieren",
@ -343,7 +348,7 @@
"playerControls": "Spieler-Management", "playerControls": "Spieler-Management",
"schedule": "Zeitplan", "schedule": "Zeitplan",
"serverDetails": "Server Details", "serverDetails": "Server Details",
"terminal": "Terminal" "terminal": "Konsole"
}, },
"serverFiles": { "serverFiles": {
"clickUpload": "Klicken Sie hier, um Ihre Dateien auszuwählen", "clickUpload": "Klicken Sie hier, um Ihre Dateien auszuwählen",
@ -367,12 +372,13 @@
"noscript": "Der Dateimanager funktioniert nicht ohne JavaScript", "noscript": "Der Dateimanager funktioniert nicht ohne JavaScript",
"rename": "Umbenennen", "rename": "Umbenennen",
"renameItemQuestion": "Wie soll der neue Name lauten?", "renameItemQuestion": "Wie soll der neue Name lauten?",
"size": "Editorgröße umschalten",
"save": "Speichern", "save": "Speichern",
"stayHere": "VERLASSEN SIE DIESE SEITE NICHT!", "stayHere": "VERLASSEN SIE DIESE SEITE NICHT!",
"unsupportedLanguage": "Warnung: Dies ist ein nicht unterstützter Dateityp", "unsupportedLanguage": "Warnung: Dies ist ein nicht unterstützter Dateityp",
"unzip": "Entpacken", "unzip": "Entpacken",
"upload": "Hochladen", "upload": "Hochladen",
"uploadTitle": "Dateien hochladen in: ", "uploadTitle": "Dateien hochladen nach: ",
"waitUpload": "Bitte warten Sie, während wir Ihre Dateien hochladen... Dies kann eine Weile dauern.", "waitUpload": "Bitte warten Sie, während wir Ihre Dateien hochladen... Dies kann eine Weile dauern.",
"yesDelete": "Ja, ich verstehe die Konsequenzen" "yesDelete": "Ja, ich verstehe die Konsequenzen"
}, },
@ -441,7 +447,7 @@
"sendCommand": "Befehl senden", "sendCommand": "Befehl senden",
"start": "Start", "start": "Start",
"starting": "Verzögertes Starten", "starting": "Verzögertes Starten",
"stop": "Stop", "stop": "Stopp",
"stopScroll": "Automatisches Scrollen stoppen", "stopScroll": "Automatisches Scrollen stoppen",
"updating": "Aktualisierung..." "updating": "Aktualisierung..."
}, },
@ -452,7 +458,7 @@
"autoCreate": "Wenn keine ausgewählt werden, wird Crafty eine erstellen!", "autoCreate": "Wenn keine ausgewählt werden, wird Crafty eine erstellen!",
"bePatient": "Bitte haben Sie etwas Geduld, da wir ' + (importing ? 'import' : 'download')", "bePatient": "Bitte haben Sie etwas Geduld, da wir ' + (importing ? 'import' : 'download')",
"buildServer": "Server erstellen!", "buildServer": "Server erstellen!",
"clickRoot": "Hier klicken, um das root Verzeichniss auszuwählen", "clickRoot": "Hier klicken, um das Stammverzeichnis auszuwählen",
"close": "Schließen", "close": "Schließen",
"defaultPort": "25565 (Standard)", "defaultPort": "25565 (Standard)",
"downloading": "Server herunterladen...", "downloading": "Server herunterladen...",
@ -473,7 +479,7 @@
"selectRoot": "Archivstammverzeichnis auswählen", "selectRoot": "Archivstammverzeichnis auswählen",
"selectType": "Typ auswählen", "selectType": "Typ auswählen",
"selectVersion": "Version auswählen", "selectVersion": "Version auswählen",
"selectZipDir": "Das Verzeichnis im Archiv wählen, aus dem die Dateien entpacken werden sollen", "selectZipDir": "Das Verzeichnis im Archiv wählen, aus dem die Dateien entpackt werden sollen",
"serverJar": "Server Java Datei", "serverJar": "Server Java Datei",
"serverName": "Server Name", "serverName": "Server Name",
"serverPath": "Server Pfad", "serverPath": "Server Pfad",
@ -513,13 +519,13 @@
"lastUpdate": "Letzte Aktualisierung: ", "lastUpdate": "Letzte Aktualisierung: ",
"leaveBlank": "Um den Benutzer zu bearbeiten, ohne das Passwort zu ändern, lassen Sie das Feld leer.", "leaveBlank": "Um den Benutzer zu bearbeiten, ohne das Passwort zu ändern, lassen Sie das Feld leer.",
"member": "Mitglied?", "member": "Mitglied?",
"notExist": "Sie können nichts löschen, was nicht existiert!", "notExist": "Sie können nicht löschen, was nicht existiert!",
"pageTitle": "Benutzer bearbeiten", "pageTitle": "Benutzer bearbeiten",
"pageTitleNew": "Benutzer erstellen", "pageTitleNew": "Benutzer erstellen",
"password": "Passwort", "password": "Passwort",
"permName": "Berechtigungsname", "permName": "Berechtigungsname",
"repeat": "Passwort wiederholen", "repeat": "Passwort wiederholen",
"roleName": "Rollen Name", "roleName": "Rollenname",
"super": "Super Benutzer", "super": "Super Benutzer",
"userLang": "Sprache des Benutzers", "userLang": "Sprache des Benutzers",
"userName": "Benutzername", "userName": "Benutzername",

View File

@ -66,6 +66,7 @@
"cannotSeeOnMobile": "Not seeing everything on mobile?", "cannotSeeOnMobile": "Not seeing everything on mobile?",
"cannotSeeOnMobile2": "Try scrolling the table sideways.", "cannotSeeOnMobile2": "Try scrolling the table sideways.",
"clone": "Clone", "clone": "Clone",
"cloneConfirm": "Are you sure you would like to clone this server? This process may take a while.",
"cpuCores": "CPU Cores", "cpuCores": "CPU Cores",
"cpuCurFreq": "CPU Current Clock", "cpuCurFreq": "CPU Current Clock",
"cpuMaxFreq": "CPU Maximum Clock", "cpuMaxFreq": "CPU Maximum Clock",