Merge remote-tracking branch 'upstream/main'

This commit is contained in:
Mopsgamer 2024-04-16 13:33:56 +02:00
commit 09c556cae7
131 changed files with 5755 additions and 5450 deletions

1
.npmrc Normal file
View File

@ -0,0 +1 @@
auto-install-peers=false

View File

@ -2,6 +2,107 @@
This changelog starts with the restructured 1.0.0 release that happened after context isolation changes. The changelogs here should more-or-less mirror the ones that get shown in the client but probably with less formatting and pizzazz.
## 1.10.1
### Added
- Added an `ErrorBoundary` to the custom modal stack to prevent errors from bubbling up and preventing startup.
### Removed
### Changed
### Fixed
- Fixed modal transition component search for Discord's new function component version
## 1.10.0
### Added
- Enable/disable all buttons for both AddonLists
- BDContextMenu has been integrated
- Ability to reset to default settings of any collection
- Several design components like Flex, Button, Text, and all Modal components
- Added a backup modal stack and backdrop in case we lose Discord's again
- Added a wanring for large debug logs
- `onClose` for modal APIs
- New debug information in user settings
### Removed
- Several unused "known modules"
- `DiscordClasses` module since it was seldom used
- `ClassName` and similar constructs
- Legacy emote assets
### Changed
- Search bars now auto focus
- Opening folder on Windows now occur in the foreground
- Search fields are now clearable
- AddonList pages now show totals and results of searches
- Custom CSS live update is now debounced and using a proper switch not a checkbox
- ConfirmationModal and ChangelogModal are now using custom components
- Updater panel now uses icons rather than text buttons
- AddonList panels have been rearranged to accomodate the new buttons
- The anonymous BD patch function is now named `BDPatcher`
- Modal APIs now use internal ConfirmationModal component
- Markdown areas now consistenly allow for embedded links
- Lazy loaded modules are returned to the original source
### Fixed
- Fixed grabbing the wrong module for accepting invites
- Fixed more strings that were not translatable
## 1.9.8
### Added
### Removed
### Changed
### Fixed
- Removed `ipc.sendTo` for electron 28
- Fixed core updater not using the semver comparator
## 1.9.7
### Added
- Support for Spanish (LATAM) locale
### Removed
### Changed
- Updated translations
- Ignore relative requires (This is because when favoriting a GIF and other UI actions, Discord repeatedly attempts to load relative requires on accident causing our code to make tons of FS requests causing lag.)
### Fixed
- Fixed locale not falling back to English properly
## 1.9.6
### Added
- All HTTP request options for bd-fetch
### Removed
### Changed
- Updated translations
### Fixed
- Fixed race conditions for notices
- Fixed options not being sent to fetch
## 1.9.5
### Added
### Removed
### Changed
### Fixed
- Fixed the webpack patch for the new loader
## 1.9.4
### Added

View File

