Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .cursor/rules/Localization.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
alwaysApply: true
---

It is necessary to support UI localization in EN and RU, as well as other languages.
The translation file structure should be logically divided between files by modules, pages, and other logical elements.
It is necessary to determine what can be seen by the user and localize it.

The t(key, { defaultValue: 'english fallback text' }) function should contain the source string in English for all translations.

Use camelCase for localization keys.

7 changes: 0 additions & 7 deletions public/locales/de.json

This file was deleted.

7 changes: 0 additions & 7 deletions public/locales/en.json

This file was deleted.

66 changes: 66 additions & 0 deletions public/locales/en/auth.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
{
"homeserverLabel": "Homeserver",
"homeserverListTitle": "Homeserver List",
"lookingForHomeserver": "Looking for homeserver...",
"failedToFindHomeserver": "Failed to find homeserver.",
"failedToConnectHomeserverUnusable": "Failed to connect. Homeserver configuration found with {{host}} appears unusable.",
"failedToConnectInvalidBaseUrl": "Failed to connect. Homeserver configuration base_url appears invalid.",
"connectingTo": "Connecting to {{baseUrl}}",
"failedToConnectUnavailable": "Failed to connect. Either homeserver is unavailable at this moment or does not exist.",
"loadingAuthFlow": "Loading authentication flow...",
"failedToGetAuthFlow": "Failed to get authentication flow information.",
"failedToSendResetEmail": "Failed to send reset email.",
"hintTitle": "Hint",
"hintUsernameLabel": "Username:",
"hintMatrixIdLabel": "Matrix ID:",
"hintEmailLabel": "Email:",
"usernameLabel": "Username",
"passwordLabel": "Password",
"forgotPasswordLink": "Forget Password?",
"loginButton": "Login",
"tokenLoginTitle": "Token Login",
"invalidLoginToken": "Invalid login token.",
"accountDeactivated": "This account has been deactivated.",
"failedToLoginInvalidRequest": "Failed to login. Part of your request data is invalid.",
"failedToLoginRateLimited": "Failed to login. Your login request has been rate-limited by server, Please try after some time.",
"failedToLoginUnknown": "Failed to login. Unknown reason.",
"loginCustomServerNotAllowed": "Login with custom server not allowed by your client instance.",
"failedToFindMatrixIdServer": "Failed to find your Matrix ID server.",
"invalidUsernameOrPassword": "Invalid Username or Password.",
"loginTitle": "Login",
"loginNotSupportedOnHomeserver": "This client does not support login on \"{{server}}\" homeserver. Password and SSO based login method not found.",
"noAccountPrefix": "Do not have an account?",
"registerLink": "Register",
"continueWithProvider": "Continue with {{name}}",
"continueWithSso": "Continue with SSO",
"registerTitle": "Register",
"registrationDisabled": "Registration has been disabled on this homeserver.",
"rateLimitedTryLater": "You have been rate-limited! Please try after some time.",
"invalidRequestNoRegistrationOptions": "Invalid Request! Failed to get any registration options.",
"registrationNotSupported": "This application does not support registration on this homeserver.",
"alreadyHaveAccountPrefix": "Already have an account?",
"loginLink": "Login",
"resetPasswordTitle": "Reset Password",
"rememberPasswordPrefix": "Remember your password?",
"passwordResetSuccess": "Password has been reset successfully. Please login with your new password.",
"homeserverWillEmailReset": "Homeserver {{server}} will send you an email to let you reset your password.",
"newPasswordLabel": "New Password",
"confirmPasswordLabel": "Confirm Password",
"failedToResetPassword": "Failed to reset password.",
"resetPasswordButton": "Reset Password",
"registerUsernameTaken": "This username is already taken.",
"registerUsernameInvalid": "This username contains invalid characters.",
"registerUsernameReserved": "This username is reserved.",
"weakPasswordFallback": "Weak Password. Password rejected by server please choosing more strong Password.",
"shortPasswordFallback": "Short Password. Password rejected by server please choosing more long Password.",
"registrationTokenLabel": "Registration Token",
"registrationTokenOptionalLabel": "Registration Token (Optional)",
"emailOptionalLabel": "Email (Optional)",
"acceptServerTermsPrefix": "I accept server",
"termsAndConditionsLink": "Terms and Conditions",
"failedToRegisterRateLimited": "Failed to register. Your register request has been rate-limited by server, Please try after some time.",
"failedToRegisterForbidden": "Failed to register. The homeserver does not permit registration.",
"failedToRegisterInvalidRequest": "Failed to register. Invalid request.",
"failedToRegisterUnknown": "Failed to register. Unknown Reason.",
"registerButton": "Register"
}
29 changes: 29 additions & 0 deletions public/locales/en/call.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"gridView": "Grid View",
"spotlightView": "Spotlight View",
"reactions": "Reactions",
"settings": "Settings",
"join": "Join",
"end": "End",
"homeserverNoCallingSupport": "Your homeserver does not support calling. But you can still join call started by others.",
"voiceChatEmpty": "Voice chat’s empty — Be the first to hop in!",
"noPermissionToJoin": "You don't have permission to join!",
"alreadyInAnotherCall": "Already in another call — End the current call to join!",
"participant": "Participant",
"liveCount": "{{count}} Live",
"turnOffMicrophone": "Turn Off Microphone",
"turnOnMicrophone": "Turn On Microphone",
"turnOffSound": "Turn Off Sound",
"turnOnSound": "Turn On Sound",
"stopCamera": "Stop Camera",
"startCamera": "Start Camera",
"stopScreenshare": "Stop Screenshare",
"startScreenshare": "Start Screenshare",
"closeChat": "Close Chat",
"openChat": "Open Chat",
"speakingOneSuffix": " is speaking...",
"andWord": " and ",
"speakingManySuffix": " are speaking...",
"othersCount": "{{count}} others"
}

