mirror of
https://github.com/Equicord/Equicord.git
synced 2025-06-15 09:33:03 -04:00
Merge remote-tracking branch 'upstream/i18n-fix' into dev
This commit is contained in:
commit
9316f11bf7
61 changed files with 174 additions and 110 deletions
|
@ -31,7 +31,7 @@ export default definePlugin({
|
|||
match: /let\{[^}]*lostPermissionTooltipText:\i[^}]*\}=(\i),/,
|
||||
replace: "$&vencordProps=$1,"
|
||||
}, {
|
||||
match: /\.Messages\.GUILD_OWNER(?=.+?decorators:(\i)\(\)).+?\1=?\(\)=>.+?children:\[/,
|
||||
match: /#{intl::GUILD_OWNER}(?=.+?decorators:(\i)\(\)).+?\1=?\(\)=>.+?children:\[/,
|
||||
replace: "$&...(typeof vencordProps=='undefined'?[]:Vencord.Api.MemberListDecorators.__getDecorators(vencordProps)),"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -25,7 +25,7 @@ export default definePlugin({
|
|||
authors: [Devs.Cyn],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.REMOVE_ATTACHMENT_BODY",
|
||||
find: "#{intl::REMOVE_ATTACHMENT_BODY}",
|
||||
replacement: {
|
||||
match: /(?<=.container\)?,children:)(\[.+?\])/,
|
||||
replace: "Vencord.Api.MessageAccessories._modifyAccessories($1,this.props)",
|
||||
|
|
|
@ -27,7 +27,7 @@ export default definePlugin({
|
|||
{
|
||||
find: '"Message Username"',
|
||||
replacement: {
|
||||
match: /\.Messages\.GUILD_COMMUNICATION_DISABLED_BOTTOM_SHEET_TITLE.+?}\),\i(?=\])/,
|
||||
match: /#{intl::GUILD_COMMUNICATION_DISABLED_BOTTOM_SHEET_TITLE}.+?}\),\i(?=\])/,
|
||||
replace: "$&,...Vencord.Api.MessageDecorations.__addDecorationsToMessage(arguments[0])"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ export default definePlugin({
|
|||
authors: [Devs.Arjix, Devs.hunt, Devs.Ven],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.EDIT_TEXTAREA_HELP",
|
||||
find: "#{intl::EDIT_TEXTAREA_HELP}",
|
||||
replacement: {
|
||||
match: /(shouldRefocus:!1.+?value:\i,channel:\i}\)\.then\()(.+?)(?=return \i\.content!==this\.props\.message\.content&&\i\((.+?)\))/,
|
||||
replace: (_, rest1, rest2, args) => "" +
|
||||
|
|
|
@ -24,9 +24,9 @@ export default definePlugin({
|
|||
description: "API to add buttons to message popovers.",
|
||||
authors: [Devs.KingFish, Devs.Ven, Devs.Nuckyz],
|
||||
patches: [{
|
||||
find: "Messages.MESSAGE_UTILITIES_A11Y_LABEL",
|
||||
find: "#{intl::MESSAGE_UTILITIES_A11Y_LABEL}",
|
||||
replacement: {
|
||||
match: /\.jsx\)\((\i\.\i),\{label:\i\.\i\.Messages\.MESSAGE_ACTION_REPLY.{0,200}?"reply-self".{0,50}?\}\):null(?=,.+?message:(\i))/,
|
||||
match: /\.jsx\)\((\i\.\i),\{label:\i\.\i\.string\(\i\.\i#{intl::MESSAGE_ACTION_REPLY}.{0,200}?"reply-self".{0,50}?\}\):null(?=,.+?message:(\i))/,
|
||||
replace: "$&,Vencord.Api.MessagePopover._buildPopoverElements($1,$2)"
|
||||
}
|
||||
}],
|
||||
|
|
|
@ -25,9 +25,9 @@ export default definePlugin({
|
|||
description: "Api required for plugins that modify the server list",
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.DISCODO_DISABLED",
|
||||
find: "#{intl::DISCODO_DISABLED}",
|
||||
replacement: {
|
||||
match: /(?<=Messages\.DISCODO_DISABLED.+?return)(\(.{0,75}?tutorialContainer.+?}\))(?=}function)/,
|
||||
match: /(?<=#{intl::DISCODO_DISABLED}.+?return)(\(.{0,75}?tutorialContainer.+?}\))(?=}function)/,
|
||||
replace: "[$1].concat(Vencord.Api.ServerList.renderAll(Vencord.Api.ServerList.ServerListRenderPosition.Above))"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -56,7 +56,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: "Messages.ACTIVITY_SETTINGS",
|
||||
find: "#{intl::ACTIVITY_SETTINGS}",
|
||||
replacement: [
|
||||
{
|
||||
match: /(?<=section:(.{0,50})\.DIVIDER\}\))([,;])(?=.{0,200}(\i)\.push.{0,100}label:(\i)\.header)/,
|
||||
|
@ -69,7 +69,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: "Messages.USER_SETTINGS_ACTIONS_MENU_LABEL",
|
||||
find: "#{intl::USER_SETTINGS_ACTIONS_MENU_LABEL}",
|
||||
replacement: {
|
||||
match: /(?<=function\((\i),\i\)\{)(?=let \i=Object.values\(\i.\i\).*?(\i\.\i)\.open\()/,
|
||||
replace: "$2.open($1);return;"
|
||||
|
|
|
@ -147,7 +147,7 @@ export default definePlugin({
|
|||
settings,
|
||||
|
||||
patches: [{
|
||||
find: ".BEGINNING_DM.format",
|
||||
find: "#{intl::BEGINNING_DM}",
|
||||
replacement: {
|
||||
match: /BEGINNING_DM\.format\(\{.+?\}\),(?=.{0,300}(\i)\.isMultiUserDM)/,
|
||||
replace: "$& $self.renderContributorDmWarningCard({ channel: $1 }),"
|
||||
|
|
|
@ -69,7 +69,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.ACCOUNT_SPEAKING_WHILE_MUTED",
|
||||
find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}",
|
||||
group: true,
|
||||
replacement: [
|
||||
{
|
||||
|
|
|
@ -41,7 +41,7 @@ export default definePlugin({
|
|||
},
|
||||
{
|
||||
// Status emojis
|
||||
find: ".Messages.GUILD_OWNER,",
|
||||
find: "#{intl::GUILD_OWNER}",
|
||||
replacement: {
|
||||
match: /(?<=\.activityEmoji,.+?animate:)\i/,
|
||||
replace: "!0"
|
||||
|
|
|
@ -88,9 +88,9 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.ATTACHMENT_UTILITIES_SPOILER",
|
||||
find: "#{intl::ATTACHMENT_UTILITIES_SPOILER}",
|
||||
replacement: {
|
||||
match: /(?<=children:\[)(?=.{10,80}tooltip:.{0,100}\i\.\i\.Messages\.ATTACHMENT_UTILITIES_SPOILER)/,
|
||||
match: /(?<=children:\[)(?=.{10,80}tooltip:.{0,100}#{intl::ATTACHMENT_UTILITIES_SPOILER})/,
|
||||
replace: "arguments[0].canEdit!==false?$self.renderIcon(arguments[0]):null,"
|
||||
},
|
||||
},
|
||||
|
|
|
@ -36,7 +36,7 @@ export default definePlugin({
|
|||
settings,
|
||||
patches: [
|
||||
{
|
||||
find: "BAN_CONFIRM_TITLE.",
|
||||
find: "#{intl::BAN_CONFIRM_TITLE}",
|
||||
replacement: {
|
||||
match: /src:\i\("?\d+"?\)/g,
|
||||
replace: "src:$self.source"
|
||||
|
|
|
@ -172,7 +172,7 @@ export default definePlugin({
|
|||
// Disable expanding and collapsing folders transition in the normal GuildsBar sidebar
|
||||
{
|
||||
predicate: () => !settings.store.keepIcons,
|
||||
match: /(?<=\.Messages\.SERVER_FOLDER_PLACEHOLDER.+?useTransition\)\()/,
|
||||
match: /(?<=#{intl::SERVER_FOLDER_PLACEHOLDER}.+?useTransition\)\()/,
|
||||
replace: "$self.shouldShowTransition(arguments[0])&&"
|
||||
},
|
||||
// If we are rendering the normal GuildsBar sidebar, we avoid rendering guilds from folders that are expanded
|
||||
|
@ -205,7 +205,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.DISCODO_DISABLED",
|
||||
find: "#{intl::DISCODO_DISABLED}",
|
||||
predicate: () => settings.store.closeAllHomeButton,
|
||||
replacement: {
|
||||
// Close all folders when clicking the home button
|
||||
|
|
|
@ -34,9 +34,9 @@ export default definePlugin({
|
|||
},
|
||||
},
|
||||
{
|
||||
find: ".Messages.GIF,",
|
||||
find: "#{intl::GIF}",
|
||||
replacement: {
|
||||
match: /alt:(\i)=(\i\.\i\.Messages\.GIF)(?=,[^}]*\}=(\i))/,
|
||||
match: /alt:(\i)=(\i\.\i\.string\(\i\.\i#{intl::GIF}\))(?=,[^}]*\}=(\i))/,
|
||||
replace:
|
||||
// rename prop so we can always use default value
|
||||
"alt_$$:$1=$self.altify($3)||$2",
|
||||
|
|
|
@ -63,9 +63,9 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: "Messages.NOTE_PLACEHOLDER",
|
||||
find: "#{intl::NOTE_PLACEHOLDER}",
|
||||
replacement: {
|
||||
match: /\.NOTE_PLACEHOLDER,/,
|
||||
match: /#{intl::NOTE_PLACEHOLDER}\),/,
|
||||
replace: "$&spellCheck:!$self.noSpellCheck,"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.AUTH_SESSIONS_SESSION_LOG_OUT",
|
||||
find: "#{intl::AUTH_SESSIONS_SESSION_LOG_OUT}",
|
||||
replacement: [
|
||||
// Replace children with a single label with state
|
||||
{
|
||||
|
|
|
@ -113,18 +113,16 @@ export default definePlugin({
|
|||
],
|
||||
predicate: () => settings.store.disableFade
|
||||
},
|
||||
{
|
||||
// Load menu TOC eagerly
|
||||
find: "Messages.USER_SETTINGS_WITH_BUILD_OVERRIDE.format",
|
||||
{ // Load menu TOC eagerly
|
||||
find: "#{intl::USER_SETTINGS_WITH_BUILD_OVERRIDE}",
|
||||
replacement: {
|
||||
match: /(\i)\(this,"handleOpenSettingsContextMenu",.{0,100}?null!=\i&&.{0,100}?(await Promise\.all[^};]*?\)\)).*?,(?=\1\(this)/,
|
||||
replace: "$&(async ()=>$2)(),"
|
||||
},
|
||||
predicate: () => settings.store.eagerLoad
|
||||
},
|
||||
{
|
||||
// Settings cog context menu
|
||||
find: "Messages.USER_SETTINGS_ACTIONS_MENU_LABEL",
|
||||
{ // Settings cog context menu
|
||||
find: "#{intl::USER_SETTINGS_ACTIONS_MENU_LABEL}",
|
||||
replacement: [
|
||||
{
|
||||
match: /(EXPERIMENTS:.+?)(\(0,\i.\i\)\(\))(?=\.filter\(\i=>\{let\{section:\i\}=)/,
|
||||
|
|
|
@ -25,7 +25,7 @@ export default definePlugin({
|
|||
authors: [Devs.Obsidian, Devs.Nuckyz],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.PREVIEW_BYTES_LEFT.format(",
|
||||
find: "#{intl::PREVIEW_BYTES_LEFT}",
|
||||
replacement: {
|
||||
match: /\.footerGap.+?url:\i,fileName:\i,fileSize:\i}\),(?<=fileContents:(\i),bytesLeft:(\i).+?)/g,
|
||||
replace: "$&$self.addCopyButton({fileContents:$1,bytesLeft:$2}),"
|
||||
|
|
|
@ -67,7 +67,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.ERRORS_UNEXPECTED_CRASH",
|
||||
find: "#{intl::ERRORS_UNEXPECTED_CRASH}",
|
||||
replacement: {
|
||||
match: /this\.setState\((.+?)\)/,
|
||||
replace: "$self.handleCrash(this,$1);"
|
||||
|
|
|
@ -41,7 +41,7 @@ export default definePlugin({
|
|||
{
|
||||
find: "DefaultCustomizationSections",
|
||||
replacement: {
|
||||
match: /(?<=USER_SETTINGS_AVATAR_DECORATION},"decoration"\),)/,
|
||||
match: /(?<=#{intl::USER_SETTINGS_AVATAR_DECORATION}\)},"decoration"\),)/,
|
||||
replace: "$self.DecorSection(),"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -27,7 +27,7 @@ export default definePlugin({
|
|||
authors: [Devs.Nuckyz],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.BOT_CALL_IDLE_DISCONNECT",
|
||||
find: "#{intl::BOT_CALL_IDLE_DISCONNECT_2}",
|
||||
replacement: {
|
||||
match: /,?(?=\i\(this,"idleTimeout",new \i\.\i\))/,
|
||||
replace: ";return;"
|
||||
|
|
|
@ -285,7 +285,7 @@ export default definePlugin({
|
|||
},
|
||||
// Remove boost requirements to stream with high quality
|
||||
{
|
||||
find: "STREAM_FPS_OPTION.format",
|
||||
find: "#{intl::STREAM_FPS_OPTION}",
|
||||
predicate: () => settings.store.enableStreamQualityBypass,
|
||||
replacement: {
|
||||
match: /guildPremiumTier:\i\.\i\.TIER_\d,?/g,
|
||||
|
@ -356,7 +356,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: ".Messages.STICKER_POPOUT_UNJOINED_PRIVATE_GUILD_DESCRIPTION.format",
|
||||
find: "#{intl::STICKER_POPOUT_UNJOINED_PRIVATE_GUILD_DESCRIPTION}",
|
||||
predicate: () => settings.store.transformStickers,
|
||||
replacement: [
|
||||
{
|
||||
|
@ -381,7 +381,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.EMOJI_POPOUT_UNJOINED_DISCOVERABLE_GUILD_DESCRIPTION",
|
||||
find: "#{intl::EMOJI_POPOUT_UNJOINED_DISCOVERABLE_GUILD_DESCRIPTION}",
|
||||
predicate: () => settings.store.transformEmojis,
|
||||
replacement: {
|
||||
// Add the fake nitro emoji notice
|
||||
|
|
|
@ -126,7 +126,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".USER_SETTINGS_RESET_PROFILE_THEME",
|
||||
find: "#{intl::USER_SETTINGS_RESET_PROFILE_THEME}",
|
||||
replacement: {
|
||||
match: /RESET_PROFILE_THEME}\)(?<=color:(\i),.{0,500}?color:(\i),.{0,500}?)/,
|
||||
replace: "$&,$self.addCopy3y3Button({primary:$1,accent:$2})"
|
||||
|
|
|
@ -27,7 +27,7 @@ export default definePlugin({
|
|||
authors: [Devs.D3SOX, Devs.Nickyux],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.GUILD_OWNER,",
|
||||
find: "#{intl::GUILD_OWNER}",
|
||||
replacement: {
|
||||
match: /,isOwner:(\i),/,
|
||||
replace: ",_isOwner:$1=$self.isGuildOwner(e),"
|
||||
|
|
|
@ -26,7 +26,7 @@ export default definePlugin({
|
|||
{
|
||||
find: ".PANEL}),nicknameIcons",
|
||||
replacement: {
|
||||
match: /USER_PROFILE_MEMBER_SINCE,.{0,100}userId:(\i\.id)}\)}\)/,
|
||||
match: /#{intl::USER_PROFILE_MEMBER_SINCE}\),.{0,100}userId:(\i\.id)}\)}\)/,
|
||||
replace: "$&,$self.FriendsSinceComponent({userId:$1,isSidebar:true})"
|
||||
}
|
||||
},
|
||||
|
@ -34,7 +34,7 @@ export default definePlugin({
|
|||
{
|
||||
find: "action:\"PRESS_APP_CONNECTION\"",
|
||||
replacement: {
|
||||
match: /USER_PROFILE_MEMBER_SINCE,.{0,100}userId:(\i\.id),.{0,100}}\)}\),/,
|
||||
match: /#{intl::USER_PROFILE_MEMBER_SINCE}\),.{0,100}userId:(\i\.id),.{0,100}}\)}\),/,
|
||||
replace: "$&,$self.FriendsSinceComponent({userId:$1,isSidebar:false}),"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -92,7 +92,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.ACCOUNT_SPEAKING_WHILE_MUTED",
|
||||
find: "#{intl::ACCOUNT_SPEAKING_WHILE_MUTED}",
|
||||
replacement: {
|
||||
match: /this\.renderNameZone\(\).+?children:\[/,
|
||||
replace: "$&$self.GameActivityToggleButton(),"
|
||||
|
|
|
@ -166,7 +166,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.WELCOME_CTA_LABEL",
|
||||
find: "#{intl::WELCOME_CTA_LABEL}",
|
||||
replacement: {
|
||||
match: /innerClassName:\i\.welcomeCTAButton,(?<={channel:\i,message:\i}=(\i).{0,400}?)/,
|
||||
replace: "$&onContextMenu:(vcEvent)=>$self.pickSticker(vcEvent, $1),"
|
||||
|
|
|
@ -260,9 +260,9 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.SETTINGS_GAMES_TOGGLE_OVERLAY",
|
||||
find: "#{intl::SETTINGS_GAMES_TOGGLE_OVERLAY}",
|
||||
replacement: {
|
||||
match: /\.Messages\.SETTINGS_GAMES_TOGGLE_OVERLAY.+?}\(\),(?<={overlay:\i,.+?=(\i),.+?)(?=!(\i))/,
|
||||
match: /#{intl::SETTINGS_GAMES_TOGGLE_OVERLAY}.+?}\(\),(?<={overlay:\i,.+?=(\i),.+?)(?=!(\i))/,
|
||||
replace: (m, props, nowPlaying) => `${m}$self.renderToggleGameActivityButton(${props},${nowPlaying}),`
|
||||
}
|
||||
},
|
||||
|
|
|
@ -32,7 +32,7 @@ export default definePlugin({
|
|||
patches: [
|
||||
// Counts header
|
||||
{
|
||||
find: ".FRIENDS_ALL_HEADER",
|
||||
find: "#{intl::FRIENDS_ALL_HEADER}",
|
||||
replacement: {
|
||||
match: /toString\(\)\}\);case (\i\.\i)\.BLOCKED/,
|
||||
replace: 'toString()});case $1.IMPLICIT:return "Implicit — "+arguments[1];case $1.BLOCKED'
|
||||
|
@ -48,7 +48,7 @@ export default definePlugin({
|
|||
},
|
||||
// Sections header
|
||||
{
|
||||
find: ".FRIENDS_SECTION_ONLINE",
|
||||
find: "#{intl::FRIENDS_SECTION_ONLINE}",
|
||||
replacement: {
|
||||
match: /(\(0,\i\.jsx\)\(\i\.TabBar\.Item,\{id:\i\.\i)\.BLOCKED,className:([^\s]+?)\.item,children:\i\.\i\.Messages\.BLOCKED\}\)/,
|
||||
replace: "$1.IMPLICIT,className:$2.item,children:\"Implicit\"}),$&"
|
||||
|
|
|
@ -108,7 +108,7 @@ export default definePlugin({
|
|||
patches: [
|
||||
{
|
||||
// Indicator
|
||||
find: ".Messages.MESSAGE_EDITED,",
|
||||
find: "#{intl::MESSAGE_EDITED}",
|
||||
replacement: {
|
||||
match: /let\{className:\i,message:\i[^}]*\}=(\i)/,
|
||||
replace: "try {$1 && $self.INV_REGEX.test($1.message.content) ? $1.content.push($self.indicator()) : null } catch {};$&"
|
||||
|
|
|
@ -62,7 +62,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".LOADING_DID_YOU_KNOW",
|
||||
find: "#{intl::LOADING_DID_YOU_KNOW}",
|
||||
replacement: [
|
||||
{
|
||||
match: /"_loadingText".+?(?=(\i)\[.{0,10}\.random)/,
|
||||
|
|
|
@ -74,7 +74,7 @@ export default definePlugin({
|
|||
{
|
||||
find: ".invitesDisabledTooltip",
|
||||
replacement: {
|
||||
match: /\.VIEW_AS_ROLES_MENTIONS_WARNING.{0,100}(?=])/,
|
||||
match: /#{intl::VIEW_AS_ROLES_MENTIONS_WARNING}.{0,100}(?=])/,
|
||||
replace: "$&,$self.renderTooltip(arguments[0].guild)"
|
||||
},
|
||||
predicate: () => settings.store.toolTip
|
||||
|
|
|
@ -505,7 +505,7 @@ export default definePlugin({
|
|||
|
||||
{
|
||||
// Message content renderer
|
||||
find: 'Messages.MESSAGE_EDITED,")"',
|
||||
find: "#{intl::MESSAGE_EDITED}",
|
||||
replacement: [
|
||||
{
|
||||
// Render editHistory in the deepest div for message content
|
||||
|
@ -558,7 +558,7 @@ export default definePlugin({
|
|||
},
|
||||
{
|
||||
// Message group rendering
|
||||
find: "Messages.NEW_MESSAGES_ESTIMATED_WITH_DATE",
|
||||
find: "#{intl::NEW_MESSAGES_ESTIMATED_WITH_DATE}",
|
||||
replacement: [
|
||||
{
|
||||
match: /(\i).type===\i\.\i\.MESSAGE_GROUP_BLOCKED\|\|/,
|
||||
|
|
|
@ -187,7 +187,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".DISCORD_SYSTEM_MESSAGE_BOT_TAG_TOOLTIP_OFFICIAL,",
|
||||
find: "#{intl::DISCORD_SYSTEM_MESSAGE_BOT_TAG_TOOLTIP_OFFICIAL}",
|
||||
replacement: [
|
||||
// make the tag show the right text
|
||||
{
|
||||
|
@ -217,7 +217,7 @@ export default definePlugin({
|
|||
},
|
||||
// in the member list
|
||||
{
|
||||
find: ".Messages.GUILD_OWNER,",
|
||||
find: "#{intl::GUILD_OWNER}",
|
||||
replacement: {
|
||||
match: /(?<type>\i)=\(null==.{0,100}\.BOT;return null!=(?<user>\i)&&\i\.bot/,
|
||||
replace: "$<type> = $self.getTag({user: $<user>, channel: arguments[0].channel, origType: $<user>.bot ? 0 : null, location: 'not-chat' }); return typeof $<type> === 'number'"
|
||||
|
@ -232,7 +232,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.USER_PROFILE_PRONOUNS",
|
||||
find: "#{ìntl::USER_PROFILE_PRONOUNS}",
|
||||
replacement: {
|
||||
match: /(?=,hideBotTag:!0)/,
|
||||
replace: ",moreTags_channelId:arguments[0].moreTags_channelId"
|
||||
|
|
|
@ -38,7 +38,7 @@ export default definePlugin({
|
|||
authors: [Devs.rushii, Devs.Samu, Devs.F53],
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.BLOCKED_MESSAGES_HIDE",
|
||||
find: "#{intl::BLOCKED_MESSAGES_HIDE}",
|
||||
replacement: [
|
||||
{
|
||||
match: /let\{[^}]*collapsedReason[^}]*\}/,
|
||||
|
|
|
@ -25,7 +25,7 @@ export default definePlugin({
|
|||
authors: [Devs.nekohaxx],
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.ONBOARDING_COVER_WELCOME_SUBTITLE",
|
||||
find: "#{intl::ONBOARDING_COVER_WELCOME_SUBTITLE}",
|
||||
replacement: {
|
||||
match: "3e3",
|
||||
replace: "0"
|
||||
|
|
|
@ -28,21 +28,21 @@ export default definePlugin({
|
|||
{
|
||||
find: '.id,"Search Results"',
|
||||
replacement: {
|
||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}UNBLOCK_TO_JUMP_TITLE)/,
|
||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||
replace: "if(false)$1"
|
||||
}
|
||||
},
|
||||
{
|
||||
find: "renderJumpButton()",
|
||||
replacement: {
|
||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}UNBLOCK_TO_JUMP_TITLE)/,
|
||||
match: /if\(.{1,10}\)(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||
replace: "if(false)$1"
|
||||
}
|
||||
},
|
||||
{
|
||||
find: "flash:!0,returnMessageId",
|
||||
replacement: {
|
||||
match: /.\?(.{1,10}\.show\({.{1,50}UNBLOCK_TO_JUMP_TITLE)/,
|
||||
match: /.\?(.{1,10}\.show\({.{1,50}#{intl::UNBLOCK_TO_JUMP_TITLE})/,
|
||||
replace: "false?$1"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ export default definePlugin({
|
|||
authors: [Devs.bb010g],
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.COPY_MESSAGE_LINK,",
|
||||
find: "#{intl::COPY_MESSAGE_LINK}",
|
||||
replacement: {
|
||||
match: /\.concat\(location\.host\)/,
|
||||
replace: ".concat($self.normalizeHost(location.host))",
|
||||
|
|
|
@ -43,15 +43,15 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.GUILD_INVITE_DISABLE_ACTION_SHEET_DESCRIPTION",
|
||||
find: "#{intl::GUILD_INVITE_DISABLE_ACTION_SHEET_DESCRIPTION}",
|
||||
group: true,
|
||||
replacement: [
|
||||
{
|
||||
match: /children:\i\.\i\.\i\.GUILD_INVITE_DISABLE_ACTION_SHEET_DESCRIPTION/,
|
||||
match: /children:\i\.\i\.string\(\i\.\i#{intl::GUILD_INVITE_DISABLE_ACTION_SHEET_DESCRIPTION}\)/,
|
||||
replace: "children: $self.renderInvitesLabel({guildId:arguments[0].guildId,setChecked})",
|
||||
},
|
||||
{
|
||||
match: /\.INVITES_DISABLED\)(?=.+?\.Messages\.INVITES_PERMANENTLY_DISABLED_TIP.+?checked:(\i)).+?\[\1,(\i)\]=\i.useState\(\i\)/,
|
||||
match: /\.INVITES_DISABLED\)(?=.+?#{intl::INVITES_PERMANENTLY_DISABLED_TIP}.+?checked:(\i)).+?\[\1,(\i)\]=\i.useState\(\i\)/,
|
||||
replace: "$&,setChecked=$2"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -32,7 +32,7 @@ export default definePlugin({
|
|||
patches: [
|
||||
// Permission lockout, just set the check to true
|
||||
{
|
||||
find: ".STAGE_CHANNEL_CANNOT_OVERWRITE_PERMISSION",
|
||||
find: "#{intl::STAGE_CHANNEL_CANNOT_OVERWRITE_PERMISSION}",
|
||||
replacement: [
|
||||
{
|
||||
match: /case"DENY":.{0,50}if\((?=\i\.\i\.can)/,
|
||||
|
@ -43,7 +43,7 @@ export default definePlugin({
|
|||
},
|
||||
// Onboarding, same thing but we need to prevent the check
|
||||
{
|
||||
find: ".ONBOARDING_CHANNEL_THRESHOLD_WARNING",
|
||||
find: "#{intl::ONBOARDING_CHANNEL_THRESHOLD_WARNING}",
|
||||
replacement: [
|
||||
{
|
||||
match: /{(\i:function\(\){return \i},?){2}}/,
|
||||
|
|
|
@ -170,7 +170,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".VIEW_ALL_ROLES,",
|
||||
find: "#{intl::VIEW_ALL_ROLES}",
|
||||
replacement: {
|
||||
match: /\.expandButton,.+?null,/,
|
||||
replace: "$&$self.ViewPermissionsButton(arguments[0]),"
|
||||
|
|
|
@ -67,7 +67,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".REPLY_QUOTE_MESSAGE_BLOCKED",
|
||||
find: "#{intl::REPLY_QUOTE_MESSAGE_BLOCKED}",
|
||||
replacement: {
|
||||
match: /\.onClickReply,.+?}\),(?=\i,\i,\i\])/,
|
||||
replace: "$&$self.ReplyTimestamp(arguments[0]),"
|
||||
|
|
|
@ -108,7 +108,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.MESSAGE_ACTIONS_MENU_LABEL,shouldHideMediaOptions",
|
||||
find: "#{intl::MESSAGE_ACTIONS_MENU_LABEL}",
|
||||
replacement: {
|
||||
match: /favoriteableType:\i,(?<=(\i)\.getAttribute\("data-type"\).+?)/,
|
||||
replace: (m, target) => `${m}reverseImageSearchType:${target}.getAttribute("data-role"),`
|
||||
|
|
|
@ -104,7 +104,7 @@ export default definePlugin({
|
|||
predicate: () => settings.store.memberList,
|
||||
},
|
||||
{
|
||||
find: ".Messages.THREAD_BROWSER_PRIVATE",
|
||||
find: "#{intl::THREAD_BROWSER_PRIVATE}",
|
||||
replacement: [
|
||||
{
|
||||
match: /children:\[\i," — ",\i\]/,
|
||||
|
@ -132,7 +132,7 @@ export default definePlugin({
|
|||
predicate: () => settings.store.reactorsList,
|
||||
},
|
||||
{
|
||||
find: '.Messages.MESSAGE_EDITED,")"',
|
||||
find: "#{intl::MESSAGE_EDITED}",
|
||||
replacement: {
|
||||
match: /(?<=isUnsupported\]:(\i)\.isUnsupported\}\),)(?=children:\[)/,
|
||||
replace: "style:{color:$self.useMessageColor($1)},"
|
||||
|
|
|
@ -46,7 +46,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".PREVIEW_NUM_LINES",
|
||||
find: "#{intl::PREVIEW_NUM_LINES}",
|
||||
replacement: {
|
||||
match: /(?<=function \i\((\i)\)\{)(?=let\{text:\i,language:)/,
|
||||
replace: "return $self.renderHighlighter({lang:$1.language,content:$1.text});"
|
||||
|
|
|
@ -26,7 +26,7 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.MESSAGE_UTILITIES_A11Y_LABEL",
|
||||
find: "#{intl::MESSAGE_UTILITIES_A11Y_LABEL}",
|
||||
replacement: {
|
||||
match: /isExpanded:\i&&(.+?),/,
|
||||
replace: "isExpanded:$1,"
|
||||
|
|
|
@ -149,7 +149,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.CHANNEL_TOOLTIP_DIRECTORY",
|
||||
find: "#{intl::CHANNEL_TOOLTIP_DIRECTORY}",
|
||||
predicate: () => settings.store.showMode === ShowMode.LockIcon,
|
||||
replacement: {
|
||||
// Lock Icon
|
||||
|
@ -274,7 +274,7 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.ROLE_REQUIRED_SINGLE_USER_MESSAGE",
|
||||
find: "#{intl::ROLE_REQUIRED_SINGLE_USER_MESSAGE}",
|
||||
replacement: [
|
||||
{
|
||||
// Change the role permission check to CONNECT if the channel is locked
|
||||
|
@ -336,7 +336,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: ".Messages.CHANNEL_CALL_CURRENT_SPEAKER.format",
|
||||
find: "#{intl::CHANNEL_CALL_CURRENT_SPEAKER}",
|
||||
replacement: [
|
||||
{
|
||||
// Remove the divider and the open chat button for the HiddenChannelLockScreen
|
||||
|
@ -351,7 +351,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: ".Messages.EMBEDDED_ACTIVITIES_DEVELOPER_ACTIVITY_SHELF_FETCH_ERROR",
|
||||
find: "#{intl::EMBEDDED_ACTIVITIES_DEVELOPER_ACTIVITY_SHELF_FETCH_ERROR}",
|
||||
replacement: [
|
||||
{
|
||||
// Render our HiddenChannelLockScreen component instead of the main voice channel component
|
||||
|
@ -401,7 +401,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: ".Messages.STAGE_FULL_MODERATOR_TITLE",
|
||||
find: "#{intl::STAGE_FULL_MODERATOR_TITLE}",
|
||||
replacement: [
|
||||
{
|
||||
// Remove the divider and amount of users in stage channel components for the HiddenChannelLockScreen
|
||||
|
@ -463,7 +463,7 @@ export default definePlugin({
|
|||
]
|
||||
},
|
||||
{
|
||||
find: ".Messages.FORM_LABEL_MUTED",
|
||||
find: "#{intl::FORM_LABEL_MUTED}",
|
||||
replacement: {
|
||||
// Make GuildChannelStore.getChannels return hidden channels
|
||||
match: /(?<=getChannels\(\i)(?=\))/,
|
||||
|
|
|
@ -68,7 +68,7 @@ export default definePlugin({
|
|||
},
|
||||
// fixes a bug where Members page must be loaded to see highest role, why is Discord depending on MemberSafetyStore.getEnhancedMember for something that can be obtained here?
|
||||
{
|
||||
find: "Messages.GUILD_MEMBER_MOD_VIEW_PERMISSION_GRANTED_BY_ARIA_LABEL,allowOverflow",
|
||||
find: "#{intl::GUILD_MEMBER_MOD_VIEW_PERMISSION_GRANTED_BY_ARIA_LABEL}",
|
||||
predicate: () => settings.store.showModView,
|
||||
replacement: {
|
||||
match: /(role:)\i(?=,guildId.{0,100}role:(\i\[))/,
|
||||
|
|
|
@ -65,10 +65,10 @@ export default definePlugin({
|
|||
|
||||
patches: [
|
||||
{
|
||||
find: ".GUILD_COMMUNICATION_DISABLED_ICON_TOOLTIP_BODY",
|
||||
find: "#{intl::GUILD_COMMUNICATION_DISABLED_ICON_TOOLTIP_BODY}",
|
||||
replacement: [
|
||||
{
|
||||
match: /(\i)\.Tooltip,{(text:.{0,30}\.Messages\.GUILD_COMMUNICATION_DISABLED_ICON_TOOLTIP_BODY)/,
|
||||
match: /(\i)\.Tooltip,{(text:.{0,30}#{intl::GUILD_COMMUNICATION_DISABLED_ICON_TOOLTIP_BODY}\))/,
|
||||
replace: "$self.TooltipWrapper,{message:arguments[0].message,$2"
|
||||
}
|
||||
]
|
||||
|
|
|
@ -45,7 +45,7 @@ export default definePlugin({
|
|||
replace: "}).sortBy(row => $self.wrapSort(($1), row)).value()"
|
||||
}
|
||||
}, {
|
||||
find: ".Messages.FRIEND_REQUEST_CANCEL",
|
||||
find: "#{intl::FRIEND_REQUEST_CANCEL}",
|
||||
replacement: {
|
||||
predicate: () => settings.store.showDates,
|
||||
match: /subText:(\i)(?<=user:(\i).+?)/,
|
||||
|
|
|
@ -26,7 +26,7 @@ export default definePlugin({
|
|||
description: "Adds Startup Timings to the Settings menu",
|
||||
authors: [Devs.Megu],
|
||||
patches: [{
|
||||
find: "Messages.ACTIVITY_SETTINGS",
|
||||
find: "#{intl::ACTIVITY_SETTINGS}",
|
||||
replacement: {
|
||||
match: /(?<=}\)([,;])(\i\.settings)\.forEach.+?(\i)\.push.+}\)}\))/,
|
||||
replace: (_, commaOrSemi, settings, elements) => "" +
|
||||
|
|
|
@ -38,7 +38,7 @@ export default definePlugin({
|
|||
// add --avatar-url-<resolution> css variable to avatar img elements
|
||||
// popout profiles
|
||||
{
|
||||
find: ".LABEL_WITH_ONLINE_STATUS",
|
||||
find: "#{intl::LABEL_WITH_ONLINE_STATUS}",
|
||||
replacement: {
|
||||
match: /src:null!=\i\?(\i).{1,50}"aria-hidden":!0/,
|
||||
replace: "$&,style:$self.getAvatarStyles($1)"
|
||||
|
|
|
@ -25,7 +25,7 @@ export default definePlugin({
|
|||
settings,
|
||||
patches: [
|
||||
{
|
||||
find: ".Messages.AVATAR_UPLOAD_EDIT_MEDIA",
|
||||
find: "#{intl::AVATAR_UPLOAD_EDIT_MEDIA}",
|
||||
replacement: {
|
||||
match: /maxValue:\d/,
|
||||
replace: "maxValue:$self.settings.store.zoomMultiplier",
|
||||
|
|
|
@ -57,7 +57,7 @@ export default definePlugin({
|
|||
patches: [
|
||||
// User Popout, Full Size Profile, Direct Messages Side Profile
|
||||
{
|
||||
find: ".Messages.USER_PROFILE_LOAD_ERROR",
|
||||
find: "#{intl::USER_PROFILE_LOAD_ERROR}",
|
||||
replacement: {
|
||||
match: /(\.fetchError.+?\?)null/,
|
||||
replace: (_, rest) => `${rest}$self.VoiceChannelIndicator({userId:arguments[0]?.userId,isProfile:true})`
|
||||
|
|
|
@ -37,9 +37,9 @@ export default definePlugin({
|
|||
authors: [Devs.newwares],
|
||||
patches: [
|
||||
{
|
||||
find: "Messages.REPLY_QUOTE_MESSAGE_NOT_LOADED",
|
||||
find: "#{intl::REPLY_QUOTE_MESSAGE_NOT_LOADED}",
|
||||
replacement: {
|
||||
match: /Messages\.REPLY_QUOTE_MESSAGE_NOT_LOADED/,
|
||||
match: /#{intl::REPLY_QUOTE_MESSAGE_NOT_LOADED}\)/,
|
||||
replace: "$&,onMouseEnter:()=>$self.fetchReply(arguments[0])"
|
||||
}
|
||||
},
|
||||
|
|
|
@ -57,7 +57,7 @@ export default definePlugin({
|
|||
patches: [
|
||||
// Change the max volume for sliders to allow for values above 200
|
||||
...[
|
||||
".Messages.USER_VOLUME",
|
||||
"#{intl::USER_VOLUME}",
|
||||
"currentVolume:"
|
||||
].map(find => ({
|
||||
find,
|
||||
|
|
|
@ -138,11 +138,11 @@ export default definePlugin({
|
|||
replace: "return [true"
|
||||
},
|
||||
{
|
||||
match: /(?<=COPY_IMAGE_MENU_ITEM,)action:/,
|
||||
match: /(?<=#{intl::COPY_IMAGE_MENU_ITEM}\),)action:/,
|
||||
replace: "action:()=>$self.copyImage(arguments[0]),oldAction:"
|
||||
},
|
||||
{
|
||||
match: /(?<=SAVE_IMAGE_MENU_ITEM,)action:/,
|
||||
match: /(?<=#{intl::SAVE_IMAGE_MENU_ITEM}\),)action:/,
|
||||
replace: "action:()=>$self.saveImage(arguments[0]),oldAction:"
|
||||
},
|
||||
]
|
||||
|
@ -213,14 +213,14 @@ export default definePlugin({
|
|||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.SEARCH_WITH_GOOGLE",
|
||||
find: "#{intl::SEARCH_WITH_GOOGLE}",
|
||||
replacement: {
|
||||
match: /\i\.isPlatformEmbedded/,
|
||||
replace: "true"
|
||||
}
|
||||
},
|
||||
{
|
||||
find: ".Messages.COPY,hint:",
|
||||
find: "#{intl::COPY}),hint:",
|
||||
replacement: [
|
||||
{
|
||||
match: /\i\.isPlatformEmbedded/,
|
||||
|
@ -234,7 +234,8 @@ export default definePlugin({
|
|||
// Automod add filter words
|
||||
{
|
||||
find: '("interactionUsernameProfile',
|
||||
replacement: {
|
||||
replacement:
|
||||
{
|
||||
match: /\i\.isPlatformEmbedded(?=.{0,50}\.tagName)/,
|
||||
replace: "true"
|
||||
},
|
||||
|
|
53
src/utils/intlHash.ts
Normal file
53
src/utils/intlHash.ts
Normal file
|
@ -0,0 +1,53 @@
|
|||
/* eslint-disable simple-header/header */
|
||||
|
||||
/**
|
||||
* discord-intl
|
||||
*
|
||||
* @copyright 2024 Discord, Inc.
|
||||
* @link https://github.com/discord/discord-intl
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
|
||||
import { hash as h64 } from "@intrnl/xxhash64";
|
||||
|
||||
const BASE64_TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
|
||||
const IS_BIG_ENDIAN = (() => {
|
||||
const array = new Uint8Array(4);
|
||||
const view = new Uint32Array(array.buffer);
|
||||
return !((view[0] = 1) & array[0]);
|
||||
})();
|
||||
|
||||
function numberToBytes(number: number | bigint) {
|
||||
number = BigInt(number);
|
||||
const array: number[] = [];
|
||||
const byteCount = Math.ceil(Math.floor(Math.log2(Number(number)) + 1) / 8);
|
||||
for (let i = 0; i < byteCount; i++) {
|
||||
array.unshift(Number((number >> BigInt(8 * i)) & BigInt(255)));
|
||||
}
|
||||
|
||||
const bytes = new Uint8Array(array);
|
||||
// The native `hashToMessageKey` always works in Big/Network Endian bytes, so this array
|
||||
// needs to be converted to the same endianness to get the same base64 result.
|
||||
return IS_BIG_ENDIAN ? bytes : bytes.reverse();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a consistent, short hash of the given key by first processing it through a hash digest,
|
||||
* then encoding the first few bytes to base64.
|
||||
*
|
||||
* This function is specifically written to mirror the native backend hashing function used by
|
||||
* `@discord/intl-loader-core`, to be able to hash names at runtime.
|
||||
*/
|
||||
export function runtimeHashMessageKey(key: string): string {
|
||||
const hash = h64(key, 0);
|
||||
const bytes = numberToBytes(hash);
|
||||
return [
|
||||
BASE64_TABLE[bytes[0] >> 2],
|
||||
BASE64_TABLE[((bytes[0] & 0x03) << 4) | (bytes[1] >> 4)],
|
||||
BASE64_TABLE[((bytes[1] & 0x0f) << 2) | (bytes[2] >> 6)],
|
||||
BASE64_TABLE[bytes[2] & 0x3f],
|
||||
BASE64_TABLE[bytes[3] >> 2],
|
||||
BASE64_TABLE[((bytes[3] & 0x03) << 4) | (bytes[3] >> 4)],
|
||||
].join("");
|
||||
}
|
|
@ -16,12 +16,25 @@
|
|||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { runtimeHashMessageKey } from "./intlHash";
|
||||
import { Patch, PatchReplacement, ReplaceFn } from "./types";
|
||||
|
||||
export function canonicalizeMatch<T extends RegExp | string>(match: T): T {
|
||||
if (typeof match === "string") return match;
|
||||
const canonSource = match.source
|
||||
.replaceAll("\\i", "[A-Za-z_$][\\w$]*");
|
||||
let partialCanon = typeof match === "string" ? match : match.source;
|
||||
partialCanon = partialCanon.replaceAll(/#{intl::([A-Za-z_$][\w$]*)}/g, (_, key) => {
|
||||
const hashed = runtimeHashMessageKey(key);
|
||||
const isStr = typeof match === "string";
|
||||
|
||||
return /^[\d]/.test(hashed) || !/^[\w$]+$/.test(hashed)
|
||||
? isStr ? `["${hashed}` : String.raw`(?:\["${hashed}"\])`
|
||||
: isStr ? `.${hashed}` : String.raw`(?:\.${hashed})`;
|
||||
});
|
||||
|
||||
if (typeof match === "string") {
|
||||
return partialCanon as T;
|
||||
}
|
||||
|
||||
const canonSource = partialCanon.replaceAll(String.raw`\i`, String.raw`(?:[A-Za-z_$][\w$]*)`);
|
||||
return new RegExp(canonSource, match.flags) as T;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue