diff --git a/src/webpage/channel.ts b/src/webpage/channel.ts index ef9211e..dd9c580 100644 --- a/src/webpage/channel.ts +++ b/src/webpage/channel.ts @@ -44,6 +44,10 @@ class Channel extends SnowFlake { owner: Guild; headers: Localuser["headers"]; name!: string; + get shortName() { + if (this.name.length > 50) return this.name.slice(0, 50) + "..."; + return this.name; + } parentId?: string; parent?: Channel; children!: Channel[]; @@ -269,6 +273,17 @@ class Channel extends SnowFlake { ); this.contextmenu.addSeperator(); + this.contextmenu.addButton( + I18n.channel.copyURL(), + function (this: Channel) { + navigator.clipboard.writeText(`${location.origin}/channels/${this.guild.id}/${this.id}`); + }, + { + visible: function () { + return this.type !== 4; + }, + }, + ); //TODO copy ID icon this.contextmenu.addButton( function () { @@ -399,7 +414,7 @@ class Channel extends SnowFlake { update(); const inviteOptions = new Dialog("", {noSubmit: true}); inviteOptions.options.addTitle(I18n.inviteOptions.title()); - inviteOptions.options.addText(I18n.invite.subtext(this.name, this.guild.properties.name)); + inviteOptions.options.addText(I18n.invite.subtext(this.shortName, this.guild.properties.name)); inviteOptions.options.addSelect( I18n.invite.expireAfter(), @@ -427,7 +442,7 @@ class Channel extends SnowFlake { inviteOptions.show(); } generateSettings() { - const settings = new Settings(I18n.channel.settingsFor(this.name)); + const settings = new Settings(I18n.channel.settingsFor(this.shortName)); { const gensettings = settings.addButton(I18n.channel.settings()); const form = gensettings.addForm("", () => {}, { @@ -1052,7 +1067,7 @@ class Channel extends SnowFlake { const myhtml = document.createElement("p2"); myhtml.classList.add("ellipsis"); - myhtml.textContent = this.name; + myhtml.textContent = this.shortName; this.nameSpan = new WeakRef(myhtml); decdiv.appendChild(myhtml); caps.appendChild(decdiv); @@ -1119,7 +1134,7 @@ class Channel extends SnowFlake { div.append(button); const myhtml = document.createElement("span"); myhtml.classList.add("ellipsis"); - myhtml.textContent = this.name; + myhtml.textContent = this.shortName; this.nameSpan = new WeakRef(myhtml); const decoration = this.renderIcon(); button.appendChild(decoration); @@ -2017,7 +2032,7 @@ class Channel extends SnowFlake { div.append(tags); const title = document.createElement("h3"); - title.textContent = new MarkDown(this.name).makeHTML().textContent; + title.textContent = new MarkDown(this.shortName).makeHTML().textContent; div.append(title); const member = @@ -2617,7 +2632,10 @@ class Channel extends SnowFlake { if (this.curCommand) { this.curCommand.render(typebox, this); } - typebox.style.setProperty("--channel-text", JSON.stringify(I18n.channel.typebox(this.name))); + typebox.style.setProperty( + "--channel-text", + JSON.stringify(I18n.channel.typebox(this.shortName)), + ); if (!this.curCommand && !this.isForum()) { const md = typebox.markdown; md.owner = this; @@ -2670,7 +2688,7 @@ class Channel extends SnowFlake { "/channels/" + this.guild.id + "/" + this.id + (aroundMessage ? `/${aroundMessage}` : ""), ); } - this.localuser.pageTitle("#" + this.name); + this.localuser.pageTitle("#" + this.shortName); const channelTopic = document.getElementById("channelTopic") as HTMLSpanElement; if (this.topic) { channelTopic.innerHTML = ""; diff --git a/src/webpage/file.ts b/src/webpage/file.ts index bd44b50..f0d3138 100644 --- a/src/webpage/file.ts +++ b/src/webpage/file.ts @@ -288,6 +288,8 @@ class File { if (src) { const a = document.createElement("a"); a.href = src; + a.target = "_blank"; + a.rel = "noopener noreferrer"; if (url) url.then((_) => { a.href = _; @@ -309,11 +311,14 @@ class File { return div; } static filesizehuman(fsize: number) { - const i = fsize == 0 ? 0 : Math.floor(Math.log(fsize) / Math.log(1024)); + // These DO change between languages, for example in russian it uses cyrillic script + // also NOBODY is uploading TBs of files... seriously no + // And finally we are using SI units, so we go in thousands :) + const i = fsize == 0 ? 0 : Math.floor(Math.log(fsize) / Math.log(1000)); return ( - Number((fsize / Math.pow(1024, i)).toFixed(2)) * 1 + + Number((fsize / Math.pow(1000, i)).toFixed(2)) * 1 + " " + - ["Bytes", "Kilobytes", "Megabytes", "Gigabytes", "Terabytes"][i] // I don't think this changes across languages, correct me if I'm wrong + [I18n.filesize.B(), I18n.filesize.KB(), I18n.filesize.MB(), I18n.filesize.GB()][i] ); } } diff --git a/src/webpage/highlighter/clike/langs.json b/src/webpage/highlighter/clike/langs.json index 1c1b162..40b8743 100644 --- a/src/webpage/highlighter/clike/langs.json +++ b/src/webpage/highlighter/clike/langs.json @@ -1,6 +1,6 @@ [ { - "names":["js","ts","javascript"], + "names":["js","ts","typescript","javascript","tscript","jscript"], "keywords": ["break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete", "do","else", "export", "extends", "finally", "for", "function", "if", "import", "in", "instanceof", "new", "return", "super", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with", "yield", "let", "await", "true", "false", "null", "undefined"], "firstLineShebang": true, "doubleSlashComments": true, @@ -8,14 +8,14 @@ "JSLikeTemplateStrings": true }, { - "names":["h","c","hc"], + "names":["h","c","hc","c23","c89","ansic","ansi-c","khr-c","khrc"], "keywords":["auto", "break", "case", "char", "continue", "do", "default", "const", "double", "else", "enum", "extern", "for", "if", "goto", "float", "int", "long", "register", "return", "signed", "static", "sizeof", "short", "struct", "switch", "typedef", "union", "void", "while", "volatile", "unsigned"], "hashComments": true, "doubleSlashComments": true, "multilineSlashComments": true }, { - "names":["c++","cpp","hpp","cxx","hxx","h++"], + "names":["cplusplus","hplusplus","c++","cpp","hpp","cxx","hxx","h++"], "keywords":["alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept", "auto", "bitand", "bitor", "bool", "break", "case", "catch", "char", "char8_t", "char16_t", "char32_t", "class", "compl", "concept", "const", "consteval", "constexpr", "constinit", "const_cast", "continue", "contract_assert", "co_await", "co_return", "co_yield", "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", "enum", "explicit", "export", "extern", "false", "float", "for", "friend", "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "private", "protected", "public", "reflexpr", "register", "reinterpret_cast", "requires", "return", "short", "signed", "sizeof", "static", "static_assert", "static_cast", "struct", "switch", "synchronized", "template", "this", "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", "while", "xor", "xor_eq", "final", "override", "transaction_safe", "transaction_safe_dynamic", "import", "module", "pre", "post"], "hashComments": true, "doubleSlashComments": true, @@ -52,5 +52,38 @@ "keywords": ["False", "None", "True", "and", "as", "assert", "async", "await", "break", "class", "continue", "def", "del", "elif", "else", "except", "finally", "for", "from", "global", "if", "import", "in", "is", "lambda", "nonlocal", "not", "or", "pass", "raise", "return", "try", "while", "with", "yield"], "hashComments": true, "multiLine":"\"\"\"" - } +}, +{ + "names": ["java", "jav", "jv"], + "keywords": ["abstract", "continue", "for", "new", "switch", "assert", "default", "goto", "package", "synchronized", "boolean", "do", "if", "private", "this", "break", "double", "implements", "protected", "throw", "byte", "else", "import", "public", "throws", "case", "enum", "instanceof", "return", "transient", "catch", "extends", "int", "short", "try", "char", "final", "interface", "static", "void", "class", "finally", "long", "strictfp", "volatile", "const", "float", "native", "super", "while"], + "firstLineShebang":true, + "doubleSlashComments": true, + "multilineSlashComments": true, + "multiLine":"\"\"\"" +}, +{ + "names": ["glsl","glslang","opengl","glslc"], + "keywords": ["const", "uniform", "buffer", "shared", "attribute", "varying", "coherent", "volatile", "restrict", "readonly", "writeonly", "atomic_uint", "layout", "centroid", "flat", "smooth", "noperspective", "patch", "sample", "invariant", "precise", "break", "continue", "do", "for", "while", "switch", "case", "default", "if", "else", "subroutine", "in", "out", "inout", "int", "void", "bool", "true", "false", "float", "double", "discard", "return", "vec2", "vec3", "vec4", "ivec2", "ivec3", "ivec4", "bvec2", "bvec3", "bvec4", "uint", "uvec2", "uvec3", "uvec4", "dvec2", "dvec3", "dvec4", "mat2", "mat3", "mat4", "mat2x2", "mat2x3", "mat2x4", "mat3x2", "mat3x3", "mat3x4", "mat4x2", "mat4x3", "mat4x4", "dmat2", "dmat3", "dmat4", "dmat2x2", "dmat2x3", "dmat2x4", "dmat3x2", "dmat3x3", "dmat3x4", "dmat4x2", "dmat4x3", "dmat4x4", "lowp", "mediump", "highp", "precision", "sampler1D", "sampler1DShadow", "sampler1DArray", "sampler1DArrayShadow", "isampler1D", "isampler1DArray", "usampler1D", "usampler1DArray", "sampler2D", "sampler2DShadow", "sampler2DArray", "sampler2DArrayShadow", "isampler2D", "isampler2DArray", "usampler2D", "usampler2DArray", "sampler2DRect", "sampler2DRectShadow", "isampler2DRect", "usampler2DRect", "sampler2DMS", "isampler2DMS", "usampler2DMS", "sampler2DMSArray", "isampler2DMSArray", "usampler2DMSArray", "sampler3D", "isampler3D", "usampler3D", "samplerCube", "samplerCubeShadow", "isamplerCube", "usamplerCube", "samplerCubeArray", "samplerCubeArrayShadow", "isamplerCubeArray", "usamplerCubeArray", "samplerBuffer", "isamplerBuffer", "usamplerBuffer", "image1D", "iimage1D", "uimage1D", "image1DArray", "iimage1DArray", "uimage1DArray", "image2D", "iimage2D", "uimage2D", "image2DArray", "iimage2DArray", "uimage2DArray", "image2DRect", "iimage2DRect", "uimage2DRect", "image2DMS", "iimage2DMS", "uimage2DMS", "image2DMSArray", "iimage2DMSArray", "uimage2DMSArray", "image3D", "iimage3D", "uimage3D", "imageCube", "iimageCube", "uimageCube", "imageCubeArray", "iimageCubeArray", "uimageCubeArray", "imageBuffer", "iimageBuffer", "uimageBuffer", "struct", "In", "addition,", "when", "targeting", "Vulkan,", "the", "following", "keywords", "also", "exist:", "texture1D", "texture1DArray", "itexture1D", "itexture1DArray", "utexture1D", "utexture1DArray", "texture2D", "texture2DArray", "itexture2D", "itexture2DArray", "utexture2D", "utexture2DArray", "texture2DRect", "itexture2DRect", "utexture2DRect", "texture2DMS", "itexture2DMS", "utexture2DMS", "texture2DMSArray", "itexture2DMSArray", "utexture2DMSArray", "texture3D", "itexture3D", "utexture3D", "textureCube", "itextureCube", "utextureCube", "textureCubeArray", "itextureCubeArray", "utextureCubeArray", "textureBuffer", "itextureBuffer", "utextureBuffer", "sampler", "samplerShadow", "subpassInput", "isubpassInput", "usubpassInput", "subpassInputMS", "isubpassInputMS", "usubpassInputMS", "The", "following", "are", "the", "keywords", "reserved", "for", "future", "use.", "Using", "them", "will", "result", "in", "a", "compile-time", "error:", "common", "partition", "active", "asm", "class", "union", "enum", "typedef", "template", "this", "resource", "goto", "inline", "noinline", "public", "static", "extern", "external", "interface", "long", "short", "half", "fixed", "unsigned", "superp", "input", "output", "hvec2", "hvec3", "hvec4", "fvec2", "fvec3", "fvec4", "filter", "sizeof", "cast", "namespace", "using", "sampler3DRect"], + "hashComments": true, + "doubleSlashComments": true, + "multilineSlashComments": true +}, +{ + "names": ["hlsl","hlslang","hlslc","directx"], + "keywords": [ + "AppendStructuredBuffer", "asm", "asm_fragment", "BlendState", "bool", "break", "Buffer", "ByteAddressBuffer", "case", "cbuffer", "centroid", "class", "column_major", "compile", "compile_fragment", "CompileShader", "const", "continue", "ComputeShader", "ConsumeStructuredBuffer", "default", "DepthStencilState", "DepthStencilView", "discard", "do", "double", "DomainShader", "dword", "else", "export", "extern", "false", "float", "for", "fxgroup", "GeometryShader", "groupshared", "half", "Hullshader", "if", "in", "inline", "inout", "InputPatch", "int", "interface", "line", "lineadj", "linear", "LineStream", "matrix", "min16float", "min10float", "min16int", "min12int", "min16uint", "namespace", "nointerpolation", "noperspective", "NULL", "out", "OutputPatch", "packoffset", "pass", "pixelfragment", "PixelShader", "point", "PointStream", "precise", "RasterizerState", "RenderTargetView", "return", "register", "row_major", "RWBuffer", "RWByteAddressBuffer", "RWStructuredBuffer", "RWTexture1D", "RWTexture1DArray", "RWTexture2D", "RWTexture2DArray", "RWTexture3D", "sample", "sampler", "SamplerState", "SamplerComparisonState", "shared", "snorm", "stateblock", "stateblock_state", "static", "string", "struct", "switch", "StructuredBuffer", "tbuffer", "technique", "technique10", "technique11", "texture", "Texture1D", "Texture1DArray", "Texture2D", "Texture2DArray", "Texture2DMS", "Texture2DMSArray", "Texture3D", "TextureCube", "TextureCubeArray", "true", "typedef", "triangle", "triangleadj", "TriangleStream", + "uint", "uniform", "unorm", "unsigned", "vector", "vertexfragment", "VertexShader", "void", "volatile", "while", "uint", "uint1", "uint2", "uint3", "uint4", "uint1x1", "uint1x2", "uint1x3", "uint1x4 uint2x1", "uint2x2", "uint2x3", "uint2x4 uint3x1", "uint3x2", "uint3x3", "uint3x4 uint4x1", "uint4x2", "uint4x3", "uint4x4", "bool", "bool1", "bool2", "bool3", "bool4", "bool1x1", "bool1x2", "bool1x3", "bool1x4 bool2x1", "bool2x2", "bool2x3", "bool2x4 bool3x1", "bool3x2", "bool3x3", "bool3x4 bool4x1", "bool4x2", "bool4x3", "bool4x4", "int", "int1", "int2", "int3", "int4", "int1x1", "int1x2", "int1x3", "int1x4 int2x1", "int2x2", "int2x3", "int2x4 int3x1", "int3x2", "int3x3", "int3x4 int4x1", "int4x2", "int4x3", "int4x4", "float", "float1", "float2", "float3", "float4", "float1x1", "float1x2", "float1x3", "float1x4 float2x1", "float2x2", "float2x3", "float2x4 float3x1", "float3x2", "float3x3", "float3x4 float4x1", "float4x2", "float4x3", "float4x4" + ], + "hashComments": true, + "doubleSlashComments": true, + "multilineSlashComments": true +}, +{ + "names": ["kt","kot","kotlin","kts"], + "keywords": ["as", "as?", "break", "class", "continue", "do", "else", "false", "for", "fun", "if", "in", "!in", "interface", "is", "!is", "null", "object", "package", "return", "super", "this", "throw", "true", "try", "typealias", "typeof", "val", "var", "when", "while", "by", "catch", "constructor", "delegate", "dynamic", "field", "file", "finally", "get", "import", "init", "param", "property", "receiver", "set", "setparam", "value", "where", "actual", "abstract", "annotation", "companion", "const", "crossinline", "data", "enum", "expect", "external", "final", "infix", "inline", "inner", "internal", "lateinit", "noinline", "open", "operator", "out", "override", "private", "protected", "public", "reified", "sealed", "suspend", "tailrec", "vararg"], + "firstLineShebang":true, + "doubleSlashComments": true, + "multilineSlashComments": true, + "multiLine":"\"\"\"" +} ] diff --git a/src/webpage/localuser.ts b/src/webpage/localuser.ts index aea01b7..7d7a182 100644 --- a/src/webpage/localuser.ts +++ b/src/webpage/localuser.ts @@ -1785,7 +1785,7 @@ class Localuser { //https://cdn.discordapp.com/banners/677271830838640680/fab8570de5bb51365ba8f36d7d3627ae.webp?size=240 banner.style.setProperty( "background-image", - `linear-gradient(rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0) 40%), url(${this.info.cdn}/banners/${guild.id}/${guild.banner + new CDNParams({expectedSize: 128})})`, + `linear-gradient(rgba(80, 80, 80, 1) 0%, rgba(80, 80, 80, 0) 40%), url(${this.info.cdn}/banners/${guild.id}/${guild.banner + new CDNParams({expectedSize: 128})})`, ); banner.classList.add("Banner"); //background-image: @@ -2058,8 +2058,11 @@ class Localuser { menu.bindContextmenu(iconDiv); if (folder.color !== null && folder.color !== undefined) { - icon.style.setProperty("--folder-color", "#" + folder.color.toString(16).padStart(6, "0")); - if (!folder.color && folder.color !== 0) icon.style.removeProperty("--folder-color"); + folderDiv.style.setProperty( + "--folder-color", + "#" + folder.color.toString(16).padStart(6, "0"), + ); + if (!folder.color && folder.color !== 0) folderDiv.style.removeProperty("--folder-color"); } iconDiv.append(icon); const divy = document.createElement("div"); @@ -4318,6 +4321,7 @@ class Localuser { replyingto: this.focusChannel.replyingto, }); this.focusChannel.replyingto = null; + this.focusChannel.makereplybox(); } } @@ -4695,7 +4699,7 @@ class Localuser { maybe.sort((a, b) => b[0] - a[0]); this.MDSearchOptions( maybe.map((a) => { - return {name: "# " + a[1].name, replace: `<#${a[1].id}> `}; + return {name: "# " + a[1].shortName, replace: `<#${a[1].id}> `}; }), original, box, diff --git a/src/webpage/oauth2/auth.ts b/src/webpage/oauth2/auth.ts index 7308049..f17b441 100644 --- a/src/webpage/oauth2/auth.ts +++ b/src/webpage/oauth2/auth.ts @@ -29,7 +29,7 @@ type botjsonfetch = { guild_id: null | string; bot_public: boolean; bot_require_code_grant: boolean; - verify_key: "IMPLEMENTME"; //no clue what this is meant to be :P + verify_key: string; //application client secret flags: number; }; bot: { diff --git a/src/webpage/style.css b/src/webpage/style.css index d20f2e7..f326edd 100644 --- a/src/webpage/style.css +++ b/src/webpage/style.css @@ -1940,14 +1940,13 @@ span.instanceStatus { display: flex; justify-content: center; align-items: center; - background: var(--folder-bg); border-radius: 16px; margin: 2px; margin-bottom: 8px; cursor: pointer; } .folder-div { - background: color-mix(in srgb, var(--primary-text-soft), 70% transparent); + background: color-mix(in srgb, var(--folder-color, var(--accent-color)), 70% transparent); padding: 3px; margin: -3px; border-radius: 16px; @@ -2073,10 +2072,13 @@ span.instanceStatus { user-select: none; } .Banner { - height: 100px; + height: 8em; align-items: start; padding-top: 10px; background-size: cover; + .ellipsis { + text-shadow: 0px 0px 8px black; + } } #serverName { font-size: 1rem; @@ -2558,6 +2560,9 @@ span.instanceStatus { opacity: 0.5; position: absolute; cursor: text; + text-wrap: nowrap; + width: 100%; + overflow: hidden; } .outerTypeBox { max-height: 50svh; @@ -3479,15 +3484,17 @@ img.bigembedimg { width: 300px; max-height: 100svh; background: var(--card-bg); - box-shadow: - 0 0 8px var(--shadow), - inset 0 132px 64px var(--accent_color); + box-shadow: inset 0 0 300px 350px var(--accent_color); + opacity: 1; border-radius: 8px; overflow: hidden; align-items: flex-start; z-index: 3; display: flex; flex-direction: column; + .infosection { + background-color: color-mix(in srgb, var(--secondary-bg) 75%, transparent); + } &:not(.hypoprofile) { animation-duration: 0.2s; animation-name: fade-in; @@ -3500,7 +3507,7 @@ img.bigembedimg { margin-bottom: 10px; box-sizing: border-box; padding: 10px; - background: var(--secondary-bg); + background-color: color-mix(in srgb, var(--secondary-bg) 75%, transparent); border: none; border-radius: 5px; font-size: 14px; @@ -4332,7 +4339,8 @@ fieldset input[type="radio"] { .traceBars { padding: 10px 0px; } -.mutGuildBox, .mutFriends { +.mutGuildBox, +.mutFriends { background: var(--primary-bg); padding: 6px; cursor: pointer; diff --git a/src/webpage/themes.css b/src/webpage/themes.css index 61e9b42..3b05904 100644 --- a/src/webpage/themes.css +++ b/src/webpage/themes.css @@ -24,7 +24,7 @@ --primary-text-soft: #adb8b9; --secondary-bg: #16191b; --secondary-hover: #252b2c; - --servers-bg: #191c1d; + --servers-bg: #151718; --channels-bg: #2a2d33; --channel-selected: #3c4046; --typebox-bg: #3a3e45; diff --git a/src/webpage/user.ts b/src/webpage/user.ts index 9282629..65c06d9 100644 --- a/src/webpage/user.ts +++ b/src/webpage/user.ts @@ -1447,7 +1447,7 @@ class User extends SnowFlake { }; (async () => { const high = await this.highInfo(); - const mut = buttons.add(I18n.profile.mut()); + const mut = buttons.add(I18n.profile.mut(high.mutual_guilds.length + "")); const mutDiv = document.createElement("div"); mutDiv.append( @@ -1466,6 +1466,11 @@ class User extends SnowFlake { gname.textContent = guild.properties.name; info.append(gname); box.append(icon, info); + box.onclick = () => { + removeAni(background); + guild.loadGuild(); + guild.loadChannel(); + }; if (nick) info.append(nick); return box; }) diff --git a/translations/en.json b/translations/en.json index 2b09e06..567f277 100644 --- a/translations/en.json +++ b/translations/en.json @@ -13,6 +13,12 @@ "whatelse": "What else do you think should happen?", "whereever": "Wherever this is" }, + "filesize": { + "B": "B", + "KB": "KB", + "MB": "MB", + "GB": "GB" + }, "@metadata": { "authors": ["MathMan05, TheGeekn°72"], "comment": "Don't know how often I'll update this top part lol // Aye, I'll take care of it", @@ -124,6 +130,7 @@ "cancel": "Cancel", "channel": { "SlowmodeCool": "Slowmode cooldown: $1", + "copyURL":"Copy channel URL", "TimeOutCool": "Timed out until: $1", "allowIcons": "Allow custom channel icons", "announcement": "Announcements", @@ -803,7 +810,7 @@ "bio": "About me:", "joined": "Account made: $1", "joinedMember": "Joined $1: $2", - "mut": "Mutual guilds", + "mut": "Mutual guilds ($1)", "mutFriends": "Mutual friends", "permInfo": "Permissions", "userInfo": "User info", diff --git a/translations/fr.json b/translations/fr.json index 670fcfb..740b33c 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -52,6 +52,7 @@ "enable": "Activer l'introduction", "title": "Bienvenue sur $1 !" }, + "copyMedia": "Copier L'URL du média", "DMs": { "add": "Ajouter quelqu'un à la discussion privée (MP)", "close": "Fermer la discussion par messages privés", @@ -123,7 +124,7 @@ "hypesquad_house_1": "Audace", "hypesquad_house_2": "Excellence", "hypesquad_house_3": "Équilibre", - "legacy_username": "a un nom d'utilisateur d'origine", + "legacy_username": "a un nom d'utilisateur hérité", "partner": "Partenaire de l'instance", "premium": "Premium", "quest_completed": "a fait une quête", @@ -149,17 +150,17 @@ "TimeOutCool": "Exclu jusqu'à : $1", "allowIcons": "Autoriser les icônes de chaîne personnalisées", "announcement": "Annonces", - "copyId": "Copier l'id du canal", - "copyIdCat": "Copier l'id de la catégorie", + "copyId": "Copier l'identifiant de la chaîne", + "copyIdCat": "Copier l'identifiant de la catégorie", "createCatagory": "Créer une catégorie", - "createChannel": "Créer un canal", - "creating": "Création du canal", + "createChannel": "Créer un chaîne", + "creating": "Création du Chaîne", "delete": "Supprimer la chaîne", "deleteCat": "Supprimer la catégorie", "icon": "Icône :", "makeInvite": "Créer une invitation", "markRead": "Marquer comme lu", - "mute": "Rendre le canal muet", + "mute": "Rendre la chaîne muette", "name": "Chaîne", "name:": "Nom de la Chaîne :", "nsfw:": "Avertissement contenu mature :", @@ -268,7 +269,7 @@ "region": "Région : $1", "title": "Gérer les sessions" }, - "discovery": "Portail de Découverte (Discovery)", + "discovery": "Portail de Découverte", "dms": "Messages privés", "edit": "Modifier", "emoji": { @@ -330,7 +331,7 @@ "guild": { "COMMUNITY": "Demander à rejoindre", "disableInvites": "Désactiver les invitations :", - "DISCOVERABLE": "Visible depuis le Portail de Découverte (Discovery)", + "DISCOVERABLE": "Visible depuis le Portail de Découverte", "INVITES_DISABLED": "Sur invitation uniquement", "adminMenu": { "changePerms": "Modifier les permissions pour rechercher", @@ -457,7 +458,7 @@ "userField": "Nom d’utilisateur :", "welcomeJank": "Bienvenue dans le client Fermi" }, - "incorrectURLS": "## Cette instance a probablement envoyé des liens incorrects.\n### Si vous êtes le propriétaire de l’instance, veuillez consulter la section *Connecting from remote machines* de [cette page](https://docs.spacebar.chat/setup/server/) pour corriger le problème.\n Souhaitez-vous que le client Fermi tente automatiquement de corriger cette erreur pour vous permettre de vous connecter à l’instance ?", + "incorrectURLS": "## Cette instance a probablement envoyé des liens incorrects.\n### Si vous êtes le propriétaire de l’instance, veuillez consulter la section *Connecting from remote machines* de [cette page](https://docs.melodychat.org/setup/server/) pour corriger le problème.\nSouhaitez-vous que le client Fermi tente automatiquement de corriger cette erreur pour vous permettre de vous connecter à l’instance ?", "instInfo": "Informations d’instance", "instanceInfo": { "contact": "Envoyer un e-mail aux administrateurs de l’instance", @@ -486,6 +487,7 @@ "invite": { "accept": "Accepter", "alreadyJoined": "Déjà rejoint", + "joining": "Rejoindre...", "channel:": "Canal :", "createInvite": "Créer une invitation", "createdAt": "Créée le : $1", @@ -1011,6 +1013,21 @@ "resolving": "résolution de l'utilisateur", "unknown": "@utilisateur-inconnu" }, + "editMode": { + "editMsg": "Échapper à $1cancel$1" + }, + "keyboard": { + "shortcuts": "Raccourcis", + "empty": "", + "descs": { + "gifSearch": "Rechercher des GIFs :" + } + }, + "domain": { + "title": "Vérifier le domaine", + "domain": "Domaine :", + "dnsinst": "1. Connectez-vous à votre fournisseur DNS\n\n2. Créer un registre DNS : \n\nNom :\n```\n_harmony.$1\n```\n\nType :\n```\nTXT\n```\n\nContenu :\n```\n$2\n```\n\n-# Il faudra probablement quelques minutes pour le DNS se propage." + }, "vc": { "joinForStream": "Rejoignez le canal vocal pour regarder", "joiningStream": "Connexion à la diffusion en cours…", diff --git a/translations/it.json b/translations/it.json index 5b899f9..2cc88c3 100644 --- a/translations/it.json +++ b/translations/it.json @@ -32,6 +32,7 @@ "desc": "Descrizione:", "title": "Benvenuto a $1!" }, + "copyMedia": "Copia URL del contenuto multimediale", "DMs": { "add": "Aggiungi qualcuno a questo DM", "close": "Chiudi DM", @@ -149,7 +150,7 @@ "text": "Testo", "timedOutUntil": "In time-out fino: $1", "topic:": "Argomento:", - "typebox": "Messaggio in $1", + "typebox": "Messaggio in # $1", "unmute": "Riattiva canale", "voice": "Voce", "deleteThread": "Elimina thread", @@ -594,14 +595,16 @@ "PIN_MESSAGES": "Consente ai membri del ruolo di fissare messaggi.", "MANAGE_EVENTS": "Consente ai membri del ruolo di modificare/cancellare eventi (esistenti e futuri).", "SEND_VOICE_MESSAGES": "Consente l'invio di messaggi vocali nei canali di testo.", - "CREATE_INSTANT_INVITE": "Consente ai membri del ruolo di creare inviti per la gilda." + "CREATE_INSTANT_INVITE": "Consente ai membri del ruolo di creare inviti per la gilda.", + "SET_VOICE_CHANNEL_STATUS": "Imposta lo stato del canale vocale" }, "readableNames": { "BYPASS_SLOWMODE": "Bypassa la slowmode", "CONNECT": "Connetti", "PIN_MESSAGES": "Fissa messaggi", "SEND_MESSAGES": "Invia messaggi", - "STREAM": "Video" + "STREAM": "Video", + "SET_VOICE_CHANNEL_STATUS": "Imposta lo stato del canale vocale" } }, "profile": { @@ -692,6 +695,12 @@ "userping": { "unknown": "@utente-sconosciuto" }, + "keyboard": { + "shortcuts": "Tasti di scelta rapida", + "descs": { + "gifSearch": "Ricerca GIF:" + } + }, "domain": { "title": "Verifica dominio", "domain": "Dominio:" diff --git a/translations/ko.json b/translations/ko.json index 245488e..e2ad31f 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -34,6 +34,7 @@ "enable": "온보딩 활성화", "title": "$1에 오신 것을 환영합니다!" }, + "copyMedia": "미디어 URL 복사", "DMs": { "add": "이 메시지에 누군가를 추가", "close": "DM 닫기", @@ -468,6 +469,7 @@ "invite": { "accept": "수락", "alreadyJoined": "이미 참여했습니다", + "joining": "가입하는 중...", "channel:": "채널:", "createInvite": "초대장 만들기", "createdAt": "만든 날짜: $1", @@ -993,6 +995,9 @@ "resolving": "사용자 해결 중", "unknown": "@unknown-user" }, + "keyboard": { + "shortcuts": "단축키" + }, "vc": { "joinForStream": "음성 채널에 참여해 시청", "joiningStream": "스트리밍에 참여 중...", diff --git a/translations/lb.json b/translations/lb.json index 11db942..2ead5b2 100644 --- a/translations/lb.json +++ b/translations/lb.json @@ -17,6 +17,7 @@ "desc": "Beschreiwung:", "title": "Wëllkomm op $1!" }, + "copyMedia": "Medien-URL kopéieren", "DMs": { "markRead": "Als gelies markéieren" }, diff --git a/translations/nl.json b/translations/nl.json index 8778932..c3e5777 100644 --- a/translations/nl.json +++ b/translations/nl.json @@ -31,6 +31,7 @@ "enable": "Inwerken inschakelen", "title": "Welkom bij $1!" }, + "copyMedia": "Media-url kopiëren", "DMs": { "add": "Iemand aan dit directe bericht toevoegen", "close": "Directe bericht sluiten", @@ -465,6 +466,7 @@ "invite": { "accept": "Accepteren", "alreadyJoined": "Al lid", + "joining": "Deelnemen...", "channel:": "Kanaal:", "createInvite": "Uitnodiging maken", "createdAt": "Gemaakt op $1", @@ -990,6 +992,16 @@ "resolving": "gebruiken aan het opzoeken", "unknown": "@onbekende-gebruiker" }, + "editMode": { + "editMsg": "Escape om te $1annuleren$1" + }, + "keyboard": { + "shortcuts": "Sneltoetsen", + "empty": "", + "descs": { + "gifSearch": "GIF's zoeken:" + } + }, "domain": { "title": "Domein verifiëren", "domain": "Domein:", diff --git a/translations/qqq.json b/translations/qqq.json index 1ac7ca8..9eb1ea0 100644 --- a/translations/qqq.json +++ b/translations/qqq.json @@ -25,6 +25,12 @@ "whatelse": "Easter egg alert message shown randomly when clicking the 'Wherever this is' link on the 404 page. It's meant to be humorous/silly.", "whereever": "Link text on the 404 page that triggers random easter egg events when clicked." }, + "filesize": { + "B": "SI unit bytes abbreviated", + "KB": "SI unit kilobytes abbreviated", + "MB": "SI unit megabytes abbreviated", + "GB": "SI unit gigabytes abbreviated" + }, "onboarding": { "name": "Settings section title for the guild onboarding feature.", "disable": "Button label to disable the onboarding feature for a guild.", diff --git a/translations/sk.json b/translations/sk.json index 205a31e..05fcdf0 100644 --- a/translations/sk.json +++ b/translations/sk.json @@ -988,6 +988,9 @@ "resolving": "zisťuje sa používateľ", "unknown": "@neznámy-používateľ" }, + "editMode": { + "editMsg": "Escapovať na $1cancel$1" + }, "domain": { "title": "Overiť doménu", "domain": "Doména:", diff --git a/translations/zh-hans.json b/translations/zh-hans.json index d236b15..785f913 100644 --- a/translations/zh-hans.json +++ b/translations/zh-hans.json @@ -39,6 +39,7 @@ "enable": "启用入门", "title": "欢迎来到$1!" }, + "copyMedia": "复制媒体 URL", "DMs": { "add": "将某人添加到此私信", "close": "关闭私信", @@ -160,7 +161,7 @@ "text": "文字", "timedOutUntil": "超时至:$1", "topic:": "主题:", - "typebox": "在$1的消息", + "typebox": "在 # $1 的消息", "unmute": "取消静音频道", "voice": "语音", "deleteThread": "删除帖子", @@ -473,6 +474,7 @@ "invite": { "accept": "接受", "alreadyJoined": "已加入", + "joining": "正在加入…", "channel:": "频道:", "createInvite": "创建邀请", "createdAt": "创建于 $1", @@ -748,7 +750,8 @@ "REQUEST_TO_SPEAK": "允许该身份组成员请求在表演频道发言。", "USE_EMBEDDED_ACTIVITIES": "允许该身份组成员使用嵌入式活动。", "USE_APPLICATION_COMMANDS": "允许该身份组成员使用应用程序命令。", - "USE_EXTERNAL_APPS": "允许该身份组成员以应用程序产生的回复在频道中公开显示(禁用此功能后,用户仍可使用其应用,但回复将仅他们自己可见。此功能仅适用于未安装到公会的应用程序)。" + "USE_EXTERNAL_APPS": "允许该身份组成员以应用程序产生的回复在频道中公开显示(禁用此功能后,用户仍可使用其应用,但回复将仅他们自己可见。此功能仅适用于未安装到公会的应用程序)。", + "SET_VOICE_CHANNEL_STATUS": "设置语音频道状态" }, "readableNames": { "ADD_REACTIONS": "添加反应", @@ -801,7 +804,8 @@ "VIEW_AUDIT_LOG": "查看审计日志", "VIEW_CHANNEL": "查看频道", "VIEW_CREATOR_MONETIZATION_ANALYTICS": "查看创建者变现分析", - "VIEW_GUILD_INSIGHTS": "查看公会洞见" + "VIEW_GUILD_INSIGHTS": "查看公会洞见", + "SET_VOICE_CHANNEL_STATUS": "设置语音频道状态" } }, "pinMessage": "固定消息", @@ -998,6 +1002,16 @@ "resolving": "正在解析用户", "unknown": "@未知用户" }, + "editMode": { + "editMsg": "按下“Esc”以$1取消$1" + }, + "keyboard": { + "shortcuts": "快捷键", + "empty": "<未设置键位绑定>", + "descs": { + "gifSearch": "搜索 GIF:" + } + }, "domain": { "title": "验证域名", "domain": "域名:",