6 changes: 6 additions & 0 deletions public/locales/en/clientRoot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"heatingUp": "Heating up",
"clearCacheAndReload": "Clear Cache and Reload",
"failedToLoad": "Failed to load. {{message}}",
"failedToStart": "Failed to start. {{message}}"
}
182 changes: 182 additions & 0 deletions public/locales/en/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
{
"cinnyLogoAlt": "Cinny Logo",
"appName": "Cinny",
"logout": "Logout",
"or": "OR",
"retry": "Retry",
"continue": "Continue",
"view": "View",
"join": "Join",
"joining": "Joining",
"members": "Members",
"connectingToServer": "Connecting to server",
"heatingUp": "Heating up",
"unableToConnectHomeserver": "Unable to connect to the homeserver. The homeserver or your internet connection may be down.",
"failedToLoadClientConfig": "Failed to load client configuration file.",
"retryUpload": "Retry Upload",
"cancelUpload": "Cancel Upload",
"zoomIn": "Zoom In",
"zoomOut": "Zoom Out",
"download": "Download",
"failedToLoadPdf": "Failed to load PDF",
"previous": "Previous",
"next": "Next",
"markAsRead": "Mark as Read",
"scrollToTop": "Scroll to Top",
"spoiler": "Spoiler",
"copyAll": "Copy All",
"files": "Files",
"send": "Send",
"uploadFailed": "Upload Failed",
"remove": "Remove",
"removeAll": "Remove All",
"search": "Search",
"sortBy": "Sort by",
"recent": "Recent",
"relevance": "Relevance",
"filter": "Filter",
"global": "Global",
"selectRooms": "Select Rooms",
"roomsFor": "Rooms for \"{{query}}\"",
"noMatchFoundBang": "No match found!",
"saveWithCount": "Save ({{count}})",
"deselectAll": "Deselect All",
"open": "Open",
"addExisting": "Add Existing",
"noSpaces": "No Spaces",
"noSpacesToDisplay": "You do not have any Spaces to display yet.",
"failedToApplyChanges": "Failed to apply changes! Please try again.",
"applyWhenReadySelected": "Apply when ready. ({{count}} Selected)",
"applyChanges": "Apply Changes",
"roomTombstoneWithBody": "Room Tombstone. {{body}}",
"event": " event",
"hour": "Hour",
"minutes": "Minutes",
"period": "Period",
"am": "AM",
"pm": "PM",
"day": "Day",
"month": "Month",
"year": "Year",
"seenBy": "Seen by",
"stepOf": "Step {{current}}/{{total}}",
"exit": "Exit",
"unverifiedDevice": "Unverified Device",
"verifyDeviceBeforeLogout": "Verify your device before logging out to save your encrypted messages.",
"alert": "Alert",
"enableVerificationOrExport": "Enable device verification or export your encrypted data from settings to avoid losing access to your messages.",
"logoutConfirm": "You’re about to log out. Are you sure?",
"failedToLogout": "Failed to logout!",
"notice": "Notice",
"featureUnderTesting": "This feature is under testing and may change over time.",
"beta": "Beta",
"recoveryPassphrase": "Recovery Passphrase",
"recoveryKey": "Recovery Key",
"verify": "Verify",
"invalidRecoveryPassphrase": "Invalid recovery passphrase.",
"invalidRecoveryKey": "Invalid recovery key.",
"connected": "Connected",
"disconnected": "Disconnected",
"syncingCount": "Syncing ({{count}})",
"restoringProgress": "Restoring: {{progress}}%",
"backupHasTrustedDecryptionKey": "Backup has trusted decryption key.",
"backupNoTrustedDecryptionKey": "Backup does not have trusted decryption key!",
"backupTrustedBySignature": "Backup has trusted by signature.",
"backupNoTrustedSignature": "Backup does not have trusted signature!",
"encryptionBackup": "Encryption Backup",
"backupDetails": "Backup Details",
"versionWithValue": "Version: {{value}}",
"keysWithValue": "Keys: {{value}}",
"restoreBackup": "Restore Backup",
"noBackupOnServer": "No backup present on server!",
"close": "Close",
"accept": "Accept",
"okay": "Okay",
"copy": "Copy",
"pick": "Pick",
"import": "Import",
"save": "Save",
"create": "Create",
"delete": "Delete",
"reset": "Reset",
"undo": "Undo",
"show": "Show",
"hide": "Hide",
"unexpectedError": "Unexpected Error!",
"deviceVerification": "Device Verification",
"unexpectedVerificationMissingVerifier": "Unexpected Error! Verification is started but verifier is missing.",
"acceptRequestFromOtherDevice": "Please accept the request from other device.",
"waitingRequestAccepted": "Waiting for request to be accepted...",
"clickAcceptStartVerification": "Click accept to start the verification process.",
"verificationRequestAccepted": "Verification request has been accepted.",
"waitingResponseOtherDevice": "Waiting for the response from other device...",
"startingEmojiVerification": "Starting verification using emoji comparison...",
"confirmEmojiMatch": "Confirm the emoji below are displayed on both devices, in the same order:",
"theyMatch": "They Match",
"doNotMatch": "Do not Match",
"deviceVerified": "Your device is verified.",
"verificationCanceled": "Verification has been canceled.",
"passphraseOptional": "Passphrase (Optional)",
"setupDeviceVerification": "Setup Device Verification",
"resetDeviceVerification": "Reset Device Verification",
"resetVerificationPermanent": "Resetting device verification is permanent.",
"resetVerificationWarning": "Anyone you have verified with will see security alerts and your encryption backup will be lost. You almost certainly do not want to do this, unless you have lost Recovery Key or Recovery Passphrase and every device you can verify from.",
"generateRecoveryKeyDescription": "Generate a Recovery Key for verifying identity if you do not have access to other devices. Additionally, setup a passphrase as a memorable alternative.",
"storeRecoveryKeyDescription": "Store the Recovery Key in a safe place for future use, as you will need it to verify your identity if you do not have access to other devices.",
"authFailedSetupVerification": "Authentication failed! Failed to setup device verification.",
"authStepsNotSupported": "Authentication steps to perform this action are not supported by client.",
"unexpectedUiaNoData": "Unexpected Error! UIA action is perform without data.",
"unexpectedCryptoNotFound": "Unexpected Error! Crypto module not found!",
"unexpectedCreateRecoveryKeyFailed": "Unexpected Error! Failed to create recovery key.",
"unexpectedCryptoObjectNotFound": "Unexpected Error! Crypto object not found.",
"verifyManually": "Verify Manually",
"selectVerificationMethod": "Select a verification method.",
"provideRecoveryKey": "Provide recovery key.",
"deviceVerifiedShort": "Device verified!",
"accountData": "Account Data",
"jsonContent": "JSON Content",
"edit": "Edit",
"cancel": "Cancel",
"developerTools": "Developer Tools",
"imageEditor": "Image Editor",
"space": "Space",
"mentions": "Mentions",
"rooms": "Rooms",
"unknownRoom": "Unknown Room",
"emojis": "Emojis",
"pageNumber": "Page Number",
"jumpToPage": "Jump To Page",
"searchForKeyword": "Search for keyword",
"clear": "Clear",
"enter": "Enter",
"noMatchFound": "No Match Found",
"noRooms": "No Rooms",
"noMatchFoundFor": "No match found for \"{{query}}\".",
"noRoomsToDisplay": "You do not have any Rooms to display yet.",
"noRoomsInSpaceDescription": "This space does not contain rooms yet.",
"searchHintPrefixes": "Type # for rooms, @ for DMs and * for spaces. Hotkey:",
"searchMessagesTitle": "Search Messages",
"searchMessagesSubtitle": "Find helpful messages in your community by searching with related keywords.",
"noResultsFoundFor": "No results found for \"{{query}}\"",
"resultsForQuery": "Results for \"{{query}}\"",
"permissionAllowedPrefix": "✅",
"permissionDeniedPrefix": "❌",
"membersCount": "{{count}} Members",
"noResults": "No Results",
"resultsCount": "{{count}} Results",
"noFilteredMembers": "No \"{{filter}}\" Members",
"joined": "Joined",
"invited": "Invited",
"left": "Left",
"kicked": "Kicked",
"banned": "Banned",
"sortAToZ": "A to Z",
"sortZToA": "Z to A",
"newest": "Newest",
"oldest": "Oldest",
"searchResults": "Search Results",
"noResultsFound": "No Results found",
"missingBrowserFeature": "Missing Browser Feature",
"indexedDbRequiredDescription": "No IndexedDB support found. This application requires IndexedDB to store session data locally. Please make sure your browser support IndexedDB and have it enabled.",
"whatIsIndexedDb": "What is IndexedDB?"
}
14 changes: 14 additions & 0 deletions public/locales/en/createChat.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"userId": "User ID",
"userIdPlaceholder": "@username:server",
"validUserIdRequired": "Please enter a valid User ID.",
"options": "Options",
"endToEndEncryption": "End-to-End Encryption",
"encryptionIrreversible": "Once this feature is enabled, it can't be disabled after the room is created.",
"serverRateLimitedMinutes": "Server rate-limited your request for {{minutes}} minutes!",
"create": "Create",
"createChatTitle": "Create Chat",
"createChatHeroSubtitle": "Start a private, encrypted chat by entering a user ID.",
"directMessagesTitle": "Direct Messages",
"chatsCategoryTitle": "Chats"
}
37 changes: 37 additions & 0 deletions public/locales/en/createRoom.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"type": "Type",
"chatRoomTitle": "Chat Room",
"chatRoomDescription": "- Messages, photos, and videos.",
"voiceRoomTitle": "Voice Room",
"voiceRoomDescription": "- Live audio and video conversations.",
"access": "Access",
"name": "Name",
"topicOptional": "Topic (Optional)",
"options": "Options",
"advancedOptions": "Advanced Options",
"endToEndEncryption": "End-to-End Encryption",
"encryptionIrreversible": "Once this feature is enabled, it can't be disabled after the room is created.",
"knockToJoin": "Knock to Join",
"knockToJoinRoomDescription": "Anyone can send request to join this room.",
"allowFederation": "Allow Federation",
"allowFederationDescription": "Users from other servers can join.",
"serverRateLimitedMinutes": "Server rate-limited your request for {{minutes}} minutes!",
"create": "Create",
"version": "Version",
"versions": "Versions",
"addressOptional": "Address (Optional)",
"addressOptionalDescription": "Pick an unique address to make it discoverable.",
"addressTaken": "This address is already taken. Please select a different one.",
"restricted": "Restricted",
"restrictedDescription": "Only member of parent space can join.",
"private": "Private",
"privateDescription": "Only people with invite can join.",
"public": "Public",
"publicDescription": "Anyone with the address can join.",
"founders": "Founders",
"foundersDescription": "Special privileged users can be assigned during creation. These users have elevated control and can only be modified during a upgrade.",
"userIdPlaceholder": "@username:server",
"enter": "Enter",
"noSuggestions": "No Suggestions",
"provideUserIdHint": "Please provide the user ID and hit Enter."
}
16 changes: 16 additions & 0 deletions public/locales/en/createSpace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"access": "Access",
"name": "Name",
"topicOptional": "Topic (Optional)",
"options": "Options",
"advancedOptions": "Advanced Options",
"knockToJoin": "Knock to Join",
"knockToJoinSpaceDescription": "Anyone can send request to join this space.",
"allowFederation": "Allow Federation",
"allowFederationDescription": "Users from other servers can join.",
"serverRateLimitedMinutes": "Server rate-limited your request for {{minutes}} minutes!",
"create": "Create",
"newSpaceTitle": "New Space",
"createSpaceTitle": "Create Space",
"createSpaceHeroSubtitle": "Build a space for your community."
}
Loading
Loading