feat: Rename to Toju and add translation
Some checks failed
Deploy Web Apps / deploy (push) Successful in 5m52s
Build Android APK / build-android-apk (push) Failing after 23m15s
Queue Release Build / prepare (push) Successful in 1m42s
Queue Release Build / build-linux (push) Failing after 9m33s
Queue Release Build / build-windows (push) Successful in 26m5s
Queue Release Build / finalize (push) Has been skipped

This commit is contained in:
2026-06-05 17:13:03 +02:00
parent 8ecfc9a1fe
commit ee293d7daf
301 changed files with 8247 additions and 2218 deletions

View File

@@ -0,0 +1,20 @@
{
"app": {
"themeStudio": {
"loading": "Loading Theme Studio...",
"title": "Theme Studio",
"minimized": "Minimized",
"minimize": "Minimize",
"reopen": "Re-open"
},
"desktopUpdate": {
"dismissAriaLabel": "Dismiss update notice",
"readyBadge": "Update Ready",
"restartTitle": "Restart to install {{version}}",
"latestUpdateFallback": "the latest update",
"downloadedMessage": "The update has already been downloaded. Restart the app when you're ready to finish applying it.",
"updateSettings": "Update settings",
"restartNow": "Restart now"
}
}
}

View File

@@ -0,0 +1,14 @@
{
"attachment": {
"errors": {
"noConnectedPeers": "No connected peers are available to provide this file right now.",
"fileNotFound": "The connected peers do not have this file right now.",
"uploaderLocalMissing": "Your original upload could not be found on this device. Re-upload the file to restore playback.",
"prepareDownloadFailed": "Could not prepare media download on disk.",
"chunksOutOfOrder": "Received media chunks out of order. Retry the download.",
"writeDownloadFailed": "Could not write media download to disk.",
"openDownloadFailed": "Could not open completed media download from disk.",
"downloadFailed": "Media download failed. Retry the download."
}
}
}

View File

@@ -0,0 +1,33 @@
{
"auth": {
"login": {
"title": "Login",
"username": "Username",
"password": "Password",
"serverApp": "Server App",
"submit": "Login",
"noAccount": "No account?",
"registerLink": "Register",
"failed": "Login failed"
},
"register": {
"title": "Register",
"username": "Username",
"displayName": "Display Name",
"password": "Password",
"serverApp": "Server App",
"submit": "Create Account",
"haveAccount": "Have an account?",
"loginLink": "Login",
"failed": "Registration failed"
},
"userBar": {
"login": "Login",
"register": "Register"
},
"users": {
"prepareStateFailed": "Failed to prepare local user state.",
"noCurrentUser": "No current user"
}
}
}

View File

@@ -0,0 +1,48 @@
{
"call": {
"joinCall": "Join call",
"leaveCall": "Leave call",
"mute": "Mute",
"unmute": "Unmute",
"deafen": "Deafen",
"undeafen": "Undeafen",
"useEarpiece": "Use earpiece",
"useSpeakerphone": "Use speakerphone",
"turnCameraOn": "Turn camera on",
"turnCameraOff": "Turn camera off",
"shareScreen": "Share screen",
"stopSharingScreen": "Stop sharing screen",
"incoming": {
"badge": "Incoming call",
"callerCalling": "{{name}} is calling",
"someone": "Someone",
"decline": "Decline",
"answer": "Answer",
"directCall": "Direct call",
"groupCall": "{{count}} person call"
},
"private": {
"title": "Private Call",
"participants": "{{count}} participants",
"notFound": "Call not found",
"minimize": "Minimize call",
"addUserAria": "Add user to call",
"addUser": "Add user",
"addUserButton": "Add user",
"showAllStreams": "Show all streams",
"allStreams": "All streams",
"noActiveCall": "No active call for this route.",
"resizeChat": "Resize chat",
"yourCamera": "Your camera",
"yourScreen": "Your screen",
"waiting": "Waiting"
},
"notifications": {
"inProgress": "Call in progress"
},
"errors": {
"noRecipient": "Direct message conversation has no recipient to call.",
"noCurrentUser": "Cannot use calls without a current user."
}
}
}

View File

@@ -0,0 +1,178 @@
{
"chat": {
"composer": {
"replyingTo": "Replying to {{name}}",
"toolbar": {
"quote": "Quote",
"bulletList": "• List",
"orderedList": "1. List",
"code": "Code",
"link": "Link",
"image": "Image",
"horizontalRule": "HR"
},
"addAttachmentGifEmoji": "Add attachment, GIF, or emoji",
"addToMessage": "Add to message",
"emoji": "Emoji",
"emojiPickerAria": "Emoji picker",
"attachFiles": "Attach files",
"searchKlipyGifs": "Search KLIPY GIFs",
"gif": "GIF",
"openEmojiSelector": "Open emoji selector",
"sendMessage": "Send message",
"placeholder": "Type a message...",
"dropFilesToAttach": "Drop files to attach",
"klipyGif": "KLIPY GIF",
"klipy": "KLIPY",
"gifReadyToSend": "GIF ready to send",
"remove": "Remove"
},
"mediaMenu": {
"attachFiles": "Attach files",
"gif": "GIF",
"emoji": "Emoji"
},
"slashCommand": {
"ariaLabel": "Slash commands",
"commands": "Commands",
"builtInSource": "Built-in",
"lennyDescription": "Send the Lenny face ( ͡° ͜ʖ ͡°)"
},
"typing": {
"one": "{{names}} is typing...",
"many": "{{names}} are typing...",
"andOthers": "{{names}} and {{count}} others are typing..."
},
"messageList": {
"syncing": "Syncing messages...",
"loading": "Loading...",
"emptyTitle": "No messages yet",
"emptySubtitle": "Be the first to say something!",
"loadOlder": "Load older messages",
"newMessages": "New messages",
"readLatest": "Read latest"
},
"markdown": {
"sharedImage": "Shared image",
"klipy": "KLIPY"
},
"message": {
"originalNotFound": "Original message not found",
"edited": "(edited)",
"deleted": "[Message deleted]",
"missingPluginPrefix": "Required plugin is not installed to view this content, visit the",
"store": "store",
"waitingForImage": "Waiting for image source...",
"retry": "Retry",
"viewAllImages": "View all {{count}} images",
"viewFullSize": "View full size",
"download": "Download",
"cancel": "Cancel",
"request": "Request",
"open": "Open",
"play": "Play",
"sharedFromDevice": "Shared from your device",
"loadingExperimentalPlayer": "Loading experimental player...",
"customEmojiAlt": "Custom emoji",
"mobileSheetTitle": "Message",
"mobileSheetAria": "Message actions",
"react": "React",
"reply": "Reply",
"copyContent": "Copy message content",
"edit": "Edit",
"delete": "Delete",
"largeVideo": "Large video. Accept the download to watch it in chat.",
"largeAudio": "Large audio file. Accept the download to play it in chat.",
"waitingForVideo": "Waiting for video source...",
"waitingForAudio": "Waiting for audio source...",
"acceptDownload": "Accept download",
"retryDownload": "Retry download",
"timestampYesterday": "Yesterday {{time}}"
},
"gifPicker": {
"ariaLabel": "KLIPY GIF picker",
"chooseGif": "Choose a GIF",
"searchResults": "Search results from KLIPY.",
"trending": "Trending GIFs from KLIPY.",
"closeAria": "Close GIF picker",
"searchMobile": "Search KLIPY and add a gif to the chat",
"searchDesktop": "Search KLIPY",
"retry": "Retry",
"loading": "Loading GIFs from KLIPY...",
"noGifsFound": "No GIFs found",
"noGifsHint": "Try another search term or clear the search to browse trending GIFs.",
"klipyGif": "KLIPY GIF",
"klipy": "KLIPY",
"clickToSelect": "Click to select",
"loadingMoreAria": "Loading more GIFs",
"loadMoreAria": "Load more GIFs",
"footer": "Click a GIF to select it. Powered by KLIPY.",
"loadingMore": "Loading...",
"loadMore": "Load more",
"loadFailed": "Failed to load GIFs from KLIPY.",
"closeOverlayAria": "Close GIF picker"
},
"userList": {
"members": "Members",
"onlineInVoice": "{{online}} online · {{inVoice}} in voice",
"message": "Message",
"statusAway": "Away",
"statusBusy": "Do Not Disturb",
"statusOffline": "Offline",
"unmute": "Unmute",
"mute": "Mute",
"kick": "Kick",
"ban": "Ban",
"noUsersOnline": "No users online",
"banUserTitle": "Ban User",
"banUserConfirm": "Ban User",
"banConfirmMessage": "Are you sure you want to ban {{name}}?",
"banReasonLabel": "Reason (optional)",
"banReasonPlaceholder": "Enter ban reason...",
"banDurationLabel": "Duration",
"banDuration1Hour": "1 hour",
"banDuration1Day": "1 day",
"banDuration1Week": "1 week",
"banDuration30Days": "30 days",
"banDurationPermanent": "Permanent"
},
"overlays": {
"closeGalleryAria": "Close image gallery",
"viewImages": "View images",
"imageCount": "{{count}} images",
"close": "Close",
"openImage": "Open {{filename}}",
"closePreviewAria": "Close image preview",
"previousImage": "Previous image",
"nextImage": "Next image",
"download": "Download",
"copyImage": "Copy Image",
"saveImage": "Save Image"
},
"linkEmbed": {
"previewAlt": "Link preview"
},
"embeds": {
"spotifyPlayer": "Spotify player",
"soundcloudPlayer": "SoundCloud player"
},
"units": {
"b": "B",
"kb": "KB",
"mb": "MB",
"gb": "GB",
"bPerSec": "B/s",
"kbPerSec": "KB/s",
"mbPerSec": "MB/s",
"gbPerSec": "GB/s"
},
"effects": {
"notConnectedToRoom": "Not connected to a room",
"notLoggedIn": "Not logged in",
"messageNotFound": "Message not found",
"cannotEditOthers": "Cannot edit others messages",
"cannotDeleteOthers": "Cannot delete others messages",
"permissionDenied": "Permission denied"
}
}
}

