Compare commits

...

16 Commits

Author SHA1 Message Date
MathieuG-P 82675925ff bumb to 1.3.0-alpha.3 2023-07-23 18:54:19 +02:00
MathieuG-P 8adda9c027 [hotfix] unable to install mods 2023-07-23 18:46:43 +02:00
MathieuG-P 5d4a824a76 bumb to 1.3.0-alpha.2 2023-07-23 16:26:20 +02:00
MathieuG-P 6472aff718 Merge pull request #291 from Zagrios/bugfix/sometimes-installing-mods-downgrades-newer-installed-mods
[bugfix] do not install mods that are less recent than those installed
2023-07-22 23:58:51 +02:00
MathieuG-P 02d3d64a18 [bugfix] do not install mods that are less recent than those installed 2023-07-22 23:53:44 +02:00
MathieuG-P 6d8d3e993a Merge pull request #288 from Zagrios/bugfix/crash-loading-bunch-of-maps/276
[bugfix-276] Fix crashing when loading bunch of maps
2023-07-21 04:19:29 +02:00
MathieuG-P 570a20470e Merge pull request #290 from Zagrios/bugfix/window-title-become-index.html-when-closing-settings/289
[bugfix-289] Add title in index.ejs to prevent the window title to be wiped magically
2023-07-21 02:29:17 +02:00
MathieuG-P e96a977abe [bugfix-289] Add title in index.ejs to prevent the window title to be wiped magically 2023-07-21 02:24:37 +02:00
MathieuG-P 6ef328caec Merge pull request #287 from Dead0Duck/feature/russian-translation
[feature] Russian translation
2023-07-18 22:44:10 +02:00
DeadDuck 80f625102e [fix] Corrected translation of oculus-description 2023-07-18 18:36:09 +07:00
MathieuG-P abf622e68f Merge pull request #286 from Snailedlt/chore/rework-issue-templates
Chore/rework issue templates
2023-07-17 23:29:56 +02:00
MathieuG-P 63c9bd9436 [bugfix-276] use stream to reduce ram consumption + load maps by chunk to avoid open files limit 2023-07-17 23:19:49 +02:00
MathieuG-P 5e763c99d8 bumb to v1.3.0-alpha1 2023-07-17 23:16:24 +02:00
DeadDuck 2e5b11bdb0 [feature] Russian translation 2023-07-17 22:25:22 +07:00
Jørgen Kalsnes Hagen 7287dfffde Update -bug--bug-report.md 2023-07-16 23:27:00 +02:00
Jørgen Kalsnes Hagen 92461639b0 Update -feat---feature-request.md 2023-07-16 23:24:13 +02:00
14 changed files with 1018 additions and 46 deletions
+14 -11
View File
@@ -6,27 +6,30 @@ labels: bug
assignees: Zagrios
---
**Describe the bug**
A clear and concise description of what the bug is.
## Bug Description
<!-- A clear and concise description of what the bug is. -->
**To Reproduce**
Steps to reproduce the behavior:
## Reproduction Steps
<!-- Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
-->
**Expected behavior**
A clear and concise description of what you expected to happen.
## Expected Behavior
<!-- A clear and concise description of what you expected to happen. -->
**Screenshots**
If applicable, add screenshots to help explain your problem.
## Screenshots
<!-- If applicable, add screenshots to help explain your problem. -->
**Desktop (please complete the following information):**
## System Specs
<!-- **Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Version [e.g. 22]
-->
**Additional context**
Add any other context about the problem here.
## Additional context
<!-- Add any other context about the problem here. -->
@@ -6,14 +6,17 @@ labels: enhancement
assignees: Zagrios
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
## Problem
<!-- **Is your feature request related to a problem? Please describe.** -->
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
## Solution
<!-- **Describe the solution you'd like** -->
<!-- A clear and concise description of what you want to happen. -->
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
## Alternative solutions (if any)
<!-- **Describe alternatives you've considered** -->
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
**Additional context**
Add any other context or screenshots about the feature request here.
## Additional context
<!-- Add any other context or screenshots about the feature request here. -->
+3 -1
View File
@@ -147,12 +147,14 @@
"fr-FR": "Français",
"es-ES": "Español",
"de-DE": "Deutsch",
"ru-RU": "Русский",
"translated": {
"en-EN": "Englisch, Vereinigtes Königreich",
"en-US": "Englisch, USA",
"fr-FR": "Französisch",
"es-ES": "Spanisch",
"de-DE": "Deutsch"
"de-DE": "Deutsch",
"ru-RU": "Russisch"
}
}
},
+3 -1
View File
@@ -147,12 +147,14 @@
"fr-FR": "Français",
"es-ES": "Español",
"de-DE": "Deutsch",
"ru-RU": "Русский",
"translated": {
"en-EN": "English, United Kingdom",
"en-US": "English, USA",
"fr-FR": "French",
"es-ES": "Spanish",
"de-DE": "German"
"de-DE": "German",
"ru-RU": "Russian"
}
}
},
+3 -1
View File
@@ -146,12 +146,14 @@
"fr-FR": "Français",
"es-ES": "Español",
"de-DE": "Deutsch",
"ru-RU": "Русский",
"translated": {
"en-EN": "Inglés, Reino Unido",
"en-US": "Inglés, Estados Unidos",
"fr-FR": "Francés",
"es-ES": "Español",
"de-DE": "Alemán"
"de-DE": "Alemán",
"ru-RU": "Ruso"
}
}
},
+3 -1
View File
@@ -146,12 +146,14 @@
"fr-FR": "Français",
"es-ES": "Español",
"de-DE": "Deutsch",
"ru-RU": "Русский",
"translated": {
"en-EN": "Anglais, Royaume-Uni",
"en-US": "Anglais, États-Unis",
"fr-FR": "Français",
"es-ES": "Espagnol",
"de-DE": "Allemand"
"de-DE": "Allemand",
"ru-RU": "Russe"
}
}
},
+902
View File
@@ -0,0 +1,902 @@
{
"misc": {
"download": "Скачать",
"add": "Добавить",
"verify": "Проверить",
"launch": "Запустить",
"mods": "Моды",
"maps": "Карты",
"playlists": "Плейлисты",
"models": "Модели",
"cancel": "Отмена",
"delete": "Удалить",
"accept": "Принять",
"refuse": "Отказаться",
"apply": "Применить",
"copy": "Скопировать",
"copied": "Скопировано!"
},
"nav-bar": {
"add-version": "Добавить версию игры",
"settings": "Настройки",
"shared": {
"text": "Общий",
"tooltip": "Общий контент"
}
},
"pages": {
"shared-maps": {
"title": "Общие карты"
},
"version-viewer": {
"launch-mods": {
"oculus": "Режим Oculus",
"oculus-description": "Если вы используете Beat Saber через Steam, это позволит использовать Oculus's VR в обход SteamVR, для потенциального прироста производительности. Это необязательно для шлемов Oculus.",
"desktop": "Режим FPFC",
"desktop-description": "Режим Летающих контроллеров от первого лица(FPFC) позволит вам использовать меню с помощью WASD и мышки. Это облегчает тестирование модов, потому что вам не нужно подключать шлем!",
"debug": "Режим отладки",
"debug-description": "Включает окно логов для IPA. В окне будут отображаться логи модов.",
"advanced-launch": {
"button": "Расширенный запуск",
"placeholder": "Параметры запуска, например: --revert; --nowait"
}
},
"maps": {
"title": "Общие карты",
"search-bar": {
"search-placeholder": "Поиск среди карт",
"filters-btn": "Фильтр",
"dropdown": {
"export-maps": "Экспорт карт",
"delete-maps": "Удалить карты"
}
},
"tabs": {
"maps": {
"actions": {
"add-maps": {
"text": "Добавить"
},
"link-maps": {
"tooltips": {
"link": "Привязать карты",
"unlink": "Отвязать карты"
}
}
},
"empty-maps": {
"text": "Нет карт",
"button": "Скачать карты"
}
}
}
},
"mods": {
"loading-mods": "Загрузка модов...",
"no-internet": "Нет интернета",
"mods-not-available": "Не найдены моды для этой версии Beat Saber",
"buttons": {
"more-infos": "Подробнее",
"install-or-update": "Установить или обновить"
},
"mods-grid": {
"header-bar": {
"name": "Имя",
"installed": "Установлено",
"latest": "Latest",
"description": "Описание",
"dropdown": {
"uninstall-all": "Удалить всё"
}
}
}
},
"dropdown": {
"open-folder": "Открыть папку",
"verify-files": "Проверить файлы",
"clone": "Клонировать",
"edit": "Редактировать",
"uninstall": "Удалить",
"create-shortcut": "Создать ярлык",
"shared-folders": "Общие папки"
}
},
"available-versions": {
"title": "Выберите версию",
"steam-release": "Список изменений",
"dropdown": {
"refresh": "Обновить список",
"import-version": "Импорт версии"
}
},
"settings": {
"steam": {
"title": "Steam",
"description": "Если вы выйдете из Steam, вам придётся снова войти, если вы хотите скачать другие версии Beat Saber.",
"logout": "Выйти"
},
"appearance": {
"title": "Персонализация",
"description": "Выберите два основных цвета для BSManager.",
"reset": "Сброс",
"sub-title": "Тема",
"themes": {
"dark": "Тёмная",
"light": "Светлая",
"os": "Как на компьютере"
}
},
"installation-folder": {
"title": "Папка установок",
"description": "Измените стандартную папку, где будут версии Beat Saber и прочее.",
"choose-folder": "Изменить папку"
},
"additional-content": {
"title": "Дополнительный контент",
"description": "Дополнительный контент для кастомизации Beat Saber!",
"deep-links": {
"sub-title": "OneClick установка"
}
},
"language": {
"title": "Язык",
"description": "Выберите язык.",
"languages": {
"en-EN": "English, UK",
"en-US": "English, US",
"fr-FR": "Français",
"es-ES": "Español",
"de-DE": "Deutsch",
"ru-RU": "Русский",
"translated": {
"en-EN": "Английский, Великобритания",
"en-US": "Английский, США",
"fr-FR": "Французский",
"es-ES": "Испанский",
"de-DE": "Немецкий",
"ru-RU": "Русский"
}
}
},
"patreon": {
"title": "Поддержи BSManager 💖",
"description": "Поддержи проект, чтобы мы могли дальше улучшать BSManager.",
"buttons": {
"support": "Поддержать BSManager 🥰",
"supporters": "Поддержавшие 👀"
},
"view": {
"no-supporters": "Пока нет поддержавших",
"sponsors": "Спонсоры",
"supporters": "Поддержавшие"
}
},
"discord": {
"description": "Присоединяйся к сообществу BSManager в социальных сетях!"
},
"contribution": {
"description": "Предложите улучшения или сообщите о баге!",
"buttons": {
"request-features": "Предложить улучшение",
"report-bug": "Сообщить о баге",
"open-logs": "Открыть логи"
}
}
}
},
"notifications": {
"types": {
"error": "🚨 Ошибка",
"warning": "⚠️ Предупреждение",
"success": "🎉 Успех"
},
"common": {
"msg": {
"error-occurred": "Возникла ошибка"
}
},
"shared": {
"errors": {
"titles": {
"operation-running": "Операция в процессе",
"no-internet": "Нет интернета"
},
"msg": {
"operation-running": "Дождитесь завершения операции, потом попробуйте снова.",
"no-internet": "Проверьте своё соединение и попробуйте снова."
}
}
},
"bs-download": {
"success": {
"titles": {
"download-success": "Скачивание завершено",
"verification-finished": "Проверка завершена"
}
},
"warnings": {
"msg": {
"ManifestChecksum": "Предыдущий файл манифесте не совпадает с новым 🤔",
"ConnectionTimeout": "У вас нестабильное соединение с интернетом 🥶",
"ConnectionLost": "Соединение потеряно, попробуйте снова...",
"ConnectionError": "Не удалось подключиться к Steam, попробуйте снова...",
"Unknown": "Что-то странное произошло 🤔 Возможно ваш интернет барахлит."
}
},
"errors": {
"titles": {
"dotnet-required": "Требуется .NET 6"
},
"msg": {
"401": "Похоже Steam не хочет, чтобы мы скачали Beat Saber 😢",
"404": "Нет связи с серверами Steam.",
"Password": "Неверный пароль.",
"InvalidCredentials": "Ваша почта или пароль неверны 😴",
"InvalidPassword": "Ваш пароль неверен 😕",
"NoManifest": "Файл манифеста не найден",
"DirectoryCreate": "Не смогли создать нужные папки.",
"NotAvailableApp": "Вы пытаетесь скачать Beat Saber, не купив её? 🤣",
"DepotNotFound": "Не удалось скачать Beat Saber 😥 повторите попытку позже 😕",
"NotCompleted": "Скачивание не завершилось ¯\\_(ツ)_/¯",
"InvalidManifest": "Не удалось скачать Beat Saber 😥 повторите попытку позже 😕",
"NoValidKey": "Не удалось скачать Beat Saber 😥 повторите попытку позже 😕",
"NoManifestCode": "Не удалось скачать Beat Saber 😥 повторите попытку позже 😕",
"Unknown": "Неизвестная ошибка ¯\\_(ツ)_/¯",
"NoServer": "Нет связи с серверами Steam.",
"NotAllowed": "Внезапно, вы не можете скачать Beat Saber 🥱",
"ConnectionTimeout": "Не удалось подключиться к Steam 😕",
"SteamLib": "Если вы это видите, пожалуйста, сообщите о баге на GitHub с файлом логов.",
"ConnectionError": "Не удалось подключиться к Steam за 10 попыток 🤯",
"LicenceError": "Не удалось проверить наличие лицензии.",
"verification-failed": "Верификация провалена, повторите попытку позже.",
"RateLimitExceeded": "Слишком много попыток, вернитесь позже и попробуйте снова.",
"AlreadyDownloading": "Скачивание уже в процессе",
"no-internet": "Нет интернета.",
"dotnet-required": "Среда запуска .NET 6 должна быть установлена, чтобы скачать Beat Saber. Скачайте её с помощью кнопки ниже."
},
"actions": {
"download-dotnet": "Скачать .NET 6"
}
}
},
"bs-import-version": {
"success": {
"start-import": {
"title": "Импортируем 👌",
"desc": "Импорт может занять какое-то время в зависимости от вашего компьютера."
},
"imported": {
"title": "Версия импортирована 🎉"
}
},
"errors": {
"import-error": {
"desc": "Убедитесь, что выбранная папка - это корневая папка Beat Saber."
}
}
},
"settings": {
"move-folder": {
"success": {
"titles": {
"transfer-started": "Перемещение в процессе",
"transfer-finished": "Перемещение завершено"
},
"descs": {
"transfer-started": "Перемещение может занять какое-то время в зависимости от вашего компьютера."
}
},
"errors": {
"titles": {
"transfer-failed": "Ошибка перемещения 😕"
},
"descs": {
"COPY_TO_SUBPATH": "The destination folder cannot be a subfolder of the source folder.",
"restore-linked-folders": "Произошла ошибка при перемещении общих папок. Вы сами можете переместить файлы, нажмите 'Общие папки' в меню версии."
}
}
},
"steam": {
"success": {
"titles": {
"logout": "Вышли из Steam."
}
}
},
"additional-content": {
"deep-link": {
"select-all": "Выбрать всё",
"activation": {
"success": {
"title": "OneClick включена!",
"description": "OneClick установка теперь включена."
},
"error": {
"description": "Не удалось включить OneClick установку."
}
},
"deactivation": {
"success": {
"title": "OneClick выключена!",
"description": "OneClick установка теперь отключена."
},
"error": {
"description": "Неизвестная ошика."
}
},
"check-all-enabled": {
"title": "OneClick отключен",
"description": "Один или более вариантов OneClick установок отключены. Перейдите в настройки, чтобы включить их.",
"actions": {
"settings": "Настройки",
"not-remind": "Больше не напоминать"
}
}
}
}
},
"bs-launch": {
"success": {
"titles": {
"BS_LAUNCHING": "Запуск...🚀",
"STEAM_LAUNCHING": "Steam запускается!"
},
"msg": {
"BS_LAUNCHING": "Не забудьте разогреться 😉",
"STEAM_LAUNCHING": "Beat Saber запустится сам после Steam."
}
},
"errors": {
"titles": {
"UNKNOWN_ERROR": "Не удалось запустить",
"STEAM_NOT_RUNNING": "Steam не запущен",
"OCULUS_NOT_RUNNING": "Oculus не запущен",
"BS_ALREADY_RUNNING": "Beat Saber уде запущен",
"EXE_NOT_FINDED": "Отсутствуют файлы",
"EXIT": "Вылет"
},
"msg": {
"UNKNOWN_ERROR": "Возникла неизвестная ошибка.",
"STEAM_NOT_RUNNING": "Steam должен быть запущен, чтобы запустить BeatSaber.",
"OCULUS_NOT_RUNNING": "Oculus должен быть запущен, чтобы запустить BeatSaber.",
"BS_ALREADY_RUNNING": "Закройте BeatSaber, чтобы запустить его.",
"EXE_NOT_FINDED": "Некоторые файлы отсутствуют, пробуем их проверить.",
"EXIT": "BeatSaber вылетел, пытаемся проверить файлы."
},
"actions": {
"STEAM_NOT_RUNNING": "Запустить Steam"
}
}
},
"steam": {
"steam-launching": {
"title": "Steam запускается!",
"description": "Beat Saber запустится сам после Steam."
}
},
"custom-version": {
"errors": {
"titles": {
"CantEditSteam": "Не удалось изменить",
"CantRename": "Переименование невозможно",
"VersionAlreadExist": "Эта версия уже добавлена",
"CantClone": "Клонирование невозможно"
},
"msg": {
"CantEditSteam": "Вы не можете изменить версию из Steam, но вы можете её клонировать."
}
},
"success": {
"titles": {
"CloningFinished": "Клонирование завершено 🎉"
}
}
},
"mods": {
"install-mods": {
"titles": {
"success": "Моды установлены 🎉",
"warning": "Моды установлены 🤔"
},
"msg": {
"success": "Все моды были установлены.",
"warning": "Лишь часть модов была установлена.",
"errors": {
"no-mods": "Нет модов для установки.",
"cannot-install-bsipa": "Ошибка установки BSIPA 😨"
}
}
},
"uninstall-mod": {
"titles": {
"success": "Мод удалён 🎉"
},
"msg": {
"errors": {
"no-mods": "Этот мод не установлен 😑"
}
}
},
"uninstall-all-mods": {
"titles": {
"success": "Моды удалены 🎉"
},
"msg": {
"success": "Все моды были удалены.",
"errors": {
"no-mods": "Для этой версии не было установлено модов 😑"
}
}
}
},
"maps": {
"one-click-install": {
"success": "Карта установлена",
"error": "Ошибка установки карты"
}
},
"playlists": {
"one-click-install": {
"success": "Плейлист установлен",
"error": "Ошибка установки плейлиста"
}
},
"models": {
"one-click-install": {
"success": "Модель установлена",
"error": "Ошибка установки модели"
}
},
"shared-folder": {
"info": {
"userdata-backup-created": {
"title": "Бэкап создан",
"msg": "Общая папка 'UserData' может создавать ошибки. В случае проблем отвяжите папку, чтобы восстановить бэкап."
}
}
},
"create-launch-shortcut": {
"success": {
"title": "Ярлык создан",
"msg": "Ярлык находится на рабочем столе."
},
"error": {
"msg": "Ошибка создания ярлыка."
}
}
},
"modals": {
"misc": {
"remember-my-choice": "Запомнить выбор"
},
"guard": {
"title": "Steam Guard",
"inputs": {
"guard-code": {
"label": "Код Steam Guard",
"placeholder": "Введите код Steam Guard"
}
},
"buttons": {
"submit": "Войти"
}
},
"steam-login": {
"title": "Вход в Steam",
"inputs": {
"username": {
"label": "Имя пользователя",
"placeholder": "Введите имя пользователя"
},
"password": {
"label": "Пароль",
"placeholder": "Введите пароль",
"max-length-warning": "Пароль больше 64-х символов! Если пароль неверен, введите первые 64 символа."
},
"stay": {
"label": "Оставаться в аккаунте"
}
},
"why-credentials": "Почему нужны мои данные для входа?",
"buttons": {
"submit": "Войти"
}
},
"steam-credentials": {
"title": "Данные входа Steam",
"p-1": "Данные входа используются только при скачивании, чтобы проверить наличие у вас Beat Saber, это нужно Steam, чтобы разрешить скачивание. Они не сохраняются и напрямую передаются в DepotDownloader. Если вы не хотите вводить данные для входа, воспользуйтесь руководством(Оно на английском языке) :",
"p-2": "Нажмите на шестерню справа вверху и выберите \"Импорт версии\", выберите папку со скачанным Beat Saber (Если вы воспользовались руководством, у вас должен быть корректный путь к папке)"
},
"bs-import-version": {
"title": "Импорт версии",
"description": "Импортировать версию Beat Saber, чтобы использоваться BSManager. Beat Saber будет скопирован в папку версий BSManager.",
"buttons": {
"submit": "Импортировать версию"
}
},
"bs-uninstall": {
"title": "Удалить",
"description": "Вы действительно хотите удалить Beat Saber {version}? Вам нужно будет снова её скачать, чтобы поиграть.",
"buttons": {
"submit": "Удалить"
}
},
"install-folder": {
"title": "Папка установок",
"description": "Все данные будут перемещены в новую папку.",
"buttons": {
"submit": "Выбрать папку"
}
},
"edit-version": {
"title": "Изменить версию",
"buttons": {
"submit": "Изменить"
}
},
"clone-version": {
"title": "Клонировать версию",
"description": "Клонирование версий позволит вам установить разный контент для каждой копии Beat Saber.",
"inputs": {
"name": {
"label": "Имя",
"placeholder": "Имя версии"
},
"color": {
"label": "Цвет"
}
},
"buttons": {
"submit": "Клонировать"
}
},
"uninstall-mod": {
"title": "Удаление мода",
"description": "Вы точно хотите удалить {mod}? Другие моды могут перестать работать.",
"description-bsipa": "AВы точно хотите удалить BSIPA? Все моды перестануть работать."
},
"uninstall-all-mods": {
"title": "Удаление всех модов",
"description": "Вы точно хотите удалить все моды для версии {version}? Это необратимое действие."
},
"maps-actions": {
"delete-maps": {
"title": {
"single": "Удалить карту?",
"multiple": "Удалить карты?"
},
"desc": {
"single": "Вы точно хотите удалить карту {name}?",
"multiple": "Вы точно хотите удалить {nb} карт(ы)?"
},
"info": {
"desc": {
"single": "Это общая карта",
"multiple": "Это общие карты"
},
"title": {
"single": "Эта карта будет удалена из всех версий, использующих общие карты",
"multiple": "Эти карты будут удалены из всех версий, использующих общие карты"
}
}
},
"link-maps": {
"title": "Связать карты",
"desc": "Общие карты доступны во всех версиях игры с этой функцией. Пока связь есть, эта версия будет иметь общие карты.",
"info": "Добавление и удаление карт так же будут общими",
"keep-maps": {
"label": "Оставить карты",
"title": "Все карты из этой версии станут общими. Если не включить, то карты этой версии будут потеряны."
},
"valid-btn": "Связать карты"
},
"unlink-maps": {
"title": "Отвязать карты",
"desc": "Осторожно, отвязка карт сделает недоступными общие карты для этой версии, пока вы не свяжете их снова.",
"keep-maps": {
"label": "Оставить карты",
"title": "Общие карты будут скопированы в папку карт этой версии. Карты не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать карты"
}
},
"download-maps": {
"search-btn": "Поиск",
"loading-maps": "Загрузка карт...",
"no-maps-found": "Карты не найдены",
"no-internet": "Нет интернета"
},
"mods-disclaimer": {
"title": "внимание",
"p-1": "Играя с модами, вы соглашаетесь, что:",
"li-1": "У вам могут быть проблемы, которых нет в оригинальной игре. 99.9% багов, вылетов и лагов из-за модов.",
"li-2": "Моды могут быть несовместимы с обновлениями и это норма - будьте терпеливы и уважайте мододелов, они волонтёры со своими личными жизнями.",
"li-3": "Beat Games не специально ломают моды. Они лишь обновляют код, что иногда ломает коды. Они не хотят уничтожить моды",
"p-2": "Не спамьте разработчикам игры из-за проблем с модами и наоборот - мододелы и разработчики игры - разные группы людей. Не будьте идиотами."
},
"shared-folders": {
"title": "Общие папки",
"description": "Свяжите папки Beat Saber, чтобы они стали общими и их содержимое было в других версиях. Заметьте, что удаление файлов так же будет общим.",
"buttons": {
"add-folder": "Добавить папку",
"link-folder": "Связать папку",
"unlink-folder": "Отвязать папку",
"link-all": "Связать всё"
}
},
"create-launch-shortcut": {
"title": "Создать ярлык",
"desc": "Ярлык позволит вам запустить Beat Saber без помощи BSManager.",
"launch-options": "Параметры запуска",
"advanced-launch": "Расширенный запуск",
"valid-btn": "Создать ярлык"
}
},
"maps": {
"map-filter-panel": {
"duration": "Длительность",
"tags": "тэги",
"specificities": "основное",
"requirements": "требуемые моды"
},
"map-types": {
"accuracy": "точность",
"balanced": "баланс",
"challenge": "испытание",
"dancestyle": "танец",
"fitness": "фитнес",
"speed": "скорость",
"tech": "техника"
},
"map-styles": {
"dance": "танец",
"swing": "свинг",
"nightcore": "найткор",
"folk": "народные",
"family": "семейные",
"ambient": "эмбиент",
"funk": "фанк",
"jazz": "джаз",
"soul": "соул",
"speedcore": "спидкор",
"punk": "панк",
"rb": "ар-н-би",
"holiday": "праздник",
"vocaloid": "вокалоиды",
"jrock": "джей-рок",
"trance": "транс",
"drumbass": "драм-н-бейс",
"comedy": "комедия",
"instrumental": "инструментальные",
"hardcore": "хардкор",
"kpop": "кей-поп",
"indie": "инди",
"techno": "техно",
"house": "хаус",
"game": "видеоигры",
"film": "фильмы",
"alt": "альтернативные",
"dubstep": "дапстеп",
"metal": "метал",
"anime": "аниме",
"hiphop": "хипхоп",
"jpop": "джей-поп",
"rock": "прк",
"pop": "поп",
"electronic": "электроника",
"classical-orchestral": "Классика и Оркестр"
},
"map-specificities": {
"automapper": "ИИ",
"ranked": "с рейтингом",
"curated": "оценённые куратором",
"verified": "проверенные авторы",
"fullSpread": "полный набор"
},
"difficulties": {
"Easy": "легко",
"Normal": "нормально",
"Hard": "сложно",
"Expert": "эксперт",
"ExpertPlus": "эксперт+"
},
"map-item": {
"by": "От {songAutor}",
"mapped-by": "автор карты "
}
},
"models": {
"types": {
"singular": {
"avatar": "аватар",
"saber": "мечь",
"platform": "платформа",
"bloq": "куб"
},
"plural": {
"avatar": "аватары",
"saber": "мечи",
"platform": "платформы",
"bloq": "кубы"
}
},
"sorts": {
"name": "Имя",
"date": "Дата",
"author": "Автор"
},
"panel": {
"actions": {
"search": "Поиск скачанных моделей",
"drop-down": {
"delete": "Удалить модели",
"export": "Экспорт моделей"
},
"link-models": "Связать модели",
"unlink-models": "Отвязать модели"
},
"grid": {
"loading": "Загрузка моделей...",
"no-models": "Нет моделей",
"download-models": "Скачать модели"
}
},
"modals": {
"delete-model": {
"title": "Удалить модель",
"desc": "Вы уверены, что хотите удалить модель {modelName}?",
"linked-annotation": "Эта модель будет удалена из всех соединённых версий."
},
"delete-models": {
"title": "Удалить модели",
"desc": "Вы уверены, что хотите удалить {nb} модели(ей)?",
"linked-annotation": "Эти модели будут удалены из всех соединённых версий."
},
"download-models": {
"search-btn": "Поиск",
"search-placeholder": "Поиск моделей",
"search-tips": {
"header": {
"tag": "Тэги",
"desc": "Описание"
},
"author-desc": "Показывать модели только от определённого автора.",
"hash-desc": "Показывать модели только с определённым хэшом.",
"tag-desc": "Показывать модели только с определённым тэгом.",
"name-desc": "Показывать модели только с определённым именем.",
"discordid-desc": "Показывать модели только от определённого пользователя Discord.",
"status-desc": "Показывать модели только с определённым статусом. (только профиль, и только для авторов)"
},
"no-models": "Модели не найдены.",
"no-internet": "Нет интернета.",
"error-occured": "Ошибка, повторите попытку позже."
},
"link-models": {
"avatar": {
"title": "Связать аватары",
"desc": "Общие аватары доступны во всех версиях игры с этой функцией. Пока связь есть, эта версия будет иметь общие аватары.",
"info": "Добавление и удаление аватаров так же будут общими",
"keep-models": {
"label": "Оставить аватары",
"title": "Все аватары из этой версии станут общими. Если не включить, то аватары этой версии будут потеряны."
},
"valid-btn": "Связать аватары"
},
"saber": {
"title": "Связать мечи",
"desc": "Общие мечи доступны во всех версиях игры с этой функцией. Пока связь есть, эта версия будет иметь общие мечи.",
"info": "Добавление и удаление мечей так же будут общими",
"keep-models": {
"label": "Оставить мечи",
"title": "Все мечи из этой версии станут общими. Если не включить, то мечи этой версии будут потеряны."
},
"valid-btn": "Связать мечи"
},
"platform": {
"title": "Связать платформы",
"desc": "Общие платформы доступны во всех версиях игры с этой функцией. Пока связь есть, эта версия будет иметь общие платформы.",
"info": "Добавление и удаление платформ так же будут общими",
"keep-models": {
"label": "Оставить платформы",
"title": "Все платформы из этой версии станут общими. Если не включить, то платформы этой версии будут потеряны."
},
"valid-btn": "Связать платформы"
},
"bloq": {
"title": "Связать кубы",
"desc": "Общие кубы доступны во всех версиях игры с этой функцией. Пока связь есть, эта версия будет иметь общие кубы.",
"info": "Adding and deleting bloqs will also be shared",
"keep-models": {
"label": "Оставить кубы",
"title": "Все кубы из этой версии станут общими. Если не включить, то кубы этой версии будут потеряны."
},
"valid-btn": "Связать кубы"
}
},
"unlink-models": {
"avatar": {
"title": "Отвязать аватары",
"desc": "Осторожно, отвязка аватаров сделает недоступными общие аватары для этой версии, пока вы не свяжете их снова.",
"keep-models": {
"label": "Оставить аватары",
"title": "Общие аватары будут скопированы в папку аватаров этой версии. Аватары не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать аватары"
},
"saber": {
"title": "Отвязать мечи",
"desc": "Осторожно, отвязка мечей сделает недоступными общие мечи для этой версии, пока вы не свяжете их снова.",
"keep-models": {
"label": "Оставить мечи",
"title": "Общие мечи будут скопированы в папку мечей этой версии. Мечи не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать мечи"
},
"platform": {
"title": "Отвязать платформы",
"desc": "Осторожно, отвязка платформ сделает недоступными общие платформы для этой версии, пока вы не свяжете их снова.",
"keep-models": {
"label": "Оставить платформы",
"title": "Общие платформы будут скопированы в папку платформ этой версии. Платформы не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать платформы"
},
"bloq": {
"title": "Отвязать кубы",
"desc": "Осторожно, отвязка кубов сделает недоступными общие кубы для этой версии, пока вы не свяжете их снова.",
"keep-models": {
"label": "Оставить кубы",
"title": "Общие кубы будут скопированы в папку кубов этой версии. Кубы не будут потеряны, если это не выбрано."
},
"valid-btn": "Отвязать кубы"
}
}
},
"notifications": {
"prevent-for-mods": {
"title": "Требуемые моды",
"desc": "Убедитесь, что вы установили все нужные моды, чтобы использовать модели в Beat Saber",
"go-to-mods": "Перейти к модам",
"not-remind": "Больше не напоминать"
},
"prevent-for-models-breaks": {
"title": "Сломанные модели",
"desc": "После обновления движка Beat Saber, модели не работают с этой версией."
},
"export-success": {
"title": "Экспорт завершен 🎉"
}
}
},
"beat-saver": {
"maps-sorts": {
"Latest": "Недавние",
"Relevance": "Релевантные",
"Rating": "Рейтинг",
"Curated": "Оценённые куратором"
}
},
"auto-update": {
"checking": "Проверка на обновления",
"downloading": "Скачивание обновления"
},
"bs-shortcut-launch": {
"beat-saber-launching": "Запускается Beat Saber",
"launching": "Запуск",
"open-bsmanager": "Открыть BSManager",
"status-text": {
"init": "Инициализация...",
"success": {
"BS_LAUNCHING": "Запускаем Beat Saber...",
"STEAM_LAUNCHING": "Запускаем Steam...",
"STEAM_LAUNCHED": "Steam запущен!",
"UNABLE_TO_LAUNCH_STEAM": "Не удалось запустить Steam, пытаемся запустить Beat Saber..."
}
}
},
"dateformat": {
"dayNames": ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб", "Воскресение", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
"monthNames": ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авн", "Сен", "Окт", "Ноя", "Дек", "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
"timeNames": ["д", "п", "дп", "пп", "Д", "П", "ДП", "ПП"]
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "bs-manager",
"version": "1.2.0",
"version": "1.3.0-alpha.3",
"description": "BSManager",
"main": "./dist/main/main.js",
"author": {
@@ -7,7 +7,7 @@ import { InstallationLocationService } from "../installation-location.service";
import { UtilsService } from "../utils.service";
import crypto from "crypto";
import { lstatSync, unlinkSync } from "fs";
import { copySync } from "fs-extra";
import { copySync, createReadStream } from "fs-extra";
import StreamZip from "node-stream-zip";
import { RequestService } from "../request.service";
import sanitize from "sanitize-filename";
@@ -22,6 +22,7 @@ import { deleteFolder, ensureFolderExist, getFilesInFolder, getFoldersInFolder,
import { readFile } from "fs/promises";
import { FolderLinkerService } from "../folder-linker.service";
import { allSettled } from "../../../shared/helpers/promise.helpers";
import { splitIntoChunk } from "../../../shared/helpers/array.helpers";
export class LocalMapsManagerService {
private static instance: LocalMapsManagerService;
@@ -82,17 +83,26 @@ export class LocalMapsManagerService {
}
private async computeMapHash(mapPath: string, rawInfoString: string): Promise<string> {
const mapRawInfo = JSON.parse(rawInfoString);
const mapRawInfo: RawMapInfoData = JSON.parse(rawInfoString);
const shasum = crypto.createHash("sha1");
shasum.update(rawInfoString);
const hashFile = (filePath: string): Promise<void> => {
return new Promise<void>((resolve, reject) => {
const stream = createReadStream(filePath);
stream.on("data", data => shasum.update(data));
stream.on("error", reject);
stream.on("close", resolve);
});
};
for (const set of mapRawInfo._difficultyBeatmapSets) {
for (const diff of set._difficultyBeatmaps) {
const diffFilePath = path.join(mapPath, diff._beatmapFilename);
const diffContent = await readFile(diffFilePath, { encoding: "utf-8" }).catch(() => null);
diffContent && shasum.update(diffContent);
await hashFile(diffFilePath);
}
}
return shasum.digest("hex");
}
@@ -146,28 +156,41 @@ export class LocalMapsManagerService {
(async () => {
const levelsFolder = await this.getMapsFolderPath(version);
const levelsPaths = (await pathExist(levelsFolder)) ? await getFoldersInFolder(levelsFolder) : [];
if(!(await pathExist(levelsFolder))) {
return observer.complete();
}
const levelsPaths = (await getFoldersInFolder(levelsFolder)) ?? [];
progression.total = levelsPaths.length;
const promises = levelsPaths.map(async levelPath => {
const mapInfo = await this.loadMapInfoFromPath(levelPath);
if (!mapInfo) {
return null;
}
progression.loaded++;
observer.next(progression);
return mapInfo;
});
const pathChunks = splitIntoChunk(levelsPaths, 50);
const mapsInfo = await allSettled(promises, { removeFalsy: true });
const loadedMaps: BsmLocalMap[] = [];
progression.maps = mapsInfo;
for (const chunk of pathChunks) {
const mapsInfo = await allSettled(chunk.map(async mapPath => {
const mapInfo = await this.loadMapInfoFromPath(mapPath);
if(!mapInfo) {
return null;
}
progression.loaded++;
observer.next(progression);
return mapInfo;
}), {removeFalsy: true});
loadedMaps.push(...(mapsInfo ?? []));
}
progression.maps = loadedMaps;
observer.next(progression);
})().then(() => {
observer.complete();
})();
}).catch(e=> {
observer.error(e);
});
});
}
@@ -52,6 +52,7 @@ import { VolumeUpIcon } from "./icons/volume-up-icon.component";
import { VolumeOffIcon } from "./icons/volume-off-icon.component";
import { VolumeDownIcon } from "./icons/volume-down-icon.component";
import { GermanIcon } from "./flags/german-icon.component";
import { RussianIcon } from "./flags/russian-icon.component";
import { MSModelType } from "shared/models/models/model-saber.model";
import { ModelTypeAvatarIcon } from "./icons/model-type-avatar-icon.component";
import { ModelTypeSaberIcon } from "./icons/model-type-saber-icon.component";
@@ -61,7 +62,7 @@ import { ChevronTopIcon } from "./icons/chevron-top-icon.component";
import { EyeCrossIcon } from "./icons/eye-cross-icon.component";
import { ShortcutIcon } from "./icons/shortcut-icon.component";
export type BsmIconType = BsvMapCharacteristic | MSModelType | ("settings" | "trash" | "favorite" | "folder" | "bsNote" | "check" | "three-dots" | "twitch" | "eye" | "play" | "checkCircleIcon" | "discord" | "info" | "eye-cross" | "terminal" | "desktop" | "oculus" | "add" | "cross" | "task" | "github" | "close" | "thumbUpFill" | "timerFill" | "pause" | "twitter" | "sync" | "chevron-top" | "copy" | "steam" | "edit" | "export" | "patreon" | "search" | "bsMapDifficulty" | "link" | "unlink" | "download" | "filter" | "mee6" | "volume-up" | "volume-off" | "volume-down" | "shortcut" | "fr-FR-flag" | "es-ES-flag" | "en-US-flag" | "en-EN-flag" | "de-DE-flag");
export type BsmIconType = BsvMapCharacteristic | MSModelType | ("settings" | "trash" | "favorite" | "folder" | "bsNote" | "check" | "three-dots" | "twitch" | "eye" | "play" | "checkCircleIcon" | "discord" | "info" | "eye-cross" | "terminal" | "desktop" | "oculus" | "add" | "cross" | "task" | "github" | "close" | "thumbUpFill" | "timerFill" | "pause" | "twitter" | "sync" | "chevron-top" | "copy" | "steam" | "edit" | "export" | "patreon" | "search" | "bsMapDifficulty" | "link" | "unlink" | "download" | "filter" | "mee6" | "volume-up" | "volume-off" | "volume-down" | "shortcut" | "fr-FR-flag" | "es-ES-flag" | "en-US-flag" | "en-EN-flag" | "de-DE-flag" | "ru-RU-flag");
export const BsmIcon = memo(({ className, icon, style }: { className?: string; icon: BsmIconType; style?: CSSProperties }) => {
// TODO : Very ugly very messy, need to find a better way to do this
@@ -112,6 +113,9 @@ export const BsmIcon = memo(({ className, icon, style }: { className?: string; i
if (icon === "de-DE-flag") {
return <GermanIcon className={className} style={style} />;
}
if (icon === "ru-RU-flag") {
return <RussianIcon className={className} style={style} />;
}
if (icon === "task") {
return <TaskIcon className={className} style={style} />;
}
@@ -0,0 +1,20 @@
import { CSSProperties } from "react";
export function RussianIcon(props: { className?: string; style?: CSSProperties }) {
return (
<svg xmlns="http://www.w3.org/2000/svg" width="71px" height="48px" viewBox="0 0 71 48" version="1.1" className={props.className} style={props.style}>
<defs />
<g id="Flags" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd" transform="translate(-239.000000, -805.000000)">
<g transform="translate(70.000000, 70.000000)" fillRule="nonzero" id="Russian">
<g transform="translate(169.000000, 735.000000)">
<g id="Bolivia-9">
<path d="M0.52,7 L0.52,16 L70.52,16 L70.52,7 C70.52,3.33282926 67.5471707,0.36 63.88,0.36 L7.17,0.36 C5.40723053,0.357345224 3.71575038,1.05574249 2.46834517,2.3012719 C1.22093997,3.54680131 0.519998001,5.23722853 0.52,7 Z" id="Shape" fill="#FFF" />
<polygon id="Shape" fill="#4758A9" points="0.52 31.74 70.52 31.74 70.52 16.07 0.52 16.07" />
<path d="M0.52,40.76 C0.52,44.4271707 3.49282926,47.4 7.16,47.4 L63.88,47.4 C67.5471707,47.4 70.52,44.4271707 70.52,40.76 L70.52,31.76 L0.52,31.76 L0.52,40.76 Z" id="Shape" fill="#ED5565" />
</g>
</g>
</g>
</g>
</svg>
);
}
@@ -82,11 +82,19 @@ export function ModsSlide({ version, onDisclamerDecline }: { version: BSVersion;
}
const modsToInstall = modsSelected.filter(mod => {
const corespondingMod = modsAvailable.get(mod.category).find(availabeMod => availabeMod._id === mod._id);
if (lt(corespondingMod.version, mod.version)) {
const installedMod = modsInstalled.get(mod.category)?.find(installedMod => installedMod.name === mod.name);
if (corespondingMod?.version && lt(corespondingMod.version, mod.version)) {
return false;
}
if(installedMod?.version && lt(mod.version, installedMod?.version)){
return false;
}
return true;
});
modsManager.installMods(modsToInstall, version).then(() => {
loadMods();
});
@@ -3,7 +3,7 @@ export const defaultConfiguration: { [key in DefaultConfigKey]: any } = {
"second-color": "#ff4444",
theme: "os",
language: window.navigator.language.length <= 2 ? `${window.navigator.language}-${window.navigator.language.toLocaleUpperCase()}` : window.navigator.language,
supported_languages: ["en-US", "en-EN", "fr-FR", "es-ES", "de-DE"],
supported_languages: ["en-US", "en-EN", "fr-FR", "es-ES", "de-DE", "ru-RU"],
default_mods: ["SongCore", "WhyIsThereNoLeaderboard", "BeatSaverDownloader", "BeatSaverVoting", "PlaylistManager"],
"default-shared-folders": [
window.electron.path.join("Beat Saber_Data", "CustomLevels"),
+1
View File
@@ -1,6 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>BSManager</title>
<link rel="stylesheet" href="https://use.typekit.net/okr8ven.css">
<meta charset="utf-8" />
<meta