Merge branch 'dev' into rerelease-4.4.1

This commit is contained in:
Zedifus 2024-08-06 20:47:25 +01:00
commit fcdebbe3e5
8 changed files with 769 additions and 16 deletions

View File

@ -1,5 +1,16 @@
# Changelog # Changelog
## --- [4.4.1] - 2024/07/29 ## --- [4.4.1] - 2024/08/06
### Patch Fixes
- Migrations | Fix orphan backup configurations crashing migration operation ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/785))
- Migrations | Fix missing default configuration if no server backup config exists during the migration ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/785))
- Migrations | Fix extended runtime on move procedure during migration ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/785))
**-----------------------------------------------------------------------------**
**Initial release was reverted for patching (See Merge Request: [!784](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/784))** *2024/07/28*
**-----------------------------------------------------------------------------**
### Refactor ### Refactor
- Backups | Allow multiple backup configurations ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/711)) - Backups | Allow multiple backup configurations ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/711))
- UploadAPI | Use Crafty's JWT authentication for file uploads ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/762)) - UploadAPI | Use Crafty's JWT authentication for file uploads ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/762))
@ -30,6 +41,7 @@
- Show natural language name instead of country code in User Config Lang select list ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/773)) - Show natural language name instead of country code in User Config Lang select list ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/773))
- Add remaining `he_IL`, `th_TH` translations from **4.4.0** Release ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/761) | [Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/763)) - Add remaining `he_IL`, `th_TH` translations from **4.4.0** Release ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/761) | [Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/763))
- Fix `fr_FR` syntax issues ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/780) | [Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/778)) - Fix `fr_FR` syntax issues ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/780) | [Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/778))
- Add ru_RU Translation ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/779))
- Add `th_TH` translations for [!772](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/772) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/781)) - Add `th_TH` translations for [!772](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/772) ([Merge Request](https://gitlab.com/crafty-controller/crafty-4/-/merge_requests/781))
<br><br> <br><br>

View File

@ -400,6 +400,8 @@ class HelpersManagement:
if "excluded_dirs" in conf: if "excluded_dirs" in conf:
dirs_to_exclude = ",".join(conf["excluded_dirs"]) dirs_to_exclude = ",".join(conf["excluded_dirs"])
conf["excluded_dirs"] = dirs_to_exclude conf["excluded_dirs"] = dirs_to_exclude
if len(self.get_backups_by_server(conf["server_id"], True)) <= 0:
conf["default"] = True
backup = Backups.create(**conf) backup = Backups.create(**conf)
logger.debug("Creating new backup record.") logger.debug("Creating new backup record.")
return backup.backup_id return backup.backup_id

View File

@ -183,8 +183,7 @@ class FileHelpers:
@staticmethod @staticmethod
def move_dir(src_path, dest_path): def move_dir(src_path, dest_path):
FileHelpers.copy_dir(src_path, dest_path) shutil.move(src_path, dest_path)
FileHelpers.del_dirs(src_path)
@staticmethod @staticmethod
def move_dir_exist(src_path, dest_path): def move_dir_exist(src_path, dest_path):
@ -193,8 +192,7 @@ class FileHelpers:
@staticmethod @staticmethod
def move_file(src_path, dest_path): def move_file(src_path, dest_path):
FileHelpers.copy_file(src_path, dest_path) shutil.move(src_path, dest_path)
FileHelpers.del_file(src_path)
@staticmethod @staticmethod
def make_archive(path_to_destination, path_to_zip, comment=""): def make_archive(path_to_destination, path_to_zip, comment=""):

View File

@ -1373,6 +1373,19 @@ class ServerInstance:
def threaded_jar_update(self): def threaded_jar_update(self):
server_users = PermissionsServers.get_server_user_list(self.server_id) server_users = PermissionsServers.get_server_user_list(self.server_id)
# check to make sure a backup config actually exists before starting the update
if len(self.management_helper.get_backups_by_server(self.server_id, True)) <= 0:
for user in server_users:
WebSocketManager().broadcast_user(
user,
"notification",
"Backup config does not exist for "
+ self.name
+ ". canceling update.",
)
logger.error(f"Back config does not exist for {self.name}. Update Failed.")
self.stats_helper.set_update(False)
return
was_started = "-1" was_started = "-1"
# Get default backup configuration # Get default backup configuration
backup_config = HelpersManagement.get_default_server_backup(self.server_id) backup_config = HelpersManagement.get_default_server_backup(self.server_id)
@ -1428,7 +1441,8 @@ class ServerInstance:
"notification", "notification",
"Backup failed for " + self.name + ". canceling update.", "Backup failed for " + self.name + ". canceling update.",
) )
return False self.stats_helper.set_update(False)
return
# lets download the files # lets download the files
if HelperServers.get_server_type_by_id(self.server_id) != "minecraft-bedrock": if HelperServers.get_server_type_by_id(self.server_id) != "minecraft-bedrock":

View File

@ -58,8 +58,7 @@
<div class="card-body"> <div class="card-body">
{% if len(data['backups']) == 0 %} {% if len(data['backups']) == 0 %}
<div style="text-align: center; color: grey;"> <div style="text-align: center; color: grey;">
<h7>{{ translate('serverBackups', 'no-backup', data['lang']) }} <strong>{{ <h7>{{ translate('serverBackups', 'no-backup', data['lang']) }}.</h7>
translate('serverBackups', 'newBackup',data['lang']) }}</strong>.</h7>
</div> </div>
{% end %} {% end %}
{% if len(data['backups']) > 0 %} {% if len(data['backups']) > 0 %}

View File