View File

@@ -0,0 +1,53 @@
{
"common": {
"brand": "Toju",
"cancel": "Cancel",
"create": "Create",
"close": "Close",
"dismiss": "Dismiss",
"you": "You",
"live": "LIVE",
"online": "Online",
"offline": "Offline",
"unknown": "Unknown",
"muted": "Muted",
"off": "Off",
"defaultUser": "User",
"cut": "Cut",
"copy": "Copy",
"paste": "Paste",
"selectAll": "Select All",
"copyLink": "Copy Link",
"copyImage": "Copy Image",
"settings": "Settings",
"documentation": "Documentation",
"logout": "Logout",
"minimize": "Minimize",
"maximize": "Maximize",
"reject": "Reject",
"install": "Install",
"installing": "Installing...",
"required": "Required",
"ok": "OK",
"join": "Join",
"clear": "Clear",
"manage": "Manage",
"seeAll": "See all",
"viewAll": "View all",
"thisServer": "this server",
"actions": {
"backToDashboard": "Back to dashboard",
"cancel": "Cancel",
"close": "Close",
"closeDialog": "Close dialog",
"ok": "OK"
},
"labels": {
"anonymous": "Anonymous",
"loading": "Loading",
"unknown": "Unknown",
"user": "User",
"you": "You"
}
}
}

View File

@@ -0,0 +1,46 @@
{
"dashboard": {
"welcomeBack": "Welcome back, {{name}}",
"welcomeGuestFallback": "there",
"welcomeTitle": "Welcome to Toju",
"subtitle": "Find people, discover servers, or start your own community.",
"searchAriaLabel": "Search people, servers, and invites",
"searchPlaceholderMobile": "Search people, servers, invites...",
"searchPlaceholderDesktop": "Search for people, servers, or paste an invite...",
"searchShortcut": "Ctrl K",
"recent": "Recent:",
"removeRecent": "Remove {{term}}",
"invite": "Invite",
"openInvite": "Open invite",
"servers": "Servers",
"people": "People",
"noResults": "No people, servers, or invites match",
"findPeople": {
"title": "Find People",
"subtitle": "Connect with friends."
},
"findServers": {
"title": "Find Servers",
"subtitle": "Browse communities."
},
"createServer": {
"title": "Create Server",
"subtitle": "Start your own."
},
"getStarted": {
"title": "Get started",
"description": "You have not joined any servers yet. Find a community to join, or create your own to invite friends."
},
"peopleYouMightKnow": "People you might know",
"noPeopleSuggestions": "No people to suggest yet.",
"popularServers": "Popular Servers",
"noPopularServers": "No popular servers right now.",
"yourFriends": "Your Friends",
"recentlyActiveServers": "Recently Active Servers",
"serverMeta": {
"member": "{{count}} member",
"members": "{{count}} members"
},
"roomMembers": "{{count}} members"
}
}

View File

@@ -0,0 +1,65 @@
{
"dm": {
"find": {
"title": "Find people",
"subtitle": "Search for people you share servers with.",
"searchAriaLabel": "Search people",
"searchPlaceholder": "Search people...",
"emptyTitle": "No people to show yet",
"emptyMessage": "Join servers to discover people with shared interests.",
"findServers": "Find servers"
},
"search": {
"peopleTitle": "People",
"friendsTitle": "Friends",
"othersTitle": "Others",
"noUsersFound": "No users found",
"callUser": "Call {{name}}",
"messageUser": "Message {{name}}"
},
"friend": {
"add": "Add friend",
"remove": "Remove friend"
},
"conversations": {
"title": "Direct Messages",
"chatCount": "{{count}} chats",
"empty": "No direct messages yet."
},
"workspace": {
"backToConversations": "Back to conversations",
"directMessages": "Direct messages",
"returnToCall": "Return to call"
},
"rail": {
"title": "Direct Messages",
"ariaLabel": "Direct Messages",
"forgetChat": "Forget chat",
"leaveChat": "Leave chat"
},
"chat": {
"directMessage": "Direct Message",
"groupChat": "Group Chat",
"openProfile": "Open profile for {{name}}",
"callPeer": "Call {{name}}",
"typingOne": "is typing...",
"typingMany": "are typing...",
"closeGifPicker": "Close GIF picker",
"selectPrompt": "Select a direct message from the rail.",
"forgetPeer": "Forget {{name}}",
"defaultTitle": "Direct Message",
"railFallback": "DM"
},
"previews": {
"noMessages": "No messages yet",
"deleted": "Message deleted",
"gif": "Sent a GIF",
"image": "Sent an image",
"video": "Sent a video",
"audio": "Sent audio",
"attachment": "Attachment",
"oneAttachment": "Sent an attachment",
"manyAttachments": "Sent attachments"
}
}
}

View File

@@ -0,0 +1,22 @@
{
"emoji": {
"picker": {
"openAria": "Open emoji selector",
"title": "Emoji",
"closeAria": "Close emoji selector",
"searchPlaceholder": "Search emoji",
"searchAria": "Search emoji",
"uploading": "Uploading...",
"upload": "Upload emoji",
"emptySearch": "No emoji match your search.",
"uploadFailed": "Unable to upload emoji.",
"customEmojiFallback": "Custom emoji"
},
"validation": {
"maxSize": "Emoji images can be max 1 MB.",
"invalidType": "Emoji images must be WebP, GIF, JPG, or JPEG.",
"invalidImage": "Invalid emoji image.",
"readFailed": "Unable to read emoji image."
}
}
}

View File

@@ -0,0 +1,10 @@
{
"experimental": {
"vlcPlayer": {
"download": "Download",
"close": "Close",
"loading": "Loading experimental player...",
"retry": "Retry"
}
}
}

View File

@@ -0,0 +1,33 @@
{
"mobile": {
"update": {
"statusLabels": {
"checking": "Checking",
"downloading": "Downloading",
"updateAvailable": "Update available",
"upToDate": "Up to date",
"unsupported": "Unsupported",
"error": "Error",
"idle": "Idle"
},
"messages": {
"waitingForCheck": "Waiting for the first store update check.",
"unsupported": "Store updates are only available in the packaged Android or iOS app.",
"checking": "Checking the app store for a newer release...",
"downloading": "Downloading the update from the app store...",
"updateAvailable": "Toju {{version}} is available in the app store.",
"upToDate": "Toju {{version}} is up to date.",
"storeInfoFailed": "The app store could not return release information. Confirm the app is published and try again.",
"checkFailed": "Unable to check for mobile app updates."
}
},
"notifications": {
"incomingCallsChannel": "Incoming calls",
"activeCallsChannel": "Active calls",
"answer": "Answer",
"decline": "Decline",
"mute": "Mute",
"hangUp": "Hang up"
}
}
}

View File

@@ -0,0 +1,37 @@
{
"notifications": {
"delivery": {
"title": "Delivery",
"description": "Desktop alerts use the system notification center on Linux and request taskbar attention when the app is not focused. Maximized app window suppress system popups, and only play the configured notification sound while the app is in the background."
},
"enable": {
"label": "Enable notifications",
"description": "Mute every server and channel notification without affecting unread indicators."
},
"showPreview": {
"label": "Show message preview",
"description": "Include a short message preview in desktop notifications when content privacy allows it."
},
"respectBusy": {
"label": "Respect busy status",
"description": "Suppress desktop alerts while your user presence is set to busy."
},
"serverOverrides": {
"title": "Server Overrides",
"description": "Right-click actions mirror these switches. Muted servers and channels still collect unread badges so you can catch up later.",
"empty": "Join a server to configure notification overrides.",
"defaultRoomDescription": "Notifications for every text channel in this server.",
"unread": "{{count}} unread"
},
"channels": {
"title": "Channels",
"mutedHint": "Unread badges remain visible even if muted."
},
"display": {
"defaultServerName": "Server",
"newMessageHidden": "{{sender}} sent a new message",
"newMessageEmpty": "{{sender}} sent a new message",
"preview": "{{sender}}: {{content}}"
}
}
}

View File