@ -1,6 +1,6 @@
<div align="center">
[![BetterDiscord Logo](https://media.discordapp.net/attachments/341062370627682315/1053477174566465567/logo_large_ish.png)](https://betterdiscord.app/)
<a href="https://betterdiscord.app"><img src="https://betterdiscord.app/resources/branding/logo_large.svg" alt="BetterDiscord Logo" style="width: 70%"/></a>
[![CI Status][build-badge]][build-link] [![GitHub Releases][downloads-badge]][downloads-link] [![Discord][discord-badge]][discord-link] [![Website][website-badge]][website-link] [![Docs][docs-badge]][docs-link]

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
module.exports = {
blocklist: require("./blocklist.json"),
BTTV: require("./bttv.json"),
FrankerFaceZ: require("./frankerfacez.json"),
TwitchGlobal: require("./twitchglobal.json"),
TwitchSubscriber: require("./twitchsubscriber.json")
};

View File

@ -1 +0,0 @@
{"JKanStyle":15,"OptimizePrime":16,"StoneLightning":17,"TheRinger":18,"RedCoat":22,"Kappa":25,"JonCarnage":26,"MrDestructoid":28,"BCWarrior":30,"GingerPower":32,"DansGame":33,"SwiftRage":34,"PJSalt":36,"KevinTurtle":40,"Kreygasm":41,"SSSsss":46,"PunchTrees":47,"ArsonNoSexy":50,"SMOrc":52,"FrankerZ":65,"OneHand":66,"HassanChop":68,"BloodTrail":69,"DBstyle":73,"AsianGlow":74,"BibleThump":86,"ShazBotstix":87,"PogChamp":88,"PMSTwin":92,"FUNgineer":244,"ResidentSleeper":245,"4Head":354,"HotPokket":357,"FailFish":360,"DAESuppy":973,"WholeWheat":1896,"ThunBeast":1898,"TF2John":1899,"RalpherZ":1900,"Kippa":1901,"Keepo":1902,"BigBrother":1904,"SoBayed":1906,"PeoplesChamp":3412,"GrammarKing":3632,"PanicVis":3668,"ANELE":3792,"BrokeBack":4057,"PipeHype":4240,"YouWHY":4337,"RitzMitz":4338,"EleGiggle":4339,"TheThing":7427,"HassaanChop":20225,"BabyRage":22639,"panicBasket":22998,"PermaSmug":27509,"BuddhaBar":27602,"WutFace":28087,"PRChase":28328,"Mau5":30134,"HeyGuys":30259,"NotATK":34875,"mcaT":35063,"TTours":38436,"PraiseIt":38586,"HumbleLife":46881,"CorgiDerp":49106,"ArgieB8":51838,"ShadyLulu":52492,"KappaPride":55338,"CoolCat":58127,"DendiFace":58135,"NotLikeThis":58765,"riPepperonis":62833,"duDudu":62834,"bleedPurple":62835,"twitchRaid":62836,"SeemsGood":64138,"MingLee":68856,"KappaRoss":70433,"KappaClaus":74510,"OhMyDog":81103,"OSFrog":81248,"SeriousSloth":81249,"KomodoHype":81273,"VoHiYo":81274,"MikeHogu":81636,"KappaWealth":81997,"cmonBruh":84608,"SmoocherZ":89945,"NomNom":90075,"StinkyCheese":90076,"ChefFrank":90129,"FutureMan":98562,"OpieOP":100590,"DoritosChip":102242,"PJSugar":102556,"VoteYea":106293,"VoteNay":106294,"RuleFive":107030,"DxCat":110734,"DrinkPurple":110785,"TinyFace":111119,"PicoMause":111300,"TheTarFu":111351,"DatSheffy":111700,"UnSane":111792,"copyThis":112288,"pastaThat":112289,"imGlitch":112290,"GivePLZ":112291,"TakeNRG":112292,"BlargNaut":114738,"DogFace":114835,"Jebaited":114836,"TooSpicy":114846,"WTRuck":114847,"UncleNox":114856,"RaccAttack":114870,"StrawBeary":114876,"PrimeMe":115075,"BrainSlug":115233,"BatChest":115234,"CurseLit":116625,"Poooound":117484,"FreakinStinkin":117701,"SuperVinlin":118772,"TriHard":120232,"CoolStoryBob":123171,"ItsBoshyTime":133468,"KAPOW":133537,"YouDontSay":134254,"UWot":134255,"RlyTho":134256,"PartyTime":135393,"NinjaGrumpy":138325,"MVGame":142140,"TBAngel":143490,"TheIlluminati":145315,"BlessRNG":153556,"MorphinTime":156787,"ThankEgg":160392,"ArigatoNas":160393,"BegWan":160394,"BigPhish":160395,"InuyoFace":160396,"Kappu":160397,"KonCha":160400,"PunOko":160401,"SabaPing":160402,"TearGlove":160403,"TehePelo":160404,"TwitchLit":166263,"CarlSmile":166266,"CrreamAwk":191313,"Squid1":191762,"Squid2":191763,"Squid3":191764,"Squid4":191767,"TwitchUnity":196892,"TPcrunchyroll":323914,"EntropyWins":376765,"PowerUpR":425671,"PowerUpL":425688,"HSCheers":444572,"HSWP":446979,"DarkMode":461298,"TwitchVotes":479745,"TPFufun":508650,"RedTeam":530888,"GreenTeam":530890,"PurpleStar":624501,"FBtouchdown":626795,"PopCorn":724216,"TombRaid":864205,"EarthDay":959018,"PartyHat":965738,"MercyWing1":1003187,"MercyWing2":1003189,"PinkMercy":1003190,"BisexualPride":1064987,"LesbianPride":1064988,"GayPride":1064991,"TransgenderPride":1064995,"AsexualPride":1130348,"PansexualPride":1130349,"TwitchRPG":1220086,"IntersexPride":1221184,"MaxLOL":1290325,"NonBinaryPride":1297279,"GenderFluidPride":1297281,"FBRun":1441261,"FBPass":1441271,"FBSpiral":1441273,"FBBlock":1441276,"FBCatch":1441281,"FBChallenge":1441285,"FBPenalty":1441289,"PixelBob":1547903,"GunRun":1584743,"HolidayCookie":1713813,"HolidayLog":1713816,"HolidayOrnament":1713818,"HolidayPresent":1713819,"HolidaySanta":1713822,"HolidayTree":1713825,"SoonerLater":2113050,"TwitchSings":300116344,"SingsMic":300116349,"SingsNote":300116350}

File diff suppressed because one or more lines are too long

View File

@ -10,10 +10,6 @@
"name": "Nastavení",
"general": {
"name": "Obecné",
"emotes": {
"name": "Systém emotů",
"note": "Povolí systém emotů BD"
},
"voiceDisconnect": {
"name": "Odpojení z hlas. kanálu",
"note": "Odpojit z hlasového kanálu při zavření Discordu"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Emoty",
"general": {
"name": "Obecné",
"download": {
"name": "Stáhnout emoty",
"note": "Stáhne emoty vždy, kdy jsou zastaralé"
},
"emoteMenu": {
"name": "Menu emotů",
"note": "Zobrazit Twitch/oblíbené emoty v menu emotů"
},
"hideEmojiMenu": {
"name": "Skrýt menu smajlíků",
"note": "Skryje menu smajlíků Discordu při používání menu emotů"
},
"autoCaps": {
"name": "Automatická kapitalizace emotů",
"note": "Automatická kapitalizace emote příkazů"
},
"modifiers": {
"name": "Zobrazit modifikátory emotů",
"note": "Povolit modifikátory emotů (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animovat při přejetí",
"note": "Animovat modifikátory emotů pouze při přejetí myší"
}
},
"categories": {
"name": "Kategorie",
"twitchglobal": {
"name": "Globální Twitch",
"note": "Zobrazí globální Twitch emoty"
},
"twitchsubscriber": {
"name": "Odběratelé Twitch",
"note": "Zobrazí odběratelské Twitch emoty"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Zobrazí emoty od FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Zobrazí emoty od BTTV"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "Nastavení editoru",
"editorTitle": "Okno vlastního CSS"
},
"Emotes": {
"loading": "Načítání emotů na pozadí - neobnovuj.",
"loaded": "Všechny emoty byly úspěšně načteny.",
"clearEmotes": "Vyčistit data emotů",
"favoriteAction": "Oblíbené!",
"downloadFailed": "Stahování selhalo",
"failureMessage": "BetterDiscordu se nepodařilo stáhnout emoty, zkontroluj prosím své internetové připojení a firewall."
},
"Modals": {
"confirmAction": "Opravdu?",
"okay": "Dobře",

View File

@ -9,10 +9,6 @@
"name": "Einstellungen",
"general": {
"name": "Allgemein",
"emotes": {
"name": "Emotesystem",
"note": "Aktiviert das BD-Emotesystem"
},
"voiceDisconnect": {
"name": "Verbindung zum Sprachchat trennen",
"note": "Trennt beim Schließen von Discord die Verbindung zum Sprachchat"
@ -107,55 +103,6 @@
"note": "Speichert alle Ausgaben aus der Konsole in die \\\"debug.log\\\" Datei im BetterDiscord Verzeichnis"
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "Allgemein",
"download": {
"name": "Emotes herunterladen",
"note": "Lade Emotes herunter, wenn sie nicht mehr aktuell sind"
},
"emoteMenu": {
"name": "Emote-Menü",
"note": "Twitch- und favorisierte Emotes im Emote-Menü anzeigen"
},
"hideEmojiMenu": {
"name": "Emoji-Menü verstecken",
"note": "Versteckt Discords Emoji-Menü bei der Nutzung des Emote-Menüs"
},
"autoCaps": {
"name": "Automatische Großschreibung von Emotes",
"note": "Emote-Befehle werden automatisch großgeschrieben"
},
"modifiers": {
"name": "Emote-Modifikatoren anzeigen",
"note": "Aktiviert Emote-Modifikatoren (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Beim Hovern animieren",
"note": "Animiert Emote-Modifikatoren nur beim Hovern über dem Emote"
}
},
"categories": {
"name": "Kategorien",
"twitchglobal": {
"name": "Twitch Global",
"note": "Twitch-Global-Emotes anzeigen"
},
"twitchsubscriber": {
"name": "Twitch Subscribers",
"note": "Twitch-Subscriber-Emotes anzeigen"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "FFZ-Emotes anzeigen"
},
"bttv": {
"name": "BetterTTV",
"note": "BTTV-Emotes anzeigen"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Editor-Einstellungen",
"editorTitle": "Custom-CSS-Editor"
},
"Emotes": {
"loading": "Lade alle Emotes im Hintergrund.",
"loaded": "Alle Emotes erfolgreich geladen.",
"clearEmotes": "Emote-Daten löschen",
"favoriteAction": "Favorisieren!",
"downloadFailed": "Download fehlgeschlagen",
"failureMessage": "BetterDiscord konnte die Emotes nicht herunterladen, bitte überprüfe deine Internetverbindung und Firewall."
},
"Modals": {
"confirmAction": "Bist du dir sicher?",
"okay": "Okay",

View File

@ -10,10 +10,6 @@
"name": "Ρυθμίσεις",
"general": {
"name": "Γενικά",
"emotes": {
"name": "Σύστημα Συναισθημάτων",
"note": "Ενεργοποίηση συστήματος συναισθημάτων BD"
},
"voiceDisconnect": {
"name": "Αποσύνδεση Φωνής",
"note": "Αποσύνδεση από τον διακομιστή φωνής με το κλείσιμο του Discord"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Συναισθήματα",
"general": {
"name": "Γενικά",
"download": {
"name": "Λήψη Συναισθημάτων",
"note": "Λήψη συναισθημάτων όταν είναι παλαιά"
},
"emoteMenu": {
"name": "Μενού Συναισθημάτων",
"note": "Εμφάνιση συναισθημάτων Αγαπημένων / Twitch στο μενού συναισθημάτων"
},
"hideEmojiMenu": {
"name": "Απόκρυψη Μενού Εικονιδίων Emoji",
"note": "Αποκρύπτει το μενού των εικονιδίων του Discord όταν γίνεται χρήση του μενού συναισθημάτων"
},
"autoCaps": {
"name": "Αυτοκεφαλαιοποίηση Συναισθημάτων",
"note": "Αυτόματη κεφαλαιοποίηση εντολών συναισθημάτων"
},
"modifiers": {
"name": "Εμφάνιση Τροποποιητών Συναισθημάτων",
"note": "Ενεργοποιεί τους τροποποιητές συναισθημάτων (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Κίνηση με την Κϊνηση του Ποντικιού",
"note": "Οι τροποποιητές συναισθημάτων κινούνται μόνο με την κίνηση του ποντικιού"
}
},
"categories": {
"name": "Κατηγορίες",
"twitchglobal": {
"name": "Καθολικά Twitch",
"note": "Εμφάνιση καθολικών συναισθημάτων Twitch"
},
"twitchsubscriber": {
"name": "Συνδρομητές Twitch",
"note": "Εμφάνιση συναισθημάτων συνδρομητή Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Εμφάνιση συναισθημάτων από FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Εμφάνιση συναισθημάτων από BTTV"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "Ρυθμίσεις Επεξεργαστή",
"editorTitle": "Επεξεργαστής Προσαρμοσμένου CSS"
},
"Emotes": {
"loading": "Η φόρτωση συναισθημάτων στο υπόβαθρο δεν επαναφορτώνουν.",
"loaded": "Όλα τα συναισθήματα φόρτωσαν επιτυχώς.",
"clearEmotes": "Εκκαθάριση Δεδομένων Συναισθημάτων",
"favoriteAction": "Αγαπημένο!",
"downloadFailed": "Η λήψη απέτυχε",
"failureMessage": "Το BetterDiscord απέτυχε να λάβει συναισθήματα, ελέγξτε τη σύνδεσή σας και το τείχος προστασίας."
},
"Modals": {
"confirmAction": "Σίγουρα;",
"okay": "Εντάξει",
@ -274,7 +213,7 @@
},
"ReactDevTools": {
"notFound": "Η Επέκταση Δεν Βρέθηκε",
"notFoundDetails": "Αδύνατη η εύρεση της επέκτασης Εργαλείων Δημιουργού React στον υπολογιστή σας. Εγκαταστήστε την επέκταση στην τοπική εγκατάσταση του Chrome."
"notFoundDetails": "Αδύνατη η εύρεση της επέκτασης Εργαλείων Δημιουργού React στον υπολογιστή σας. Εγκαταστήστε την επέκταση στην <EFBFBD><EFBFBD>οπική εγκατάσταση του Chrome."
},
"Sorting": {
"sortBy": "Ταξινόμηση κατά",

View File

@ -10,10 +10,6 @@
"name": "Settings",
"general": {
"name": "General",
"emotes": {
"name": "Emote System",
"note": "Enables BD's emote system"
},
"voiceDisconnect": {
"name": "Voice Disconnect",
"note": "Disconnect from voice server when closing Discord"
@ -25,6 +21,10 @@
"mediaKeys": {
"name": "Disable Media Keys",
"note": "Prevents Discord from hijacking your media keys after playing a video."
},
"bdContextMenu": {
"name": "Settings Context Menu",
"note": "Adds a BetterDiscord subsection to the settings context menu."
}
},
"window": {
@ -144,55 +144,6 @@
}
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "General",
"download": {
"name": "Download Emotes",
"note": "Download emotes whenever they are out of date"
},
"emoteMenu": {
"name": "Emote Menu",
"note": "Show Twitch/Favourite emotes in emote menu"
},
"hideEmojiMenu": {
"name": "Hide Emoji Menu",
"note": "Hides Discord's emoji menu when using emote menu"
},
"autoCaps": {
"name": "Emote Autocapitalization",
"note": "Autocapitalize emote commands"
},
"modifiers": {
"name": "Show Emote Modifiers",
"note": "Enable emote mods (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animate On Hover",
"note": "Only animate the emote modifiers on hover"
}
},
"categories": {
"name": "Categories",
"twitchglobal": {
"name": "Twitch Globals",
"note": "Show Twitch global emotes"
},
"twitchsubscriber": {
"name": "Twitch Subscribers",
"note": "Show Twitch subscriber emotes"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Show emotes from FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Show emotes from BTTV"
}
}
}
},
"Addons": {
@ -211,7 +162,14 @@
"version": "Version",
"added": "Date Added",
"modified": "Date Modified",
"isEnabled": "Enabled",
"listView": "List View",
"gridView": "Grid View",
"enableAll": "Enable All",
"disableAll": "Disable All",
"enableAllWarning": "Enabling all {{type}} can cause temporary lag and unexpected errors.\n\n(Hold shift while clicking to skip this prompt!)",
"search": "Search {{type}}",
"results": "{{count}} Results",
"editAddon": "Edit",
"deleteAddon": "Delete",
"confirmDelete": "Are you sure you want to delete {{name}}?",
@ -235,7 +193,6 @@
"wasUnloaded": "{{name}} was unloaded.",
"blankSlateHeader": "You don't have any {{type}}s!",
"blankSlateMessage": "Grab some from [this website]({{link}}) and add them to your {{type}} folder.",
"isEnabled": "Enabled",
"wasLoaded": "{{name}} v{{version}} was loaded."
},
"CustomCSS": {
@ -247,14 +204,6 @@
"settings": "Editor Settings",
"editorTitle": "Custom CSS Editor"
},
"Emotes": {
"loading": "Loading emotes in the background do not reload.",
"loaded": "All emotes successfully loaded.",
"clearEmotes": "Clear Emote Data",
"favoriteAction": "Favorite!",
"downloadFailed": "Download Failed",
"failureMessage": "BetterDiscord failed to download emotes, please check your internet connection and firewall."
},
"Modals": {
"confirmAction": "Are You Sure?",
"okay": "Okay",
@ -270,7 +219,9 @@
"restartNow": "Restart Now",
"restartLater": "Restart Later",
"additionalInfo": "Additional Info",
"restartPrompt": "In order to take effect, Discord needs to be restarted. Do you want to restart now?"
"restartPrompt": "In order to take effect, Discord needs to be restarted. Do you want to restart now?",
"changelog": "Changelog",
"debuglog": "Your debug log file has exceeded 100MB, would you like to clear the log?"
},
"ReactDevTools": {
"notFound": "Extension Not Found",
@ -304,5 +255,14 @@
"versionAvailable": "Version {{version}} now available!",
"upToDateBlankslate": "All of your {{type}} seem to be up to date!",
"updateButton": "Update!"
},
"Settings": {
"customColor": "Custom Color",
"resetSettings": "Reset Settings",
"resetSettingsWarning": "Resetting your settings returns them all to the original state, this cannot be undone."
},
"Socials": {
"twitter": "Follow Us!",
"github": "Star Us!"
}
}

189
assets/locales/es-419.json Normal file
View File

@ -0,0 +1,189 @@
{
"Panels": {
"plugins": "Plugins",
"themes": "Temas",
"customcss": "CSS Personalizado"
},
"Collections": {
"settings": {
"name": "Ajustes",
"general": {
"name": "General",
"voiceDisconnect": {
"name": "Desconexión de Voz",
"note": "Desconectarse del servidor de voz al cerrar Discord"
},
"showToasts": {
"name": "Mostrar Notificaciones",
"note": "Muestra una pequeña notificación de información importante"
},
"mediaKeys": {
"name": "Desactivar las Teclas Multimedia",
"note": "Evita que Discord se apropie de tus teclas multimedia después de reproducir un vídeo"
}
},
"window": {
"removeMinimumSize": {
"name": "Eliminar Tamaño Mínimo",
"note": "Elimina el tamaño mínimo de Discord de 940x500"
},
"name": "Preferencias de la Ventana",
"transparency": {
"name": "Activar Transparencia",
"note": "Hace que la ventana principal pueda ser transparente (requiere reinicio)"
},
"frame": {
"name": "Marco de la Ventana",
"note": "Añade el marco de ventana nativo de tu sistema operativo a la ventana principal"
}
},
"addons": {
"name": "Gestor de Complementos",
"addonErrors": {
"name": "Mostrar Errores de Complementos",
"note": "Muestra una ventana con los errores de plugin/temas"
},
"editAction": {
"name": "Acción al Editar",
"note": "Donde aparecerán los plugins y temas al editarlos",
"options": {
"detached": "Ventana Independiente",
"system": "Editor del Sistema"
}
}
},
"customcss": {
"name": "CSS Personalizado",
"customcss": {
"name": "CSS Personalizado",
"note": "Activa la pestaña de CSS Personalizado"
},
"liveUpdate": {
"name": "Actualización en Vivo",
"note": "Actualiza el CSS a medida que se escribe"
},
"startDetached": {
"name": "Comenzar en Ventana Independiente",
"note": "Al hacer clic en la pestaña de CSS Personalizado se abre el editor en una ventana independiente"
},
"nativeOpen": {
"name": "Abrir en Editor Nativo",
"note": "Al hacer clic en la pestaña de CSS Personalizado se abre el editor en tu editor nativo"
},
"openAction": {
"name": "Ubicación del Editor",
"note": "Donde deberá el CSS Personalizado abrirse por defecto",
"options": {
"settings": "Menú de Ajustes",
"detached": "Ventana Independiente",
"system": "Editor del Sistema"
}
}
},
"developer": {
"name": "Ajustes de Desarrollador",
"debuggerHotkey": {
"name": "Tecla de Acceso Rápido al Depurador",
"note": "Permite activar el depurador al presionar la tecla F8"
},
"reactDevTools": {
"name": "React Developer Tools",
"note": "Inyecta tu instalación local de React Developer Tools en Discord"
},
"inspectElement": {
"name": "Tecla de Acceso Rápido al Inspector de Elementos",
"note": "Activa la tecla de acceso rápido al inspector de elementos (ctrl + shift + c) que es común en la mayoria de navegadores"
},
"devToolsWarning": {
"name": "Quitar el Aviso del Inspector de Elementos",
"note": "Previene que Discord muestre su mensaje \"¡Espera!\""
},
"debugLogs": {
"name": "Registros de Depuración",
"note": "Envía todo lo que aparece en la consola a un archivo llamado debug.log en la carpeta de BetterDiscord"
}
}
}
},
"Addons": {
"title": "{{name}} v{{version}} por {{author}}",
"byline": "por {{author}}",
"openFolder": "Abrir Carpeta de {{type}}",
"reload": "Recargar",
"addonSettings": "Ajustes",
"website": "Sitio web",
"source": "Fuente",
"invite": "Servidor de Soporte",
"donate": "Donar",
"patreon": "Patreon",
"name": "Nombre",
"author": "Autor",
"version": "Versión",
"added": "Fecha de Adición",
"modified": "Fecha de Modificación",
"search": "Buscar {{type}}",
"editAddon": "Editar",
"deleteAddon": "Eliminar",
"confirmDelete": "¿Estás seguro de que quieres borrar {{name}}?",
"confirmationText": "Tiene cambios no guardados en {{name}}. Al cerrar esta ventana se perderán todos los cambios.",
"enabled": "{{name}} ha sido activado.",
"disabled": "{{name}} ha sido desactivado.",
"couldNotEnable": "{{name}} no pudo ser activado.",
"couldNotDisable": "{{name}} no pudo ser desactivado.",
"couldNotStart": "{{name}} no se pudo iniciar.",
"couldNotStop": "{{name}} no se pudo detener.",
"settingsError": "No se pudieron abrir los ajustes de {{name}}",
"methodError": "{{method}} no pudo ser lanzado.",
"unknownAuthor": "Autor Desconocido",
"noDescription": "Descripción no proporcionada.",
"alreadyExists": "Ya existe un {{type}} con nombre {{name}}",
"alreadWatching": "Ya está viendo los complementos.",
"metaError": "El META no pudo ser analizado.",
"missingNameData": "El META no contiene datos del nombre.",
"metaNotFound": "El META no ha sido encontrado.",
"compileError": "No se ha podido compilar.",
"wasUnloaded": "{{name}} ha sido descargado.",
"blankSlateHeader": "¡No tienes {{type}}s!",
"blankSlateMessage": "Consigue alguno en [esta página web]({{link}}) y añadelos a tu carpeta de {{type}}."
},
"CustomCSS": {
"confirmationText": "Tienes cambios sin guardar en tu CSS Personalizado. Al cerrar esta ventana se perderán todos los cambios.",
"update": "Actualizar",
"save": "Guardar",
"openNative": "Abrir en el Editor del Sistema",
"openDetached": "Mostrar en Ventana Independiente",
"settings": "Ajustes del Editor",
"editorTitle": "Editor de CSS Personalizado"
},
"Modals": {
"confirmAction": "¿Estás seguro?",
"okay": "Vale",
"done": "Hecho",
"cancel": "Cancelar",
"nevermind": "No importa",
"close": "Cerrar",
"name": "Nombre",
"message": "Mensaje",
"error": "Error",
"addonErrors": "Errores de Complementos",
"restartRequired": "Reinicio Requerido",
"restartNow": "Reiniciar Ahora",
"restartLater": "Reiniciar más Tarde",
"additionalInfo": "Información Adicional",
"restartPrompt": "Para que surta efecto, es necesario reiniciar Discord. ¿Quieres reiniciar ahora?"
},
"ReactDevTools": {
"notFound": "Extensión no Encontrada",
"notFoundDetails": "No se puede encontrar la extensión React Developer Tools en su PC. Por favor, instale la extensión en su instalación local de Chrome."
},
"Sorting": {
"sortBy": "Ordenar por",
"order": "Orden",
"ascending": "Ascendente",
"descending": "Descendente"
},
"WindowPrefs": {
"enabledInfo": "Esta opción requiere un tema transparente para que funcione correctamente. En Windows esto podría hacer que el ajuste automático de la ventana (Aero Snap) y la maximización dejen de funcionar.\n\nPara que surta efecto, es necesario reiniciar Discord. ¿Quieres reiniciar ahora?",
"disabledInfo": "Para que surta efecto, es necesario reiniciar Discord. ¿Quieres reiniciar ahora?"
}
}

View File

@ -9,10 +9,6 @@
"name": "Ajustes",
"general": {
"name": "General",
"emotes": {
"name": "Sistema de Emoticonos",
"note": "Activa el sistema de emoticonos de BD"
},
"voiceDisconnect": {
"name": "Desconexión de Voz",
"note": "Desconectarse del servidor de voz al cerrar Discord"
@ -107,55 +103,6 @@
"note": "Envía todo lo que aparece en la consola a un archivo llamado debug.log en la carpeta de BetterDiscord"
}
}
},
"emotes": {
"name": "Emoticonos",
"general": {
"name": "General",
"download": {
"name": "Descargar Emoticonos",
"note": "Descargar los emoticonos siempre que estén desactualizados"
},
"emoteMenu": {
"name": "Menú de Emoticonos",
"note": "Mostrar los emoticonos de Twitch y favoritos en el menú de emoticonos"
},
"hideEmojiMenu": {
"name": "Ocultar Menú de Emoticonos",
"note": "Oculta el menú de emojis de Discord cuando se utiliza el menú de emoticonos"
},
"autoCaps": {
"name": "Autocapitalización de Emoticonos",
"note": "Autocapitalizar los comandos de emoticonos"
},
"modifiers": {
"name": "Mostrar Modificadores de Emoticonos",
"note": "Activar los modificadores de emoticonos (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animar al Pasar el Ratón",
"note": "Solo animar los modificadores de emoticonos al pasar el ratón por encima de ellos"
}
},
"categories": {
"name": "Categorías",
"twitchglobal": {
"name": "Globales de Twitch",
"note": "Mostrar los emoticonos globales de Twitch"
},
"twitchsubscriber": {
"name": "Suscriptores de Twitch",
"note": "Mostrar emoticonos de suscriptores de Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Mostrar los emoticonos de FrankerFaceZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Mostrar los emoticonos de BetterTTV"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Ajustes del Editor",
"editorTitle": "Editor de CSS Personalizado"
},
"Emotes": {
"loading": "Cargando emoticonos en segundo plano, no recargues.",
"loaded": "Todos los emoticonos han sido cargados satisfactoriamente.",
"clearEmotes": "Borrar los Datos de los Emoticonos",
"favoriteAction": "¡Favoritos!",
"downloadFailed": "Descarga Fallida",
"failureMessage": "BetterDiscord no ha podido descargar los emoticonos, por favor, comprueba tu conexión a internet y tu cortafuegos."
},
"Modals": {
"confirmAction": "¿Estás seguro?",
"okay": "Vale",

View File

@ -10,10 +10,6 @@
"name": "Asetukset",
"general": {
"name": "Yleinen",
"emotes": {
"name": "Hymiö-järjestelmä",
"note": "Ottaa käyttöön BD:n hymiö-järjestelmän."
},
"voiceDisconnect": {
"name": "Katkaise puhelu",
"note": "Katkaise puhelu, kun suljet Discordin"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Hymiöt",
"general": {
"name": "Yleinen",
"download": {
"name": "Lataa hymiöitä",
"note": "Lataa hymiöit aina, kun ne ovat vanhentuneita"
},
"emoteMenu": {
"name": "Hymiövalikko",
"note": "Näytä Twitch/Suosikkihymiöt hymiövalikossa"
},
"hideEmojiMenu": {
"name": "Piilota hymiövalikko",
"note": "Piilottaa Discordin emoji-menun, kun käytetään hymiövalikkoa"
},
"autoCaps": {
"name": "Emoten automaattinen isojen kirjainten käyttö",
"note": "Laita isolla kirjaimella hymiökomennot automaattisesti"
},
"modifiers": {
"name": "Näytä hymiö-muokkaimet",
"note": "Ota käyttöön hymiömodit (käännä, spin, pulssi, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animoi leijuminen",
"note": "Animoi vain hymiön muokkaukset viemällä kursori sen kohdalle"
}
},
"categories": {
"name": "Kategoriat",
"twitchglobal": {
"name": "Twitchin Yleiset",
"note": "Näytä Twitchin yleiset hymiöt"
},
"twitchsubscriber": {
"name": "Twitch-tilaajat",
"note": "Näytä Twitch-tilauksen hymiöt"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Näytä hymiöt FFZ:sta"
},
"bttv": {
"name": "BetterTTV",
"note": "Näytä hymiöt BTTV:stä"
}
}
}
},
"Addons": {
@ -245,14 +192,6 @@
"settings": "Muokkaajan asetukset",
"editorTitle": "Mukautettu CSS-muokkaaja"
},
"Emotes": {
"loading": "Hymiöiden lataaminen taustalla ei lataudu uudelleen.",
"loaded": "Kaikki hymiöt on ladattu onnistuneesti.",
"clearEmotes": "Tyhjennä hymiö-tiedot",
"favoriteAction": "Suosikki!",
"downloadFailed": "Lataus epäonnistui",
"failureMessage": "BetterDiscord ei pystynyt lataamaan hymiöitä. Tarkista Internet-yhteytesi ja palomuurisi."
},
"Modals": {
"confirmAction": "Oletko varma?",
"okay": "Okei",

View File

@ -9,10 +9,6 @@
"name": "Réglages",
"general": {
"name": "Général",
"emotes": {
"name": "Système D'émojis",
"note": "Active le système d'émojis de BD"
},
"voiceDisconnect": {
"name": "Déconnexion vocale",
"note": "Déconnexion du serveur vocal lors de la fermeture de Discord"
@ -107,55 +103,6 @@
"note": "Transmet tout ce qui se trouve dans la console au fichier debug.log situé dans le dossier de BetterDiscord"
}
}
},
"emotes": {
"name": "Emoticônes",
"general": {
"name": "Général",
"download": {
"name": "Télécharger les Émojis",
"note": "Télécharger les émojis quand ils ne sont plus à jour"
},
"emoteMenu": {
"name": "Menu Émojis",
"note": "Afficher les Émojis Favoris/de Twitch dans le menu des émojis"
},
"hideEmojiMenu": {
"name": "Masquer le Menu d'Émojis",
"note": "Masquer le menu des émojis de Discord quand le menu des émojis est utilisé"
},
"autoCaps": {
"name": "Autocapitalisation des émojis",
"note": "Met en majuscule automatiquement les commandes émojis"
},
"modifiers": {
"name": "Afficher le Modificateur d'Emojis",
"note": "Activer les mods d'émojis (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animation Au Survol",
"note": "Uniquement animer les modificateurs d'émojis au survol"
}
},
"categories": {
"name": "Catégories",
"twitchglobal": {
"name": "Twitch Globaux",
"note": "Afficher les émojis globaux de Twitch"
},
"twitchsubscriber": {
"name": "Abonnés Twitch",
"note": "Afficher les émojis des abonnés Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Afficher les émojis de FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Afficher les émojis de BTTV"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Réglages de l'Éditeur",
"editorTitle": "Éditeur CSS Personnalisé"
},
"Emotes": {
"loading": "Le chargement des emotes en arrière-plan ne se recharge pas.",
"loaded": "Tous les émojis sont chargés avec succès.",
"clearEmotes": "Éffacer les Données des Émojis",
"favoriteAction": "Ajouté aux favoris!",
"downloadFailed": "Échec Téléchargement",
"failureMessage": "BetterDiscord n'a pas réussi à télécharger les émotes, veuillez vérifier votre connexion Internet et votre pare-feu."
},
"Modals": {
"confirmAction": "Êtes-vous sûr?",
"okay": "D'accord",

View File

@ -9,10 +9,6 @@
"name": "समायोजन",
"general": {
"name": "आम",
"emotes": {
"name": "भावना प्रणाली",
"note": "BD के इमोशन सिस्टम को सक्षम करता है"
},
"voiceDisconnect": {
"name": "आवाज डिस्कनेक्ट",
"note": "डिसॉर्डर को बंद करते समय वॉयस सर्वर से डिस्कनेक्ट करें"

View File

@ -10,10 +10,6 @@
"name": "Beállítások",
"general": {
"name": "Általános",
"emotes": {
"name": "Emotikon rendszer",
"note": "BD emotikon rendszer engedélyezése"
},
"voiceDisconnect": {
"name": "Hangkapcsolat megszakítása",
"note": "Kapcsolat megszakítása a hangkiszolgálóval amikor bezárod a Discordot"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Emotikonok",
"general": {
"name": "Általános",
"download": {
"name": "Emotikonok letöltése",
"note": "Emotikonok letöltése, ha elavultak"
},
"emoteMenu": {
"name": "Emotikon menü",
"note": "Twitch/kedvenc emotikonok megjelenítése az emotikonok menüjében"
},
"hideEmojiMenu": {
"name": "Emotikon menü elrejtése",
"note": "Elrejti a Discord emotikon menüjét az emotikon menü használatakor"
},
"autoCaps": {
"name": "Emotikon autokapitalizáció",
"note": "Emotikon-parancsok automatikus nagybetűsítése"
},
"modifiers": {
"name": "Emotikon módosítások megjelenítése",
"note": "Emotikon módosítások engedélyezése (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animáció lebegtetéskor",
"note": "Csak lebegéskor animálja az emotikon módosításokat"
}
},
"categories": {
"name": "Kategóriák",
"twitchglobal": {
"name": "Twitch globális",
"note": "Globális Twitch emotikonok megjelenítése"
},
"twitchsubscriber": {
"name": "Twitch előfizetők",
"note": "Twitch előfizetői emotikonok megjelenítése"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Emotikonok megjelenítése az FFZ-ből"
},
"bttv": {
"name": "BetterTTV",
"note": "Emotikonok megjelenítése a BTTV-ből"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "Szerkesztő beállítások",
"editorTitle": "Egyéni CSS szerkesztő"
},
"Emotes": {
"loading": "Az emotikonok betöltése a háttérben.",
"loaded": "Minden emotikon sikeresen betöltött.",
"clearEmotes": "Emotikon adatok törlése",
"favoriteAction": "Kedvenc!",
"downloadFailed": "Letöltés sikertelen",
"failureMessage": "A BetterDiscord nem tudta letölteni az emotikonokat, kérjük ellenőrizze az internetkapcsolatát és a tűzfalat."
},
"Modals": {
"confirmAction": "Biztos vagy benne?",
"okay": "Oké",

View File

@ -21,6 +21,7 @@ module.exports = {
"ru": require("./ru.json"), // Russian
"sk": require("./sk.json"), // Slovak
"es-ES": require("./es-es.json"), // Spanish (Spain)
"es-419": require("./es-419.json"), // Spanish (LATAM)
"sv-SE": require("./sv-se.json"), // Swedish
"tr": require("./tr.json"), // Turkish
"bg": require("./bg.json"), // Bulgarian

View File

@ -1,130 +1,138 @@
{
"Panels": {
"plugins": "Plug-ins",
"plugins": "Plugins",
"themes": "Temi",
"customcss": "CSS Personalizzato"
"customcss": "CSS Personalizzato",
"updates": "Aggiornamenti"
},
"Collections": {
"settings": {
"name": "Impostazioni",
"general": {
"name": "Generale",
"emotes": {
"name": "Sistema di Emotes",
"note": "Abilita il sistema di Emotes di BD"
},
"voiceDisconnect": {
"name": "Esci dalla chat vocale",
"note": "Esci automaticamente dalla chat vocale quando chiudi Discord"
"name": "Disconnessione vocale",
"note": "Disconnettiti dalla chat vocale alla chiusura di Discord."
},
"showToasts": {
"name": "Mostra Notifiche",
"note": "Mostra delle piccole notifiche per le informazioni importanti"
"name": "Mostra notifiche",
"note": "Mostra una piccola notifica per le informazioni importanti."
},
"mediaKeys": {
"name": "Disabilita i tasti multimediali",
"note": "Impedisce a Discord di prendere il controllo dei tasti multimediali dopo la riproduzione di un video."
"name": "Disattiva i tasti multimediali",
"note": "Impedisce a Discord di comandare i tasti multimediali dopo la riproduzione di un video."
}
},
"window": {
"removeMinimumSize": {
"name": "Rimuovi la grandezza minima",
"note": "Rimuove la grandezza minima forzata di 940x500 di Discord"
"name": "Rimuovi dimensione minima",
"note": "Rimuove la dimensione minima forzata della finestra di Discord di 940x500."
},
"name": "Preferenze finestra",
"name": "Preferenze Finestra",
"transparency": {
"name": "Abilita trasparenza"
"name": "Attiva trasparenza",
"note": "Consente alla finestra principale di essere trasparente (richiede il riavvio)."
},
"frame": {
"name": "Frame finestra",
"note": "Aggiunge il frame della finestra del sistema operativo nativo alla finestra principale."
}
},
"addons": {
"name": "Gestore degli Add-ons",
"name": "Gestione Addons",
"addonErrors": {
"name": "Mostra gli errori degli Add-ons",
"note": "Mostra un modale con errori dei plug-ins e temi"
"name": "Mostra errori addons",
"note": "Mostra una modale con errori dei plugins/temi."
},
"editAction": {
"name": "Modifica Azione",
"note": "Dove appaiono plugins e temi durante le modifiche",
"name": "Azione di modifica",
"note": "Seleziona dove vengono mostrati plugins e temi durante la modifica.",
"options": {
"detached": "Finestra distaccata",
"detached": "Finestra separata",
"system": "Editor di sistema"
}
}
},
"customcss": {
"name": "CSS personalizzato",
"name": "CSS Personalizzato",
"customcss": {
"name": "CSS personalizzato",
"note": "Abilita la scheda per il CSS personalizzato"
"name": "CSS Personalizzato",
"note": "Attiva la scheda di CSS personalizzato."
},
"liveUpdate": {
"name": "Aggiornamento automatico",
"note": "Aggiorna l'aspetto della finestra mentre modifichi il codice CSS"
"note": "Aggiorna il CSS durante la modifica."
},
"startDetached": {
"name": "Apri in una finestra separata",
"note": "Cliccare la scheda per il CSS personalizzato apre l'editor in una finestra separata"
"name": "Finestra separata",
"note": "Cliccando sulla scheda CSS personalizzato si apre l'editor in una finestra separata."
},
"nativeOpen": {
"name": "Apri nell'editor nativo",
"note": "Cliccare la scheda di CSS personalizzato apre il CSS nel tuo editor nativo"
"name": "Editor nativo",
"note": "Cliccando sulla scheda CSS personalizzato si apre il CSS personalizzato nell'editor nativo."
},
"openAction": {
"name": "Posizione dell'editor",
"note": "Dove verrà aperta di default la finestra per il CSS personalizzato",
"note": "Seleziona dove il CSS personalizzato dovrebbe aprirsi per impostazione predefinita.",
"options": {
"settings": "Menu Impostazioni",
"settings": "Menu impostazioni",
"detached": "Finestra separata",
"system": "Editor predefinito"
"system": "Editor di sistema"
}
}
},
"developer": {
"name": "Impostazioni sviluppatore",
"name": "Impostazioni Sviluppatore",
"debuggerHotkey": {
"name": "Scorciatoia debugger",
"note": "Permette di attivare il debugger quando viene premuto F8 con DevTools aperto"
"name": "Debugger Hotkey",
"note": "Consente di attivare il debugger quando si preme F8 con DevTools aperto."
},
"reactDevTools": {
"name": "React Developer Tools",
"note": "Inietta la tua installazione locale di React Developer Tools all'interno di Discord"
"note": "Inietta la tua installazione locale di React Developer Tools in Discord."
},
"inspectElement": {
"name": "Scorciatoia Ispeziona Elemento",
"note": "Abilita la scorciatoia Ispeziona Elemento (ctrl + shift + c) che è comune nella maggioranza dei browser"
"name": "Inspect Element Hotkey",
"note": "Consente di attivare il tasto ispeziona elemento (CTRL+SHIFT+C) comune nella maggior parte dei browser."
},
"devToolsWarning": {
"name": "Ferma i warning DevTools",
"note": "Impedisci a Discord di mostrare il suo messaggio \"Attenzione!\""
"name": "Stop DevTools Warning",
"note": "Impedisce a Discord di stampare il messaggio \"Hold Up!\"."
},
"debugLogs": {
"name": "Log di debug",
"note": "Manda tutto l'output della console all'interno del file debug.log nella cartella BetterDiscord"
"name": "Debug Logs",
"note": "Consente che tutto l'output della console venga salvato nel file debug.log nella cartella BetterDiscord."
},
"devTools": {
"name": "DevTools",
"note": "Abilita l'attivazione del DevTools tramite ctrl+shift+i"
"note": "Consente la commutazione di DevTools con CTRL+SHIFT+I."
}
},
"editor": {
"name": "Preferenze Editor",
"name": "Preferenze dell'Editor",
"lineNumbers": {
"name": "Numeri di riga",
"note": "Abilita la visualizzazione dei numeri delle righe al lato dell'editor"
"note": "Consente di mostrare i numeri di riga sul lato dell'editor."
},
"fontSize": {
"name": "Dimensione font",
"note": "Dimensione del font (pt) da usare nell'editor"
"name": "Dimensione carattere",
"note": "Dimensione del carattere (pt) da utilizzare nell'editor."
},
"minimap": {
"name": "Mini mappa",
"note": "Abilita la visualizzazione di una mini mappa del codice al lato dell'editor"
"name": "Minimappa",
"note": "Consente di mostrare la minimappa del codice sul lato dell'editor."
},
"hover": {
"name": "Suggerimenti di riferimento",
"note": "Consente di mostrare i suggerimenti di riferimento quando si passa con il mouse su regole e selettori."
},
"quickSuggestions": {
"name": "Consigli veloci"
"name": "Suggerimenti rapidi",
"note": "Consente di mostrare i suggerimenti di completamento automatico durante la digitazione."
},
"renderWhitespace": {
"name": "Mostra caratteri whitespace",
"name": "Mostra spazi bianchi",
"note": "Seleziona quando gli spazi bianchi dovrebbero essere mostrati dall'editor.",
"options": {
"all": "Sempre",
"none": "Mai",
@ -132,25 +140,6 @@
}
}
}
},
"emotes": {
"name": "Emote",
"general": {
"name": "Generale",
"download": {
"name": "Scarica Emote",
"note": "Scarica Emote ogni volta che viene trovata una nuova versione"
},
"emoteMenu": {
"name": "Menu Emote"
}
},
"categories": {
"name": "Categorie",
"twitchsubscriber": {
"name": "Iscritti Twitch"
}
}
}
},
"Addons": {
@ -159,9 +148,9 @@
"openFolder": "Apri cartella {{type}}",
"reload": "Ricarica",
"addonSettings": "Impostazioni",
"website": "Sito Web",
"source": "Fonte",
"invite": "Supporta il server",
"website": "Website",
"source": "Sorgente",
"invite": "Discord",
"donate": "Dona",
"patreon": "Patreon",
"name": "Nome",
@ -172,49 +161,44 @@
"search": "Cerca {{type}}",
"editAddon": "Modifica",
"deleteAddon": "Elimina",
"confirmDelete": "Sei sicuro di voler cancellare {{name}}?",
"confirmationText": "Hai delle modifiche non salvate su {{name}}. Chiudendo questa finestra perderai quelle modifiche.",
"enabled": "{{name}} è stato abilitato.",
"disabled": "{{name}} è stato disabilitato.",
"couldNotEnable": "Non è stato possibile abilitare {{name}}.",
"couldNotDisable": "Non è stato possibile disabilitare {{name}}.",
"couldNotStart": "Non è stato possibile far partire {{name}}.",
"couldNotStop": "Non è stato possibile fermare {{name}}.",
"settingsError": "Non è stato possibile aprire le impostazioni per {{name}}",
"methodError": "Non è stato possibile lanciare {{method}}.",
"confirmDelete": "Sei sicuro di voler eliminare {{name}}?",
"confirmationText": "Hai modifiche non salvate a {{name}}. Chiudendo questa finestra tutte le modifiche andranno perse.",
"enabled": "{{name}} è stato attivato.",
"disabled": "{{name}} è stato disattivato.",
"couldNotEnable": "{{name}} non può essere attivato.",
"couldNotDisable": "{{name}} non può essere disattivato.",
"couldNotStart": "{{name}} non può essere avviato.",
"couldNotStop": "{{name}} non può essere arrestato.",
"settingsError": "Impossibile aprire le impostazioni per {{name}}",
"methodError": "{{method}} non può essere restituito.",
"unknownAuthor": "Autore sconosciuto",
"noDescription": "Nessuna descrizione.",
"alreadyExists": "Esiste già un {{type}} con nome {{name}}",
"alreadWatching": "Stai già vedendo gli addon.",
"metaError": "Non è stato possibile analizzare META.",
"missingNameData": "Nome dato mancante META.",
"metaNotFound": "META non trovato.",
"compileError": "Non è stato possibile compilare. Vedi la console per i dettagli.",
"wasUnloaded": "{{name}} è stato scaricato.",
"blankSlateHeader": "Non hai nessun {{type}}!",
"blankSlateMessage": "Scaricali [dal sito]({{link}}) e aggiungili alla cartella {{type}}.",
"isEnabled": "Abilitato"
"noDescription": "Descrizione non fornita.",
"alreadyExists": "C'è già un {{type}} chiamato {{name}}",
"alreadWatching": "Stai già vedendo gli addons.",
"metaError": "META non può essere analizzato.",
"missingNameData": "Dati del nome META mancanti.",
"metaNotFound": "META non è stato trovato.",
"compileError": "Impossibile compilare. Vedi la console per i dettagli.",
"wasUnloaded": "{{name}} è stato disattivato.",
"blankSlateHeader": "Non hai nessun {{type}}s!",
"blankSlateMessage": "Prendine alcuni da [questo sito web]({{link}}) e aggiungili alla tua cartella {{type}}.",
"isEnabled": "Attivato",
"wasLoaded": "{{name}} v{{version}} è stato caricato.",
"listView": "Vista a elenco",
"gridView": "Vista a griglia"
},
"CustomCSS": {
"confirmationText": "Hai delle modifiche non salvate sul tuo CSS Personalizzato. Chiudendo questa finestra perderai tutte quelle modifiche.",
"confirmationText": "Hai modifiche non salvate al tuo CSS personalizzato. Chiudendo questa finestra tutte le modifiche andranno perse.",
"update": "Aggiorna",
"save": "Salva",
"openNative": "Apri nell'editor predefinito",
"openDetached": "Apri in una finestra separata",
"settings": "Impostazioni editor",
"editorTitle": "Editor per il CSS personalizzato"
},
"Emotes": {
"loading": "Sto caricando le emote in background. Non ricaricare.",
"loaded": "Tutte le emote sono state caricate correttamente.",
"clearEmotes": "Cancella i dati delle Emote",
"favoriteAction": "Preferito!",
"downloadFailed": "Download fallito",
"failureMessage": "BetterDiscord non è riuscito a scaricare le emote, controlla la tua connessione internet e il firerwall."
"openNative": "Editor di sistema",
"openDetached": "Finestra separata",
"settings": "Impostazioni Editor",
"editorTitle": "Editor CSS Personalizzato"
},
"Modals": {
"confirmAction": "Sei sicuro?",
"okay": "Ok",
"okay": "Okay",
"done": "Fatto",
"cancel": "Annulla",
"nevermind": "Non importa",
@ -222,25 +206,44 @@
"name": "Nome",
"message": "Messaggio",
"error": "Errore",
"addonErrors": "Errori Addon",
"addonErrors": "Errori addon",
"restartRequired": "Riavvio richiesto",
"restartNow": "Riavvia ora",
"restartLater": "Riavvia più tardi",
"additionalInfo": "Più informazioni",
"restartPrompt": "Per avere effetto, Discord ha bisogno di essere riavviato. Desideri riavviare ora?"
"additionalInfo": "Informazioni aggiuntive",
"restartPrompt": "Per avere effetto, Discord deve essere riavviato. Vuoi riavviare ora?"
},
"ReactDevTools": {
"notFound": "Estensione non trovata",
"notFoundDetails": "Impossibile trovare l'estensione React Developer Tools sul tuo PC. Per favore installa l'estensione sulla tua installazione locale di Chrome."
"notFoundDetails": "Impossibile trovare l'estensione React Developer Tools sul tuo PC. Installa l'estensione sull'installazione locale di Chrome."
},
"Sorting": {
"sortBy": "Ordina per",
"order": "Ordina",
"order": "Ordine",
"ascending": "Ascendente",
"descending": "Discendente"
},
"WindowPrefs": {
"enabledInfo": "Questa opzione richiede un tema trasparente per funzionare correttamente. Su Windows questo potrebbe rompere l'attacco Aero e l'ingrandimento delle finestre.\n\nPer avere effetto, Discord deve essere riavviato. Vuoi riavviarlo ora?",
"disabledInfo": "Per avere effetto, Discord deve essere riavviato. Vuoi riavviarlo ora?"
"enabledInfo": "Questa opzione richiede un tema trasparente per funzionare correttamente. Su Windows questo potrebbe interrompere l'aero snapping e la massimizzazione.\n\nPer avere effetto, Discord deve essere riavviato. Vuoi riavviare ora?",
"disabledInfo": "Per avere effetto, Discord deve essere riavviato. Vuoi riavviare ora?"
},
"Notices": {
"moreInfo": "Altre Info"
},
"Updater": {
"updateFailed": "Aggiornamento non riuscito!",
"updateFailedMessage": "BetterDiscord non è stato aggiornato. Scarica l'ultima versione del programma di installazione dal nostro sito web (https://betterdiscord.app/) e reinstalla.",
"updateSuccessful": "Aggiornamento riuscito!",
"updateAvailable": "BetterDiscord ha un nuovo aggiornamento (v{{version}})",
"addonUpdatesAvailable": "BetterDiscord ha trovato aggiornamenti per {{count}} dei tuoi {{type}}s!",
"addonUpdated": "{{name}} è stato aggiornato alla versione {{version}}!",
"checking": "Controlla aggiornamenti!",
"finishedChecking": "Controllo degli aggiornamenti finito!",
"checkForUpdates": "Controlla aggiornamenti!",
"updateAll": "Aggiorna tutto!",
"noUpdatesAvailable": "Nessun aggiornamento disponibile.",
"versionAvailable": "La versione {{version}} è ora disponibile!",
"upToDateBlankslate": "Tutti i tuoi {{type}} sembrano essere aggiornati!",
"updateButton": "Aggiorna!"
}
}

View File

@ -10,10 +10,6 @@
"name": "設定",
"general": {
"name": "全般",
"emotes": {
"name": "絵文字機能",
"note": "BetterDiscordの絵文字機能を有効にします。"
},
"voiceDisconnect": {
"name": "ボイスチャンネルの切断",
"note": "Discordを終了すると自動的にボイスチャンネルから切断されます。"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "絵文字",
"general": {
"name": "全般",
"download": {
"name": "絵文字をダウンロード",
"note": "絵文字が古くなった時にいつでもダウンロードできます。"
},
"emoteMenu": {
"name": "絵文字メニュー",
"note": "絵文字メニューにTwitchやお気に入りの絵文字を表示します。"
},
"hideEmojiMenu": {
"name": "絵文字メニューを非表示",
"note": "絵文字メニューを使用する際にDiscord標準の絵文字メニューを非表示にします。"
},
"autoCaps": {
"name": "絵文字の自動変換",
"note": "絵文字入力を自動で大文字化します。"
},
"modifiers": {
"name": "BetterDiscord絵文字を表示",
"note": "BetterDiscordの絵文字を有効化します(flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)。"
},
"animateOnHover": {
"name": "ホバー時の動作",
"note": "ホバー時にアニメ絵文字を動かします。"
}
},
"categories": {
"name": "カテゴリ",
"twitchglobal": {
"name": "Twitchグローバル",
"note": "Twitchのグローバル絵文字を表示する"
},
"twitchsubscriber": {
"name": "Twitchの登録者",
"note": "Twitch登録者の絵文字を表示します。"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "FFZの絵文字を表示します。"
},
"bttv": {
"name": "BetterTTV",
"note": "BTTVの絵文字を表示します。"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "エディター設定",
"editorTitle": "カスタムCSSエディター"
},
"Emotes": {
"loading": "バックグラウンドで絵文字をロードしても、リロードされないようにします。",
"loaded": "すべての絵文字の読み込みに成功しました。",
"clearEmotes": "絵文字データを削除",
"favoriteAction": "お気に入り",
"downloadFailed": "ダウンロードに失敗",
"failureMessage": "BetterDiscordは絵文字のダウンロードに失敗しました。インターネット接続とファイアウォールを確認してください。"
},
"Modals": {
"confirmAction": "本当によろしいですか?",
"okay": "はい",
@ -284,7 +223,7 @@
},
"WindowPrefs": {
"enabledInfo": "このオプションが正しく動作するためには、透明なテーマが必要です。Windows では、エアロスナップと最大化が壊れる可能性があります。\n\nこのオプションを有効にするには、Discord を再起動する必要があります。今すぐ再起動しますか?",
"disabledInfo": "有効にするためには、Discord<EFBFBD><EFBFBD><EFBFBD>再起動する必要があります。今すぐ再起動しますか?"
"disabledInfo": "有効にするためには、Discord再起動する必要があります。今すぐ再起動しますか?"
},
"Notices": {
"moreInfo": "詳細"

View File

@ -10,10 +10,6 @@
"name": "설정",
"general": {
"name": "일반",
"emotes": {
"name": "이모트 시스템",
"note": "BD의 이모트 시스템을 활성화합니다"
},
"voiceDisconnect": {
"name": "음성 연결 끊기",
"note": "디스코드를 닫을 때 음성 채널의 연결을 끊습니다"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "이모트",
"general": {
"name": "일반",
"download": {
"name": "이모트 다운로드",
"note": "최신이 아닌 이모트를 다운로드합니다"
},
"emoteMenu": {
"name": "이모트 메뉴",
"note": "이모트 메뉴에 트위치/즐겨찾기 이모트를 표시합니다"
},
"hideEmojiMenu": {
"name": "이모트 메뉴 숨기기",
"note": "이모트 메뉴를 사용 중일 때 디스코드의 이모지 메뉴를 숨깁니다"
},
"autoCaps": {
"name": "이모트 자동 대문자",
"note": "이모트 명령어에 자동 대문자를 사용합니다"
},
"modifiers": {
"name": "이모트 수정기 표시",
"note": "이모트 모드를 활성화합니다 (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "마우스 커서를 올렸을 때 애니메이션 표시",
"note": "마우스 커서를 올린 이모트의 애니메이션만 표시합니다"
}
},
"categories": {
"name": "카테고리",
"twitchglobal": {
"name": "트위치 글로벌",
"note": "트위치 글로벌 이모트를 표시합니다"
},
"twitchsubscriber": {
"name": "트위치 구독",
"note": "트위치 구독 이모트를 표시합니다"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "FFZ 이모트를 표시합니다"
},
"bttv": {
"name": "BetterTTV",
"note": "BTTV 이모트를 표시합니다"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "편집기 설정",
"editorTitle": "사용자 CSS 편집기"
},
"Emotes": {
"loading": "백그라운드에서 로딩된 이모트는 리로드하지 않습니다",
"loaded": "모든 이모트가 로드되었습니다",
"clearEmotes": "이모트 데이터 지우기",
"favoriteAction": "즐겨찾기",
"downloadFailed": "다운로드 실패",
"failureMessage": "BetterDiscord가 이모트 다운로드에 실패했습니다. 인터넷 상태와 방화벽을 확인해주세요"
},
"Modals": {
"confirmAction": "확실합니까?",
"okay": "확인",

View File

@ -9,10 +9,6 @@
"name": "Instellingen",
"general": {
"name": "Algemeen",
"emotes": {
"name": "Emote systeem",
"note": "Schakel het emote-systeem van BD in"
},
"voiceDisconnect": {
"name": "Stem Verbroken",
"note": "Verbreek de verbinding met de oproep"
@ -26,26 +22,6 @@
"note": "Voorkomt dat Discord uw mediatoetsen kaapt na het afspelen van een video."
}
}
},
"emotes": {
"general": {
"name": "Algemeen",
"emoteMenu": {
"name": "Emote Menu"
},
"hideEmojiMenu": {
"name": "Verberg emoji-menu"
}
},
"categories": {
"frankerfacez": {
"name": "FrankerFaceZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Laat emotes zien van BTTV"
}
}
}
},
"Addons": {
@ -70,9 +46,6 @@
"unknownAuthor": "Onbekende schrijver",
"noDescription": "Beschrijving kon niet worden weergegeven"
},
"Emotes": {
"favoriteAction": "Favorieten"
},
"Modals": {
"confirmAction": "Weet je het zeker?",
"okay": "Oké",

View File

@ -7,9 +7,6 @@
"name": "Innstillinger",
"general": {
"name": "Generell",
"emotes": {
"name": "Emote-system"
},
"showToasts": {
"name": "Vis Toasts"
}
@ -20,24 +17,6 @@
"name": "Tilpasset CSS"
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "Generell",
"download": {
"name": "Last ned Emotes"
}
},
"categories": {
"name": "Kategorier",
"frankerfacez": {
"name": "FrankerFaceZ"
},
"bttv": {
"name": "BetterTTV"
}
}
}
},
"Addons": {
@ -55,9 +34,6 @@
"update": "Oppdater",
"save": "Lagre"
},
"Emotes": {
"favoriteAction": "Favoritt!"
},
"Modals": {
"confirmAction": "Er Du Sikker?",
"okay": "Okay",

View File

@ -10,10 +10,6 @@
"name": "Ustawienia",
"general": {
"name": "Ogólne",
"emotes": {
"name": "System emoji",
"note": "Aktywuje system emoji BetterDiscorda"
},
"voiceDisconnect": {
"name": "Rozłączaj z czatem głosowym",
"note": "Rozłącza z serwerem czatu głosowego przy wyłączeniu Discorda"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Emoji",
"general": {
"name": "Ogólne",
"download": {
"name": "Pobieraj emoji",
"note": "Pobiera emoji, gdy jest dostępna aktualizacja"
},
"emoteMenu": {
"name": "Menu emoji",
"note": "Wyświetla ulubione emoji oraz emoji z Twitcha w oddzielnym menu"
},
"hideEmojiMenu": {
"name": "Ukryj menu emoji",
"note": "Ukrywa menu z emoji Discorda"
},
"autoCaps": {
"name": "Automatyczna zmiana wielkości liter w emoji",
"note": "Automatycznie zmienia wielkość liter przy wprowadzaniu emoji"
},
"modifiers": {
"name": "Pokazuj modyfikacje emoji",
"note": "Wyświetla modyfikacje emoji (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animacje po najechaniu",
"note": "Wyświetla animacje wyłącznie przy najechaniu na zmodyfikowane emoji"
}
},
"categories": {
"name": "Kategorie",
"twitchglobal": {
"name": "Globalne emoji Twitcha",
"note": "Wyświetla globalne emoji Twitcha"
},
"twitchsubscriber": {
"name": "Emoji dla subskrybentów Twitcha",
"note": "Wyświetla emoji dla subskrybentów Twitcha"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Wyświetla emoji z FrankerFaceZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Wyświetla emoji z BetterTTV"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "Ustawienia edytora",
"editorTitle": "Edytor niestandardowego kodu CSS"
},
"Emotes": {
"loading": "Ładowanie emoji w tle, nie odświeżaj Discorda.",
"loaded": "Wszystkie emoji zostały załadowane poprawnie.",
"clearEmotes": "Wyczyść dane emoji",
"favoriteAction": "Dodaj do ulubionych",
"downloadFailed": "Pobieranie nie powiodło się",
"failureMessage": "Nie udało się pobrać emoji, sprawdź swoje połączenie z internetem oraz zaporę ogniową."
},
"Modals": {
"confirmAction": "Czy na pewno chcesz to zrobić?",
"okay": "Tak",

View File

@ -9,10 +9,6 @@
"name": "Configurações",
"general": {
"name": "Geral",
"emotes": {
"name": "Sistema de Emotes",
"note": "Ativa o sistema de emotes do BetterDiscord"
},
"voiceDisconnect": {
"name": "Desconexão de Voz",
"note": "Desconecta do servidor de voz quando o discord é fechado"
@ -107,55 +103,6 @@
"note": "Salva todas os logs do console no arquivo debug.log dentro da pasta do BetterDiscord"
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "Geral",
"download": {
"name": "Baixar Emotes",
"note": "Baixa os emotes sempre que eles estiverem desatualizados"
},
"emoteMenu": {
"name": "Menu de Emotes",
"note": "Mostra os emotes favoritos e da twitch no menu"
},
"hideEmojiMenu": {
"name": "Esconder o Menu de Emojis",
"note": "Esconde o menu de emojis do discord quando estiver usando o menu de emotes"
},
"autoCaps": {
"name": "Capitalização Automática de Emotes ",
"note": "Capitaliza automaticamente os comandos de emote"
},
"modifiers": {
"name": "Mostrar Modificadores de Emotes",
"note": "Ativa as modificação de emotes (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animar ao Interagir",
"note": "Só anima os emotes quando o cursor passar sobre eles"
}
},
"categories": {
"name": "Categorias",
"twitchglobal": {
"name": "Globais da Twitch",
"note": "Mostra os emotes globais da twitch"
},
"twitchsubscriber": {
"name": "Subscribers da Twitch",
"note": "Mostra os emotes de subscribers da twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Mostra os emotes da FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Mostra os emotes da BTTV"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Configurações do Editor",
"editorTitle": "Editor do CSS Personalizado"
},
"Emotes": {
"loading": "Carregando emotes em segundo plano, por favor não recarregue.",
"loaded": "Todos os emotes carregaram com sucesso.",
"clearEmotes": "Limpar os dados de Emotes",
"favoriteAction": "Favoritar!",
"downloadFailed": "Download Falhou",
"failureMessage": "BetterDiscord não conseguiu baixar os emotes, por favor verifique sua conexão da internet e seu firewall."
},
"Modals": {
"confirmAction": "Você Tem Certeza?",
"okay": "Okay",

View File

@ -9,10 +9,6 @@
"name": "Definições",
"general": {
"name": "Geral",
"emotes": {
"name": "Sistema de Emotes",
"note": "Ativa o sistema de emotes do BD"
},
"voiceDisconnect": {
"name": "Disconectar Voz",
"note": "Disconectar do servidor de voz quando fechar o discord"
@ -107,55 +103,6 @@
"note": "Saída de tudo da consola para o ficheiro debug.log na pasta BetterDiscord"
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "Geral",
"download": {
"name": "Transferir Emotes",
"note": "Transferir Emotes mesmo estando indisponiveis"
},
"emoteMenu": {
"name": "Menu de Emotes",
"note": "Mostra os emotes Twitch/Favoritos no menu de emotes"
},
"hideEmojiMenu": {
"name": "Esconde o Emoji Menu",
"note": "Esconde o menu de emojis do Discord quando se usa o menu de emotes"
},
"autoCaps": {
"name": "Emote Autocapitalização",
"note": "Autocapitaliza o comando de emotes"
},
"modifiers": {
"name": "Mostra as modificações de emotes",
"note": "Ativa a modificação de emotes (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animar ao pairar",
"note": "Anima os modificadores de emote apenas ao passar o cursor"
}
},
"categories": {
"name": "Categorias",
"twitchglobal": {
"name": "Twitch Globals",
"note": "Mostra os emotes da Twitch global"
},
"twitchsubscriber": {
"name": "Subscrições Twitch",
"note": "Mostra os emotes de subscrição da Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Mostra os emotes da FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Mostra os emotes da"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Definições de Editor",
"editorTitle": "Editor de CSS Personalizado"
},
"Emotes": {
"loading": "Carregar emotes em segundo plano não carregam.",
"loaded": "Todos os emotes foram carregados com sucesso.",
"clearEmotes": "Limpar dados de Emotes",
"favoriteAction": "Favorito!",
"downloadFailed": "Transfêrencia falhou",
"failureMessage": "BetterDiscord falhou a transfêrencia de emotes, por favor verifique a sua conexão à Internet e à Firewall."
},
"Modals": {
"confirmAction": "Tem a certeza?",
"okay": "Okay",

View File

@ -9,10 +9,6 @@
"name": "setări",
"general": {
"name": "general",
"emotes": {
"name": "Sistemul de emote-uri",
"note": "Activează sistemul de emote-uri din cadrul BD"
},
"voiceDisconnect": {
"name": "Deconectare de la voce",
"note": "Deconectează-te de la un canal de voce când inchizi Discord-ul"
@ -107,55 +103,6 @@
"note": "Transferă tot din consolă in fișierul debug.log din folderul BetterDiscord"
}
}
},
"emotes": {
"name": "Emoji-uri",
"general": {
"name": "general",
"download": {
"name": "Descarcă emoji-urile",
"note": "Descarcă emoji-urile oricănd nu mai sunt actualizate la zi"
},
"emoteMenu": {
"name": "Meniu emoji",
"note": "Arată emote-urile Twitch/Favorite în meniu"
},
"hideEmojiMenu": {
"name": "Ascunde meniul de emoji-uri",
"note": "Ascunde meniul de emoji-uri al Discord-ului atunci când folosiți meniul de emote-uri"
},
"autoCaps": {
"name": "Scriere cu majusculă a emote-urilor",
"note": "Scrie in mod automat cu majusculă comenzile pentru emote-uri"
},
"modifiers": {
"name": "Arată modificările emote-urilor",
"note": "Activează mod-urile pentru emote-uri (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animează la atingere",
"note": "Animează emote-urile doar când treci cu cursorul peste ele"
}
},
"categories": {
"name": "Categorii",
"twitchglobal": {
"name": "Twitch Globals",
"note": "Arată emote-urile globale Twitch"
},
"twitchsubscriber": {
"name": "Abonări Twitch",
"note": "Arată emote-urile"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Arată emote-urile de la FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Arată emote-urile de la BTTV"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Setările editor-ului",
"editorTitle": "Editor de CSS personalizat"
},
"Emotes": {
"loading": "Emote-urile care se incarcă pe fundal nu se reîncarcă.",
"loaded": "Toate emote-urile s-au încărcat cu succes.",
"clearEmotes": "Curăță datele legate de emote-uri",
"favoriteAction": "Favorite!",
"downloadFailed": "Descărcarea a eșuat",
"failureMessage": "BetterDiscord nu a putut încărca emote-urile, te rugăm să verifici conexiunea la internet si firewall-ul."
},
"Modals": {
"confirmAction": "Ești sigur ?",
"okay": "Okay",

View File

@ -10,10 +10,6 @@
"name": "Настройки",
"general": {
"name": "Основные",
"emotes": {
"name": "Система смайликов",
"note": "Включает систему смайликов BD"
},
"voiceDisconnect": {
"name": "Отключение голосового чата",
"note": "Отключает от голосового чата, когда Discord закрыт"
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "Смайлики",
"general": {
"name": "Основные",
"download": {
"name": "Скачать Смайлики",
"note": "Скачивает Смайлики, когда они устаревают"
},
"emoteMenu": {
"name": "Меню Смайликов",
"note": "Показать Twitch/избранные в меню смайликов"
},
"hideEmojiMenu": {
"name": "Скрывать кнопку эмодзи",
"note": "Скрывает меню эмодзи Discord, когда используется смайлики"
},
"autoCaps": {
"name": "Автокапитализация Смайликов",
"note": "Автоматическая замена строчных букв заглавными в командах смайликов"
},
"modifiers": {
"name": "Показать модификаторы Смайликов",
"note": "Включить модификаторы Смайликов (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Анимировать при наведении",
"note": "Анимировать только модификаторы смайликов при наведении"
}
},
"categories": {
"name": "Категории",
"twitchglobal": {
"name": "Глобальные Twitch'a",
"note": "Показать глобальные смайлики Twitch'a"
},
"twitchsubscriber": {
"name": "Подписки Twitch",
"note": "Показывать смайлики подписчиков Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Показать смайлики из FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Показать смайлики из BTTV"
}
}
}
},
"Addons": {
@ -247,14 +194,6 @@
"settings": "Настройки редактора",
"editorTitle": "Редактор быстрого CSS"
},
"Emotes": {
"loading": "Загрузка смайликов в фоновом режиме",
"loaded": "Все смайлики успешно загружены",
"clearEmotes": "Отчистить данные Смайликов ",
"favoriteAction": "Избранное!",
"downloadFailed": "Загрузка не удалась",
"failureMessage": "BetterDiscord'у не удалось загрузить смайлики, проверьте подключение к интернету и брандмауэр."
},
"Modals": {
"confirmAction": "Ты уверен?",
"okay": "Ок",

View File

@ -9,10 +9,6 @@
"name": "Nastavenia",
"general": {
"name": "Základné",
"emotes": {
"name": "Emote Systém",
"note": "Povoliť BD emote systém"
},
"voiceDisconnect": {
"name": "Odpojenie hovoru",
"note": "Odpojiť z hovoru pri vypnutí Discordu"
@ -107,55 +103,6 @@
"note": "Zapíše všetko z konzole do súboru debug.log v BetterDiscord zložke"
}
}
},
"emotes": {
"name": "Emoty",
"general": {
"name": "Všeobecné",
"download": {
"name": "Stiahnuť Emoty",
"note": "Stiahnuť Emoty ak sú zastaralé"
},
"emoteMenu": {
"name": "Emote Menu",
"note": "Zobraziť Twtich/Obľúbené emoty v emote menu"
},
"hideEmojiMenu": {
"name": "Skryť Emoji Menu",
"note": "Skryje Discord Emoji menu pri používaní emote menu"
},
"autoCaps": {
"name": "Automatická kapitalizácia Emote",
"note": "Automaticky kapitalizuje emote commandy"
},
"modifiers": {
"name": "Zobraziť Emote Modifikátory",
"note": "Povoliť emote modifikátory (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animovať pri umiestnení kurzora",
"note": "Animovať emote modifikátory iba pri umiestnení kurzora"
}
},
"categories": {
"name": "Kategórie",
"twitchglobal": {
"name": "Twtich globálne",
"note": "Zobraziť globálne Twitch emoty"
},
"twitchsubscriber": {
"name": "Twitch predplatitelia",
"note": "Zobraziť predplatiteľské Twitch emoty"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Zobraziť FFZ emoty"
},
"bttv": {
"name": "BetterTTV",
"note": "Zobraziť BTTV emoty"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Nastavenia Editora",
"editorTitle": "Custom CSS Editor"
},
"Emotes": {
"loading": "Načítavanie emotov v pozadí, nerefreshujte.",
"loaded": "Všetky emoty úspešne načítané.",
"clearEmotes": "Vyčistiť emote dáta",
"favoriteAction": "Uložiť!",
"downloadFailed": "Sťahovanie Zlyhalo",
"failureMessage": "BetterDiscord nedokázal načítať emoty, prosím skontrolujte internetové pripojenie a firewall."
},
"Modals": {
"confirmAction": "Ste si istý?",
"okay": "Ok",

View File

@ -10,10 +10,6 @@
"name": "Inställningar",
"general": {
"name": "Allmänt",
"emotes": {
"name": "Emotessystem",
"note": "Aktiverar BDs emotessystem"
},
"voiceDisconnect": {
"name": "Lämna röstsamtal",
"note": "Lämna röstsamtal när Discord stängs ner"
@ -104,43 +100,6 @@
}
}
}
},
"emotes": {
"name": "Emotes",
"general": {
"name": "Generellt",
"download": {
"name": "Ladda Ner Emotes",
"note": "Ladda ner emotes en gång i veckan för att hålla sig uppdaterad"
},
"emoteMenu": {
"name": "Emote Meny",
"note": "Visa Twitch/Favorit emotes i emote meny"
},
"hideEmojiMenu": {
"name": "Gömmer Emoji Meny",
"note": "Gömmer Discord's emoji meny när emote meny är aktiverad"
},
"autoCaps": {
"name": "Automatiskt Stor Bokstav I Emotes",
"note": "Gör automatiskt stor bokstav i emote kommandon"
},
"modifiers": {
"name": "Visa Emote Modifierare",
"note": "Aktivera emote modifierare (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Animera När Musen Hålls Över",
"note": "Animera endast emote midiferare när musen hålls över emoten"
}
},
"categories": {
"name": "Kategorier",
"bttv": {
"name": "BetterTTV",
"note": "Visa emotes från BTTV"
}
}
}
},
"Addons": {
@ -172,7 +131,10 @@
"settingsError": "Kunde inte öppna inställningarna för {{namn}}",
"unknownAuthor": "Okänd upphovsman",
"noDescription": "Beskrivning saknas.",
"isEnabled": "Aktiverad"
"compileError": "Kunde inte kompileras. Se konsolen för mer information.",
"isEnabled": "Aktiverad",
"listView": "Listvy",
"gridView": "Rutnätsvy"
},
"CustomCSS": {
"confirmationText": "Du har osparade ändringar av egna CSS:en. Alla ändringar kommer försvinna om du stänger det här fönstret",
@ -183,10 +145,6 @@
"settings": "Inställningar för redigerare",
"editorTitle": "Egen CSS-redigerare"
},
"Emotes": {
"clearEmotes": "Rensa Emote Data",
"favoriteAction": "Favorit!"
},
"Modals": {
"confirmAction": "Är du säker?",
"okay": "Okej",

View File

@ -9,10 +9,6 @@
"name": "Ayarlar",
"general": {
"name": "Genel",
"emotes": {
"name": "Emoji Sistemi",
"note": "BD'nin emoji sistemini etkileştirir"
},
"voiceDisconnect": {
"name": "Ses Kanalından Ayrılma",
"note": "Discord'u kapatırken aktif ses kanalından ayrılır"
@ -107,55 +103,6 @@
"note": "Konsoldaki herşeyi BetterDiscord klasöründeki debug.log dosyasına kaydeder"
}
}
},
"emotes": {
"name": "Emojiler",
"general": {
"name": "Genel",
"download": {
"name": "Emoji Indir",
"note": "Eski olduklarında emojileri indir"
},
"emoteMenu": {
"name": "Emoji Menüsü",
"note": "Twitch/Favori emojileri emoji menüsünde göster"
},
"hideEmojiMenu": {
"name": "Emoji Menüsünü Gizle",
"note": "Emoji Menüsünü kullanırken Discord'ün emoji menüsünü gizler"
},
"autoCaps": {
"name": "Emoji Kapitalizasyonu",
"note": "Otomatik olarak emoji komutlarını kapitalize et"
},
"modifiers": {
"name": "Emoji Değiştiricilerini Göster",
"note": "Emoji modlarını etkinleştir (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Üzerindeyken Oynat",
"note": "Sadece fare emoji üzerindeyken oynat"
}
},
"categories": {
"name": "Kategoriler",
"twitchglobal": {
"name": "Twitch Globaller",
"note": "Twitch Global emojilerini göster"
},
"twitchsubscriber": {
"name": "Twitch Aboneleri",
"note": "Twitch Abone emojilerini göster"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "FFZ emojilerini göster"
},
"bttv": {
"name": "BetterTTV",
"note": "BTTV emojilerini göster"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Editör Ayarları",
"editorTitle": "Özel CSS Editörü"
},
"Emotes": {
"loading": "Arkaplanda emojiler yükleniyor yeniden başlatmayınız.",
"loaded": "Bütün emojiler yüklendi.",
"clearEmotes": "Emoji Verilerini Sil",
"favoriteAction": "Favori ekle!",
"downloadFailed": "Yükleme başarısız oldu",
"failureMessage": "BetterDiscord emojileri yüklemede başarısız oldu, lütfen internet bağlantınızı kontrol ediniz."
},
"Modals": {
"confirmAction": "Emin Misin?",
"okay": "Tamam",

View File

@ -9,10 +9,6 @@
"name": "Налаштування",
"general": {
"name": "Основні",
"emotes": {
"name": "Система емодзі",
"note": "Активація системи емодзі BetterDiscord"
},
"voiceDisconnect": {
"name": "Голосовий чат під час закриття",
"note": "Відключатися від голосового сервера під час закриття Discord"
@ -107,55 +103,6 @@
"note": "Виводить все з консолі у файл debug.log в теці BetterDiscord"
}
}
},
"emotes": {
"name": "Емодзі",
"general": {
"name": "General",
"download": {
"name": "Оновлювати емодзі",
"note": "Оновлювати емодзі при старінні"
},
"emoteMenu": {
"name": "Перелік емодзі",
"note": "Показувати перелік Twitch/Обраних емодзі"
},
"hideEmojiMenu": {
"name": "Приховувати перелік емодзі",
"note": "Приховує меню емодзі Discord під час використання переліку емодзі"
},
"autoCaps": {
"name": "Великі літери емодзі",
"note": "Автоматично переводити текст команд емодзі у великі літери"
},
"modifiers": {
"name": "Показувати модифікатори емодзі",
"note": "Увімкнути модифікації емодзі (flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap)"
},
"animateOnHover": {
"name": "Анімувати при наведенні",
"note": "Анімувати модифікатори емодзі лише при наведенні"
}
},
"categories": {
"name": "Категорії",
"twitchglobal": {
"name": "Twitch (основні)",
"note": "Показувати основні емодзі Twitch"
},
"twitchsubscriber": {
"name": "Twitch (підписників)",
"note": "Показувати емодзі підписників Twitch"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "Показувати емодзі FFZ"
},
"bttv": {
"name": "BetterTTV",
"note": "Показувати емодзі BTTV"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "Налаштування редактора",
"editorTitle": "Самописний редактор стилів"
},
"Emotes": {
"loading": "Завантаження емодзі у фоновому режимі без перезавантаження",
"loaded": "Усі емодзі успішно завантажені.",
"clearEmotes": "Очистити дані емодзі",
"favoriteAction": "Обране!",
"downloadFailed": "Завантаження не вдалося",
"failureMessage": "BetterDiscord не вдалося завантажити емодзі. Будь ласка, перевір підключення до Інтернету та брандмауер."
},
"Modals": {
"confirmAction": "Ти впевнений?",
"okay": "Так",

View File

@ -1 +1,250 @@
{}
{
"Panels": {
"plugins": "Tiện ích",
"themes": "Chủ đề",
"customcss": "CSS Tùy Chỉnh",
"updates": "Cập nhật"
},
"Collections": {
"settings": {
"name": "Cài đặt",
"general": {
"name": "Chung",
"voiceDisconnect": {
"name": "Ngắt Kết Nối Kênh Đàm Thoại",
"note": "Ngắt kết nối kênh đàm thoại khi đóng Discord"
},
"showToasts": {
"name": "HIển Thị Thông Báo",
"note": "Hiển thị một thông báo nhỏ cho những thông tin quan trọng"
},
"mediaKeys": {
"name": "Vô Hiệu Hóa Phím Điều Khiển Phương Tiện",
"note": "Ngăn Discord kiểm soát phím điều khiển phương tiện sau khi xem video."
}
},
"window": {
"removeMinimumSize": {
"name": "Xóa Kích Thước Tối Thiểu",
"note": "Xóa kích thước tối thiểu của Discord (940x500)"
},
"name": "Cài Đặt Cửa Sổ",
"transparency": {
"name": "Bật Cửa Sổ Trong Suốt",
"note": "Cho phép cửa sổ Discord nhìn xuyên thấu (cần khởi động lại)"
},
"frame": {
"name": "Khung Cửa Sổ",
"note": "Cho phép khung cửa sổ của hệ thống vào cửa sổ Discord"
}
},
"addons": {
"name": "Quản Lý Tiện Ích",
"addonErrors": {
"name": "Hiển Thị Lỗi Tiện Ích",
"note": "Hiển thị thông báo với những tiện ích/chủ đề lỗi"
},
"editAction": {
"name": "Nơi Chỉnh Sửa",
"note": "Nơi trình chỉnh sửa tiện ích và chủ đề hiển thị khi sửa",
"options": {
"detached": "Cửa Sổ Tách Rời",
"system": "Trình Chỉnh Sửa"
}
}
},
"customcss": {
"name": "CSS Tùy Chỉnh",
"customcss": {
"name": "CSS Tùy Chỉnh",
"note": "Bật tab CSS Tùy Chỉnh"
},
"liveUpdate": {
"name": "Cập Nhật Trực Tiếp",
"note": "Cập nhật CSS khi bạn đang gõ"
},
"startDetached": {
"name": "Tách Rời Cửa Số",
"note": "Bấm vào tab CSS Tùy Chỉnh sẽ mở trình chỉnh sửa ở cửa sổ riêng"
},
"nativeOpen": {
"name": "Mở trong Trình Chỉnh Sửa của bạn",
"note": "Bấm vào tab CSS Tùy Chỉnh sẽ mở trình chỉnh sửa của bạn"
},
"openAction": {
"name": "Vị trí Trình Chỉnh Sửa",
"note": "Nơi CSS Tùy Chỉnh sẽ được mở mặc định",
"options": {
"settings": "Menu Cài Đặt",
"detached": "Cửa Sổ Riêng",
"system": "Trình Chỉnh Sửa"
}
}
},
"developer": {
"name": "Cài đặt Nhà Phát Triển",
"debuggerHotkey": {
"name": "Phím tắt Trình Gỡ Lỗi",
"note": "Cho phép kích hoạt trình gỡ lỗi bằng cách nhấn F8 với DevTools mở"
},
"reactDevTools": {
"name": "React Developer Tools",
"note": "Thêm cài đặt của React Developer Tools vào Discord"
},
"inspectElement": {
"name": "Phím tắt Kiểm tra Thành Phần",
"note": "Kích hoạt phím tắt Kiểm tra Thành Phần (Ctrl + Shift + C) tương tự như trong hầu hết trình duyệt"
},
"devToolsWarning": {
"name": "Tắt Cảnh Báo DevTools",
"note": "Ngăn Discord hiển thị thông báo \"Chờ Đã!\""
},
"debugLogs": {
"name": "Lưu Nhật Ký Gỡ Lỗi",
"note": "Lưu mọi thứ được hiển thị ở Console vào tệp debug.log trong thư mục BetterDiscord"
},
"devTools": {
"name": "DevTools",
"note": "Kích hoạt DevTools bằng tổ hợp Ctrl + Shift + i"
}
},
"editor": {
"name": "Cài đặt Trình Chỉnh Sửa",
"lineNumbers": {
"name": "Số Dòng",
"note": "Hiển thị số dòng ở cạnh của trình chỉnh sửa"
},
"fontSize": {
"name": "Kích Thước Phông Chữ",
"note": "Kích thước phông chữ (pt) được sử dụng trong trình chỉnh sửa"
},
"minimap": {
"name": "Minimap",
"note": "Hiển thị Minimap ở cạnh của trình chỉnh sửa"
},
"hover": {
"name": "Chú Giải",
"note": "Hiển thị chú giải khi di chuột vào những lựa chọn"
},
"quickSuggestions": {
"name": "Đề Xuất Nhanh",
"note": "Hiển thị những đề xuất tự hoàn thành khi bạn gõ"
},
"renderWhitespace": {
"name": "Hiển Thị Khoảng Trắng",
"note": "Khi nào khoảng trắng sẽ được hiển thị trong trình chỉnh sửa",
"options": {
"all": "Luôn luôn",
"none": "Không bao giờ",
"selection": "Tùy chọn"
}
}
}
}
},
"Addons": {
"title": "{{name}} v{{version}} bởi {{author}}",
"byline": "bởi {{author}}",
"openFolder": "Mở thư mục {{type}}",
"reload": "Tải lại",
"addonSettings": "Cài đặt",
"website": "Trang web",
"source": "Nguồn",
"invite": "Máy chủ hỗ trợ",
"donate": "Ủng hộ",
"patreon": "Patreon",
"name": "Tên",
"author": "Tác giả",
"version": "Phiên bản",
"added": "Ngày thêm",
"modified": "Ngày sửa đổi",
"search": "Tìm kiếm {{type}}",
"editAddon": "Chỉnh sửa",
"deleteAddon": "Xóa",
"confirmDelete": "Bạn chắc chắn muốn xóa {{name}}?",
"confirmationText": "Bạn có những thay đổi chưa lưu cho {{name}}. Đóng cửa sổ này sẽ xóa hết những thay đổi của bạn.",
"enabled": "{{name}} đã được kích hoạt.",
"disabled": "{{name}} đã được vô hiệu hóa.",
"couldNotEnable": "{{name}} không thể được kích hoạt.",
"couldNotDisable": "{{name}} không thể được vô hiệu hóa.",
"couldNotStart": "{{name}} không thể bắt đầu.",
"couldNotStop": "{{name}} không thể dừng lại.",
"settingsError": "Không thể mở cài đặt cho {{name}}",
"methodError": "{{method}} không thể được kích hoạt.",
"unknownAuthor": "Tác giả không xác định",
"noDescription": "Không có miêu tả.",
"alreadyExists": "Đã có {{type}} với tên {{name}} rồi!",
"alreadWatching": "Đã đang xem tiện ích.",
"metaError": "Không thể phân tích META.",
"missingNameData": "Thiếu dữ liệu tên META.",
"metaNotFound": "Không thể tìm thấy META.",
"compileError": "Không thể biên dịch. Vui lòng kiểm tra Console để biết thêm chi tiết.",
"wasUnloaded": "{{name}} đã được gỡ.",
"blankSlateHeader": "Bạn không có {{type}}!",
"blankSlateMessage": "Lấy một số ở [trang web]({{link}}) và thêm vào thư mục {{type}}.",
"isEnabled": "Đã kích hoạt",
"wasLoaded": "{{name}} v{{version}} đã được thêm.",
"listView": "Dạng Danh Sách",
"gridView": "Dạng Ô"
},
"CustomCSS": {
"confirmationText": "Bạn có những thay đổi chưa lưu cho CSS Tùy Chỉnh của bạn. Đóng cửa sổ này sẽ xóa hết những thay đổi của bạn.",
"update": "Cập nhật",
"save": "Lưu",
"openNative": "Mở trong Trình Chỉnh Sửa",
"openDetached": "Cửa Sổ Riêng",
"settings": "Cài đặt Trình Chỉnh Sửa",
"editorTitle": "Trình Chỉnh Sửa CSS Tùy Chỉnh"
},
"Modals": {
"confirmAction": "Bạn chắc chắn chứ?",
"okay": "OK",
"done": "Xong",
"cancel": "Hủy bỏ",
"nevermind": "Không bận tâm",
"close": "Đóng",
"name": "Tên",
"message": "Tin nhắn",
"error": "Lỗi",
"addonErrors": "Lỗi Tiện Ích",
"restartRequired": "Cần Khởi Động Lại",
"restartNow": "Khởi Động Lại Bây Giờ",
"restartLater": "Khởi Động Lại Sau",
"additionalInfo": "Thông Tin Bổ Sung",
"restartPrompt": "Để có hiệu lực, Discord cần phải được khởi động lại. Bạn có muốn khởi động lại ngay bây giờ?",
"changelog": "Nhật ký thay đổi"
},
"ReactDevTools": {
"notFound": "Không Thể Tìm Thấy Tiện Ích",
"notFoundDetails": "Không thể tìm thấy tiện ích React Developer Tools trong máy bạn. Vui lòng cài đặt tiện ích trên Chrome."
},
"Sorting": {
"sortBy": "Lọc Bởi",
"order": "Thứ tự",
"ascending": "Trên xuống dưới",
"descending": "Dưới lên trên"
},
"WindowPrefs": {
"enabledInfo": "Lựa chọn này cần phải có một chủ đề trong suốt để có thể hoạt động đúng cách. Trên Windows, tính năng sắp xếp và thu phóng cửa số (Aero Snapping) và toàn cửa sổ có thể không hoạt động.\n\nĐể có hiệu lực, Discord cần phải được khởi động lại. Bạn có muốn khởi động lại ngay bây giờ?",
"disabledInfo": "Để có hiệu lực, Discord cần phải được khởi động lại. Bạn có muốn khởi động lại ngay bây giờ?"
},
"Notices": {
"moreInfo": "Thông Tin Thêm"
},
"Updater": {
"updateFailed": "Cập Nhật Thất Bại!",
"updateFailedMessage": "Không thể cập nhật BetterDiscord. Vui lòng tải trình cài đặt mới nhất ở trang web (https://betterdiscord.app/) và cài đặt lại.",
"updateSuccessful": "Cập Nhật Thành Công!",
"updateAvailable": "BetterDiscord có cập nhật mới (v{{version}})",
"addonUpdatesAvailable": "BetterDiscord đã phát hiện {{count}} cho {{type}} của bạn!",
"addonUpdated": "{{name}} đã được cập nhật lên phiên bản {{version}}!",
"checking": "Đang kiểm tra cập nhât...",
"finishedChecking": "Kiểm tra cập nhật thành công!",
"checkForUpdates": "Kiểm Tra Cập Nhật!",
"updateAll": "Cập Nhật Mọi Thứ!",
"noUpdatesAvailable": "Không có cập nhật mới.",
"versionAvailable": "Phiên bản {{version}} đã có sẵn!",
"upToDateBlankslate": "Tất cả {{type}} của bạn đều ở phiên bản mới nhất!",
"updateButton": "Cập nhật!"
}
}

View File

@ -9,10 +9,6 @@
"name": "设置",
"general": {
"name": "一般",
"emotes": {
"name": "表情系统",
"note": "启用 BetterDiscord 表情系统"
},
"voiceDisconnect": {
"name": "自动断开语音",
"note": "自动在关闭 Discord 时断开语音"
@ -107,55 +103,6 @@
"note": "输出控制台中的所有信息到 BetterDiscord 文件夹下的 debug.log 文件"
}
}
},
"emotes": {
"name": "表情",
"general": {
"name": "一般",
"download": {
"name": "下载表情",
"note": "自动下载即将过期的表情"
},
"emoteMenu": {
"name": "表情菜单",
"note": "在表情菜单中显示 Twitch/我的最爱 表情"
},
"hideEmojiMenu": {
"name": "隐藏表情符号菜单Hide Emoji Menu",
"note": "在使用表情菜单时隐藏 Discord 的表情符号菜单"
},
"autoCaps": {
"name": "表情自动大写",
"note": "自动大写表情命令"
},
"modifiers": {
"name": "显示表情修饰符",
"note": "启用表情修饰符flip, spin, pulse, spin2, spin3, 1spin, 2spin, 3spin, tr, bl, br, shake, shake2, shake3, flap"
},
"animateOnHover": {
"name": "悬停动画",
"note": "仅在悬停时播放表情修饰符动画"
}
},
"categories": {
"name": "分类",
"twitchglobal": {
"name": "Twitch 全局",
"note": "显示 Twitch 全局表情"
},
"twitchsubscriber": {
"name": "Twitch 订阅",
"note": "显示 Twitch 订阅者表情"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "显示来自 FFZ 的表情"
},
"bttv": {
"name": "BetterTTV",
"note": "显示来自 BTTV 的表情"
}
}
}
},
"Addons": {
@ -208,14 +155,6 @@
"settings": "编辑器设置",
"editorTitle": "自定义样式编辑器"
},
"Emotes": {
"loading": "在后台加载表情时不会重新加载。",
"loaded": "所有表情均已成功加载。",
"clearEmotes": "清除表情数据",
"favoriteAction": "爱了!",
"downloadFailed": "下载失败",
"failureMessage": "BetterDiscord 无法下载表情,请检查你的网络连接和防火墙。"
},
"Modals": {
"confirmAction": "你确定吗?",
"okay": "确定",

View File

@ -10,10 +10,6 @@
"name": "設定",
"general": {
"name": "一般",
"emotes": {
"name": "表情符號系統",
"note": "啟用 BetterDiscord 的表情符號系統"
},
"voiceDisconnect": {
"name": "自動中斷語音連線",
"note": "自動在關閉 Discord 時中斷語音連線"
@ -29,8 +25,8 @@
},
"window": {
"removeMinimumSize": {
"name": "移除最小限制",
"note": "移除 Discord 限制的最小視窗尺寸940x500"
"name": "移除最小視窗尺寸限制",
"note": "移除 Discord 限制的最小視窗尺寸940x500"
},
"name": "視窗設定",
"transparency": {
@ -88,8 +84,8 @@
"developer": {
"name": "開發人員設定",
"debuggerHotkey": {
"name": "調試器快捷鍵",
"note": "按下 F8 時啟動調試器"
"name": "偵錯工具快捷鍵",
"note": "允許在打開開發人員工具的情況下按下 F8 啟動偵錯工具"
},
"reactDevTools": {
"name": "React 開發人員工具",
@ -104,7 +100,7 @@
"note": "禁止 Discord 輸出「Hold Up!」警告"
},
"debugLogs": {
"name": "調試記錄檔",
"name": "偵錯記錄檔",
"note": "輸出控制台中的所有資訊到 BetterDiscord 資料夾下的 debug.log"
},
"devTools": {
@ -124,11 +120,11 @@
},
"minimap": {
"name": "小地圖",
"note": "啟用在編輯器一側顯示碼小地圖"
"note": "啟用在編輯器一側顯示程式碼小地圖"
},
"hover": {
"name": "參考工具提示",
"note": "允許在懸停規則和選擇器時顯示參考工具提示"
"note": "允許在懸停規則和選擇器時顯示參考工具提示"
},
"quickSuggestions": {
"name": "快速建議",
@ -144,55 +140,6 @@
}
}
}
},
"emotes": {
"name": "表情符號",
"general": {
"name": "一般",
"download": {
"name": "下載表情符號",
"note": "自動下載即將過期的表情符號"
},
"emoteMenu": {
"name": "表情符號選單",
"note": "在表情符號選單中顯示 Twitch/我的最愛 表情符號"
},
"hideEmojiMenu": {
"name": "隱藏表情符號選單",
"note": "在使用表情符號時隱藏 Discord 的表情符號選單"
},
"autoCaps": {
"name": "表情符號自動大寫",
"note": "自動大寫表情符號指令"
},
"modifiers": {
"name": "顯示表情修飾符",
"note": "啟用表情修飾符flip、spin、pulse、spin2、spin3、1spin、2spin、3spin、tr、bl、br、shake、shake2、shake3、flap"
},
"animateOnHover": {
"name": "懸停動畫",
"note": "僅在懸停時播放表情修飾符動畫"
}
},
"categories": {
"name": "分類",
"twitchglobal": {
"name": "Twitch 全域",
"note": "顯示 Twitch 全域表情"
},
"twitchsubscriber": {
"name": "Twitch 訂閱",
"note": "顯示 Twitch 訂閱者表情"
},
"frankerfacez": {
"name": "FrankerFaceZ",
"note": "顯示來自 FFZ 的表情"
},
"bttv": {
"name": "BetterTTV",
"note": "顯示來自 BTTV 的表情"
}
}
}
},
"Addons": {
@ -202,8 +149,8 @@
"reload": "重新載入",
"addonSettings": "設定",
"website": "網站",
"source": "開源代碼",
"invite": "支持伺服器",
"source": "原始碼",
"invite": "技術支援伺服器",
"donate": "捐贈",
"patreon": "Patreon",
"name": "名稱",
@ -227,16 +174,18 @@
"unknownAuthor": "未知的作者",
"noDescription": "作者没有留下任何描述。",
"alreadyExists": "已存在相同名稱 {{name}} 的 {{type}}。",
"alreadWatching": "已在監擴充功能了。",
"alreadWatching": "已在監擴充功能了。",
"metaError": "無法解析元資料。",
"missingNameData": "元資料缺少名稱。",
"metaNotFound": "無法找到元資料。",
"compileError": "無法編譯。",
"compileError": "無法編譯。詳細資訊請見控制台。",
"wasUnloaded": "已解除安裝 {{name}}。",
"blankSlateHeader": "您還未新增任何 {{type}}",
"blankSlateMessage": "您可以在[此網站]{{link}})中獲得,並將其新增到您的 {{type}} 資料夾中。",
"blankSlateMessage": "您可以在[此網站]({{link}})中取得,並將其新增到您的 {{type}} 資料夾中。",
"isEnabled": "已啟用",
"wasLoaded": "已載入 {{name}} 版本 {{version}}。"
"wasLoaded": "已載入 {{name}} 版本 {{version}}。",
"listView": "清單檢視",
"gridView": "方格檢視"
},
"CustomCSS": {
"confirmationText": "您還有未儲存的更改,關閉此視窗將失去所有對客製化 CSS 所做的更改。",
@ -247,14 +196,6 @@
"settings": "編輯器設定",
"editorTitle": "客製化 CSS 編輯器"
},
"Emotes": {
"loading": "在背景載入表情時不會重新載入。",
"loaded": "所有表情均已成功載入。",
"clearEmotes": "清除表情資料",
"favoriteAction": "新增到我的最愛",
"downloadFailed": "下載失敗",
"failureMessage": "BetterDiscord 無法下載表情,請檢查您的網絡連線和防火牆。"
},
"Modals": {
"confirmAction": "您確定嗎?",
"okay": "確定",
@ -270,10 +211,11 @@
"restartNow": "立即重新啟動",
"restartLater": "稍後自行重新啟動",
"additionalInfo": "額外資訊",
"restartPrompt": "Discord 需要重新啟動以套用更新。立刻進行重新啟動嗎?"
"restartPrompt": "Discord 需要重新啟動以套用更新。立刻進行重新啟動嗎?",
"changelog": "更新日誌"
},
"ReactDevTools": {
"notFound": "未找到框架",
"notFound": "未找到擴充套件",
"notFoundDetails": "無法在您的電腦上找到 React 開發者工具擴充套件。請在本機的 Chrome 上安裝該擴充套件。"
},
"Sorting": {
@ -283,7 +225,7 @@
"descending": "倒序"
},
"WindowPrefs": {
"enabledInfo": "此選項需要透明佈景主題才能正常工作。在 Windows 上,這可能會破壞 Aero 的捕捉和最大化。\\n\\n該變更需要重新啟動以生效。您要立即進行重新啟動嗎",
"enabledInfo": "此選項需要透明佈景主題才能正常工作。在 Windows 上,這可能會破壞 Aero Snap和最大化。\n\n該變更需要重新啟動以生效。您要立即進行重新啟動嗎",
"disabledInfo": "Discord 需要重新啟動以套用最新變更。立刻進行重新啟動嗎?"
},
"Notices": {
@ -293,7 +235,7 @@
"updateFailed": "更新失敗!",
"updateFailedMessage": "BetterDiscord 更新失敗。請從我們的網站 (https://betterdiscord.app/) 下載最新版本的安裝程式並重新安裝。",
"updateSuccessful": "更新成功!",
"updateAvailable": "BetterDiscord 已有新的版本{{version}}",
"updateAvailable": "BetterDiscord 已有新的版本 ({{version}})",
"addonUpdatesAvailable": "BetterDiscord 已為您 {{type}} 中的 {{count}} 找到更新!",
"addonUpdated": "{{name}} 已更新到版本 {{version}}",
"checking": "正在檢查更新!",

View File

@ -16,4 +16,5 @@ export const WINDOW_SIZE = "bd-window-size";
export const DEVTOOLS_WARNING = "bd-remove-devtools-message";
export const OPEN_DIALOG = "bd-open-dialog";
export const REGISTER_PRELOAD = "bd-register-preload";
export const GET_ACCENT_COLOR = "bd-get-accent-color";
export const GET_ACCENT_COLOR = "bd-get-accent-color";
export const OPEN_PATH = "bd-open-path";

View File

@ -11,6 +11,6 @@
"lint": "eslint --ext .js src/"
},
"devDependencies": {
"webpack": "^5.73.0"
"webpack": "^5.90.3"
}
}

View File

@ -1,6 +1,7 @@
import fs from "fs";
import path from "path";
import electron from "electron";
import {spawn} from "child_process";
import ReactDevTools from "./reactdevtools";
import * as IPCEvents from "common/constants/ipcevents";
@ -97,7 +98,8 @@ export default class BetterDiscord {
electron.app.exit();
}
if (result.response === 1) {
electron.shell.openPath(path.join(dataPath, "plugins"));
if (process.platform === "win32") spawn("explorer.exe", [path.join(dataPath, "plugins")]);
else electron.shell.openPath(path.join(dataPath, "plugins"));
}
});
hasCrashed = false;

View File

@ -1,4 +1,5 @@
import {ipcMain as ipc, BrowserWindow, app, dialog, systemPreferences} from "electron";
import {spawn} from "child_process";
import {ipcMain as ipc, BrowserWindow, app, dialog, systemPreferences, shell} from "electron";
import * as IPCEvents from "common/constants/ipcevents";
@ -32,6 +33,11 @@ const getPath = (event, pathReq) => {
event.returnValue = returnPath;
};
const openPath = (event, path) => {
if (process.platform === "win32") spawn("explorer.exe", [path]);
else shell.openPath(path);
};
const relaunch = () => {
app.quit();
app.relaunch();
@ -140,6 +146,7 @@ export default class IPCMain {
static registerEvents() {
try {
ipc.on(IPCEvents.GET_PATH, getPath);
ipc.on(IPCEvents.OPEN_PATH, openPath);
ipc.on(IPCEvents.RELAUNCH, relaunch);
ipc.on(IPCEvents.OPEN_DEVTOOLS, openDevTools);
ipc.on(IPCEvents.CLOSE_DEVTOOLS, closeDevTools);

View File

@ -19,7 +19,8 @@ module.exports = (env, argv) => ({
rimraf: `require("rimraf")`,
yauzl: `require("yauzl")`,
mkdirp: `require("mkdirp")`,
module: `require("module")`
module: `require("module")`,
child_process: `require("child_process")`,
},
resolve: {
extensions: [".js"],

View File

@ -1,6 +1,6 @@
{
"name": "betterdiscord",
"version": "1.9.5",
"version": "1.10.1",
"description": "Enhances Discord by adding functionality and themes.",
"main": "src/index.js",
"scripts": {
@ -17,20 +17,26 @@
"translations": "node -r dotenv/config scripts/translations.js"
},
"devDependencies": {
"@babel/core": "^7.16.12",
"@babel/preset-env": "^7.16.11",
"@babel/register": "^7.16.9",
"asar": "^3.2.0",
"dotenv": "^16.0.3",
"eslint": "^8.23.0",
"eslint-plugin-react": "^7.31.6",
"@babel/core": "^7.23.9",
"@babel/preset-env": "^7.23.9",
"@babel/register": "^7.23.7",
"@electron/asar": "^3.2.0",
"dotenv": "^16.4.5",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"mocha": "^10.0.0",
"webpack": "^5.74.0",
"mocha": "^10.3.0",
"terser-webpack-plugin": "^5.3.10",
"webpack": "^5.90.3",
"webpack-cli": "^4.10.0"
},
"engines": {
"node": ">=14",
"pnpm": ">=7"
},
"pnpm": {
"overrides": {
"json5@<1.0.2": ">=1.0.2"
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,6 @@
"lint": "eslint --ext .js src/"
},
"devDependencies": {
"webpack": "^5.73.0"
"webpack": "^5.90.3"
}
}

View File

@ -3,7 +3,6 @@ import {ipcRenderer as IPC, shell} from "electron";
export const ipcRenderer = {
send: IPC.send.bind(IPC),
sendToHost: IPC.sendToHost.bind(IPC),
sendTo: IPC.sendTo.bind(IPC),
sendSync: IPC.sendSync.bind(IPC),
invoke: IPC.invoke.bind(IPC),
on: IPC.on.bind(IPC),

View File

@ -6,21 +6,22 @@ const redirectCodes = new Set([301, 302, 307, 308]);
/**
* @typedef {Object} FetchOptions
* @property {"GET" | "PUT" | "POST" | "DELETE"} [method] - Request method.
* @property {"GET" | "PUT" | "POST" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD" | "CONNECT" | "TRACE"} [method] - Request method.
* @property {Record<string, string>} [headers] - Request headers.
* @property {"manual" | "follow"} [redirect] - Whether to follow redirects.
* @property {number} [maxRedirects] - Maximum amount of redirects to be followed.
* @property {AbortSignal} [signal] - Signal to abruptly cancel the request
* @property {Uint8Array | string} [body] - Defines a request body. Data must be serializable.
* @property {number} [timeout] - Request timeout time.
*/
/**
* @param {string} url
* @param {FetchOptions} options
* @param {string} requestedUrl
* @param {FetchOptions} fetchOptions
*/
export function nativeFetch(url, options) {
export function nativeFetch(requestedUrl, fetchOptions) {
let state = "PENDING";
const data = {content: [], headers: null, statusCode: null, url: url, statusText: "", redirected: false};
const data = {content: [], headers: null, statusCode: null, url: requestedUrl, statusText: "", redirected: false};
const listeners = new Set();
const errors = new Set();
@ -120,11 +121,11 @@ export function nativeFetch(url, options) {
* reference to the object below so they have no way of
* listening to the error through onError.
*/
const parsed = new URL(url);
const parsed = new URL(requestedUrl);
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
throw new Error(`Unsupported protocol: ${parsed.protocol}`);
}
execute(parsed, options);
execute(parsed, fetchOptions);
return {
onComplete(listener) {

View File

@ -39,7 +39,8 @@ const makeRequest = (url, options, callback, setReq) => {
// Make sure to close the socket.
try {req.write(options.formData);}
finally {req.end();}
} else {
}
else {
req.end();
}

View File

@ -37,14 +37,20 @@ export default function () {
instance.push([[Symbol()], {}, require => {
require.d = (target, exports) => {
for (const key in exports) {
if (!Reflect.has(exports, key) || target[key]) continue;
Object.defineProperty(target, key, {
get: () => exports[key](),
set: v => {exports[key] = () => v;},
enumerable: true,
configurable: true
});
if (!Reflect.has(exports, key)) continue;
try {
Object.defineProperty(target, key, {
get: () => exports[key](),
set: v => {exports[key] = () => v;},
enumerable: true,
configurable: true
});
}
catch (error) {
// eslint-disable-next-line no-console
console.error(error);
}
}
};
}]);

View File

@ -16,22 +16,22 @@
"test-prod": "npm run test -- --reporter min"
},
"devDependencies": {
"@babel/core": "^7.16.12",
"@babel/preset-env": "^7.16.11",
"@babel/preset-react": "^7.16.7",
"@babel/register": "^7.16.9",
"babel-loader": "^8.2.3",
"@babel/core": "^7.23.9",
"@babel/preset-env": "^7.23.9",
"@babel/preset-react": "^7.23.3",
"@babel/register": "^7.23.7",
"babel-loader": "^8.3.0",
"babel-plugin-module-resolver": "^4.1.0",
"circular-dependency-plugin": "^5.2.2",
"css-loader": "^6.5.1",
"postcss": "^8.4.5",
"css-loader": "^6.10.0",
"postcss": "^8.4.35",
"postcss-cli": "^9.1.0",
"postcss-csso": "^6.0.0",
"postcss-csso": "^6.0.1",
"postcss-easy-import": "^4.0.0",
"postcss-loader": "^6.2.1",
"stylelint": "^14.3.0",
"stylelint": "^14.16.1",
"stylelint-config-standard": "^24.0.0",
"webpack": "^5.73.0"
"webpack": "^5.90.3"
},
"dependencies": {
"buffer": "^6.0.3"

View File

@ -4,6 +4,7 @@ export {default as CustomCSS} from "./customcss";
export {default as VoiceDisconnect} from "./general/voicedisconnect";
export {default as MediaKeys} from "./general/mediakeys";
export {default as BDContextMenu} from "./general/contextmenu";
// export {default as EmoteModule} from "./emotes/emotes";
// export {default as EmoteMenu} from "./emotes/emotemenu";

View File

@ -134,7 +134,7 @@ export default new class CustomCSS extends Builtin {
save: this.saveCSS.bind(this),
update: this.insertCSS.bind(this),
openNative: this.openNative.bind(this),
onChange: this.onChange.bind(this)
onChange: Utilities.debounce(this.onChange.bind(this), 500)
});
FloatingWindows.open({

View File

@ -3,6 +3,9 @@ import path from "path";
import Builtin from "@structs/builtin";
import DataStore from "@modules/datastore";
import Strings from "@modules/strings";
import Modals from "@ui/modals";
const timestamp = () => new Date().toISOString().replace("T", " ").replace("Z", "");
@ -28,8 +31,9 @@ export default new class DebugLogs extends Builtin {
get category() {return "developer";}
get id() {return "debugLogs";}
enabled() {
async enabled() {
this.logFile = path.join(DataStore.dataFolder, "debug.log");
await this.checkFilesize();
this.stream = fs.createWriteStream(this.logFile, {flags: "a"});
this.stream.write(`\n\n================= Starting Debug Log (${timestamp()}) =================\n`);
for (const level of levels) {
@ -62,4 +66,24 @@ export default new class DebugLogs extends Builtin {
}
return sanitized.join(" ");
}
async checkFilesize() {
try {
// Not been created yet, no need to check filesize
if (!fs.existsSync(this.logFile)) return;
const stats = fs.statSync(this.logFile);
const mb = stats.size / (1024 * 1024);
if (mb < 100) return; // Under 100MB, all good
return new Promise(resolve => Modals.showConfirmationModal(Strings.Modals.additionalInfo, Strings.Modals.debuglog, {
confirmText: Strings.Modals.okay,
cancelText: Strings.Modals.cancel,
danger: true,
onConfirm: () => fs.rmSync(this.logFile),
onClose: resolve
}));
}
catch (e) {
this.error(e);
}
}
};

View File

@ -0,0 +1,121 @@
import Builtin from "@structs/builtin";
import Strings from "@modules/strings";
import Settings from "@modules/settingsmanager";
import Webpack from "@modules/webpackmodules";
import ContextMenuPatcher from "@modules/api/contextmenu";
import pluginManager from "@modules/pluginmanager";
import themeManager from "@modules/thememanager";
import Utilities from "@modules/utilities";
import React from "@modules/react";
const ContextMenu = new ContextMenuPatcher();
const UserSettingsWindow = Webpack.getByProps("open", "updateAccount");
export default new class BDContextMenu extends Builtin {
get name() {return "BDContextMenu";}
get category() {return "general";}
get id() {return "bdContextMenu";}
constructor() {
super(...arguments);
this.callback = this.callback.bind(this);
}
enabled() {
this.patch = ContextMenu.patch("user-settings-cog", this.callback);
}
disabled() {
this.patch?.();
}
callback(retVal) {
const target = Utilities.findInTree(retVal, b => Array.isArray(b) && b.some(e => e?.key?.toLowerCase() === "my_account"), {walkable: ["props", "children"]});
if (!target) return;
// Prevent conflict with plugin until its eradicated
if (target.some(e => e.props.label.toLowerCase() === "betterdiscord")) return;
// BetterDiscord Settings
const items = Settings.collections.map(c => this.buildCollectionMenu(c));
// Updater
items.push({
label: Strings.Panels.updates,
action: () => this.openCategory("updates")
});
// Custom CSS
if (Settings.get("settings", "customcss", "customcss")) {
items.push({
label: Strings.Panels.customcss,
action: () => this.openCategory("customcss")
});
}
// Plugins & Themes
items.push(this.buildAddonMenu(Strings.Panels.plugins, pluginManager));
items.push(this.buildAddonMenu(Strings.Panels.themes, themeManager));
// Parent SubMenu
const bdSubMenu = ContextMenu.buildItem({type: "submenu", label: "BetterDiscord", items: items});
const bdGroup = React.createElement(ContextMenu.Group, null, [bdSubMenu]);
target.push(bdGroup);
}
buildCollectionMenu(collection) {
return {
type: "submenu",
label: collection.name,
action: () => this.openCategory(collection.name),
items: collection.settings.map(category => {
return {
type: "submenu",
label: category.name,
action: () => this.openCategory(collection.name),
items: category.settings.filter(s => s.type === "switch" && !s.hidden && s.id !== this.id).map(setting => {
return {
type: "toggle",
label: setting.name,
disabled: setting.disabled,
active: Settings.get(collection.id, category.id, setting.id),
action: () => Settings.set(collection.id, category.id, setting.id, !Settings.get(collection.id, category.id, setting.id))
};
})
};
})
};
}
/**
* TODO: Can this be done better now that it's integrated?
* @param {string} label
* @param {import("../../modules/addonmanager").default} manager
* @returns
*/
buildAddonMenu(label, manager) {
const names = manager.addonList.map(a => a.name || a.getName()).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
return {
type: "submenu",
label: label,
action: () => this.openCategory(label.toLowerCase()),
items: names.map(name => {
return {
type: "toggle",
label: name,
disabled: manager.getAddon(name)?.partial ?? false,
active: manager.isEnabled(name),
action: () => manager.toggleAddon(name)
};
})
};
}
async openCategory(id) {
ContextMenu.close();
UserSettingsWindow?.open?.(id);
}
};

View File

@ -1,22 +1,15 @@
// fixed, improved, added, progress
export default {
description: "This update is just a hotfix for the recent Discord update!",
video: "https://www.youtube.com/embed/evyvq9eQTqA?si=opmzjGjUArT4VLrj&vq=hd720p&hd=1&rel=0&showinfo=0&mute=1&loop=1&autohide=1",
description: "This is just a quick fix for those using Discord Canary & PTB, and of course a pre-emptive fix for when they move these changes to Stable.",
changes: [
{
title: "What's Fixed?",
type: "improved",
items: [
"Patching webpack modules is now fixed for plugins.",
"Themes are placed later in the DOM than Discord's CSS giving them priority.",
"BetterDiscord's modals should all be working."
]
},
{
title: "What's not fixed?",
title: "Bugs Squashed",
type: "fixed",
items: [
"Individual plugins and themes will still need to make their own updates.",
"Fixed modal transition component being grabbed incorrectly.",
"Fixed custom modal stack not having an `ErrorBoundary` which caused any small issue to bubble up and prevent BetterDiscord startup."
]
}
},
]
};

View File

@ -6,7 +6,8 @@ export default [
settings: [
{type: "switch", id: "voiceDisconnect", value: false},
{type: "switch", id: "showToasts", value: true},
{type: "switch", id: "mediaKeys", value: false}
{type: "switch", id: "mediaKeys", value: false},
{type: "switch", id: "bdContextMenu", value: true}
]
},
{

View File

@ -1,6 +1,5 @@
import path from "path";
import fs from "fs";
import {shell} from "electron";
import Logger from "@common/logger";
@ -11,13 +10,16 @@ import Events from "./emitter";
import DataStore from "./datastore";
import React from "./react";
import Strings from "./strings";
import ipc from "./ipc";
import AddonEditor from "@ui/misc/addoneditor";
import FloatingWindows from "@ui/floatingwindows";
import Toasts from "@ui/toasts";
const openItem = shell.openItem || shell.openPath;
// const SWITCH_ANIMATION_TIME = 250;
const openItem = ipc.openPath;
const splitRegex = /[^\S\r\n]*?\r?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
const escapedAtRegex = /^\\@/;
@ -270,8 +272,21 @@ export default class AddonManager {
if (!addon || addon.partial) return;
if (this.state[addon.id]) return;
this.state[addon.id] = true;
this.startAddon(addon);
this.saveState();
this.emit("enabled", addon);
// setTimeout(() => {
this.startAddon(addon);
this.saveState();
// }, SWITCH_ANIMATION_TIME);
}
enableAllAddons() {
const originalSetting = Settings.get("settings", "general", "showToasts", false);
Settings.set("settings", "general", "showToasts", false);
for (let a = 0; a < this.addonList.length; a++) {
this.enableAddon(this.addonList[a]);
}
Settings.set("settings", "general", "showToasts", originalSetting);
this.emit("batch");
}
disableAddon(idOrAddon) {
@ -279,8 +294,21 @@ export default class AddonManager {
if (!addon || addon.partial) return;
if (!this.state[addon.id]) return;
this.state[addon.id] = false;
this.stopAddon(addon);
this.saveState();
this.emit("disabled", addon);
// setTimeout(() => {
this.stopAddon(addon);
this.saveState();
// }, SWITCH_ANIMATION_TIME);
}
disableAllAddons() {
const originalSetting = Settings.get("settings", "general", "showToasts", false);
Settings.set("settings", "general", "showToasts", false);
for (let a = 0; a < this.addonList.length; a++) {
this.disableAddon(this.addonList[a]);
}
Settings.set("settings", "general", "showToasts", originalSetting);
this.emit("batch");
}
toggleAddon(id) {

View File

@ -35,7 +35,8 @@ const ContextMenuActions = (() => {
}
startupComplete &&= typeof(out.closeContextMenu) === "function" && typeof(out.openContextMenu) === "function";
} catch (error) {
}
catch (error) {
startupComplete = false;
Logger.stacktrace("ContextMenu~Components", "Fatal startup error:", error);
@ -222,6 +223,7 @@ class ContextMenu {
// This is done to make sure the UI actually displays the on/off correctly
if (type === "toggle") {
// eslint-disable-next-line react-hooks/rules-of-hooks
const [active, doToggle] = React.useState(props.checked || false);
const originalAction = props.action;
props.checked = active;
@ -330,7 +332,8 @@ Object.freeze(ContextMenu.prototype);
try {
MenuPatcher.initialize();
} catch (error) {
}
catch (error) {
Logger.error("ContextMenu~Patcher", "Fatal error:", error);
}

View File

@ -1,10 +1,12 @@
import Remote from "../../polyfill/remote";
const methods = new Set(["GET", "PUT", "POST", "DELETE"]);
const redirects = new Set(["manual", "follow"]);
const methods = new Set(["GET", "PUT", "POST", "DELETE", "PATCH", "OPTIONS", "HEAD", "CONNECT", "TRACE"]);
const bodylessStatusCodes = new Set([101, 204, 205, 304]);
class FetchResponse extends Response {
constructor(options) {
super(options.content, {
super(bodylessStatusCodes.has(options.status) ? null : options.content, {
headers: new Headers(options.headers),
method: options.method ?? "GET",
body: options.content,
@ -34,12 +36,13 @@ const convertSignal = signal => {
/**
* @typedef {Object} FetchOptions
* @property {"GET" | "PUT" | "POST" | "DELETE"} [method] - Request method.
* @property {"GET" | "PUT" | "POST" | "DELETE" | "PATCH" | "OPTIONS" | "HEAD" | "CONNECT" | "TRACE"} [method] - Request method.
* @property {Record<string, string>} [headers] - Request headers.
* @property {"manual" | "follow"} [redirect] - Whether to follow redirects.
* @property {number} [maxRedirects] - Maximum amount of redirects to be followed.
* @property {AbortSignal} [signal] - Signal to abruptly cancel the request
* @property {Uint8Array | string} [body] - Defines a request body. Data must be serializable.
* @property {number} [timeout] - Request timeout time.
*/
/**
@ -55,8 +58,12 @@ export default function fetch(url, options = {}) {
data.headers = options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers;
}
if (typeof options.redirect === "string" && redirects.has(options.redirect)) data.redirect = options.redirect;
if (typeof options.body === "string" || options.body instanceof Uint8Array) data.body = options.body;
if (typeof options.method === "string" && methods.has(options.method)) data.method = options.method;
if (typeof options.maxRedirects === "number") data.maxRedirects = options.maxRedirects;
if (typeof options.timeout === "number") data.timeout = options.timeout;
if (options.signal instanceof AbortSignal) data.signal = convertSignal(options.signal);
let ctx;
@ -73,13 +80,13 @@ export default function fetch(url, options = {}) {
ctx.onComplete(() => {
try {
const data = ctx.readData();
const resultData = ctx.readData();
const req = new FetchResponse({
method: options.method ?? "GET",
status: data.statusCode,
status: resultData.statusCode,
...options,
...data
...resultData
});
resolve(req);

View File

@ -58,7 +58,7 @@ export default class BdApi {
get ContextMenu() {return ContextMenuAPI;}
Components = {
get Tooltip() {return DiscordModules.Tooltip;}
}
};
Net = {fetch};
}

View File

@ -50,6 +50,7 @@ const UI = {
* @param {string} [options.cancelText=Cancel] Text for the cancel button
* @param {callable} [options.onConfirm=NOOP] Callback to occur when clicking the submit button
* @param {callable} [options.onCancel=NOOP] Callback to occur when clicking the cancel button
* @param {callable} [options.onClose=NOOP] Callback to occur when exiting the modal
* @returns {string} The key used for this modal.
*/
showConfirmationModal(title, content, options = {}) {

View File

@ -4,11 +4,10 @@ import WebpackModules, {Filters} from "@modules/webpackmodules";
const getOptions = (args, defaultOptions = {}) => {
if (args.length > 1 &&
typeof(args[args.length - 1]) === "object" &&
!Array.isArray(args[args.length - 1]) &&
args[args.length - 1] !== null
) {
if (args.length > 1
&& typeof(args[args.length - 1]) === "object" // eslint-disable-line operator-linebreak
&& !Array.isArray(args[args.length - 1]) // eslint-disable-line operator-linebreak
&& args[args.length - 1] !== null) { // eslint-disable-line operator-linebreak
Object.assign(defaultOptions, args.pop());
}

View File

@ -1,51 +0,0 @@
import ClassName from "@structs/classname";
import Utilities from "./utilities";
import WebpackModules from "./webpackmodules";
const combineClasses = function (...props) {
return Object.assign({}, ...props.map(prop => WebpackModules.getByProps(...prop)));
};
const DiscordClassModules = Utilities.memoizeObject({
get Text() {
return combineClasses(
["size20", "size12"],
["selectable", "colorMuted"]
);
},
get Titles() {
return combineClasses(
["wrapper", "base"],
["defaultColor", "h4"]
);
},
get EmptyImage() {return WebpackModules.getByProps("emptyImage", "emptyHeader");},
get Modal() {return WebpackModules.getByProps("content", "root", "header", "close");},
get Scrollers() {return WebpackModules.getByProps("thin", "scrollerBase", "content");},
get Margins() {return WebpackModules.getByProps("marginXSmall", "marginBottom8");},
get Integrations() {return WebpackModules.getByProps("secondaryHeader", "detailsWrapper");},
get Card() {return WebpackModules.getByProps("card", "topDivider", "description");},
});
const emptyClassModule = new Proxy({}, {
get() {return "";}
});
const DiscordClasses = new Proxy(DiscordClassModules, {
get(list, item) {
if (list[item] === undefined) return emptyClassModule;
if (typeof(list[item]) === "string") return list[item];
return new Proxy(list[item], {
get(obj, prop) {
if (!(prop in obj)) return "";
return new ClassName(obj[prop]);
}
});
}
});
export default DiscordClasses;

View File

@ -12,151 +12,13 @@ import WebpackModules, {Filters} from "./webpackmodules";
export default Utilities.memoizeObject({
get React() {return WebpackModules.getByProps("createElement", "cloneElement");},
get ReactDOM() {return WebpackModules.getByProps("render", "findDOMNode");},
get Flux() {return WebpackModules.getByProps("connectStores");},
get Events() {return WebpackModules.getByPrototypes("setMaxListeners", "emit");},
/* Guild Info, Stores, and Utilities */
get GuildStore() {return WebpackModules.getByProps("getGuild");},
get SortedGuildStore() {return WebpackModules.getByProps("getSortedGuilds");},
get SelectedGuildStore() {return WebpackModules.getByProps("getLastSelectedGuildId");},
get GuildSync() {return WebpackModules.getByProps("getSyncedGuilds");},
get GuildInfo() {return WebpackModules.getByProps("getAcronym");},
get GuildChannelsStore() {return WebpackModules.getByProps("getChannels", "getDefaultChannel");},
get GuildMemberStore() {return WebpackModules.getByProps("getMember");},
get MemberCountStore() {return WebpackModules.getByProps("getMemberCounts");},
get GuildEmojiStore() {return WebpackModules.getByProps("getEmojis");},
get GuildActions() {return WebpackModules.getByProps("markGuildAsRead");},
get GuildPermissions() {return WebpackModules.getByProps("getGuildPermissions");},
/* Channel Store & Actions */
get ChannelStore() {return WebpackModules.getByProps("getChannel", "getDMFromUserId");},
get SelectedChannelStore() {return WebpackModules.getByProps("getLastSelectedChannelId");},
get ChannelActions() {return WebpackModules.getByProps("selectChannel");},
get PrivateChannelActions() {return WebpackModules.getByProps("openPrivateChannel");},
get ChannelSelector() {return WebpackModules.getByProps("selectGuild", "selectChannel");},
/* Current User Info, State and Settings */
get UserInfoStore() {return WebpackModules.getByProps("getToken");},
get LocaleStore() {return WebpackModules.getByProps("locale", "initialize");},
get ThemeStore() {return WebpackModules.getByProps("theme", "initialize");},
get AccountManager() {return WebpackModules.getByProps("register", "login");},
get UserSettingsUpdater() {return WebpackModules.getByProps("updateRemoteSettings");},
get OnlineWatcher() {return WebpackModules.getByProps("isOnline");},
get CurrentUserIdle() {return WebpackModules.getByProps("getIdleTime");},
get RelationshipStore() {return WebpackModules.getByProps("isBlocked", "getFriendIDs");},
get RelationshipManager() {return WebpackModules.getByProps("addRelationship");},
get MentionStore() {return WebpackModules.getByProps("getMentions");},
/* User Stores and Utils */
get UserStore() {return WebpackModules.getByProps("getCurrentUser", "getUser");},
get UserStatusStore() {return WebpackModules.getByProps("getStatus", "getState");},
get UserTypingStore() {return WebpackModules.getByProps("isTyping");},
get UserActivityStore() {return WebpackModules.getByProps("getActivity");},
get UserNameResolver() {return WebpackModules.getByProps("getName");},
get UserNoteStore() {return WebpackModules.getByProps("getNote");},
get UserNoteActions() {return WebpackModules.getByProps("updateNote");},
/* Emoji Store and Utils */
get EmojiInfo() {return WebpackModules.getByProps("isEmojiDisabled");},
get EmojiUtils() {return WebpackModules.getByProps("getGuildEmoji");},
get EmojiStore() {return WebpackModules.getByProps("getByCategory", "EMOJI_NAME_RE");},
/* Invite Store and Utils */
get InviteStore() {return WebpackModules.getByProps("getInvites");},
get InviteResolver() {return WebpackModules.getByProps("findInvite");},
get InviteActions() {return WebpackModules.getByProps("acceptInvite");},
/* Discord Objects & Utils */
get DiscordConstants() {return WebpackModules.getByProps("Permissions", "ActivityTypes", "StatusTypes");},
get DiscordPermissions() {return WebpackModules.getByProps("Permissions", "ActivityTypes", "StatusTypes").Permissions;},
get PermissionUtils() {return WebpackModules.getByProps("getHighestRole");},
get ColorConverter() {return WebpackModules.getByProps("hex2int");},
get ColorShader() {return WebpackModules.getByProps("darken");},
get TinyColor() {return WebpackModules.getByPrototypes("toRgb");},
get ClassResolver() {return WebpackModules.getByProps("getClass");},
get ButtonData() {return WebpackModules.getByProps("ButtonSizes");},
get IconNames() {return WebpackModules.getByProps("IconNames");},
get NavigationUtils() {return WebpackModules.getByProps("transitionTo", "replaceWith", "getHistory");},
/* Discord Messages */
get MessageStore() {return WebpackModules.getByProps("getMessages");},
get MessageActions() {return WebpackModules.getByProps("jumpToMessage", "_sendMessage");},
get MessageQueue() {return WebpackModules.getByProps("enqueue");},
get MessageParser() {return WebpackModules.getByProps("createMessage", "parse", "unparse");},
/* Text Processing */
get hljs() {return WebpackModules.getByProps("highlight", "highlightBlock");},
get InviteActions() {return WebpackModules.getByProps("createInvite");},
get SimpleMarkdown() {return WebpackModules.getByProps("parseBlock", "parseInline", "defaultOutput");},
/* Experiments */
get ExperimentStore() {return WebpackModules.getByProps("getExperimentOverrides");},
get ExperimentsManager() {return WebpackModules.getByProps("isDeveloper");},
get CurrentExperiment() {return WebpackModules.getByProps("getExperimentId");},
/* Images, Avatars and Utils */
get ImageResolver() {return WebpackModules.getByProps("getUserAvatarURL", "getGuildIconURL");},
get ImageUtils() {return WebpackModules.getByProps("getSizedImageSrc");},
get AvatarDefaults() {return WebpackModules.getByProps("getUserAvatarURL", "DEFAULT_AVATARS");},
/* Window, DOM, HTML */
get WindowInfo() {return WebpackModules.getByProps("isFocused", "windowSize");},
get TagInfo() {return WebpackModules.getByProps("VALID_TAG_NAMES");},
get DOMInfo() {return WebpackModules.getByProps("canUseDOM");},
/* Locale/Location and Time */
get LocaleManager() {return WebpackModules.getByProps("setLocale");},
get Moment() {return WebpackModules.getByProps("parseZone");},
get LocationManager() {return WebpackModules.getByProps("createLocation");},
get Timestamps() {return WebpackModules.getByProps("fromTimestamp");},
get TimeFormatter() {return WebpackModules.getByProps("dateFormat");},
/* Strings and Utils */
get Strings() {return WebpackModules.getByProps("Messages").Messages;},
get StringFormats() {return WebpackModules.getByProps("a", "z");},
get StringUtils() {return WebpackModules.getByProps("toASCII");},
/* URLs and Utils */
get URLParser() {return WebpackModules.getByProps("Url", "parse");},
get ExtraURLs() {return WebpackModules.getByProps("getArticleURL");},
/* Drag & Drop */
get DNDActions() {return WebpackModules.getByProps("beginDrag");},
get DNDSources() {return WebpackModules.getByProps("addTarget");},
get DNDObjects() {return WebpackModules.getByProps("DragSource");},
/* Media Stuff (Audio/Video) */
get MediaDeviceInfo() {return WebpackModules.getByProps("Codecs", "SUPPORTED_BROWSERS");},
get MediaInfo() {return WebpackModules.getByProps("getOutputVolume");},
get MediaEngineInfo() {return WebpackModules.getByProps("MediaEngineFeatures");},
get VoiceInfo() {return WebpackModules.getByProps("EchoCancellation");},
get VideoStream() {return WebpackModules.getByProps("getVideoStream");},
get SoundModule() {return WebpackModules.getByProps("playSound");},
/* Electron & Other Internals with Utils*/
get ElectronModule() {return WebpackModules.getByProps("setBadge");},
get Dispatcher() {return WebpackModules.getByProps("dispatch", "subscribe", "register");},
get PathUtils() {return WebpackModules.getByProps("hasBasename");},
get NotificationModule() {return WebpackModules.getByProps("showNotification");},
get RouterModule() {return WebpackModules.getByProps("Router");},
get APIModule() {return WebpackModules.getByProps("getAPIBaseURL");},
get AnalyticEvents() {return WebpackModules.getByProps("AnalyticEventConfigs");},
get KeyGenerator() {return WebpackModules.getByRegex(/"binary"/);},
get Buffers() {return WebpackModules.getByProps("INSPECT_MAX_BYTES", "kMaxLength");},
get DeviceStore() {return WebpackModules.getByProps("getDevices");},
get SoftwareInfo() {return WebpackModules.getByProps("os");},
get CurrentContext() {return WebpackModules.getByProps("setTagsContext");},
/* Commonly Used Classes */
get GuildClasses() {
const guildsWrapper = WebpackModules.getByProps("base", "guilds");
const guilds = WebpackModules.getByProps("wrapper", "acronym");
const pill = WebpackModules.getByProps("circleIconButton");
const listItem = WebpackModules.getModule(m => m.listItem && !m.pill && !m.sidebar);
return Object.assign({}, guildsWrapper, guilds, pill, listItem);
},
get LayerStack() {return WebpackModules.getByProps("pushLayer");},
get Tooltip() {
// Make fallback component just pass children, so it can at least render that.
const fallback = props => props.children?.({}) ?? null;

View File

@ -60,4 +60,8 @@ export default new class IPCRenderer {
getSystemAccentColor() {
return ipc.invoke(IPCEvents.GET_ACCENT_COLOR);
}
openPath(path) {
return ipc.send(IPCEvents.OPEN_PATH, path);
}
};

View File

@ -11,26 +11,22 @@ export default new class LocaleManager {
get defaultLocale() {return "en-US";}
constructor() {
this.locale = "";
this.strings = Utilities.extend({}, Locales[this.defaultLocale]);
}
initialize() {
this.setLocale(this.discordLocale);
LocaleStore?.addChangeListener((newLocale) => this.setLocale(newLocale));
this.setLocale();
LocaleStore?.addChangeListener(() => this.setLocale());
}
setLocale(newLocale) {
let newStrings;
if (newLocale != this.defaultLocale) {
newStrings = Locales[newLocale];
if (!newStrings) return this.setLocale(this.defaultLocale);
}
else {
newStrings = Locales[this.defaultLocale];
}
this.locale = newLocale;
Utilities.extendTruthy(this.strings, newStrings);
setLocale() {
// Reset to the default locale in case a language is incomplete
Utilities.extend(this.strings, Locales[this.defaultLocale]);
// Get the strings of the new language and extend if a translation exists
const newStrings = Locales[this.discordLocale];
if (newStrings) Utilities.extendTruthy(this.strings, newStrings);
Events.emit("strings-updated");
}
};

View File

@ -50,7 +50,7 @@
}
static makeOverride(patch) {
return function () {
return function BDPatcher() {
let returnValue;
if (!patch.children || !patch.children.length) return patch.originalFunction.apply(this, arguments);
for (const superPatch of patch.children.filter(c => c.type === "before")) {

View File

@ -57,6 +57,8 @@ export default new class PluginManager extends AddonManager {
saveAddon: this.saveAddon.bind(this),
editAddon: this.editAddon.bind(this),
deleteAddon: this.deleteAddon.bind(this),
enableAll: this.enableAllAddons.bind(this),
disableAll: this.disableAllAddons.bind(this),
prefix: this.prefix
})
});
@ -151,6 +153,7 @@ export default new class PluginManager extends AddonManager {
}
catch (err) {
this.state[addon.id] = false;
this.emit("disabled", addon);
Toasts.error(Strings.Addons.couldNotStart.format({name: addon.name, version: addon.version}));
Logger.stacktrace(this.name, `${addon.name} v${addon.version} could not be started.`, err);
return new AddonError(addon.name, addon.filename, Strings.Addons.enabled.format({method: "start()"}), {message: err.message, stack: err.stack}, this.prefix);

View File

@ -73,12 +73,16 @@ export default new class SettingsManager {
if (!this.state[collection.id]) this.state[collection.id] = {};
for (let cc = 0; cc < categories.length; cc++) {
const category = categories[cc];
if (category.type != "category") {if (!this.state[collection.id].hasOwnProperty(category.id)) this.state[collection.id][category.id] = category.value;}
if (category.type != "category") {
if (!this.state[collection.id].hasOwnProperty(category.id)) this.state[collection.id][category.id] = category.value;
category.defaultValue = category.value;
}
else {
if (!this.state[collection.id].hasOwnProperty(category.id)) this.state[collection.id][category.id] = {};
for (let s = 0; s < category.settings.length; s++) {
const setting = category.settings[s];
if (!this.state[collection.id][category.id].hasOwnProperty(setting.id)) this.state[collection.id][category.id][setting.id] = setting.value;
setting.defaultValue = setting.value;
if (setting.hasOwnProperty("disabled")) continue;
if (!setting.enableWith && !setting.disableWith) continue;
const pathString = setting.enableWith || setting.disableWith;
@ -131,6 +135,28 @@ export default new class SettingsManager {
this.saveCollection(id); // in case new things were added
}
resetCollection(id) {
const collection = this.collections.find(c => c.id == id);
if (!collection) return;
const categories = collection.settings;
for (let cc = 0; cc < categories.length; cc++) {
const category = categories[cc];
if (category.type != "category") {
// console.log("cat", collection.id, category.id, this.get(collection.id, category.id), category.value);
if (this.get(collection.id, category.id) == category.defaultValue) continue;
this.set(collection.id, category.id, category.defaultValue);
}
else {
for (let s = 0; s < category.settings.length; s++) {
const setting = category.settings[s];
// console.log("setting", collection.id, category.id, setting.id, this.get(collection.id, category.id, setting.id), setting.defaultValue);
if (this.get(collection.id, category.id, setting.id) == setting.defaultValue) continue;
this.set(collection.id, category.id, setting.id, setting.defaultValue);
}
}
}
}
onSettingChange(collection, category, id, value) {
this.state[collection][category][id] = value;
Events.dispatch("setting-updated", collection, category, id, value);

View File

@ -35,6 +35,8 @@ export default new class ThemeManager extends AddonManager {
saveAddon: this.saveAddon.bind(this),
editAddon: this.editAddon.bind(this),
deleteAddon: this.deleteAddon.bind(this),
enableAll: this.enableAllAddons.bind(this),
disableAll: this.disableAllAddons.bind(this),
prefix: this.prefix
})
});

View File

@ -87,7 +87,7 @@ export class CoreUpdater {
const data = await resp.json();
this.apiData = data;
const remoteVersion = data.tag_name.startsWith("v") ? data.tag_name.slice(1) : data.tag_name;
this.hasUpdate = remoteVersion > Config.version;
this.hasUpdate = semverComparator(Config.version, remoteVersion) > 0;
this.remoteVersion = remoteVersion;
if (!this.hasUpdate || !showNotice) return;

View File

@ -190,7 +190,8 @@ export default class WebpackModules {
if (!modules.hasOwnProperty(index)) continue;
let module = null;
try {module = modules[index];} catch {continue;}
try {module = modules[index];}
catch {continue;}
const {exports} = module;
if (!exports || exports === window || exports === document.documentElement || exports[Symbol.toStringTag] === "DOMTokenList") continue;
@ -199,7 +200,8 @@ export default class WebpackModules {
for (const key in exports) {
let foundModule = null;
let wrappedExport = null;
try {wrappedExport = exports[key];} catch {continue;}
try {wrappedExport = exports[key];}
catch {continue;}
if (!wrappedExport) continue;
if (wrappedFilter(wrappedExport, module, index)) foundModule = wrappedExport;
@ -522,6 +524,9 @@ export default class WebpackModules {
catch (error) {
Logger.stacktrace("WebpackModules", "Could not patch pushed module", error);
}
finally {
require.m[moduleId] = originalModule;
}
};
Object.assign(modules[moduleId], originalModule, {

View File

@ -22,6 +22,12 @@ originalFs.writeFile = (path, data, options) => fs.writeFile(path, data, Object.
export const createRequire = function (path) {
return mod => {
// Ignore relative require attempts because Discord
// erroneously does this a lot apparently which
// causes us to do filesystem accesses in our default
// switch statement mainly used for absolute paths
if (typeof(mod) === "string" && mod.startsWith("./")) return;
if (deprecated.has(mod)) {
Logger.warn("Remote~Require", `The "${mod}" module is marked as deprecated. ${deprecated.get(mod)}`);
}

View File

@ -1,50 +0,0 @@
// import Selector from "./selector";
/**
* Representation of a Class Name
**/
class ClassName {
/**
*
* @param {string} name - name of the class to represent
*/
constructor(name) {
this.value = name;
}
/**
* Concatenates new class names to the current one using spaces.
* @param {string} classNames - list of class names to add to this class name
* @returns {ClassName} returns self to allow chaining
*/
add(...classNames) {
for (let i = 0; i < classNames.length; i++) this.value += " " + classNames[i];
return this;
}
/**
* Returns the raw class name, this is how native function get the value.
* @returns {string} raw class name.
*/
toString() {
return this.value;
}
/**
* Returns the raw class name, this is how native function get the value.
* @returns {string} raw class name.
*/
valueOf() {
return this.value;
}
get single() {
return this.value.split(" ")[0];
}
get first() {
return this.value.split(" ")[0];
}
}
export default ClassName;

View File

@ -3,9 +3,9 @@ import Utilities from "@modules/utilities";
export default class SimpleMarkdownExt {
static parseToReact(str) {
static parseToReact(str, inline = true) {
if (!this._parser) this._initialize();
return this._renderer(this._parse(str, {inline: true}));
return this._renderer(this._parse(str, {inline}));
}
static _initialize() {

View File

@ -55,19 +55,8 @@
align-items: center;
}
.controls-section .checkbox-inner {
width: 14px;
height: 14px;
}
.controls-section .checkbox-inner .checkbox:checked + span::after {
left: 2px;
top: -2px;
}
.controls-section .checkbox-label {
font-size: 14px;
font-weight: 500;
.controls-section.controls-right {
gap: 15px;
}
.monaco-editor:not(.rename-box),

View File

@ -1,4 +1,4 @@
.bd-button {
/* .bd-button {
display: inline-flex;
justify-content: center;
align-items: center;
@ -59,4 +59,542 @@
.bd-button-disabled:hover {
cursor: not-allowed;
}
} */
/* Generic Button Styles */
.bd-button {
position: relative;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
background: none;
border: none;
border-radius: 3px;
font-size: 14px;
font-weight: 500;
line-height: 16px;
padding: 2px 16px;
user-select: none;
}
.bd-button:disabled {
cursor: not-allowed;
opacity: 0.5;
}
.bd-button .bd-button-content {
--button--underline-color: transparent;
background-image: linear-gradient(0deg, transparent, transparent 1px, var(--button--underline-color) 0, var(--button--underline-color) 2px, transparent 0);
display: flex;
justify-content: center;
align-items: center;
}
.bd-button:disabled .bd-button-content {
background-image: none !important;
}
.bd-button-outlined:disabled {
background-color: transparent !important;
}
/* Button Sizes */
.bd-button-tiny {
width: 52px;
height: 24px;
min-width: 52px;
min-height: 24px;
}
.bd-button-small {
width: 60px;
height: 32px;
min-width: 60px;
min-height: 32px;
}
.bd-button-medium {
width: 96px;
height: 38px;
min-width: 96px;
min-height: 38px;
}
.bd-button-large {
width: 130px;
height: 44px;
min-width: 130px;
min-height: 44px;
}
.bd-button-xlarge {
width: 148px;
height: 50px;
min-width: 148px;
min-height: 50px;
font-size: 16px;
line-height: normal;
padding: 2px 20px;
}
.bd-button-icon {
height: auto;
padding: 4px;
}
.bd-button-grow,
.bd-button-icon {
width: auto
}
/* Button Looks */
.bd-button-filled {
-webkit-transition: background-color .17s ease, color .17s ease;
transition: background-color .17s ease, color .17s ease
}
.bd-button-outlined {
-webkit-transition: color .17s ease, background-color .17s ease, border-color .17s ease;
transition: color .17s ease, background-color .17s ease, border-color .17s ease;
border-width: 1px;
border-style: solid
}
.bd-button-blank {
background: transparent;
color: currentColor;
border: 0;
/* padding: 0; */
margin: 0
}
.bd-button-filled .bd-button-content,
.bd-button-link .bd-button-content,
.bd-button-outlined .bd-button-content {
margin: 0 auto;
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
/* COLORS */
/* Color BD Brand */
.bd-button-filled.bd-button-color-brand {
color: var(--white-500);
background-color: #3E82E5; /* BD Blue */
}
.bd-button-filled.bd-button-color-brand:hover {
background-color: #3875CE;
}
.bd-button-filled.bd-button-color-brand:active {
background-color: #3268B7;
}
.bd-button-filled.bd-button-color-brand:disabled {
background-color: #3E82E5; /* BD Blue */
opacity: 0.4;
}
.bd-button-outlined.bd-button-color-brand {
color: var(--button-outline-brand-text);
border-color: var(--button-outline-brand-border);
}
.bd-button-outlined.bd-button-color-brand:hover {
background-color: var(--button-outline-brand-background-hover);
border-color: var(--button-outline-brand-border-hover);
color: var(--button-outline-brand-text-hover);
}
.bd-button-outlined.bd-button-color-brand:active {
background-color: var(--button-outline-brand-background-active);
border-color: var(--button-outline-brand-border-active);
color: var(--button-outline-brand-text-active);
}
.bd-button-link.bd-button-color-brand {
color: #3E82E5; /* BD Blue */
}
.bd-button-link.bd-button-color-brand:hover .bd-button-content {
--button--underline-color: #3E82E5; /* BD Blue */
}
/* Color Blurple */
.bd-button-filled.bd-button-color-blurple {
color: var(--white-500);
background-color: var(--brand-experiment)
}
.bd-button-filled.bd-button-color-blurple:hover {
background-color: var(--brand-experiment-560)
}
.bd-button-filled.bd-button-color-blurple:active {
background-color: var(--brand-experiment-600)
}
.bd-button-filled.bd-button-color-blurple:disabled {
background-color: var(--brand-experiment)
}
.bd-button-outlined.bd-button-color-blurple {
color: var(--button-outline-brand-text);
border-color: var(--button-outline-brand-border)
}
.bd-button-outlined.bd-button-color-blurple:hover {
background-color: var(--button-outline-brand-background-hover);
border-color: var(--button-outline-brand-border-hover);
color: var(--button-outline-brand-text-hover)
}
.bd-button-outlined.bd-button-color-blurple:active {
background-color: var(--button-outline-brand-background-active);
border-color: var(--button-outline-brand-border-active);
color: var(--button-outline-brand-text-active)
}
.bd-button-link.bd-button-color-blurple {
color: var(--brand-experiment)
}
.bd-button-link.bd-button-color-blurple:hover .bd-button-content {
--button--underline-color: var(--brand-experiment)
}
/* Color Yellow/Warn */
.bd-button-filled.bd-button-color-yellow {
color: var(--white-500);
background-color: var(--status-warning)
}
.bd-button-filled.bd-button-color-yellow:active,
.bd-button-filled.bd-button-color-yellow:hover {
background-color: null;
}
.bd-button-filled.bd-button-color-yellow:disabled {
background-color: var(--status-warning)
}
.bd-button-outlined.bd-button-color-yellow {
color: var(--status-warning);
border-color: var(--status-warning)
}
.bd-button-outlined.bd-button-color-yellow:active {
background-color: hsl(var(--yellow-300-hsl)/.1)
}
.bd-button-link.bd-button-color-yellow {
color: var(--status-warning)
}
.bd-button-link.bd-button-color-yellow:hover .bd-button-content {
--button--underline-color: var(--status-warning)
}
/* Color Link */
.bd-button-filled.bd-button-color-link {
color: var(--white-500);
background-color: var(--text-link)
}
.bd-button-filled.bd-button-color-link:active,
.bd-button-filled.bd-button-color-link:hover {
background-color: null
}
.bd-button-filled.bd-button-color-link:disabled {
background-color: var(--text-link)
}
.bd-button-outlined.bd-button-color-link {
color: var(--text-link);
border-color: var(--text-link)
}
.bd-button-outlined.bd-button-color-link:active {
background-color: hsl(var(--text-link-hsl)/.1)
}
.bd-button-link.bd-button-color-link {
color: var(--text-link)
}
.bd-button-link.bd-button-color-link:hover .bd-button-content {
--button--underline-color: var(--text-link)
}
/* Color White */
.bd-button-filled.bd-button-color-white {
color: var(--primary-500);
background-color: var(--white-500)
}
.bd-button-filled.bd-button-color-white:active,
.bd-button-filled.bd-button-color-white:hover {
background-color: null
}
.bd-button-filled.bd-button-color-white:disabled {
background-color: var(--white-500)
}
.bd-button-outlined.bd-button-color-white {
color: var(--white-500);
border-color: var(--white-500)
}
.bd-button-outlined.bd-button-color-white:active {
background-color: hsl(var(--white-500-hsl)/.1)
}
.bd-button-link.bd-button-color-white {
color: var(--white-500)
}
.bd-button-link.bd-button-color-white:hover .bd-button-content {
--button--underline-color: var(--white-500)
}
/* Color Red/Danger/Error */
.bd-button-filled.bd-button-color-red {
color: var(--white-500);
background-color: var(--button-danger-background)
}
.bd-button-filled.bd-button-color-red:hover {
background-color: var(--button-danger-background-hover)
}
.bd-button-filled.bd-button-color-red:active {
background-color: var(--button-danger-background-active)
}
.bd-button-filled.bd-button-color-red:disabled {
background-color: var(--button-danger-background-disabled)
}
.bd-button-outlined.bd-button-color-red {
color: var(--button-outline-danger-text);
border-color: var(--button-outline-danger-border)
}
.bd-button-outlined.bd-button-color-red:hover {
background-color: var(--button-outline-danger-background-hover);
border-color: var(--button-outline-danger-border-hover);
color: var(--button-outline-danger-text-hover)
}
.bd-button-outlined.bd-button-color-red:active {
background-color: var(--button-outline-danger-background-active);
border-color: var(--button-outline-danger-border-active);
color: var(--button-outline-danger-text-active)
}
.bd-button-link.bd-button-color-red {
color: var(--text-danger)
}
.bd-button-link.bd-button-color-red:hover .bd-button-content {
--button--underline-color: var(--text-danger)
}
/* Color Green Success */
.bd-button-filled.bd-button-color-green {
color: var(--white-500);
background-color: var(--button-positive-background)
}
.bd-button-filled.bd-button-color-green:hover {
background-color: var(--button-positive-background-hover)
}
.bd-button-filled.bd-button-color-green:active {
background-color: var(--button-positive-background-active)
}
.bd-button-filled.bd-button-color-green:disabled {
background-color: var(--button-positive-background-disabled)
}
.bd-button-outlined.bd-button-color-green {
color: var(--button-outline-positive-text);
border-color: var(--button-outline-positive-border)
}
.bd-button-outlined.bd-button-color-green:hover {
background-color: var(--button-outline-positive-background-hover);
border-color: var(--button-outline-positive-border-hover);
color: var(--button-outline-positive-text-hover)
}
.bd-button-outlined.bd-button-color-green:active {
background-color: var(--button-outline-positive-background-active);
border-color: var(--button-outline-positive-border-active);
color: var(--button-outline-positive-text-active)
}
.bd-button-link.bd-button-color-green {
color: var(--green-360)
}
.bd-button-link.bd-button-color-green:hover .bd-button-content {
--button--underline-color: var(--green-360)
}
/* Color Primary/Grey */
.bd-button-outlined.bd-button-color-primary {
color: var(--button-outline-primary-text);
border-color: var(--button-outline-primary-border)
}
.bd-button-outlined.bd-button-color-primary:hover {
background-color: var(--button-outline-primary-background-hover);
border-color: var(--button-outline-primary-border-hover);
color: var(--button-outline-primary-text-hover)
}
.bd-button-outlined.bd-button-color-primary:active {
background-color: var(--button-outline-primary-background-active);
border-color: var(--button-outline-primary-border-active);
color: var(--button-outline-primary-text-active)
}
.bd-button-filled.bd-button-color-primary {
color: var(--white-500);
background-color: var(--button-secondary-background)
}
.bd-button-filled.bd-button-color-primary:hover {
background-color: var(--button-secondary-background-hover)
}
.bd-button-filled.bd-button-color-primary:active {
background-color: var(--button-secondary-background-active)
}
.bd-button-filled.bd-button-color-primary:disabled {
background-color: var(--button-secondary-background-disabled)
}
.theme-dark .bd-button-link.bd-button-color-primary {
color: var(--white-500)
}
.theme-dark .bd-button-link.bd-button-color-primary:hover .bd-button-content {
--button--underline-color: var(--white-500)
}
.theme-light .bd-button-link.bd-button-color-primary {
color: var(--primary-400)
}
.theme-light .bd-button-link.bd-button-color-primary:hover .bd-button-content {
--button--underline-color: var(--primary-400)
}
/* Color Transparent */
.theme-dark .bd-button-filled.bd-button-color-transparent {
color: var(--primary-100);
background-color: hsl(var(--white-500-hsl)/.1)
}
.theme-dark .bd-button-filled.bd-button-color-transparent:hover {
background-color: hsl(var(--white-500-hsl)/.05)
}
.theme-dark .bd-button-filled.bd-button-color-transparent:active {
background-color: hsl(var(--white-500-hsl)/.01)
}
.theme-dark .bd-button-filled.bd-button-color-transparent:disabled {
background-color: hsl(var(--white-500-hsl)/.1)
}
.theme-dark .bd-button-outlined.bd-button-color-transparent {
color: var(--primary-200);
border-color: var(--primary-200)
}
.theme-dark .bd-button-outlined.bd-button-color-transparent:active {
background-color: hsl(var(--primary-200-hsl)/.1)
}
.theme-dark .bd-button-link.bd-button-color-transparent {
color: var(--primary-200)
}
.theme-dark .bd-button-link.bd-button-color-transparent:hover .bd-button-content {
--button--underline-color: var(--primary-200)
}
.theme-light .bd-button-filled.bd-button-color-transparent {
color: var(--primary-400);
background-color: hsl(var(--primary-400-hsl)/.01)
}
.theme-light .bd-button-filled.bd-button-color-transparent:hover {
background-color: hsl(var(--primary-400-hsl)/.2)
}
.theme-light .bd-button-filled.bd-button-color-transparent:active {
background-color: hsl(var(--primary-400-hsl)/.25)
}
.theme-light .bd-button-filled.bd-button-color-transparent:disabled {
background-color: hsl(var(--primary-400-hsl)/.01)
}
.theme-light .bd-button-outlined.bd-button-color-transparent {
color: var(--primary-400);
border-color: var(--primary-400)
}
.theme-light .bd-button-outlined.bd-button-color-transparent:active {
background-color: hsl(var(--primary-400-hsl)/.1)
}
.theme-light .bd-button-link.bd-button-color-transparent {
color: var(--primary-400)
}
.theme-light .bd-button-link.bd-button-color-transparent:hover .bd-button-content {
--button--underline-color: var(--primary-400)
}

View File

@ -6,6 +6,7 @@
@import "./buttons.css";
@import "./spinner.css";
@import "./search.css";
@import "./text.css";
.bd-chat-badge {
vertical-align: bottom;
@ -19,23 +20,6 @@
margin-left: 4px;
}
.bd-changelog-modal video,
.bd-changelog-modal img {
width: 100%;
border-radius: 5px;
outline: none;
}
.bd-changelog-modal code.inline {
padding: 0.2em;
margin: -0.2em 0;
border-radius: 3px;
font-size: 85%;
line-height: 1.125rem;
white-space: pre-wrap;
background: var(--background-secondary);
}
.bd-link {
text-decoration: none;
}

View File

@ -24,4 +24,18 @@
.bd-search-wrapper > svg {
margin-right: 2px;
fill: var(--interactive-normal);
}
.bd-search-wrapper > .bd-button {
margin-right: 2px;
background: none;
padding: 0;
}
.bd-search-wrapper > .bd-button > svg .fill {
fill: var(--interactive-normal);
}
.bd-search-wrapper > .bd-button:hover > svg .fill {
fill: var(--interactive-hover);
}

View File

@ -0,0 +1,86 @@
.bd-text-normal {
color: var(--text-normal);
}
.bd-text-muted {
color: var(--text-muted);
}
.bd-text-error {
color: var(--red-400);
}
.bd-text-brand {
color: var(--text-brand);
}
.bd-text-link {
color: var(--text-link);
}
.bd-header-primary {
color: var(--header-primary);
}
.bd-header-secondary {
color: var(--header-secondary);
}
.bd-text-yellow {
color: var(--text-warning);
}
.bd-text-green {
color: var(--text-positive);
}
.bd-text-red {
color: var(--status-danger);
}
.bd-text-white {
color: var(--white-500);
}
.bd-text-10 {
font-size: 10px;
line-height: 12px;
}
.bd-text-12 {
font-size: 12px;
line-height: 16px;
}
.bd-text-14 {
font-size: 14px;
line-height: 18px;
}
.bd-text-16 {
font-size: 16px;
line-height: 20px;
}
.bd-text-20 {
font-size: 20px;
line-height: 24px;
}
.bd-text-24 {
font-size: 24px;
line-height: 30px;
}
.bd-text-32 {
font-size: 32px;
line-height: 40px;
}
.bd-text-strong {
font-weight: 600;
}
.bd-selectable {
user-select: text;
}

View File

@ -17,6 +17,7 @@
}
.bd-controls,
.bd-controls-basic,
.bd-controls-advanced {
display: flex;
}
@ -27,7 +28,7 @@
.bd-addon-list.bd-grid-view {
display: grid;
grid-template-columns: auto auto;
grid-template-columns: 1fr 1fr;
column-gap: 10px;
row-gap: 10px;
}
@ -212,7 +213,7 @@
flex-wrap: wrap;
}
.bd-addon-controls .bd-search {
.bd-settings-title .bd-search {
font-size: 13px;
margin: 0;
width: 200px;
@ -236,7 +237,7 @@
}
.bd-addon-modal {
min-height: unset;
min-height: 0;
}
.bd-addon-modal-settings {
@ -261,35 +262,43 @@
margin-left: 10px;
}
.bd-addon-views .bd-view-button {
.bd-addon-controls .bd-button {
background-color: transparent;
padding: 3px 4px;
}
.bd-addon-views .bd-view-button svg {
.bd-addon-controls .bd-button svg {
fill: var(--interactive-normal);
}
.bd-addon-views .bd-view-button.selected svg {
.bd-addon-controls .bd-button.selected svg {
fill: #FFFFFF;
}
.bd-addon-views .bd-view-button:hover {
.bd-addon-controls .bd-button:hover {
background-color: var(--background-modifier-selected);
}
.bd-addon-views .bd-view-button:active {
.bd-addon-controls .bd-button:active {
background-color: var(--background-modifier-accent);
}
.bd-addon-views .bd-view-button.selected {
.bd-addon-controls .bd-button.selected {
background-color: #3E82E5;
}
.bd-addon-views .bd-view-button + .bd-view-button {
.bd-addon-controls .bd-button + .bd-button {
margin-left: 5px;
}
.bd-controls-basic .bd-button:active svg {
fill: #FFFFFF;
}
.bd-controls-basic .bd-button:active {
background-color: #3E82E5;
}
.bd-addon-list .bd-footer .bd-links,
.bd-addon-list .bd-footer .bd-links a,
.bd-addon-list .bd-footer .bd-addon-button {

View File

@ -165,7 +165,10 @@
}
.bd-settings-title {
display: flex;
justify-content: space-between;
color: var(--header-primary, #FFFFFF);
display: flex;
font-weight: 600;
cursor: default;
flex: 1;

View File

@ -0,0 +1,239 @@
.bd-changelog-modal iframe,
.bd-changelog-modal video,
.bd-changelog-modal img {
width: 100%;
border-radius: 5px;
outline: none;
}
.bd-changelog-modal code.inline {
padding: 0.2em;
margin: -0.2em 0;
border-radius: 3px;
font-size: 85%;
line-height: 1.125rem;
white-space: pre-wrap;
background: var(--background-secondary);
}
.bd-changelog-modal .bd-modal-content {
font-size: 16px;
line-height: 20px;
padding-bottom: 20px;
}
.bd-changelog-modal .bd-modal-content .emoji {
object-fit: contain;
width: 22px;
height: 22px;
}
.bd-changelog-modal .bd-modal-content h1 {
line-height: 20px;
font-size: 16px;
}
.bd-changelog-modal .bd-modal-content h1,
.bd-changelog-modal .bd-modal-content h2,
.bd-changelog-modal .bd-modal-content strong {
font-weight: 700;
}
.bd-changelog-modal .bd-modal-content em,
.bd-changelog-modal .bd-modal-content i {
font-style: italic;
}
.bd-changelog-modal .bd-modal-content p + p {
margin-top: 10px;
}
.bd-changelog-modal .bd-modal-content ol {
margin: 16px 0 16px 16px;
}
.bd-changelog-modal .bd-modal-content ol li {
list-style-type: decimal;
margin-bottom: 8px;
margin-left: 20px;
}
.bd-changelog-modal .bd-modal-content ul {
margin: 20px 0 8px 20px;
}
.bd-changelog-modal .bd-modal-content ul ul {
margin-top: 8px;
}
.bd-changelog-modal .bd-modal-content ul li {
position: relative;
list-style: none;
margin-bottom: 8px;
user-select: text;
}
.bd-changelog-modal .bd-modal-content ul li:last-child {
margin-bottom: 0;
}
.bd-changelog-modal .bd-modal-content ul li::before {
content: "";
position: absolute;
top: 10px;
left: -15px;
width: 6px;
height: 6px;
margin-top: -4px;
margin-left: -3px;
border-radius: 50%;
opacity: 0.3;
}
.bd-changelog-modal .bd-modal-content ul li li::before {
top: 12px;
height: 2px;
border-radius: 0;
}
.bd-changelog-modal .bd-modal-content img,
.bd-changelog-modal .bd-modal-content video,
.bd-changelog-modal .bd-modal-content iframe {
width: 100%;
}
.bd-changelog-modal .bd-modal-content iframe {
height: 346px;
}
.bd-changelog-modal .bd-modal-content a {
color: hsl(200, calc(var(--saturation-factor, 1) * 100%), 49.4%);
transition: 0.05s;
text-decoration: none;
}
.bd-changelog-modal .bd-modal-content a:hover {
text-decoration: underline;
}
.theme-dark .bd-changelog-modal .bd-modal-content ol,
.theme-dark .bd-changelog-modal .bd-modal-content p,
.theme-dark .bd-changelog-modal .bd-modal-content ul li {
color: hsl(210, calc(var(--saturation-factor, 1) * 9.3%), 78.8%);
}
.theme-dark .bd-changelog-modal .bd-modal-content ul li::before {
background-color: hsl(216, calc(var(--saturation-factor, 1) * 9.8%), 90%);
}
.theme-light .bd-changelog-modal .bd-modal-content ol,
.theme-light .bd-changelog-modal .bd-modal-content p,
.theme-light .bd-changelog-modal .bd-modal-content ul li {
color: hsl(223, calc(var(--saturation-factor, 1) * 5.8%), 52.9%);
}
.theme-light .bd-changelog-modal .bd-modal-content ul li::before {
background-color: hsl(223, calc(var(--saturation-factor, 1) * 5.8%), 52.9%);
}
.bd-changelog-title {
font-weight: 700;
font-size: 16px;
line-height: 20px;
text-transform: uppercase;
}
.bd-changelog-title {
display: flex;
align-items: center;
margin-top: 40px;
}
.bd-changelog-title.bd-changelog-first {
margin-top: 20px;
}
.bd-changelog-title::after {
content: "";
height: 1px;
flex: 1 1 auto;
margin-left: 4px;
opacity: .6;
}
.bd-changelog-added {
color: var(--text-positive);
}
.bd-changelog-added::after {
background-color: var(--info-positive-foreground);
}
.bd-changelog-fixed {
color: hsl(359, calc(var(--saturation-factor, 1)*87.3%), 59.8%);
}
.bd-changelog-fixed::after {
background-color: hsl(359, calc(var(--saturation-factor, 1)*87.3%), 59.8%);
}
.bd-changelog-progress {
color: var(--text-warning);
}
.bd-changelog-progress::after {
background-color: var(--info-warning-foreground);
}
.bd-changelog-improved {
color: hsl(235, calc(var(--saturation-factor, 1)*85.6%), 64.7%);
}
.bd-changelog-improved::after {
background-color: hsl(235, calc(var(--saturation-factor, 1)*85.6%), 64.7%);
}
.theme-dark .bd-changelog-improved {
color: hsl(235, calc(var(--saturation-factor, 1)*86.1%), 77.5%);
}
.theme-dark .bd-changelog-improved::after {
background-color: hsl(235, calc(var(--saturation-factor, 1)*86.1%), 77.5%);
}
.theme-dark .bd-changelog-modal iframe,
.theme-dark .bd-changelog-modal video,
.theme-dark .bd-changelog-modal img {
box-shadow: 0 2px 10px 0 hsl(var(0, calc(var(--saturation-factor, 1)*0%), 0%-hsl)/.2);
}
.theme-light .bd-changelog-modal iframe,
.theme-light .bd-changelog-modal video,
.theme-light .bd-changelog-modal img {
box-shadow: 0 2px 10px 0 hsl(var(0, calc(var(--saturation-factor, 1)*0%), 0%-hsl)/.1);
}
/* .socialLink-1qjJIk {
margin-right: 16px;
}
.theme-light .socialLink-1qjJIk {
color: hsl(228, calc(var(--saturation-factor, 1)*6%), 32.5%);
}
.theme-dark .socialLink-1qjJIk {
color: hsl(210, calc(var(--saturation-factor, 1)*9.3%), 78.8%);
} */
.bd-social {
opacity: 0.7;
transition: 0.17s ease opacity;
}
.bd-social:hover {
opacity: 1;
}
.bd-social + .bd-social {
margin-left: 10px;
}

View File

@ -78,4 +78,16 @@
scrollbar-color: var(--background-tertiary) var(--background-secondary);
background: var(--background-secondary);
border: 1px solid var(--background-tertiary);
}
.bd-addon-error-details {
display: flex;
flex-grow: 0;
justify-content: flex-start;
margin-top: 4px;
}
.bd-addon-error-details-icon {
margin-right: 4px;
color: var(--interactive-normal);
}

View File

@ -0,0 +1,124 @@
.bd-flex {
display: flex;
}
.bd-flex-align-start {
align-items: flex-start;
}
.bd-flex-align-end {
align-items: flex-end;
}
.bd-flex-align-center {
align-items: center;
}
.bd-flex-align-stretch {
align-items: stretch;
}
.bd-flex-align-baseline {
align-items: baseline
}
.bd-flex-justify-start {
justify-content: flex-start;
}
.bd-flex-justify-end {
justify-content: flex-end;
}
.bd-flex-justify-center {
justify-content: center;
}
.bd-flex-justify-around {
justify-content: space-around;
}
.bd-flex-justify-between {
justify-content: space-between;
}
.bd-flex-no-wrap {
flex-wrap: nowrap;
}
.bd-flex-wrap {
flex-wrap: wrap;
}
.bd-flex-wrap-reverse {
flex-wrap: wrap-reverse;
}
.bd-flex-horizontal {
flex-direction: row;
}
.bd-flex-reverse {
flex-direction: row-reverse;
}
.bd-flex-vertical {
flex-direction: column;
}
.spacer-2upayl {
flex: 1;
overflow: hidden;
}
.bd-flex-vertical {}
.bd-flex-horizontal {}
.bd-flex-reverse {}
.bd-flex-horizontal > .spacer-2upayl,
.bd-flex-reverse > .spacer-2upayl,
.bd-flex-vertical > .spacer-2upayl {
min-height: 1px;
}
.flexCenter-1Mwsxg {}
.bd-flex {}
.bd-flex-horizontal {}
.bd-flex-reverse {}
.bd-flex-horizontal > .bd-flex,
.bd-flex-horizontal > .bd-flex-child {
margin-left: 10px;
margin-right: 10px;
}
.bd-flex-horizontal > .bd-flex:first-child,
.bd-flex-horizontal > .bd-flex-child:first-child {
margin-left: 0;
}
.bd-flex-horizontal > .bd-flex:last-child,
.bd-flex-horizontal > .bd-flex-child:last-child {
margin-right: 0;
}
.bd-flex-reverse > .bd-flex,
.bd-flex-reverse > .bd-flex-child {
margin-left: 10px;
margin-right: 10px;
}
.bd-flex-reverse > .bd-flex:first-child,
.bd-flex-reverse > .bd-flex-child:first-child {
margin-right: 0;
}
.bd-flex-reverse > .bd-flex:last-child,
.bd-flex-reverse > .bd-flex-child:last-child {
margin-left: 0;
}

View File

@ -35,9 +35,15 @@
top: 3px;
display: flex;
align-items: center;
gap: 5px;
}
.bd-keybind-controls .bd-keybind-record {
padding: 4px 8px;
}
.bd-keybind-clear {
margin-left: 5px;
background: none!important;
opacity: 0.5;
padding-right: 4px!important;

View File

@ -71,3 +71,143 @@
@keyframes bd-modal-open {
from {transform: scale(0.7);}
}
.bd-modal-root {
display: flex;
flex-direction: column;
background-color: var(--modal-background);
border-radius: 4px;
margin: 0 auto;
pointer-events: all;
position: relative;
max-height: 100%;
}
.bd-close-button {
height: 26px;
padding: 4px;
transition: opacity 0.2s ease-in-out;
opacity: 0.5;
cursor: pointer;
border-radius: 3px;
color: var(--interactive-normal);
box-sizing: content-box;
}
.bd-close-button:hover {
opacity: 1;
color: var(--interactive-hover);
}
.bd-modal-small {
width: 440px;
max-height: 720px;
min-height: 200px;
}
.bd-modal-standard {
font-size: 13px;
white-space: pre-wrap;
word-wrap: break-word;
width: 490px;
max-height: 800px;
}
.bd-modal-medium {
width: 600px;
max-height: 800px;
min-height: 400px;
}
.bd-modal-large {
width: 800px;
max-height: 960px;
min-height: 400px;
}
.bd-modal-header,
.bd-modal-footer {
position: relative;
flex: 0 0 auto;
padding: 16px;
z-index: 1;
overflow-x: hidden;
}
.bd-modal-header {
border-radius: 4px 4px 0 0;
transition: box-shadow 0.1s ease-out;
word-wrap: break-word;
}
.bd-modal-footer {
border-radius: 0 0 5px 5px;
background-color: var(--modal-footer-background);
overflow: hidden;
box-shadow: inset 0 1px 0 hsl(var(--primary-630-hsl)/0.6);
}
.bd-modal-content {
position: relative;
z-index: 0;
border-radius: 5px 5px 0 0;
padding-left: 16px;
/* padding-right: 16px; */
overflow-x: hidden;
font-size: 16px;
line-height: 20px;
padding-bottom: 20px;
overflow: hidden scroll;
padding-right: 8px;
}
.bd-modal-backdrop {
position: fixed;
top: 0;
right: var(--devtools-sidebar-width,0);
bottom: 0;
left: 0;
-webkit-transform: translateZ(0);
transform: translateZ(0);
pointer-events: all;
}
#bd-modal-container {
position: absolute;
top: 0;
left: 0;
right: var(--devtools-sidebar-width,0);
bottom: 0;
background: none!important;
pointer-events: none;
z-index: 1002;
}
.bd-modal-layer {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.bd-modal-layer {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
min-height: 0;
padding-top: 40px;
padding-bottom: 40px;
}

View File

@ -0,0 +1,34 @@
.bd-scroller-base {
position: relative;
box-sizing: border-box;
min-height: 0;
flex: 1 1 auto;
}
.bd-scroller-thin {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thin-thumb) var(--scrollbar-thin-track);
}
.bd-scroller-thin::-webkit-scrollbar-track {
border-color: var(--scrollbar-thin-track);
background-color: var(--scrollbar-thin-track);
border: 2px solid var(--scrollbar-thin-track);
}
.bd-scroller-thin::-webkit-scrollbar {
width: 8px;
height: 8px;
}
.bd-scroller-thin::-webkit-scrollbar-corner {
background-color: transparent;
}
.bd-scroller-thin::-webkit-scrollbar-thumb {
background-clip: padding-box;
border: 2px solid transparent;
border-radius: 4px;
background-color: var(--scrollbar-thin-thumb);
min-height: 40px;
}

View File

@ -21,6 +21,7 @@
.bd-sidebar-header .bd-changelog-button {
height: 16px;
padding: 0;
}
.bd-sidebar-header .bd-icon {
@ -28,6 +29,6 @@
fill: var(--interactive-normal);
}
.bd-sidebar-header .bd-icon:hover {
.bd-sidebar-header .bd-changelog-button:hover .bd-icon {
fill: var(--interactive-hover);
}

View File

@ -5,6 +5,7 @@
justify-content: center;
align-items: center;
padding: 3px;
margin-right: 4px; /* Align with other icons */
}
.bd-empty-updates {
@ -20,4 +21,37 @@
.bd-empty-updates svg {
fill: #43B581;
margin-bottom: 20px;
}
.bd-button.bd-button-icon svg {
fill: var(--interactive-normal);
}
.bd-button.bd-button-icon:hover svg {
fill: var(--interactive-hover);
}
.bd-button.bd-button-icon.animate {
animation: 500ms linear infinite bd-update-spin;
}
.bd-button.bd-button-icon.no-animate {
animation: none !important;
}
.bd-settings-group-title .bd-button-icon {
margin-left: 3px;
margin-right: -8px;
}
@keyframes bd-update-spin {
0% {
transform: rotate(0);
}
50% {
transform: rotate(180deg)
}
100% {
transform: rotate(360deg)
}
}

View File

@ -0,0 +1,104 @@
import React from "@modules/react";
import Utilities from "@modules/utilities";
// S.Looks = y;
// S.Colors = I;
// S.BorderColors = O;
// S.Hovers = T;
// S.Sizes = v;
const {useCallback} = React;
export const Looks = Object.freeze({
FILLED: "bd-button-filled",
OUTLINED: "bd-button-outlined",
LINK: "bd-button-link",
BLANK: "bd-button-blank"
});
export const Colors = Object.freeze({
BRAND: "bd-button-color-brand",
BLURPLE: "bd-button-color-blurple",
RED: "bd-button-color-red",
GREEN: "bd-button-color-green",
YELLOW: "bd-button-color-yellow",
PRIMARY: "bd-button-color-primary",
LINK: "bd-button-color-link",
WHITE: "bd-button-color-white",
TRANSPARENT: "bd-button-color-transparent",
CUSTOM: ""
});
export const Sizes = Object.freeze({
NONE: "",
TINY: "bd-button-tiny",
SMALL: "bd-button-small",
MEDIUM: "bd-button-medium",
LARGE: "bd-button-large",
ICON: "bd-button-icon"
});
export default function Button({
className,
children,
onClick,
onKeyDown,
buttonRef,
disabled = false,
type = "button",
look = Looks.FILLED,
color = Colors.BRAND,
size = Sizes.MEDIUM,
grow = true,
...others
}) {
const handleClick = useCallback(event => {
event.preventDefault();
event.stopPropagation();
onClick?.(event);
}, [onClick]);
return <button {...others} className={
Utilities.className(
"bd-button",
className,
look,
color,
size,
grow ? "bd-button-grow" : ""
)}
ref={buttonRef}
type={type === "button" ? null : type}
onClick={disabled ? () => {} : handleClick}
onKeyDown={disabled ? () => {} : onKeyDown}
>
<div className="bd-button-content">{children}</div>
</button>;
}
Button.Looks = Looks;
Button.Colors = Colors;
Button.Sizes = Sizes;
// window.BDButton = Button;
// (() => {
// const buttons = [];
// for (const look in window.BDButton.Looks) {
// if (!window.BDButton.Looks[look] || look === "BLANK") continue;
// for (const color in window.BDButton.Colors) {
// if (!window.BDButton.Colors[color]) continue;
// for (const size in window.BDButton.Sizes) {
// if (!window.BDButton.Sizes[size]) continue;
// buttons.push(window.BdApi.React.createElement(window.BDButton, {
// look: window.BDButton.Looks[look],
// color: window.BDButton.Colors[color],
// size: window.BDButton.Sizes[size]
// }, "Hello World!"));
// buttons.push(window.BdApi.React.createElement("br"));
// }
// }
// }
// window.BdApi.showConfirmationModal("Buttons", buttons);
// })();

View File

@ -0,0 +1,76 @@
import React from "@modules/react";
import Utilities from "@modules/utilities";
export const Direction = Object.freeze({
VERTICAL: "bd-flex-vertical",
HORIZONTAL: "bd-flex-horizontal",
HORIZONTAL_REVERSE: "bd-flex-reverse"
});
export const Justify = Object.freeze({
START: "bd-flex-justify-start",
END: "bd-flex-justify-end",
CENTER: "bd-flex-justify-center",
BETWEEN: "bd-flex-justify-between",
AROUND: "bd-flex-justify-around"
});
export const Align = Object.freeze({
START: "bd-flex-align-start",
END: "bd-flex-align-end",
CENTER: "bd-flex-align-center",
STRETCH: "bd-flex-align-stretch",
BASELINE: "bd-flex-align-baseline"
});
export const Wrap = Object.freeze({
NO_WRAP: "bd-flex-no-wrap",
WRAP: "bd-flex-wrap",
WRAP_REVERSE: "bd-flex-wrap-reverse"
});
export function Child(props) {
if (!props.className) props.className = "";
props.className = Utilities.className(props.className, "bd-flex-child");
return <Flex {...props} />;
}
export default function Flex({
children,
className,
style,
shrink = 1,
grow = 1,
basis = "auto",
direction = Direction.HORIZONTAL,
align = Align.STRETCH,
justify = Justify.START,
wrap = Wrap.NO_WRAP
}) {
return <div
className={Utilities.className(
"bd-flex",
direction,
justify,
align,
wrap,
className
)}
style={Object.assign({
flexShrink: shrink,
flexGrow: grow,
flexBasis: basis
}, style)}
>
{children}
</div>;
}
Flex.Child = Child;
Flex.Direction = Direction;
Flex.Align = Align;
Flex.Justify = Justify;
Flex.Wrap = Wrap;

View File

@ -0,0 +1,39 @@
import React from "@modules/react";
import WebpackModules from "@modules/webpackmodules";
import DiscordModules from "@modules/discordmodules";
let DiscordMarkdown, rules;
function setupMarkdown() {
DiscordMarkdown = WebpackModules.find(m => m?.prototype?.render && m.rules);
rules = {};
if (DiscordMarkdown) {
rules = {
...DiscordMarkdown.rules,
link: DiscordModules.SimpleMarkdown.defaultRules.link
};
const originalLink = rules.link.react;
rules.link.react = function() {
const original = Reflect.apply(originalLink, undefined, arguments);
original.props.className = "bd-link";
original.props.target = "_blank";
original.props.rel = "noopener noreferrer";
return original;
};
}
}
export default function Markdown({className, children}) {
if (!DiscordMarkdown && !rules) setupMarkdown();
if (!DiscordMarkdown) return <div className="bd-markdown-fallback">{children}</div>;
return <DiscordMarkdown
className={className}
parser={DiscordModules.SimpleMarkdown.parserFor(rules)}
output={DiscordModules.SimpleMarkdown.reactFor(DiscordModules.SimpleMarkdown.ruleOutput(rules, "react"))}
>
{children}
</DiscordMarkdown>;
}

View File

@ -0,0 +1,55 @@
import React from "@modules/react";
import Utilities from "@modules/utilities";
export const Colors = Object.freeze({
STANDARD: "bd-text-normal",
MUTED: "bd-text-muted",
ERROR: "bd-text-error",
BRAND: "bd-text-brand",
LINK: "bd-text-link",
HEADER_PRIMARY: "bd-header-primary",
HEADER_SECONDARY: "bd-header-secondary",
STATUS_YELLOW: "bd-text-yellow",
STATUS_GREEN: "bd-text-green",
STATUS_RED: "bd-text-red",
ALWAYS_WHITE: "bd-text-white",
CUSTOM: null
});
export const Sizes = Object.freeze({
SIZE_10: "bd-text-10",
SIZE_12: "bd-text-12",
SIZE_14: "bd-text-14",
SIZE_16: "bd-text-16",
SIZE_20: "bd-text-20",
SIZE_24: "bd-text-24",
SIZE_32: "bd-text-32"
});
export default function Text({tag: Tag = "div", className, children, color = Colors.STANDARD, size = Sizes.SIZE_14, selectable, strong, style}) {
return <Tag
className={
Utilities.className(
color, size, className,
{
"bd-selectable": selectable,
"bd-text-strong": strong
}
)}
style={style}
>
{children}
</Tag>;
}
Text.Colors = Colors;
Text.Sizes = Sizes;
// te = WebpackModules.getModule(m => m?.Sizes?.SIZE_32 && m.Colors)
// foo = []
// for (const color in te.Colors) foo.push(BdApi.React.createElement(te, {color: te.Colors[color]}, color))
// for (const size in te.Sizes) foo.push(BdApi.React.createElement(te, {size: te.Sizes[size]}, size))
// BdApi.showConfirmationModal("Text Elements", foo)

View File

@ -1,13 +1,15 @@
import SimpleMarkdown from "@structs/markdown";
import React from "@modules/react";
import DiscordClasses from "@modules/discordclasses";
import WebpackModules from "@modules/webpackmodules";
const EmptyImageClasses = WebpackModules.getByProps("emptyImage", "emptyHeader") ?? {emptyContainer: "emptyContainer-poti7J", emptyImage: "emptyImage-2pCD2j", emptyHeader: "emptyHeader-2cxTFP"};
export default function EmptyImage(props) {
return <div className={`bd-empty-image-container ${DiscordClasses.EmptyImage.emptyContainer}` + (props.className ? ` ${props.className}` : "")}>
<div className={`bd-empty-image ${DiscordClasses.EmptyImage.emptyImage}`}></div>
<div className={`bd-empty-image-header ${DiscordClasses.EmptyImage.emptyHeader}`}>
return <div className={`bd-empty-image-container ${EmptyImageClasses.emptyContainer}` + (props.className ? ` ${props.className}` : "")}>
<div className={`bd-empty-image ${EmptyImageClasses.emptyImage}`}></div>
<div className={`bd-empty-image-header ${EmptyImageClasses.emptyHeader}`}>
{props.title || "You don't have anything!"}
</div>
<div className={`bd-empty-image-message`}>

View File

@ -1,23 +0,0 @@
import React from "@modules/react";
const {useState, useCallback} = React;
export default function Checkbox({checked: initialState, text, onChange: notifyParent}) {
const [checked, setChecked] = useState(initialState);
const onClick = useCallback(() => {
notifyParent?.(!checked);
setChecked(!checked);
}, [notifyParent, checked]);
return <div className="checkbox-item">
<div className="checkbox-label label-JWQiNe da-label">{text}</div>
<div className="checkbox-wrapper checkbox-3kaeSU da-checkbox checkbox-3EVISJ da-checkbox" onClick={onClick}>
<div className="checkbox-inner checkboxInner-3yjcPe da-checkboxInner">
<input className="checkbox checkboxElement-1qV33p da-checkboxElement" checked={checked} type="checkbox" />
<span></span>
</div>
<span></span>
</div>
</div>;
}

View File

@ -61,7 +61,7 @@ export default forwardRef(function CssEditor({css, openNative, update, save, onC
{label: <Refresh size="18px" />, tooltip: Strings.CustomCSS.update, onClick: updateCss},
{label: <Save size="18px" />, tooltip: Strings.CustomCSS.save, onClick: saveCss},
{label: <Edit size="18px" />, tooltip: Strings.CustomCSS.openNative, onClick: popoutNative},
{label: Strings.Collections.settings.customcss.liveUpdate.name, type: "checkbox", onChange: toggleLiveUpdate, checked: Settings.get("settings", "customcss", "liveUpdate"), side: "right"},
{label: Strings.Collections.settings.customcss.liveUpdate.name, type: "boolean", onChange: toggleLiveUpdate, checked: Settings.get("settings", "customcss", "liveUpdate"), side: "right"},
openDetached && {label: <Detach size="18px" />, tooltip: Strings.CustomCSS.openDetached, onClick: popout, side: "right"}
].filter(c => c)}
value={css}

View File

@ -2,7 +2,10 @@ import React from "@modules/react";
import DiscordModules from "@modules/discordmodules";
import Settings from "@modules/settingsmanager";
import Checkbox from "./checkbox";
import Button from "../base/button";
import Flex from "../base/flex";
import Switch from "../settings/components/switch";
import Text from "@ui/base/text";
const {useState, useCallback, useEffect, forwardRef, useMemo, useImperativeHandle} = React;
const ThemeStore = DiscordModules.ThemeStore;
@ -13,17 +16,20 @@ const languages = ["abap", "abc", "actionscript", "ada", "apache_conf", "asciido
function makeButton(button, value) {
return <DiscordModules.Tooltip color="primary" position="top" text={button.tooltip}>
{props => {
return <button {...props} className="btn btn-primary" onClick={(event) => {button.onClick(event, value?.());}}>{button.label}</button>;
return <Button {...props} size={Button.Sizes.ICON} look={Button.Looks.BLANK} onClick={(event) => {button.onClick(event, value?.());}}>{button.label}</Button>;
}}
</DiscordModules.Tooltip>;
}
function makeCheckbox(checkbox) {
return <Checkbox text={checkbox.label} onChange={checkbox.onChange} checked={checkbox.checked} />;
// <Switch disabled={disabled} checked={isEnabled} onChange={onChange} />
function makeSwitch(control) {
return <Flex align={Flex.Align.CENTER} style={{gap: "10px"}}>
<Text>{control.label}</Text>
<Switch onChange={control.onChange} checked={control.checked} />
</Flex>;
}
function buildControl(value, control) {
if (control.type == "checkbox") return makeCheckbox(control);
if (control.type == "boolean") return makeSwitch(control);
return makeButton(control, value);
}

View File

@ -15,7 +15,7 @@ export default class ErrorBoundary extends React.Component {
}
render() {
if (this.state.hasError) return <div onClick={() => IPC.openDevTools()} className="react-error">There was an unexpected Error. Click to open console for more details.</div>;
if (this.state.hasError && !this.props.hideError) return <div onClick={() => IPC.openDevTools()} className="react-error">There was an unexpected Error. Click to open console for more details.</div>;
return this.props.children;
}
}

View File

@ -0,0 +1,9 @@
import React from "@modules/react";
export default function Download(props) {
const size = props.size || "24px";
return <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style={{width: size, height: size}}>
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"/>
</svg>;
}

Some files were not shown because too many files have changed in this diff Show More