@ -13,6 +13,13 @@ from app.classes.shared.file_helpers import FileHelpers
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def is_valid_backup(backup, all_servers):
try:
return str(backup.server_id) in all_servers
except (TypeError, peewee.DoesNotExist):
return False
def migrate(migrator: Migrator, database, **kwargs): def migrate(migrator: Migrator, database, **kwargs):
""" """
Write your migrations here. Write your migrations here.
@ -150,9 +157,17 @@ def migrate(migrator: Migrator, database, **kwargs):
migrator.create_table(NewSchedules) migrator.create_table(NewSchedules)
migrator.run() migrator.run()
all_servers = [
row.server_id for row in Servers.select(Servers.server_id).distinct()
]
all_backups = Backups.select()
Console.info("Cleaning up orphan backups for all servers")
valid_backups = [
backup for backup in all_backups if is_valid_backup(backup, all_servers)
]
# Copy data from the existing backups table to the new one # Copy data from the existing backups table to the new one
for backup in Backups.select(): for backup in valid_backups:
Console.info(f"Trying to get server for backup migration {backup.server_id}")
# Fetch the related server entry from the Servers table # Fetch the related server entry from the Servers table
server = Servers.get(Servers.server_id == backup.server_id) server = Servers.get(Servers.server_id == backup.server_id)
Console.info(f"Migrations: Migrating backup for server {server.server_name}") Console.info(f"Migrations: Migrating backup for server {server.server_name}")
@ -172,15 +187,28 @@ def migrate(migrator: Migrator, database, **kwargs):
default=True, default=True,
enabled=True, enabled=True,
) )
Console.info(
f"New backup table created for {server.server_name} with id {new_backup.backup_id}"
)
Helpers.ensure_dir_exists( Helpers.ensure_dir_exists(
os.path.join(server.backup_path, new_backup.backup_id) os.path.join(server.backup_path, new_backup.backup_id)
) )
try:
Console.info(
f"Moving old backups to new backup dir for {server.server_name}"
)
for file in os.listdir(server.backup_path): for file in os.listdir(server.backup_path):
if not os.path.isdir(os.path.join(os.path.join(server.backup_path, file))): if not os.path.isdir(
os.path.join(os.path.join(server.backup_path, file))
):
FileHelpers.move_file( FileHelpers.move_file(
os.path.join(server.backup_path, file), os.path.join(server.backup_path, file),
os.path.join(server.backup_path, new_backup.backup_id, file), os.path.join(server.backup_path, new_backup.backup_id, file),
) )
except FileNotFoundError as why:
logger.error(
f"Could not move backup {file} for {server.server_name} to new location with error {why}"
)
Console.debug("Migrations: Dropping old backup table") Console.debug("Migrations: Dropping old backup table")
# Drop the existing backups table # Drop the existing backups table

View File

@ -11,6 +11,7 @@
"lv_LV": "Latviešu", "lv_LV": "Latviešu",
"nl_BE": "nl_BE", "nl_BE": "nl_BE",
"pl_PL": "Polski", "pl_PL": "Polski",
"ru_RU": "Русский",
"th_TH": "ไทย", "th_TH": "ไทย",
"tr_TR": "Türkçe", "tr_TR": "Türkçe",
"uk_UA": "Українська", "uk_UA": "Українська",

699
app/translations/ru_RU.json Normal file
View File