@@ -0,0 +1,161 @@
{
"plugins": {
"manager": {
"backToSettings": "Back to settings",
"serverTitle": "Server plugins",
"clientTitle": "Client plugins",
"serverDescription": "Plugins installed for the current chat server.",
"clientDescription": "Global client plugins installed on this device.",
"activateReady": "Activate ready plugins",
"openStore": "Open Plugin Store",
"sectionsAria": "Plugin manager sections",
"tabs": {
"installed": "Installed",
"extensions": "Extension points",
"requirements": "Requirements",
"settings": "Settings",
"docs": "Docs",
"logs": "Logs"
},
"extensionCounts": {
"settingsPages": "Settings pages",
"appPages": "App pages",
"sidePanels": "Side panels",
"channelSections": "Channel sections",
"composerActions": "Composer actions",
"profileActions": "Profile actions",
"toolbarActions": "Toolbar actions",
"slashCommands": "Slash commands",
"embedRenderers": "Embed renderers"
},
"conflicts": {
"title": "Conflict diagnostics",
"none": "No duplicate route, action, embed, channel, panel, or settings contribution ids detected.",
"conflictsIn": "conflicts in {{plugins}}"
},
"requirements": {
"empty": "No server plugin requirements for the current room.",
"serverStatus": "Server status: {{status}}",
"versionRange": "Version range: {{range}}"
},
"settings": {
"settingsSuffix": "settings",
"noSchema": "This plugin does not declare a settings schema."
},
"docs": {
"readme": "Readme",
"homepage": "Homepage",
"changelog": "Changelog",
"support": "Support"
},
"logs": {
"noPlugins": "No plugins installed.",
"noLogs": "No logs for selected plugin."
},
"installed": {
"select": "Select",
"disable": "Disable",
"enable": "Enable",
"activate": "Activate",
"reload": "Reload",
"unload": "Unload"
},
"capabilities": {
"title": "Capabilities",
"none": "Plugin requests no capabilities.",
"grantAll": "Grant all requested",
"missing": "Missing: {{capabilities}}"
},
"empty": {
"serverTitle": "No server plugins installed.",
"clientTitle": "No client plugins installed.",
"serverBody": "Server-scoped plugins use scope: server in toju-plugin.json.",
"clientBody": "Client-scoped plugins use scope: client or omit scope in toju-plugin.json."
}
},
"store": {
"title": "Plugin Store",
"backToApp": "Back to app",
"summary": "{{installed}} installed for {{scope}} · {{available}} available · {{sources}} sources",
"manage": "Manage Plugins",
"refresh": "Refresh",
"sourcePlaceholder": "https://example.com/plugins.json or /home/me/plugins/source.json",
"sourceAria": "Plugin source manifest URL",
"addSource": "Add Source",
"sourcesAndFiltersAria": "Plugin sources and filters",
"sources": "Sources",
"allSources": "All sources",
"removeSource": "Remove source",
"filters": "Filters",
"installedOnly": "Installed only",
"installServer": "Install server",
"defaultEndpoint": "Default endpoint",
"noServerForInstall": "No server is available for plugin installs. Owner or Manage Server access is required.",
"availablePluginsAria": "Available plugins",
"searchPlaceholder": "Search plugins, authors, ids",
"searchAria": "Search plugins",
"shown": "{{count}} shown",
"unknownAuthor": "Unknown author",
"updateBadge": "Update",
"installedBadge": "Installed",
"loadingReadme": "Loading",
"readme": "Readme",
"loadReadme": "Load readme",
"openGitHub": "Open GitHub",
"emptyTitle": "No plugins found",
"emptyWithSources": "Adjust filters or add another source manifest.",
"emptyNoSources": "Add a plugin source manifest URL to populate the catalog.",
"readmePanelAria": "Plugin readme",
"readmeLabel": "Readme",
"parsed": "Parsed",
"raw": "Raw",
"closeReadme": "Close readme",
"openSourceReadme": "Open source readme",
"serverInstall": {
"title": "Server plugin install",
"cancelInstall": "Cancel install",
"installToServer": "Install to server",
"optionalForMembers": "Optional for server members",
"capabilities": "Capabilities",
"noCapabilities": "This plugin requests no capabilities.",
"cancel": "Cancel",
"installAndActivate": "Install and Activate"
},
"actions": {
"install": "Install",
"installToServer": "Install to Server",
"removeFromServer": "Remove from Server",
"uninstall": "Uninstall",
"update": "Update",
"updateServer": "Update Server"
},
"errors": {
"addSource": "Unable to add plugin source",
"removeSource": "Unable to remove plugin source",
"refreshSources": "Unable to refresh plugin sources",
"updateInstallation": "Unable to update plugin installation",
"loadReadme": "Unable to load readme",
"noServerAccess": "You need owner or Manage Server access on a chat server before installing server plugins",
"prepareServerInstall": "Unable to prepare server plugin install",
"installServerPlugin": "Unable to install server plugin",
"requiresServerAccess": "Requires owner or Manage Server access on a chat server"
}
},
"actionMenu": {
"title": "Plugins",
"availableActions": "{{count}} available actions",
"closeAria": "Close plugin menu",
"close": "Close",
"empty": "No plugin actions available.",
"menuAria": "Plugin actions"
},
"pageHost": {
"back": "Back",
"unavailableTitle": "Plugin page unavailable",
"unavailableBody": "The plugin page is not registered or the plugin is not loaded."
},
"renderHost": {
"failed": "Plugin contribution failed to render"
}
}
}

View File

@@ -0,0 +1,42 @@
{
"profile": {
"avatarEditor": {
"closeAria": "Close profile image editor",
"title": "Adjust profile picture",
"animatedHint": "Animated GIF and WebP avatars keep their original animation and framing.",
"staticHint": "Drag image to frame subject. Zoom until preview looks right. Final image saves as 256x256 WebP.",
"animatedPreviewHint": "Animation and original framing are preserved.",
"staticPreviewHint": "Preview matches saved crop.",
"source": "Source",
"zoom": "Zoom",
"animatedZoomHint": "Animated avatars keep the original frame sequence.",
"staticZoomHint": "Use wheel or slider.",
"animatedDetected": "Animated upload detected.",
"zoomPercent": "{{percent}}% zoom",
"cancel": "Cancel",
"saving": "Saving...",
"apply": "Apply picture",
"processFailed": "Failed to process profile image.",
"invalidFileType": "Invalid file type. Use WebP, GIF, JPG, or JPEG."
},
"card": {
"addDescription": "Add a description",
"playing": "Playing",
"playingActivity": "Playing {{name}}",
"openImageFailed": "Failed to open selected image.",
"saveImageFailed": "Failed to save profile image.",
"registeredOn": "Registered on {{url}}",
"startChat": "Start chat",
"call": "Call",
"addFriend": "Add friend",
"removeFriend": "Remove friend",
"status": {
"online": "Online",
"away": "Away",
"busy": "Do Not Disturb",
"offline": "Invisible",
"disconnected": "Offline"
}
}
}
}

View File

@@ -0,0 +1,76 @@
{
"room": {
"mobile": {
"backToChannels": "Back to channels",
"backToChat": "Back to chat",
"showMembers": "Show members",
"returnToCall": "Return to call",
"members": "Members"
},
"empty": {
"noTextChannels": "No text channels",
"noTextChannelsDescription": "There are no existing text channels currently.",
"noRoomSelected": "No room selected",
"noRoomSelectedDescription": "Select or create a room to start chatting"
},
"panel": {
"serverFallback": "Server",
"serverDescriptionFallback": "Choose a text channel or jump into voice.",
"membersCount": "{{count}} members",
"onlineNow": "{{count}} online right now",
"textChannels": "Text Channels",
"voiceChannels": "Voice Channels",
"createTextChannel": "Create Text Channel",
"createVoiceChannel": "Create Voice Channel",
"voiceDisabled": "Voice is disabled by host",
"openStreamWorkspace": "Open stream workspace",
"joinVoiceChannel": "Join voice channel",
"open": "Open",
"view": "View",
"connectionIssue": "Connection issue - this user may not hear all participants. Consider adding a TURN server in Settings -> Network.",
"mutedByYou": "Muted by you",
"measuringLatency": "Measuring...",
"latencyMs": "{{ms}} ms",
"playing": "Playing {{game}}",
"inVoice": "In voice",
"plugins": "Plugins",
"viewPlugins": "View plugins",
"you": "You",
"online": "Online - {{count}}",
"offline": "Offline - {{count}}",
"roles": {
"owner": "Owner",
"admin": "Admin",
"mod": "Mod"
},
"message": "Message",
"messageUser": "Message {{name}}",
"noOtherUsers": "No other users in this server",
"connectivityWarning": "You may have connectivity issues. Adding a TURN server in Settings -> Network may help."
},
"channel": {
"namePlaceholder": "Channel name",
"nameRequired": "Channel name is required.",
"nameUnique": "Channel names must be unique within text or voice channels.",
"createText": "Create Text Channel",
"createVoice": "Create Voice Channel",
"resyncMessages": "Resync Messages",
"muteNotifications": "Mute Notifications",
"unmuteNotifications": "Unmute Notifications",
"rename": "Rename Channel",
"delete": "Delete Channel"
},
"userMenu": {
"promoteModerator": "Promote to Moderator",
"promoteAdmin": "Promote to Admin",
"demoteMember": "Demote to Member",
"kickUser": "Kick User",
"noActions": "No actions available"
},
"voiceJoin": {
"noActiveRoom": "No active room selected for voice join.",
"noPermission": "You do not have permission to join this voice channel.",
"failed": "Failed to join voice channel."
}
}
}

