mirror of
https://github.com/Zagrios/bs-manager.git
synced 2026-07-03 14:08:25 +02:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5d4a824a76 | |||
| 6472aff718 | |||
| 02d3d64a18 | |||
| 6d8d3e993a | |||
| 570a20470e | |||
| e96a977abe | |||
| 6ef328caec | |||
| 80f625102e | |||
| abf622e68f | |||
| 63c9bd9436 | |||
| 5e763c99d8 | |||
| 2e5b11bdb0 | |||
| 7287dfffde | |||
| 92461639b0 |
@@ -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. -->
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"name": "bs-manager",
|
||||
"version": "1.2.0",
|
||||
"version": "1.3.0-alpha.2",
|
||||
"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,15 @@ 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 (lt(corespondingMod.version, mod.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,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
|
||||
|
||||
Reference in New Issue
Block a user