Added "Organisms." prefix to translations for organims

This commit is contained in:
Dylan Van Nielen 2022-07-14 11:45:50 +09:30
parent 7bb187bce1
commit 09c7aa9589
30 changed files with 646 additions and 645 deletions

View file

@ -1,5 +1,5 @@
{ {
"common" : { "common": {
"close": "Close", "close": "Close",
"open": "Open", "open": "Open",
"leave": "Leave", "leave": "Leave",
@ -41,402 +41,403 @@
"browser_not_supported": "Not supported in this browser", "browser_not_supported": "Not supported in this browser",
"generic": "Something went wrong!" "generic": "Something went wrong!"
}, },
"Welcome": { "Organisms": {
"heading": "Welcome to Cinny!", "Welcome": {
"subheading": "Yet another Matrix client" "heading": "Welcome to Cinny!",
}, "subheading": "Yet another Matrix client"
"ViewSource":{
"title": "View Source",
"original_source": "Original source",
"decrypted_source": "Decrypted source"
},
"SpaceManage": {
"subtitle": "manage rooms",
"load_more": "Load more",
"rooms_and_spaces": "Rooms and spaces",
"private_rooms_message": "Either the space contains private rooms or you need to join space to view it's rooms.",
"items_selected_zero": "No selected items",
"items_selected_one": "{{count}} selected item",
"items_selected_other": "{{count}} selected items",
"room_members_zero": "No room members",
"room_members_one": "{{count}} room member",
"room_members_other": "{{count}} room members",
"mark_suggested_zero": "Marking no rooms as suggested",
"mark_suggested_one": "Marking {{count}} room as suggested",
"mark_suggested_other": "Marking {{count}} rooms as suggested",
"mark_not_suggested_zero": "Marking no rooms as suggested",
"mark_not_suggested_one": "Marking {{count}} room as suggested",
"mark_not_suggested_other": "Marking {{count}} rooms as suggested",
"remove_zero": "Removing no items",
"remove_one": "Removing {{count}} item",
"remove_other": "Removing {{count}} items.",
"suggested": "Suggested",
"mark_as_suggested":"Mark as suggested",
"mark_as_not_suggested": "Mark as not suggested"
},
"SpaceSettings":{
"subtitle": "space settings",
"leave":{
"leave_space": "Leave Space",
"leave_dialog_title": "Leave Space",
"leave_dialog_message": "Are you sure you want to leave {{space}}?"
}, },
"visibility":{ "ViewSource": {
"header": "Space visibility (who can join)" "title": "View Source",
"original_source": "Original source",
"decrypted_source": "Decrypted source"
}, },
"addresses": { "SpaceManage": {
"header": "Space addresses" "subtitle": "manage rooms",
"load_more": "Load more",
"rooms_and_spaces": "Rooms and spaces",
"private_rooms_message": "Either the space contains private rooms or you need to join space to view it's rooms.",
"items_selected_zero": "No selected items",
"items_selected_one": "{{count}} selected item",
"items_selected_other": "{{count}} selected items",
"room_members_zero": "No room members",
"room_members_one": "{{count}} room member",
"room_members_other": "{{count}} room members",
"mark_suggested_zero": "Marking no rooms as suggested",
"mark_suggested_one": "Marking {{count}} room as suggested",
"mark_suggested_other": "Marking {{count}} rooms as suggested",
"mark_not_suggested_zero": "Marking no rooms as suggested",
"mark_not_suggested_one": "Marking {{count}} room as suggested",
"mark_not_suggested_other": "Marking {{count}} rooms as suggested",
"remove_zero": "Removing no items",
"remove_one": "Removing {{count}} item",
"remove_other": "Removing {{count}} items.",
"suggested": "Suggested",
"mark_as_suggested": "Mark as suggested",
"mark_as_not_suggested": "Mark as not suggested"
}, },
"categorize_subspaces": "Categorize subspaces", "SpaceSettings": {
"uncategorize_subspaces": "Uncategorize subspaces", "subtitle": "space settings",
"pin_sidebar": "Pin to sidebar", "leave": {
"unpin_sidebar": "Unpin from sidebar" "leave_space": "Leave Space",
}, "leave_dialog_title": "Leave Space",
"Settings": { "leave_dialog_message": "Are you sure you want to leave {{space}}?"
"title": "Settings", },
"theme": { "visibility": {
"follow_system": { "header": "Space visibility (who can join)"
"title": "Follow system theme", },
"description": "Use light or dark mode based on the system settings." "addresses": {
"header": "Space addresses"
},
"categorize_subspaces": "Categorize subspaces",
"uncategorize_subspaces": "Uncategorize subspaces",
"pin_sidebar": "Pin to sidebar",
"unpin_sidebar": "Unpin from sidebar"
},
"Settings": {
"title": "Settings",
"theme": {
"follow_system": {
"title": "Follow system theme",
"description": "Use light or dark mode based on the system settings."
}, },
"title": "Theme", "title": "Theme",
"theme_light": "Light", "theme_light": "Light",
"theme_silver": "Silver", "theme_silver": "Silver",
"theme_dark": "Dark", "theme_dark": "Dark",
"theme_butter": "Butter" "theme_butter": "Butter"
},
"markdown": {
"title": "Markdown formatting",
"description": "Format messages with markdown before sending"
},
"hide_membership_events": {
"title": "Hide membership events",
"description": "Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and Ban)"
},
"hide_nickname_avatar_events": {
"title": "Hide nick/avatar events",
"description": "Hide nickname and avatar change messages from the room timeline."
},
"notifications_and_sound": {
"title": "Notifications & Sound",
"desktop": {
"title": "Desktop notifications",
"description": "Show desktop notifications when new messages arrive."
}, },
"sound": { "markdown": {
"title": "Notification sound", "title": "Markdown formatting",
"description": "Play a sound when new messages arrive." "description": "Format messages with markdown before sending"
}
},
"security": {
"cross_signing": {
"title": "Cross signing and backup"
}, },
"export_import_encryption_keys": { "hide_membership_events": {
"title": "Export / Import encryption keys" "title": "Hide membership events",
"description": "Hide membership change messages from room timeline. (Join, Leave, Invite, Kick and Ban)"
}, },
"export_encryption_keys": { "hide_nickname_avatar_events": {
"title": "Export E2E room keys", "title": "Hide nick/avatar events",
"description": "Export end-to-end encryption room keys to decrypt old messages in other session. In order to encrypt keys you need to set a password, which will be used while importing." "description": "Hide nickname and avatar change messages from the room timeline."
}, },
"import_encryption_keys": { "notifications_and_sound": {
"title": "Import E2E room keys", "title": "Notifications & Sound",
"description": "To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you\\'ll have to enter the password you set in order to decrypt it." "desktop": {
} "title": "Desktop notifications",
}, "description": "Show desktop notifications when new messages arrive."
"logout": { },
"title": "Logout", "sound": {
"dialog": { "title": "Notification sound",
"description": "Play a sound when new messages arrive."
}
},
"security": {
"cross_signing": {
"title": "Cross signing and backup"
},
"export_import_encryption_keys": {
"title": "Export / Import encryption keys"
},
"export_encryption_keys": {
"title": "Export E2E room keys",
"description": "Export end-to-end encryption room keys to decrypt old messages in other session. In order to encrypt keys you need to set a password, which will be used while importing."
},
"import_encryption_keys": {
"title": "Import E2E room keys",
"description": "To decrypt older messages, Export E2EE room keys from Element (Settings > Security & Privacy > Encryption > Cryptography) and import them here. Imported keys are encrypted so you\\'ll have to enter the password you set in order to decrypt it."
}
},
"logout": {
"title": "Logout", "title": "Logout",
"description": "Are you sure that you want to logout your session?", "dialog": {
"confirm": "Logout" "title": "Logout",
"description": "Are you sure that you want to logout your session?",
"confirm": "Logout"
}
},
"about": {
"application": "Application",
"credits": "Credits"
} }
}, },
"about":{ "ShortcutSpaces": {
"application": "Application", "header": "Pin Spaces",
"credits": "Credits" "pinned_spaces": "Pinned spaces",
} "no_pinned_spaces": "No pinned spaces",
}, "unpinned_spaces": "Unpinned spaces",
"ShortcutSpaces": { "no_unpinned_spaces": "No unpinned spaces",
"header": "Pin Spaces", "spaces_selected_zero": "No selected spaces",
"pinned_spaces": "Pinned spaces", "spaces_selected_one": "{{count}} selected space",
"no_pinned_spaces": "No pinned spaces", "spaces_selected_other": "{{count}} selected spaces",
"unpinned_spaces": "Unpinned spaces", "pin_button": "Pin"
"no_unpinned_spaces": "No unpinned spaces",
"spaces_selected_zero": "No selected spaces",
"spaces_selected_one": "{{count}} selected space",
"spaces_selected_other": "{{count}} selected spaces",
"pin_button": "Pin"
},
"SecretStorageAccess": {
"incorrect_security_key": "Incorrect security key",
"incorrect_security_phrase": "Incorrect security phrase",
"security_phrase": "Security Phrase",
"security_key": "Security Key",
"use_security_key": "Use Security Key",
"use_security_phrase": "Use Security Phrase"
},
"KeyBackup": {
"create_backup_title": "Create key backup",
"create_backup_tooltip": "Create backup",
"creating_backup": "Creating Backup...",
"backup_created": "Successfully created backup",
"backup_failed": "Failed to create backup",
"restoring": "Restoring backup keys...",
"restoring_progress": "Restoring backup keys... ({{progress}}/{{total}}",
"restore_backup_title": "Restore Key Backup",
"restore_backup_tooltip": "Restore Key Backup",
"restore_complete": "Successfully restored backup keys ({{progress}}/{{total}})",
"restore_failed_bad_key": "Failed to restore backup. Key is invalid!",
"restore_failed_unknown": "Failed to restore backup.",
"delete_key_backup_title": "Delete key backup",
"delete_key_backup_tooltip": "Delete backup",
"delete_key_backup_subtitle": "Deleting key backup is permanent.",
"delete_key_backup_message": "All encrypted message keys stored on the server will be permanently deleted.",
"encrypted_messages_backup_description": "Online backup your encrypted messages keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key.",
"encrypted_messages_backup_title": "Encrypted messages backup",
"encrypted_messages_backup_cross_signing_disabled": "Setup cross signing to backup your encrypted messages."
},
"DeviceManage": {
"edit_session_name_title": "Edit session name",
"edit_session_name_subtitle": "Session name",
"edit_session_name_tooltip": "Edit session name",
"current_device_label": "Current",
"verify_session_button": "Verify",
"unverified_sessions_title": "Unverified sessions",
"unverified_sessions_none": "No unverified sessions",
"unencrypted_sessions_title": "Sessions without encryption support",
"verified_sessions_title": "Verified sessions",
"verified_sessions_none": "No verified sessions",
"setup_cross_signing_message": "Setup cross signing in case you lose all your sessions",
"loading_devices": "Loading devices...",
"logout_device_title": "Logout {{device}}",
"logout_device_message": "You are about to log out the session for {{device}}",
"logout_device_confirm": "Logout",
"logout_device_tooltip": "Remove session",
"session_verification_title": "Session Verification",
"session_name_privacy_message": "Session names are visible to everyone, so do not put any private info here."
},
"CrossSigning":{
"title": "Cross Signing",
"setup_failed": "Failed to setup cross signing. Please try again",
"setup": "Setup cross signing",
"save_security_key_message": "Please save this security key somewhere safe",
"security_key_dialog_title": "Security Key",
"security_key_generation_message": "We will generate a Security Key, which you can use to manage message backups and session verification.",
"security_key_generation_button": "Generate Key",
"security_phrase_message": "Alternatively you can set a 'Security Phrase' so you don't have to remember the long Security Key, and optionally save the key as a backup",
"security_phrase_label": "Security Phrase",
"security_phrase_confirm_label": "Confirm Security Phrase",
"security_phrase_set_button": "Set Phrase & Generate Key",
"setup_dialog_title": "Setup cross signing",
"setup_message": "Setup to verify and keep track of all your sessions. Also required to backup encrypted message.",
"reset_keys_subtitle": "Resetting cross-signing keys is permanent.",
"reset_keys_message": "Anyone you have verified with will see security alerts and your message backup will lost. You almost certainly do not want to do this, unless you have lost Security Key or Phrase and every session you can cross-sign from."
},
"AuthRequest" : {
"wrong_password": "Wrong password. Please enter the correct password",
"request_failed": "Request failed!",
"password_label": "Account password"
},
"Search": {
"description": "Type # for rooms, @ for DMs and * for spaces. Hotkey: Ctrl + k"
},
"RoomViewInput":{
"upload_progress": "Uploading: {{progress}}/{{total}} ({{percent}}%)",
"tombstone_replaced": "This room has been replaced, and is no longer active.",
"tombstone_permission_denied": "You do not have permission to post to this room",
"send_message_placeholder": "Send a message...",
"emoji_tooltip": "Emoji",
"file_size": "Size: {{size}}",
"cancel_reply_tooltip": "Cancel reply"
},
"RoomViewHeader": {
"search_tooltip": "Search",
"people_tooltip": "People",
"members_tooltip": "Members"
},
"RoomViewFloating": {
"jump_unread": "Jump to unread messages",
"mark_read": "Mark as read",
"jump_latest": "Jump to latest",
"user_typing_one": "<bold>{{user_one}}</bold> is typing...",
"user_typing_two": "<bold>{{user_one}}</bold> and <bold>{{user_two}}</bold> are typing...",
"user_typing_three": "<bold>{{user_one}}</bold>, <bold>{{user_two}}</bold> and <bold>{{user_three}}</bold> are typing...",
"user_typing_four": "<bold>{{user_one}}</bold>, <bold>{{user_two}}</bold>, <bold>{{user_three}}</bold> and <bold>{{user_four}}</bold> are typing...",
"user_typing_other": "<bold>Several people</bold> are typing..."
},
"RoomViewContent": {
"welcome_to_room": "Welcome to {{room_name}}!",
"beginning_room": "This is the beginning of the <bold>{{room_name}}</bold> room.",
"beginning_dm": "This is the beginning of your direct message history with <bold>@{{user_name}}</bold>.",
"created_on": "Created on {{date, datetime}}",
"new_messages": "New messages"
},
"RoomSettings" : {
"leave_room": "Leave room",
"leave_room_confirm_message": "Are you sure you want to leave {{room_name}}?",
"leave_room_confirm_button": "Leave",
"notification_header": "Notifications (Changing this will only affect you)",
"visibility_header": "Room visibility (Who can join)",
"address_header": "Room addresses",
"encryption_header": "Encryption",
"message_history_header": "Message history visibility",
"room_settings_subtitle": "room settings"
},
"RoomCommon": {
"user_joined": "<bold>{{user_name}}</bold> joined the room",
"user_left": "<bold>{{user_name}}</bold> left the room",
"user_invited": "<bold>{{inviter_name}}</bold> invited <bold>{{user_name}}</bold>",
"invite_cancelled": "<bold>{{inviter_name}}</bold> cancelled <bold>{{user_name}}'s</bold> invite",
"invite_rejected": "<bold>{{user_name}}</bold> rejected the invitation",
"user_kicked": "<bold>{{actor}}</bold> kicked <bold>{{user_name}}</bold>: {{reason}}",
"user_banned": "<bold>{{actor}}</bold> banned <bold>{{user_name}}</bold>: {{reason}}",
"user_unbanned": "<bold>{{actor}} unbanned <bold>{{user_name}}</bold>",
"avatar_set": "<bold>{{user_name}}</bold> set an avatar",
"avatar_changed": "<bold>{{user_name}}</bold> changed their avatar",
"avatar_removed": "<bold>{{user_name}}</bold> removed their avatar",
"name_set": "<bold>{{user_name}}</bold> set their display name to <bold>{{new_name}}</bold>",
"name_changed": "<bold>{{user_name}}</bold> changed their display name to <bold>{{new_name}}</bold>",
"name_removed": "<bold>{{user_name}}</bold> removed their display name <bold>{{new_name}}</bold>"
},
"PublicRooms": {
"could_not_join_alias": "Unable to join {{alias}}. Either the room is private or doesn't exist",
"try_joining_alias": "Try joining {{alias}}",
"joining_alias": "Joining {{alias}}...",
"no_public_rooms": "No public rooms on {{homeserver}}",
"no_result_found": "No result found for '{{input}}' on {{homeserver}}",
"title": "Public Rooms",
"search_room_name_alias": "Room name or alias",
"search_button": "Search",
"loading": "Loading public rooms from {{homeserver}}...",
"searching": "Searching for '{{query}}' on {{homeserver}}...",
"result_title": "Public rooms on {{homeserver}}",
"search_result_title": "Search result for '{{query}}' on {{homeserver}}"
},
"ProfileViewer": {
"kick_button": "Kick",
"kick_reason_label": "Kick Reason",
"ban_button": "Ban",
"ban_reason_label": "Ban reason",
"loading_sessions" : "Loading sessions...",
"no_sessions_found": "No sessions found.",
"view_sessions_one": "View session",
"view_sessions_other": "View {{count}} sessions",
"send_direct_message_button": "Message",
"creating_dm_room": "Creating room...",
"ignore": "Ignore",
"ignoring": "Ignoring...",
"unignore": "Unignore",
"unignoring": "Unignoring...",
"change_power_level": "Change power level",
"shared_power_message": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself. Are you sure?",
"demoting_self_message": "You will not be able to undo this change as you are demoting yourself. Are you sure?"
},
"ProfileEditor": {
"remove_avatar": "Remove avatar",
"remove_avatar_confirmation": "Are you sure that you want to remove your avatar?",
"display_name_message": "Display name of {{user_name}}"
},
"DrawerBreadcrumb": {
"home": "Home"
},
"DrawerHeader" : {
"add_rooms_or_spaces": "Add rooms or spaces",
"create_new_space": "Create new space",
"create_new_room": "Create new room",
"join_public_room": "Join public room",
"join_with_address": "Join with address",
"add_existing": "Add existing",
"manage_rooms": "Manage rooms",
"home": "Home",
"direct_messages": "Direct messages",
"start_dm_tooltip": "Start DM",
"add_rooms_spaces_tooltip": "Add rooms/spaces"
},
"SideBar": {
"settings_tooltip": "Settings",
"unverified_sessions_one": "{{count}} unverified session",
"unverified_sessions_other": "{{count}} unverified sessions",
"home_tooltip": "Home",
"direct_messages_tooltip": "People",
"pin_spaces_tooltip": "Pin spaces",
"search_tooltip": "Search",
"invites_tooltip": "Invites"
},
"JoinAlias": {
"invalid_address": "Invalid address.",
"looking_for_address": "Looking for address...",
"joining_alias": "Joining {{alias_name}}...",
"couldnt_find_room_or_space_alias": "Unable to find room/space with {{alias_name}}. Either the room/space is private or doesn't exist.",
"couldnt_find_room_or_space": "Unable to join {{alias_name}}. Either the room/space is private or doesn't exist.",
"address_label": "Address",
"title": "Join with address"
},
"InviteUser": {
"user_not_found": "{{user_name}} not found!",
"no_matches_found": "No matches found for {{user_name}}",
"invite_result": {
"invited": "Invited",
"already_joined": "Already joined",
"already_invited": "Already invited",
"banned": "Banned"
}, },
"search_label": "Name or User ID", "SecretStorageAccess": {
"search_result_title": "Search result for user {{user_name}}", "incorrect_security_key": "Incorrect security key",
"searching_for_user": "Searching for user {{user_name}}...", "incorrect_security_phrase": "Incorrect security phrase",
"invite_to_room": "Invite to {{room}}", "security_phrase": "Security Phrase",
"invite_to_dm": "Direct Message" "security_key": "Security Key",
}, "use_security_key": "Use Security Key",
"InviteList": { "use_security_phrase": "Use Security Phrase"
"accept_invite": "Accept", },
"reject_invite": "Reject", "KeyBackup": {
"direct_messages_title": "Direct Messages", "create_backup_title": "Create key backup",
"rooms_title": "Rooms", "create_backup_tooltip": "Create backup",
"spaces_title": "Spaces", "creating_backup": "Creating Backup...",
"title": "Invites" "backup_created": "Successfully created backup",
}, "backup_failed": "Failed to create backup",
"EmojiVerification": { "restoring": "Restoring backup keys...",
"waiting_for_response": "Waiting for response from other device...", "restoring_progress": "Restoring backup keys... ({{progress}}/{{total}}",
"confirmation_prompt": "Confirm the emoji below are displayed on both devices, in the same order:", "restore_backup_title": "Restore Key Backup",
"emojis_match_button": "They match", "restore_backup_tooltip": "Restore Key Backup",
"emojis_dont_match_button": "They don't match", "restore_complete": "Successfully restored backup keys ({{progress}}/{{total}})",
"accept_request_from_other_device_message": "Please accept the request from other device.", "restore_failed_bad_key": "Failed to restore backup. Key is invalid!",
"begin_verification_process_message": "Click accept to start the verification process.", "restore_failed_unknown": "Failed to restore backup.",
"begin_verification_button_text": "Accept", "delete_key_backup_title": "Delete key backup",
"title": "Emoji Verification" "delete_key_backup_tooltip": "Delete backup",
}, "delete_key_backup_subtitle": "Deleting key backup is permanent.",
"DragDrop": { "delete_key_backup_message": "All encrypted message keys stored on the server will be permanently deleted.",
"drop_file_to_upload_prompt": "Drop file to upload" "encrypted_messages_backup_description": "Online backup your encrypted messages keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key.",
}, "encrypted_messages_backup_title": "Encrypted messages backup",
"CreateRoom": { "encrypted_messages_backup_cross_signing_disabled": "Setup cross signing to backup your encrypted messages."
"private_room_short": "Private", },
"restricted_room_short": "Restricted", "DeviceManage": {
"public_room_short": "Public", "edit_session_name_title": "Edit session name",
"private_room_long": "Private (invite only)", "edit_session_name_subtitle": "Session name",
"restricted_room_long": "Restricted (space member can join)", "edit_session_name_tooltip": "Edit session name",
"public_room_long": "Public (anyone can join)", "current_device_label": "Current",
"visibility_title": "Visibility", "verify_session_button": "Verify",
"visibility_message": "Visibility (who can join)", "unverified_sessions_title": "Unverified sessions",
"select_who_can_join_space": "Select who can join this space", "unverified_sessions_none": "No unverified sessions",
"select_who_can_join_room": "Select who can join this room", "unencrypted_sessions_title": "Sessions without encryption support",
"space_address": "Space address", "verified_sessions_title": "Verified sessions",
"room_address": "Room address", "verified_sessions_none": "No verified sessions",
"room_address_already_in_use": "{{room_address}} is already in use", "setup_cross_signing_message": "Setup cross signing in case you lose all your sessions",
"e2e_title": "Enable end-to-end encryption", "loading_devices": "Loading devices...",
"e2e_message": "You cant disable this later. Bridges & most bots wont work yet.", "logout_device_title": "Logout {{device}}",
"role_title": "Select your role", "logout_device_message": "You are about to log out the session for {{device}}",
"role_message": "Selecting 'Admin' sets your power level to 100 whereas 'Founder' sets it to 101.", "logout_device_confirm": "Logout",
"creating_room": "Creating room...", "logout_device_tooltip": "Remove session",
"creating_space": "Creating space...", "session_verification_title": "Session Verification",
"topic_label": "Topic (optional)", "session_name_privacy_message": "Session names are visible to everyone, so do not put any private info here."
"space_name": "Space name", },
"room_name": "Room name", "CrossSigning": {
"role_admin": "Admin", "title": "Cross Signing",
"role_founder": "Founder", "setup_failed": "Failed to setup cross signing. Please try again",
"create_room": "Create room", "setup": "Setup cross signing",
"create_space": "Create space", "save_security_key_message": "Please save this security key somewhere safe",
"home": "Home" "security_key_dialog_title": "Security Key",
"security_key_generation_message": "We will generate a Security Key, which you can use to manage message backups and session verification.",
"security_key_generation_button": "Generate Key",
"security_phrase_message": "Alternatively you can set a 'Security Phrase' so you don't have to remember the long Security Key, and optionally save the key as a backup",
"security_phrase_label": "Security Phrase",
"security_phrase_confirm_label": "Confirm Security Phrase",
"security_phrase_set_button": "Set Phrase & Generate Key",
"setup_dialog_title": "Setup cross signing",
"setup_message": "Setup to verify and keep track of all your sessions. Also required to backup encrypted message.",
"reset_keys_subtitle": "Resetting cross-signing keys is permanent.",
"reset_keys_message": "Anyone you have verified with will see security alerts and your message backup will lost. You almost certainly do not want to do this, unless you have lost Security Key or Phrase and every session you can cross-sign from."
},
"AuthRequest": {
"wrong_password": "Wrong password. Please enter the correct password",
"request_failed": "Request failed!",
"password_label": "Account password"
},
"Search": {
"description": "Type # for rooms, @ for DMs and * for spaces. Hotkey: Ctrl + k"
},
"RoomViewInput": {
"upload_progress": "Uploading: {{progress}}/{{total}} ({{percent}}%)",
"tombstone_replaced": "This room has been replaced, and is no longer active.",
"tombstone_permission_denied": "You do not have permission to post to this room",
"send_message_placeholder": "Send a message...",
"emoji_tooltip": "Emoji",
"file_size": "Size: {{size}}",
"cancel_reply_tooltip": "Cancel reply"
},
"RoomViewHeader": {
"search_tooltip": "Search",
"people_tooltip": "People",
"members_tooltip": "Members"
},
"RoomViewFloating": {
"jump_unread": "Jump to unread messages",
"mark_read": "Mark as read",
"jump_latest": "Jump to latest",
"user_typing_one": "<bold>{{user_one}}</bold> is typing...",
"user_typing_two": "<bold>{{user_one}}</bold> and <bold>{{user_two}}</bold> are typing...",
"user_typing_three": "<bold>{{user_one}}</bold>, <bold>{{user_two}}</bold> and <bold>{{user_three}}</bold> are typing...",
"user_typing_four": "<bold>{{user_one}}</bold>, <bold>{{user_two}}</bold>, <bold>{{user_three}}</bold> and <bold>{{user_four}}</bold> are typing...",
"user_typing_other": "<bold>Several people</bold> are typing..."
},
"RoomViewContent": {
"welcome_to_room": "Welcome to {{room_name}}!",
"beginning_room": "This is the beginning of the <bold>{{room_name}}</bold> room.",
"beginning_dm": "This is the beginning of your direct message history with <bold>@{{user_name}}</bold>.",
"created_on": "Created on {{date, datetime}}",
"new_messages": "New messages"
},
"RoomSettings": {
"leave_room": "Leave room",
"leave_room_confirm_message": "Are you sure you want to leave {{room_name}}?",
"leave_room_confirm_button": "Leave",
"notification_header": "Notifications (Changing this will only affect you)",
"visibility_header": "Room visibility (Who can join)",
"address_header": "Room addresses",
"encryption_header": "Encryption",
"message_history_header": "Message history visibility",
"room_settings_subtitle": "room settings"
},
"RoomCommon": {
"user_joined": "<bold>{{user_name}}</bold> joined the room",
"user_left": "<bold>{{user_name}}</bold> left the room",
"user_invited": "<bold>{{inviter_name}}</bold> invited <bold>{{user_name}}</bold>",
"invite_cancelled": "<bold>{{inviter_name}}</bold> cancelled <bold>{{user_name}}'s</bold> invite",
"invite_rejected": "<bold>{{user_name}}</bold> rejected the invitation",
"user_kicked": "<bold>{{actor}}</bold> kicked <bold>{{user_name}}</bold>: {{reason}}",
"user_banned": "<bold>{{actor}}</bold> banned <bold>{{user_name}}</bold>: {{reason}}",
"user_unbanned": "<bold>{{actor}} unbanned <bold>{{user_name}}</bold>",
"avatar_set": "<bold>{{user_name}}</bold> set an avatar",
"avatar_changed": "<bold>{{user_name}}</bold> changed their avatar",
"avatar_removed": "<bold>{{user_name}}</bold> removed their avatar",
"name_set": "<bold>{{user_name}}</bold> set their display name to <bold>{{new_name}}</bold>",
"name_changed": "<bold>{{user_name}}</bold> changed their display name to <bold>{{new_name}}</bold>",
"name_removed": "<bold>{{user_name}}</bold> removed their display name <bold>{{new_name}}</bold>"
},
"PublicRooms": {
"could_not_join_alias": "Unable to join {{alias}}. Either the room is private or doesn't exist",
"try_joining_alias": "Try joining {{alias}}",
"joining_alias": "Joining {{alias}}...",
"no_public_rooms": "No public rooms on {{homeserver}}",
"no_result_found": "No result found for '{{input}}' on {{homeserver}}",
"title": "Public Rooms",
"search_room_name_alias": "Room name or alias",
"search_button": "Search",
"loading": "Loading public rooms from {{homeserver}}...",
"searching": "Searching for '{{query}}' on {{homeserver}}...",
"result_title": "Public rooms on {{homeserver}}",
"search_result_title": "Search result for '{{query}}' on {{homeserver}}"
},
"ProfileViewer": {
"kick_button": "Kick",
"kick_reason_label": "Kick Reason",
"ban_button": "Ban",
"ban_reason_label": "Ban reason",
"loading_sessions": "Loading sessions...",
"no_sessions_found": "No sessions found.",
"view_sessions_one": "View session",
"view_sessions_other": "View {{count}} sessions",
"send_direct_message_button": "Message",
"creating_dm_room": "Creating room...",
"ignore": "Ignore",
"ignoring": "Ignoring...",
"unignore": "Unignore",
"unignoring": "Unignoring...",
"change_power_level": "Change power level",
"shared_power_message": "You will not be able to undo this change as you are promoting the user to have the same power level as yourself. Are you sure?",
"demoting_self_message": "You will not be able to undo this change as you are demoting yourself. Are you sure?"
},
"ProfileEditor": {
"remove_avatar": "Remove avatar",
"remove_avatar_confirmation": "Are you sure that you want to remove your avatar?",
"display_name_message": "Display name of {{user_name}}"
},
"DrawerBreadcrumb": {
"home": "Home"
},
"DrawerHeader": {
"add_rooms_or_spaces": "Add rooms or spaces",
"create_new_space": "Create new space",
"create_new_room": "Create new room",
"join_public_room": "Join public room",
"join_with_address": "Join with address",
"add_existing": "Add existing",
"manage_rooms": "Manage rooms",
"home": "Home",
"direct_messages": "Direct messages",
"start_dm_tooltip": "Start DM",
"add_rooms_spaces_tooltip": "Add rooms/spaces"
},
"SideBar": {
"settings_tooltip": "Settings",
"unverified_sessions_one": "{{count}} unverified session",
"unverified_sessions_other": "{{count}} unverified sessions",
"home_tooltip": "Home",
"direct_messages_tooltip": "People",
"pin_spaces_tooltip": "Pin spaces",
"search_tooltip": "Search",
"invites_tooltip": "Invites"
},
"JoinAlias": {
"invalid_address": "Invalid address.",
"looking_for_address": "Looking for address...",
"joining_alias": "Joining {{alias_name}}...",
"couldnt_find_room_or_space_alias": "Unable to find room/space with {{alias_name}}. Either the room/space is private or doesn't exist.",
"couldnt_find_room_or_space": "Unable to join {{alias_name}}. Either the room/space is private or doesn't exist.",
"address_label": "Address",
"title": "Join with address"
},
"InviteUser": {
"user_not_found": "{{user_name}} not found!",
"no_matches_found": "No matches found for {{user_name}}",
"invite_result": {
"invited": "Invited",
"already_joined": "Already joined",
"already_invited": "Already invited",
"banned": "Banned"
},
"search_label": "Name or User ID",
"search_result_title": "Search result for user {{user_name}}",
"searching_for_user": "Searching for user {{user_name}}...",
"invite_to_room": "Invite to {{room}}",
"invite_to_dm": "Direct Message"
},
"InviteList": {
"accept_invite": "Accept",
"reject_invite": "Reject",
"direct_messages_title": "Direct Messages",
"rooms_title": "Rooms",
"spaces_title": "Spaces",
"title": "Invites"
},
"EmojiVerification": {
"waiting_for_response": "Waiting for response from other device...",
"confirmation_prompt": "Confirm the emoji below are displayed on both devices, in the same order:",
"emojis_match_button": "They match",
"emojis_dont_match_button": "They don't match",
"accept_request_from_other_device_message": "Please accept the request from other device.",
"begin_verification_process_message": "Click accept to start the verification process.",
"begin_verification_button_text": "Accept",
"title": "Emoji Verification"
},
"DragDrop": {
"drop_file_to_upload_prompt": "Drop file to upload"
},
"CreateRoom": {
"private_room_short": "Private",
"restricted_room_short": "Restricted",
"public_room_short": "Public",
"private_room_long": "Private (invite only)",
"restricted_room_long": "Restricted (space member can join)",
"public_room_long": "Public (anyone can join)",
"visibility_title": "Visibility",
"visibility_message": "Visibility (who can join)",
"select_who_can_join_space": "Select who can join this space",
"select_who_can_join_room": "Select who can join this room",
"space_address": "Space address",
"room_address": "Room address",
"room_address_already_in_use": "{{room_address}} is already in use",
"e2e_title": "Enable end-to-end encryption",
"e2e_message": "You cant disable this later. Bridges & most bots wont work yet.",
"role_title": "Select your role",
"role_message": "Selecting 'Admin' sets your power level to 100 whereas 'Founder' sets it to 101.",
"creating_room": "Creating room...",
"creating_space": "Creating space...",
"topic_label": "Topic (optional)",
"space_name": "Space name",
"room_name": "Room name",
"role_admin": "Admin",
"role_founder": "Founder",
"create_room": "Create room",
"create_space": "Create space",
"home": "Home"
}
} }
} }

