diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 4f70182f8..3e24040eb 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -371,6 +371,7 @@ 3EC5A41F9FB7DD63A4DC6144 /* RoomChangeRolesScreenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B14B1DE3E2D5D26732C49036 /* RoomChangeRolesScreenViewModel.swift */; }; 3EC698F80DDEEFA273857841 /* ArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 893777A4997BBDB68079D4F5 /* ArrayTests.swift */; }; 3ED2725734568F6B8CC87544 /* AttributedStringBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5C6FBF97B6EED3D4FA5EFF /* AttributedStringBuilder.swift */; }; + 3EEB8F54CD235421C58AA578 /* Letro.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = F53C0A1CF2DD6DF5AC82C51B /* Letro.stringsdict */; }; 3F2148F11164C7C5609984EB /* Sentry in Frameworks */ = {isa = PBXBuildFile; productRef = 886A0A498FA01E8EDD451D05 /* Sentry */; }; 3F55721B5C08E8D9F1295592 /* SDKListener.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE5CD2993048222B64C45006 /* SDKListener.swift */; }; 3F70E237CE4C3FAB02FC227F /* NotificationConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C830A64609CBD152F06E0457 /* NotificationConstants.swift */; }; @@ -838,6 +839,7 @@ 8ED8AF57A06F5EE9978ED23F /* AuthenticationStartScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FB89DC7F9A4A91020037001 /* AuthenticationStartScreenViewModelTests.swift */; }; 8F2FAA98457750D9D664136F /* LRUCache in Frameworks */ = {isa = PBXBuildFile; productRef = 1081D3630AAD3ACEDDEC3A98 /* LRUCache */; }; 8F3AD08F2E706AA60F1A1D4D /* portrait_test_image.jpg in Resources */ = {isa = PBXBuildFile; fileRef = BC51BF90469412ABDE658CDD /* portrait_test_image.jpg */; }; + 8F60869415CCEE7CB48B8FFA /* Letro.strings in Resources */ = {isa = PBXBuildFile; fileRef = F91648730DB4AF1EC879EE3F /* Letro.strings */; }; 904F06C9C1AEF884C2077542 /* RoomDirectorySearchScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E4EF80DFB8FE7C4469B15D /* RoomDirectorySearchScreen.swift */; }; 90733645AE76FB33DAD28C2B /* URLSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE40D4A5DD857AC16EED945A /* URLSession.swift */; }; 90DF83A6A347F7EE7EDE89EE /* AttributedStringBuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF25E364AE85090A70AE4644 /* AttributedStringBuilderTests.swift */; }; @@ -1841,6 +1843,7 @@ 2BFDCA5A09EE70BC17F2EFA7 /* URLComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URLComponents.swift; sourceTree = ""; }; 2C39B1D3FC8CF41D6C3B054F /* NavigationTabCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationTabCoordinator.swift; sourceTree = ""; }; 2C39D91A31409775B0F4268F /* et */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = et; path = et.lproj/InfoPlist.strings; sourceTree = ""; }; + 2C9931627740796219E6B23B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Letro.strings; sourceTree = ""; }; 2CEBCB9676FCD1D0F13188DD /* StringTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = ""; }; 2CF9FE7E0CF9F40D1509E63A /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = bg; path = bg.lproj/Localizable.stringsdict; sourceTree = ""; }; 2D0946F77B696176E062D037 /* RoomMembersListScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomMembersListScreenModels.swift; sourceTree = ""; }; @@ -2964,6 +2967,7 @@ FC9044BE0E4A66F5B963E834 /* AudioFileEventsTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioFileEventsTimelineView.swift; sourceTree = ""; }; FCE93F0CBF0D96B77111C413 /* AppLockFlowCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockFlowCoordinator.swift; sourceTree = ""; }; FD1275D9CE0FFBA6E8E85426 /* UserIndicatorController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserIndicatorController.swift; sourceTree = ""; }; + FD2E2AE22C30A20529CDFD3E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Letro.stringsdict; sourceTree = ""; }; FDB9C37196A4C79F24CE80C6 /* KeychainControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainControllerTests.swift; sourceTree = ""; }; FDEDD4D2DE0646DA724985D5 /* QRCodeLoginScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QRCodeLoginScreenModels.swift; sourceTree = ""; }; FDF73F49E6B6683F7E2D26F0 /* SecureBackupScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureBackupScreenCoordinator.swift; sourceTree = ""; }; @@ -5650,6 +5654,8 @@ isa = PBXGroup; children = ( 91DE43B8815918E590912DDA /* InfoPlist.strings */, + F91648730DB4AF1EC879EE3F /* Letro.strings */, + F53C0A1CF2DD6DF5AC82C51B /* Letro.stringsdict */, 7109E709A7738E6BCC4553E6 /* Localizable.strings */, 187853A7E643995EE49FAD43 /* Localizable.stringsdict */, 135FC689EA39AE1D34153B58 /* SAS.strings */, @@ -7382,6 +7388,8 @@ 992F5E750F5030C4BA2D0D03 /* Assets.xcassets in Resources */, 2CA6ABBC9A88EB89EA52FCCB /* ConfettiScene.scn in Resources */, B6DA66EFC13A90846B625836 /* InfoPlist.strings in Resources */, + 8F60869415CCEE7CB48B8FFA /* Letro.strings in Resources */, + 3EEB8F54CD235421C58AA578 /* Letro.stringsdict in Resources */, 5F5488FBC9CFEB6F433D74A4 /* Localizable.strings in Resources */, 0EA6537A07E2DC882AEA5962 /* Localizable.stringsdict in Resources */, 8B408C574E35E1C9B43A50CE /* PrivacyInfo.xcprivacy in Resources */, @@ -9246,6 +9254,14 @@ name = Untranslated.strings; sourceTree = ""; }; + F53C0A1CF2DD6DF5AC82C51B /* Letro.stringsdict */ = { + isa = PBXVariantGroup; + children = ( + FD2E2AE22C30A20529CDFD3E /* en */, + ); + name = Letro.stringsdict; + sourceTree = ""; + }; F75DF9500D69A3AAF8339E69 /* Untranslated.stringsdict */ = { isa = PBXVariantGroup; children = ( @@ -9254,6 +9270,14 @@ name = Untranslated.stringsdict; sourceTree = ""; }; + F91648730DB4AF1EC879EE3F /* Letro.strings */ = { + isa = PBXVariantGroup; + children = ( + 2C9931627740796219E6B23B /* en */, + ); + name = Letro.strings; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/ElementX/Resources/Localizations/en.lproj/Letro.strings b/ElementX/Resources/Localizations/en.lproj/Letro.strings new file mode 100644 index 000000000..3e16ab116 --- /dev/null +++ b/ElementX/Resources/Localizations/en.lproj/Letro.strings @@ -0,0 +1,216 @@ +/* Override selected app strings here without editing Localizable.strings. + Use the same keys as Localizable.strings. Any key present in this file + takes precedence over the main string catalog for this app variant. + You can also add Letro.strings files in other *.lproj folders for + language-specific Letro overrides. */ + +// Example: +//"exampleKey" = "exampleValue"; + +"a11y.room_avatar" = "Silo avatar"; +"a11y_tombstoned_room" = "Tombstoned silo"; +"action_add_existing_rooms" = "Add existing silos"; +"action_create_room" = "Create silo"; +"action_create_space" = "Create workspace"; +"action_explore_public_spaces" = "Explore public workspaces"; +"action_leave_room" = "Leave"; +"action_leave_space" = "Leave workspace"; +"action_manage_rooms" = "Manage silos"; +"action_report_room" = "Report silo"; +"action_start_chat" = "New Direct / Silo"; +"banner_set_up_recovery_content" = "Your data are automatically backed up with end-to-end encryption. To restore this backup and retain your digital identity when you lose access to all your devices, you will need your recovery key."; +"banner_set_up_recovery_title" = "Back up your data"; +"common_android_shortcuts_remove_reason_left_room" = "You left the silo"; +"common_creating_room" = "Creating silo…"; +"common_creating_space" = "Creating workspace…"; +"common_current_user_left_room" = "Left silo"; +"common_current_user_left_space" = "Left workspace"; +"common_leaving_room" = "Leaving silo"; +"common_leaving_space" = "Leaving workspace"; +"common_no_room_name" = "No silo name"; +"common_no_space_name" = "No workspace name"; +"common_private_room" = "Private silo"; +"common_private_space" = "Private workspace"; +"common_public_room" = "Public silo"; +"common_invite_unknown_profile" = "This ID can't be found, so the invite might not be received."; +"common_public_space" = "Public workspace"; +"common_room" = "Silo"; +"common_room_name" = "Silo name"; +"common_share_space" = "Share workspace"; +"common_shared_space" = "Shared workspace"; +"common_space" = "Workspace"; +"common_space_members" = "Workspace members"; +"common_space_topic_placeholder" = "What is this workspace about?"; +"common_topic_placeholder" = "What is this silo about?"; +"crypto_event_key_forwarded_known_profile_dialog_content" = "%1$@ (%2$@) shared this message since you were not in the silo when it was sent."; +"crypto_event_key_forwarded_unknown_profile_dialog_content" = "%1$@ shared this message since you were not in the silo when it was sent."; +"crypto_identity_change_profile_pin_violation" = "%1$@’s digital identity was reset."; +"crypto_history_visible" = "This silo has been configured so that new members can read history. %1$@"; +"dialog_room_reported" = "Silo reported"; +"dialog_room_reported_and_left" = "Reported and left silo"; +"error_invalid_invite" = "The silo no longer exists or the invite is no longer valid."; +"error_room_address_already_exists" = "This silo address already exists. Please try editing the silo address field or change the silo name"; +"leave_room_alert_empty_subtitle" = "Are you sure that you want to leave this silo? You're the only person here. If you leave, no one will be able to join in the future, including you."; +"leave_room_alert_private_subtitle" = "Are you sure that you want to leave this silo? This silo is not public and you won't be able to rejoin without an invite."; +"leave_room_alert_select_new_owner_subtitle" = "You're the only owner of this silo. You need to transfer ownership to someone else before you leave the silo."; +"leave_room_alert_subtitle" = "Are you sure that you want to leave?"; +"notification_inline_reply_failed" = "** Failed to send - please open silo"; +"notification_room_invite_body" = "Invited you to join the silo"; +"notification_room_invite_body_with_sender" = "%1$@ invited you to join the silo"; +"notification_space_invite_body" = "Invited you to join the workspace"; +"notification_space_invite_body_with_sender" = "%1$@ invited you to join the workspace"; +"screen_advanced_settings_hide_invite_avatars_toggle_title" = "Hide avatars in silo invite requests"; +"screen_advanced_settings_show_media_timeline_private_rooms" = "In private silos"; +"screen_app_lock_setup_pin_context" = "Lock %1$@ to add extra security.\n\nChoose something memorable. If you forget this PIN, you will be logged out of the app."; +"screen_bottom_sheet_manage_room_member_ban_member_from_space_confirmation_description" = "They won’t be able to join this space again if invited, but they’ll still keep their memberships of any silos or subspaces."; +"screen_bottom_sheet_manage_room_member_kick_member_confirmation_description" = "They will be able to join this silo again if invited."; +"screen_bottom_sheet_manage_room_member_kick_member_from_space_confirmation_description" = "They will be able to join this space again if invited, and they’ll still keep their memberships of any silos or subspaces."; +"screen_bottom_sheet_manage_room_member_member_user_info" = "View Identity"; +"screen_chat_backup_key_backup_description" = "This will allow you to view your history on any new devices and is required for backup of your data and digital identity. %1$@."; +"screen_chat_backup_recovery_action_change_description" = "Your data are automatically backed up with end-to-end encryption. To restore this backup and retain your digital identity when you lose access to all your devices, you will need your recovery key."; +"screen_chat_backup_recovery_action_setup_description" = "Your data are automatically backed up with end-to-end encryption. To restore this backup and retain your digital identity when you lose access to all your devices, you will need your recovery key."; +"screen_create_room_action_create_room" = "New silo"; +"screen_create_room_error_creating_room" = "An error occurred when creating the silo"; +"screen_create_room_error_creating_space" = "The workspace could not be created because of an unknown error. Try again later."; +"screen_create_room_new_room_title" = "New silo"; +"screen_create_room_new_space_title" = "New Workspace"; +"screen_create_room_public_option_description" = "Anyone can find this silo.\nYou can change this anytime in silo settings."; +"screen_create_room_room_visibility_section_title" = "Silo visibility"; +"screen_create_room_space_selection_no_space_description" = "(no workspace)"; +"screen_create_room_space_selection_no_space_option" = "Do not add to a workspace"; +"screen_create_room_space_selection_no_space_title" = "No workspace selected"; +"screen_create_room_space_selection_sheet_title" = "Add to workspace"; +"screen_deactivate_account_list_item_2" = "Remove you from all chat silos."; +"screen_decline_and_block_block_user_option_description" = "You will not see any messages or silo invites from this user"; +"screen_decline_and_block_report_user_option_description" = "Report this silo to your account provider."; +"screen_edit_profile_error_title" = "Unable to update identity"; +"screen_edit_profile_title" = "Your Identity"; +"screen_edit_profile_updating_details" = "Updating identity…"; +"screen_home_tab_chats" = "Desk"; +"screen_home_tab_spaces" = "Workspaces"; +"screen_join_room_cancel_knock_alert_description" = "Are you sure that you want to cancel your request to join this silo?"; +"screen_join_room_decline_and_block_alert_message" = "Are you sure you want to decline the invite to join this silo? This will also prevent %1$@ from contacting you or inviting you to silos."; +"screen_join_room_join_restricted_message" = "You may need to be invited or be a member of a workspace in order to join."; +"screen_join_room_knock_sent_description" = "You will receive an invite to join the silo if your request is accepted."; +"screen_join_room_loading_alert_message" = "We could not display the silo preview. This may be due to network or server issues."; +"screen_join_room_loading_alert_title" = "We couldn’t display this silo preview"; +"screen_join_room_space_not_supported_description" = "%1$@ does not support workspaces yet. You can access workspaces on web."; +"screen_join_room_space_not_supported_title" = "Workspaces are not supported yet"; +"screen_join_room_subtitle_knock" = "Click the button below and a silo administrator will be notified. You’ll be able to join the conversation once approved."; +"screen_join_room_subtitle_no_preview" = "You must be a member of this silo to view the message history."; +"screen_join_room_title_knock" = "Want to join this silo?"; +"screen_knock_requests_list_ban_alert_description" = "Are you sure you want to decline and ban %1$@? This user won’t be able to request access to join this silo again."; +"screen_knock_requests_list_decline_alert_description" = "Are you sure you want to decline %1$@ request to join this silo?"; +"screen_knock_requests_list_empty_state_description" = "When somebody will ask to join the silo, you’ll be able to see their request here."; +"screen_leave_space_subtitle" = "Select the silos you’d like to leave which you're not the only administrator for:"; +"screen_leave_space_subtitle_last_admin" = "You need to assign another admin for this workspace before you can leave."; +"screen_leave_space_subtitle_only_last_admin" = "You will not be removed from the following silo(s) because you're the only administrator:"; +"screen_manage_authorized_spaces_header" = "Spaces where members can join the silo without an invitation."; +"screen_manage_authorized_spaces_title" = "Manage workspaces"; +"screen_manage_authorized_spaces_unknown_space" = "(Unknown workspace)"; +"screen_manage_authorized_spaces_unknown_spaces_section_title" = "Other workspaces you’re not a member of"; +"screen_manage_authorized_spaces_your_spaces_section_title" = "Your workspaces"; +"screen_media_browser_delete_confirmation_subtitle" = "This file will be removed from the silo and members won’t have access to it."; +"screen_media_browser_files_empty_state_subtitle" = "Documents, audio files, and voice messages uploaded to this silo will be shown here."; +"screen_media_browser_media_empty_state_subtitle" = "Images and videos uploaded to this silo will be shown here."; +"screen_notification_settings_direct_chats" = "Directs"; +"screen_notification_settings_edit_screen_direct_section_header" = "On directs, notify me for"; +"screen_notification_settings_edit_screen_group_section_header" = "On silos, notify me for"; +"screen_notification_settings_group_chats" = "Silos"; +"screen_notification_settings_mentions_only_disclaimer" = "Your homeserver does not support this option in encrypted silos, you may not get notified in some silos."; +"screen_notification_settings_room_mention_label" = "Notify me on @silo"; +"screen_report_room_leave_failed_alert_message" = "Your report was submitted successfully, but we encountered an issue while trying to leave the silo. Please try again."; +"screen_report_room_leave_failed_alert_title" = "Unable to Leave"; +"screen_report_room_reason_footer" = "Report this silo to your admin. If the messages are encrypted, your admin will not be able to read them."; +"screen_report_room_title" = "Report silo"; +"screen_room_alias_resolver_resolve_alias_failure" = "Failed to resolve silo alias."; +"screen_room_change_permissions_manage_space" = "Manage workspace"; +"screen_room_change_permissions_manage_space_rooms" = "Manage silos"; +"screen_room_change_role_confirm_demote_self_description" = "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the silo it will be impossible to regain privileges."; +"screen_room_details_badge_public" = "Public silo"; +"screen_room_details_edition_error_title" = "Unable to update silo"; +"screen_room_details_error_muting" = "Failed muting this silo, please try again."; +"screen_room_details_error_unmuting" = "Failed unmuting this silo, please try again."; +"screen_room_details_leave_room_title" = "Leave"; +"screen_room_details_profile_row_title" = "Identity"; +"screen_room_details_roles_and_permissions" = "Clearance"; +"screen_room_details_share_room_title" = "Share silo"; +"screen_room_details_title" = "Info"; +"screen_room_directory_search_title" = "Silo directory"; +"screen_room_encrypted_history_banner_unverified" = "Message history is unavailable in this silo. Verify this device to see your message history."; +"screen_room_member_list_manage_member_unban_message" = "They will be able to join this silo again if invited."; +"screen_room_member_details_title" = "Identity"; +"screen_room_member_list_room_members_header_title" = "Silo members"; +"screen_room_mentions_at_room_subtitle" = "Notify the whole silo"; +"screen_room_notification_settings_mentions_only_disclaimer" = "Your homeserver does not support this option in encrypted silos, you won't get notified in this silo."; +"screen_room_notification_settings_room_custom_settings_title" = "In this silo, notify me for"; +"screen_room_roles_and_permissions_room_details" = "Silo details"; +"screen_room_roles_and_permissions_space_details" = "Workspace details"; +"screen_room_roles_and_permissions_title" = "Clearance"; +"screen_room_single_knock_request_title" = "%1$@ wants to join this silo"; +"screen_room_timeline_no_permission_to_post" = "You do not have permission to post to this silo"; +"screen_room_timeline_state_changes" = "%1$d changes"; +"screen_room_timeline_tombstoned_room_action" = "Jump to new silo"; +"screen_room_timeline_tombstoned_room_message" = "This silo has been replaced and is no longer active"; +"screen_room_timeline_upgraded_room_message" = "This silo is a continuation of another silo"; +"screen_roomlist_a11y_create_message" = "Create a new conversation or silo"; +"screen_roomlist_filter_people" = "Directs"; +"screen_roomlist_filter_rooms" = "Silos"; +"screen_roomlist_filter_rooms_empty_state_title" = "You’re not in any silo yet"; +"screen_roomlist_main_space_title" = "Desk"; +"screen_roomlist_tombstoned_room_description" = "This silo has been upgraded"; +"screen_roomlist_your_spaces" = "Your workspaces"; +"screen_security_and_privacy_ask_to_join_multiple_spaces_members_option_description" = "Anyone in authorised workspaces can join, but everyone else must request access."; +"screen_security_and_privacy_enable_encryption_alert_description" = "Once enabled, encryption for a silo cannot be disabled, Message history will only be visible for silo members since they were invited or since they joined the silo.\nNo one besides the silo members will be able to read messages. This may prevent bots and bridges to work correctly.\nWe do not recommend enabling encryption for silos that anyone can find and join."; +"screen_security_and_privacy_room_access_footer" = "Choose which spaces’ members can join this silo without an invitation. %1$@"; +"screen_security_and_privacy_room_access_footer_manage_spaces_action" = "Manage workspaces"; +"screen_security_and_privacy_room_access_space_members_option_multiple_parents_description" = "Anyone in authorised workspaces can join."; +"screen_security_and_privacy_room_access_space_members_option_title" = "Workspace members"; +"screen_security_and_privacy_room_access_space_members_option_unavailable_description" = "Workspaces are not currently supported"; +"screen_security_and_privacy_room_directory_visibility_section_footer" = "Allow for this silo to be found by searching %1$@ public silo directory"; +"screen_security_and_privacy_room_publishing_section_footer" = "Silo addresses are ways to find and access silos. This also ensures you can easily share your silo with others.\nYou can choose to publish your silo in your homeserver public silo directory."; +"screen_security_and_privacy_room_publishing_section_header" = "Silo publishing"; +"screen_security_and_privacy_room_visibility_section_footer" = "Addresses are a way to find and access silos and spaces. This also ensures you can easily share them with others."; +"screen_space_add_room_action" = "Silo"; +"screen_space_add_rooms_room_access_description" = "Adding a silo will not affect the silo access. To change the access go to Silo settings > Security & privacy."; +"screen_space_announcement_item1" = "View workspaces you've created or joined"; +"screen_space_announcement_item2" = "Accept or decline invites to workspaces"; +"screen_space_announcement_item3" = "Discover any silos you can join in your spaces"; +"screen_space_announcement_item4" = "Join public workspaces"; +"screen_space_announcement_item5" = "Leave any workspaces you’ve joined"; +"screen_space_announcement_notice" = "Filtering, creating and managing workspaces is coming soon."; +"screen_space_announcement_subtitle" = "Welcome to the beta version of Workspaces! With this first version you can:"; +"screen_space_announcement_title" = "Introducing Workspaces"; +"screen_space_empty_state_title" = "Add your first silo"; +"screen_space_list_description" = "Workspaces you have created or joined."; +"screen_space_list_empty_state_title" = "Create spaces to organize silos"; +"screen_space_list_parent_space" = "%1$@ workspace"; +"screen_space_list_title" = "Workspaces"; +"screen_space_remove_rooms_confirmation_content" = "Removing a silo will not affect the silo access. To change the access go to Silo info > Privacy & security."; +"screen_space_remove_rooms_confirmation_title_ios" = "Remove silos from %1$@?"; +"screen_space_settings_leave_space" = "Leave workspace"; +"screen_space_settings_roles_and_permissions" = "Clearance"; +"screen_start_chat_join_room_by_address_action" = "Join silo by address"; +"screen_start_chat_join_room_by_address_room_found" = "Matching silo found"; +"screen_start_chat_join_room_by_address_room_not_found" = "Silo not found"; +"screen_start_chat_join_room_by_address_supporting_text" = "e.g. #silo-name:matrix.org"; +"state_event_room_avatar_changed" = "%1$@ changed the silo avatar"; +"state_event_room_avatar_changed_by_you" = "You changed the silo avatar"; +"state_event_room_avatar_removed" = "%1$@ removed the silo avatar"; +"state_event_room_avatar_removed_by_you" = "You removed the silo avatar"; +"state_event_room_created" = "%1$@ created the silo"; +"state_event_room_created_by_you" = "You created the silo"; +"state_event_room_join" = "%1$@ joined"; +"state_event_room_join_by_you" = "You joined"; +"state_event_room_leave" = "%1$@ left"; +"state_event_room_leave_by_you" = "You left"; +"state_event_room_name_changed" = "%1$@ changed the silo name to: %2$@"; +"state_event_room_name_changed_by_you" = "You changed the silo name to: %1$@"; +"state_event_room_name_removed" = "%1$@ removed the silo name"; +"state_event_room_name_removed_by_you" = "You removed the silo name"; +"state_event_room_third_party_invite" = "%1$@ sent an invitation to %2$@ to join the silo"; +"state_event_room_third_party_invite_by_you" = "You sent an invitation to %1$@ to join the silo"; +"state_event_room_third_party_revoked_invite" = "%1$@ revoked the invitation for %2$@ to join the silo"; +"state_event_room_third_party_revoked_invite_by_you" = "You revoked the invitation for %1$@ to join the silo"; +"state_event_room_topic_removed" = "%1$@ removed the silo topic"; +"state_event_room_topic_removed_by_you" = "You removed the silo topic"; diff --git a/ElementX/Resources/Localizations/en.lproj/Letro.stringsdict b/ElementX/Resources/Localizations/en.lproj/Letro.stringsdict new file mode 100644 index 000000000..52d6c493f --- /dev/null +++ b/ElementX/Resources/Localizations/en.lproj/Letro.stringsdict @@ -0,0 +1,286 @@ + + + + + + common_spaces + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + %1$d Workspace + + + other + + + %1$d Workspaces + + + + + screen_leave_space_submit + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + Leave %1$d silo and space + + + other + + + Leave %1$d silos and space + + + + + common_rooms + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + %1$d Silo + + + other + + + %1$d Silos + + + + + notification_unread_notified_messages_in_room_rooms + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + %d silo + + + other + + + %d silos + + + + + screen_room_multiple_knock_requests_title + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + %1$@ +%2$d other want to join this silo + + + other + + + %1$@ +%2$d others want to join this silo + + + + + screen_room_timeline_state_changes + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + %1$d change + + + other + + + %1$d changes + + + + + screen_space_remove_rooms_confirmation_title + + + + NSStringLocalizedFormatKey + + + %#@COUNT@ + + + COUNT + + + + NSStringFormatSpecTypeKey + + + NSStringPluralRuleType + + + NSStringFormatValueTypeKey + + + d + + + one + + + Remove %1$d silo from %2$@ + + + other + + + Remove %1$d silos from %2$@ + + + + + diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index fdbbfe37c..394ef1609 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -3764,6 +3764,11 @@ extension L10n { // Use preferredLocalizations to get a language that is in the bundle and the user's preferred list of languages. let languages = Bundle.overrideLocalizations ?? Bundle.app.preferredLocalizations + // Letro: customize strings + if let translation = trLetro(key, args, languages: languages) { + return translation + } + for language in languages { if let translation = trIn(language, table, key, args) { return translation @@ -3772,6 +3777,19 @@ extension L10n { return Bundle.app.developmentLocalization.flatMap { trIn($0, table, key, args) } ?? key } + private static func trLetro(_ key: String, _ args: [CVarArg], languages: [String]) -> String? { + // Letro: customize strings + // Fall back to English Letro overrides + for language in languages + ["en"] { + guard let bundle = Bundle.lprojBundle(for: language) else { continue } + let format = NSLocalizedString(key, tableName: "Letro", bundle: bundle, comment: "") + let translation = String(format: format, locale: Locale(identifier: language), arguments: args) + guard translation != key else { continue } + return translation + } + return nil + } + private static func trIn(_ language: String, _ table: String, _ key: String, _ args: CVarArg...) -> String? { guard let bundle = Bundle.lprojBundle(for: language) else { return nil } let format = NSLocalizedString(key, tableName: table, bundle: bundle, comment: "") diff --git a/Tools/SwiftGen/Templates/Strings/structured-swift5-element.stencil b/Tools/SwiftGen/Templates/Strings/structured-swift5-element.stencil index 74a5da076..83a141c75 100644 --- a/Tools/SwiftGen/Templates/Strings/structured-swift5-element.stencil +++ b/Tools/SwiftGen/Templates/Strings/structured-swift5-element.stencil @@ -78,6 +78,11 @@ extension {{enumName}} { // Use preferredLocalizations to get a language that is in the bundle and the user's preferred list of languages. let languages = Bundle.overrideLocalizations ?? Bundle.app.preferredLocalizations + // Letro: customize strings + if let translation = trLetro(key, args, languages: languages) { + return translation + } + for language in languages { if let translation = trIn(language, table, key, args) { return translation @@ -86,6 +91,19 @@ extension {{enumName}} { return Bundle.app.developmentLocalization.flatMap { trIn($0, table, key, args) } ?? key } + private static func trLetro(_ key: String, _ args: [CVarArg], languages: [String]) -> String? { + // Letro: customize strings + // Fall back to English Letro overrides + for language in languages + ["en"] { + guard let bundle = Bundle.lprojBundle(for: language) else { continue } + let format = NSLocalizedString(key, tableName: "Letro", bundle: bundle, comment: "") + let translation = String(format: format, locale: Locale(identifier: language), arguments: args) + guard translation != key else { continue } + return translation + } + return nil + } + private static func trIn(_ language: String, _ table: String, _ key: String, _ args: CVarArg...) -> String? { guard let bundle = Bundle.lprojBundle(for: language) else { return nil } let format = NSLocalizedString(key, tableName: table, bundle: bundle, comment: "")