@ -0,0 +1,699 @@
{
"404": {
"contact": "Свяжитесь со службой поддержки Crafty Control через Discord",
"notFound": "Страница не найдена",
"unableToFind": "Нам не удалось найти страницу, которую вы ищете. Пожалуйста, попробуйте еще раз или вернитесь и обновите страницу."
},
"accessDenied": {
"accessDenied": "Доступ запрещен",
"contact": "Свяжитесь со службой поддержки Crafty Control через Discord",
"contactAdmin": "Обратитесь к администратору вашего сервера за доступом к этому ресурсу или, если вы считаете, что у вас должен быть доступ к этому ресурсу, обратитесь в службу поддержки.",
"noAccess": "У вас нет доступа к этому ресурсу"
},
"apiKeys": {
"apiKeys": "API ключи",
"auth": "Разрешить? ",
"buttons": "Кнопки",
"config": "Конфиг",
"crafty": "Crafty: ",
"createNew": "Создать новый API токен",
"created": "Созданный",
"deleteKeyConfirmation": "Вы хотите удалить этот API ключ? Это невозможно отменить.",
"deleteKeyConfirmationTitle": "Удалить API ключ ${keyId}?",
"fullAccess": "Полный доступ",
"getToken": "Получить токен",
"name": "Имя",
"nameDesc": "Как бы вы хотели назвать этот API токен? ",
"no": "Нет",
"pageTitle": "Редактирование пользовательских ключей API",
"permName": "Имя разрешения",
"perms": "Разрешения",
"server": "Сервер: ",
"yes": "Да"
},
"base": {
"doesNotWorkWithoutJavascript": "<strong>Внимание: </strong>Crafty не работает должным образом, если JavaScript не включен!"
},
"credits": {
"developmentTeam": "Команда разработчиков",
"hugeDesc": "Большое",
"pageDescription": "Без этих людей у вас не было бы Crafty",
"pageTitle": "Благодарности",
"patreonDesc": "нашим Patreon / Ko-fi подписчикам!",
"patreonOther": "Другие",
"patreonSupporter": "Patreon / Ko-fi подписчики",
"patreonUpdate": "Последнее обновление:",
"retiredStaff": "Ветераны",
"subscriberName": "Имя",
"subscriptionLevel": "Уровень",
"supportTeam": "Отдел технической поддержки и документации",
"thankYou": "СПАСИБО",
"translationDesc": "сообществу, кто переводит! [ В процессе = 🟢 Неактивный/Законченный = ⚪ ]",
"translationName": "Имя",
"translationTitle": "Перевод",
"translator": "Переводчики"
},
"customLogin": {
"apply": "Применить",
"backgroundUpload": "Загрузка фона",
"customLoginPage": "Настройки страницы входа в систему",
"delete": "Удалить",
"labelLoginImage": "Выберите фон для входа в систему",
"loginBackground": "Фоновое изображение входа в систему",
"loginImage": "Загрузите фоновое изображение для экрана входа в систему.",
"loginOpacity": "Выберите непрозрачность окна входа в систему",
"pageTitle": "Настройки страницы входа в систему",
"preview": "Превью",
"select": "Выбрать",
"selectImage": "Выбрать изображение"
},
"dashboard": {
"actions": "Действия",
"allServers": "Все серверы",
"avg": "Avg",
"backups": "Бэкапы",
"bePatientClone": "Пожалуйста, наберитесь терпения, пока мы будем клонировать сервер.<br /> Этот экран обновится через мгновение",
"bePatientRestart": "Пожалуйста, наберитесь терпения, пока мы перезапускаем сервер.<br /> Этот экран обновится через мгновение",
"bePatientStart": "Пожалуйста, наберитесь терпения, пока мы запускаем сервер.<br /> Этот экран обновится через мгновение",
"bePatientStop": "Пожалуйста, наберитесь терпения, пока мы не остановим сервер.<br /> Этот экран обновится через мгновение",
"cannotSee": "Не видишь всего?",
"cannotSeeOnMobile": "Не видите всего на мобильном телефоне?",
"cannotSeeOnMobile2": "Попробуйте прокрутить таблицу в сторону.",
"clone": "Клонировать",
"cloneConfirm": "Вы уверены, что хотите клонировать этот сервер? Этот процесс может занять некоторое время.",
"cpuCores": "Ядра CPU",
"cpuCurFreq": "Текущая тактовая частота CPU",
"cpuMaxFreq": "Максимальная тактовая частота CPU",
"cpuUsage": "Нагрузка CPU",
"crashed": "Сбой",
"dashboard": "Приборная панель",
"delay-explained": "Служба/агент недавно запустилась и задерживает запуск экземпляра сервера minecraft",
"host": "Хост",
"installing": "Установка...",
"kill": "Принудительное завершение процесса",
"killing": "Принудительное завершение процесса...",
"lastBackup": "Последний:",
"max": "Максимально",
"memUsage": "Нагрузка памяти",
"motd": "MOTD",
"newServer": "Создать новый сервер",
"nextBackup": "Следующий:",
"no-servers": "В настоящее время серверов нет. Чтобы начать, нажмите",
"offline": "Оффлайн",
"online": "Онлайн",
"players": "Игроки",
"restart": "Рестарт",
"sendingCommand": "Отправляю вашу команду",
"server": "Сервер",
"servers": "Серверы",
"size": "Размер каталога сервера",
"start": "Старт",
"starting": "Отложенный запуск",
"status": "Статус",
"stop": "Стоп",
"storage": "Диски",
"version": "Версия",
"welcome": "Добро пожаловать в Crafty Controller"
},
"datatables": {
"i18n": {
"aria": {
"sortAscending": ": активируйте сортировку столбцов по возрастанию",
"sortDescending": ": активируйте сортировку столбцов по убыванию"
},
"buttons": {
"collection": "Коллекция <span class='ui-button-icon-primary ui-icon ui-icon-triangle-1-s'/>",
"colvis": "Видимость столбца",
"colvisRestore": "Восстановить видимость",
"copy": "Копировать",
"copyKeys": "Нажмите ctrl или u2318 + C, чтобы скопировать данные таблицы в системный буфер обмена.<br><br>Чтобы отменить, щелкните по этому сообщению или нажмите escape.",
"copySuccess": {
"1": "Скопирована 1 строка в буфер обмена",
"_": "Скопировано %d строк в буфер обмена"
},
"copyTitle": "Скопировать в буфер обмена",
"csv": "CSV",
"excel": "Excel",
"pageLength": {
"-1": "Показать все строки",
"1": "Показать 1 строку",
"_": "Показать %d строк"
},
"pdf": "PDF",
"print": "Печать"
},
"decimal": "",
"emptyTable": "Данные в таблице отсутствуют",
"info": "Отображение от _START_ до _END_ из _TOTAL_ записей",
"infoEmpty": "Отображение от 0 до 0 из 0 записей",
"infoFiltered": "(отфильтровано по _MAX_ количеству записей)",
"infoPostFix": "",
"lengthMenu": "Показывать записи _MENU_",
"loadingRecords": "Загрузка...",
"paginate": {
"first": "Первый",
"last": "Последний",
"next": "Следующий",
"previous": "Предыдущий"
},
"processing": "Обработка...",
"search": "Поиск:",
"select": {
"cells": {
"0": "Нажмите на ячейку, чтобы выбрать ее",
"1": "%d ячейка выбрана",
"_": "%d ячеек выбрано"
},
"columns": {
"0": "Нажмите на столбец, чтобы выбрать его",
"1": "%d колонка выбрана",
"_": "%d колонок выбрано"
},
"rows": {
"0": "Нажмите на строку, чтобы выбрать ее",
"1": "%d строка выбрана",
"_": "%d строк выбрано"
}
},
"thousands": ",",
"zeroRecords": "Совпадающих записей не найдено"
},
"loadingRecords": "Загрузка..."
},
"error": {
"agree": "Согласиться",
"bedrockError": "Загрузка Bedrock недоступна. Пожалуйста, проверьте",
"bigBucket1": "Не удалось выполнить проверку работоспособности Big Bucket. Пожалуйста, проверьте",
"bigBucket2": "для получения самой актуальной информации.",
"cancel": "Отмена",
"contact": "Свяжитесь со службой поддержки Crafty Control через Discord",
"craftyStatus": "Страница статуса Crafty",
"cronFormat": "Обнаружен недопустимый формат Cron",
"embarassing": "О боже, ну что ж, это так неловко.",
"error": "Ошибка!",
"eulaAgree": "Вы согласны?",
"eulaMsg": "Вы должны согласиться с",
"eulaTitle": "Согласитесь с EULA",
"fileError": "Типом файла должно быть изображение.",
"fileTooLarge": "Ошибка загрузки. Загружен слишком большой файл. Обратитесь за помощью к системному администратору.",
"hereIsTheError": "Вот в чем ошибка",
"installerJava": "Не удалось установить {} : Для установки Forge Server требуется Java. Мы обнаружили, что Java не установлена. Пожалуйста, установите java, а затем установите сервер.",
"internet": "Мы обнаружили, что компьютер, на котором запущен Crafty, не подключен к интернету. Возможно, подключение клиента к серверу ограничено.",
"migration": "Хранилище основного сервера Crafty переносится в новое место. В течение этого времени все запуски серверов были приостановлены. Пожалуйста, подождите, пока мы завершим эту миграцию",
"no-file": "Похоже, мы не можем найти запрошенный файл. Дважды проверьте путь. Есть ли у Crafty соответствующие разрешения?",
"noInternet": "У Crafty проблемы с доступом в интернет. Создание сервера было отключено. Пожалуйста, проверьте свое интернет-соединение и обновите эту страницу.",
"noJava": "Серверу {} не удалось запуститься с кодом ошибки: мы обнаружили, что Java не установлена. Пожалуйста, установите java, затем запустите сервер.",
"not-downloaded": "Похоже, мы не можем найти ваш исполняемый файл. Загрузка завершена? Установлены ли права доступа к исполняемому файлу?",
"portReminder": "Мы обнаружили, что это первый запуск {}. Убедитесь, что вы перенаправили порт {} через свой маршрутизатор/брандмауэр, чтобы сделать его удаленно доступным из интернета.",
"privMsg": "и ",
"return": "Вернуться к панели управления",
"selfHost": "Если вы самостоятельно размещаете этот репозиторий, пожалуйста, проверьте свой адрес или обратитесь к нашему руководству по устранению неполадок.",
"start-error": "Серверу {} не удалось запуститься с кодом ошибки: {}",
"superError": "Для выполнения этого действия вы должны быть суперпользователем.",
"terribleFailure": "Какая ужасная неудача!"
},
"footer": {
"allRightsReserved": "Все права защищены",
"copyright": "Авторское право",
"version": "Версия"
},
"login": {
"defaultPath": "Введенный вами пароль - это путь к учетным данным по умолчанию, а не пароль. Пожалуйста, найдите пароль по умолчанию в этом месте.",
"disabled": "Учетная запись пользователя отключена. Пожалуйста, обратитесь к своему системному администратору за дополнительной информацией.",
"forgotPassword": "Забыли пароль",
"incorrect": "Неверное имя пользователя или пароль",
"login": "Войти",
"password": "Пароль",
"username": "Имя пользователя",
"viewStatus": "Просмотр страницы общедоступного статуса"
},
"notify": {
"activityLog": "Журналы действий",
"backupComplete": "Резервное копирование сервера успешно завершено {}",
"backupStarted": "Начато резервное копирование для сервера {}",
"downloadLogs": "Загружать журналы поддержки?",
"finishedPreparing": "Мы закончили подготовку ваших журналов поддержки. Пожалуйста, нажмите загрузить, чтобы загрузить",
"logout": "Выход из системы",
"preparingLogs": " Пожалуйста, подождите, пока мы подготовим ваши журналы... Мы отправим уведомление, когда они будут готовы. При больших объемах развертывания это может занять некоторое время.",
"supportLogs": "Журналы поддержки"
},
"offline": {
"offline": "Оффлайн",
"pleaseConnect": "Пожалуйста, подключитесь к интернету, чтобы использовать Crafty."
},
"panelConfig": {
"adminControls": "Административное управление",
"allowedServers": "Разрешенные серверы",
"apply": "Применить",
"assignedRoles": "Назначенные роли",
"cancel": "Отменить",
"clearComms": "Очистить неисполненные команды",
"custom": "Персонализировать Crafty",
"delete": "Удалить",
"edit": "Редактировать",
"enableLang": "Включить все языки",
"enabled": "Включено",
"globalExplain": "Где Crafty хранит все ваши серверные файлы. (Мы добавим к пути /servers/[uuid of server])",
"globalServer": "Глобальный каталог серверов",
"json": "Config.json",
"match": "Пароли должны совпадать",
"newRole": "Добавить новую роль",
"newUser": "Добавить нового пользователя",
"noMounts": "Не показывать диски на приборной панели",
"pageTitle": "Конфигурация панели",
"role": "Роль",
"roleUsers": "Пользователи роли",
"roles": "Роли",
"save": "Сохранить",
"select": "Выбрать",
"superConfirm": "Действуйте только в том случае, если вы хотите, чтобы у этого пользователя был доступ ко ВСЕМУ (ко всем учетным записям пользователей, серверам, настройкам панели и т.д.). Они могут даже лишить вас прав суперпользователя.",
"superConfirmTitle": "Включить суперпользователя? Вы уверены?",
"title": "Crafty конфигурация",
"user": "Пользователь",
"users": "Пользователи"
},
"rolesConfig": {
"config": "Конфигурация ролей",
"configDesc": "Здесь вы можете изменить конфигурацию вашей роли",
"configUpdate": "Последнее обновление: ",
"created": "Создан: ",
"delRole": "Удалить роль",
"doesNotExist": "Вы не можете удалить то, чего еще не существует",
"pageTitle": "Изменить роль",
"pageTitleNew": "Новая роль",
"permAccess": "Доступ?",
"permName": "Имя разрешения",
"permsServer": "Разрешения, которыми обладает эта роль для этих указанных серверов",
"roleConfigArea": "Область конфига роли",
"roleDesc": "Как бы вы хотели назвать эту роль?",
"roleName": "Имя роли: ",
"rolePerms": "Разрешения роли",
"roleServers": "Разрешенные серверы",
"roleTitle": "Настройки ролей",
"roleUserName": "Имя пользователя",
"roleUsers": "Пользователи роли: ",
"selectManager": "Выберать менеджера для этой роли",
"serverAccess": "Доступ?",
"serverName": "Имя сервера",
"serversDesc": "серверы, доступ к которым разрешен для этой роли"
},
"serverBackups": {
"actions": "Действия",
"after": "Запустить команду после создания резервной копии",
"backupAtMidnight": "Автоматическое резервное копирование в полночь?",
"backupNow": "Сделать резервную копию сейчас!",
"backupTask": "Запущена задача резервного копирования.",
"backups": "Резервные копии сервера",
"before": "Запустить команду перед резервным копированием",
"cancel": "Отменить",
"clickExclude": "Нажмите, чтобы выбрать исключения",
"compress": "Сжатие резервной копии",
"confirm": "Подтвердить",
"confirmDelete": "Вы хотите удалить эту резервную копию? Это невозможно будет отменить.",
"confirmRestore": "Вы уверены, что хотите выполнить восстановление из этой резервной копии? Все текущие файлы сервера перейдут в состояние резервной копии и будут недоступны восстановлению.",
"currentBackups": "Текущие резервные копии",
"default": "Резервное копирование по умолчанию",
"defaultExplain": "Резервная копия, которую Crafty будет использовать перед обновлением. Ее нельзя изменить или удалить.",
"delete": "Удалить",
"destroyBackup": "Уничтожить резервную копию \" + file_to_del + \"?",
"download": "Скачать",
"edit": "Изменить",
"enabled": "Включено",
"excludedBackups": "Исключенные пути: ",
"excludedChoose": "Выберите пути, которые вы хотите исключить из своих резервных копий",
"exclusionsTitle": "Исключения из резервного копирования",
"failed": "Неудача",
"maxBackups": "Максимально резервных копий",
"maxBackupsDesc": "Crafty не будет хранить более N резервных копий, удаляя самые старые (введите 0, чтобы сохранить все).",
"myBackup": "Моя новая резервная копия",
"name": "Имя",
"newBackup": "Создать новую резервную копию",
"no-backup": "Резервных копий нет. Чтобы создать новую конфигурацию резервного копирования, пожалуйста, нажмите - новая резервная копия",
"options": "Опции",
"path": "Путь",
"restore": "Восстановить",
"restoring": "Восстановление резервной копии. Это может занять некоторое время. Пожалуйста, наберитесь терпения.",
"run": "Запустить резервное копирование",
"save": "Сохранить",
"shutdown": "Выключить сервер на время резервного копирования",
"size": "Размер",
"standby": "Ожидание",
"status": "Статус",
"storage": "Место хранения",
"storageLocation": "Место хранения",
"storageLocationDesc": "Где вы хотите хранить резервные копии?"
},
"serverConfig": {
"bePatientDelete": "Пожалуйста, наберитесь терпения, пока мы удаляем ваш сервер из панели Crafty. Этот экран закроется через несколько секунд.",
"bePatientDeleteFiles": "Пожалуйста, наберитесь терпения, пока мы удаляем ваш сервер из панели Crafty и удаляем все файлы. Этот экран закроется через несколько секунд.",
"bePatientUpdate": "Пожалуйста, наберитесь терпения, пока мы обновляем сервер. Время загрузки может варьироваться в зависимости от скорости вашего Интернета.<br /> Этот экран обновится через мгновение",
"cancel": "Отмена",
"countPlayers": "Включить сервер в общее количество игроков",
"crashTime": "Тайм-аут при сбое",
"crashTimeDesc": "Как долго нам следует ждать, прежде чем считать ваш сервер аварийным?",
"deleteFilesQuestion": "Удалять серверные файлы с компьютера?",
"deleteFilesQuestionMessage": "Хотели бы вы, чтобы Crafty удалил все серверные файлы с хост-компьютера? <br><br><strong>Это включает в себя резервное копирование серверов.</strong>",
"deleteServer": "Удалить сервер",
"deleteServerQuestion": "Удалить сервер?",
"deleteServerQuestionMessage": "Вы уверены, что хотите удалить этот сервер? После этого пути назад не будет...",
"exeUpdateURL": "URL-адрес обновления исполняемого файла сервера",
"exeUpdateURLDesc": "Прямой URL-адрес для загрузки обновлений.",
"ignoredExits": "Игнорируемые коды аварийного выхода",
"ignoredExitsExplain": "Коды выхода при обнаружении сбоя Crafty следует игнорировать как обычную 'остановку' (через запятую).",
"javaNoChange": "Не переопределять",
"javaVersion": "Переопределить текущую версию Java",
"javaVersionDesc": "Если вы собираетесь переопределить Java, убедитесь, что ваш текущий путь к Java указан в 'Команда выполнения сервера' и заключен в кавычки (по умолчанию 'java')",
"noDelete": "Нет, вернуться",
"noDeleteFiles": "Нет, просто убрать с панели",
"removeOldLogsAfter": "Удалить старые журналы после",
"removeOldLogsAfterDesc": "На сколько дней должен устареть файл журнала, чтобы его удалили (0 значит выключено)",
"save": "Сохранить",
"sendingDelete": "Удалить сервер",
"sendingRequest": "Отправка вашего запроса...",
"serverAutoStart": "Автоматический запуск сервера",
"serverAutostartDelay": "Задержка автозапуска сервера",
"serverAutostartDelayDesc": "Задержка перед автоматическим запуском (если включена ниже)",
"serverCrashDetection": "Обнаружение сбоя сервера",
"serverExecutable": "Исполняемый файл сервера",
"serverExecutableDesc": "Это исполняемый файл сервера (ядро)",
"serverExecutionCommand": "Команда выполнения сервера",
"serverExecutionCommandDesc": "Что будет запущено в скрытом терминале",
"serverIP": "IP сервера",
"serverIPDesc": "IP, к которому Crafty должен подключиться для получения статистики (попробуйте использовать реальный ip вместо 127.0.0.1, если у вас возникли проблемы)",
"serverLogLocation": "Расположение журнала сервера",
"serverLogLocationDesc": "Путь к файлу журнала",
"serverName": "Имя сервера",
"serverNameDesc": "Как вы хотите называть этот сервер",
"serverPath": "Рабочий каталог сервера",
"serverPathDesc": "Абсолютный полный путь (не включая исполняемый файл)",
"serverPort": "Порт сервера",
"serverPortDesc": "Порт, к которому Crafty должен подключиться для получения статистики",
"serverStopCommand": "Команда остановки сервера",
"serverStopCommandDesc": "Команда для отправки программе команды на остановку",
"showStatus": "Показывать на странице публичного статуса",
"shutdownTimeout": "Тайм-аут выключения",
"statsHint1": "Порт, на котором работает ваш сервер, должен быть указан здесь. Именно так Crafty открывает соединение с вашим сервером для получения статистики.",
"statsHint2": "Это не изменит порт вашего сервера. Вы все равно должны изменить порт в файле конфигурации вашего сервера.",
"stopBeforeDeleting": "Пожалуйста, остановите сервер перед его удалением",
"timeoutExplain1": "Как долго Crafty будет ждать завершения работы вашего сервера после выполнения",
"timeoutExplain2": "выполните команду до того, как она остановит процесс.",
"update": "Исполняемый файл обновления",
"yesDelete": "Да, удалить",
"yesDeleteFiles": "Да, удалить файлы"
},
"serverConfigHelp": {
"desc": "Здесь вы можете изменить конфигурацию вашего сервера",
"perms": [
"Рекомендуется <code>НЕ</code> изменять пути к серверу, управляемому Crafty.",
"Изменение путей <code>МОЖЕТ</code> нарушить работу, особенно в операционных системах типа Linux, где права доступа к файлам более ограничены.",
"<br /><br/>",
"Если вы чувствуете, что вам необходимо изменить местоположение сервера, вы можете сделать это при условии, что предоставите соответствующее разрешение \"crafty\" разрешение пользователя на чтение/запись пути к серверу.",
"<br />",
"<br />",
"В Linux это лучше всего сделать, выполнив следующие действия:<br />",
"<code>",
" sudo chown crafty:crafty /путь/до/вашего/сервера -R<br />",
" sudo chmod 2775 /путь/до/вашего/сервера -R<br />",
"</code>"
],
"title": "Область настройки сервера"
},
"serverDetails": {
"backup": "Резервная копия",
"config": "Конфиг",
"files": "Файлы",
"filter": "Фильтровать логи",
"filterList": "Отфильтрованные слова",
"logs": "Логи",
"metrics": "Показатели",
"playerControls": "Управление игроками",
"reset": "Сброс прокрутки",
"schedule": "График",
"serverDetails": "Сведения о сервере",
"terminal": "Терминал"
},
"serverFiles": {
"clickUpload": "Нажмите здесь, чтобы выбрать нужные файлы",
"close": "Закрыть",
"createDir": "Создать каталог",
"createDirQuestion": "Какое имя вы хотите задать для нового каталога?",
"createFile": "Создать файл",
"createFileQuestion": "Какое имя вы хотите задать для нового файла?",
"default": "По умолчанию",
"delete": "Удалить",
"deleteItemQuestion": "Вы уверены, что хотите удалить \" + name + \"?",
"deleteItemQuestionMessage": "Вы удаляете \\\"\" + path + \"\\\"!<br/><br/>Это действие будет необратимым, и это будет потеряно навсегда!",
"download": "Загрузить",
"editingFile": "Изменить файл",
"error": "Ошибка при получении файлов",
"fileReadError": "Ошибка чтения файла",
"files": "Файлы",
"keybindings": "Сочетания клавиш",
"loadingRecords": "Загрузка файлов...",
"noDelete": "Нет",
"noscript": "Файловый менеджер не работает без JavaScript",
"rename": "Переименовать",
"renameItemQuestion": "Каким должно быть новое имя?",
"save": "Сохранить",
"size": "Переключение размера редактора",
"stayHere": "НЕ ПОКИДАЙТЕ ЭТУ СТРАНИЦУ!",
"unsupportedLanguage": "Предупреждение: Этот тип файлов не поддерживается",
"unzip": "Распаковать",
"upload": "Загрузить",
"uploadTitle": "Загрузить файлы в: ",
"waitUpload": "Пожалуйста, подождите, пока мы загрузим ваши файлы... Это может занять некоторое время.",
"yesDelete": "Да, я понимаю последствия"
},
"serverMetrics": {
"resetZoom": "Сброс масштаба",
"zoomHint1": "Чтобы увеличить масштаб графика, удерживайте клавишу shift, а затем используйте колесико прокрутки.",
"zoomHint2": "В качестве альтернативы удерживайте клавишу shift, затем щелкните и перетащите область, которую вы хотите увеличить."
},
"serverPlayerManagement": {
"bannedPlayers": "Забаненные игроки",
"loadingBannedPlayers": "Загрузка забаненных игроков",
"players": "Игроки"
},
"serverScheduleConfig": {
"backup": "Резервная копия сервера",
"basic": "Основной",
"children": "Связанные дочерние задачи: ",
"command": "Команда",
"command-explain": "Какую команду вы хотите, чтобы мы выполнили? Не включайте команду '/'",
"cron": "Cron",
"cron-explain": "Введите свою строку cron -- ПРИМЕЧАНИЕ: 0 = понедельник в последнем варианте.",
"custom": "Пользовательская команда",
"days": "Дни",
"enabled": "Включено",
"hours": "Часы",
"interval": "Интервал",
"interval-explain": "Как часто вы хотите, чтобы это расписание выполнялось?",
"minutes": "Минуты",
"offset": "Смещение задержки",
"offset-explain": "Как долго мы должны ждать, чтобы запустить это после запуска первого задания? (Секунды)",
"one-time": "Удалить после выполнения",
"parent": "Выберите родительское расписание",
"parent-explain": "По какому расписанию это должно произойти?",
"reaction": "Реакция",
"restart": "Перезапустить сервер",
"select": "Основной / Cron / Реакция",
"start": "Запустить сервер",
"stop": "Остановить сервер",
"time": "Время",
"time-explain": "На какое время вы хотите, чтобы ваше расписание было составлено?"
},
"serverSchedules": {
"action": "Действие",
"actionId": "Выберите дочернее действие",
"areYouSure": "Удалить запланированную задачу?",
"cancel": "Отмена",
"cannotSee": "Не видишь всего?",
"cannotSeeOnMobile": "Попробуйте нажать на запланированную задачу, чтобы получить более подробную информацию.",
"child": "Дочерний элемент расписания с ID ",
"close": "Закрыть",
"command": "Команда",
"confirm": "Подтверждаю",
"confirmDelete": "Вы хотите удалить это запланированное задание? Это невозможно будет отменить.",
"create": "Создать новое расписание",
"cron": "Cron строка",
"delete": "Удалить",
"details": "Подробная информация о расписании",
"edit": "Редактировать",
"enabled": "Включено",
"every": "Каждый",
"interval": "Интервал",
"name": "Имя",
"newSchedule": "Новое расписание",
"nextRun": "Следующий запуск",
"no": "Нет",
"no-schedule": "В настоящее время для этого сервера нет расписаний. Чтобы начать, нажмите",
"scheduledTasks": "Запланированные задачи",
"yes": "Да"
},
"serverStats": {
"cpuUsage": "Нагрузка CPU",
"description": "Описание",
"errorCalculatingUptime": "Ошибка при расчете времени безотказной работы",
"loadingMotd": "Загрузка MOTD",
"memUsage": "Нагрузка памяти",
"offline": "Оффлайн",
"online": "Онлайн",
"players": "Игроки",
"serverStarted": "Сервер запущен",
"serverStatus": "Состояние сервера",
"serverTime": "UTC время",
"serverTimeZone": "Часовой пояс сервера",
"serverUptime": "Время безотказной работы сервера",
"starting": "Отложенный запуск",
"unableToConnect": "Не удается подключиться",
"version": "Версия"
},
"serverTerm": {
"commandInput": "Введите свою команду",
"delay-explained": "Служба/агент недавно запустилась и задерживает запуск экземпляра сервера minecraft",
"importing": "Импорт...",
"installing": "Установка...",
"restart": "Перезапуск",
"sendCommand": "Отправить команду",
"start": "Запустить",
"starting": "Отложенный запуск",
"stop": "Остановить",
"stopScroll": "Остановить автоматическую прокрутку",
"updating": "Обновление..."
},
"serverWizard": {
"absoluteServerPath": "Абсолютный путь к вашему серверу",
"absoluteZipPath": "Абсолютный путь к вашему серверу",
"addRole": "Добавление сервера к существующей роли(-ям)",
"autoCreate": "Если ничего не выбрать, Crafty создаст и назначит роль сам!",
"bePatient": "Пожалуйста, будьте терпеливы, пока мы ' + (importing ? 'импортируем' : 'загружаем') + ' сервер",
"buildServer": "Создать сервер!",
"clickRoot": "Нажмите здесь, чтобы выбрать корневой каталог",
"close": "Закрыть",
"defaultPort": "25565 по умолчанию",
"downloading": "Загрузка сервера...",
"explainRoot": "Пожалуйста, нажмите на кнопку ниже, чтобы выбрать корневой каталог вашего сервера внутри архива",
"importServer": "Импорт существующего сервера",
"importServerButton": "Импортировать сервер!",
"importZip": "Импорт из Zip-файла",
"importing": "Импорт сервера...",
"labelZipFile": "Выберите свой Zip-файл",
"maxMem": "Максимальный объем памяти",
"minMem": "Минимальный объем памяти",
"myNewServer": "Мой новый сервер",
"newServer": "Создать новый сервер",
"noRole": "Не найдена роль с текущим параметром поиска",
"noneRoles": "Роли не выбраны",
"quickSettings": "Быстрые настройки",
"quickSettingsDescription": "Не волнуйтесь, вы можете изменить это позже",
"resetForm": "Сбросить форму",
"save": "Сохранить",
"selectRole": "Выберите роль(-и)",
"selectRoot": "Выберите корневой каталог архива",
"selectServer": "Выбрать сервер",
"selectType": "Тип сервера (Vanilla, Servers, Modded и т.д.)",
"selectVersion": "Выбрать версию",
"selectZipDir": "Выберите каталог в архиве, из которого вы хотите, чтобы мы распаковали файлы",
"serverJar": "Исполняемый файл сервера",
"serverName": "Имя сервера",
"serverPath": "Путь к серверу",
"serverPort": "Порт сервера",
"serverSelect": "Выбрать сервер",
"serverType": "Тип сервера",
"serverUpload": "Загрузить архивированный сервер",
"serverVersion": "Версия сервера",
"sizeInGB": "Размер в GB",
"unsupported": "Версии Minecraft ниже 1.8 не поддерживаются Crafty. Вы все равно можете установить его. Результаты могут отличаться.",
"uploadButton": "Загрузить",
"uploadZip": "Загрузить Zip-Файл для импорта на сервер",
"zipPath": "Путь к серверу"
},
"sidebar": {
"contribute": "Сотрудничать",
"credits": "Благодарности",
"dashboard": "Приборная панель",
"documentation": "Документация",
"inApp": "Документация в приложении",
"navigation": "Навигация",
"newServer": "Создать новый сервер",
"servers": "Серверы"
},
"startup": {
"almost": "Заканчиваю. Держись крепче...",
"cache": "Обновление файла кэша Big Bucket",
"internals": "Настройка и запуск внутренних компонентов Crafty",
"internet": "Проверка наличия подключения к интернету",
"server": "Инициализация ",
"serverInit": "Инициализация серверов",
"starting": "Crafty запускается...",
"tasks": "Запуск планировщика задач"
},
"userConfig": {
"apiKey": "API ключи",
"auth": "Разрешить? ",
"config": "Конфиг",
"configArea": "Область настройки пользователя",
"configAreaDesc": "Здесь вы можете изменить все свои пользовательские настройки",
"confirmDelete": "Вы уверены, что хотите удалить этого пользователя? Это действие необратимо.",
"craftyPermDesc": "Crafty разрешения, которыми обладает этот пользователь ",
"craftyPerms": "Crafty разрешения: ",
"created": "Создан: ",
"delSuper": "Вы не можете удалить суперпользователя",
"deleteUser": "Удалить пользователя: ",
"deleteUserB": "Удалить пользователя",
"enabled": "Включён",
"gravDesc": "Это электронное письмо предназначено исключительно для использования с Gravatar™. Crafty ни при каких обстоятельствах не будет использовать это электронное письмо для чего-либо, кроме поиска вашего Gravatar™",
"gravEmail": "Gravatar™ Email",
"lastIP": "Последний IP: ",
"lastLogin": "Последний вход в систему: ",
"lastUpdate": "Последнее обновление: ",
"leaveBlank": "Чтобы отредактировать пользователя без смены пароля, оставьте поле пустым.",
"manager": "Менеджер",
"member": "Участник?",
"notExist": "Вы не можете удалить то, чего не существует!",
"pageTitle": "Редактировать пользователя",
"pageTitleNew": "Создать пользователя",
"password": "Новый пароль",
"permName": "Имя разрешения",
"repeat": "Подтвердите пароль",
"roleName": "Имя роли",
"selectManager": "Выберите менеджера для пользователя",
"super": "Суперпользователь",
"userLang": "Язык пользователя",
"userName": "Имя пользователя",
"userNameDesc": "Как вы хотите называть этого пользователя?",
"userRoles": "Роли пользователя",
"userRolesDesc": "Роли, участником которых является этот пользователь.",
"userSettings": "Настройки пользователя",
"userTheme": "Тема пользовательского интерфейса",
"uses": "Количество использований (-1==без ограничений)"
},
"validators": {
"passLength": "Пароль слишком короткий. Минимальная длина: 8"
},
"webhooks": {
"areYouSureDel": "Вы уверены, что хотите удалить этот вебхук?",
"areYouSureRun": "Вы уверены, что хотите протестировать этот вебхук?",
"backup_server": "Завершено резервное копирование сервера",
"bot_name": "Имя бота",
"color": "Выберите цветовой акцент",
"crash_detected": "Сервер вышел из строя",
"edit": "Редактировать",
"enabled": "Включено",
"jar_update": "Обновлен исполняемый файл сервера",
"kill": "Сервер принудительно остановлен",
"name": "Имя",
"new": "Новый вебхук",
"newWebhook": "Новый вебхук",
"no-webhook": "В настоящее время для этого сервера нет веб-ссылок. Чтобы начать, нажмите",
"run": "Тестовый запуск вебхука",
"send_command": "Получена команда сервера",
"start_server": "Сервер запущен",
"stop_server": "Сервер остановлен",
"trigger": "Триггер",
"type": "Тип вебхука",
"url": "Вебхук URL",
"webhook_body": "Тело вебхука",
"webhooks": "Вебхуки"
}
}