View File

@@ -0,0 +1,55 @@
{
"screenShare": {
"quality": {
"performance": {
"label": "Performance saver",
"description": "720p / 30 FPS with lower CPU and bandwidth usage."
},
"balanced": {
"label": "Balanced",
"description": "1080p / 30 FPS for stable quality in most cases."
},
"high-fps": {
"label": "High FPS",
"description": "1080p / 60 FPS for games and fast motion."
},
"quality": {
"label": "Sharp text",
"description": "1440p / 30 FPS for detailed UI and text clarity."
}
},
"qualityDialog": {
"ariaClose": "Close screen share quality dialog",
"title": "Choose screen share quality",
"description": "Pick the profile that best matches what you are sharing. You can change the default later in Voice settings.",
"systemAudioNote": "Computer audio will be shared. Toju audio is filtered when supported, and your microphone stays on its normal voice track.",
"startSharing": "Start sharing"
},
"sourcePicker": {
"ariaClose": "Close source picker",
"title": "Choose what to share",
"description": "Select a screen or window to start sharing.",
"includeSystemAudio": "Include system audio",
"includeSystemAudioDescription": "Share desktop sound with viewers.",
"tabListAria": "Share source type",
"entireScreen": "Entire screen",
"windows": "Windows",
"systemAudioNote": "Computer audio will be shared. Toju audio is filtered when supported, and your microphone stays on its normal voice track.",
"sourceKindScreen": "Entire screen",
"sourceKindWindow": "Window",
"noScreens": "No screens available",
"noWindows": "No windows available",
"noScreensDescription": "No displays were reported by Electron right now.",
"noWindowsDescription": "Restore the window you want to share and try again.",
"startSharing": "Start sharing"
},
"viewer": {
"userSharing": "{{name}} is sharing their screen",
"someoneSharing": "Someone is sharing their screen",
"volume": "Volume: {{volume}}%",
"stopSharing": "Stop sharing",
"stopWatching": "Stop watching",
"waiting": "Waiting for screen share..."
}
}
}

View File

@@ -0,0 +1,26 @@
{
"serversRail": {
"dashboard": "Dashboard",
"openPrivateCall": "Open private call",
"createServer": "Create a server",
"muteNotifications": "Mute Notifications",
"unmuteNotifications": "Unmute Notifications",
"leaveServer": "Leave Server",
"banned": {
"title": "Banned",
"message": "You are banned from {{server}}."
},
"password": {
"title": "Password required",
"confirmLabel": "Join server",
"prompt": "Enter the password to rejoin {{serverName}}.",
"label": "Server password",
"placeholder": "Enter password"
},
"voicePresence": {
"oneUser": "{{count}} user in voice",
"manyUsers": "{{count}} users in voice"
},
"joinFailed": "Failed to join server"
}
}

View File

@@ -0,0 +1,158 @@
{
"servers": {
"browser": {
"card": {
"banned": "Banned",
"private": "Private",
"password": "Password",
"joined": "Joined",
"join": "Join",
"leave": "Leave",
"owner": "Owner: {{name}}",
"doubleClickOpen": "Double-click to open {{name}}",
"doubleClickJoin": "Double-click to join {{name}}",
"serverActions": "Server actions for {{name}}",
"joinServer": "Join {{name}}"
},
"search": {
"ariaLabel": "Search servers",
"placeholder": "Search servers...",
"myServers": "My Servers",
"resultsTitle": "Search results",
"resultsCount": "{{count}} found",
"noResults": "No servers found"
},
"empty": {
"title": "No servers yet",
"message": "Search to find a server to join."
},
"bannedDialog": {
"title": "Banned",
"message": "You are banned from {{name}}.",
"thisServer": "this server"
},
"passwordDialog": {
"title": "Password required",
"confirm": "Join server",
"message": "Enter the password to join {{name}}.",
"label": "Server password",
"placeholder": "Enter password"
},
"plugins": {
"eyebrow": "Plugin downloads",
"usesPlugins": "{{name}} uses plugins",
"requiredTitle": "Required before joining",
"optionalTitle": "Optional plugins",
"requiredBadge": "Required",
"capabilities": "Capabilities",
"source": "Source",
"readme": "Readme",
"cancelJoin": "Cancel join",
"downloading": "Downloading",
"acceptAndJoin": "Accept and join",
"join": "Join",
"readmeEyebrow": "Plugin readme",
"closeReadme": "Close readme"
},
"ownerUnknown": "Unknown owner"
},
"find": {
"title": "Find servers",
"subtitle": "Browse, search, and join communities.",
"searchPlaceholder": "Search servers...",
"emptyTitle": "No servers to show yet",
"emptyMessage": "Search for a server above, or create your own to get started."
},
"discovery": {
"recentTitle": "Recently active",
"recentSubtitle": "Servers you have joined",
"featuredTitle": "Featured servers",
"featuredSubtitle": "The busiest communities right now",
"trendingTitle": "Trending",
"trendingSubtitle": "Recently active and gaining momentum"
},
"create": {
"title": "Create a server",
"subtitle": "Your server is where you and your community hang out.",
"pickCategory": "Pick a category",
"serverName": "Server name",
"namePlaceholder": "My Awesome Server",
"descriptionOptional": "Description (optional)",
"descriptionPlaceholder": "What's your server about?",
"advancedSettings": "Advanced settings",
"topicOptional": "Topic (optional)",
"topicPlaceholder": "gaming, music, coding...",
"signalEndpoint": "Signal server endpoint",
"signalEndpointHint": "This endpoint handles all signaling for this server.",
"privateServer": "Private server",
"passwordOptional": "Password (optional)",
"passwordPlaceholder": "Leave blank to allow joining without a password",
"passwordHint": "Users who already joined keep access even if you change the password later.",
"submit": "Create server",
"categories": {
"gaming": "Gaming",
"music": "Music",
"coding": "Coding",
"community": "Community",
"study": "Study"
}
},
"invite": {
"badge": "Invite link",
"titleJoin": "Join {{name}}",
"titleFallback": "Toju server invite",
"status": {
"redirecting": "Sign in to continue with this invite.",
"joining": "We are connecting you to the invited server.",
"error": "This invite could not be completed automatically.",
"loading": "Loading invite details and preparing the correct signal server."
},
"statusSection": "Status",
"serverSection": "Server",
"privateBadge": "Private",
"passwordBypassBadge": "Password bypassed by invite",
"expiresBadge": "Expires {{date}}",
"nextStepsTitle": "What happens next",
"nextSteps": {
"signalServer": "The linked signal server is added to your configured server list if needed.",
"bypassRestrictions": "Invite links bypass private and password restrictions.",
"bannedStillBlocked": "Banned users still cannot join through invites."
},
"backToSearch": "Back to server search",
"signalServerName": "Signal Server",
"messages": {
"loading": "Loading invite...",
"joining": "Joining {{name}}...",
"redirectingLogin": "Redirecting to login...",
"missingInfo": "This invite link is missing required server information.",
"acceptFailed": "Unable to accept this invite.",
"banned": "You are banned from this server and cannot accept this invite.",
"expired": "This invite has expired. Ask for a fresh invite link."
}
},
"plugins": {
"eyebrow": "Plugin downloads",
"usesPlugins": "{{name}} uses plugins",
"requiredTitle": "Required before joining",
"optionalTitle": "Optional plugins",
"requiredBadge": "Required",
"capabilities": "Capabilities",
"source": "Source",
"readme": "Readme",
"cancelJoin": "Cancel join",
"downloading": "Downloading",
"acceptAndJoin": "Accept and join",
"join": "Join",
"readmeEyebrow": "Plugin readme",
"closeReadme": "Close readme"
},
"errors": {
"notLoggedIn": "Not logged in",
"roomNotFound": "Room not found",
"banned": "You are banned from this server",
"joinFailed": "Failed to join server",
"installPluginsFailed": "Unable to install server plugins",
"loadPluginReadmeFailed": "Unable to load plugin readme"
}
}
}

View File

