From e5142fe1317dbc572623f824c8c37b9fe9abec5d Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:10:52 +0200 Subject: [PATCH] [feature] add german translation --- assets/jsons/translations/de.json | 732 ++++++++++++++++++ assets/jsons/translations/en.json | 4 +- assets/jsons/translations/es.json | 4 +- assets/jsons/translations/fr.json | 4 +- .../components/svgs/bsm-icon.component.tsx | 4 +- .../svgs/flags/german-icon.component.tsx | 20 + .../config/default-configuration.config.ts | 2 +- 7 files changed, 765 insertions(+), 5 deletions(-) create mode 100644 assets/jsons/translations/de.json create mode 100644 src/renderer/components/svgs/flags/german-icon.component.tsx diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json new file mode 100644 index 00000000..133ee1fc --- /dev/null +++ b/assets/jsons/translations/de.json @@ -0,0 +1,732 @@ +{ + "misc": { + "download": "Download", + "verify": "Verify", + "launch": "Launch", + "mods": "Mods", + "maps": "Maps", + "playlists": "Playlists", + "models": "Models", + "cancel": "Cancel", + "delete": "Delete", + "accept": "Accept", + "refuse": "Refuse", + "apply": "Apply" + }, + "nav-bar":{ + "add-version": "Add a version", + "settings": "Settings" + }, + "pages": { + "shared-maps":{ + "title": "Shared maps" + }, + "version-viewer": { + "launch-mods": { + "oculus": "Oculus Mode", + "oculus-description": "If you are using Beat Saber via Steam, it allows you to use Oculus's VR composer without passing by SteamVR, to gain performances This is not necessary for using Oculus headsets.", + "desktop": "Desktop Mode", + "desktop-description": "This allows you to use WASD and the mouse to navigate around the menu in game. This makes testing much easier, because you don't have to put on your headset!", + "debug": "Debug Mode", + "debug-description": "Enables the output log window for IPA. This will show the debug console that mods use.", + "advanced-launch": { + "button": "Advanced launch", + "placeholder": "Additional arguments ex: --revert; --nowait" + } + }, + "maps": { + "title": "Shared maps", + "search-bar": { + "search-placeholder": "Search a map", + "filters-btn": "Filters", + "dropdown": { + "export-maps": "Export maps", + "delete-maps": "Delete maps" + } + }, + "tabs": { + "maps": { + "actions": { + "add-maps": { + "text": "Add" + }, + "link-maps": { + "tooltips": { + "link": "Link maps", + "unlink": "Unlink maps" + } + } + }, + "empty-maps":{ + "text":"No maps", + "button":"Download maps" + } + } + } + }, + "mods": { + "loading-mods": "Loading mods...", + "no-internet": "No internet", + "mods-not-available": "No mods are available yet for this version of Beat Saber", + "buttons": { + "more-infos": "More info", + "install-or-update": "Install or update" + }, + "mods-grid": { + "header-bar": { + "name": "Name", + "installed": "Installed", + "latest": "Latest", + "description": "Description", + "dropdown": { + "uninstall-all": "Uninstall all" + } + } + } + }, + "dropdown": { + "open-folder": "Open folder", + "verify-files": "Verify files", + "clone": "Clone", + "edit": "Edit", + "uninstall": "Uninstall", + "shared-folders": "Shared Folders" + } + }, + "available-versions": { + "title": "Select a version", + "steam-release": "Release page", + "dropdown": { + "refresh": "Refresh list", + "import-version" :"Import a version" + } + }, + "settings": { + "steam": { + "title": "Steam", + "description": "If you log out of Steam, you will have to log back in to download a new version of Beat Saber.", + "logout": "Log out" + }, + "appearance": { + "title": "Appearance", + "description": "Choose the two main colours of BSManager.", + "reset": "Reset", + "sub-title": "Theme", + "themes": { + "dark": "Dark", + "light": "Light", + "os": "Sync with computer" + } + }, + "installation-folder": { + "title": "Installation folder", + "description": "Change the default folder for Beat Saber versions and other upcoming features.", + "choose-folder": "Choose folder" + }, + "additional-content": { + "title": "Additional content", + "description": "Additional content allows you to customize BeatSaber!", + "deep-links": { + "sub-title": "OneClick installations" + } + }, + "language": { + "title": "Language", + "description": "Select a language.", + "languages": { + "en-EN": "English, UK", + "en-US": "English, US", + "fr-FR": "Français", + "es-ES": "Español", + "de-DE": "Deutsch", + "translated": { + "en-EN": "English, United Kingdom", + "en-US": "English, USA", + "fr-FR": "French", + "es-ES": "Spanish", + "de-DE": "Deutsch" + } + } + }, + "patreon": { + "title": "Support BSManager 💖", + "description": "Support the project and help us to provide continuous improvements to BSManager.", + "buttons": { + "support": "Support BSManager 🥰", + "supporters": "Supporters 👀" + }, + "view": { + "no-supporters": "No supporter yet", + "sponsors": "Sponsors", + "supporters": "Supporters" + } + }, + "discord": { + "description": "Join the BSManager community by following us on our social media!" + }, + "contribution": { + "description": "Suggest new features or report a bug to help improve BSManager!", + "buttons": { + "request-features": "Request a feature", + "report-bug": "Report a bug", + "open-logs": "Open logs" + } + } + } + }, + "notifications": { + "types": { + "error": "🚨 Error", + "warning": "⚠️ Warning", + "success": "🎉 Success" + }, + "common": { + "msg": { + "error-occurred": "An error has occurred" + } + }, + "shared": { + "errors": { + "titles": { + "operation-running": "Operation running", + "no-internet": "No internet" + }, + "msg": { + "operation-running": "Wait for the end of the current operation then start again.", + "no-internet": "Check your connection and try again." + } + } + }, + "bs-download": { + "success": { + "titles": { + "download-success": "Download complete", + "verification-finished": "Verification complete" + } + }, + "warnings": { + "msg": { + "ManifestChecksum": "The previously downloaded manifest does not match the new 🤔", + "ConnectionTimeout": "Your internet connection seems unstable 🥶", + "ConnectionLost": "The connection has been lost, try again...", + "ConnectionError": "Unable to connect to Steam, retry...", + "Unknown": "Something strange has happened 🤔 Your connection is probably unstable." + } + }, + "errors": { + "titles":{ + "dotnet-required": ".NET 6 Required" + }, + "msg": { + "401": "Steam doesn't seem to want to let us download BeatSaber 😢", + "404": "Unable to contact Steam servers.", + "Password": "Password is invalid.", + "InvalidCredentials": "Your e-mail or password is invalid 😴", + "InvalidPassword": "Your password is invalid 😕", + "NoManifest": "No manifest was found", + "DirectoryCreate": "Unable to install the necessary folders.", + "NotAvailableApp": "Are you trying to download BeatSaber when you don't have it ? 🤣", + "DepotNotFound": "Unable to download BeatSaber 😥 try again later 😕", + "NotCompleted": "The download could not complete ¯\\_(ツ)_/¯", + "InvalidManifest": "Unable to download BeatSaber 😥 try again later 😕", + "NoValidKey": "Unable to download BeatSaber 😥 try again later 😕", + "NoManifestCode": "Unable to download BeatSaber 😥 try again later 😕", + "Unknown": "An unknown error occurred ¯\\_(ツ)_/¯", + "NoServer": "Unable to contact Steam servers.", + "NotAllowed": "Apparently you are not allowed to download BeatSaber 🥱", + "ConnectionTimeout": "Cannot connect to Steam 😕", + "SteamLib": "If you have this error, report the bug on GitHub with the logs pls.", + "ConnectionError": "Unable to connect to Steam after 10 tries 🤯", + "LicenceError": "Unable to get the list of licenses.", + "verification-failed": "Verification failed, try again later.", + "RateLimitExceeded": "You've tried too many times, wait a while and try again later.", + "AlreadyDownloading": "A download is already in progress", + "no-internet": "No internet connection.", + "dotnet-required": ".NET 6 Runtime must be installed in order to download a version of BeatSaber. Download it by clicking the button below." + }, + "actions":{ + "download-dotnet": "Download .NET 6" + } + } + }, + "bs-import-version":{ + "success":{ + "start-import": { + "title": "Import in progress 👌", + "desc": "The import may take several minutes depending on your configuration." + }, + "imported": { + "title": "Imported version 🎉" + } + }, + "errors":{ + "import-error":{ + "desc": "Check that the selected folder is a BeatSaber installation." + } + } + }, + "settings": { + "move-folder": { + "success": { + "titles": { + "transfer-finished": "Transfer complete" + } + }, + "errors": { + "titles": { + "transfer-failed": "Transfer failed 😕" + } + } + }, + "steam": { + "success": { + "titles": { + "logout": "Disconnected from Steam." + } + } + }, + "additional-content":{ + "deep-link": { + "select-all": "Select all", + "activation":{ + "success":{ + "title":"OneClick activated!", + "description":"OneClick installations have been activated." + }, + "error":{ + "description":"Unable to activate OneClick installations." + } + }, + "deactivation":{ + "success":{ + "title":"OneClick deactivated!", + "description":"OneClick installations have been deactivated." + }, + "error":{ + "description":"An unknown error occurred." + } + }, + "check-all-enabled":{ + "title": "OneClick Disabled", + "description": "One or more OneClick installations are disabled. Go to settings to enable them.", + "actions":{ + "settings": "Settings", + "not-remind": "Do not remind me" + } + } + } + } + }, + "bs-launch": { + "success": { + "titles": { + "launching": "Launching...🚀" + } + }, + "errors": { + "titles": { + "UNABLE_TO_LAUNCH": "Unable to launch", + "STEAM_NOT_RUNNING": "Steam is not running", + "OCULUS_NOT_RUNNING": "Oculus is not running", + "BS_ALREADY_RUNNING": "BeatSaber already running", + "EXE_NOT_FINDED": "Missing files", + "EXIT": "Abrupt stop" + }, + "msg": { + "STEAM_NOT_RUNNING": "Steam must be running to launch BeatSaber.", + "OCULUS_NOT_RUNNING": "Oculus must be running to launch BeatSaber.", + "BS_ALREADY_RUNNING": "Close BeatSaber before launching it again.", + "EXE_NOT_FINDED": "Some files seem to be missing, try to verify the files.", + "EXIT": "BeatSaber stopped abruptly, tries to check the files." + }, + "actions":{ + "STEAM_NOT_RUNNING": "Launch Steam" + } + } + }, + "steam":{ + "steam-launching":{ + "title": "Steam is launching!", + "description": "Steam may take some time to launch depending on your configuration." + } + }, + "custom-version": { + "errors": { + "titles": { + "CantEditSteam": "Unable to edit", + "CantRename": "Renaming impossible", + "VersionAlreadExist": "This version already exists", + "CantClone": "Cloning impossible" + }, + "msg": { + "CantEditSteam": "You can't edit the Steam version. You can clone it though." + } + }, + "success": { + "titles": { + "CloningFinished": "Cloning complete 🎉" + } + } + }, + "mods": { + "install-mods": { + "titles": { + "success": "Mods installed 🎉", + "warning": "Mods installed 🤔" + }, + "msg": { + "success": "All mods have been installed.", + "warning": "One or more mods could not be installed.", + "errors": { + "no-mods": "No mods to install.", + "cannot-install-bsipa": "BSIPA installation failed 😨" + } + } + }, + "uninstall-mod": { + "titles": { + "success": "Mod uninstalled 🎉" + }, + "msg": { + "errors": { + "no-mods": "This mod isn't installed 😑" + } + } + }, + "uninstall-all-mods": { + "titles": { + "success": "Mods uninstalled 🎉" + }, + "msg": { + "success": "All mods have been uninstalled.", + "errors": { + "no-mods": "No mod is installed in this version 😑" + } + } + } + }, + "maps":{ + "one-click-install":{ + "success":"Map installation complete", + "error":"An error occurred while installing the map" + } + }, + "playlists":{ + "one-click-install":{ + "success":"Playlist installation complete", + "error":"An error occurred while installing the playlist" + } + }, + "models":{ + "one-click-install":{ + "success":"Model installation complete", + "error":"An error occurred while installing the model" + } + }, + "shared-folder": { + "info": { + "userdata-backup-created":{ + "title": "Backup created", + "msg": "Sharing the 'UserData' folder can generate errors, in case of problems unlink the folder to restore the backup" + } + } + } + }, + "modals": { + "misc":{ + "remember-my-choice": "Remember my choice" + }, + "guard": { + "title": "Steam Guard", + "inputs": { + "guard-code": { + "label": "Guard Code", + "placeholder": "Enter your Guard code" + } + }, + "buttons": { + "submit": "Login" + } + }, + "steam-login": { + "title": "Steam Login", + "inputs": { + "username": { + "label": "Username", + "placeholder": "Enter your username" + }, + "password": { + "label": "Password", + "placeholder": "Enter your password" + }, + "stay": { + "label": "Stay connected" + } + }, + "why-credentials": "Why do you need my credentials ?", + "buttons": { + "submit": "Login" + } + }, + "steam-credentials":{ + "title": "Steam Credentials", + "p-1": "The credentials are only used to download the game because steam need to verify that you paid the game in order to be allowed to download it. They aren't saved and directly passed to DepotDownloader. If you don't want to enter your credentials you can follow this tutorial :", + "p-2": "and then click on the gear icon in the top right corner and select \"Import a version\", select the folder where beat saber has been downloaded (If you follow the tutorial above you should have the correct location)" + }, + "bs-import-version":{ + "title": "Import a version", + "description": "Imports a version of BeatSaber to use with BSManager. The import will copy the selected BeatSaber installation folder to the BSManager versions folder.", + "buttons":{ + "submit": "Import a version" + } + }, + "bs-uninstall": { + "title": "Uninstall", + "description": "Are you sure you want to uninstall BeatSaber {version} ? You will have to download it again to play it.", + "buttons": { + "submit": "Uninstall" + } + }, + "install-folder": { + "title": "Installation folder", + "description": "Changing the default installation folder will result in moving all installed data to the new folder.", + "buttons": { + "submit": "Choose folder" + } + }, + "edit-version": { + "title": "Edit the version", + "buttons": { + "submit": "Edit" + } + }, + "clone-version": { + "title": "Clone version", + "description": "Cloning the version allows you to separate additional BeatSaber content between two versions.", + "inputs": { + "name": { + "label": "Name", + "placeholder": "Version name" + }, + "color": { + "label": "Color" + } + }, + "buttons": { + "submit": "Clone" + } + }, + "uninstall-mod": { + "title": "Uninstall", + "description": "Are you sure you want to uninstall {mod}? It could cause other installed mods to malfunction.", + "description-bsipa": "Are you sure you want to uninstall BSIPA? After that all installed mods will not work anymore." + }, + "uninstall-all-mods": { + "title": "Uninstalling mods", + "description": "Are you sure you want to uninstall all the mods from version {version}? This operation cannot be undone." + }, + "maps-actions": { + "delete-maps": { + "title": { + "single": "Delete the map?", + "multiple": "Delete maps ?" + }, + "desc": { + "single": "Are you sure you want to delete the map {name}?", + "multiple": "Are you sure you want to delete all {nb} maps?" + }, + "info": { + "desc": { + "single": "This map is part of the shared maps", + "multiple": "These maps are part of the shared maps" + }, + "title": { + "single": "This map will also be removed from versions using shared maps", + "multiple": "These maps will also be removed from versions using shared maps" + } + } + }, + "link-maps": { + "title": "Link maps", + "desc": "Linking maps allows to share maps between all versions. Once linked, this version will benefit from the shared maps", + "info": "Adding and deleting maps will also be shared", + "keep-maps": { + "label": "Keep maps", + "title": "Keep maps will move the maps of the current version to the shared maps folder. Otherwise they will be lost" + }, + "valid-btn": "Link maps" + }, + "unlink-maps": { + "title": "Unlink maps", + "desc": "Please note that unlinking maps will not allow the use of shared maps for this version.", + "keep-maps": { + "label": "Keep maps", + "title": "Keeping the maps will create a copy of the shared maps for the current version. Otherwise, no map will be kept for this version." + }, + "valid-btn": "Unlink maps" + } + }, + "download-maps": { + "search-btn": "Search", + "loading-maps": "Loading maps...", + "no-maps-found": "No maps found", + "no-internet": "No internet" + }, + "mods-disclaimer":{ + "title": "disclaimer", + "p-1": "By choosing to use mods, you understand that:", + "li-1": "You may experience problems that don't exist in the vanilla game. 99.9% of bugs, crashes, and lag are due to mods.", + "li-2": "Mods are subject to being broken by updates and that's normal - be patient and respectful when this happens, as modders are volunteers with real lives.", + "li-3": "Beat Games aren't purposefully trying to break mods. They wish to work on the codebase and sometimes this breaks mods, but they are not out to kill mods.", + "p-2": "Do not attack the game developers for issues related to mods, and vice versa - modders and game developers are two separate groups. Just don't be a jerk ok." + }, + "shared-folders":{ + "title": "Shared Folders", + "description": "Link BeatSaber folders to synchronize their contents with shared folders in other versions. Note that deleting content will also be shared.", + "buttons": { + "add-folder": "Add Folder", + "link-folder": "Link Folder", + "unlink-folder": "Unlink Folder" + } + } + }, + "maps": { + "map-filter-panel": { + "duration": "Duration", + "tags": "tags", + "specificities": "general", + "requirements": "requirements" + }, + "map-types": { + "accuracy": "accuracy", + "balanced": "balanced", + "challenge": "challenge", + "dancestyle": "dance", + "fitness": "fitness", + "speed": "speed", + "tech": "tech" + }, + "map-styles": { + "dance": "dance", + "swing": "swing", + "nightcore": "nightcore", + "folk": "folk", + "family": "family", + "ambient": "ambient", + "funk": "funk", + "jazz": "jazz", + "soul": "soul", + "speedcore": "speedcore", + "punk": "punk", + "rb": "r&b", + "holiday": "holiday", + "vocaloid": "vocaloid", + "jrock": "j-rock", + "trance": "trance", + "drumbass": "drum & bass", + "comedy": "comedy", + "instrumental": "instrumental", + "hardcore": "hardcore", + "kpop": "k-pop", + "indie": "indie", + "techno": "techno", + "house": "house", + "game": "video game", + "film": "film", + "alt": "alternative", + "dubstep": "dubstep", + "metal": "metal", + "anime": "anime", + "hiphop": "hiphop", + "jpop": "j-pop", + "rock": "rock", + "pop": "pop", + "electronic": "electronic", + "classical-orchestral": "Classical & Orchestral" + }, + "map-specificities": { + "automapper": "AI", + "ranked": "ranked", + "curated": "curated", + "verified": "verified", + "fullSpread": "full spread" + }, + "difficulties": { + "Easy": "easy", + "Normal": "normal", + "Hard": "hard", + "Expert": "expert", + "ExpertPlus": "expert+" + }, + "map-item": { + "by": "By {songAutor}", + "mapped-by": "mapped by" + } + }, + "beat-saver": { + "maps-sorts": { + "Latest": "Latest", + "Relevance": "Relevance", + "Rating": "Rating", + "Curated": "Curated" + } + }, + "auto-update": { + "checking": "Checking for updates", + "downloading": "Downloading updates" + }, + "dateformat": { + "dayNames": [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat", + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + "monthNames": [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "June", + "Jul", + "Aug", + "Sept", + "Oct", + "Nov", + "Dec", + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December" + ], + "timeNames": [ + "a", + "p", + "am", + "pm", + "A", + "P", + "AM", + "PM" + ] + } +} \ No newline at end of file diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 03891104..7e3da70c 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -138,11 +138,13 @@ "en-US": "English, US", "fr-FR": "Français", "es-ES": "Español", + "de-DE": "Deutsch", "translated": { "en-EN": "English, United Kingdom", "en-US": "English, USA", "fr-FR": "French", - "es-ES": "Spanish" + "es-ES": "Spanish", + "de-DE": "German" } } }, diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 13ebc28a..c5d35860 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -137,11 +137,13 @@ "en-US": "English, US", "fr-FR": "Français", "es-ES": "Español", + "de-DE": "Deutsch", "translated": { "en-EN": "Inglés, Reino Unido", "en-US": "Inglés, Estados Unidos", "fr-FR": "Francés", - "es-ES": "Español" + "es-ES": "Español", + "de-DE": "Alemán" } } }, diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 4e10fb25..e3519357 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -137,11 +137,13 @@ "en-US": "English, US", "fr-FR": "Français", "es-ES": "Español", + "de-DE": "Deutsch", "translated": { "en-EN": "Anglais, Royaume-Uni", "en-US": "Anglais, États-Unis", "fr-FR": "Français", - "es-ES": "Espagnol" + "es-ES": "Espagnol", + "de-DE": "Allemand" } } }, diff --git a/src/renderer/components/svgs/bsm-icon.component.tsx b/src/renderer/components/svgs/bsm-icon.component.tsx index 162505d3..47b2e82b 100644 --- a/src/renderer/components/svgs/bsm-icon.component.tsx +++ b/src/renderer/components/svgs/bsm-icon.component.tsx @@ -51,12 +51,13 @@ import { SyncIcon } from "./icons/sync-icon.component"; 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"; export type BsmIconType = BsvMapCharacteristic | ( "settings"|"trash"|"favorite"|"folder"|"bsNote"|"check"|"three-dots"|"twitch"|"eye"|"play"|"checkCircleIcon"|"discord"|"info"| "terminal"|"desktop"|"oculus"|"add"|"cross"|"task"|"github"|"close"|"thumbUpFill"|"timerFill"|"pause"|"twitter"|"sync"| "copy"|"steam"|"edit"|"export"|"patreon"|"search"|"bsMapDifficulty"|"link"|"unlink"|"download"|"filter"|"mee6"|"volume-up"|"volume-off"|"volume-down"| - "fr-FR-flag"|"es-ES-flag"|"en-US-flag"|"en-EN-flag" + "fr-FR-flag"|"es-ES-flag"|"en-US-flag"|"en-EN-flag"|"de-DE-flag" ); export const BsmIcon = memo(({className, icon, style}: {className?: string, icon: BsmIconType, style?: CSSProperties}) => { @@ -76,6 +77,7 @@ export const BsmIcon = memo(({className, icon, style}: {className?: string, icon if(icon === "es-ES-flag"){ return } if(icon === "en-US-flag"){ return } if(icon === "en-EN-flag"){ return } + if(icon === "de-DE-flag"){ return } if(icon === "task"){ return } if(icon === "copy"){ return } if(icon === "steam"){ return } diff --git a/src/renderer/components/svgs/flags/german-icon.component.tsx b/src/renderer/components/svgs/flags/german-icon.component.tsx new file mode 100644 index 00000000..4ea0c10d --- /dev/null +++ b/src/renderer/components/svgs/flags/german-icon.component.tsx @@ -0,0 +1,20 @@ +import { CSSProperties } from "react"; + +export function GermanIcon(props: {className?: string, style?: CSSProperties}) { + return ( + + + + + + + + + + + + + + + ) +} diff --git a/src/renderer/config/default-configuration.config.ts b/src/renderer/config/default-configuration.config.ts index 6e5875dc..d7f666c4 100644 --- a/src/renderer/config/default-configuration.config.ts +++ b/src/renderer/config/default-configuration.config.ts @@ -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"], + "supported_languages": ["en-US", "en-EN", "fr-FR", "es-ES", "de-DE"], "default_mods": ["SongCore", "WhyIsThereNoLeaderboard", "BeatSaverDownloader", "BeatSaverVoting", "PlaylistManager"], "default-shared-folders": [ "Beat Saber_Data\\CustomLevels",