2026-09-19 18:20:59 +03:00
{
"app" : {
"name" : "glchat" ,
2026-09-19 21:50:06 +03:00
"tagline" : "Self-hosted communication: text, voice, video" ,
"skipToContent" : "Skip to content"
2026-09-19 18:20:59 +03:00
} ,
"status" : {
"title" : "Foundation deployed" ,
"description" : "The server responds, the database runs in WAL mode, migrations are applied. Chat features arrive in the next phases." ,
"connecting" : "Checking server status…" ,
"instance" : "Instance" ,
"version" : "Version" ,
"apiVersion" : "API version" ,
"schemaReady" : "Database" ,
"schemaOk" : "ready" ,
"maxUpload" : "Maximum upload size" ,
"checks" : "Checks" ,
2026-09-19 21:50:06 +03:00
"retry" : "Retry" ,
"back" : "Back" ,
"users" : "Users" ,
"guilds" : "Servers" ,
"registration" : "Registration"
2026-09-19 18:20:59 +03:00
} ,
"health" : {
"online" : "Server is reachable" ,
"offline" : "Server is unreachable"
} ,
"errors" : {
"network.unreachable" : "The server is not responding. Check your connection and try again." ,
"network.aborted" : "The request was aborted." ,
"instance.not_ready" : "The instance is still starting. Try again in a few seconds." ,
"internal.error" : "Internal server error." ,
"not_found" : "The requested resource was not found." ,
2026-09-19 21:50:06 +03:00
"unknown" : "Unknown error ({{code}})." ,
"auth.2fa_required" : "Enter the two-factor code from your authenticator app." ,
"auth.totp_invalid" : "The two-factor code is incorrect." ,
"auth.invalid_credentials" : "Wrong email or password." ,
"auth.step_up_required" : "Confirm your identity: enter your password again." ,
"auth.guild_limit_reached" : "You have reached the server limit on this instance." ,
"auth.session_invalid" : "Your session has expired. Sign in again." ,
"auth.unauthorized" : "Sign-in is required." ,
"auth.registration_disabled" : "Registration is disabled on this instance." ,
"auth.username_taken" : "This username is already taken." ,
"auth.email_taken" : "This email is already registered." ,
"auth.weak_password" : "The password is too weak. Use at least 8 characters." ,
"auth.too_many_attempts" : "Too many attempts. Try again later." ,
"permissions.denied" : "You do not have permission for this action." ,
"instance.admin_required" : "This action is available to the instance admin only." ,
"guild.not_found" : "Server not found." ,
"guild.member_limit_reached" : "This server has reached its member limit." ,
"channel.not_found" : "Channel not found." ,
"validation.failed" : "Check the fields you filled in." ,
2026-09-20 00:15:18 +03:00
"rate.limited" : "Too many requests. Please wait a moment." ,
"perm.denied" : "You do not have permission to do that." ,
"rate_limited" : "Too many requests. Please wait a moment." ,
"message.edit_window_expired" : "This message can no longer be edited: more than 24 hours passed." ,
"file.too_large" : "The file exceeds the allowed size." ,
"request.bad" : "Malformed request." ,
2026-09-20 01:39:04 +03:00
"file.not_found" : "File not found." ,
"invite.expired" : "This invite has expired." ,
"invite.exhausted" : "This invite has no uses left." ,
2026-09-20 18:13:04 +03:00
"user.not_found" : "No user with that username was found." ,
"emoji" : {
"name_taken" : "An emoji with that name already exists." ,
"invalid_type" : "PNG, JPEG, WebP and GIF are supported." ,
"invalid_name" : "Emoji name: 2– 32 characters — latin letters, digits and “_”."
} ,
"emojis" : {
"limit_reached" : "The server has reached its emoji limit."
2026-09-20 18:38:54 +03:00
} ,
"voice.disabled" : "Voice is not configured on this instance." ,
"voice.channel_full" : "No free slots in this room." ,
2026-09-20 19:30:43 +03:00
"voice.token_refresh_failed" : "Could not renew the voice session. Please join again." ,
"sound" : {
"invalid_type" : "MP3, OGG, WAV, WebM and M4A are supported." ,
"invalid_name" : "Sound name: 2– 32 characters, latin letters, digits and «_»." ,
"name_taken" : "A sound with this name already exists."
} ,
"sounds" : {
"limit_reached" : "The limit of sounds of this kind is reached." ,
"event_required" : "Choose an event for a palette sound."
} ,
"voice.not_connected" : "Join a voice channel first."
2026-09-19 18:20:59 +03:00
} ,
"theme" : {
"switchToLight" : "Light theme" ,
2026-09-19 21:50:06 +03:00
"switchToDark" : "Dark theme" ,
"label" : "Theme" ,
"dark" : "Dark" ,
"light" : "Light"
2026-09-19 18:20:59 +03:00
} ,
"language" : {
"label" : "Language" ,
"ru" : "Русский" ,
"en" : "English"
} ,
2026-09-19 21:50:06 +03:00
"common" : {
"loading" : "Loading…" ,
"retry" : "Retry" ,
"cancel" : "Cancel" ,
"close" : "Close" ,
"save" : "Save" ,
"saving" : "Saving…" ,
"create" : "Create" ,
"creating" : "Creating…" ,
"join" : "Join" ,
"leave" : "Leave" ,
"back" : "Back" ,
"copy" : "Copy" ,
"copied" : "Copied" ,
2026-09-21 00:26:50 +03:00
"delete" : "Delete" ,
2026-09-19 21:50:06 +03:00
"yes" : "Yes" ,
"no" : "No" ,
"optional" : "optional" ,
"dismiss" : "Dismiss"
} ,
2026-09-19 18:20:59 +03:00
"footer" : {
"source" : "Source code" ,
"license" : "AGPL-3.0"
2026-09-19 21:50:06 +03:00
} ,
"auth" : {
"login" : {
"title" : "Sign in" ,
"subtitle" : "Sign in to keep talking" ,
"email" : "Email" ,
"emailPlaceholder" : "you@example.com" ,
"password" : "Password" ,
2026-09-20 01:32:11 +03:00
"totp" : "2FA or recovery code" ,
"totpHint" : "If 2FA is enabled; a recovery code like xxxx-xxxx-xxxx also works." ,
2026-09-19 21:50:06 +03:00
"submit" : "Sign in" ,
"submitting" : "Signing in…" ,
"noAccount" : "No account yet?" ,
"registerLink" : "Create one" ,
"forgot" : "Forgot your password? Ask the instance admin." ,
"instanceStatus" : "Instance status" ,
2026-09-20 01:32:11 +03:00
"registrationDisabled" : "Registration on this instance is disabled by the admin." ,
"totpRequired" : "Enter the 2FA or recovery code — sign-in needs it."
2026-09-19 21:50:06 +03:00
} ,
"register" : {
"title" : "Create account" ,
"subtitle" : "Create an account on {{instance}}" ,
"username" : "Username" ,
"usernameHint" : "3– 32 characters: latin letters, digits, “_” and “-”." ,
"displayName" : "Display name" ,
"email" : "Email" ,
"password" : "Password" ,
"passwordHint" : "At least 8 characters." ,
"requirements" : "Password requirements: {{list}}" ,
"requirementLength" : "at least 8 characters" ,
"requirementLetter" : "at least one letter" ,
"requirementDigit" : "at least one digit" ,
"submit" : "Create account" ,
"submitting" : "Creating account…" ,
"haveAccount" : "Already have an account?" ,
"loginLink" : "Sign in" ,
"disabledTitle" : "Registration is closed" ,
"disabledBody" : "The instance admin disabled self-service registration. Ask for an invite or contact the admin."
} ,
"validation" : {
"usernameFormat" : "Username: 3– 32 characters, latin letters, digits, “_” or “-”." ,
"usernameRequired" : "Enter a username." ,
"displayNameRequired" : "Enter a display name." ,
"emailInvalid" : "Enter a valid email address." ,
"passwordShort" : "The password must be at least 8 characters long." ,
"passwordLetter" : "Add at least one letter to the password." ,
"passwordDigit" : "Add at least one digit to the password." ,
"passwordMismatch" : "The passwords do not match."
}
} ,
"onboarding" : {
"title" : "Welcome to glchat" ,
"greeting" : "Hi, {{name}}!" ,
"subtitle" : "A couple of steps and you are ready." ,
"displayName" : "How should we show you?" ,
"displayNameHint" : "Other members see this name." ,
"bio" : "Tell us about yourself" ,
"bioPlaceholder" : "What you do, what you like…" ,
"language" : "Interface language" ,
"theme" : "Theme" ,
"start" : "Get started" ,
"starting" : "Preparing your workspace…" ,
"skip" : "Skip and start" ,
"note" : "You can change all of this later in settings."
} ,
"guilds" : {
"railLabel" : "Servers" ,
"listLabel" : "Server list" ,
"add" : "Create a server" ,
"addShort" : "Create a server" ,
"create" : {
"title" : "Create a server" ,
"name" : "Server name" ,
"namePlaceholder" : "For example, “Friends”" ,
"hint" : "You can rename it later in the server settings." ,
"submit" : "Create" ,
2026-09-19 22:03:46 +03:00
"limit" : "You can create at most {{count}} servers on this instance." ,
2026-09-21 18:04:52 +03:00
"limitReached" : "You have reached the server limit — remove one of your servers first." ,
"template" : "Server template" ,
"templateCounts" : "{{text}} text · {{voice}} voice · {{roles}} roles"
2026-09-19 21:50:06 +03:00
} ,
"empty" : {
2026-09-20 01:39:04 +03:00
"title" : "You have no servers yet" ,
2026-09-20 01:52:27 +03:00
"body" : "Create your own server or join one with an invite." ,
"create" : "Create your own server"
2026-09-19 21:50:06 +03:00
} ,
"leave" : "Leave server" ,
"leaveConfirm" : "Leave the server “{{name}}”?" ,
"switchTo" : "Open server {{name}}"
} ,
"channels" : {
"title" : "Channels" ,
"text" : "Text channels" ,
"voice" : "Voice channels" ,
"category" : "Category" ,
"empty" : "This server has no visible channels yet." ,
"select" : "Open channel {{name}}" ,
"add" : "Create a channel" ,
2026-09-19 23:33:59 +03:00
"settings" : "Server settings" ,
2026-09-19 21:50:06 +03:00
"create" : {
"title" : "New channel" ,
"name" : "Channel name" ,
"namePlaceholder" : "for example, general" ,
"type" : "Channel type" ,
"typeText" : "Text" ,
"typeVoice" : "Voice" ,
"parent" : "Category" ,
"noParent" : "No category" ,
"submit" : "Create"
} ,
"chatPlaceholder" : {
"title" : "Chat arrives in Phase 2" ,
"body" : "The channel “{{name}}” is ready. Messages and voice arrive in the next phase."
} ,
"noSelection" : {
"title" : "Pick a channel" ,
"body" : "The server and channel lists are on the left. Pick a channel to open it."
} ,
"notInGuild" : {
"title" : "Server unavailable" ,
"body" : "Looks like you are not a member of this server."
2026-09-20 00:15:18 +03:00
} ,
"selectUnread" : "Open channel {{name}}, {{count}} unread" ,
"selectMentions" : "Open channel {{name}}, {{count}} mentions" ,
2026-09-20 01:32:11 +03:00
"slowmode" : "slowmode {{seconds}}s" ,
2026-09-21 00:04:49 +03:00
"leaveHint" : "You can leave the server in server settings → “Danger zone”." ,
"invite" : "Invite to server" ,
"inviteTitle" : "Server invite" ,
"inviteHint" : "The link expires after a while. Send it to whoever you want to invite." ,
"inviteCreating" : "Creating a link…" ,
"inviteLink" : "Invite link" ,
"inviteCopy" : "Copy" ,
"inviteCopied" : "Copied" ,
2026-09-21 00:26:50 +03:00
"inviteNew" : "New link" ,
"settingsChannel" : "Channel settings"
2026-09-20 00:15:18 +03:00
} ,
2026-09-20 18:38:54 +03:00
"voice" : {
"title" : "Voice room" ,
"join" : "Join" ,
"joining" : "Connecting…" ,
"connected" : "Connected" ,
"reconnecting" : "Reconnecting…" ,
"refreshing" : "Renewing session…" ,
"disconnect" : "Disconnect" ,
"disabled" : "Voice is not configured on this instance" ,
"empty" : "Nobody is in the room yet" ,
"you" : "You" ,
"speaking" : "Speaking" ,
"muted" : "Microphone is off" ,
"soundOn" : "Sound is on" ,
"deafened" : "Sound is off" ,
"cameraOn" : "Camera is on" ,
"screenOn" : "Screen sharing" ,
"serverMuted" : "Microphone was muted by a moderator" ,
"serverDeafened" : "Sound was muted by a moderator" ,
"speakingWhileMuted" : "You are speaking while muted" ,
"volume" : "Participant volume" ,
"controls" : "Voice controls" ,
"channelParticipants" : "Participants of “{{name}}”" ,
"mic" : {
"on" : "Unmute microphone" ,
"off" : "Mute microphone"
} ,
"sound" : {
"on" : "Unmute sound" ,
"off" : "Mute sound"
} ,
"camera" : {
"on" : "Turn camera on" ,
"off" : "Turn camera off"
} ,
"screen" : {
"on" : "Start screen sharing" ,
2026-09-20 19:30:43 +03:00
"off" : "Stop screen sharing" ,
"quality" : "Screen share quality" ,
"presets" : {
"1080p60" : "1080p · 60 fps" ,
"1080p30" : "1080p · 30 fps" ,
"720p30" : "720p · 30 fps" ,
"480p30" : "480p · 30 fps"
}
2026-09-20 18:38:54 +03:00
} ,
"quality" : {
"excellent" : "Excellent connection" ,
"good" : "Good connection" ,
"poor" : "Poor connection" ,
"lost" : "Connection lost" ,
"unknown" : "Connecting"
} ,
"menu" : {
"label" : "Participant {{name}}" ,
"moderation" : "Moderation" ,
"mute" : "Server mute" ,
"unmute" : "Remove server mute" ,
"deafen" : "Server deafen" ,
"undeafen" : "Remove server deafen" ,
"move" : "Move" ,
"moveTo" : "Move to “{{name}}”"
} ,
"channelMenu" : {
"label" : "Voice room {{name}}"
2026-09-20 19:30:43 +03:00
} ,
"soundboard" : {
"title" : "Soundboard" ,
"open" : "Open the soundboard" ,
"searchLabel" : "Search sounds" ,
"searchPlaceholder" : "Sound name" ,
"empty" : "This server has no soundboard sounds yet." ,
"noResults" : "Nothing found." ,
"playLabel" : "Play the sound {{name}}" ,
"rateLimited" : "Too fast: try again in {{seconds}} s." ,
"notConnected" : "Join a voice channel first." ,
"playedBy" : "{{name}} played «{{sound}}»"
} ,
"stats" : {
"title" : "Statistics" ,
"open" : "Open connection statistics" ,
"resolution" : "Resolution" ,
"frameRate" : "Frame rate" ,
"codec" : "Codec" ,
"bitrate" : "Bitrate" ,
"kbps" : "kbps" ,
"ms" : "ms" ,
"rtt" : "Round-trip time" ,
"packetLoss" : "Packet loss" ,
"jitter" : "Jitter"
} ,
"publishQuality" : {
"label" : "Video quality" ,
"short" : {
"low" : "Low" ,
"medium" : "Medium" ,
"high" : "High"
} ,
"level" : {
"low" : "Low quality" ,
"medium" : "Medium quality" ,
"high" : "High quality"
}
2026-09-20 22:10:17 +03:00
} ,
"latency" : "{{ms}} ms" ,
2026-09-20 22:30:24 +03:00
"latencyHint" : "latency to the voice server" ,
2026-09-20 22:10:17 +03:00
"latencyUnknown" : "ping unknown"
2026-09-20 18:38:54 +03:00
} ,
2026-09-20 01:39:04 +03:00
"friends" : {
"rail" : "Friends" ,
"title" : "Friends" ,
"sidebarLabel" : "Friends and direct messages" ,
"sidebarHint" : "Direct messages live here — they are not in the server rail." ,
"dmSection" : "Direct messages" ,
"dmEmpty" : "No direct messages yet." ,
"friendsSection" : "Friends" ,
"friendsEmpty" : "Your friend list is empty." ,
"open" : "Open a conversation with {{name}}" ,
"empty" : {
"title" : "Add friends to start talking" ,
"body" : "Find someone by username and send a friend request — a direct conversation appears once it is accepted." ,
"search" : "Find friends"
} ,
"search" : {
"title" : "Friend search" ,
"close" : "Close search" ,
"label" : "Search by username" ,
"placeholder" : "Enter a username" ,
"hint" : "Type at least 2 characters." ,
"empty" : "Nobody found." ,
"add" : "Add friend" ,
"adding" : "Sending…" ,
"requested" : "Request sent" ,
"friend" : "Already friends" ,
2026-09-20 01:52:27 +03:00
"message" : "Message" ,
"open" : "Search friends"
2026-09-20 01:39:04 +03:00
} ,
"requests" : {
"incoming" : "Incoming requests" ,
"outgoing" : "Outgoing requests" ,
"accept" : "Accept" ,
"decline" : "Decline" ,
"cancel" : "Cancel"
} ,
"list" : {
"label" : "Friend list" ,
"message" : "Message" ,
"more" : "Actions: {{name}}" ,
"menu" : "Actions for {{name}}" ,
"remove" : "Remove friend" ,
2026-09-20 11:24:09 +03:00
"block" : "Block" ,
"toggle" : "Friends ({{count}})"
2026-09-20 01:39:04 +03:00
} ,
"lastSeen" : {
"label" : "Last seen" ,
"online" : "Online now" ,
"unknown" : "Offline for a while" ,
"at" : "Last seen: {{time}}"
} ,
"dm" : {
"unknown" : "Recipient" ,
"notFound" : {
"title" : "Conversation unavailable" ,
"body" : "This direct conversation was not found: it may be deleted or closed to you."
}
}
} ,
"invites" : {
"title" : "Join with an invite" ,
"hint" : "Paste a code or a link like https://<domain>/invite/<code>." ,
"label" : "Invite code or link" ,
"placeholder" : "e.g. ab12cd or https://example.com/invite/ab12cd" ,
"invalid" : "Could not recognise the invite code." ,
"join" : "Join" ,
"joining" : "Joining…" ,
"members" : "Members: {{count}}" ,
"alreadyMember" : "You are already on this server"
} ,
2026-09-20 00:15:18 +03:00
"chat" : {
"log" : "Message log of {{name}}" ,
"loadMore" : "Load more" ,
"loadingMore" : "Loading…" ,
"today" : "Today" ,
"yesterday" : "Yesterday" ,
"edited" : "(edited)" ,
"pending" : "sending…" ,
"newMessages" : "New messages" ,
"adminBadge" : "admin" ,
2026-09-20 12:06:22 +03:00
"types" : {
"whisper" : "whisper" ,
"scream" : "loud" ,
"private" : "private" ,
"system" : "System message"
} ,
2026-09-20 00:15:18 +03:00
"unknownAuthor" : "unknown" ,
"start" : {
"title" : "This is the start of #{{name}}" ,
2026-09-20 01:39:04 +03:00
"body" : "There are no messages here yet. Say something — everyone in the channel will see it." ,
"directTitle" : "This is the beginning of your conversation with {{name}}" ,
"directBody" : "No messages here yet. Say hello first."
2026-09-20 00:15:18 +03:00
} ,
"message" : {
"by" : "Message from {{name}} in {{channel}}" ,
"sentAt" : "Sent {{time}}"
} ,
"reply" : {
"to" : "reply to {{name}}" ,
"missing" : "deleted message" ,
"composer" : "Replying to {{name}}" ,
"cancel" : "Cancel reply"
} ,
"actions" : {
"menu" : "Message actions" ,
"reply" : "Reply" ,
"react" : "Add reaction" ,
"pin" : "Pin" ,
"unpin" : "Unpin" ,
"edit" : "Edit" ,
"delete" : "Delete" ,
"deleteConfirm" : "Delete this message?" ,
"copy" : "Copy text"
} ,
"reactions" : {
"title" : "Reactions" ,
"add" : "React with {{emoji}}" ,
"toggle" : "Reaction {{emoji}}: {{count}}"
} ,
"emoji" : {
"title" : "Emoji picker" ,
"quick" : "Quick reactions" ,
"popular" : "Popular emoji" ,
2026-09-20 18:13:04 +03:00
"pick" : "React with {{emoji}}" ,
"server" : "Server emojis" ,
"search" : "Search server emojis" ,
"searchPlaceholder" : "Emoji name" ,
"notFound" : "Nothing found." ,
"pickServer" : "Pick emoji {{name}}" ,
"animated" : "animated"
2026-09-20 00:15:18 +03:00
} ,
"edit" : {
"label" : "Edit message" ,
"hint" : "Enter to save, Escape to cancel" ,
"save" : "Save" ,
"cancel" : "Cancel"
} ,
"composer" : {
"label" : "Message to {{name}}" ,
"placeholder" : "Message #{{name}}" ,
"send" : "Send" ,
"hint" : "Enter to send, Shift+Enter for a new line" ,
"attach" : "Attach a file" ,
"fileInput" : "Choose files" ,
"uploading" : "Uploading attachments…" ,
"attachments" : "Message attachments" ,
"removeAttachment" : "Remove attachment {{name}}" ,
"counter" : "{{count}}/{{max}}" ,
"tooLarge" : "File “{{name}}” exceeds the {{limit}} limit" ,
"rateLimited" : "Too many messages. You can send again in {{seconds}} s." ,
"denied" : "You are not allowed to send messages in this channel." ,
2026-09-20 01:39:04 +03:00
"readOnly" : "This channel is read-only for you." ,
"directLabel" : "Message to {{name}}" ,
2026-09-20 12:06:22 +03:00
"directPlaceholder" : "Message {{name}}" ,
"autocomplete" : {
"hint" : "↑/↓ — select, Enter — insert, Escape — close" ,
"mentions" : "Server members" ,
"channels" : "Server channels" ,
"emoji" : "Emoji" ,
"commands" : "Commands"
} ,
"commands" : {
"me" : "action: name and italic text" ,
"whisper" : "whisper: muted message" ,
"scream" : "loud: large accented text" ,
"ls" : "direct message: /ls username text"
2026-09-20 18:13:04 +03:00
} ,
"emoji" : "Emoji"
2026-09-20 00:15:18 +03:00
} ,
"typing_one" : "{{names}} is typing…" ,
"typing_few" : "{{names}} are typing…" ,
"typing_many" : "{{names}} are typing…" ,
"typing_other" : "{{names}} are typing…" ,
"pins" : {
"open" : "Pinned messages" ,
"title" : "Pinned in #{{name}}" ,
"empty" : "No pinned messages in this channel yet." ,
"jump" : "Jump"
} ,
"search" : {
"open" : "Search this channel" ,
"title" : "Message search" ,
"label" : "Search field" ,
"placeholder" : "Search messages" ,
"hint" : "Type at least two characters." ,
"empty" : "Nothing found."
} ,
"unread" : "Unread messages: {{count}}" ,
2026-09-20 01:32:11 +03:00
"mentions" : "Mentions: {{count}}" ,
"spoiler" : {
"show" : "Reveal spoiler" ,
"hide" : "Hide spoiler"
2026-09-20 01:39:04 +03:00
} ,
2026-09-20 18:13:04 +03:00
"logDirect" : "Direct conversation with {{name}}" ,
"system" : {
"member" : "a member" ,
"memberJoin" : "{{name}} joined the server" ,
"memberKick" : "{{name}} left the server (kicked)" ,
"channelCreated" : "Room #{{name}} created" ,
2026-09-20 19:30:43 +03:00
"voiceChannelCreated" : "Voice room {{name}} created" ,
"memberLeave" : "{{name}} left the server"
2026-09-21 00:26:50 +03:00
} ,
"webhookBadge" : "webhook" ,
"webhookAuthor" : "webhook"
2026-09-19 21:50:06 +03:00
} ,
"user" : {
"panelLabel" : "User panel" ,
"settings" : "User settings" ,
2026-09-19 23:33:59 +03:00
"menu" : {
"label" : "User menu" ,
"open" : "Open the user menu" ,
"account" : "Account settings" ,
"guilds" : "Server settings" ,
2026-09-20 01:32:11 +03:00
"status" : "Status" ,
"noBio" : "No bio yet."
2026-09-19 23:33:59 +03:00
} ,
2026-09-19 21:50:06 +03:00
"logout" : "Sign out" ,
"loggingOut" : "Signing out…" ,
"statusLabel" : "Status: {{status}}" ,
"status" : {
"online" : "Online" ,
"idle" : "Idle" ,
"dnd" : "Do not disturb" ,
"invisible" : "Invisible" ,
"offline" : "Offline"
2026-09-20 01:32:11 +03:00
} ,
"voice" : {
"input" : "Input device" ,
"output" : "Output device" ,
"camera" : "Camera" ,
"micVolume" : "Microphone volume" ,
"outputVolume" : "Sound volume" ,
"micOn" : "Unmute microphone" ,
"micOff" : "Mute microphone" ,
"cameraOn" : "Turn camera on" ,
"cameraOff" : "Turn camera off" ,
"soundOn" : "Undeafen" ,
"soundOff" : "Deafen" ,
"micSettings" : "Microphone settings" ,
"cameraSettings" : "Camera settings" ,
"soundSettings" : "Sound settings" ,
"audioSettings" : "Audio & video settings"
} ,
"devices" : {
"default" : "Default device" ,
"unavailable" : "Devices are unavailable" ,
"empty" : "No devices found" ,
"unnamed" : "Device {{index}}"
2026-09-19 21:50:06 +03:00
}
} ,
"gateway" : {
"label" : "Connection" ,
"status" : {
"idle" : "Not connected" ,
"connecting" : "Connecting…" ,
"connected" : "Connected" ,
"reconnecting" : "Reconnecting…" ,
"disconnected" : "Connection lost"
} ,
"invalidated" : "The server closed the session. Sign in again."
} ,
"settings" : {
"title" : "Settings" ,
"back" : "Back to app" ,
2026-09-19 23:33:59 +03:00
"switcher" : {
"label" : "Settings sections" ,
"account" : "Server settings" ,
"servers" : "My servers"
} ,
2026-09-19 21:50:06 +03:00
"tabs" : {
"label" : "Settings sections" ,
"profile" : "Profile" ,
"security" : "Security" ,
"appearance" : "Appearance" ,
2026-09-20 01:32:11 +03:00
"notifications" : "Notifications" ,
2026-09-20 11:24:09 +03:00
"server" : "Server" ,
2026-09-20 01:32:11 +03:00
"voice" : "Audio & video" ,
"language" : "Language & region" ,
2026-09-21 00:26:50 +03:00
"instance" : "Instance" ,
"channel" : "Channel"
2026-09-19 21:50:06 +03:00
} ,
"profile" : {
2026-09-20 11:24:09 +03:00
"avatar.change" : "Change avatar" ,
"avatar.uploading" : "Uploading…" ,
2026-09-19 21:50:06 +03:00
"title" : "Profile" ,
"description" : "How other members see you." ,
"displayName" : "Display name" ,
"bio" : "About me" ,
"bioPlaceholder" : "A few words about you" ,
"customStatus" : "Custom status" ,
"customStatusPlaceholder" : "For example, “Writing code”" ,
"customStatusEmoji" : "Status emoji" ,
"customStatusEmojiPlaceholder" : "🚀" ,
"saved" : "Profile saved." ,
"username" : "Username" ,
"badges" : "Badges" ,
2026-09-20 01:32:11 +03:00
"noBadges" : "none" ,
"tabsLabel" : "Profile tabs" ,
"tabs" : {
"main" : "General" ,
"server" : "Server"
} ,
"timezoneDefault" : "default (MSK)" ,
"avatar" : {
2026-09-20 11:24:09 +03:00
"change" : "Change avatar" ,
"choose" : "Choose avatar file" ,
2026-09-20 01:32:11 +03:00
"remove" : "Remove avatar" ,
2026-09-20 11:24:09 +03:00
"formats" : "JPEG, PNG, WebP, GIF" ,
"limit" : "{{formats}} up to {{limit}}" ,
"tooLarge" : "The file is larger than {{limit}} — pick a smaller image." ,
"uploading" : "Uploading…"
2026-09-20 01:32:11 +03:00
} ,
"decorations" : {
"title" : "Decorations" ,
"hint" : "Profile badges and frames." ,
"empty" : "No decorations yet." ,
"stub" : "Badges, frames and profile effects are coming later."
2026-09-21 01:28:48 +03:00
} ,
"style" : {
"title" : "Profile decoration" ,
"description" : "Frame, icon, nick colour and effect. You can only pick what your roles grant: on a server the role wins, then the per-server style, then the friends style." ,
"scope" : "Where to apply" ,
"scopeGlobal" : "For friends (DMs and global places)" ,
"preview" : "preview" ,
"frame" : "Avatar frame" ,
"badge" : "Icon next to the nick" ,
"color" : "Nick colour" ,
"colorDefault" : "Same as role" ,
"effect" : "Nick effect" ,
"none" : "No element" ,
"noFrames" : "No frames granted by roles yet — a server admin grants them." ,
"noBadges" : "No icons granted by roles yet." ,
"reset" : "Reset style" ,
"priorityHint" : "Changes apply immediately." ,
"effects" : {
"none" : "No effect" ,
"gradient" : "Gradient" ,
"glow" : "Glow" ,
"fire" : "Fire" ,
"shimmer" : "Shimmer" ,
"glitch" : "Glitch"
}
2026-09-20 01:32:11 +03:00
}
2026-09-19 21:50:06 +03:00
} ,
"security" : {
"title" : "Security" ,
"description" : "Password, active sessions and two-factor authentication." ,
"passwordTitle" : "Change password" ,
"currentPassword" : "Current password" ,
"newPassword" : "New password" ,
"confirmPassword" : "Repeat the new password" ,
"submitPassword" : "Change password" ,
"passwordChanged" : "Password changed." ,
"stepUpTitle" : "Confirm your identity" ,
"stepUpBody" : "The server requires your password again for this action{{totp}}." ,
"stepUpTotp" : " and a 2FA code" ,
"stepUpSubmit" : "Confirm" ,
"stepUpSuccess" : "Identity confirmed." ,
"stepUpExpired" : "The confirmation expired, enter your password again." ,
"stepUpPassword" : "Your password" ,
"sessionsTitle" : "Active sessions" ,
"sessionsEmpty" : "No active sessions." ,
"sessionCurrent" : "current" ,
"sessionCreated" : "Created" ,
"sessionSeen" : "Last seen" ,
"sessionIp" : "IP" ,
"sessionAgent" : "Device" ,
"unknownAgent" : "Unknown device" ,
"logoutAll" : "Sign out everywhere" ,
"logoutAllConfirm" : "End all sessions, including this one?" ,
"logoutAllDone" : "All sessions have been ended." ,
"twoFactorTitle" : "Two-factor authentication" ,
"twoFactorEnabled" : "2FA is on" ,
"twoFactorDisabled" : "2FA is off" ,
"twoFactorEnable" : "Enable 2FA" ,
"twoFactorSetupHint" : "Add the secret to your authenticator app, then enter the six-digit code." ,
"twoFactorSecret" : "Secret" ,
"twoFactorUri" : "otpauth link" ,
"twoFactorQrAlt" : "QR code for 2FA setup" ,
"twoFactorQrUnavailable" : "The QR code is unavailable — add the secret manually." ,
"twoFactorCode" : "Code from the app" ,
"twoFactorConfirm" : "Enable" ,
"twoFactorEnabledDone" : "2FA is enabled. Save your recovery codes." ,
"recoveryTitle" : "Recovery codes" ,
"recoveryHint" : "Every code works once. They are shown only once." ,
"recoveryCopyAll" : "Copy all codes"
} ,
"appearance" : {
"title" : "Appearance" ,
"description" : "Interface theme and language. Stored locally in your browser." ,
"theme" : "Theme" ,
"themeHint" : "The dark theme is on by default." ,
"language" : "Language" ,
"languageHint" : "Russian is the primary interface language."
} ,
"instance" : {
"title" : "Instance" ,
"description" : "Instance admin only. Read-only data." ,
"notAdmin" : "This section is available to the instance admin only." ,
"settings" : "Instance settings" ,
"settingsEmpty" : "No settings configured." ,
"guilds" : "Servers ({{count}})" ,
"guildsEmpty" : "No servers." ,
2026-09-20 11:24:09 +03:00
"userId" : "User ID" ,
2026-09-19 21:50:06 +03:00
"users" : "Users ({{count}})" ,
"usersEmpty" : "No users." ,
"audit" : "Audit log (last {{count}})" ,
"auditEmpty" : "No entries." ,
"memberCount" : "{{count}} members" ,
"adminBadge" : "admin" ,
2026-09-20 11:24:09 +03:00
"mainBadge" : "main" ,
2026-09-20 21:26:25 +03:00
"usersIdHint" : "User IDs are visible to the instance administrator only." ,
"dashboard" : {
"title" : "Server dashboard" ,
"refreshHint" : "updates every second" ,
"cpu" : "CPU" ,
"cpuCaption_one" : "{{count}} core" ,
"cpuCaption_few" : "{{count}} cores" ,
"cpuCaption_many" : "{{count}} cores" ,
"cpuCaption_other" : "{{count}} cores" ,
"memory" : "Memory" ,
"diskHint" : "Disk: used / total. {{free}} free" ,
2026-09-20 22:10:17 +03:00
"databaseHint" : "Database: main file and WAL ({{wal}})" ,
"containerRow" : "Instance container" ,
"containerHint" : "Profile limits" ,
"hostRow" : "Whole server" ,
"hostHint" : "Entire machine"
2026-09-20 21:26:25 +03:00
} ,
"health" : {
"title" : "Instance healthcheck" ,
"collecting" : "Collecting data…" ,
"unavailable" : "The instance does not answer dashboard requests." ,
"ping" : "Ping" ,
"pingValue" : "{{ms}} ms" ,
"pingUnavailable" : "—" ,
2026-09-20 22:43:56 +03:00
"pingHint" : "Instance response time for a dashboard request (HTTP)" ,
2026-09-20 21:26:25 +03:00
"summary" : {
"ok" : "All good" ,
"warn" : "Warnings" ,
"failed" : "Errors"
} ,
"status" : {
"ok" : "running" ,
"warn" : "warning" ,
"failed" : "failed" ,
"off" : "disabled"
} ,
"checks" : {
"app" : "Application" ,
"database" : "Database" ,
"disk" : "Disk" ,
"storage" : "Data writes" ,
"voice" : "Voice (SFU)" ,
"gateway" : "Gateway" ,
"metrics" : "Metrics"
}
}
2026-09-19 23:33:59 +03:00
} ,
"servers" : {
"pickerLabel" : "My servers" ,
"empty" : "You have no servers yet." ,
"emptyTitle" : "No servers yet" ,
"emptyHint" : "Join the instance main server or create your own — its settings will show up here." ,
"select" : "Open settings of the server {{name}}" ,
"notFound" : "The server was not found among the ones you can access." ,
"readOnlyHint" : "Only the owner and members with ADMINISTRATOR or MANAGE_GUILD can edit this." ,
"general" : {
"title" : "General" ,
"description" : "Every member sees the server name and description." ,
"name" : "Server name" ,
"guildDescription" : "Description" ,
"descriptionPlaceholder" : "What this server is about" ,
"saved" : "Server settings saved."
} ,
"nickname" : {
"title" : "My profile on this server" ,
"description" : "The nickname is visible on this server only." ,
"label" : "Nickname" ,
"placeholder" : "Leave empty to reset the nickname" ,
"current" : "Current nickname:" ,
"none" : "not set" ,
2026-09-20 01:32:11 +03:00
"saved" : "Nickname saved." ,
"applyAll" : "Apply to all servers" ,
"applyAllHint" : "One nickname for every server you are in." ,
"applyAllPending" : "Applying…" ,
"applyAllProgress" : "Servers updated: {{done}} of {{total}}" ,
"applyAllDone" : "Nickname applied on all servers ({{total}})." ,
"applyAllFailed" : "Failed to update servers: {{failed}}."
2026-09-19 23:33:59 +03:00
} ,
"members" : {
"title" : "Members" ,
"description" : "The first {{limit}} members of the server." ,
"empty" : "No members found." ,
"roles" : "Roles: {{roles}}" ,
2026-09-20 23:04:35 +03:00
"more" : "The full member list with roles arrives in the next phases." ,
"moderate" : "Moderate {{name}}" ,
"timeout" : "Timeout" ,
"timeoutClear" : "Clear timeout" ,
"banReason" : "Ban reason" ,
"banReasonPlaceholder" : "optional" ,
"ban" : "Ban" ,
"kick" : "Kick"
2026-09-19 23:33:59 +03:00
} ,
"roles" : {
"title" : "Roles" ,
"description" : "Role colour and position. Role management arrives in the next phases." ,
"empty" : "This server has no roles yet." ,
"position" : "Position {{position}}" ,
2026-09-21 01:28:48 +03:00
"default" : "default" ,
"frame" : "Frame" ,
"badge" : "Icon" ,
"nickColor" : "Nick colour" ,
"nickEffect" : "Nick effect" ,
"decorationSaved" : "Role decoration saved."
2026-09-19 23:33:59 +03:00
} ,
"danger" : {
"title" : "Danger zone" ,
"description" : "These actions cannot be undone." ,
"leaveOwnerHint" : "The owner cannot leave their own server: transfer ownership or delete the server first." ,
"leaveHint" : "Leave the server and lose access to its channels." ,
"leave" : "Leave server" ,
"leaveConfirmTitle" : "Leave the server?" ,
"leaveConfirmBody" : "You will leave “{{name}}”. You can come back with an invite." ,
"leaveConfirm" : "Leave" ,
"deleteHint" : "Delete the server together with its channels, roles and members." ,
"delete" : "Delete server" ,
"deleteConfirmTitle" : "Delete the server?" ,
"deleteConfirmBody" : "“{{name}}” will be deleted permanently." ,
"deleteConfirm" : "Delete"
2026-09-20 01:32:11 +03:00
} ,
2026-09-20 18:13:04 +03:00
"selectLabel" : "Choose a server" ,
"emojis" : {
"title" : "Emojis" ,
"description" : "Custom server emojis: up to {{limit}}, 512 KB each." ,
"counter" : "{{count}} of {{limit}}" ,
"empty" : "The server has no emojis yet." ,
"animated" : "animated" ,
"rename" : "Rename" ,
"renameLabel" : "Rename emoji {{name}}" ,
"renameTitle" : "Rename emoji" ,
"delete" : "Delete" ,
"deleteLabel" : "Delete emoji {{name}}" ,
"deleteConfirmTitle" : "Delete emoji?" ,
"deleteConfirmBody" : "Emoji {{name}} will be deleted permanently." ,
"deleteConfirm" : "Delete" ,
"uploadTitle" : "Upload an emoji" ,
"uploadHint" : "Drop a file below or pick one: PNG, JPEG, WebP or GIF up to {{limit}}." ,
"name" : "Emoji name" ,
"namePlaceholder" : "for example, pepe_happy" ,
"nameHint" : "2– 32 characters: latin letters, digits and “_”." ,
"dropHint" : "Drop a file here" ,
"chooseFile" : "Choose file" ,
"file" : "Emoji file" ,
"fileSelected" : "{{name}} · {{size}}" ,
"upload" : "Upload" ,
"uploading" : "Uploading…"
2026-09-20 19:30:43 +03:00
} ,
"sounds" : {
"title" : "Sounds" ,
"description" : "Server soundboard and sound palette: up to {{limit}} sounds of each kind, 512 KB each." ,
"counter" : "{{count}} of {{limit}}" ,
"empty" : "No sounds of this kind yet." ,
"uploadTitle" : "Upload a sound" ,
"uploadHint" : "Drop a file below or choose it: MP3, OGG, WAV, WebM or M4A up to {{limit}}." ,
"name" : "Sound name" ,
"namePlaceholder" : "for example, airhorn" ,
"nameHint" : "2– 32 characters: latin letters, digits and «_»." ,
"emoji" : "Emoji" ,
"emojiPlaceholder" : "for example, 📣" ,
"emojiHint" : "Optional icon for the soundboard grid." ,
"event" : "Event" ,
"dropHint" : "Drop the file here" ,
"file" : "Sound file" ,
"chooseFile" : "Choose a file" ,
"fileSelected" : "{{name}} · {{size}}" ,
"upload" : "Upload" ,
"uploading" : "Uploading…" ,
"rename" : "Rename" ,
"renameLabel" : "Rename the sound {{name}}" ,
"renameTitle" : "Rename the sound" ,
"delete" : "Delete" ,
"deleteLabel" : "Delete the sound {{name}}" ,
"deleteConfirmTitle" : "Delete the sound?" ,
"deleteConfirmBody" : "The sound {{name}} will be deleted permanently." ,
"deleteConfirm" : "Delete" ,
"kinds" : {
"soundboard" : "Soundboard" ,
"ui" : "Sound palette"
} ,
"events" : {
"member_join" : "Member joined" ,
"member_leave" : "Member left" ,
"mention" : "Mention" ,
"message" : "New message" ,
"message_send" : "Message sent" ,
"voice_join" : "Joined a voice channel" ,
"voice_leave" : "Left a voice channel" ,
"mic_on" : "Microphone on" ,
"mic_off" : "Microphone off" ,
"camera_on" : "Camera on" ,
"camera_off" : "Camera off" ,
"screen_on" : "Screen share started" ,
"screen_off" : "Screen share stopped" ,
"kick" : "Member kicked" ,
"ban" : "Member banned" ,
"mute" : "Member muted" ,
"role_grant" : "Role granted" ,
"role_revoke" : "Role revoked"
}
2026-09-20 22:43:56 +03:00
} ,
"bans" : {
"title" : "Bans" ,
"description" : "Banned users cannot return by invite until the ban is lifted." ,
"empty" : "No bans." ,
"remove" : "Unban" ,
"noReason" : "no reason" ,
"bannedBy" : "banned by {{name}}, {{date}}" ,
"unknownActor" : "unknown" ,
"timeoutLabel" : "Timeout:" ,
"timeoutMinutes_one" : "{{count}} minute" ,
"timeoutMinutes_few" : "{{count}} minutes" ,
"timeoutMinutes_many" : "{{count}} minutes" ,
"timeoutMinutes_other" : "{{count}} minutes" ,
"timeoutAction" : "Timeout {{minutes}} min"
} ,
"audit" : {
"title" : "Audit log" ,
"description" : "Guild moderator actions. Filters are applied server-side." ,
"filterAction" : "Action" ,
"filterActor" : "Actor ID" ,
"filterTarget" : "Target ID" ,
"apply" : "Apply" ,
"reset" : "Reset" ,
"empty" : "No entries."
2026-09-20 23:34:05 +03:00
} ,
"appearance" : {
"title" : "Appearance" ,
"description" : "Server icon, banner, invite splash and accent color." ,
"icon" : "Server icon" ,
"iconHint" : "Square image shown in the server list." ,
"banner" : "Banner" ,
"bannerHint" : "Wide image for the server header." ,
"splash" : "Invite splash" ,
"splashHint" : "Background of the invite page." ,
"accent" : "Accent color" ,
"accentHint" : "Color of buttons and highlights inside the server." ,
"accentDefault" : "Theme color" ,
"accentBlurple" : "Blue" ,
"accentGreen" : "Green" ,
"accentOrange" : "Orange" ,
"accentRed" : "Red" ,
"accentPurple" : "Purple" ,
"upload" : "Upload" ,
"remove" : "Remove" ,
"empty" : "none" ,
"notImage" : "An image file is required (PNG, JPEG, GIF, WebP)." ,
"tooLarge" : "The file is larger than 8 MB."
2026-09-21 01:28:48 +03:00
} ,
"cosmetics" : {
"title" : "Decoration gallery" ,
"description" : "Avatar frames and icons next to the nick. Uploaded items are granted to roles in the Roles section; animated GIF and WebP keep their animation." ,
"upload" : "Upload" ,
"empty" : "Nothing uploaded yet." ,
"limit" : "{{used}} of {{total}} used" ,
"name" : "Item name" ,
"notImage" : "An image file is required" ,
"tooLarge" : "File is larger than 5 MB" ,
"deleteConfirm" : "Delete the item? It disappears from all roles and personal styles." ,
"kind" : {
"frame" : "Frames" ,
"badge" : "Icons"
}
2026-09-20 18:13:04 +03:00
}
2026-09-20 01:32:11 +03:00
} ,
"navLabel" : "Settings sections" ,
"notifications" : {
"title" : "Notifications" ,
"description" : "Sounds, mentions and web push." ,
"stub" : "Notification settings are coming later."
} ,
"voice" : {
"title" : "Audio & video" ,
2026-09-20 18:51:31 +03:00
"description" : "Input and output devices and volume. Changes apply to the current voice room immediately." ,
2026-09-20 01:32:11 +03:00
"input" : "Microphone" ,
"camera" : "Camera" ,
"output" : "Sound" ,
"micVolume" : "Microphone volume" ,
"outputVolume" : "Sound volume" ,
2026-09-20 19:30:43 +03:00
"stub" : "Changes apply immediately and are stored on this device." ,
"micMode" : "Microphone activation" ,
"micModes" : {
"voice" : "Voice activity" ,
"push_to_talk" : "Push-to-talk"
} ,
"pttKey" : "Key" ,
"pttHint" : "Hold the key to talk. Works while the window is focused and the cursor is not in a text field." ,
"pttKeys" : {
"space" : "Space" ,
"v" : "V" ,
"b" : "B" ,
"n" : "N" ,
"alt" : "Alt" ,
"ctrl" : "Ctrl"
} ,
"sounds" : "Sounds" ,
"eventSounds" : "Server event sounds" ,
"eventSoundsHint" : "Play the server palette sounds: member joins, mentions and other events." ,
"soundboard" : "Soundboard" ,
2026-09-20 22:10:17 +03:00
"soundboardHint" : "Play soundboard sounds in a voice channel." ,
"latency" : "Participant ping" ,
"latencySharing" : "Show ping in the voice room" ,
2026-09-21 00:04:49 +03:00
"latencySharingHint" : "Participant latency to the instance updates every second; your own ping is shared with the room." ,
"interfaceSounds" : "Built-in interface sounds" ,
"interfaceSoundsHint" : "Short signals for messages, mentions and voice joins when the server has no custom sound."
2026-09-20 01:32:11 +03:00
} ,
"language" : {
"title" : "Language & region" ,
"description" : "Time zone and interface language." ,
"timezone" : "Time zone" ,
"timezoneHint" : "Used for message times." ,
"locale" : "Interface language" ,
"localeHint" : "Applies immediately." ,
"saved" : "Region settings saved."
2026-09-21 00:26:50 +03:00
} ,
"channel" : {
"noGuild" : "Pick a server to configure its channel." ,
"noChannels" : "This server has no text channels." ,
"pick" : "Channel" ,
"noPermission" : "Only the server owner and members with MANAGE_WEBHOOKS can manage the channel." ,
"webhooks" : {
"title" : "Webhooks" ,
"description" : "A webhook posts messages to the channel without a user session: requests go to the tokenised URL." ,
"empty" : "No webhooks yet." ,
"create" : "Create webhook" ,
"name" : "Webhook name" ,
"avatar" : "Avatar" ,
"avatarHint" : "PNG, JPEG, WebP or GIF up to 2 MB." ,
"submit" : "Create" ,
"rename" : "Rename" ,
"rotate" : "New link" ,
"url" : "Webhook URL" ,
"createdAt" : "created {{date}}" ,
"limit" : "{{count}} used" ,
"deleteConfirm" : "Delete the webhook? The link stops working, messages already sent stay." ,
"stepUpBody" : "Creating a webhook requires confirming your identity: enter your password{{totp}}."
2026-09-21 18:08:21 +03:00
} ,
"title" : "Channel background" ,
"description" : "An image behind the message feed. Animated GIF and WebP keep their animation; with the system reduce-motion setting the first frame is shown." ,
"empty" : "No background set." ,
"upload" : "Upload background" ,
"remove" : "Remove background" ,
"notImage" : "An image file is required" ,
"tooLarge" : "File is larger than 5 MB"
2026-09-19 21:50:06 +03:00
}
2026-09-21 18:10:39 +03:00
} ,
"badges" : {
"instanceAdmin" : "Instance administrator" ,
"guildOwner" : "Server owner" ,
"earlySupporter" : "Early supporter" ,
"verified" : "Verified"
2026-09-19 18:20:59 +03:00
}
}