@@ -0,0 +1,564 @@
{
"settings": {
"title": "Settings",
"closeAria": "Close settings",
"backToMenuAria": "Back to settings menu",
"sections": {
"general": "General",
"server": "Server"
},
"nav": {
"general": "General",
"plugins": "Client plugins",
"theme": "Theme Studio",
"network": "Network",
"notifications": "Notifications",
"voice": "Voice & Audio",
"updates": "Updates",
"localApi": "Local API",
"data": "Data",
"debugging": "Debugging",
"server": "Server",
"serverPlugins": "Server plugins",
"members": "Members",
"bans": "Bans",
"permissions": "Permissions"
},
"pages": {
"general": "General",
"clientPlugins": "Client Plugins",
"network": "Network",
"theme": "Theme Studio",
"notifications": "Notifications",
"voice": "Voice & Audio",
"updates": "Updates",
"localApi": "Local API",
"data": "Data",
"debugging": "Debugging",
"server": "Server Settings",
"serverPlugins": "Server Plugins",
"members": "Members",
"bans": "Bans",
"permissions": "Permissions"
},
"selectServer": "Select a server...",
"thirdPartyLicenses": {
"link": "Third-party licenses",
"title": "Third-party licenses",
"description": "License information for bundled third-party libraries used by the app.",
"closeAria": "Close third-party licenses",
"viewLicense": "View license",
"packages": "Packages",
"licenseText": "License text"
},
"theme": {
"activeTheme": "Active Theme",
"description": "Launch Theme Studio to edit the live draft, inspect themeable regions, or switch to a saved theme.",
"minimized": "Minimized",
"savedTheme": "Saved Theme",
"chooseSavedTheme": "Choose saved theme",
"noSavedThemes": "No saved themes",
"editInStudio": "Edit In Studio",
"reopenStudio": "Re-open Theme Studio",
"openStudio": "Open Theme Studio",
"restoreDefault": "Restore Default"
},
"dataLoading": "Loading data settings...",
"serverPlugins": {
"title": "Open this server to manage plugins",
"description": "Server plugin installs and activation are shown for the currently open chat server. Select or open {{serverName}} in the app, then return here.",
"thisServer": "this server"
},
"standalone": {
"goBack": "Go back",
"pluginStore": "Plugin Store"
},
"network": {
"serverEndpoints": {
"title": "Server Endpoints",
"restoreDefaults": "Restore Defaults",
"testAll": "Test All",
"description": "Active server endpoints stay enabled at the same time. You pick the endpoint when creating and registering a new server.",
"descriptionModal": "Active server endpoints stay enabled at the same time. You pick the endpoint when creating a new server.",
"active": "Active",
"incompatible": "Update the client in order to connect to other users",
"activate": "Activate",
"deactivate": "Deactivate",
"remove": "Remove server",
"removeShort": "Remove",
"addNew": "Add New Server",
"serverNamePlaceholder": "Server name (e.g., My Server)",
"serverNamePlaceholderShort": "Server name",
"serverUrlPlaceholder": "Server URL (e.g., http://localhost:3001)",
"errors": {
"invalidUrl": "Please enter a valid URL",
"duplicateUrl": "This server URL already exists"
}
},
"connection": {
"title": "Connection Settings",
"titleShort": "Connection",
"autoReconnect": {
"label": "Auto-reconnect",
"description": "Automatically reconnect when connection is lost",
"descriptionShort": "Reconnect when connection is lost"
},
"searchAllServers": {
"label": "Search all servers",
"description": "Search across all configured server directories",
"descriptionShort": "Search across all server directories"
}
},
"ice": {
"title": "ICE Servers (STUN / TURN)",
"restoreDefaults": "Restore Defaults",
"description": "ICE servers are used for NAT traversal. STUN discovers your public address; TURN relays traffic when direct connections fail. Higher entries have priority.",
"turnUser": "User: {{username}}",
"moveUp": "Move up (higher priority)",
"moveDown": "Move down (lower priority)",
"empty": "No ICE servers configured. P2P connections may fail across networks.",
"addTitle": "Add ICE Server",
"stunPlaceholder": "stun:stun.example.com:19302",
"turnPlaceholder": "turn:turn.example.com:3478",
"username": "Username",
"credential": "Credential",
"addServer": "Add Server",
"errors": {
"urlRequired": "URL is required",
"urlPrefixStun": "URL must start with stun:",
"urlPrefixTurn": "URL must start with turn: or turns:",
"usernameRequired": "Username is required for TURN servers",
"credentialRequired": "Credential is required for TURN servers",
"duplicateUrl": "This URL already exists"
}
}
},
"general": {
"application": "Application",
"reopenLastChat": {
"label": "Reopen last chat on launch",
"description": "Open the same server and text channel the next time Toju starts.",
"aria": "Toggle reopen last chat on launch"
},
"autoStart": {
"label": "Launch on system startup",
"description": "Automatically start Toju when you sign in",
"desktopOnly": "This setting is only available in the desktop app.",
"aria": "Toggle launch on startup"
},
"closeToTray": {
"label": "Minimize to tray on close",
"description": "Keep Toju running in the tray when you click the X button",
"desktopOnly": "This setting is only available in the desktop app.",
"aria": "Toggle minimize to tray on close"
},
"experimentalVlc": {
"label": "Experimental VLC.js playback",
"checking": "Checking for a bundled VLC.js runtime...",
"available": "Offer a manual player for unsupported downloaded audio and video files.",
"unavailable": "No VLC.js runtime is bundled. Unsupported desktop media can be opened in the system player.",
"aria": "Toggle experimental VLC.js playback"
},
"gameDetection": {
"title": "Game detection",
"description": "Toju prefers the currently focused window when detecting your game. Add process names here to permanently hide apps that get mistakenly identified as games (e.g. \"spotify\", \"obs64\"). Entries are matched case-insensitively against the executable name without its extension.",
"processPlaceholder": "Process name (e.g. spotify)",
"processAria": "Process name to ignore",
"add": "Add",
"empty": "No ignored processes yet.",
"removeProcessAria": "Remove {{name}} from ignore list"
}
},
"voice": {
"devices": {
"title": "Devices",
"microphone": "Microphone",
"speaker": "Speaker",
"microphoneFallback": "Microphone {{index}}",
"speakerFallback": "Speaker {{index}}"
},
"volume": {
"title": "Volume",
"input": "Input Volume: {{value}}%",
"output": "Output Volume: {{value}}%",
"notification": "Notification Volume: {{value}}%",
"notificationHint": "Controls join, leave & notification sounds",
"test": "Test",
"previewAria": "Preview notification sound",
"previewTitle": "Preview sound"
},
"quality": {
"title": "Quality & Processing",
"latencyProfile": "Latency Profile",
"latencyLow": "Low (fast)",
"latencyBalanced": "Balanced",
"latencyHigh": "High (quality)",
"audioBitrate": "Audio Bitrate: {{value}} kbps",
"screenShareQuality": "Screen share quality",
"askScreenShare": {
"label": "Ask before screen sharing",
"description": "Let the user confirm quality before each new screen share",
"aria": "Toggle screen share quality prompt"
},
"noiseReduction": {
"label": "Noise reduction",
"description": "Suppress background noise using RNNoise",
"descriptionLong": "Use RNNoise to suppress background noise from your microphone",
"aria": "Toggle noise reduction"
},
"systemAudio": {
"label": "Screen share system audio",
"description": "Share other computer audio while filtering Toju audio when supported",
"hint": "Your microphone stays on the normal voice channel. The shared screen audio should only contain desktop sound.",
"aria": "Toggle system audio in screen share"
}
},
"screenShareQuality": {
"performance": {
"label": "Performance saver",
"description": "720p / 30 FPS with lower CPU and bandwidth usage."
},
"balanced": {
"label": "Balanced",
"description": "1080p / 30 FPS for stable quality in most cases."
},
"high-fps": {
"label": "High FPS",
"description": "1080p / 60 FPS for games and fast motion."
},
"quality": {
"label": "Sharp text",
"description": "1440p / 30 FPS for detailed UI and text clarity."
}
},
"desktopPerformance": {
"title": "Desktop Performance",
"hardwareAcceleration": {
"label": "Hardware acceleration",
"description": "Use GPU acceleration for rendering and WebRTC when available",
"aria": "Toggle hardware acceleration"
},
"restartRequired": {
"title": "Restart required",
"description": "Restart Toju to apply the new hardware acceleration setting.",
"button": "Restart app"
}
},
"standalone": {
"title": "Voice Settings",
"notificationVolume": {
"label": "Notification volume",
"description": "Volume for join, leave, and notification sounds"
}
}
},
"data": {
"localData": {
"title": "Local data",
"description": "Manage the folder that contains local messages, rooms, attachments, avatars, saved themes, and desktop storage.",
"restartApp": "Restart app"
},
"desktopOnly": "Data management is only available in the packaged Electron desktop app.",
"currentFolder": {
"title": "Current data folder",
"resolving": "Resolving data folder..."
},
"openFolder": "Open folder",
"opening": "Opening...",
"export": {
"title": "Export data",
"description": "Create a portable .dat archive that can be imported on another client.",
"button": "Export data",
"exporting": "Exporting..."
},
"import": {
"title": "Import all data",
"description": "Restore a .dat archive. Existing local data is moved to a backup folder first.",
"button": "Import data",
"importing": "Importing...",
"confirm": "Importing data replaces the current local data. Existing data will be moved to a backup folder first. Continue?"
},
"erase": {
"title": "Erase user data",
"description": "Remove local app data from this device and recreate an empty database.",
"button": "Erase user data",
"erasing": "Erasing...",
"confirm": "Erase all local Toju data on this device? This cannot be undone."
},
"messages": {
"openedFolder": "Opened the current data folder.",
"couldNotOpenFolder": "Could not open the data folder.",
"exportCancelled": "Export cancelled.",
"exportedTo": "Exported data to {{path}}.",
"exported": "Exported data.",
"importCancelled": "Import cancelled.",
"importedWithBackup": "Imported data. Previous data was backed up to {{path}}.",
"imported": "Imported data.",
"erased": "Local data erased. Restart the app to finish resetting the session.",
"operationFailed": "Data operation failed."
}
},
"updates": {
"desktop": {
"title": "Desktop app updates",
"description": "Use a hosted release manifest to check for new packaged desktop builds and apply them after a restart."
},
"mobile": {
"title": "Mobile app updates",
"description": "Check the Play Store or App Store for newer native builds. Android can install in-app updates when Google Play allows it.",
"unsupported": "Store updates are only available in the packaged Android or iOS app."
},
"unsupported": "Automatic updates are only available in the packaged Electron desktop app or native mobile app.",
"installed": "Installed",
"storeVersion": "Store version",
"latestInManifest": "Latest in manifest",
"targetVersion": "Target version",
"lastChecked": "Last checked",
"unknown": "Unknown",
"automatic": "Automatic",
"notCheckedYet": "Not checked yet",
"status": "Status",
"waitingMobile": "Waiting for the first store update check.",
"waitingDesktop": "Waiting for release information from the active server.",
"checkForUpdates": "Check for updates",
"openAppStore": "Open app store",
"installUpdate": "Install update",
"restartToFinish": "Restart to finish update",
"policy": {
"title": "Update policy",
"description": "Choose whether the app tracks the newest release, stays on a specific release, or turns updates off entirely.",
"mode": "Mode",
"modeAuto": "Newest release",
"modeVersion": "Specific version",
"modeOff": "Turn off auto updates",
"pinnedVersion": "Pinned version",
"chooseRelease": "Choose a release..."
},
"refreshReleaseInfo": "Refresh release info",
"restartToUpdate": "Restart to update",
"manifest": {
"title": "Manifest URL priority",
"description": "Add one manifest URL per line. The app tries them from top to bottom and falls back to the next URL when a manifest cannot be loaded or is invalid.",
"usingDefaults": "Using connected server defaults",
"usingSaved": "Using saved manifest URLs",
"emptyHint": "When this list is empty, the app automatically uses manifest URLs reported by your configured servers.",
"urlsLabel": "Manifest URLs",
"placeholder": "https://example.com/releases/latest/download/release-manifest.json",
"noServerManifest": "None of your configured servers currently report a manifest URL.",
"save": "Save manifest URLs",
"useDefaults": "Use connected server defaults"
},
"serverBlocked": {
"title": "Server update required",
"connectedServer": "Connected server",
"requiredMinimum": "Required minimum",
"notReported": "Not reported"
},
"resolvedManifest": {
"title": "Resolved manifest URL",
"empty": "No working manifest URL has been resolved yet."
},
"statusLabels": {
"idle": "Idle",
"checking": "Checking",
"downloading": "Downloading",
"restartRequired": "Restart required",
"upToDate": "Up to date",
"disabled": "Disabled",
"unsupported": "Unsupported",
"manifestMissing": "Manifest missing",
"versionUnavailable": "Version unavailable",
"pinnedBelowCurrent": "Pinned below current",
"error": "Error"
},
"mobileStatusLabels": {
"idle": "Idle",
"checking": "Checking",
"downloading": "Downloading",
"upToDate": "Up to date",
"updateAvailable": "Update available",
"unsupported": "Unsupported",
"error": "Error"
}
},
"localApi": {
"title": "Local HTTP API",
"description": "Expose your client to local automation tools and scripts. Authentication is verified against your signaling server, and access is off by default.",
"desktopOnly": "The local API is only available in the packaged Electron desktop app.",
"server": {
"title": "Server",
"description": "Enable to start a local HTTP server. By default it only listens on the loopback interface.",
"run": "Run local API server",
"runHint": "Start the HTTP server on this machine.",
"docusaurus": "Serve Docusaurus documentation at /docusaurus",
"docusaurusHint": "Hosts the built app and plugin documentation from local desktop resources.",
"exposeLan": "Allow connections from your network",
"exposeLanHint": "Bind to all interfaces (0.0.0.0). Other devices on your LAN will be able to reach the API. Only enable this on networks you trust.",
"port": "Port",
"portHint": "Change the listening port if 17878 is in use. Press save to apply.",
"savePort": "Save port"
},
"auth": {
"title": "Authentication",
"description": "Bearer tokens are issued only after a username/password is verified against one of the signaling servers below. Add the full URL (including https://) of every signaling server you trust.",
"placeholder": "https://signaling.example.com",
"save": "Save allowed servers"
},
"docs": {
"title": "Documentation",
"description": "Browse the API in a privacy-respecting locally hosted Scalar reference. No telemetry, no AI, no remote network calls.",
"scalar": "Serve Scalar documentation at /docs",
"scalarHint": "Loads from local app resources only. The OpenAPI document is always available at /api/openapi.json.",
"openApi": "Open API docs in browser",
"openAppDocs": "Open app docs in browser",
"copyBaseUrl": "Copy base URL",
"listeningAt": "Listening at"
},
"status": {
"running": "Running at {{url}}",
"starting": "Starting...",
"error": "Error: {{message}}",
"stopped": "Stopped",
"unknown": "unknown"
},
"errors": {
"invalidPort": "Port must be an integer between 1 and 65535",
"couldNotOpenDocs": "Could not open documentation",
"updateFailed": "Failed to update settings"
}
},
"debugging": {
"title": "App-wide debugging",
"description": "Capture UI events, navigation activity, console output, and global runtime errors in a live debug console.",
"processRam": "Process RAM",
"ramHint": "Live total working set from Electron app metrics. Updates every 2 seconds.",
"capturedEvents": "Captured events",
"lastUpdate": "Last update: {{label}}",
"noLogsYet": "No logs yet",
"errors": "Errors",
"errorsHint": "Unhandled runtime failures and rejected promises.",
"warnings": "Warnings",
"warningsHint": "Navigation cancellations, offline events, and other warnings.",
"console": {
"title": "Floating debug console",
"description": "When debugging is enabled, a bug icon appears in the app so you can open the docked console without blocking the rest of the UI.",
"open": "Open console",
"openActive": "Console open",
"clear": "Clear logs"
}
},
"permissions": {
"intro": "Roles now define who can moderate, manage channels, upload files, and join voice. Channel overrides are optional and apply on top of the base role permissions.",
"readOnly": "You can inspect this server's access model, but only members with Manage Roles can edit it.",
"roles": {
"title": "Roles",
"hint": "Higher roles appear first.",
"add": "Role",
"system": "System",
"protected": "Protected role",
"name": "Role Name",
"color": "Color",
"save": "Save Role",
"moveUp": "Move Up",
"moveDown": "Move Down",
"delete": "Delete",
"systemHint": "System roles can still have their permissions tuned, but their name, color, and membership in the base hierarchy stay fixed.",
"editHint": "Edit the role metadata here, then tune its global permissions and per-channel overrides below."
},
"slowMode": {
"title": "Slow Mode",
"description": "Sets the minimum delay between messages for everyone in the server.",
"off": "Off",
"5s": "5 seconds",
"10s": "10 seconds",
"30s": "30 seconds",
"1m": "1 minute",
"2m": "2 minutes"
},
"basePermissions": {
"title": "Base Permissions",
"description": "These defaults apply everywhere unless a channel override changes them."
},
"channelOverrides": {
"title": "Channel Overrides",
"description": "Override the selected role inside a specific channel without changing the server-wide default.",
"noChannels": "This server has no channels yet.",
"channel": "Channel"
},
"states": {
"inherit": "Inherit",
"allow": "Allow",
"deny": "Deny"
},
"newRole": "New Role",
"selectServer": "Select a server from the sidebar to manage"
},
"server": {
"title": "Room Settings",
"readOnly": "You are viewing this server's details without server-management permission.",
"image": {
"title": "Server Image",
"description": "Synced to members and shown in server discovery.",
"upload": "Upload image",
"uploadAria": "Upload server image",
"remove": "Remove image",
"removeAria": "Remove server image",
"readError": "Could not read that image."
},
"roomName": "Room Name",
"description": "Description",
"private": {
"label": "Private Room",
"description": "Require approval to join",
"yes": "Yes",
"no": "No"
},
"maxUsers": "Max Users (0 = unlimited)",
"password": {
"title": "Server Password",
"whitelisted": "Joined members stay whitelisted until they are kicked or banned.",
"addOptional": "Add an optional password so new members need it to join.",
"remove": "Remove Password",
"keep": "Keep Password",
"enabled": "Password protection is currently enabled.",
"willRemove": "Password protection will be removed when you save.",
"disabled": "Password protection is currently disabled.",
"setNew": "Set New Password",
"set": "Set Password",
"keepCurrentPlaceholder": "Leave blank to keep the current password",
"optionalPlaceholder": "Optional password required for new joins",
"willReplace": "The new password will replace the current one when you save.",
"viewerHint": "Invite links bypass the password, but bans still apply.",
"enabledShort": "Enabled",
"disabledShort": "Disabled"
},
"save": "Save Settings",
"saved": "Saved!",
"dangerZone": "Danger Zone",
"deleteRoom": "Delete Room",
"deleteConfirm": {
"title": "Delete Room",
"confirm": "Delete Room",
"message": "Are you sure you want to delete this room? This action cannot be undone."
},
"selectServer": "Select a server from the sidebar to manage"
},
"members": {
"empty": "No other members found for this server",
"online": "Online",
"kick": "Kick",
"ban": "Ban",
"assignedRoles": "Assigned Roles",
"readOnlyRoles": "You can view this member's roles, but you do not have permission to change them.",
"selectServer": "Select a server from the sidebar to manage"
},
"bans": {
"empty": "No banned users",
"unknownUser": "Unknown User",
"reason": "Reason: {{reason}}",
"expires": "Expires: {{date}}",
"permanent": "Permanent",
"selectServer": "Select a server from the sidebar to manage"
}
}
}

