diff --git a/lang/ru.yml b/lang/ru.yml index bee1016..baaf33e 100644 --- a/lang/ru.yml +++ b/lang/ru.yml @@ -1,202 +1,202 @@ # CoreProtect Language File (ru) -ACTION_NOT_SUPPORTED: "Данное действие не поддерживается этой командой." +ACTION_NOT_SUPPORTED: "Данное действие не поддерживается этой командой" AMOUNT_BLOCK: "{0} {блок|блоков}" AMOUNT_CHUNK: "{0} {чанк|чанков}" AMOUNT_ENTITY: "{0} {существо|существ}" AMOUNT_ITEM: "{0} {предмет|предметов}" -API_TEST: "Тест API прошёл успешно!" -CACHE_ERROR: "ВНИМАНИЕ: Ошибка при проверке кеша {0}." -CACHE_RELOAD: "Принудительная перезагрузка кеша {отображения|мира} из базы данных." -CHECK_CONFIG: "Пожалуйста, проверьте config.yml" -COMMAND_CONSOLE: "Пожалуйста, запустите команду из консоли." -COMMAND_NOT_FOUND: "Команда «{0}» не найдена." -COMMAND_THROTTLED: "Подождите немного и попробуйте еще раз." -CONSUMER_ERROR: "Обработка потребительской очереди уже {приостановлено|возобновлено}." -CONSUMER_TOGGLED: "Обработка очереди потребителей была {приостановлено|возобновлено}." +API_TEST: "Тест API прошёл успешно!" +CACHE_ERROR: "ВНИМАНИЕ: Ошибка при проверке кеша {0}" +CACHE_RELOAD: "Принудительная перезагрузка кеша {отображения|мира} из базы данных" +CHECK_CONFIG: "Пожалуйста, проверьте config.yml" +COMMAND_CONSOLE: "Пожалуйста, запустите команду из консоли" +COMMAND_NOT_FOUND: "Команда «{0}» не найдена" +COMMAND_THROTTLED: "Подождите немного и попробуйте еще раз" +CONSUMER_ERROR: "Обработка потребительской очереди уже {приостановлено|возобновлено}" +CONSUMER_TOGGLED: "Обработка очереди потребителей {приостановлена|возобновлена}" CONTAINER_HEADER: "Контейнерные транзакции" -DATABASE_BUSY: "База данных занята. Пожалуйста, повторите попытку позже." -DATABASE_INDEX_ERROR: "Невозможно проверить индексы базы данных." -DATABASE_LOCKED_1: "База данных заблокирована. Подождите около 15 секунд..." -DATABASE_LOCKED_2: "База данных уже используется. Пожалуйста, попробуйте еще раз." -DATABASE_LOCKED_3: "Чтобы отключить блокировку базы данных, установите «database-lock: false»." -DATABASE_LOCKED_4: "Отключение блокировки базы данных может привести к повреждению данных." -DATABASE_UNREACHABLE: "База данных недоступна. Удаление данных и завершение работы." -DEVELOPMENT_BRANCH: "Обнаружена ветвь разработки, скрипты исправлений пропущены." -DIRT_BLOCK: "Под вами установлен блок грязи." +DATABASE_BUSY: "База данных занята, повторите попытку позже" +DATABASE_INDEX_ERROR: "Невозможно проверить индексы базы данных" +DATABASE_LOCKED_1: "База данных заблокирована, подождите около 15 секунд..." +DATABASE_LOCKED_2: "База данных уже используется, попробуйте еще раз" +DATABASE_LOCKED_3: "Чтобы отключить блокировку базы данных, установите «database-lock: false»" +DATABASE_LOCKED_4: "Отключение блокировки базы данных может привести к повреждению данных" +DATABASE_UNREACHABLE: "База данных недоступна. Удаление данных и завершение работы" +DEVELOPMENT_BRANCH: "Обнаружена ветвь разработки, скрипты исправлений пропущены" +DIRT_BLOCK: "Под вами установлен блок грязи" DISABLE_SUCCESS: "{0} был успешно отключён!" -ENABLE_FAILED: "{0} не удалось запустить." +ENABLE_FAILED: "{0} не удалось запустить" ENABLE_SUCCESS: "{0} был успешно запущен!" ENJOY_COREPROTECT: "Нравится {0}? Присоединяйтесь к нашему Discord!" -FINISHING_CONVERSION: "Завершение преобразования данных. Пожалуйста, подождите..." -FINISHING_LOGGING: "Завершение регистрации данных. Пожалуйста, подождите..." +FINISHING_CONVERSION: "Завершение преобразования данных. Пожалуйста, подождите..." +FINISHING_LOGGING: "Завершение регистрации данных. Пожалуйста, подождите..." FIRST_VERSION: "Исходная БД: {0}" -GLOBAL_LOOKUP: "Не указывайте радиус для глобального поиска." -GLOBAL_ROLLBACK: "Используйте «{0}», чтобы сделать {откат|восстановление} глобально" -HELP_ACTION_1: "Ограничьте поиск определенным действием." +GLOBAL_LOOKUP: "Радиус для глобального поиска не требуется" +GLOBAL_ROLLBACK: "Используйте «{0}», чтобы сделать {откат|восстановление} глобально" +HELP_ACTION_1: "Ограничьте поиск определенным действием" HELP_ACTION_2: "Например: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]" -HELP_COMMAND: "Показать дополнительную информацию." -HELP_EXCLUDE_1: "Исключите блоки/пользователей." +HELP_COMMAND: "Показать дополнительную информацию" +HELP_EXCLUDE_1: "Исключите блоки/пользователей" HELP_EXCLUDE_2: "Например: [e:stone], [e:Notch], [e:stone,Notch]" -HELP_HEADER: "{0} Помощь" -HELP_INCLUDE_1: "Включите определенные блоки/сущности." +HELP_HEADER: "Помощь по командам (отслеживание действий)" +HELP_INCLUDE_1: "Включите определенные блоки/сущности" HELP_INCLUDE_2: "Например: [i:stone], [i:zombie], [i:stone,wood,bedrock]" -HELP_INSPECT_1: "С включенным режимом инспектора вы можете сделать следующее:" -HELP_INSPECT_2: "Щелкните левой кнопкой мыши по блоку, чтобы увидеть, кто разместил этот блок.." -HELP_INSPECT_3: "Щелкните блок правой кнопкой мыши, чтобы увидеть, какой соседний блок был сломан.." -HELP_INSPECT_4: "Поместите блок, чтобы увидеть, какой блок был сломан в этом месте." -HELP_INSPECT_5: "Поместите блок в жидкость (и т.п.), чтобы увидеть, кто его поместил." -HELP_INSPECT_6: "Щелкните правой кнопкой мыши дверь, сундук и т.д., чтобы узнать, кто последний использовал их." -HELP_INSPECT_7: "Подсказка: Вы можете использовать «/co i» для быстрого переключения режима инспектора." -HELP_INSPECT_COMMAND: "Включает или выключает режим инспектора блоков." -HELP_LIST: "Отображает список всех команд." -HELP_LOOKUP_1: "Команда быстрого доступа." -HELP_LOOKUP_2: "Используйте после проверки блока для просмотра журналов." -HELP_LOOKUP_COMMAND: "Глобальный поиск данных блоков." -HELP_NO_INFO: "Информация о команде «{0}» не найдена." -HELP_PARAMETER: "Пожалуйста, просмотрите «{0}» для получения подробной информации о параметрах." -HELP_PARAMS_1: "Выполните {поиск|откат|восстановление}." -HELP_PARAMS_2: "Укажите пользователей для {поиска|отката|восстановления}." -HELP_PARAMS_3: "Укажите время для {поиска|отката|восстановления}." -HELP_PARAMS_4: "Укажите область радиуса, чтобы ограничить {поиск|откат|восстановление}." -HELP_PARAMS_5: "Ограничьте {поиск|откат|восстановление} определенным действием." -HELP_PARAMS_6: "Включите определенные блоки/объекты в {поиск|откат|восстановление}." -HELP_PARAMS_7: "Исключите блоки/пользователей из {поиска|отката|восстановления}." -HELP_PURGE_1: "Удалить данные старше указанного времени." -HELP_PURGE_2: "Например, «{0}» удалит все данные старше одного месяца и сохранит данные только за последние 30 дней." -HELP_PURGE_COMMAND: "Удалит старые данные блока." -HELP_RADIUS_1: "Укажите радиус области." +HELP_INSPECT_1: "С включенным режимом CHECKER вы можете сделать следующее:" +HELP_INSPECT_2: "Щелкните левой кнопкой мыши по блоку, чтобы увидеть, кто разместил этот блок" +HELP_INSPECT_3: "Щелкните блок правой кнопкой мыши, чтобы увидеть, какой соседний блок был сломан" +HELP_INSPECT_4: "Поместите блок, чтобы увидеть, какой блок был сломан в этом месте" +HELP_INSPECT_5: "Поместите блок в жидкость (и т.п.), чтобы увидеть, кто его поместил" +HELP_INSPECT_6: "Щелкните правой кнопкой мыши дверь, сундук и т.д., чтобы узнать, кто последний использовал их" +HELP_INSPECT_7: "Подсказка: Вы можете использовать «/co i» для быстрого переключения режима CHECKER" +HELP_INSPECT_COMMAND: "Включает или выключает режим проверки логов (CHECKER)" +HELP_LIST: "Отображает список всех команд" +HELP_LOOKUP_1: "Команда быстрого доступа" +HELP_LOOKUP_2: "Используйте после проверки блока для просмотра журналов" +HELP_LOOKUP_COMMAND: "Глобальный поиск данных блоков" +HELP_NO_INFO: "Информация о команде «{0}» не найдена" +HELP_PARAMETER: "Пожалуйста, просмотрите «{0}» для получения подробной информации о параметрах" +HELP_PARAMS_1: "Выполните {поиск|откат|восстановление}" +HELP_PARAMS_2: "Укажите пользователей для {поиска|отката|восстановления}" +HELP_PARAMS_3: "Укажите время для {поиска|отката|восстановления}" +HELP_PARAMS_4: "Укажите область радиуса, чтобы ограничить {поиск|откат|восстановление}" +HELP_PARAMS_5: "Ограничьте {поиск|откат|восстановление} определенным действием" +HELP_PARAMS_6: "Включите определенные блоки/объекты в {поиск|откат|восстановление}" +HELP_PARAMS_7: "Исключите блоки/пользователей из {поиска|отката|восстановления}" +HELP_PURGE_1: "Удалить данные старше указанного времени" +HELP_PURGE_2: "Например, «{0}» удалит все данные старше одного месяца и сохранит данные только за последние 30 дней" +HELP_PURGE_COMMAND: "Удалит старые данные блока" +HELP_RADIUS_1: "Укажите радиус области" HELP_RADIUS_2: "Например: [r:10] (Внесёт изменения только в пределах 10 блоков от вас)" -HELP_RELOAD_COMMAND: "Перезагружает файл конфигурации." -HELP_RESTORE_COMMAND: "Восстановит данные блока." -HELP_ROLLBACK_COMMAND: "Откатит данные блока." -HELP_STATUS: "Просмотр статуса плагина и информации о версии." -HELP_STATUS_COMMAND: "Отображает статус плагина." -HELP_TELEPORT: "Телепорт в локацию." -HELP_TIME_1: "Укажите время поиска." +HELP_RELOAD_COMMAND: "Перезагружает файл конфигурации" +HELP_RESTORE_COMMAND: "Отмена отката действий" +HELP_ROLLBACK_COMMAND: "Откат действий" +HELP_STATUS: "Просмотр статуса плагина и информации о версии" +HELP_STATUS_COMMAND: "Отображает статус плагина" +HELP_TELEPORT: "Телепорт в локацию" +HELP_TIME_1: "Укажите время поиска" HELP_TIME_2: "Например: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]" -HELP_USER_1: "Укажите пользовател(я/ей) для поиска." +HELP_USER_1: "Укажите пользовател(я/ей) для поиска" HELP_USER_2: "Например: [u:Notch], [u:Notch,#enderman]" -INCOMPATIBLE_ACTION: "«{0}» нельзя использовать с этим действием." -INSPECTOR_ERROR: "Режим инспектора уже {включён|выключен}." -INSPECTOR_TOGGLED: "Режим инспектора теперь {включён|выключен}." -INTEGRATION_ERROR: "Невозможно {инициализировать|отключить} регистрацию {0}." -INTEGRATION_SUCCESS: "{0} регистрация успешно {инициализирована|отключена}." -INTEGRATION_VERSION: "Обнаружена недопустимая версия {0}." +INCOMPATIBLE_ACTION: "«{0}» нельзя использовать с этим действием" +INSPECTOR_ERROR: "Режим CHECKER уже {включён|выключен}" +INSPECTOR_TOGGLED: "Режим CHECKER {включён|выключен}" +INTEGRATION_ERROR: "Невозможно {инициализировать|отключить} регистрацию {0}" +INTEGRATION_SUCCESS: "{0} регистрация успешно {инициализирована|отключена}" +INTEGRATION_VERSION: "Обнаружена недопустимая версия {0}" INTERACTIONS_HEADER: "Взаимодействие с игроками" -INVALID_ACTION: "Это недопустимое действие." -INVALID_BRANCH_1: "Неверная версия плагина (ветка не задана)." -INVALID_BRANCH_2: "Чтобы продолжить, установите ветку проекта на «development»." -INVALID_BRANCH_3: "Запуск кода который находится в разработке может привести к повреждению данных." -INVALID_CONTAINER: "Пожалуйста, сначала проверьте действующий контейнер." -INVALID_DONATION_KEY: "Недействительный ключ пожертвования." -INVALID_INCLUDE: "«{0}» неверное имя блока/сущности." -INVALID_INCLUDE_COMBO: "Это недопустимая комбинация блока/сущности." -INVALID_RADIUS: "Пожалуйста, введите допустимый радиус." -INVALID_SELECTION: "Выбор {0} не найден." -INVALID_USERNAME: "«{0}» неверное имя пользователя." -INVALID_WORLD: "Укажите действительный мир." +INVALID_ACTION: "Это недопустимое действие" +INVALID_BRANCH_1: "Неверная версия плагина (ветка не задана)" +INVALID_BRANCH_2: "Чтобы продолжить, установите ветку проекта на «development»" +INVALID_BRANCH_3: "Запуск кода который находится в разработке может привести к повреждению данных" +INVALID_CONTAINER: "Пожалуйста, сначала проверьте действующий контейнер" +INVALID_DONATION_KEY: "Недействительный ключ пожертвования" +INVALID_INCLUDE: "«{0}» неверное имя блока/сущности" +INVALID_INCLUDE_COMBO: "Недопустимая комбинация блока/сущности" +INVALID_RADIUS: "Пожалуйста, введите допустимый радиус." +INVALID_SELECTION: "Выбор {0} не найден" +INVALID_USERNAME: "«{0}» неверное имя пользователя." +INVALID_WORLD: "Укажите действительный мир" LATEST_VERSION: "Последняя версия: {0}" LINK_DISCORD: "Discord: {0}" LINK_DOWNLOAD: "Загрузить: {0}" LINK_PATREON: "Patreon: {0}" LINK_WIKI_BLOCK: "Названия блоков: {0}" LINK_WIKI_ENTITY: "Названия сущностей: {0}" -LOGGING_ITEMS: "{0} предметы регистрируются. Пожалуйста, подождите..." -LOGGING_TIME_LIMIT: "Достигнуто ограничение по времени регистрации. Удаление данных и завершение работы." -LOOKUP_BLOCK: "{0} {поставил|сломал} {1}." -LOOKUP_CONTAINER: "{0} {добавил|забрал} {1} {2}." +LOGGING_ITEMS: "{0} предметы регистрируются. Пожалуйста, подождите..." +LOGGING_TIME_LIMIT: "Достигнуто ограничение по времени регистрации. Удаление данных и завершение работы" +LOOKUP_BLOCK: "{0} {поставил|сломал} {1}" +LOOKUP_CONTAINER: "{0} {положил|забрал} {1} {2}" LOOKUP_HEADER: "{0} Результаты поиска" -LOOKUP_INTERACTION: "{0} {нажал|убил} {1}." -LOOKUP_ITEM: "{0} {подобрал|выкинул} {1} {2}." -LOOKUP_LOGIN: "{0} {вошёл|вышел}." +LOOKUP_INTERACTION: "{0} {нажал|убил} {1}" +LOOKUP_ITEM: "{0} {подобрал|выкинул} {1} {2}" +LOOKUP_LOGIN: "{0} {вошёл|вышел}" LOOKUP_PAGE: "Страница {0}" -LOOKUP_PROJECTILE: "{0} {бросил|выстрелил} {1} {2}." -LOOKUP_ROWS_FOUND: "{0} {строка|строк} найдено." -LOOKUP_SEARCHING: "Ведётся поиск. Пожалуйста подождите..." -LOOKUP_STORAGE: "{0} {положил|забрал} {1} {2}." -LOOKUP_TIME: "{0} назад" -LOOKUP_USERNAME: "{0} зарегистрирован как {1}." -MAXIMUM_RADIUS: "Максимальный радиус для {поиска|отката|восстановления} - {0}." -MISSING_ACTION_USER: "Чтобы использовать это действие, укажите пользователя." -MISSING_LOOKUP_TIME: "Пожалуйста, укажите количество времени, чтобы использовать {поиск|откат|восстановление}." -MISSING_LOOKUP_USER: "Укажите пользователя или {блок|радиус} для поиска." -MISSING_PARAMETERS: "Пожалуйста используйте «{0}»." -MISSING_ROLLBACK_RADIUS: "Вы не указали радиус {отката|восстановления}." -MISSING_ROLLBACK_USER: "Вы не указали пользователя для {отката|восстановления}." -MYSQL_UNAVAILABLE: "Невозможно подключиться к серверу MySQL." -NO_DATA: "Данные не найдены в {0}." -NO_DATA_LOCATION: "В этом месте {данные|транзакции|взаимодействия|сообщения} не обнаружены.." -NO_PERMISSION: "У вас нет прав чтобы сделать это." -NO_RESULTS: "Результаты не найдены." -NO_RESULTS_PAGE: "Для этой страницы {результатов|данных} не найдено." -NO_ROLLBACK: "{Ожидаемый|Предыдущий} откат/восстановление не найдены." -PATCH_INTERRUPTED: "Обновление прервано. Попробую снова при перезапуске." -PATCH_OUTDATED_1: "Невозможно обновить базы данных старше {0}." -PATCH_OUTDATED_2: "Пожалуйста, обновите поддерживаемую версию CoreProtect." -PATCH_PROCESSING: "Обработка новых данных. Пожалуйста, подождите..." -PATCH_SKIP_UPDATE: "{Пропущена таблица|Пропущен индекс} {обновление|создание|удаление} в {0}." -PATCH_STARTED: "Выполняется обновление {0}. Пожалуйста, подождите..." -PATCH_SUCCESS: "Успешно обновлен до {0}." -PATCH_UPGRADING: "Выполняется обновление базы данных. Пожалуйста, подождите..." -PLEASE_SELECT: "Пожалуйста выберите: «{0}» или «{1}»." -PREVIEW_CANCELLED: "Предварительный просмотр отменен." -PREVIEW_CANCELLING: "Отмена предварительного просмотра..." -PREVIEW_IN_GAME: "Предварительный просмотр откатов доступен только в игре." -PREVIEW_TRANSACTION: "Вы не можете просмотреть {контейнер|инвентарь} транзакции." -PURGE_ABORTED: "Очистка не удалась. База данных может быть повреждена." -PURGE_ERROR: "Невозможно обработать данные {0}!" -PURGE_FAILED: "Очистка не удалась. Пожалуйста, повторите попытку позже." -PURGE_IN_PROGRESS: "Выполняется чистка. Пожалуйста, повторите попытку позже." -PURGE_MINIMUM_TIME: "Удалить можно только данные старше {0} {дней|часов}." -PURGE_NOTICE_1: "Учтите, что это может занять некоторое время." -PURGE_NOTICE_2: "Не перезагружайте сервер до завершения." -PURGE_OPTIMIZING: "Оптимизация базы данных. Пожалуйста, подождите..." -PURGE_PROCESSING: "Обработка данных {0}..." -PURGE_REPAIRING: "Попытка исправления. Это может занять некоторое время..." -PURGE_ROWS: "{0} {строка|строки} данных очищены." -PURGE_STARTED: "Очистка данных началась «{0}»." -PURGE_SUCCESS: "Очистка данных прошла успешно." -RELOAD_STARTED: "Перезагрузка конфигурации - подождите." -RELOAD_SUCCESS: "Конфигурация успешно перезагружена." -ROLLBACK_ABORTED: "Откат или восстановление прерваны." -ROLLBACK_CHUNKS_FOUND: "Найдено {0} {чанк|чанков} для изменения." -ROLLBACK_CHUNKS_MODIFIED: "Изменено {0}/{1} {чанк|чанков}." -ROLLBACK_COMPLETED: "{Откат|Восстановление|Предварительный просмотр} завершен для «{0}»." -ROLLBACK_EXCLUDED_USERS: "{Исключен пользователь|Исключены пользователи}: «{0}»." -ROLLBACK_INCLUDE: "{Включён|Исключён} {блок|сущность|цель} {типа|типов}: «{0}»." -ROLLBACK_IN_PROGRESS: "Откат/восстановление уже выполняется." -ROLLBACK_LENGTH: "Заняло времени: {0} {секунду|секунд}." -ROLLBACK_MODIFIED: "{Изменено|Изменены} {0}." -ROLLBACK_RADIUS: "Радиус: {0} {блок|блоков}." -ROLLBACK_SELECTION: "Радиус установлен «{0}»." -ROLLBACK_STARTED: "{Откат|Восстановление|Предварительный просмотр} начат «{0}»." -ROLLBACK_TIME: "Временной интервал: {0}." -ROLLBACK_WORLD_ACTION: "Только {мир|действие} «{0}»." +LOOKUP_PROJECTILE: "{0} {бросил|выстрелил} {1} {2}" +LOOKUP_ROWS_FOUND: "{0} {строка|строк} найдено" +LOOKUP_SEARCHING: "Поиск данных, подождите..." +LOOKUP_STORAGE: "{0} {положил|забрал} {1} {2}" +LOOKUP_TIME: "{0} назад" +LOOKUP_USERNAME: "{0} зарегистрирован как {1}" +MAXIMUM_RADIUS: "Максимальный радиус для {поиска|отката|восстановления} - {0}" +MISSING_ACTION_USER: "Чтобы использовать это действие, укажите пользователя" +MISSING_LOOKUP_TIME: "Пожалуйста, укажите количество времени, чтобы использовать {поиск|откат|восстановление}" +MISSING_LOOKUP_USER: "Укажите пользователя или {блок|радиус} для поиска" +MISSING_PARAMETERS: "Пожалуйста используйте «{0}»" +MISSING_ROLLBACK_RADIUS: "Вы не указали радиус {отката|восстановления}" +MISSING_ROLLBACK_USER: "Вы не указали пользователя для {отката|восстановления}" +MYSQL_UNAVAILABLE: "Невозможно подключиться к серверу MySQL" +NO_DATA: "Данные не найдены в {0}" +NO_DATA_LOCATION: "В этом месте {данные|транзакции|взаимодействия|сообщения} не обнаружены" +NO_PERMISSION: "Нет доступа!" +NO_RESULTS: "Результаты не найдены" +NO_RESULTS_PAGE: "Для этой страницы {результатов|данных} не найдено" +NO_ROLLBACK: "{Ожидаемый|Предыдущий} откат/восстановление не найдены" +PATCH_INTERRUPTED: "Обновление прервано. Попробую снова при перезапуске..." +PATCH_OUTDATED_1: "Невозможно обновить базы данных старше {0}" +PATCH_OUTDATED_2: "Пожалуйста, обновите поддерживаемую версию Griefus" +PATCH_PROCESSING: "Обработка новых данных. Пожалуйста, подождите..." +PATCH_SKIP_UPDATE: "{Пропущена таблица|Пропущен индекс} {обновление|создание|удаление} в {0}" +PATCH_STARTED: "Выполняется обновление {0}. Пожалуйста, подождите..." +PATCH_SUCCESS: "Успешно обновлен до {0}" +PATCH_UPGRADING: "Выполняется обновление базы данных. Пожалуйста, подождите..." +PLEASE_SELECT: "Пожалуйста выберите: «{0}» или «{1}»" +PREVIEW_CANCELLED: "Предварительный просмотр отменен" +PREVIEW_CANCELLING: "Отмена предварительного просмотра..." +PREVIEW_IN_GAME: "Предварительный просмотр откатов доступен только в игре" +PREVIEW_TRANSACTION: "Вы не можете просмотреть {контейнер|инвентарь} транзакции" +PURGE_ABORTED: "Очистка не удалась. База данных может быть повреждена" +PURGE_ERROR: "Невозможно обработать данные {0}!" +PURGE_FAILED: "Очистка не удалась. Пожалуйста, повторите попытку позже" +PURGE_IN_PROGRESS: "Выполняется чистка. Пожалуйста, повторите попытку позже" +PURGE_MINIMUM_TIME: "Удалить можно только данные старше {0} {дней|часов}" +PURGE_NOTICE_1: "Учтите, что это может занять некоторое время" +PURGE_NOTICE_2: "Не перезагружайте сервер до завершения" +PURGE_OPTIMIZING: "Оптимизация базы данных. Пожалуйста, подождите..." +PURGE_PROCESSING: "Обработка данных {0}..." +PURGE_REPAIRING: "Попытка исправления. Это может занять некоторое время..." +PURGE_ROWS: "{0} {строка|строки} данных очищены" +PURGE_STARTED: "Очистка данных началась «{0}»" +PURGE_SUCCESS: "Очистка данных прошла успешно" +RELOAD_STARTED: "Перезагрузка конфигурации, подождите..." +RELOAD_SUCCESS: "Конфигурация успешно перезагружена" +ROLLBACK_ABORTED: "Откат или восстановление прерваны" +ROLLBACK_CHUNKS_FOUND: "Найдено {0} {чанк|чанков} для изменения" +ROLLBACK_CHUNKS_MODIFIED: "Изменено {0}/{1} {чанк|чанков}" +ROLLBACK_COMPLETED: "{Откат|Восстановление|Предварительный просмотр} завершен для «{0}»" +ROLLBACK_EXCLUDED_USERS: "{Исключен пользователь|Исключены пользователи}: «{0}»" +ROLLBACK_INCLUDE: "{Включён|Исключён} {блок|сущность|цель} {типа|типов}: «{0}»" +ROLLBACK_IN_PROGRESS: "Откат/восстановление уже выполняется" +ROLLBACK_LENGTH: "Заняло времени: {0} {секунду|секунд}" +ROLLBACK_MODIFIED: "{Изменено|Изменены} {0}" +ROLLBACK_RADIUS: "Радиус: {0} {блок|блоков}" +ROLLBACK_SELECTION: "Радиус установлен «{0}»" +ROLLBACK_STARTED: "{Откат|Восстановление|Предварительный просмотр} начат «{0}»" +ROLLBACK_TIME: "Временной интервал: {0}" +ROLLBACK_WORLD_ACTION: "Только {мир|действие} «{0}»" SIGN_HEADER: "Сообщения на табличке" -STATUS_CONSUMER: "Потребитель: {0} {предмет|предметы} в очереди." +STATUS_CONSUMER: "Потребитель: {0} {предмет|предметы} в очереди" STATUS_DATABASE: "База данных: Использует {0}." -STATUS_INTEGRATION: "{0}: Интеграция {включена|отключена}." +STATUS_INTEGRATION: "{0}: Интеграция {включена|отключена}" STATUS_LICENSE: "Лицензия: {0}" STATUS_VERSION: "Версия: {0}" -TELEPORTED: "Телепортирование в {0}." -TELEPORTED_SAFETY: "Телепортируем вас в безопасное место." -TELEPORT_PLAYERS: "Команду телепортации могут использовать только игроки." +TELEPORTED: "Телепортирование в {0}..." +TELEPORTED_SAFETY: "Телепортируем вас в безопасное место" +TELEPORT_PLAYERS: "Команду телепортации могут использовать только игроки" TIME_DAYS: "{0} {дня|дней}" TIME_HOURS: "{0} {час|часов}" TIME_MINUTES: "{0} {минута|минут}" TIME_SECONDS: "{0} {секунда|секунд}" -TIME_UNITS: "{/m|/h|/d}" +TIME_UNITS: "{ мин.| ч.| д.}" TIME_WEEKS: "{0} {неделя|недель}" -UPDATE_ERROR: "Произошла ошибка при проверке обновлений." +UPDATE_ERROR: "Произошла ошибка при проверке обновлений" UPDATE_HEADER: "{0} Обновление" -UPDATE_NOTICE: "Примечание: теперь доступен {0}." -UPGRADE_IN_PROGRESS: "Выполняется обновление. Пожалуйста, повторите попытку позже." -USER_NOT_FOUND: "Пользователь «{0}» не найден." -USER_OFFLINE: "Пользователь \"{0}\" не в сети." -USING_MYSQL: "Для хранения данных используется MySQL." -USING_SQLITE: "Для хранения данных используется SQLite." -VALID_DONATION_KEY: "Действующий ключ пожертвования." +UPDATE_NOTICE: "Примечание: теперь доступен {0}" +UPGRADE_IN_PROGRESS: "Выполняется обновление. Пожалуйста, повторите попытку позже" +USER_NOT_FOUND: "Пользователь «{0}» не найден" +USER_OFFLINE: "Пользователь \"{0}\" не в сети" +USING_MYSQL: "Для хранения данных используется MySQL" +USING_SQLITE: "Для хранения данных используется SQLite" +VALID_DONATION_KEY: "Действующий ключ пожертвования" VERSION_NOTICE: "Версия {0} уже доступна!" -VERSION_REQUIRED: "{0} {1} или выше требуется." -WORLD_NOT_FOUND: "Мир «{0}» не найден." +VERSION_REQUIRED: "{0} {1} или выше требуется" +WORLD_NOT_FOUND: "Мир «{0}» не найден" diff --git a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java index fb78926..cf74887 100644 --- a/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java +++ b/src/main/java/net/coreprotect/command/lookup/StandardLookupThread.java @@ -109,6 +109,8 @@ public class StandardLookupThread implements Runnable { ConfigHandler.lookupAlist.put(player.getName(), actions); ConfigHandler.lookupRadius.put(player.getName(), radius); + String separator = Color.DARK_GREY + '-'; + if (connection != null) { Statement statement = connection.createStatement(); String baduser = ""; @@ -195,14 +197,15 @@ public class StandardLookupThread implements Runnable { else if (pageStart < rows) { List lookupList = Lookup.performPartialLookup(statement, player, uuidList, userList, blockList, excludedBlocks, excludedUsers, actions, finalLocation, radius, rowData, timeStart, timeEnd, (int) pageStart, displayResults, restrict_world, true); - Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_HEADER, "Griefus" + Color.WHITE + " | " + Color.DARK_AQUA) + Color.WHITE + " -----"); + // Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_HEADER, "Griefus" + Color.WHITE + " | " + Color.DARK_AQUA) + Color.WHITE + " -----"); + Chat.sendComponent(player, StringUtils.makeHeader("LOGS")); if (actions.contains(6) || actions.contains(7)) { // Chat/command for (String[] data : lookupList) { String time = data[0]; String dplayer = data[1]; String message = data[2]; String timeago = ChatUtils.getTimeSince(Integer.parseInt(time), unixtimestamp, true); - Chat.sendComponent(player, timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message); + Chat.sendComponent(player, "| " + timeago + " " + Color.WHITE + "- " + message); if (PluginChannelHandshakeListener.getInstance().isPluginChannelPlayer(player)) { int wid = Integer.parseInt(data[3]); int dataX = Integer.parseInt(data[4]); @@ -232,7 +235,7 @@ public class StandardLookupThread implements Runnable { } String tag = (action != 0 ? Color.GREEN + "+" : Color.RED + "-"); - Chat.sendComponent(player, timeago + " " + tag + " " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_LOGIN, Color.DARK_AQUA + dplayer + Color.WHITE, (action != 0 ? Selector.FIRST : Selector.SECOND))); + Chat.sendComponent(player, "| " + timeago + " " + tag + " " + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_LOGIN, Color.DARK_AQUA + dplayer + Color.WHITE, (action != 0 ? Selector.FIRST : Selector.SECOND))); Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + ""); PluginChannelListener.getInstance().sendInfoData(player, Integer.parseInt(time), Phrase.LOOKUP_LOGIN, (action != 0 ? Selector.FIRST : Selector.SECOND), dplayer, -1, dataX, dataY, dataZ, wid); } @@ -266,8 +269,8 @@ public class StandardLookupThread implements Runnable { leftPadding = leftPadding + Color.WHITE + Strings.padStart("", (timeLength - 50) / 4, ' '); } - Chat.sendComponent(player, timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message); - Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + ""); + Chat.sendComponent(player,"| " + timeago + " " + Color.WHITE + "- " + Color.DARK_AQUA + dplayer + ": " + Color.WHITE, message); + Chat.sendComponent(player, Color.RESET + leftPadding + ChatUtils.getShowCoordinatesButton(dataX, dataY, dataZ) + " " + ChatUtils.getTeleportButton(wid, dataX, dataY, dataZ)); PluginChannelListener.getInstance().sendMessageData(player, Integer.parseInt(time), dplayer, message, true, dataX, dataY, dataZ, wid); } } @@ -321,7 +324,7 @@ public class StandardLookupThread implements Runnable { tag = (daction == 0 ? Color.GREEN + "+" : Color.RED + "-"); } - Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, ChatUtils.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector)); + Chat.sendComponent(player, "| " + timeago + " " + separator + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, "x" + amount, ChatUtils.createTooltip(Color.GOLD + rbd + dname, tooltip) + Color.WHITE, selector)); PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), Phrase.LOOKUP_CONTAINER, selector, dplayer, dname, amount, dataX, dataY, dataZ, wid, rbd, true, tag.contains("+")); } } @@ -425,7 +428,7 @@ public class StandardLookupThread implements Runnable { action = "a:container"; } - Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, ChatUtils.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector)); + Chat.sendComponent(player, "|" + timeago + " " + separator + " " + Phrase.build(phrase, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, "x" + amount, ChatUtils.createTooltip(Color.GOLD + rbd + dname, tooltip) + Color.WHITE, selector)); PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), phrase, selector, dplayer, dname, (tag.contains("+") ? 1 : -1), dataX, dataY, dataZ, wid, rbd, action.contains("container"), tag.contains("+")); } else { @@ -441,20 +444,20 @@ public class StandardLookupThread implements Runnable { tag = (daction != 0 ? Color.GREEN + "+" : Color.RED + "-"); } - Chat.sendComponent(player, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, Color.DARK_AQUA + rbd + dname + Color.WHITE, selector)); + Chat.sendComponent(player, timeago + " " + separator + " " + Phrase.build(phrase, Color.WHITE + Color.BOLD + rbd + dplayer + Color.RESET + rbd, Color.GOLD + rbd + dname + Color.WHITE, selector)); PluginChannelListener.getInstance().sendData(player, Integer.parseInt(time), phrase, selector, dplayer, dname, (tag.contains("+") ? 1 : -1), dataX, dataY, dataZ, wid, rbd, false, tag.contains("+")); } action = (actions.size() == 0 ? " (" + action + ")" : ""); - Chat.sendComponent(player, Color.WHITE + leftPadding + Color.GREY + "^ " + ChatUtils.getCoordinates(command.getName(), wid, dataX, dataY, dataZ, true, true) + Color.GREY + Color.ITALIC + action); + Chat.sendComponent(player, Color.RESET + leftPadding + ChatUtils.getShowCoordinatesButton(dataX, dataY, dataZ) + " " + ChatUtils.getTeleportButton(wid, dataX, dataY, dataZ)); } } if (rows > displayResults) { int total_pages = (int) Math.ceil(rows / (displayResults + 0.0)); - if (actions.contains(6) || actions.contains(7) || actions.contains(9) || (actions.contains(4) && actions.contains(11))) { + /* if (actions.contains(6) || actions.contains(7) || actions.contains(9) || (actions.contains(4) && actions.contains(11))) { Chat.sendMessage(player, "-----"); - } - Chat.sendComponent(player, ChatUtils.getPageNavigation(command.getName(), page, total_pages)); + } */ + Chat.sendComponent(player, ChatUtils.getPageNavigationVC(command.getName(), page, total_pages)); } } else if (rows > 0) { diff --git a/src/main/java/net/coreprotect/database/lookup/BlockLookup.java b/src/main/java/net/coreprotect/database/lookup/BlockLookup.java index 97470f4..0422577 100644 --- a/src/main/java/net/coreprotect/database/lookup/BlockLookup.java +++ b/src/main/java/net/coreprotect/database/lookup/BlockLookup.java @@ -84,13 +84,19 @@ public class BlockLookup { String timeAgo = ChatUtils.getTimeSince(resultTime, time, true); if (!found) { - resultTextBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + "Griefus " + Color.WHITE + "----- " + ChatUtils.getCoordinates(command, worldId, x, y, z, false, false) + "\n"); + // resultTextBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + "Griefus " + Color.WHITE + "----- " + ChatUtils.getCoordinates(command, worldId, x, y, z, false, false) + "\n"); + // Lookup/Checker header + resultTextBuilder = new StringBuilder(StringUtils.makeHeader("CHECKER") + + " " + ChatUtils.getShowCoordinatesButton(x, y, z) + + (commandSender.hasPermission("coreprotect.teleport") ? " " + // TODO: change teleport permission key + ChatUtils.getTeleportButton(worldId, x, y, z) : "") + "\n"); } found = true; Phrase phrase = Phrase.LOOKUP_BLOCK; String selector = Selector.FIRST; String tag = Color.WHITE + "-"; + String separator = Color.DARK_GREY + "-"; if (resultAction == 2 || resultAction == 3) { phrase = Phrase.LOOKUP_INTERACTION; // {clicked|killed} selector = (resultAction != 3 ? Selector.FIRST : Selector.SECOND); @@ -134,7 +140,7 @@ public class BlockLookup { } */ // Griefus end - resultTextBuilder.append(timeAgo + " " + tag + " ").append(Phrase.build(phrase, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, Color.DARK_AQUA + rbFormat + target + Color.WHITE, selector)).append("\n"); + resultTextBuilder.append(timeAgo + " " + separator + " ").append(Phrase.build(phrase, Color.WHITE + Color.BOLD + rbFormat + resultUser + Color.RESET + rbFormat, Color.GOLD + rbFormat + target + Color.WHITE, selector)).append("\n"); PluginChannelListener.getInstance().sendData(commandSender, resultTime, phrase, selector, resultUser, target, -1, x, y, z, worldId, rbFormat, false, tag.contains("+")); } @@ -143,9 +149,8 @@ public class BlockLookup { if (found) { if (count > limit) { - String pageInfo = Color.WHITE + "-----\n"; - pageInfo = pageInfo + ChatUtils.getPageNavigation(command, page, totalPages) + "\n"; - resultText = resultText + pageInfo; + // String pageInfo = Color.WHITE + "-----\n"; + resultText = resultText + ChatUtils.getPageNavigationVC(command, page, totalPages) + "\n"; } } else { diff --git a/src/main/java/net/coreprotect/utility/ChatUtils.java b/src/main/java/net/coreprotect/utility/ChatUtils.java index 865a5f9..496ab48 100644 --- a/src/main/java/net/coreprotect/utility/ChatUtils.java +++ b/src/main/java/net/coreprotect/utility/ChatUtils.java @@ -2,7 +2,13 @@ package net.coreprotect.utility; import net.coreprotect.language.Phrase; import net.coreprotect.language.Selector; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; import java.text.DecimalFormat; @@ -42,6 +48,19 @@ public class ChatUtils { return message.append("").toString(); // griefus } + public static String getShowCoordinatesButton(int x, int y, int z) { + return "" + x + " " + + "Y: " + y + " " + + "Z: " + z + " " + + "\">[координаты]"; + } + public static String getTeleportButton(int worldId, int x, int y, int z) { + // May break if worldId index is outdated + return "[телепортироваться]"; + } + public static String getPageNavigation(String command, int page, int totalPages) { StringBuilder message = new StringBuilder(); @@ -143,6 +162,57 @@ public class ChatUtils { return message.append(Color.WHITE + backArrow + Color.DARK_AQUA + Phrase.build(Phrase.LOOKUP_PAGE, Color.WHITE + page + "/" + totalPages) + nextArrow + pagination).toString(); } + public static String getPageNavigationVC(String command, int page, int totalPages) { + if (totalPages < 1) + return ""; + Component separator = Component.text(" | ", NamedTextColor.DARK_GRAY, TextDecoration.BOLD); + String backButtonText = "[назад]"; + String nextButtonText = "[далее]"; + + HoverEvent backButtonHover = HoverEvent + .showText(Component.text("Нажмите, чтобы перейти на предыдущую страницу", NamedTextColor.RED)); + HoverEvent nextButtonHover = HoverEvent + .showText(Component.text("Нажмите, чтобы перейти на следующую страницу", NamedTextColor.GREEN)); + + ClickEvent backButtonClick = ClickEvent.runCommand("/" + command + " l " + (page - 1)); + ClickEvent nextButtonClick = ClickEvent.runCommand("/" + command + " l " + (page + 1)); + + + Component backButton; + if (page > 1) { + backButton = Component.text(backButtonText) + .color(NamedTextColor.RED) + .hoverEvent(backButtonHover) + .clickEvent(backButtonClick); + } else { + backButton = Component.text(backButtonText) + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC); + } + + Component nextButton; + if (page < totalPages) { + nextButton = Component.text(nextButtonText) + .color(NamedTextColor.GREEN) + .hoverEvent(nextButtonHover) + .clickEvent(nextButtonClick); + } else { + nextButton = Component.text(nextButtonText) + .color(NamedTextColor.GRAY) + .decorate(TextDecoration.ITALIC); + } + + Component pageCounter = Component.text(page + "/" + totalPages, NamedTextColor.GRAY); + + Component navigation = Component.empty() + .append(backButton) + .append(separator) + .append(pageCounter) + .append(separator) + .append(nextButton); + return MiniMessage.miniMessage().serialize(navigation); + } + public static String getTimeSince(long resultTime, long currentTime, boolean component) { StringBuilder message = new StringBuilder(); double timeSince = currentTime - (resultTime + 0.00); diff --git a/src/main/java/net/coreprotect/utility/StringUtils.java b/src/main/java/net/coreprotect/utility/StringUtils.java index aa38b1f..bc7d7b9 100644 --- a/src/main/java/net/coreprotect/utility/StringUtils.java +++ b/src/main/java/net/coreprotect/utility/StringUtils.java @@ -135,4 +135,9 @@ public class StringUtils { } return list.toArray(new Integer[list.size()]); } + + // VanillaCrafts + public static String makeHeader(String header) { + return "=============== " + header + " ==============="; + } } \ No newline at end of file