View file

@ -137,8 +137,8 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
}; };
const joinRules = ['invite', 'restricted', 'public']; const joinRules = ['invite', 'restricted', 'public'];
const joinRuleShortText = [ t("CreateRoom.private_room_short"), t("CreateRoom.restricted_room_short"), t("CreateRoom.public_room_short")]; const joinRuleShortText = [ t("Organisms.CreateRoom.private_room_short"), t("Organisms.CreateRoom.restricted_room_short"), t("Organisms.CreateRoom.public_room_short")];
const joinRuleText = [ t("CreateRoom.private_room_long"), t("CreateRoom.restricted_room_long"), t("CreateRoom.public_room_long")]; const joinRuleText = [ t("Organisms.CreateRoom.private_room_long"), t("Organisms.CreateRoom.restricted_room_long"), t("Organisms.CreateRoom.public_room_long")];
const jrRoomIC = [HashLockIC, HashIC, HashGlobeIC]; const jrRoomIC = [HashLockIC, HashIC, HashGlobeIC];
const jrSpaceIC = [SpaceLockIC, SpaceIC, SpaceGlobeIC]; const jrSpaceIC = [SpaceLockIC, SpaceIC, SpaceGlobeIC];
const handleJoinRule = (evt) => { const handleJoinRule = (evt) => {
@ -147,7 +147,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
getEventCords(evt, '.btn-surface'), getEventCords(evt, '.btn-surface'),
(closeMenu) => ( (closeMenu) => (
<> <>
<MenuHeader>{t("CreateRoom.visibility_message")}</MenuHeader> <MenuHeader>{t("Organisms.CreateRoom.visibility_message")}</MenuHeader>
{ {
joinRules.map((rule) => ( joinRules.map((rule) => (
<MenuItem <MenuItem
@ -174,17 +174,17 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
<div className="create-room"> <div className="create-room">
<form className="create-room__form" onSubmit={handleSubmit}> <form className="create-room__form" onSubmit={handleSubmit}>
<SettingTile <SettingTile
title={t("CreateRoom.visibility_title")} title={t("Organisms.CreateRoom.visibility_title")}
options={( options={(
<Button onClick={handleJoinRule} iconSrc={ChevronBottomIC}> <Button onClick={handleJoinRule} iconSrc={ChevronBottomIC}>
{joinRuleShortText[joinRules.indexOf(joinRule)]} {joinRuleShortText[joinRules.indexOf(joinRule)]}
</Button> </Button>
)} )}
content={<Text variant="b3">{isSpace ? t("CreateRoom.select_who_can_join_space") : t("CreateRoom.select_who_can_join_room")}</Text>} content={<Text variant="b3">{isSpace ? t("Organisms.CreateRoom.select_who_can_join_space") : t("Organisms.CreateRoom.select_who_can_join_room")}</Text>}
/> />
{joinRule === 'public' && ( {joinRule === 'public' && (
<div> <div>
<Text className="create-room__address__label" variant="b2">{isSpace ? t("CreateRoom.space_address") : t("CreateRoom.room_address")}</Text> <Text className="create-room__address__label" variant="b2">{isSpace ? t("Organisms.CreateRoom.space_address") : t("Organisms.CreateRoom.room_address")}</Text>
<div className="create-room__address"> <div className="create-room__address">
<Text variant="b1">#</Text> <Text variant="b1">#</Text>
<Input <Input
@ -197,32 +197,32 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
/> />
<Text variant="b1">{`:${userHs}`}</Text> <Text variant="b1">{`:${userHs}`}</Text>
</div> </div>
{isValidAddress === false && <Text className="create-room__address__tip" variant="b3"><span style={{ color: 'var(--bg-danger)' }}>{ t("CreateRoom.room_address_already_in_use", {room_address: `#${addressValue}:${userHs}`})}</span></Text>} {isValidAddress === false && <Text className="create-room__address__tip" variant="b3"><span style={{ color: 'var(--bg-danger)' }}>{ t("Organisms.CreateRoom.room_address_already_in_use", {room_address: `#${addressValue}:${userHs}`})}</span></Text>}
</div> </div>
)} )}
{!isSpace && joinRule !== 'public' && ( {!isSpace && joinRule !== 'public' && (
<SettingTile <SettingTile
title={t("CreateRoom.e2e_title")} title={t("Organisms.CreateRoom.e2e_title")}
options={<Toggle isActive={isEncrypted} onToggle={setIsEncrypted} />} options={<Toggle isActive={isEncrypted} onToggle={setIsEncrypted} />}
content={<Text variant="b3"> {t("CreateRoom.e2e_message")}</Text>} content={<Text variant="b3"> {t("Organisms.CreateRoom.e2e_message")}</Text>}
/> />
)} )}
<SettingTile <SettingTile
title={t("CreateRoom.role_title")} title={t("Organisms.CreateRoom.role_title")}
options={( options={(
<SegmentControl <SegmentControl
selected={roleIndex} selected={roleIndex}
segments={[{ text: t("CreateRoom.role_admin")}, { text: t("CreateRoom.role_founder")}]} segments={[{ text: t("Organisms.CreateRoom.role_admin")}, { text: t("Organisms.CreateRoom.role_founder")}]}
onSelect={setRoleIndex} onSelect={setRoleIndex}
/> />
)} )}
content={( content={(
<Text variant="b3"> {t("CreateRoom.role_message")}</Text> <Text variant="b3"> {t("Organisms.CreateRoom.role_message")}</Text>
)} )}
/> />
<Input name="topic" minHeight={174} resizable label= {t("CreateRoom.topic_label")}/> <Input name="topic" minHeight={174} resizable label= {t("Organisms.CreateRoom.topic_label")}/>
<div className="create-room__name-wrapper"> <div className="create-room__name-wrapper">
<Input name="name" label={isSpace ? t("CreateRoom.space_name"): t("CreateRoom.room_name")} required /> <Input name="name" label={isSpace ? t("Organisms.CreateRoom.space_name"): t("Organisms.CreateRoom.room_name")} required />
<Button <Button
disabled={isValidAddress === false || isCreatingRoom} disabled={isValidAddress === false || isCreatingRoom}
iconSrc={isSpace ? SpacePlusIC : HashPlusIC} iconSrc={isSpace ? SpacePlusIC : HashPlusIC}
@ -235,7 +235,7 @@ function CreateRoomContent({ isSpace, parentId, onRequestClose }) {
{isCreatingRoom && ( {isCreatingRoom && (
<div className="create-room__loading"> <div className="create-room__loading">
<Spinner size="small" /> <Spinner size="small" />
<Text>{ isSpace ? t("CreateRoom.creating_space") : t("CreateRoom.creating_room")}</Text> <Text>{ isSpace ? t("Organisms.CreateRoom.creating_space") : t("Organisms.CreateRoom.creating_room")}</Text>
</div> </div>
)} )}
{typeof creatingError === 'string' && <Text className="create-room__error" variant="b3">{creatingError}</Text>} {typeof creatingError === 'string' && <Text className="create-room__error" variant="b3">{creatingError}</Text>}
@ -284,9 +284,9 @@ function CreateRoom() {
isOpen={create !== null} isOpen={create !== null}
title={( title={(
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{parentId ? twemojify(room.name) : t("CreateRoom.home")} {parentId ? twemojify(room.name) : t("Organisms.CreateRoom.home")}
<span style={{ color: 'var(--tc-surface-low)' }}> <span style={{ color: 'var(--tc-surface-low)' }}>
{`${isSpace ? t("CreateRoom.create_space") : t("CreateRoom.create_room")}`} {`${isSpace ? t("Organisms.CreateRoom.create_space") : t("Organisms.CreateRoom.create_room")}`}
</span> </span>
</Text> </Text>
)} )}

View file

@ -18,7 +18,7 @@ function DragDrop({ isOpen }) {
overlayClassName="drag-drop__overlay" overlayClassName="drag-drop__overlay"
isOpen={isOpen} isOpen={isOpen}
> >
<Text variant="h2" weight="medium">{t("DragDrop.drop_file_to_upload_prompt")}</Text> <Text variant="h2" weight="medium">{t("Organisms.DragDrop.drop_file_to_upload_prompt")}</Text>
</RawModal> </RawModal>
); );
} }

View file

@ -100,14 +100,14 @@ function EmojiVerificationContent({ data, requestClose }) {
const renderWait = () => ( const renderWait = () => (
<> <>
<Spinner size="small" /> <Spinner size="small" />
<Text>{t("EmojiVerification.waiting_for_response")}</Text> <Text>{t("Organisms.EmojiVerification.waiting_for_response")}</Text>
</> </>
); );
if (sas !== null) { if (sas !== null) {
return ( return (
<div className="emoji-verification__content"> <div className="emoji-verification__content">
<Text>{t("EmojiVerification.confirmation_prompt")}</Text> <Text>{t("Organisms.EmojiVerification.confirmation_prompt")}</Text>
<div className="emoji-verification__emojis"> <div className="emoji-verification__emojis">
{sas.sas.emoji.map((emoji, i) => ( {sas.sas.emoji.map((emoji, i) => (
// eslint-disable-next-line react/no-array-index-key // eslint-disable-next-line react/no-array-index-key
@ -120,8 +120,8 @@ function EmojiVerificationContent({ data, requestClose }) {
<div className="emoji-verification__buttons"> <div className="emoji-verification__buttons">
{process ? renderWait() : ( {process ? renderWait() : (
<> <>
<Button variant="primary" onClick={sasConfirm}>{t("EmojiVerification.emojis_match_button")}</Button> <Button variant="primary" onClick={sasConfirm}>{t("Organisms.EmojiVerification.emojis_match_button")}</Button>
<Button onClick={sasMismatch}>{t("EmojiVerification.emojis_dont_match_button")}</Button> <Button onClick={sasMismatch}>{t("Organisms.EmojiVerification.emojis_dont_match_button")}</Button>
</> </>
)} )}
</div> </div>
@ -132,7 +132,7 @@ function EmojiVerificationContent({ data, requestClose }) {
if (targetDevice) { if (targetDevice) {
return ( return (
<div className="emoji-verification__content"> <div className="emoji-verification__content">
<Text>{t("EmojiVerification.accept_request_from_other_device_message")}</Text> <Text>{t("Organisms.EmojiVerification.accept_request_from_other_device_message")}</Text>
<div className="emoji-verification__buttons"> <div className="emoji-verification__buttons">
{renderWait()} {renderWait()}
</div> </div>
@ -142,12 +142,12 @@ function EmojiVerificationContent({ data, requestClose }) {
return ( return (
<div className="emoji-verification__content"> <div className="emoji-verification__content">
<Text>{t("EmojiVerification.begin_verification_process_message")}</Text> <Text>{t("Organisms.EmojiVerification.begin_verification_process_message")}</Text>
<div className="emoji-verification__buttons"> <div className="emoji-verification__buttons">
{ {
process process
? renderWait() ? renderWait()
: <Button variant="primary" onClick={beginVerification}>{t("EmojiVerification.begin_verification_button_text")}</Button> : <Button variant="primary" onClick={beginVerification}>{t("Organisms.EmojiVerification.begin_verification_button_text")}</Button>
} }
</div> </div>
</div> </div>
@ -188,7 +188,7 @@ function EmojiVerification() {
className="emoji-verification" className="emoji-verification"
title={( title={(
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{t("EmojiVerification.title")} {t("Organisms.EmojiVerification.title")}
</Text> </Text>
)} )}
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}

View file

@ -81,8 +81,8 @@ function InviteList({ isOpen, onRequestClose }) {
? (<Spinner size="small" />) ? (<Spinner size="small" />)
: ( : (
<div className="invite-btn__container"> <div className="invite-btn__container">
<Button onClick={() => rejectInvite(myRoom.roomId)}>{t("InviteList.reject_invite")}</Button> <Button onClick={() => rejectInvite(myRoom.roomId)}>{t("Organisms.InviteList.reject_invite")}</Button>
<Button onClick={() => acceptInvite(myRoom.roomId)} variant="primary">{t("InviteList.accept_invite")}</Button> <Button onClick={() => acceptInvite(myRoom.roomId)} variant="primary">{t("Organisms.InviteList.accept_invite")}</Button>
</div> </div>
) )
} }
@ -93,14 +93,14 @@ function InviteList({ isOpen, onRequestClose }) {
return ( return (
<PopupWindow <PopupWindow
isOpen={isOpen} isOpen={isOpen}
title={t("InviteList.title")} title={t("Organisms.InviteList.title")}
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
onRequestClose={onRequestClose} onRequestClose={onRequestClose}
> >
<div className="invites-content"> <div className="invites-content">
{ initMatrix.roomList.inviteDirects.size !== 0 && ( { initMatrix.roomList.inviteDirects.size !== 0 && (
<div className="invites-content__subheading"> <div className="invites-content__subheading">
<Text variant="b3" weight="bold">{t("InviteList.direct_messages_title")}</Text> <Text variant="b3" weight="bold">{t("Organisms.InviteList.direct_messages_title")}</Text>
</div> </div>
)} )}
{ {
@ -118,8 +118,8 @@ function InviteList({ isOpen, onRequestClose }) {
? (<Spinner size="small" />) ? (<Spinner size="small" />)
: ( : (
<div className="invite-btn__container"> <div className="invite-btn__container">
<Button onClick={() => rejectInvite(myRoom.roomId, true)}>{t("InviteList.reject_invite")}</Button> <Button onClick={() => rejectInvite(myRoom.roomId, true)}>{t("Organisms.InviteList.reject_invite")}</Button>
<Button onClick={() => acceptInvite(myRoom.roomId, true)} variant="primary">{t("InviteList.accept_invite")}</Button> <Button onClick={() => acceptInvite(myRoom.roomId, true)} variant="primary">{t("Organisms.InviteList.accept_invite")}</Button>
</div> </div>
) )
} }
@ -129,14 +129,14 @@ function InviteList({ isOpen, onRequestClose }) {
} }
{ initMatrix.roomList.inviteSpaces.size !== 0 && ( { initMatrix.roomList.inviteSpaces.size !== 0 && (
<div className="invites-content__subheading"> <div className="invites-content__subheading">
<Text variant="b3" weight="bold">{t("InviteList.spaces_title")}</Text> <Text variant="b3" weight="bold">{t("Organisms.InviteList.spaces_title")}</Text>
</div> </div>
)} )}
{ Array.from(initMatrix.roomList.inviteSpaces).map(renderRoomTile) } { Array.from(initMatrix.roomList.inviteSpaces).map(renderRoomTile) }
{ initMatrix.roomList.inviteRooms.size !== 0 && ( { initMatrix.roomList.inviteRooms.size !== 0 && (
<div className="invites-content__subheading"> <div className="invites-content__subheading">
<Text variant="b3" weight="bold">{t("InviteList.rooms_title")}</Text> <Text variant="b3" weight="bold">{t("Organisms.InviteList.rooms_title")}</Text>
</div> </div>
)} )}
{ Array.from(initMatrix.roomList.inviteRooms).map(renderRoomTile) } { Array.from(initMatrix.roomList.inviteRooms).map(renderRoomTile) }

View file

@ -88,7 +88,7 @@ function InviteUser({
avatar_url: result.avatar_url, avatar_url: result.avatar_url,
}]); }]);
} catch (e) { } catch (e) {
updateSearchQuery({error: t("InviteUser.user_not_found", {user_name: inputUsername})}); updateSearchQuery({error: t("Organisms.InviteUser.user_not_found", {user_name: inputUsername})});
} }
} else { } else {
try { try {
@ -97,7 +97,7 @@ function InviteUser({
limit: 20, limit: 20,
}); });
if (result.results.length === 0) { if (result.results.length === 0) {
updateSearchQuery({ error: t("InviteUser.no_matches_found", {user_name: inputUsername})}); updateSearchQuery({ error: t("Organisms.InviteUser.no_matches_found", {user_name: inputUsername})});
updateIsSearching(false); updateIsSearching(false);
return; return;
} }
@ -179,7 +179,7 @@ function InviteUser({
return <Button onClick={() => { selectRoom(createdDM.get(userId)); onRequestClose(); }}>Open</Button>; return <Button onClick={() => { selectRoom(createdDM.get(userId)); onRequestClose(); }}>Open</Button>;
} }
if (invitedUserIds.has(userId)) { if (invitedUserIds.has(userId)) {
return messageJSX(t("InviteUser.invite_result.invited"), true); return messageJSX(t("Organisms.InviteUser.invite_result.invited"), true);
} }
if (typeof roomId === 'string') { if (typeof roomId === 'string') {
const member = mx.getRoom(roomId).getMember(userId); const member = mx.getRoom(roomId).getMember(userId);
@ -187,11 +187,11 @@ function InviteUser({
const userMembership = member.membership; const userMembership = member.membership;
switch (userMembership) { switch (userMembership) {
case 'join': case 'join':
return messageJSX(t("InviteUser.invite_result.already_joined"), true); return messageJSX(t("Organisms.InviteUser.invite_result.already_joined"), true);
case 'invite': case 'invite':
return messageJSX(t("InviteUser.invite_result.already_invited"), true); return messageJSX(t("Organisms.InviteUser.invite_result.already_invited"), true);
case 'ban': case 'ban':
return messageJSX(t("InviteUser.invite_result.banned"), false); return messageJSX(t("Organisms.InviteUser.invite_result.banned"), false);
default: default:
} }
} }
@ -245,13 +245,13 @@ function InviteUser({
return ( return (
<PopupWindow <PopupWindow
isOpen={isOpen} isOpen={isOpen}
title={(typeof roomId === 'string' ? t("InviteUser.invite_to_room", {room: mx.getRoom(roomId).name}) : t("InviteUser.invite_to_dm"))} title={(typeof roomId === 'string' ? t("Organisms.InviteUser.invite_to_room", {room: mx.getRoom(roomId).name}) : t("Organisms.InviteUser.invite_to_dm"))}
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
onRequestClose={onRequestClose} onRequestClose={onRequestClose}
> >
<div className="invite-user"> <div className="invite-user">
<form className="invite-user__form" onSubmit={(e) => { e.preventDefault(); searchUser(usernameRef.current.value); }}> <form className="invite-user__form" onSubmit={(e) => { e.preventDefault(); searchUser(usernameRef.current.value); }}>
<Input value={searchTerm} forwardRef={usernameRef} label={t("InviteUser.search_label")} /> <Input value={searchTerm} forwardRef={usernameRef} label={t("Organisms.InviteUser.search_label")} />
<Button disabled={isSearching} iconSrc={UserIC} variant="primary" type="submit">{t("common.search")}</Button> <Button disabled={isSearching} iconSrc={UserIC} variant="primary" type="submit">{t("common.search")}</Button>
</form> </form>
<div className="invite-user__search-status"> <div className="invite-user__search-status">
@ -259,13 +259,13 @@ function InviteUser({
typeof searchQuery.username !== 'undefined' && isSearching && ( typeof searchQuery.username !== 'undefined' && isSearching && (
<div className="flex--center"> <div className="flex--center">
<Spinner size="small" /> <Spinner size="small" />
<Text variant="b2">{t("InviteUser.searching_for_user", {user_name: searchQuery.username})}</Text> <Text variant="b2">{t("Organisms.InviteUser.searching_for_user", {user_name: searchQuery.username})}</Text>
</div> </div>
) )
} }
{ {
typeof searchQuery.username !== 'undefined' && !isSearching && ( typeof searchQuery.username !== 'undefined' && !isSearching && (
<Text variant="b2">{t("InviteUser.search_result_title", {user_name: searchQuery.username})}</Text> <Text variant="b2">{t("Organisms.InviteUser.search_result_title", {user_name: searchQuery.username})}</Text>
) )
} }
{ {

View file

@ -61,10 +61,10 @@ function JoinAliasContent({ term, requestClose }) {
const alias = e.target.alias.value; const alias = e.target.alias.value;
if (alias?.trim() === '') return; if (alias?.trim() === '') return;
if (alias.match(ALIAS_OR_ID_REG) === null) { if (alias.match(ALIAS_OR_ID_REG) === null) {
setError(t("JoinAlias.invalid_address")); setError(t("Organisms.JoinAlias.invalid_address"));
return; return;
} }
setProcess(t("JoinAlias.looking_for_address")); setProcess(t("Organisms.JoinAlias.looking_for_address"));
setError(undefined); setError(undefined);
let via; let via;
if (alias.startsWith('#')) { if (alias.startsWith('#')) {
@ -72,12 +72,12 @@ function JoinAliasContent({ term, requestClose }) {
const aliasData = await mx.resolveRoomAlias(alias); const aliasData = await mx.resolveRoomAlias(alias);
via = aliasData?.servers.slice(0, 3) || []; via = aliasData?.servers.slice(0, 3) || [];
if (mountStore.getItem()) { if (mountStore.getItem()) {
setProcess(t("JoinAlias.joining_alias", {alias_name: alias})); setProcess(t("Organisms.JoinAlias.joining_alias", {alias_name: alias}));
} }
} catch (err) { } catch (err) {
if (!mountStore.getItem()) return; if (!mountStore.getItem()) return;
setProcess(false); setProcess(false);
setError(t("JoinAlias.couldnt_find_room_or_space_alias", {alias_name: alias})); setError(t("Organisms.JoinAlias.couldnt_find_room_or_space_alias", {alias_name: alias}));
} }
} }
try { try {
@ -88,14 +88,14 @@ function JoinAliasContent({ term, requestClose }) {
} catch { } catch {
if (!mountStore.getItem()) return; if (!mountStore.getItem()) return;
setProcess(false); setProcess(false);
setError(t("JoinAlias.couldnt_find_room_or_space", {alias_name: alias})); setError(t("Organisms.JoinAlias.couldnt_find_room_or_space", {alias_name: alias}));
} }
}; };
return ( return (
<form className="join-alias" onSubmit={handleSubmit}> <form className="join-alias" onSubmit={handleSubmit}>
<Input <Input
label={t("JoinAlias.address_label")} label={t("Organisms.JoinAlias.address_label")}
value={term} value={term}
name="alias" name="alias"
required required
@ -149,7 +149,7 @@ function JoinAlias() {
<Dialog <Dialog
isOpen={data !== null} isOpen={data !== null}
title={( title={(
<Text variant="s1" weight="medium" primary>{t("JoinAlias.title")}</Text> <Text variant="s1" weight="medium" primary>{t("Organisms.JoinAlias.title")}</Text>
)} )}
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={"common.close"} />} contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={"common.close"} />}
onRequestClose={requestClose} onRequestClose={requestClose}

View file

@ -116,7 +116,7 @@ function DrawerBreadcrumb({ spaceId }) {
className={index === spacePath.length - 1 ? 'drawer-breadcrumb__btn--selected' : ''} className={index === spacePath.length - 1 ? 'drawer-breadcrumb__btn--selected' : ''}
onClick={() => selectSpace(id)} onClick={() => selectSpace(id)}
> >
<Text variant="b2">{id === cons.tabs.HOME ? t("DrawerBreadcrumb.home") : twemojify(mx.getRoom(id).name)}</Text> <Text variant="b2">{id === cons.tabs.HOME ? t("Organisms.DrawerBreadcrumb.home") : twemojify(mx.getRoom(id).name)}</Text>
{ noti !== null && ( { noti !== null && (
<NotificationBadge <NotificationBadge
alert={noti.highlight !== 0} alert={noti.highlight !== 0}

View file

@ -44,27 +44,27 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
return ( return (
<> <>
<MenuHeader>{t("DrawerHeader.add_rooms_or_spaces")}</MenuHeader> <MenuHeader>{t("Organisms.DrawerHeader.add_rooms_or_spaces")}</MenuHeader>
<MenuItem <MenuItem
iconSrc={SpacePlusIC} iconSrc={SpacePlusIC}
onClick={() => { afterOptionSelect(); openCreateRoom(true, spaceId); }} onClick={() => { afterOptionSelect(); openCreateRoom(true, spaceId); }}
disabled={!canManage} disabled={!canManage}
> >
{t("DrawerHeader.create_new_space")} {t("Organisms.DrawerHeader.create_new_space")}
</MenuItem> </MenuItem>
<MenuItem <MenuItem
iconSrc={HashPlusIC} iconSrc={HashPlusIC}
onClick={() => { afterOptionSelect(); openCreateRoom(false, spaceId); }} onClick={() => { afterOptionSelect(); openCreateRoom(false, spaceId); }}
disabled={!canManage} disabled={!canManage}
> >
{t("DrawerHeader.create_new_room")} {t("Organisms.DrawerHeader.create_new_room")}
</MenuItem> </MenuItem>
{ !spaceId && ( { !spaceId && (
<MenuItem <MenuItem
iconSrc={HashGlobeIC} iconSrc={HashGlobeIC}
onClick={() => { afterOptionSelect(); openPublicRooms(); }} onClick={() => { afterOptionSelect(); openPublicRooms(); }}
> >
{t("DrawerHeader.join_public_room")} {t("Organisms.DrawerHeader.join_public_room")}
</MenuItem> </MenuItem>
)} )}
{ !spaceId && ( { !spaceId && (
@ -72,7 +72,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
iconSrc={PlusIC} iconSrc={PlusIC}
onClick={() => { afterOptionSelect(); openJoinAlias(); }} onClick={() => { afterOptionSelect(); openJoinAlias(); }}
> >
{t("DrawerHeader.join_with_address")} {t("Organisms.DrawerHeader.join_with_address")}
</MenuItem> </MenuItem>
)} )}
{ spaceId && ( { spaceId && (
@ -81,7 +81,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
onClick={() => { afterOptionSelect(); openSpaceAddExisting(spaceId); }} onClick={() => { afterOptionSelect(); openSpaceAddExisting(spaceId); }}
disabled={!canManage} disabled={!canManage}
> >
{t("DrawerHeader.add_existing")} {t("Organisms.DrawerHeader.add_existing")}
</MenuItem> </MenuItem>
)} )}
{ spaceId && ( { spaceId && (
@ -89,7 +89,7 @@ export function HomeSpaceOptions({ spaceId, afterOptionSelect }) {
onClick={() => { afterOptionSelect(); openSpaceManage(spaceId); }} onClick={() => { afterOptionSelect(); openSpaceManage(spaceId); }}
iconSrc={HashSearchIC} iconSrc={HashSearchIC}
> >
{t("DrawerHeader.manage_rooms")} {t("Organisms.DrawerHeader.manage_rooms")}
</MenuItem> </MenuItem>
)} )}
</> </>
@ -105,7 +105,7 @@ HomeSpaceOptions.propTypes = {
function DrawerHeader({ selectedTab, spaceId }) { function DrawerHeader({ selectedTab, spaceId }) {
const mx = initMatrix.matrixClient; const mx = initMatrix.matrixClient;
const tabName = selectedTab !== cons.tabs.DIRECTS ? t("DrawerHeader.home") : t("DrawerHeader.direct_messages"); const tabName = selectedTab !== cons.tabs.DIRECTS ? t("Organisms.DrawerHeader.home") : t("Organisms.DrawerHeader.direct_messages");
const isDMTab = selectedTab === cons.tabs.DIRECTS; const isDMTab = selectedTab === cons.tabs.DIRECTS;
const room = mx.getRoom(spaceId); const room = mx.getRoom(spaceId);
@ -149,8 +149,8 @@ function DrawerHeader({ selectedTab, spaceId }) {
</TitleWrapper> </TitleWrapper>
)} )}
{ isDMTab && <IconButton onClick={() => openInviteUser()} tooltip={t("DrawerHeader.start_dm_tooltip")} src={PlusIC} size="small" /> } { isDMTab && <IconButton onClick={() => openInviteUser()} tooltip={t("Organisms.DrawerHeader.start_dm_tooltip")} src={PlusIC} size="small" /> }
{ !isDMTab && <IconButton onClick={openHomeSpaceOptions} tooltip={t("DrawerHeader.add_rooms_spaces_tooltip")} src={PlusIC} size="small" /> } { !isDMTab && <IconButton onClick={openHomeSpaceOptions} tooltip={t("Organisms.DrawerHeader.add_rooms_spaces_tooltip")} src={PlusIC} size="small" /> }
</Header> </Header>
); );
} }

View file

@ -85,7 +85,7 @@ function ProfileAvatarMenu() {
return ( return (
<SidebarAvatar <SidebarAvatar
onClick={openSettings} onClick={openSettings}
tooltip={t("SideBar.settings_tooltip")} tooltip={t("Organisms.SideBar.settings_tooltip")}
avatar={( avatar={(
<Avatar <Avatar
text={profile.displayName} text={profile.displayName}
@ -107,7 +107,7 @@ function CrossSigninAlert() {
return ( return (
<SidebarAvatar <SidebarAvatar
className="sidebar__cross-signin-alert" className="sidebar__cross-signin-alert"
tooltip={t("SideBar.unverified_sessions", {count: unverified.length})} tooltip={t("Organisms.SideBar.unverified_sessions", {count: unverified.length})}
onClick={() => openSettings(settingTabText.SECURITY)} onClick={() => openSettings(settingTabText.SECURITY)}
avatar={<Avatar iconSrc={ShieldUserIC} iconColor="var(--ic-danger-normal)" size="normal" />} avatar={<Avatar iconSrc={ShieldUserIC} iconColor="var(--ic-danger-normal)" size="normal" />}
/> />
@ -155,7 +155,7 @@ function FeaturedTab() {
return ( return (
<> <>
<SidebarAvatar <SidebarAvatar
tooltip={t("SideBar.home_tooltip")} tooltip={t("Organisms.SideBar.home_tooltip")}
active={selectedTab === cons.tabs.HOME} active={selectedTab === cons.tabs.HOME}
onClick={() => selectTab(cons.tabs.HOME)} onClick={() => selectTab(cons.tabs.HOME)}
avatar={<Avatar iconSrc={HomeIC} size="normal" />} avatar={<Avatar iconSrc={HomeIC} size="normal" />}
@ -167,7 +167,7 @@ function FeaturedTab() {
) : null} ) : null}
/> />
<SidebarAvatar <SidebarAvatar
tooltip={t("SideBar.direct_messages_tooltip")} tooltip={t("Organisms.SideBar.direct_messages_tooltip")}
active={selectedTab === cons.tabs.DIRECTS} active={selectedTab === cons.tabs.DIRECTS}
onClick={() => selectTab(cons.tabs.DIRECTS)} onClick={() => selectTab(cons.tabs.DIRECTS)}
avatar={<Avatar iconSrc={UserIC} size="normal" />} avatar={<Avatar iconSrc={UserIC} size="normal" />}
@ -363,7 +363,7 @@ function SideBar() {
<div className="space-container"> <div className="space-container">
<SpaceShortcut /> <SpaceShortcut />
<SidebarAvatar <SidebarAvatar
tooltip={t("SideBar.pin_spaces_tooltip")} tooltip={t("Organisms.SideBar.pin_spaces_tooltip")}
onClick={() => openShortcutSpaces()} onClick={() => openShortcutSpaces()}
avatar={<Avatar iconSrc={AddPinIC} size="normal" />} avatar={<Avatar iconSrc={AddPinIC} size="normal" />}
/> />
@ -375,13 +375,13 @@ function SideBar() {
<div className="sidebar-divider" /> <div className="sidebar-divider" />
<div className="sticky-container"> <div className="sticky-container">
<SidebarAvatar <SidebarAvatar
tooltip={t("SideBar.search_tooltip")} tooltip={t("Organisms.SideBar.search_tooltip")}
onClick={() => openSearch()} onClick={() => openSearch()}
avatar={<Avatar iconSrc={SearchIC} size="normal" />} avatar={<Avatar iconSrc={SearchIC} size="normal" />}
/> />
{ totalInvites !== 0 && ( { totalInvites !== 0 && (
<SidebarAvatar <SidebarAvatar
tooltip={t("SideBar.invites_tooltip")} tooltip={t("Organisms.SideBar.invites_tooltip")}
onClick={() => openInviteList()} onClick={() => openInviteList()}
avatar={<Avatar iconSrc={InviteIC} size="normal" />} avatar={<Avatar iconSrc={InviteIC} size="normal" />}
notificationBadge={<NotificationBadge alert content={totalInvites} />} notificationBadge={<NotificationBadge alert content={totalInvites} />}

View file

@ -49,8 +49,8 @@ function ProfileEditor({ userId }) {
const handleAvatarUpload = async (url) => { const handleAvatarUpload = async (url) => {
if (url === null) { if (url === null) {
const isConfirmed = await confirmDialog( const isConfirmed = await confirmDialog(
t("ProfileEditor.remove_avatar"), t("Organisms.ProfileEditor.remove_avatar"),
t("ProfileViewer.remove_avatar_confirmation"), t("Organisms.ProfileViewer.remove_avatar_confirmation"),
t("common.remove"), t("common.remove"),
'caution', 'caution',
); );
@ -90,7 +90,7 @@ function ProfileEditor({ userId }) {
onSubmit={(e) => { e.preventDefault(); saveDisplayName(); }} onSubmit={(e) => { e.preventDefault(); saveDisplayName(); }}
> >
<Input <Input
label={t("ProfileEditor.display_name_message", {user_name: mx.getUserId()})} label={t("Organisms.ProfileEditor.display_name_message", {user_name: mx.getUserId()})}
onChange={onDisplayNameInputChange} onChange={onDisplayNameInputChange}
value={mx.getUser(mx.getUserId()).displayName} value={mx.getUser(mx.getUserId()).displayName}
forwardRef={displayNameRef} forwardRef={displayNameRef}

View file

@ -77,14 +77,14 @@ function ModerationTools({
<div className="moderation-tools"> <div className="moderation-tools">
{canIKick && ( {canIKick && (
<form onSubmit={handleKick}> <form onSubmit={handleKick}>
<Input label={t("ProfileViewer.kick_reason_label")} name="kick-reason" /> <Input label={t("Organisms.ProfileViewer.kick_reason_label")} name="kick-reason" />
<Button type="submit">{t("ProfileViewer.kick_button")}</Button> <Button type="submit">{t("Organisms.ProfileViewer.kick_button")}</Button>
</form> </form>
)} )}
{canIBan && ( {canIBan && (
<form onSubmit={handleBan}> <form onSubmit={handleBan}>
<Input label={t("ProfileViewer.ban_reason_label")} name="ban-reason" /> <Input label={t("Organisms.ProfileViewer.ban_reason_label")} name="ban-reason" />
<Button type="submit">{t("ProfileViewer.ban_button")}</Button> <Button type="submit">{t("Organisms.ProfileViewer.ban_button")}</Button>
</form> </form>
)} )}
</div> </div>
@ -127,8 +127,8 @@ function SessionInfo({ userId }) {
if (!isVisible) return null; if (!isVisible) return null;
return ( return (
<div className="session-info__chips"> <div className="session-info__chips">
{devices === null && <Text variant="b2">{t("ProfileViewer.loading_sessions")}</Text>} {devices === null && <Text variant="b2">{t("Organisms.ProfileViewer.loading_sessions")}</Text>}
{devices?.length === 0 && <Text variant="b2">{t("ProfileViewer.no_sessions_found")}</Text>} {devices?.length === 0 && <Text variant="b2">{t("Organisms.ProfileViewer.no_sessions_found")}</Text>}
{devices !== null && (devices.map((device) => ( {devices !== null && (devices.map((device) => (
<Chip <Chip
key={device.deviceId} key={device.deviceId}
@ -146,7 +146,7 @@ function SessionInfo({ userId }) {
onClick={() => setIsVisible(!isVisible)} onClick={() => setIsVisible(!isVisible)}
iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC} iconSrc={isVisible ? ChevronBottomIC : ChevronRightIC}
> >
<Text variant="b2">{t("ProfileViewer.view_sessions", {count: devices?.length})}</Text> <Text variant="b2">{t("Organisms.ProfileViewer.view_sessions", {count: devices?.length})}</Text>
</MenuItem> </MenuItem>
{renderSessionChips()} {renderSessionChips()}
</div> </div>
@ -261,7 +261,7 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
onClick={openDM} onClick={openDM}
disabled={isCreatingDM} disabled={isCreatingDM}
> >
{isCreatingDM ? t("ProfileViewer.creating_dm_room") : t("ProfileViewer.send_direct_message_button")} {isCreatingDM ? t("Organisms.ProfileViewer.creating_dm_room") : t("Organisms.ProfileViewer.send_direct_message_button")}
</Button> </Button>
{ isBanned && canIKick && ( { isBanned && canIKick && (
<Button <Button
@ -290,8 +290,8 @@ function ProfileFooter({ roomId, userId, onRequestClose }) {
> >
{ {
isUserIgnored isUserIgnored
? `${isIgnoring ? t("ProfileViewer.unignoring") : t("ProfileViewer.unignore")}` ? `${isIgnoring ? t("Organisms.ProfileViewer.unignoring") : t("Organisms.ProfileViewer.unignore")}`
: `${isIgnoring ? t("ProfileViewer.ignoring") : t("ProfileViewer.ignore")}` : `${isIgnoring ? t("Organisms.ProfileViewer.ignoring") : t("Organisms.ProfileViewer.ignore")}`
} }
</Button> </Button>
</div> </div>
@ -374,14 +374,14 @@ function ProfileViewer() {
const handleChangePowerLevel = async (newPowerLevel) => { const handleChangePowerLevel = async (newPowerLevel) => {
if (newPowerLevel === powerLevel) return; if (newPowerLevel === powerLevel) return;
const SHARED_POWER_MSG = t("ProfileViewer.shared_power_message"); const SHARED_POWER_MSG = t("Organisms.ProfileViewer.shared_power_message");
const DEMOTING_MYSELF_MSG = t("ProfileViewer.demoting_self_message"); const DEMOTING_MYSELF_MSG = t("Organisms.ProfileViewer.demoting_self_message");
const isSharedPower = newPowerLevel === myPowerLevel; const isSharedPower = newPowerLevel === myPowerLevel;
const isDemotingMyself = userId === mx.getUserId(); const isDemotingMyself = userId === mx.getUserId();
if (isSharedPower || isDemotingMyself) { if (isSharedPower || isDemotingMyself) {
const isConfirmed = await confirmDialog( const isConfirmed = await confirmDialog(
t("ProfileViewer.change_power_level"), t("Organisms.ProfileViewer.change_power_level"),
isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG, isSharedPower ? SHARED_POWER_MSG : DEMOTING_MYSELF_MSG,
t("common.change"), t("common.change"),
'caution', 'caution',

View file

@ -59,7 +59,7 @@ function TryJoinWithAlias({ alias, onRequestClose }) {
} catch (e) { } catch (e) {
setStatus({ setStatus({
isJoining: false, isJoining: false,
error: t("PublicRooms.could_not_join_alias", {alias: alias}), error: t("Organisms.PublicRooms.could_not_join_alias", {alias: alias}),
roomId: null, roomId: null,
tempRoomId: null, tempRoomId: null,
}); });
@ -69,12 +69,12 @@ function TryJoinWithAlias({ alias, onRequestClose }) {
return ( return (
<div className="try-join-with-alias"> <div className="try-join-with-alias">
{status.roomId === null && !status.isJoining && status.error === null && ( {status.roomId === null && !status.isJoining && status.error === null && (
<Button onClick={() => joinWithAlias()}>{t("PublicRooms.try_joining_alias", {alias: alias})}</Button> <Button onClick={() => joinWithAlias()}>{t("Organisms.PublicRooms.try_joining_alias", {alias: alias})}</Button>
)} )}
{status.isJoining && ( {status.isJoining && (
<> <>
<Spinner size="small" /> <Spinner size="small" />
<Text>{t("PublicRooms.joining_alias", {alias: alias})}</Text> <Text>{t("Organisms.PublicRooms.joining_alias", {alias: alias})}</Text>
</> </>
)} )}
{status.roomId !== null && ( {status.roomId !== null && (
@ -147,8 +147,8 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
if (totalRooms.length === 0) { if (totalRooms.length === 0) {
updateSearchQuery({ updateSearchQuery({
error: inputRoomName === '' error: inputRoomName === ''
? t("PublicRooms.no_public_rooms", {homeserver: inputHs}) ? t("Organisms.PublicRooms.no_public_rooms", {homeserver: inputHs})
: t("PublicRooms.no_result_found", {homeserver: inputHs, input: inputRoomName}), : t("Organisms.PublicRooms.no_result_found", {homeserver: inputHs, input: inputRoomName}),
alias: isInputAlias ? inputRoomName : null, alias: isInputAlias ? inputRoomName : null,
}); });
} }
@ -225,17 +225,17 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
return ( return (
<PopupWindow <PopupWindow
isOpen={isOpen} isOpen={isOpen}
title={t("PublicRooms.title")} title={t("Organisms.PublicRooms.title")}
contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={onRequestClose} tooltip={t("common.close")} />}
onRequestClose={onRequestClose} onRequestClose={onRequestClose}
> >
<div className="public-rooms"> <div className="public-rooms">
<form className="public-rooms__form" onSubmit={(e) => { e.preventDefault(); searchRooms(); }}> <form className="public-rooms__form" onSubmit={(e) => { e.preventDefault(); searchRooms(); }}>
<div className="public-rooms__input-wrapper"> <div className="public-rooms__input-wrapper">
<Input value={searchTerm} forwardRef={roomNameRef} label={t("PublicRooms.search_room_name_alias")} /> <Input value={searchTerm} forwardRef={roomNameRef} label={t("Organisms.PublicRooms.search_room_name_alias")} />
<Input forwardRef={hsRef} value={userId.slice(userId.indexOf(':') + 1)} label={t("common.homeserver")} required /> <Input forwardRef={hsRef} value={userId.slice(userId.indexOf(':') + 1)} label={t("common.homeserver")} required />
</div> </div>
<Button disabled={isSearching} iconSrc={HashSearchIC} variant="primary" type="submit">{t("PublicRooms.search_button")}</Button> <Button disabled={isSearching} iconSrc={HashSearchIC} variant="primary" type="submit">{t("Organisms.PublicRooms.search_button")}</Button>
</form> </form>
<div className="public-rooms__search-status"> <div className="public-rooms__search-status">
{ {
@ -244,13 +244,13 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
? ( ? (
<div className="flex--center"> <div className="flex--center">
<Spinner size="small" /> <Spinner size="small" />
<Text variant="b2">{t("PublicRooms.loading", {homeserver: searchQuery.homeserver})}</Text> <Text variant="b2">{t("Organisms.PublicRooms.loading", {homeserver: searchQuery.homeserver})}</Text>
</div> </div>
) )
: ( : (
<div className="flex--center"> <div className="flex--center">
<Spinner size="small" /> <Spinner size="small" />
<Text variant="b2">{t("PublicRooms.searching", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text> <Text variant="b2">{t("Organisms.PublicRooms.searching", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
</div> </div>
) )
) )
@ -258,8 +258,8 @@ function PublicRooms({ isOpen, searchTerm, onRequestClose }) {
{ {
typeof searchQuery.name !== 'undefined' && !isSearching && ( typeof searchQuery.name !== 'undefined' && !isSearching && (
searchQuery.name === '' searchQuery.name === ''
? <Text variant="b2">{t("PublicRooms.result_title", {homeserver: searchQuery.homeserver})}</Text> ? <Text variant="b2">{t("Organisms.PublicRooms.result_title", {homeserver: searchQuery.homeserver})}</Text>
: <Text variant="b2">{t("PublicRooms.search_result_title", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text> : <Text variant="b2">{t("Organisms.PublicRooms.search_result_title", {homeserver: searchQuery.homeserver, query: searchQuery.name})}</Text>
) )
} }
{ searchQuery.error && ( { searchQuery.error && (

View file

@ -94,9 +94,9 @@ function GeneralSettings({ roomId }) {
variant="danger" variant="danger"
onClick={async () => { onClick={async () => {
const isConfirmed = await confirmDialog( const isConfirmed = await confirmDialog(
t("RoomSettings.leave_room"), t("Organisms.RoomSettings.leave_room"),
t("RoomSettings.leave_room_confirm_message", {room_name: room.name}), t("Organisms.RoomSettings.leave_room_confirm_message", {room_name: room.name}),
t("RoomSettings.leave_room_confirm_button"), t("Organisms.RoomSettings.leave_room_confirm_button"),
'danger', 'danger',
); );
if (!isConfirmed) return; if (!isConfirmed) return;
@ -108,15 +108,15 @@ function GeneralSettings({ roomId }) {
</MenuItem> </MenuItem>
</div> </div>
<div className="room-settings__card"> <div className="room-settings__card">
<MenuHeader>{t("RoomSettings.notification_header")}</MenuHeader> <MenuHeader>{t("Organisms.RoomSettings.notification_header")}</MenuHeader>
<RoomNotification roomId={roomId} /> <RoomNotification roomId={roomId} />
</div> </div>
<div className="room-settings__card"> <div className="room-settings__card">
<MenuHeader>{t("RoomSettings.visibility_header")}</MenuHeader> <MenuHeader>{t("Organisms.RoomSettings.visibility_header")}</MenuHeader>
<RoomVisibility roomId={roomId} /> <RoomVisibility roomId={roomId} />
</div> </div>
<div className="room-settings__card"> <div className="room-settings__card">
<MenuHeader>{t("RoomSettings.address_header")}</MenuHeader> <MenuHeader>{t("Organisms.RoomSettings.address_header")}</MenuHeader>
<RoomAliases roomId={roomId} /> <RoomAliases roomId={roomId} />
</div> </div>
</> </>
@ -131,11 +131,11 @@ function SecuritySettings({ roomId }) {
return ( return (
<> <>
<div className="room-settings__card"> <div className="room-settings__card">
<MenuHeader>{t("RoomSettings.encryption_header")}</MenuHeader> <MenuHeader>{t("Organisms.RoomSettings.encryption_header")}</MenuHeader>
<RoomEncryption roomId={roomId} /> <RoomEncryption roomId={roomId} />
</div> </div>
<div className="room-settings__card"> <div className="room-settings__card">
<MenuHeader>{t("RoomSettings.message_history_header")}</MenuHeader> <MenuHeader>{t("Organisms.RoomSettings.message_history_header")}</MenuHeader>
<RoomHistoryVisibility roomId={roomId} /> <RoomHistoryVisibility roomId={roomId} />
</div> </div>
</> </>
@ -187,7 +187,7 @@ function RoomSettings({ roomId }) {
<TitleWrapper> <TitleWrapper>
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{`${room.name}`} {`${room.name}`}
<span style={{ color: 'var(--tc-surface-low)' }}> {t("RoomSettings.room_settings_subtitle")}</span> <span style={{ color: 'var(--tc-surface-low)' }}> {t("Organisms.RoomSettings.room_settings_subtitle")}</span>
</Text> </Text>
</TitleWrapper> </TitleWrapper>
<RawIcon size="small" src={ChevronTopIC} /> <RawIcon size="small" src={ChevronTopIC} />

View file

@ -68,14 +68,14 @@ function RoomIntroContainer({ event, timeline }) {
let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop'); let avatarSrc = room.getAvatarUrl(mx.baseUrl, 80, 80, 'crop');
avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc; avatarSrc = isDM ? room.getAvatarFallbackMember()?.getAvatarUrl(mx.baseUrl, 80, 80, 'crop') : avatarSrc;
const heading = isDM ? room.name : t("RoomViewContent.welcome_to_room", {room_name: room.name}); const heading = isDM ? room.name : t("Organisms.RoomViewContent.welcome_to_room", {room_name: room.name});
const topic = twemojify(roomTopic || '', undefined, true); const topic = twemojify(roomTopic || '', undefined, true);
const nameJsx = twemojify(room.name); const nameJsx = twemojify(room.name);
const desc = isDM const desc = isDM
? ( ? (
<> <>
<Trans <Trans
i18nKey={"RoomViewContent.beginning_dm"} i18nKey={"Organisms.RoomViewContent.beginning_dm"}
values={{user_name: nameJsx}} values={{user_name: nameJsx}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -86,7 +86,7 @@ function RoomIntroContainer({ event, timeline }) {
: ( : (
<> <>
<Trans <Trans
i18nKey={"RoomViewContent.beginning_room"} i18nKey={"Organisms.RoomViewContent.beginning_room"}
values={{room_name: nameJsx}} values={{room_name: nameJsx}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -112,7 +112,7 @@ function RoomIntroContainer({ event, timeline }) {
name={room.name} name={room.name}
heading={twemojify(heading)} heading={twemojify(heading)}
desc={desc} desc={desc}
time={event ? t("RoomViewContent.created_on", {date: event.getDate(), formatParams: { date: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'}}}) : null} time={event ? t("Organisms.RoomViewContent.created_on", {date: event.getDate(), formatParams: { date: { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'}}}) : null}
/> />
); );
} }
@ -539,7 +539,7 @@ function RoomViewContent({ eventId, roomTimeline }) {
&& readUptoEvent.getTs() < mEvent.getTs()); && readUptoEvent.getTs() < mEvent.getTs());
if (unreadDivider) { if (unreadDivider) {
isNewEvent = true; isNewEvent = true;
tl.push(<Divider key={`new-${mEvent.getId()}`} variant="positive" text={t("RoomViewContent.new_messages")} />); tl.push(<Divider key={`new-${mEvent.getId()}`} variant="positive" text={t("Organisms.RoomViewContent.new_messages")} />);
itemCountIndex += 1; itemCountIndex += 1;
if (jumpToItemIndex === -1) jumpToItemIndex = itemCountIndex; if (jumpToItemIndex === -1) jumpToItemIndex = itemCountIndex;
} }

View file

@ -124,17 +124,17 @@ function RoomViewFloating({
<> <>
<div className={`room-view__unread ${isJumpToEvent ? 'room-view__unread--open' : ''}`}> <div className={`room-view__unread ${isJumpToEvent ? 'room-view__unread--open' : ''}`}>
<Button iconSrc={MessageUnreadIC} onClick={jumpToEvent} variant="primary"> <Button iconSrc={MessageUnreadIC} onClick={jumpToEvent} variant="primary">
<Text variant="b3" weight="medium">{t("RoomViewFloating.jump_unread")}</Text> <Text variant="b3" weight="medium">{t("Organisms.RoomViewFloating.jump_unread")}</Text>
</Button> </Button>
<Button iconSrc={TickMarkIC} onClick={cancelJumpToEvent} variant="primary"> <Button iconSrc={TickMarkIC} onClick={cancelJumpToEvent} variant="primary">
<Text variant="b3" weight="bold">{t("RoomViewFloating.mark_read")}</Text> <Text variant="b3" weight="bold">{t("Organisms.RoomViewFloating.mark_read")}</Text>
</Button> </Button>
</div> </div>
<div className={`room-view__typing${typingMembers.size > 0 ? ' room-view__typing--open' : ''}`}> <div className={`room-view__typing${typingMembers.size > 0 ? ' room-view__typing--open' : ''}`}>
<div className="bouncing-loader"><div /></div> <div className="bouncing-loader"><div /></div>
<Text variant="b2"> <Text variant="b2">
<Trans <Trans
i18nKey="RoomViewFloating.user_typing" i18nKey="Organisms.RoomViewFloating.user_typing"
values={{count: typingMembers.size, user_one: getUserDisplayName(typingMemberValues?.[0]), user_two: getUserDisplayName(typingMemberValues?.[1]), user_three: getUserDisplayName(typingMemberValues?.[2]), user_four: getUserDisplayName(typingMemberValues?.[3])}} values={{count: typingMembers.size, user_one: getUserDisplayName(typingMemberValues?.[0]), user_two: getUserDisplayName(typingMemberValues?.[1]), user_three: getUserDisplayName(typingMemberValues?.[2]), user_four: getUserDisplayName(typingMemberValues?.[3])}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -142,7 +142,7 @@ function RoomViewFloating({
</div> </div>
<div className={`room-view__STB${isAtBottom ? '' : ' room-view__STB--open'}`}> <div className={`room-view__STB${isAtBottom ? '' : ' room-view__STB--open'}`}>
<Button iconSrc={MessageIC} onClick={handleScrollToBottom}> <Button iconSrc={MessageIC} onClick={handleScrollToBottom}>
<Text variant="b3" weight="medium">{t("RoomViewFloating.jump_latest")}</Text> <Text variant="b3" weight="medium">{t("Organisms.RoomViewFloating.jump_latest")}</Text>
</Button> </Button>
</div> </div>
</> </>

View file

@ -98,9 +98,9 @@ function RoomViewHeader({ roomId }) {
</TitleWrapper> </TitleWrapper>
<RawIcon src={ChevronBottomIC} /> <RawIcon src={ChevronBottomIC} />
</button> </button>
<IconButton onClick={() => toggleRoomSettings(tabText.SEARCH)} tooltip={t("RoomViewHeader.search_tooltip")} src={SearchIC} /> <IconButton onClick={() => toggleRoomSettings(tabText.SEARCH)} tooltip={t("Organisms.RoomViewHeader.search_tooltip")} src={SearchIC} />
<IconButton className="room-header__drawer-btn" onClick={togglePeopleDrawer} tooltip={t("RoomViewHeader.people_tooltip")} src={UserIC} /> <IconButton className="room-header__drawer-btn" onClick={togglePeopleDrawer} tooltip={t("Organisms.RoomViewHeader.people_tooltip")} src={UserIC} />
<IconButton className="room-header__members-btn" onClick={() => toggleRoomSettings(tabText.MEMBERS)} tooltip={t("RoomViewHeader.members_tooltip")} src={UserIC} /> <IconButton className="room-header__members-btn" onClick={() => toggleRoomSettings(tabText.MEMBERS)} tooltip={t("Organisms.RoomViewHeader.members_tooltip")} src={UserIC} />
<IconButton <IconButton
onClick={openRoomOptions} onClick={openRoomOptions}
tooltip={t("common.options")} tooltip={t("common.options")}

View file

@ -86,7 +86,7 @@ function RoomViewInput({
function uploadingProgress(myRoomId, { loaded, total }) { function uploadingProgress(myRoomId, { loaded, total }) {
if (myRoomId !== roomId) return; if (myRoomId !== roomId) return;
const progressPer = Math.round((loaded * 100) / total); const progressPer = Math.round((loaded * 100) / total);
uploadProgressRef.current.textContent = t("RoomViewInput.upload_progress", {progress: bytesToSize(loaded), total:bytesToSize(total), percent: progressPer}); uploadProgressRef.current.textContent = t("Organisms.RoomViewInput.upload_progress", {progress: bytesToSize(loaded), total:bytesToSize(total), percent: progressPer});
inputBaseRef.current.style.backgroundImage = `linear-gradient(90deg, var(--bg-surface-hover) ${progressPer}%, var(--bg-surface-low) ${progressPer}%)`; inputBaseRef.current.style.backgroundImage = `linear-gradient(90deg, var(--bg-surface-hover) ${progressPer}%, var(--bg-surface-low) ${progressPer}%)`;
} }
function clearAttachment(myRoomId) { function clearAttachment(myRoomId) {
@ -316,8 +316,8 @@ function RoomViewInput({
<Text className="room-input__alert"> <Text className="room-input__alert">
{ {
tombstoneEvent tombstoneEvent
? tombstoneEvent.getContent()?.body ?? t("RoomViewInput.tombstone_replaced") ? tombstoneEvent.getContent()?.body ?? t("Organisms.RoomViewInput.tombstone_replaced")
: t("RoomViewInput.tombstone_permission_denied") : t("Organisms.RoomViewInput.tombstone_permission_denied")
} }
</Text> </Text>
); );
@ -338,7 +338,7 @@ function RoomViewInput({
onChange={handleMsgTyping} onChange={handleMsgTyping}
onPaste={handlePaste} onPaste={handlePaste}
onKeyDown={handleKeyDown} onKeyDown={handleKeyDown}
placeholder={t("RoomViewInput.send_message_placeholder")} placeholder={t("Organisms.RoomViewInput.send_message_placeholder")}
/> />
</Text> </Text>
</ScrollView> </ScrollView>
@ -352,7 +352,7 @@ function RoomViewInput({
cords.y -= 250; cords.y -= 250;
openEmojiBoard(cords, addEmoji); openEmojiBoard(cords, addEmoji);
}} }}
tooltip={t("RoomViewInput.emoji_tooltip")} tooltip={t("Organisms.RoomViewInput.emoji_tooltip")}
src={EmojiIC} src={EmojiIC}
/> />
<IconButton onClick={sendMessage} tooltip={t("common.send")} src={SendIC} /> <IconButton onClick={sendMessage} tooltip={t("common.send")} src={SendIC} />
@ -373,7 +373,7 @@ function RoomViewInput({
</div> </div>
<div className="room-attachment__info"> <div className="room-attachment__info">
<Text variant="b1">{attachment.name}</Text> <Text variant="b1">{attachment.name}</Text>
<Text variant="b3"><span ref={uploadProgressRef}>{t("RoomViewInput.file_size", {size: bytesToSize(attachment.size)})}</span></Text> <Text variant="b3"><span ref={uploadProgressRef}>{t("Organisms.RoomViewInput.file_size", {size: bytesToSize(attachment.size)})}</span></Text>
</div> </div>
</div> </div>
); );
@ -388,7 +388,7 @@ function RoomViewInput({
setReplyTo(null); setReplyTo(null);
}} }}
src={CrossIC} src={CrossIC}
tooltip={t("RoomViewInput.cancel_reply_tooltip")} tooltip={t("Organisms.RoomViewInput.cancel_reply_tooltip")}
size="extra-small" size="extra-small"
/> />
<MessageReply <MessageReply

View file

@ -17,7 +17,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_joined"} i18nKey={"Organisms.RoomCommon.user_joined"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -29,7 +29,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_left"} i18nKey={"Organisms.RoomCommon.user_left"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -40,7 +40,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_invited"} i18nKey={"Organisms.RoomCommon.user_invited"}
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}} values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -51,7 +51,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.invite_cancelled"} i18nKey={"Organisms.RoomCommon.invite_cancelled"}
values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}} values={{user_name: twemojify(user), inviter_name: twemojify(inviter)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -62,7 +62,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.invite_rejected"} i18nKey={"Organisms.RoomCommon.invite_rejected"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -74,7 +74,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_kicked"} i18nKey={"Organisms.RoomCommon.user_kicked"}
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}} values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -86,7 +86,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_banned"} i18nKey={"Organisms.RoomCommon.user_banned"}
values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}} values={{user_name: twemojify(user), actor: twemojify(actor), reason: twemojify(reasonMsg)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -97,7 +97,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.user_unbanned"} i18nKey={"Organisms.RoomCommon.user_unbanned"}
values={{user_name: twemojify(user), actor: twemojify(actor)}} values={{user_name: twemojify(user), actor: twemojify(actor)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -108,7 +108,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.avatar_set"} i18nKey={"Organisms.RoomCommon.avatar_set"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -119,7 +119,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.avatar_changed"} i18nKey={"Organisms.RoomCommon.avatar_changed"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -130,7 +130,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.avatar_removed"} i18nKey={"Organisms.RoomCommon.avatar_removed"}
values={{user_name: twemojify(user)}} values={{user_name: twemojify(user)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -141,7 +141,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.name_set"} i18nKey={"Organisms.RoomCommon.name_set"}
values={{user_name: twemojify(user), new_name: twemojify(newName)}} values={{user_name: twemojify(user), new_name: twemojify(newName)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -152,7 +152,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.name_changed"} i18nKey={"Organisms.RoomCommon.name_changed"}
values={{user_name: twemojify(user), new_name: twemojify(newName)}} values={{user_name: twemojify(user), new_name: twemojify(newName)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />
@ -163,7 +163,7 @@ function getTimelineJSXMessages() {
return ( return (
<> <>
<Trans <Trans
i18nKey={"RoomCommon.name_removed"} i18nKey={"Organisms.RoomCommon.name_removed"}
values={{user_name: twemojify(user), new_name: twemojify(newName)}} values={{user_name: twemojify(user), new_name: twemojify(newName)}}
components={{bold: <b/>}} components={{bold: <b/>}}
/> />

View file

@ -229,7 +229,7 @@ function Search() {
</ScrollView> </ScrollView>
</div> </div>
<div className="search-dialog__footer"> <div className="search-dialog__footer">
<Text variant="b3">{t("Search.description")}</Text> <Text variant="b3">{t("Organisms.Search.description")}</Text>
</div> </div>
</div> </div>
</RawModal> </RawModal>

View file

@ -45,10 +45,10 @@ function AuthRequest({ onComplete, makeRequest }) {
lastUsedPassword = undefined; lastUsedPassword = undefined;
if (!mountStore.getItem()) return; if (!mountStore.getItem()) return;
if (err.errcode === 'M_FORBIDDEN') { if (err.errcode === 'M_FORBIDDEN') {
setStatus({ error: t("AuthRequest.wrong_password") }); setStatus({ error: t("Organisms.AuthRequest.wrong_password") });
return; return;
} }
setStatus({ error: t("AuthRequest.request_failed") }); setStatus({ error: t("Organisms.AuthRequest.request_failed") });
} }
}; };
@ -61,7 +61,7 @@ function AuthRequest({ onComplete, makeRequest }) {
<form onSubmit={handleForm}> <form onSubmit={handleForm}>
<Input <Input
name="password" name="password"
label={t("AuthRequest.password_label")} label={t("Organisms.AuthRequest.password_label")}
type="password" type="password"
onChange={handleChange} onChange={handleChange}
required required

View file

@ -35,13 +35,13 @@ function CrossSigningSetup() {
const renderFailure = (requestClose) => ( const renderFailure = (requestClose) => (
<div className="cross-signing__failure"> <div className="cross-signing__failure">
<Text variant="h1">{twemojify('❌')}</Text> <Text variant="h1">{twemojify('❌')}</Text>
<Text weight="medium">{t("CrossSigning.setup_failed")}</Text> <Text weight="medium">{t("Organisms.CrossSigning.setup_failed")}</Text>
<Button onClick={requestClose}>{t("common.close")}</Button> <Button onClick={requestClose}>{t("common.close")}</Button>
</div> </div>
); );
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t("CrossSigning.setup")}</Text>, <Text variant="s1" weight="medium">{t("Organisms.CrossSigning.setup")}</Text>,
renderFailure, renderFailure,
); );
}; };
@ -59,7 +59,7 @@ function CrossSigningSetup() {
const renderSecurityKey = () => ( const renderSecurityKey = () => (
<div className="cross-signing__key"> <div className="cross-signing__key">
<Text weight="medium">{t("CrossSigning.save_security_key_message")}</Text> <Text weight="medium">{t("Organisms.CrossSigning.save_security_key_message")}</Text>
<Text className="cross-signing__key-text"> <Text className="cross-signing__key-text">
{key.encodedPrivateKey} {key.encodedPrivateKey}
</Text> </Text>
@ -74,7 +74,7 @@ function CrossSigningSetup() {
downloadKey(); downloadKey();
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t("CrossSigning.security_key_dialog_title")}</Text>, <Text variant="s1" weight="medium">{t("Organisms.CrossSigning.security_key_dialog_title")}</Text>,
() => renderSecurityKey(), () => renderSecurityKey(),
); );
}; };
@ -130,9 +130,9 @@ function CrossSigningSetup() {
<div className="cross-signing__setup"> <div className="cross-signing__setup">
<div className="cross-signing__setup-entry"> <div className="cross-signing__setup-entry">
<Text> <Text>
{t("CrossSigning.security_key_generation_message")} {t("Organisms.CrossSigning.security_key_generation_message")}
</Text> </Text>
{genWithPhrase !== false && <Button variant="primary" onClick={() => setup()} disabled={genWithPhrase !== undefined}>{t("CrossSigning.security_key_generation_button")}</Button>} {genWithPhrase !== false && <Button variant="primary" onClick={() => setup()} disabled={genWithPhrase !== undefined}>{t("Organisms.CrossSigning.security_key_generation_button")}</Button>}
{genWithPhrase === false && <Spinner size="small" />} {genWithPhrase === false && <Spinner size="small" />}
</div> </div>
<Text className="cross-signing__setup-divider">{t("common.or")}</Text> <Text className="cross-signing__setup-divider">{t("common.or")}</Text>
@ -150,13 +150,13 @@ function CrossSigningSetup() {
disabled={genWithPhrase !== undefined} disabled={genWithPhrase !== undefined}
> >
<Text> <Text>
{t("CrossSigning.security_phrase_message")} {t("Organisms.CrossSigning.security_phrase_message")}
</Text> </Text>
<Input <Input
name="phrase" name="phrase"
value={values.phrase} value={values.phrase}
onChange={handleChange} onChange={handleChange}
label={t("CrossSigning.security_phrase_label")} label={t("Organisms.CrossSigning.security_phrase_label")}
type="password" type="password"
required required
disabled={genWithPhrase !== undefined} disabled={genWithPhrase !== undefined}
@ -166,13 +166,13 @@ function CrossSigningSetup() {
name="confirmPhrase" name="confirmPhrase"
value={values.confirmPhrase} value={values.confirmPhrase}
onChange={handleChange} onChange={handleChange}
label={t("CrossSigning.security_phrase_confirm_label")} label={t("Organisms.CrossSigning.security_phrase_confirm_label")}
type="password" type="password"
required required
disabled={genWithPhrase !== undefined} disabled={genWithPhrase !== undefined}
/> />
{errors.confirmPhrase && <Text variant="b3" className="cross-signing__error">{errors.confirmPhrase}</Text>} {errors.confirmPhrase && <Text variant="b3" className="cross-signing__error">{errors.confirmPhrase}</Text>}
{genWithPhrase !== true && <Button variant="primary" type="submit" disabled={genWithPhrase !== undefined}>{t("CrossSigning.security_phrase_set_button")}</Button>} {genWithPhrase !== true && <Button variant="primary" type="submit" disabled={genWithPhrase !== undefined}>{t("Organisms.CrossSigning.security_phrase_set_button")}</Button>}
{genWithPhrase === true && <Spinner size="small" />} {genWithPhrase === true && <Spinner size="small" />}
</form> </form>
)} )}
@ -193,9 +193,9 @@ function CrossSigningReset() {
return ( return (
<div className="cross-signing__reset"> <div className="cross-signing__reset">
<Text variant="h1">{twemojify('✋🧑‍🚒🤚')}</Text> <Text variant="h1">{twemojify('✋🧑‍🚒🤚')}</Text>
<Text weight="medium">{t("CrossSigning.reset_keys_subtitle")}</Text> <Text weight="medium">{t("Organisms.CrossSigning.reset_keys_subtitle")}</Text>
<Text> <Text>
{t("CrossSigning.reset_keys_message")} {t("Organisms.CrossSigning.reset_keys_message")}
</Text> </Text>
<Button variant="danger" onClick={setupDialog}>{t("common.reset")}</Button> <Button variant="danger" onClick={setupDialog}>{t("common.reset")}</Button>
</div> </div>
@ -215,8 +215,8 @@ function CrossSignin() {
const isCSEnabled = useCrossSigningStatus(); const isCSEnabled = useCrossSigningStatus();
return ( return (
<SettingTile <SettingTile
title={t("CrossSigning.title")} title={t("Organisms.CrossSigning.title")}
content={<Text variant="b3">{t("CrossSigning.setup_message")}</Text>} content={<Text variant="b3">{t("Organisms.CrossSigning.setup_message")}</Text>}
options={( options={(
isCSEnabled isCSEnabled
? <Button variant="danger" onClick={resetDialog}>{t("common.reset")}</Button> ? <Button variant="danger" onClick={resetDialog}>{t("common.reset")}</Button>

View file

@ -45,7 +45,7 @@ const promptDeviceName = async (deviceName) => new Promise((resolve) => {
}; };
return ( return (
<form className="device-manage__rename" onSubmit={handleSubmit}> <form className="device-manage__rename" onSubmit={handleSubmit}>
<Input value={deviceName} label={t("DeviceManage.edit_session_name_subtitle")} name="session" /> <Input value={deviceName} label={t("Organisms.DeviceManage.edit_session_name_subtitle")} name="session" />
<div className="device-manage__rename-btn"> <div className="device-manage__rename-btn">
<Button variant="primary" type="submit">{t("common.save")}</Button> <Button variant="primary" type="submit">{t("common.save")}</Button>
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button> <Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
@ -55,7 +55,7 @@ const promptDeviceName = async (deviceName) => new Promise((resolve) => {
}; };
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t("DeviceManage.edit_session_name_title")}</Text>, <Text variant="s1" weight="medium">{t("Organisms.DeviceManage.edit_session_name_title")}</Text>,
(requestClose) => renderContent((name) => { (requestClose) => renderContent((name) => {
isCompleted = true; isCompleted = true;
resolve(name); resolve(name);
@ -95,7 +95,7 @@ function DeviceManage() {
}; };
return ( return (
<form className="device-manage__rename" onSubmit={handleSubmit}> <form className="device-manage__rename" onSubmit={handleSubmit}>
<Input value={deviceName} label={t("DeviceManage.edit_session_name_subtitle")} name="session" /> <Input value={deviceName} label={t("Organisms.DeviceManage.edit_session_name_subtitle")} name="session" />
<div className="device-manage__rename-btn"> <div className="device-manage__rename-btn">
<Button variant="primary" type="submit">{t("common.save")}</Button> <Button variant="primary" type="submit">{t("common.save")}</Button>
<Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button> <Button onClick={() => onComplete(null)}>{t("common.cancel")}</Button>
@ -105,7 +105,7 @@ function DeviceManage() {
}; };
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t("DeviceManage.edit_session_name_title")}</Text>, <Text variant="s1" weight="medium">{t("Organisms.DeviceManage.edit_session_name_title")}</Text>,
(requestClose) => renderContent((name) => { (requestClose) => renderContent((name) => {
isCompleted = true; isCompleted = true;
resolve(name); resolve(name);
@ -132,7 +132,7 @@ function DeviceManage() {
<div className="device-manage"> <div className="device-manage">
<div className="device-manage__loading"> <div className="device-manage__loading">
<Spinner size="small" /> <Spinner size="small" />
<Text>{t("DeviceManage.loading_devices")}</Text> <Text>{t("Organisms.DeviceManage.loading_devices")}</Text>
</div> </div>
</div> </div>
); );
@ -155,14 +155,14 @@ function DeviceManage() {
const handleRemove = async (device) => { const handleRemove = async (device) => {
const isConfirmed = await confirmDialog( const isConfirmed = await confirmDialog(
t("DeviceManage.logout_device_title", {device: device.display_name}), t("Organisms.DeviceManage.logout_device_title", {device: device.display_name}),
t("DeviceManage.logout_device_message", {device: device.display_name}), t("Organisms.DeviceManage.logout_device_message", {device: device.display_name}),
t("DeviceManage.logout_device_confirm"), t("Organisms.DeviceManage.logout_device_confirm"),
'danger', 'danger',
); );
if (!isConfirmed) return; if (!isConfirmed) return;
addToProcessing(device); addToProcessing(device);
await authRequest(t("DeviceManage.logout_device_title", {device: device.display_name}), async (auth) => { await authRequest(t("Organisms.DeviceManage.logout_device_title", {device: device.display_name}), async (auth) => {
await mx.deleteDevice(device.device_id, auth); await mx.deleteDevice(device.device_id, auth);
}); });
@ -171,7 +171,7 @@ function DeviceManage() {
}; };
const verifyWithKey = async (device) => { const verifyWithKey = async (device) => {
const keyData = await accessSecretStorage(t("DeviceManage.session_verification_title")); const keyData = await accessSecretStorage(t("Organisms.DeviceManage.session_verification_title"));
if (!keyData) return; if (!keyData) return;
addToProcessing(device); addToProcessing(device);
await mx.checkOwnCrossSigningTrust(); await mx.checkOwnCrossSigningTrust();
@ -205,7 +205,7 @@ function DeviceManage() {
<Text style={{ color: isVerified !== false ? '' : 'var(--tc-danger-high)' }}> <Text style={{ color: isVerified !== false ? '' : 'var(--tc-danger-high)' }}>
{displayName} {displayName}
<Text variant="b3" span>{`${displayName ? ' — ' : ''}${deviceId}`}</Text> <Text variant="b3" span>{`${displayName ? ' — ' : ''}${deviceId}`}</Text>
{isCurrentDevice && <Text span className="device-manage__current-label" variant="b3">{t("DeviceManage.current_device_label")}</Text>} {isCurrentDevice && <Text span className="device-manage__current-label" variant="b3">{t("Organisms.DeviceManage.current_device_label")}</Text>}
</Text> </Text>
)} )}
options={ options={
@ -213,9 +213,9 @@ function DeviceManage() {
? <Spinner size="small" /> ? <Spinner size="small" />
: ( : (
<> <>
{(isCSEnabled && canVerify) && <Button onClick={() => verify(deviceId, isCurrentDevice)} variant="positive">{t("DeviceManage.verify_session_button")}</Button>} {(isCSEnabled && canVerify) && <Button onClick={() => verify(deviceId, isCurrentDevice)} variant="positive">{t("Organisms.DeviceManage.verify_session_button")}</Button>}
<IconButton size="small" onClick={() => handleRename(device)} src={PencilIC} tooltip={t("DeviceManage.edit_session_name_tooltip")} /> <IconButton size="small" onClick={() => handleRename(device)} src={PencilIC} tooltip={t("Organisms.DeviceManage.edit_session_name_tooltip")} />
<IconButton size="small" onClick={() => handleRemove(device)} src={BinIC} tooltip={t("DeviceManage.logout_device_tooltip")}/> <IconButton size="small" onClick={() => handleRemove(device)} src={BinIC} tooltip={t("Organisms.DeviceManage.logout_device_tooltip")}/>
</> </>
) )
} }
@ -256,38 +256,38 @@ function DeviceManage() {
return ( return (
<div className="device-manage"> <div className="device-manage">
<div> <div>
<MenuHeader>{t("DeviceManage.unverified_sessions_title")}</MenuHeader> <MenuHeader>{t("Organisms.DeviceManage.unverified_sessions_title")}</MenuHeader>
{!isCSEnabled && ( {!isCSEnabled && (
<div style={{ padding: 'var(--sp-extra-tight) var(--sp-normal)' }}> <div style={{ padding: 'var(--sp-extra-tight) var(--sp-normal)' }}>
<InfoCard <InfoCard
rounded rounded
variant="caution" variant="caution"
iconSrc={InfoIC} iconSrc={InfoIC}
title={t("DeviceManage.setup_cross_signing_message")} title={t("Organisms.DeviceManage.setup_cross_signing_message")}
/> />
</div> </div>
)} )}
{ {
unverified.length > 0 unverified.length > 0
? unverified.map((device) => renderDevice(device, false)) ? unverified.map((device) => renderDevice(device, false))
: <Text className="device-manage__info">{t("DeviceManage.unverified_sessions_none")}</Text> : <Text className="device-manage__info">{t("Organisms.DeviceManage.unverified_sessions_none")}</Text>
} }
</div> </div>
{noEncryption.length > 0 && ( {noEncryption.length > 0 && (
<div> <div>
<MenuHeader>{t("DeviceManage.unencrypted_sessions_title")}</MenuHeader> <MenuHeader>{t("Organisms.DeviceManage.unencrypted_sessions_title")}</MenuHeader>
{noEncryption.map((device) => renderDevice(device, null))} {noEncryption.map((device) => renderDevice(device, null))}
</div> </div>
)} )}
<div> <div>
<MenuHeader>{t("DeviceManage.verified_sessions_title")}</MenuHeader> <MenuHeader>{t("Organisms.DeviceManage.verified_sessions_title")}</MenuHeader>
{ {
verified.length > 0 verified.length > 0
? verified.map((device, index) => { ? verified.map((device, index) => {
if (truncated && index >= TRUNCATED_COUNT) return null; if (truncated && index >= TRUNCATED_COUNT) return null;
return renderDevice(device, true); return renderDevice(device, true);
}) })
: <Text className="device-manage__info">{t("DeviceManage.verified_sessions_none")}</Text> : <Text className="device-manage__info">{t("Organisms.DeviceManage.verified_sessions_none")}</Text>
} }
{ verified.length > TRUNCATED_COUNT && ( { verified.length > TRUNCATED_COUNT && (
<Button className="device-manage__info" onClick={() => setTruncated(!truncated)}> <Button className="device-manage__info" onClick={() => setTruncated(!truncated)}>
@ -295,7 +295,7 @@ function DeviceManage() {
</Button> </Button>
)} )}
{ deviceList.length > 0 && ( { deviceList.length > 0 && (
<Text className="device-manage__info" variant="b3">{t("DeviceManage.session_name_privacy_message")}</Text> <Text className="device-manage__info" variant="b3">{t("Organisms.DeviceManage.session_name_privacy_message")}</Text>
)} )}
</div> </div>
</div> </div>

View file

@ -66,18 +66,18 @@ function CreateKeyBackupDialog({ keyData }) {
{done === false && ( {done === false && (
<div> <div>
<Spinner size="small" /> <Spinner size="small" />
<Text>{t("KeyBackup.creating_backup")}</Text> <Text>{t("Organisms.KeyBackup.creating_backup")}</Text>
</div> </div>
)} )}
{done === true && ( {done === true && (
<> <>
<Text variant="h1">{twemojify('✅')}</Text> <Text variant="h1">{twemojify('✅')}</Text>
<Text>{t("KeyBackup.backup_created")}</Text> <Text>{t("Organisms.KeyBackup.backup_created")}</Text>
</> </>
)} )}
{done === null && ( {done === null && (
<> <>
<Text>{t("KeyBackup.backup_failed")}</Text> <Text>{t("Organisms.KeyBackup.backup_failed")}</Text>
<Button onClick={doBackup}>{t("common.retry")}</Button> <Button onClick={doBackup}>{t("common.retry")}</Button>
</> </>
)} )}
@ -108,7 +108,7 @@ function RestoreKeyBackupDialog({ keyData }) {
meBreath = true; meBreath = true;
}, 200); }, 200);
setStatus({ message: t("KeyBackup.restoring_progress", {progress: progress.successes, total: progress.total}) }); setStatus({ message: t("Organisms.KeyBackup.restoring_progress", {progress: progress.successes, total: progress.total}) });
}; };
try { try {
@ -120,14 +120,14 @@ function RestoreKeyBackupDialog({ keyData }) {
{ progressCallback }, { progressCallback },
); );
if (!mountStore.getItem()) return; if (!mountStore.getItem()) return;
setStatus({ done: t("KeyBackup.restore_complete", {progress: info.imported, total: info.total})}); setStatus({ done: t("Organisms.KeyBackup.restore_complete", {progress: info.imported, total: info.total})});
} catch (e) { } catch (e) {
if (!mountStore.getItem()) return; if (!mountStore.getItem()) return;
if (e.errcode === 'RESTORE_BACKUP_ERROR_BAD_KEY') { if (e.errcode === 'RESTORE_BACKUP_ERROR_BAD_KEY') {
deletePrivateKey(keyData.keyId); deletePrivateKey(keyData.keyId);
setStatus({ error: t("KeyBackup.restore_failed_bad_key"), errorCode: 'BAD_KEY' }); setStatus({ error: t("Organisms.KeyBackup.restore_failed_bad_key"), errorCode: 'BAD_KEY' });
} else { } else {
setStatus({ error: t("KeyBackup.restore_failed_unknown"), errCode: 'UNKNOWN' }); setStatus({ error: t("Organisms.KeyBackup.restore_failed_unknown"), errCode: 'UNKNOWN' });
} }
} }
}; };
@ -142,7 +142,7 @@ function RestoreKeyBackupDialog({ keyData }) {
{(status === false || status.message) && ( {(status === false || status.message) && (
<div> <div>
<Spinner size="small" /> <Spinner size="small" />
<Text>{status.message ?? t("KeyBackup.restoring")}</Text> <Text>{status.message ?? t("Organisms.KeyBackup.restoring")}</Text>
</div> </div>
)} )}
{status.done && ( {status.done && (
@ -187,8 +187,8 @@ function DeleteKeyBackupDialog({ requestClose }) {
return ( return (
<div className="key-backup__delete"> <div className="key-backup__delete">
<Text variant="h1">{twemojify('🗑')}</Text> <Text variant="h1">{twemojify('🗑')}</Text>
<Text weight="medium">{t("KeyBackup.delete_key_backup_subtitle")}</Text> <Text weight="medium">{t("Organisms.KeyBackup.delete_key_backup_subtitle")}</Text>
<Text>{t("KeyBackup.delete_key_backup_message")}</Text> <Text>{t("Organisms.KeyBackup.delete_key_backup_message")}</Text>
{ {
isDeleting isDeleting
? <Spinner size="small" /> ? <Spinner size="small" />
@ -231,28 +231,28 @@ function KeyBackup() {
}, [isCSEnabled]); }, [isCSEnabled]);
const openCreateKeyBackup = async () => { const openCreateKeyBackup = async () => {
const keyData = await accessSecretStorage(t('KeyBackup.create_backup_title')); const keyData = await accessSecretStorage(t('Organisms.KeyBackup.create_backup_title'));
if (keyData === null) return; if (keyData === null) return;
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t('KeyBackup.create_backup_title')}</Text>, <Text variant="s1" weight="medium">{t('Organisms.KeyBackup.create_backup_title')}</Text>,
() => <CreateKeyBackupDialog keyData={keyData} />, () => <CreateKeyBackupDialog keyData={keyData} />,
() => fetchKeyBackupVersion(), () => fetchKeyBackupVersion(),
); );
}; };
const openRestoreKeyBackup = async () => { const openRestoreKeyBackup = async () => {
const keyData = await accessSecretStorage(t('KeyBackup.restore_backup_title')); const keyData = await accessSecretStorage(t('Organisms.KeyBackup.restore_backup_title'));
if (keyData === null) return; if (keyData === null) return;
openReusableDialog( openReusableDialog(
<Text variant="s1" weight="medium">{t('KeyBackup.restore_backup_title')}</Text>, <Text variant="s1" weight="medium">{t('Organisms.KeyBackup.restore_backup_title')}</Text>,
() => <RestoreKeyBackupDialog keyData={keyData} />, () => <RestoreKeyBackupDialog keyData={keyData} />,
); );
}; };
const openDeleteKeyBackup = () => openReusableDialog( const openDeleteKeyBackup = () => openReusableDialog(
<Text variant="s1" weight="medium">{t('KeyBackup.delete_key_backup_title')}</Text>, <Text variant="s1" weight="medium">{t('Organisms.KeyBackup.delete_key_backup_title')}</Text>,
(requestClose) => ( (requestClose) => (
<DeleteKeyBackupDialog <DeleteKeyBackupDialog
requestClose={(isDone) => { requestClose={(isDone) => {
@ -265,28 +265,28 @@ function KeyBackup() {
const renderOptions = () => { const renderOptions = () => {
if (keyBackup === undefined) return <Spinner size="small" />; if (keyBackup === undefined) return <Spinner size="small" />;
if (keyBackup === null) return <Button variant="primary" onClick={openCreateKeyBackup}>{t('KeyBackup.create_backup_tooltip')}</Button>; if (keyBackup === null) return <Button variant="primary" onClick={openCreateKeyBackup}>{t('Organisms.KeyBackup.create_backup_tooltip')}</Button>;
return ( return (
<> <>
<IconButton src={DownloadIC} variant="positive" onClick={openRestoreKeyBackup} tooltip={t('KeyBackup.restore_backup_tooltip')} /> <IconButton src={DownloadIC} variant="positive" onClick={openRestoreKeyBackup} tooltip={t('Organisms.KeyBackup.restore_backup_tooltip')} />
<IconButton src={BinIC} onClick={openDeleteKeyBackup} tooltip={t('KeyBackup.delete_key_backup_tooltip')} /> <IconButton src={BinIC} onClick={openDeleteKeyBackup} tooltip={t('Organisms.KeyBackup.delete_key_backup_tooltip')} />
</> </>
); );
}; };
return ( return (
<SettingTile <SettingTile
title={t("KeyBackup.encrypted_messages_backup_title")} title={t("Organisms.KeyBackup.encrypted_messages_backup_title")}
content={( content={(
<> <>
<Text variant="b3">{t("KeyBackup.encrypted_messages_backup_description")}</Text> <Text variant="b3">{t("Organisms.KeyBackup.encrypted_messages_backup_description")}</Text>
{!isCSEnabled && ( {!isCSEnabled && (
<InfoCard <InfoCard
style={{ marginTop: 'var(--sp-ultra-tight)' }} style={{ marginTop: 'var(--sp-ultra-tight)' }}
rounded rounded
variant="caution" variant="caution"
iconSrc={InfoIC} iconSrc={InfoIC}
title={t("KeyBackup.encrypted_messages_backup_cross_signing_disabled")} title={t("Organisms.KeyBackup.encrypted_messages_backup_cross_signing_disabled")}
/> />
)} )}
</> </>

View file

@ -53,26 +53,26 @@ function AppearanceSection() {
<div className="settings-appearance__card"> <div className="settings-appearance__card">
<MenuHeader>Theme</MenuHeader> <MenuHeader>Theme</MenuHeader>
<SettingTile <SettingTile
title={t("Settings.theme.follow_system.title")} title={t("Organisms.Settings.theme.follow_system.title")}
options={( options={(
<Toggle <Toggle
isActive={settings.useSystemTheme} isActive={settings.useSystemTheme}
onToggle={() => { toggleSystemTheme(); updateState({}); }} onToggle={() => { toggleSystemTheme(); updateState({}); }}
/> />
)} )}
content={<Text variant="b3">{t("Settings.theme.follow_system.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.theme.follow_system.description")}</Text>}
/> />
{!settings.useSystemTheme && ( {!settings.useSystemTheme && (
<SettingTile <SettingTile
title={t("Settings.theme.title")} title={t("Organisms.Settings.theme.title")}
content={( content={(
<SegmentedControls <SegmentedControls
selected={settings.getThemeIndex()} selected={settings.getThemeIndex()}
segments={[ segments={[
{ text: t("Settings.theme.theme_light") }, { text: t("Organisms.Settings.theme.theme_light") },
{ text: t("Settings.theme.theme_silver") }, { text: t("Organisms.Settings.theme.theme_silver") },
{ text: t("Settings.theme.theme_dark") }, { text: t("Organisms.Settings.theme.theme_dark") },
{ text: t("Settings.theme.theme_butter") }, { text: t("Organisms.Settings.theme.theme_butter") },
]} ]}
onSelect={(index) => settings.setTheme(index)} onSelect={(index) => settings.setTheme(index)}
/> />
@ -83,34 +83,34 @@ function AppearanceSection() {
<div className="settings-appearance__card"> <div className="settings-appearance__card">
<MenuHeader>Room messages</MenuHeader> <MenuHeader>Room messages</MenuHeader>
<SettingTile <SettingTile
title={t("Settings.markdown.title")} title={t("Organisms.Settings.markdown.title")}
options={( options={(
<Toggle <Toggle
isActive={settings.isMarkdown} isActive={settings.isMarkdown}
onToggle={() => { toggleMarkdown(); updateState({}); }} onToggle={() => { toggleMarkdown(); updateState({}); }}
/> />
)} )}
content={<Text variant="b3">{t("Settings.markdown.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.markdown.description")}</Text>}
/> />
<SettingTile <SettingTile
title={t("Settings.hide_membership_events.title")} title={t("Organisms.Settings.hide_membership_events.title")}
options={( options={(
<Toggle <Toggle
isActive={settings.hideMembershipEvents} isActive={settings.hideMembershipEvents}
onToggle={() => { toggleMembershipEvents(); updateState({}); }} onToggle={() => { toggleMembershipEvents(); updateState({}); }}
/> />
)} )}
content={<Text variant="b3">{t("Settings.hide_membership_events.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.hide_membership_events.description")}</Text>}
/> />
<SettingTile <SettingTile
title={t("Settings.hide_nickname_avatar_events.title")} title={t("Organisms.Settings.hide_nickname_avatar_events.title")}
options={( options={(
<Toggle <Toggle
isActive={settings.hideNickAvatarEvents} isActive={settings.hideNickAvatarEvents}
onToggle={() => { toggleNickAvatarEvents(); updateState({}); }} onToggle={() => { toggleNickAvatarEvents(); updateState({}); }}
/> />
)} )}
content={<Text variant="b3">{t("Settings.hide_nickname_avatar_events.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.hide_nickname_avatar_events.description")}</Text>}
/> />
</div> </div>
</div> </div>
@ -154,21 +154,21 @@ function NotificationsSection() {
return ( return (
<div className="settings-notifications"> <div className="settings-notifications">
<MenuHeader>{t("Settings.notifications_and_sound.title")}</MenuHeader> <MenuHeader>{t("Organisms.Settings.notifications_and_sound.title")}</MenuHeader>
<SettingTile <SettingTile
title={t("Settings.notifications_and_sound.desktop.title")} title={t("Organisms.Settings.notifications_and_sound.desktop.title")}
options={renderOptions()} options={renderOptions()}
content={<Text variant="b3">{t("Settings.notifications_and_sound.desktop.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.notifications_and_sound.desktop.description")}</Text>}
/> />
<SettingTile <SettingTile
title={t("Settings.notifications_and_sound.sound.title")} title={t("Organisms.Settings.notifications_and_sound.sound.title")}
options={( options={(
<Toggle <Toggle
isActive={settings.isNotificationSounds} isActive={settings.isNotificationSounds}
onToggle={() => { toggleNotificationSounds(); updateState({}); }} onToggle={() => { toggleNotificationSounds(); updateState({}); }}
/> />
)} )}
content={<Text variant="b3">{t("Settings.notifications_and_sound.desktop.description")}</Text>} content={<Text variant="b3">{t("Organisms.Settings.notifications_and_sound.desktop.description")}</Text>}
/> />
</div> </div>
); );
@ -181,27 +181,27 @@ function SecuritySection() {
return ( return (
<div className="settings-security"> <div className="settings-security">
<div className="settings-security__card"> <div className="settings-security__card">
<MenuHeader>{t("Settings.security.cross_signing.title")}</MenuHeader> <MenuHeader>{t("Organisms.Settings.security.cross_signing.title")}</MenuHeader>
<CrossSigning /> <CrossSigning />
<KeyBackup /> <KeyBackup />
</div> </div>
<DeviceManage /> <DeviceManage />
<div className="settings-security__card"> <div className="settings-security__card">
<MenuHeader>{t("Settings.security.export_import_encryption_keys.title")}</MenuHeader> <MenuHeader>{t("Organisms.Settings.security.export_import_encryption_keys.title")}</MenuHeader>
<SettingTile <SettingTile
title={t("Settings.security.export_encryption_keys.title")} title={t("Organisms.Settings.security.export_encryption_keys.title")}
content={( content={(
<> <>
<Text variant="b3">{t("Settings.security.export_encryption_keys.description")}</Text> <Text variant="b3">{t("Organisms.Settings.security.export_encryption_keys.description")}</Text>
<ExportE2ERoomKeys /> <ExportE2ERoomKeys />
</> </>
)} )}
/> />
<SettingTile <SettingTile
title={t("Settings.security.import_encryption_keys.title")} title={t("Organisms.Settings.security.import_encryption_keys.title")}
content={( content={(
<> <>
<Text variant="b3">{t("Settings.security.import_encryption_keys.description")}</Text> <Text variant="b3">{t("Organisms.Settings.security.import_encryption_keys.description")}</Text>
<ImportE2ERoomKeys /> <ImportE2ERoomKeys />
</> </>
)} )}
@ -218,7 +218,7 @@ function AboutSection() {
return ( return (
<div className="settings-about"> <div className="settings-about">
<div className="settings-about__card"> <div className="settings-about__card">
<MenuHeader>{t("Settings.about.application")}</MenuHeader> <MenuHeader>{t("Organisms.Settings.about.application")}</MenuHeader>
<div className="settings-about__branding"> <div className="settings-about__branding">
<img width="60" height="60" src={CinnySVG} alt="Cinny logo" /> <img width="60" height="60" src={CinnySVG} alt="Cinny logo" />
<div> <div>
@ -236,7 +236,7 @@ function AboutSection() {
</div> </div>
</div> </div>
<div className="settings-about__card"> <div className="settings-about__card">
<MenuHeader>{t("Settings.about.credits")}</MenuHeader> <MenuHeader>{t("Organisms.Settings.about.credits")}</MenuHeader>
<div className="settings-about__credits"> <div className="settings-about__credits">
<ul> <ul>
<li> <li>
@ -314,7 +314,7 @@ function Settings() {
const handleTabChange = (tabItem) => setSelectedTab(tabItem); const handleTabChange = (tabItem) => setSelectedTab(tabItem);
const handleLogout = async () => { const handleLogout = async () => {
if (await confirmDialog(t("Settings.logout.dialog.title"), t("Settings.logout.dialog.description"), t("Settings.logout.dialog.confirm"), 'danger')) { if (await confirmDialog(t("Organisms.Settings.logout.dialog.title"), t("Organisms.Settings.logout.dialog.description"), t("Organisms.Settings.logout.dialog.confirm"), 'danger')) {
logout(); logout();
} }
}; };
@ -323,11 +323,11 @@ function Settings() {
<PopupWindow <PopupWindow
isOpen={isOpen} isOpen={isOpen}
className="settings-window" className="settings-window"
title={<Text variant="s1" weight="medium" primary>{t("Settings.title")}</Text>} title={<Text variant="s1" weight="medium" primary>{t("Organisms.Settings.title")}</Text>}
contentOptions={( contentOptions={(
<> <>
<Button variant="danger" iconSrc={PowerIC} onClick={handleLogout}> <Button variant="danger" iconSrc={PowerIC} onClick={handleLogout}>
{t("Settings.logout.title")} {t("Organisms.Settings.logout.title")}
</Button> </Button>
<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} /> <IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />
</> </>

View file

@ -115,18 +115,18 @@ function ShortcutSpacesContent() {
return ( return (
<> <>
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("ShortcutSpaces.pinned_spaces")}</Text> <Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("Organisms.ShortcutSpaces.pinned_spaces")}</Text>
{spaceShortcut.length === 0 && <Text>{t("ShortcutSpaces.no_pinned_spaces")}</Text>} {spaceShortcut.length === 0 && <Text>{t("Organisms.ShortcutSpaces.no_pinned_spaces")}</Text>}
{spaceShortcut.map((spaceId) => renderSpace(spaceId, true))} {spaceShortcut.map((spaceId) => renderSpace(spaceId, true))}
<Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("ShortcutSpaces.unpinned_spaces")}</Text> <Text className="shortcut-spaces__header" variant="b3" weight="bold">{t("Organisms.ShortcutSpaces.unpinned_spaces")}</Text>
{spaceWithoutShortcut.length === 0 && <Text>{t("ShortcutSpaces.no_unpinned_spaces")}</Text>} {spaceWithoutShortcut.length === 0 && <Text>{t("Organisms.ShortcutSpaces.no_unpinned_spaces")}</Text>}
{spaceWithoutShortcut.map((spaceId) => renderSpace(spaceId, false))} {spaceWithoutShortcut.map((spaceId) => renderSpace(spaceId, false))}
{selected.length !== 0 && ( {selected.length !== 0 && (
<div className="shortcut-spaces__footer"> <div className="shortcut-spaces__footer">
{process && <Spinner size="small" />} {process && <Spinner size="small" />}
<Text weight="medium">{process || t("ShortcutSpaces.spaces_selected", {count: selected.length})}</Text> <Text weight="medium">{process || t("Organisms.ShortcutSpaces.spaces_selected", {count: selected.length})}</Text>
{ !process && ( { !process && (
<Button onClick={handleAdd} variant="primary">{t("ShortcutSpaces.pin_button")}</Button> <Button onClick={handleAdd} variant="primary">{t("Organisms.ShortcutSpaces.pin_button")}</Button>
)} )}
</div> </div>
)} )}
@ -160,7 +160,7 @@ function ShortcutSpaces() {
className="shortcut-spaces" className="shortcut-spaces"
title={( title={(
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{t("ShortcutSpaces.header")} {t("Organisms.ShortcutSpaces.header")}
</Text> </Text>
)} )}
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip= {t("common.close")}/>} contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip= {t("common.close")}/>}

View file

@ -120,7 +120,7 @@ function SpaceManageItem({
const roomNameJSX = ( const roomNameJSX = (
<Text> <Text>
{twemojify(name)} {twemojify(name)}
<Text variant="b3" span> {t("SpaceManage.room_members", {count: roomInfo.num_joined_members})}</Text> <Text variant="b3" span> {t("Organisms.SpaceManage.room_members", {count: roomInfo.num_joined_members})}</Text>
</Text> </Text>
); );
@ -148,7 +148,7 @@ function SpaceManageItem({
> >
{roomAvatarJSX} {roomAvatarJSX}
{roomNameJSX} {roomNameJSX}
{isSuggested && <Text variant="b2">{t("SpaceManage.suggested")}</Text>} {isSuggested && <Text variant="b2">{t("Organisms.SpaceManage.suggested")}</Text>}
</button> </button>
{roomInfo.topic && expandBtnJsx} {roomInfo.topic && expandBtnJsx}
{ {
@ -187,15 +187,15 @@ function SpaceManageFooter({ parentId, selected }) {
}); });
const handleRemove = () => { const handleRemove = () => {
setProcess(t("SpaceManage.remove", {count: selected.length})); setProcess(t("Organisms.SpaceManage.remove", {count: selected.length}));
selected.forEach((roomId) => { selected.forEach((roomId) => {
mx.sendStateEvent(parentId, 'm.space.child', {}, roomId); mx.sendStateEvent(parentId, 'm.space.child', {}, roomId);
}); });
}; };
const handleToggleSuggested = (isMark) => { const handleToggleSuggested = (isMark) => {
if (isMark) setProcess(t("SpaceManage.mark_suggested", {count: selected.length})); if (isMark) setProcess(t("Organisms.SpaceManage.mark_suggested", {count: selected.length}));
else setProcess(t("SpaceManage.mark_not_suggested", {count: selected.length})); else setProcess(t("Organisms.SpaceManage.mark_not_suggested", {count: selected.length}));
selected.forEach((roomId) => { selected.forEach((roomId) => {
const sEvent = room.currentState.getStateEvents('m.space.child', roomId); const sEvent = room.currentState.getStateEvents('m.space.child', roomId);
if (!sEvent) return; if (!sEvent) return;
@ -210,7 +210,7 @@ function SpaceManageFooter({ parentId, selected }) {
return ( return (
<div className="space-manage__footer"> <div className="space-manage__footer">
{process && <Spinner size="small" />} {process && <Spinner size="small" />}
<Text weight="medium">{process || t("SpaceManage.items_selected", {count: selected.length})}</Text> <Text weight="medium">{process || t("Organisms.SpaceManage.items_selected", {count: selected.length})}</Text>
{ !process && ( { !process && (
<> <>
<Button onClick={handleRemove} variant="danger">{t("common.remove")}</Button> <Button onClick={handleRemove} variant="danger">{t("common.remove")}</Button>
@ -352,11 +352,11 @@ function SpaceManageContent({ roomId, requestClose }) {
{spacePath.length > 1 && ( {spacePath.length > 1 && (
<SpaceManageBreadcrumb path={spacePath} onSelect={addPathItem} /> <SpaceManageBreadcrumb path={spacePath} onSelect={addPathItem} />
)} )}
<Text variant="b3" weight="bold">{t("SpaceManage.rooms_and_spaces")}</Text> <Text variant="b3" weight="bold">{t("Organisms.SpaceManage.rooms_and_spaces")}</Text>
<div className="space-manage__content-items"> <div className="space-manage__content-items">
{!isLoading && currentHierarchy?.rooms?.length === 1 && ( {!isLoading && currentHierarchy?.rooms?.length === 1 && (
<Text> <Text>
{t("SpaceManage.private_rooms_message")} {t("Organisms.SpaceManage.private_rooms_message")}
</Text> </Text>
)} )}
{currentHierarchy && (currentHierarchy.rooms?.map((roomInfo) => ( {currentHierarchy && (currentHierarchy.rooms?.map((roomInfo) => (
@ -378,7 +378,7 @@ function SpaceManageContent({ roomId, requestClose }) {
{!currentHierarchy && <Text>{t("common.loading")}</Text>} {!currentHierarchy && <Text>{t("common.loading")}</Text>}
</div> </div>
{currentHierarchy?.canLoadMore && !isLoading && ( {currentHierarchy?.canLoadMore && !isLoading && (
<Button onClick={loadRoomHierarchy}>{t("SpaceManage.load_more")}</Button> <Button onClick={loadRoomHierarchy}>{t("Organisms.SpaceManage.load_more")}</Button>
)} )}
{isLoading && ( {isLoading && (
<div className="space-manage__content-loading"> <div className="space-manage__content-loading">
@ -428,7 +428,7 @@ function SpaceManage() {
title={( title={(
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{roomId && twemojify(room.name)} {roomId && twemojify(room.name)}
<span style={{ color: 'var(--tc-surface-low)' }}> {t("SpaceManage.subtitle")}</span> <span style={{ color: 'var(--tc-surface-low)' }}> {t("Organisms.SpaceManage.subtitle")}</span>
</Text> </Text>
)} )}
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip="Close" />} contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip="Close" />}

View file

@ -83,7 +83,7 @@ function GeneralSettings({ roomId }) {
}} }}
iconSrc={isCategorized ? CategoryFilledIC : CategoryIC} iconSrc={isCategorized ? CategoryFilledIC : CategoryIC}
> >
{isCategorized ? t("SpaceSettings.uncategorize_subspaces") : t("SpaceSettings.categorize_subspaces")} {isCategorized ? t("Organisms.SpaceSettings.uncategorize_subspaces") : t("Organisms.SpaceSettings.categorize_subspaces")}
</MenuItem> </MenuItem>
<MenuItem <MenuItem
onClick={() => { onClick={() => {
@ -93,30 +93,30 @@ function GeneralSettings({ roomId }) {
}} }}
iconSrc={isPinned ? PinFilledIC : PinIC} iconSrc={isPinned ? PinFilledIC : PinIC}
> >
{isPinned ? t("SpaceSettings.unpin_sidebar") : t("SpaceSettings.pin_sidebar")} {isPinned ? t("Organisms.SpaceSettings.unpin_sidebar") : t("Organisms.SpaceSettings.pin_sidebar")}
</MenuItem> </MenuItem>
<MenuItem <MenuItem
variant="danger" variant="danger"
onClick={async () => { onClick={async () => {
const isConfirmed = await confirmDialog( const isConfirmed = await confirmDialog(
t("SpaceSettings.leave.leave_dialog_title"), t("Organisms.SpaceSettings.leave.leave_dialog_title"),
t("SpaceSettings.leave.leave_dialog_message", {space: roomName}), t("Organisms.SpaceSettings.leave.leave_dialog_message", {space: roomName}),
t("SpaceSettings.leave.leave_space"), t("Organisms.SpaceSettings.leave.leave_space"),
'danger', 'danger',
); );
if (isConfirmed) leave(roomId); if (isConfirmed) leave(roomId);
}} }}
iconSrc={LeaveArrowIC} iconSrc={LeaveArrowIC}
> >
{t("SpaceSettings.leave.leave_space")} {t("Organisms.SpaceSettings.leave.leave_space")}
</MenuItem> </MenuItem>
</div> </div>
<div className="space-settings__card"> <div className="space-settings__card">
<MenuHeader>{t("SpaceSettings.visibility.header")}</MenuHeader> <MenuHeader>{t("Organisms.SpaceSettings.visibility.header")}</MenuHeader>
<RoomVisibility roomId={roomId} /> <RoomVisibility roomId={roomId} />
</div> </div>
<div className="space-settings__card"> <div className="space-settings__card">
<MenuHeader>{t("SpaceSettings.addresses.header")}</MenuHeader> <MenuHeader>{t("Organisms.SpaceSettings.addresses.header")}</MenuHeader>
<RoomAliases roomId={roomId} /> <RoomAliases roomId={roomId} />
</div> </div>
</> </>
@ -169,7 +169,7 @@ function SpaceSettings() {
title={( title={(
<Text variant="s1" weight="medium" primary> <Text variant="s1" weight="medium" primary>
{isOpen && twemojify(room.name)} {isOpen && twemojify(room.name)}
<span style={{ color: 'var(--tc-surface-low)' }}> {t("SpaceSettings.subtitle")}</span> <span style={{ color: 'var(--tc-surface-low)' }}> {t("Organisms.SpaceSettings.subtitle")}</span>
</Text> </Text>
)} )}
contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={requestClose} tooltip={t("common.close")} />}

View file

@ -56,15 +56,15 @@ function ViewSource() {
const renderViewSource = () => ( const renderViewSource = () => (
<div className="view-source"> <div className="view-source">
{event.isEncrypted() && <ViewSourceBlock title={t("ViewSource.decrypted_source")} json={event.getEffectiveEvent()} />} {event.isEncrypted() && <ViewSourceBlock title={t("Organisms.ViewSource.decrypted_source")} json={event.getEffectiveEvent()} />}
<ViewSourceBlock title={t("ViewSource.original_source")} json={event.event} /> <ViewSourceBlock title={t("Organisms.ViewSource.original_source")} json={event.event} />
</div> </div>
); );
return ( return (
<PopupWindow <PopupWindow
isOpen={isOpen} isOpen={isOpen}
title={t("ViewSource.title")} title={t("Organisms.ViewSource.title")}
onAfterClose={handleAfterClose} onAfterClose={handleAfterClose}
onRequestClose={() => setIsOpen(false)} onRequestClose={() => setIsOpen(false)}
contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip={t("common.close")} />} contentOptions={<IconButton src={CrossIC} onClick={() => setIsOpen(false)} tooltip={t("common.close")} />}

View file

@ -16,8 +16,8 @@ function Welcome() {
<div className="app-welcome flex--center"> <div className="app-welcome flex--center">
<div> <div>
<img className="app-welcome__logo noselect" src={CinnySvg} alt="Cinny logo" /> <img className="app-welcome__logo noselect" src={CinnySvg} alt="Cinny logo" />
<Text className="app-welcome__heading" variant="h1" weight="medium" primary>{t('Welcome.heading')}</Text> <Text className="app-welcome__heading" variant="h1" weight="medium" primary>{t('Organisms.Welcome.heading')}</Text>
<Text className="app-welcome__subheading" variant="s1">{t('Welcome.subheading')}</Text> <Text className="app-welcome__subheading" variant="s1">{t('Organisms.Welcome.subheading')}</Text>
</div> </div>
</div> </div>
); );