View File

@@ -0,0 +1,192 @@
{
"shared": {
"dialog": {
"confirm": "Confirm",
"cancel": "Cancel",
"close": "Close",
"closeDialogAria": "Close dialog",
"closeMenuAria": "Close menu",
"menuFallbackAria": "Menu"
},
"leaveServer": {
"title": "Leave Server?",
"removeFromList": "Leaving will remove",
"fromMyServers": "from your My Servers list.",
"ownerNotice": "You are the current owner of this server.",
"ownerTransferHint": "You can optionally promote another member before leaving. If you skip this step, the server will continue without an owner.",
"newOwner": "New owner",
"skipOwnerTransfer": "Skip owner transfer",
"noMembersToPromote": "No other known members are available to promote right now.",
"leave": "Leave Server",
"roles": {
"owner": "Owner",
"admin": "Admin",
"moderator": "Moderator",
"member": "Member"
}
},
"mediaPlayer": {
"saveAudioAria": "Save audio to folder",
"saveVideoAria": "Save video to folder",
"saveToFolder": "Save to folder",
"play": "Play",
"pause": "Pause",
"playAudioAria": "Play audio",
"pauseAudioAria": "Pause audio",
"playVideoAria": "Play video",
"pauseVideoAria": "Pause video",
"togglePlaybackAria": "Toggle video playback",
"playVideoOverlay": "Play video",
"mute": "Mute",
"unmute": "Unmute",
"muteAudioAria": "Mute audio",
"unmuteAudioAria": "Unmute audio",
"muteVideoAria": "Mute video",
"unmuteVideoAria": "Unmute video",
"seekAudioAria": "Seek audio",
"seekVideoAria": "Seek video",
"volumeAudioAria": "Audio volume",
"volumeVideoAria": "Video volume",
"showWaveform": "Show waveform",
"hideWaveform": "Hide waveform",
"showWaveformAria": "Show waveform",
"hideWaveformAria": "Hide waveform",
"loadingWaveform": "Loading waveform...",
"waveformUnavailable": "Couldn't render a waveform preview for this file, but playback still works.",
"fullscreen": "Fullscreen",
"exitFullscreen": "Exit fullscreen",
"enterFullscreenAria": "Enter fullscreen",
"exitFullscreenAria": "Exit fullscreen"
},
"debugConsole": {
"toggleAria": "Toggle debug console",
"toggleTitle": "Toggle debug console",
"resizeWidthAria": "Resize debug console width",
"resizeWidthRightAria": "Resize debug console width from right",
"resizeAria": "Resize debug console",
"resizeHeightBottomAria": "Resize debug console height from bottom",
"resizeCornerAria": "Resize debug console from corner",
"moveAria": "Move debug console",
"dragToMove": "Drag to move",
"showingLatest": "Showing latest 500 of {{total}} entries",
"showAll": "Show all",
"title": "Debug Console",
"visibleCount": "{{count}} visible",
"networkSummary": "{{clients}} clients · {{links}} links",
"logsDescription": "Search logs, filter by level or source, and inspect timestamps inline.",
"networkDescription": "Visualize signaling, peer links, typing, speaking, streaming, and grouped traffic directly from captured debug data.",
"dock": "Dock",
"undock": "Undock",
"pauseAutoScroll": "Pause auto-scroll",
"resumeAutoScroll": "Resume auto-scroll",
"export": "Export",
"exportLogsTitle": "Export logs",
"logsSection": "Logs",
"exportCsv": "Export as CSV",
"exportTxt": "Export as TXT",
"exportJson": "Export as JSON",
"networkSection": "Network",
"exportNetworkJson": "Export network JSON",
"clear": "Clear",
"close": "Close",
"logsTab": "Logs",
"networkTab": "Network",
"searchPlaceholder": "Search messages, payloads, timestamps, and sources",
"searchLogsSrOnly": "Search logs",
"filterBySourceSrOnly": "Filter by source",
"allSources": "All sources",
"levelsLabel": "Levels",
"levels": {
"event": "Events",
"debug": "Debug",
"info": "Info",
"warn": "Warn",
"error": "Error",
"unknown": "Unknown"
},
"networkTrafficHint": "Traffic is grouped by edge and message type to keep signaling, voice-state, and screen-state chatter readable.",
"networkBadges": {
"typing": "{{count}} typing",
"speaking": "{{count}} speaking",
"streaming": "{{count}} streaming",
"memberships": "{{count}} memberships"
},
"entryList": {
"noLogsMatch": "No logs match the current filters.",
"noLogsHint": "Generate activity in the app or loosen the filters to see captured events.",
"hideDetails": "Hide details",
"showDetails": "Show details"
},
"networkMap": {
"clients": "{{count}} clients",
"servers": "{{count}} servers",
"peerLinks": "{{count}} peer links",
"groupedMessages": "{{count}} grouped messages",
"localClient": "Local client",
"remoteClient": "Remote client",
"signaling": "Signaling",
"server": "Server",
"noActivityTitle": "No network activity captured yet.",
"noActivityBody": "Enable debugging before connecting to signaling, joining a server, or opening peer channels to populate the live map.",
"peerDetails": "Peer details",
"updated": "Updated {{age}}",
"peerDetailsEmpty": "Connected clients appear here with IDs, handshakes, text counts, streams, drops, and live download metrics.",
"streams": "Streams",
"text": "Text",
"handshakes": "Handshakes",
"downloadMbps": "Download Mbps",
"ping": "Ping",
"connectionDrops": "Connection drops",
"connectionFlows": "Connection flows",
"groupedByEdge": "Grouped by edge + message type",
"flowsEmpty": "Once logs arrive, each edge will show grouped signaling or P2P message types with counts.",
"pingMs": "Ping {{ms}} ms",
"groupedMessagesOnEdge": "{{count}} grouped messages",
"noGroupedMessagesOnEdge": "No grouped messages on this edge yet.",
"moreCount": "+{{count}} more",
"idPrefix": "ID {{id}}",
"peerPrefix": "Peer {{identity}}",
"streamsTooltip": "A = audio streams, V = video streams",
"audioStreams": "Audio streams",
"videoStreams": "Video streams",
"textTooltip": "Up arrow = sent messages, down arrow = received messages",
"sentMessages": "Sent messages",
"receivedMessages": "Received messages",
"handshakesTooltip": "Counts are shown as sent / received",
"webrtcOffers": "WebRTC offers",
"webrtcAnswers": "WebRTC answers",
"iceCandidates": "ICE candidates",
"downloadTooltip": "Down arrow = download rate. F = file, A = audio, V = video.",
"downloadRate": "Download rate",
"fileDownloadMbps": "File download Mbps",
"audioDownloadMbps": "Audio download Mbps",
"videoDownloadMbps": "Video download Mbps",
"pingMsValue": "{{ms}} ms",
"unavailable": "Unavailable"
},
"activity": {
"speaking": "Speaking",
"typing": "Typing",
"streaming": "Streaming",
"muted": "Muted",
"active": "Active"
},
"edgeKind": {
"membership": "Membership",
"signaling": "Signaling",
"peer": "Peer"
},
"age": {
"justNow": "just now",
"secondsAgo": "{{seconds}}s ago",
"minutesAgo": "{{minutes}}m ago",
"hoursAgo": "{{hours}}h ago"
}
},
"accessControl": {
"roles": {
"everyone": "@everyone"
}
}
}
}

View File

@@ -0,0 +1,40 @@
{
"shell": {
"titleBar": {
"guest": "Guest",
"noServer": "No Server",
"noTextChannels": "No text channels",
"voiceLounge": "Voice Lounge",
"textChannelCount": "{{count}} text",
"voiceChannelCount": "{{count}} voice",
"reconnectingSignalServer": "Reconnecting to signal server...",
"reconnecting": "Reconnecting...",
"login": "Login",
"serverPlugins": "Server plugins",
"menu": "Menu",
"creatingInviteLink": "Creating Invite Link...",
"createInviteLink": "Create Invite Link",
"leaveServer": "Leave Server",
"pluginStore": "Plugin Store",
"closeMenuOverlay": "Close menu overlay",
"optionalPluginAvailable": "Optional server plugin available:",
"morePlugins": "+{{count}} more",
"dontShowAgain": "Don't show again",
"requiredServerPlugins": "Required server plugins",
"roomRequiresPluginUpdate": "{{roomName}} requires a plugin update",
"requiredPluginsDescription": "An admin added required plugins for this server. Install them to keep using the server, or leave the server.",
"installPlugins": "Install plugins",
"creatingInvite": "Creating invite link...",
"inviteCopied": "Invite link copied to clipboard.",
"inviteCreateFailed": "Unable to create invite link.",
"docsOpenFailed": "Unable to open documentation.",
"pluginInstallFailed": "Unable to install server plugin",
"copyInvitePrompt": "Copy this invite link"
},
"contextMenu": {
"emoji": "Emoji",
"addToEmojiLibrary": "Add to emoji library",
"removeFromEmojiLibrary": "Remove from emoji library"
}
}
}

View File

@@ -0,0 +1,136 @@
{
"theme": {
"studio": {
"badge": "Theme Studio",
"pickElement": "Pick UI Element",
"formatJson": "Format JSON",
"openCss": "Open CSS",
"copyLlmGuide": "Copy LLM Guide",
"importFile": "Import File",
"exportFile": "Export File",
"applyCssTheme": "Apply CSS Theme",
"applyDraft": "Apply Draft",
"restoreDefault": "Restore Default",
"workspace": "Workspace",
"regions": "Regions",
"draft": "Draft",
"unsavedChanges": "Unsaved changes",
"inSync": "In sync",
"invalidDraft": "The draft is invalid. The last working theme is still active.",
"workspaceAria": "Theme Studio workspace",
"presetThemes": "Preset Themes",
"builtInCount": "{{count}} built in",
"defaultBadge": "Default",
"savedThemes": "Saved Themes",
"syncing": "Syncing",
"savedCount": "{{count}} saved",
"saveNew": "Save New",
"saveSelected": "Save Selected",
"use": "Use",
"edit": "Edit",
"remove": "Remove",
"refresh": "Refresh",
"ready": "Ready",
"invalid": "Invalid",
"emptySavedThemes": "Save the current draft to create your first reusable Electron theme.",
"explorer": "Explorer",
"explorerShown": "{{count}} shown",
"searchKeysPlaceholder": "Search theme keys",
"mounted": "Mounted",
"noKeysMatch": "No registered theme keys match this filter.",
"openStylesJson": "Open styles in JSON",
"openLayoutJson": "Open layout in JSON",
"cssOnlyTheme": "CSS-Only Theme",
"themeJson": "Theme JSON",
"cssOnlyHint": "CSS here is applied over the built-in default JSON theme.",
"lines": "{{count}} lines",
"chars": "{{count}} chars",
"errors": "{{count}} errors",
"ideEditor": "IDE editor",
"jsonTheme": "JSON Theme",
"cssOnly": "CSS Only",
"selection": "Selection",
"pickLiveElement": "Pick live element",
"mountedNow": "Mounted now",
"editableAttributes": "Editable Attributes",
"addFadeAnimation": "Add fade animation",
"animationKeys": "Animation Keys",
"noAnimationKeys": "No custom animation keys yet.",
"layoutGrid": "Layout Grid",
"resetContainer": "Reset Container",
"workspaces": {
"editor": {
"label": "JSON Editor",
"description": "Edit the raw theme document in a fixed-contrast code view."
},
"inspector": {
"label": "Element Inspector",
"description": "Browse themeable regions, supported overrides, and starter values."
},
"layout": {
"label": "Layout Studio",
"description": "Move shells around the grid without hunting through JSON."
}
},
"capabilities": {
"layoutEditable": "Layout editable",
"textOverride": "Text override",
"safeExternalLink": "Safe external link",
"iconSlot": "Icon slot"
},
"llmGuideCopied": "LLM guide copied.",
"llmGuideManualCopy": "Manual copy opened.",
"llmGuidePrompt": "Copy this LLM theme guide",
"exported": "{{fileName}} exported.",
"exportCancelled": "Theme export cancelled.",
"fixJsonBeforeExport": "Fix JSON errors before exporting the theme."
},
"presets": {
"toju-default-dark-11": {
"name": "Toju Default Dark 11",
"description": "Built-in dark glass theme for the full Toju app shell."
},
"toju-website-dark": {
"name": "Toju Website Dark",
"description": "Website-inspired dark app theme using the charcoal, green, and amber palette from the public Toju site."
},
"toju-default-dark": {
"name": "Toju Default Dark",
"description": "Built-in dark glass theme for the full Toju app shell."
}
},
"editor": {
"jsonAria": "Theme JSON editor",
"cssAria": "Theme CSS editor",
"cssSyntaxError": "CSS syntax error."
},
"status": {
"fixJsonBeforeFormat": "Fix JSON errors before formatting the theme draft.",
"draftFormatted": "Theme draft formatted.",
"draftValidationErrors": "The current draft has validation errors. The previous working theme is still active.",
"themeApplied": "Theme applied.",
"cssApplied": "CSS applied over the JSON theme.",
"couldNotLoad": "The {{source}} could not be loaded.",
"resetByShortcut": "Theme reset to the default preset by shortcut.",
"resetByButton": "Theme reset to the default preset.",
"presetNotFound": "Built-in theme preset not found.",
"presetCouldNotApply": "Built-in theme preset could not be applied.",
"presetApplied": "{{name}} preset applied.",
"fixJsonBeforeTools": "Fix JSON errors before using the structured theme tools.",
"structuredChangeInvalid": "The structured change could not be validated.",
"preparedElement": "Prepared {{key}} in the theme draft.",
"preparedLayout": "Prepared {{key}} layout in the theme draft.",
"elementUpdated": "{{key}} updated.",
"animationUpdated": "Animation {{key}} updated.",
"fixJsonBeforeCss": "Fix JSON errors before applying CSS over the theme draft.",
"cssOnlyCouldNotApply": "The CSS-only theme could not be applied.",
"importFailed": "Unable to import {{fileName}}."
},
"pickerOverlay": {
"activeBadge": "Theme Picker Active",
"instruction": "Click a highlighted area to inspect its theme key.",
"hovering": "Hovering:",
"hoverFallback": "Move over a themeable region"
}
}
}

View File

@@ -0,0 +1,87 @@
{
"voice": {
"controls": {
"connectionError": "Connection error",
"connectionErrorStatus": "Connection Error",
"connected": "Connected",
"retry": "Retry",
"failedConnect": "Failed to connect voice session."
},
"floating": {
"backToServer": "Back to {{server}}",
"voiceFallback": "Voice",
"toggleMute": "Toggle Mute",
"toggleDeafen": "Toggle Deafen",
"toggleScreenShare": "Toggle Screen Share",
"disconnect": "Disconnect"
},
"workspace": {
"streams": "Streams",
"inVoice": "{{count}} in voice",
"liveStreams": "{{count}} live streams",
"liveStream": "{{count}} live stream",
"localPreview": "Local preview",
"focusedStream": "Focused stream",
"yourCamera": "Your camera",
"yourScreen": "Your screen",
"focusedStreamFallback": "Focused stream",
"unmuteStreamAudio": "Unmute stream audio",
"muteStreamAudio": "Mute stream audio",
"showAllStreams": "Show all streams",
"allStreams": "All streams",
"minimizeWorkspace": "Minimize stream workspace",
"returnToChat": "Return to chat",
"otherLiveStreams": "Other live streams",
"noLiveStreams": "No live streams yet",
"noLiveStreamsDescription": "Turn on your camera, click Screen Share below, or wait for someone in {{channel}} to go live.",
"participantsReady": "{{count}} participants ready",
"startScreenShare": "Start screen sharing",
"expand": "Expand",
"close": "Close",
"waitingForStream": "Waiting for a live stream",
"connectedTo": "Connected to {{server}}",
"miniWindowHint": "{{count}} live streams · double-click to expand",
"miniWindowHintSingle": "{{count}} live stream · double-click to expand",
"voiceLounge": "Voice Lounge",
"voiceServer": "Voice server",
"voiceWorkspace": "Voice workspace"
},
"streamTile": {
"cameraLive": "Camera live",
"screenShareLive": "Screen share live",
"focusAria": "Focus {{name}} {{badge}}",
"openAria": "Open {{name}} {{badge}} in widescreen mode",
"exitFullscreenTitle": "Double-click to exit fullscreen",
"enterFullscreenTitle": "Double-click for fullscreen",
"localCameraFullscreen": "Local camera preview in fullscreen",
"localPreviewFullscreen": "Local preview in fullscreen",
"cameraFullscreen": "Fullscreen camera view",
"streamFullscreen": "Fullscreen stream view",
"localCameraPreview": "Your camera preview never captures audio.",
"localPreviewMuted": "Your preview stays muted locally to avoid audio feedback.",
"streamVolume": "Stream volume",
"screenShareVolume": "Screen share volume",
"rotateLandscape": "Rotate to landscape",
"exitFullscreen": "Exit fullscreen",
"fullscreen": "Fullscreen",
"noScreenAudio": "No screen audio",
"viewingWidescreen": "Viewing in widescreen",
"viewInWidescreen": "View in widescreen",
"streamAudio": "Stream audio",
"audioPercent": "{{volume}}% audio"
}
},
"network": {
"signaling": {
"connectTimeout": "Timed out connecting to signaling server",
"connectionFailed": "Connection to signaling server failed",
"disconnected": "Disconnected from signaling server",
"healthCheckFailed": "Signaling server health check failed",
"instanceChanged": "Signaling server instance changed; refreshing websocket",
"recovered": "Signaling server recovered; refreshing websocket",
"keepaliveTimeout": "Signaling keepalive acknowledgement timed out",
"keepaliveSendFailed": "Failed to send signaling keepalive",
"payloadSendFailed": "Failed to send signaling payload"
}
}
}

2344
toju-app/public/i18n/en.json Normal file

File diff suppressed because it is too large Load Diff