diff --git a/Linphone/Core/CoreContext.swift b/Linphone/Core/CoreContext.swift index 32f27916d..2d0deb5b3 100644 --- a/Linphone/Core/CoreContext.swift +++ b/Linphone/Core/CoreContext.swift @@ -240,7 +240,7 @@ final class CoreContext: ObservableObject { } DispatchQueue.main.async { if status == ConfiguringState.Successful { - ToastViewModel.shared.toastMessage = "Successful" + ToastViewModel.shared.toastMessage = "Success_qr_code_validated" ToastViewModel.shared.displayToast = true self.accounts = accountModels } @@ -298,8 +298,6 @@ final class CoreContext: ObservableObject { } else if state == .Cleared { self.loggingInProgress = false self.loggedIn = false - ToastViewModel.shared.toastMessage = "Success_account_logged_out" - ToastViewModel.shared.displayToast = true } else { self.loggingInProgress = false self.loggedIn = false diff --git a/Linphone/Localizable.xcstrings b/Linphone/Localizable.xcstrings index a02327279..e25e011b2 100644 --- a/Linphone/Localizable.xcstrings +++ b/Linphone/Localizable.xcstrings @@ -15,12 +15,6 @@ }, "**%@**" : { - }, - "**Company :** %@" : { - - }, - "**Job :** %@" : { - }, "#" : { @@ -40,9 +34,6 @@ } } } - }, - "%lld appels" : { - }, "%lld Book (Example)" : { "extractionState" : "manual", @@ -96,9 +87,6 @@ } } } - }, - "%lld selected participants" : { - }, "%lld%%" : { @@ -114,15 +102,6 @@ }, "👍" : { - }, - "📅 Meeting has been cancelled" : { - - }, - "📅 Meeting has been modified" : { - - }, - "📅 You are invited to a meeting" : { - }, "😂" : { @@ -162,27 +141,6 @@ }, "9" : { - }, - "A subject and at least one participant is required to create a meeting" : { - - }, - "Account successfully logged out" : { - - }, - "Active" : { - - }, - "Administrateur" : { - - }, - "All calls will be removed from the history." : { - - }, - "All contacts" : { - - }, - "All modifications will be canceled." : { - }, "assistant_account_create" : { "localizations" : { @@ -248,6 +206,9 @@ } } } + }, + "assistant_account_login_forbidden_error" : { + }, "assistant_account_register" : { "extractionState" : "manual", @@ -442,6 +403,16 @@ } } }, + "assistant_invalid_uri_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid URI" + } + } + } + }, "assistant_login_third_party_sip_account" : { "localizations" : { "en" : { @@ -602,6 +573,16 @@ } } }, + "assistant_qr_code_invalid_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Invalid QR code!" + } + } + } + }, "assistant_scan_qr_code" : { "localizations" : { "en" : { @@ -617,6 +598,18 @@ } } } + }, + "assistant_sip_account_transport_protocol" : { + + }, + "assistant_third_party_sip_account_create_linphone_account" : { + + }, + "assistant_third_party_sip_account_warning_explanation" : { + + }, + "assistant_third_party_sip_account_warning_ok" : { + }, "assistant_web_platform_link" : { "localizations" : { @@ -633,21 +626,6 @@ } } } - }, - "Audio" : { - - }, - "Audio seulement" : { - - }, - "Block the address" : { - - }, - "Block the number" : { - - }, - "Bluetooth" : { - }, "bottom_navigation_calls_label" : { "localizations" : { @@ -712,21 +690,6 @@ } } } - }, - "Call failed" : { - - }, - "Call has been successfully transferred" : { - - }, - "Call is being transferred" : { - - }, - "Call list" : { - - }, - "Call transfer failed!" : { - }, "call_action_attended_transfer" : { "localizations" : { @@ -843,9 +806,15 @@ }, "call_action_resume_call" : { "localizations" : { - "fr" : { + "en" : { "stringUnit" : { "state" : "translated", + "value" : "Resume" + } + }, + "fr" : { + "stringUnit" : { + "state" : "needs_review", "value" : "Reprendre" } } @@ -898,6 +867,15 @@ } } } + }, + "call_audio_device_type_bluetooth" : { + + }, + "call_audio_device_type_earpiece" : { + + }, + "call_audio_device_type_headphones" : { + }, "call_audio_device_type_speaker" : { "localizations" : { @@ -914,6 +892,9 @@ } } } + }, + "call_audio_incoming" : { + }, "call_can_be_trusted_toast" : { "extractionState" : "manual", @@ -1085,6 +1066,19 @@ } } }, + "call_do_zrtp_sas_validation_again" : { + + }, + "call_history_deleted_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "History has been deleted" + } + } + } + }, "call_not_encrypted" : { "extractionState" : "manual", "localizations" : { @@ -1101,6 +1095,9 @@ } } } + }, + "call_outgoing" : { + }, "call_srtp_point_to_point_encrypted" : { "extractionState" : "manual", @@ -1118,6 +1115,9 @@ } } } + }, + "call_state_connected" : { + }, "call_state_paused" : { "localizations" : { @@ -1151,6 +1151,44 @@ } } }, + "call_state_resuming" : { + + }, + "call_stats_audio_title" : { + + }, + "call_stats_media_encryption_title" : { + + }, + "call_stats_video_title" : { + + }, + "call_transfer_current_call_title" : { + + }, + "call_transfer_failed_toast" : { + + }, + "call_transfer_in_progress_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Call is being transferred" + } + } + } + }, + "call_transfer_successful_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Call has been successfully transferred" + } + } + } + }, "call_waiting_for_encryption_info" : { "extractionState" : "manual", "localizations" : { @@ -1219,7 +1257,7 @@ } } }, - "Calls" : { + "calls_count_label" : { }, "calls_list_dialog_merge_into_conference_label" : { @@ -1256,26 +1294,7 @@ } } }, - "Cancel" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancel" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler" - } - } - } - }, - "Cancel for me only" : { - - }, - "Categories" : { + "calls_list_title" : { }, "Ce mode vous permet d’ĂȘtre interopĂ©rable avec d’autres services SIP.\nVos communications seront chiffrĂ©es de point Ă  point. " : { @@ -1283,15 +1302,6 @@ }, "Chiffrement de bout en bout de tous vos Ă©changes, grĂące au mode default vos communications sont Ă  l’abri des regards." : { - }, - "Chiffrement du mĂ©dia" : { - - }, - "Clear Logs" : { - - }, - "Close" : { - }, "conference_action_screen_sharing" : { "localizations" : { @@ -1357,6 +1367,18 @@ } } } + }, + "conference_layout_active_speaker" : { + + }, + "conference_layout_audio_only" : { + + }, + "conference_layout_grid" : { + + }, + "conference_name_error" : { + }, "conference_participant_joining_text" : { "localizations" : { @@ -1406,28 +1428,6 @@ } } }, - "Configuration failed" : { - - }, - "Configuration successfully applied" : { - - }, - "Confirm" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirm" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmer" - } - } - } - }, "contact_call_action" : { "localizations" : { "en" : { @@ -1556,6 +1556,12 @@ } } } + }, + "contact_dialog_delete_message" : { + + }, + "contact_dialog_delete_title" : { + }, "contact_dialog_pick_phone_number_or_sip_address_title" : { "extractionState" : "manual", @@ -1605,6 +1611,12 @@ } } } + }, + "contact_editor_dialog_abort_confirmation_message" : { + + }, + "contact_editor_dialog_abort_confirmation_title" : { + }, "contact_editor_first_name" : { "localizations" : { @@ -1701,9 +1713,6 @@ } } } - }, - "Contacts" : { - }, "contacts_list_all_contacts_title" : { "localizations" : { @@ -1786,22 +1795,6 @@ } } }, - "Continue" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continue" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - } - } - }, "conversation_action_call" : { "extractionState" : "manual", "localizations" : { @@ -1868,6 +1861,9 @@ } } } + }, + "conversation_action_mark_as_read" : { + }, "conversation_action_mute" : { "extractionState" : "manual", @@ -2730,21 +2726,22 @@ }, "Could not send ICS invitations to meeting to any participant" : { + }, + "debug_logs_copied_to_clipboard_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Debug logs copied to clipboard" + } + } + } }, "Default" : { }, "Default mode" : { - }, - "Delete %@?" : { - - }, - "Delete all history" : { - - }, - "Description" : { - }, "dialog_accept" : { "localizations" : { @@ -2793,6 +2790,12 @@ } } } + }, + "dialog_close" : { + + }, + "dialog_continue" : { + }, "dialog_deny" : { "localizations" : { @@ -2809,6 +2812,9 @@ } } } + }, + "dialog_no" : { + }, "dialog_ok" : { "localizations" : { @@ -2826,16 +2832,7 @@ } } }, - "Display Name" : { - - }, - "Do you really want to delete all calls history?" : { - - }, - "Domain" : { - - }, - "Don’t save modifications?" : { + "dialog_yes" : { }, "drawer_menu_account_connection_status_cleared" : { @@ -2972,24 +2969,9 @@ } } } - }, - "Earpiece" : { - - }, - "Edit Contact" : { - }, "Error" : { - }, - "Error Name" : { - - }, - "Etes-vous sĂ»r de vouloir supprimer %@ ?" : { - - }, - "Faire la validation Ă  nouveau" : { - }, "GC_MSG" : { "extractionState" : "manual", @@ -3023,12 +3005,6 @@ } } } - }, - "Hang up call" : { - - }, - "Headphones" : { - }, "help_title" : { "extractionState" : "manual", @@ -3047,7 +3023,20 @@ } } }, - "History has been deleted" : { + "help_troubleshooting_clean_logs" : { + + }, + "help_troubleshooting_debug_logs_cleaned_toast_message" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Debug logs have been cleaned" + } + } + } + }, + "help_troubleshooting_share_logs" : { }, "history_call_start_create_group_call" : { @@ -3099,6 +3088,12 @@ } } } + }, + "history_dialog_delete_all_call_logs_message" : { + + }, + "history_dialog_delete_all_call_logs_title" : { + }, "history_group_call_start_dialog_set_subject" : { "localizations" : { @@ -3181,18 +3176,6 @@ } } } - }, - "https://linphone.org/en/privacy-policy" : { - - }, - "https://linphone.org/general-terms" : { - - }, - "I prefere create an account" : { - - }, - "I understand" : { - }, "IM_MSG" : { "extractionState" : "manual", @@ -3216,12 +3199,6 @@ }, "Interoperable mode" : { - }, - "Invalid QR code!" : { - - }, - "Invalide URI" : { - }, "list_filter_no_result_found" : { "localizations" : { @@ -3238,18 +3215,6 @@ } } } - }, - "Log out" : { - - }, - "Logout" : { - - }, - "Logs cleared" : { - - }, - "Logs URL copied into clipboard" : { - }, "manage_account_add_picture" : { "localizations" : { @@ -3266,6 +3231,9 @@ } } } + }, + "manage_account_delete" : { + }, "manage_account_edit_picture" : { "localizations" : { @@ -3316,10 +3284,16 @@ } } }, - "Marquer comme non lu" : { + "meeting_call_remove_no_participants" : { }, - "Meeting added to iPhone calendar" : { + "meeting_call_remove_participant_confirmation_message" : { + + }, + "meeting_call_remove_participant_confirmation_title" : { + + }, + "meeting_exported_as_calendar_event" : { }, "meeting_info_cancelled_toast" : { @@ -3354,6 +3328,16 @@ } } }, + "meeting_info_deleted_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Meeting has been deleted" + } + } + } + }, "meeting_info_export_as_calendar_event" : { "localizations" : { "en" : { @@ -3417,6 +3401,12 @@ } } } + }, + "meeting_schedule_cancel_dialog_message" : { + + }, + "meeting_schedule_cancel_dialog_title" : { + }, "meeting_schedule_description_hint" : { "localizations" : { @@ -3433,6 +3423,9 @@ } } } + }, + "meeting_schedule_description_title" : { + }, "meeting_schedule_edit_title" : { "localizations" : { @@ -3450,6 +3443,16 @@ } } }, + "meeting_schedule_failed_no_subject_or_participant_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "A subject and at least one participant is required to create a meeting" + } + } + } + }, "meeting_schedule_meeting_label" : { "extractionState" : "manual", "localizations" : { @@ -3466,6 +3469,15 @@ } } } + }, + "meeting_schedule_pick_end_time_title" : { + + }, + "meeting_schedule_pick_start_date_title" : { + + }, + "meeting_schedule_pick_start_time_title" : { + }, "meeting_schedule_send_invitations_title" : { "localizations" : { @@ -3643,6 +3655,12 @@ } } } + }, + "menu_block_address" : { + + }, + "menu_block_number" : { + }, "menu_copy_chat_message" : { "extractionState" : "manual", @@ -3808,12 +3826,19 @@ } } } - }, - "Message copied into clipboard" : { - }, "Message received" : { + }, + "message_copied_to_clipboard_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Message copied into clipboard" + } + } + } }, "message_delivery_info_error_title" : { "extractionState" : "manual", @@ -3900,6 +3925,54 @@ } } }, + "message_meeting_invitation_cancelled_notification" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 Meeting has been cancelled" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 RĂ©union annulĂ©e" + } + } + } + }, + "message_meeting_invitation_notification" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 You are invited to a meeting" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 Invitation Ă  une rĂ©union" + } + } + } + }, + "message_meeting_invitation_updated_notification" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 Meeting has been updated" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "📅 RĂ©union mise Ă  jour" + } + } + } + }, "message_reaction_click_to_remove_label" : { "extractionState" : "manual", "localizations" : { @@ -3934,19 +4007,10 @@ } } }, - "Mettre en sourdine" : { + "network_not_reachable" : { }, - "Missed call" : { - - }, - "MosaĂŻque" : { - - }, - "Network is not reachable" : { - - }, - "Network is now reachable again" : { + "network_not_reachable_again" : { }, "new_conversation_create_group" : { @@ -3999,13 +4063,7 @@ } } }, - "Next" : { - - }, - "No participant for the moment..." : { - - }, - "Non" : { + "next" : { }, "notification_chat_message_reaction_received" : { @@ -4024,10 +4082,13 @@ } } }, - "Ok" : { + "notification_chat_message_received_title" : { }, - "OpĂ©ration en cours..." : { + "notification_missed_call_title" : { + + }, + "operation_in_progress_overlay" : { }, "or" : { @@ -4045,12 +4106,6 @@ } } } - }, - "Oui" : { - - }, - "Participant actif" : { - }, "password" : { "extractionState" : "manual", @@ -4068,21 +4123,9 @@ } } } - }, - "Paused" : { - }, "Personnalize your profil mode" : { - }, - "Phone :" : { - - }, - "Phone (%@) :" : { - - }, - "Phone number" : { - }, "phone_number" : { "localizations" : { @@ -4100,10 +4143,10 @@ } } }, - "QR code validated!" : { + "picker_categories" : { }, - "RĂ©activer les notifications" : { + "qr_code_validated" : { }, "recordings_title" : { @@ -4134,26 +4177,7 @@ } } }, - "Resuming" : { - - }, - "Select %@ %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Select %1$@ %2$@" - } - } - } - }, - "Send cancellation notifications" : { - - }, - "Send Logs" : { - - }, - "Send notification to participants ?" : { + "selected_participants_count" : { }, "settings_title" : { @@ -4172,9 +4196,6 @@ } } } - }, - "SIP address copied into clipboard" : { - }, "sip_address" : { "localizations" : { @@ -4191,62 +4212,54 @@ } } } + }, + "sip_address_copied_to_clipboard_toast" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "SIP address copied into clipboard" + } + } + } + }, + "sip_address_display_name" : { + + }, + "sip_address_domain" : { + }, "sip.linphone.org" : { - + "shouldTranslate" : false }, - "Skip" : { - - }, - "Speaker" : { - - }, - "Start" : { - - }, - "Successfully removed meeting" : { - - }, - "Suggestions" : { - - }, - "Supprimer un participant" : { + "start" : { }, "TCP" : { - + "shouldTranslate" : false }, "Temp Help" : { - }, - "The meeting will be cancelled" : { - - }, - "The user name or password is incorrects" : { - - }, - "This contact will be deleted definitively." : { - }, "TLS" : { - - }, - "Transfer call to" : { - - }, - "Transport" : { - + "shouldTranslate" : false }, "UDP" : { + "shouldTranslate" : false + }, + "uri_handler_bad_call_address_failed_toast" : { }, - "Unable to call, invalid address" : { + "uri_handler_bad_config_address_failed_toast" : { }, - "Unable to retrieve configuration, invalid address" : { + "uri_handler_call_failed_toast" : { }, - "Use a SIP account" : { + "uri_handler_config_failed_toast" : { + + }, + "uri_handler_config_success_toast" : { }, "username" : { @@ -4266,10 +4279,10 @@ } } }, - "Username error" : { + "username_error" : { }, - "VidĂ©o" : { + "welcome_carousel_skip" : { }, "welcome_page_1_message" : { diff --git a/Linphone/TelecomManager/TelecomManager.swift b/Linphone/TelecomManager/TelecomManager.swift index 0736f6fc5..37c3d4aeb 100644 --- a/Linphone/TelecomManager/TelecomManager.swift +++ b/Linphone/TelecomManager/TelecomManager.swift @@ -641,7 +641,7 @@ class TelecomManager: ObservableObject { if UIApplication.shared.applicationState != .active && (callLog == nil || callLog?.status == .Missed || callLog?.status == .Aborted || callLog?.status == .EarlyAborted) { // Configure the notification's payload. let content = UNMutableNotificationContent() - content.title = NSString.localizedUserNotificationString(forKey: NSLocalizedString("Missed call", comment: ""), arguments: nil) + content.title = NSString.localizedUserNotificationString(forKey: NSLocalizedString("notification_missed_call_title", comment: ""), arguments: nil) content.body = NSString.localizedUserNotificationString(forKey: displayName, arguments: nil) // Deliver the notification. diff --git a/Linphone/UI/Assistant/Fragments/LoginFragment.swift b/Linphone/UI/Assistant/Fragments/LoginFragment.swift index 82f2f06c7..ce93a7a25 100644 --- a/Linphone/UI/Assistant/Fragments/LoginFragment.swift +++ b/Linphone/UI/Assistant/Fragments/LoginFragment.swift @@ -154,7 +154,7 @@ struct LoginFragment: View { self.accountLoginViewModel.login() coreContext.loggingInProgress = true }, label: { - Text(coreContext.loggedIn ? "Log out" : "assistant_account_login") + Text(coreContext.loggedIn ? "manage_account_delete" : "assistant_account_login") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) @@ -293,8 +293,8 @@ struct LoginFragment: View { } if self.isShowPopup { - let generalTerms = String(format: "[%@](%@)", String(localized: "assistant_dialog_general_terms_label"), String(localized: "https://linphone.org/general-terms")) - let privacyPolicy = String(format: "[%@](%@)", String(localized: "assistant_dialog_privacy_policy_label"), String(localized: "https://linphone.org/en/privacy-policy")) + let generalTerms = String(format: "[%@](%@)", String(localized: "assistant_dialog_general_terms_label"), "https://www.linphone.org/en/terms-of-use/") + let privacyPolicy = String(format: "[%@](%@)", String(localized: "assistant_dialog_privacy_policy_label"), "https://linphone.org/en/privacy-policy") let splitMsg = String(localized: "assistant_dialog_general_terms_and_privacy_policy_message").components(separatedBy: "%@") if splitMsg.count == 3 { // We expect form of STRING %A STRING %@ STRING let contentPopup1 = Text(.init(splitMsg[0])) diff --git a/Linphone/UI/Assistant/Fragments/ProfileModeFragment.swift b/Linphone/UI/Assistant/Fragments/ProfileModeFragment.swift index ff100b8cd..d618dce5b 100644 --- a/Linphone/UI/Assistant/Fragments/ProfileModeFragment.swift +++ b/Linphone/UI/Assistant/Fragments/ProfileModeFragment.swift @@ -124,7 +124,7 @@ struct ProfileModeFragment: View { Button(action: { sharedMainViewModel.changeHideProfileMode() }, label: { - Text("Continue") + Text("dialog_continue") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) @@ -156,7 +156,7 @@ struct ProfileModeFragment: View { + " Etiam velit sapien, egestas sit amet dictum eget, condimentum a ligula."), titleFirstButton: nil, actionFirstButton: {}, - titleSecondButton: Text("Close"), + titleSecondButton: Text("dialog_close"), actionSecondButton: { self.isShowPopup.toggle() } diff --git a/Linphone/UI/Assistant/Fragments/RegisterFragment.swift b/Linphone/UI/Assistant/Fragments/RegisterFragment.swift index 0bf68ca46..255beea6c 100644 --- a/Linphone/UI/Assistant/Fragments/RegisterFragment.swift +++ b/Linphone/UI/Assistant/Fragments/RegisterFragment.swift @@ -107,7 +107,7 @@ struct RegisterFragment: View { .default_text_style_600(styleSize: 15) .padding(.bottom) - Text(String(localized: "Phone number")+"*") + Text(String(localized: "phone_number")+"*") .default_text_style_700(styleSize: 15) .padding(.bottom, -5) @@ -133,7 +133,7 @@ struct RegisterFragment: View { Divider() - TextField("Phone number", text: $registerViewModel.phoneNumber) + TextField("phone_number", text: $registerViewModel.phoneNumber) .default_text_style(styleSize: 15) .disableAutocorrection(true) .autocapitalization(.none) @@ -309,11 +309,11 @@ struct RegisterFragment: View { isShowPopup: $isShowPopup, title: titlePopup, content: contentPopup, - titleFirstButton: Text("Cancel"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowPopup = false }, - titleSecondButton: Text("Continue"), + titleSecondButton: Text("dialog_continue"), actionSecondButton: { self.isShowPopup = false registerViewModel.createInProgress = true diff --git a/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountLoginFragment.swift b/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountLoginFragment.swift index 9069efd75..b814a2e25 100644 --- a/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountLoginFragment.swift +++ b/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountLoginFragment.swift @@ -69,7 +69,7 @@ struct ThirdPartySipAccountLoginFragment: View { } .frame(width: geometry.size.width) - Text("Use a SIP account") + Text("assistant_login_third_party_sip_account") .default_text_style_white_800(styleSize: 20) .padding(.top, 20) } @@ -139,7 +139,7 @@ struct ThirdPartySipAccountLoginFragment: View { ) .padding(.bottom) - Text(String(localized: "Domain")+"*") + Text(String(localized: "sip_address_domain")+"*") .default_text_style_700(styleSize: 15) .padding(.bottom, -5) @@ -160,11 +160,11 @@ struct ThirdPartySipAccountLoginFragment: View { .padding(.bottom) .focused($isDomainFocused) - Text(String(localized: "Display Name")) + Text(String(localized: "sip_address_display_name")) .default_text_style_700(styleSize: 15) .padding(.bottom, -5) - TextField("Display Name", text: $accountLoginViewModel.displayName) + TextField("sip_address_display_name", text: $accountLoginViewModel.displayName) .default_text_style(styleSize: 15) .disableAutocorrection(true) .autocapitalization(.none) @@ -181,7 +181,7 @@ struct ThirdPartySipAccountLoginFragment: View { .padding(.bottom) .focused($isDisplayNameFocused) - Text(String(localized: "Transport")) + Text(String(localized: "assistant_sip_account_transport_protocol")) .default_text_style_700(styleSize: 15) .padding(.bottom, -5) @@ -215,7 +215,7 @@ struct ThirdPartySipAccountLoginFragment: View { Button(action: { self.accountLoginViewModel.login() }, label: { - Text(coreContext.loggedIn ? "Log out" : "assistant_account_login") + Text(coreContext.loggedIn ? "manage_account_delete" : "assistant_account_login") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) diff --git a/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountWarningFragment.swift b/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountWarningFragment.swift index b63164bd5..7b56a0009 100644 --- a/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountWarningFragment.swift +++ b/Linphone/UI/Assistant/Fragments/ThirdPartySipAccountWarningFragment.swift @@ -61,7 +61,7 @@ struct ThirdPartySipAccountWarningFragment: View { } .frame(width: geometry.size.width) - Text("Use a SIP account") + Text("assistant_login_third_party_sip_account") .default_text_style_white_800(styleSize: 20) .padding(.top, 20) } @@ -101,9 +101,7 @@ struct ThirdPartySipAccountWarningFragment: View { } .padding(.bottom, 40) - Text("Some features require a Linphone account, such as group messaging, video conferences...\n\n" - + "These features are hidden when you register with a third party SIP account.\n\n" - + "To enable it in a commercial projet, please contact us. ") + Text("assistant_third_party_sip_account_warning_explanation") .default_text_style(styleSize: 15) .multilineTextAlignment(.center) .padding(.bottom) @@ -137,7 +135,7 @@ struct ThirdPartySipAccountWarningFragment: View { Button(action: { dismiss() }, label: { - Text("I prefere create an account") + Text("assistant_third_party_sip_account_create_linphone_account") .default_text_style_orange_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) @@ -156,7 +154,7 @@ struct ThirdPartySipAccountWarningFragment: View { NavigationLink(destination: { ThirdPartySipAccountLoginFragment(accountLoginViewModel: accountLoginViewModel) }, label: { - Text("I understand") + Text("assistant_third_party_sip_account_warning_ok") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) diff --git a/Linphone/UI/Call/Fragments/AudioRouteBottomSheet.swift b/Linphone/UI/Call/Fragments/AudioRouteBottomSheet.swift index 73f292ecb..c6a536dbd 100644 --- a/Linphone/UI/Call/Fragments/AudioRouteBottomSheet.swift +++ b/Linphone/UI/Call/Fragments/AudioRouteBottomSheet.swift @@ -55,7 +55,7 @@ struct AudioRouteBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text(!callViewModel.isHeadPhoneAvailable() ? "Earpiece" : "Headphones") + Text(!callViewModel.isHeadPhoneAvailable() ? "call_audio_device_type_earpiece" : "call_audio_device_type_headphones") .default_text_style_white(styleSize: 15) Spacer() @@ -87,7 +87,7 @@ struct AudioRouteBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("Speaker") + Text("call_audio_device_type_speaker") .default_text_style_white(styleSize: 15) Spacer() @@ -121,7 +121,8 @@ struct AudioRouteBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("Bluetooth") + Text(String(format: String(localized: "call_audio_device_type_bluetooth"), + AVAudioSession.sharedInstance().currentRoute.outputs.first?.portName ?? "")) .default_text_style_white(styleSize: 15) Spacer() diff --git a/Linphone/UI/Call/Fragments/CallStatisticsSheetBottomSheet.swift b/Linphone/UI/Call/Fragments/CallStatisticsSheetBottomSheet.swift index 0ec6bd92e..0f94e3f94 100644 --- a/Linphone/UI/Call/Fragments/CallStatisticsSheetBottomSheet.swift +++ b/Linphone/UI/Call/Fragments/CallStatisticsSheetBottomSheet.swift @@ -37,7 +37,7 @@ struct CallStatisticsSheetBottomSheet: View { Spacer() HStack { Spacer() - Button("Close") { + Button("dialog_close") { callStatisticsSheet = false dismiss() } @@ -50,7 +50,7 @@ struct CallStatisticsSheetBottomSheet: View { .padding(15) } - Text("Audio") + Text("call_stats_audio_title") .default_text_style_white_600(styleSize: 15) .padding(.top, 10) @@ -77,7 +77,7 @@ struct CallStatisticsSheetBottomSheet: View { Spacer() if callViewModel.callStatsModel.isVideoEnabled { - Text("VidĂ©o") + Text("call_stats_video_title") .default_text_style_white_600(styleSize: 15) .padding(.top, 10) diff --git a/Linphone/UI/Call/Fragments/CallsListFragment.swift b/Linphone/UI/Call/Fragments/CallsListFragment.swift index 693f3f864..0cceeb5e1 100644 --- a/Linphone/UI/Call/Fragments/CallsListFragment.swift +++ b/Linphone/UI/Call/Fragments/CallsListFragment.swift @@ -61,7 +61,7 @@ struct CallsListFragment: View { } } - Text("Call list") + Text("calls_list_title") .multilineTextAlignment(.leading) .default_text_style_orange_800(styleSize: 16) @@ -106,7 +106,7 @@ struct CallsListFragment: View { PopupView(isShowPopup: $isShowPopup, title: Text("calls_list_dialog_merge_into_conference_title"), content: nil, - titleFirstButton: Text("Cancel"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: {self.isShowPopup.toggle()}, titleSecondButton: Text("calls_list_dialog_merge_into_conference_label"), actionSecondButton: { @@ -171,7 +171,7 @@ struct CallsListFragment: View { HStack { Image((callViewModel.selectedCall!.state == .PausedByRemote || callViewModel.selectedCall!.state == .Pausing - || callViewModel.selectedCall!.state == .Paused) ? "play" : "pause") + || callViewModel.selectedCall!.state == .Paused) ? String(localized: "call_action_resume_call") : String(localized: "call_action_pause_call")) .resizable() .frame(width: 30, height: 30) @@ -217,7 +217,7 @@ struct CallsListFragment: View { .background(Color.redDanger500) .cornerRadius(40) - Text("Hang up call") + Text("call_action_hang_up") .foregroundStyle(Color.redDanger500) .default_text_style_white(styleSize: 15) @@ -271,7 +271,7 @@ struct CallsListFragment: View { .frame(maxWidth: .infinity, alignment: .leading) .lineLimit(1) } else { - Text(callViewModel.calls[index].callLog!.conferenceInfo!.subject ?? "Conference Name error") + Text(callViewModel.calls[index].callLog!.conferenceInfo!.subject ?? String(localized: "conference_name_error")) .default_text_style(styleSize: 16) .frame(maxWidth: .infinity, alignment: .leading) .lineLimit(1) @@ -284,7 +284,7 @@ struct CallsListFragment: View { || callViewModel.calls[index].state == .Pausing || callViewModel.calls[index].state == .Paused || callViewModel.calls[index].state == .Resuming { - Text(callViewModel.calls[index].state == .Resuming ? "Resuming" : "Paused") + Text(callViewModel.calls[index].state == .Resuming ? String(localized: "call_state_resuming") : String(localized: "call_state_paused")) .default_text_style_300(styleSize: 14) .frame(maxWidth: .infinity, alignment: .trailing) .lineLimit(1) @@ -294,7 +294,7 @@ struct CallsListFragment: View { .resizable() .frame(width: 25, height: 25) } else { - Text("Active") + Text("call_state_connected") .default_text_style_300(styleSize: 14) .frame(maxWidth: .infinity, alignment: .trailing) .lineLimit(1) diff --git a/Linphone/UI/Call/Fragments/ChangeLayoutBottomSheet.swift b/Linphone/UI/Call/Fragments/ChangeLayoutBottomSheet.swift index 7a7bbc7d6..c0fcc0690 100644 --- a/Linphone/UI/Call/Fragments/ChangeLayoutBottomSheet.swift +++ b/Linphone/UI/Call/Fragments/ChangeLayoutBottomSheet.swift @@ -46,7 +46,7 @@ struct ChangeLayoutBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("MosaĂŻque") + Text("conference_layout_grid") .foregroundStyle(callViewModel.participantList.count > 5 ? Color.gray500 : .white) .default_text_style_white(styleSize: 15) @@ -77,7 +77,7 @@ struct ChangeLayoutBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("Participant actif") + Text("conference_layout_active_speaker") .default_text_style_white(styleSize: 15) Spacer() @@ -109,7 +109,7 @@ struct ChangeLayoutBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("Audio seulement") + Text("conference_layout_audio_only") .default_text_style_white(styleSize: 15) Spacer() diff --git a/Linphone/UI/Call/Fragments/MediaEncryptedSheetBottomSheet.swift b/Linphone/UI/Call/Fragments/MediaEncryptedSheetBottomSheet.swift index cbf9832e4..2f7f01530 100644 --- a/Linphone/UI/Call/Fragments/MediaEncryptedSheetBottomSheet.swift +++ b/Linphone/UI/Call/Fragments/MediaEncryptedSheetBottomSheet.swift @@ -37,7 +37,7 @@ struct MediaEncryptedSheetBottomSheet: View { Spacer() HStack { Spacer() - Button("Close") { + Button("dialog_close") { mediaEncryptedSheet = false dismiss() } @@ -50,7 +50,7 @@ struct MediaEncryptedSheetBottomSheet: View { .padding(15) } - Text("Chiffrement du mĂ©dia") + Text("call_stats_media_encryption_title") .default_text_style_white_600(styleSize: 15) .padding(.top, 10) @@ -92,7 +92,7 @@ struct MediaEncryptedSheetBottomSheet: View { mediaEncryptedSheet = false dismiss() }, label: { - Text("Faire la validation Ă  nouveau") + Text("call_do_zrtp_sas_validation_again") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) diff --git a/Linphone/UI/Call/Fragments/ParticipantsListFragment.swift b/Linphone/UI/Call/Fragments/ParticipantsListFragment.swift index 22c3c1ff9..6877c10da 100644 --- a/Linphone/UI/Call/Fragments/ParticipantsListFragment.swift +++ b/Linphone/UI/Call/Fragments/ParticipantsListFragment.swift @@ -107,13 +107,13 @@ struct ParticipantsListFragment: View { .background(.white) if self.isShowPopup { - let contentPopup = Text("Etes-vous sĂ»r de vouloir supprimer \(callViewModel.participantList[indexToRemove].name) ?") + let contentPopup = Text(String(format: String(localized: "meeting_call_remove_participant_confirmation_message"), callViewModel.participantList[indexToRemove].name)) PopupView(isShowPopup: $isShowPopup, - title: Text("Supprimer un participant"), + title: Text("meeting_call_remove_participant_confirmation_title"), content: contentPopup, - titleFirstButton: Text("Non"), + titleFirstButton: Text("dialog_no"), actionFirstButton: {self.isShowPopup.toggle()}, - titleSecondButton: Text("Oui"), + titleSecondButton: Text("dialog_yes"), actionSecondButton: { callViewModel.removeParticipant(index: indexToRemove) self.isShowPopup.toggle() @@ -158,7 +158,7 @@ struct ParticipantsListFragment: View { Spacer() if callViewModel.myParticipantModel!.isAdmin { - Text("Administrateur") + Text("conversation_info_participant_is_admin_label") .foregroundStyle(Color.grayMain2c300) .default_text_style(styleSize: 12) .frame(maxWidth: .infinity, alignment: .trailing) @@ -202,7 +202,7 @@ struct ParticipantsListFragment: View { Spacer() if callViewModel.participantList[index].isAdmin { - Text("Administrateur") + Text("conversation_info_participant_is_admin_label") .foregroundStyle(Color.grayMain2c300) .default_text_style(styleSize: 12) .frame(maxWidth: .infinity, alignment: .trailing) @@ -250,7 +250,7 @@ struct ParticipantsListFragment: View { .scaledToFit() .clipped() .padding(.all) - Text("No participant for the moment...") + Text("meeting_call_remove_no_participants") .default_text_style_800(styleSize: 16) Spacer() Spacer() diff --git a/Linphone/UI/Call/MeetingWaitingRoomFragment.swift b/Linphone/UI/Call/MeetingWaitingRoomFragment.swift index 6f53504f5..3615c8bbb 100644 --- a/Linphone/UI/Call/MeetingWaitingRoomFragment.swift +++ b/Linphone/UI/Call/MeetingWaitingRoomFragment.swift @@ -470,7 +470,7 @@ struct MeetingWaitingRoomFragment: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text(!meetingWaitingRoomViewModel.isHeadPhoneAvailable() ? "Earpiece" : "Headphones") + Text(!meetingWaitingRoomViewModel.isHeadPhoneAvailable() ? "call_audio_device_type_earpiece" : "call_audio_device_type_headphones") .default_text_style_white(styleSize: 15) Spacer() @@ -536,7 +536,8 @@ struct MeetingWaitingRoomFragment: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) - Text("Bluetooth") + Text(String(format: String(localized: "call_audio_device_type_bluetooth"), + AVAudioSession.sharedInstance().currentRoute.outputs.first?.portName ?? "")) .default_text_style_white(styleSize: 15) Spacer() diff --git a/Linphone/UI/Main/Contacts/Fragments/ContactInnerActionsFragment.swift b/Linphone/UI/Main/Contacts/Fragments/ContactInnerActionsFragment.swift index dda84c0ab..88e3621c4 100644 --- a/Linphone/UI/Main/Contacts/Fragments/ContactInnerActionsFragment.swift +++ b/Linphone/UI/Main/Contacts/Fragments/ContactInnerActionsFragment.swift @@ -121,11 +121,11 @@ struct ContactInnerActionsFragment: View { VStack { if contactAvatarModel.friend!.phoneNumbersWithLabel[index].label != nil && !contactAvatarModel.friend!.phoneNumbersWithLabel[index].label!.isEmpty { - Text("Phone (\(contactAvatarModel.friend!.phoneNumbersWithLabel[index].label!)) :") + Text(String(localized: "phone_number") + " \(contactAvatarModel.friend!.phoneNumbersWithLabel[index].label!)) :") .default_text_style_700(styleSize: 14) .frame(maxWidth: .infinity, alignment: .leading) } else { - Text("Phone :") + Text(String(localized: "phone_number") + " :") .default_text_style_700(styleSize: 14) .frame(maxWidth: .infinity, alignment: .leading) } @@ -170,7 +170,7 @@ struct ContactInnerActionsFragment: View { VStack { if contactAvatarModel.friend!.organization != nil && !contactAvatarModel.friend!.organization!.isEmpty { - Text("**Company :** \(contactAvatarModel.friend!.organization!)") + Text(.init(String(format:"**%@ :** %@", String(localized: "contact_editor_company"), contactAvatarModel.friend!.organization!))) .default_text_style(styleSize: 14) .padding(.vertical, 15) .padding(.horizontal, 20) @@ -179,7 +179,7 @@ struct ContactInnerActionsFragment: View { if contactAvatarModel.friend!.jobTitle != nil && !contactAvatarModel.friend!.jobTitle!.isEmpty { - Text("**Job :** \(contactAvatarModel.friend!.jobTitle!)") + Text(.init(String(format:"**%@ :** %@", String(localized: "contact_editor_job_title"), contactAvatarModel.friend!.jobTitle!))) .default_text_style(styleSize: 14) .padding(.top, contactAvatarModel.friend!.organization != nil diff --git a/Linphone/UI/Main/Contacts/Fragments/ContactInnerFragment.swift b/Linphone/UI/Main/Contacts/Fragments/ContactInnerFragment.swift index af16d0fde..0e17fe1c7 100644 --- a/Linphone/UI/Main/Contacts/Fragments/ContactInnerFragment.swift +++ b/Linphone/UI/Main/Contacts/Fragments/ContactInnerFragment.swift @@ -278,7 +278,7 @@ struct ContactInnerFragment: View { .fullScreenCover(isPresented: $presentingEditContact) { NavigationView { EditContactView(contact: $cnContact) - .navigationBarTitle("Edit Contact") + .navigationBarTitle("contact_edit_title") .navigationBarTitleDisplayMode(.inline) .edgesIgnoringSafeArea(.vertical) } diff --git a/Linphone/UI/Main/Contacts/Fragments/ContactListBottomSheet.swift b/Linphone/UI/Main/Contacts/Fragments/ContactListBottomSheet.swift index 96cf01d43..439da23fc 100644 --- a/Linphone/UI/Main/Contacts/Fragments/ContactListBottomSheet.swift +++ b/Linphone/UI/Main/Contacts/Fragments/ContactListBottomSheet.swift @@ -42,7 +42,7 @@ struct ContactListBottomSheet: View { Spacer() HStack { Spacer() - Button("Close") { + Button("dialog_close") { if #available(iOS 16.0, *) { showingSheet.toggle() } else { @@ -147,7 +147,7 @@ struct ContactListBottomSheet: View { .frame(width: 25, height: 25, alignment: .leading) .padding(.all, 10) Text(contactViewModel.stringToCopy.prefix(4) == "sip:" - ? "Block the address" : "Block the number") + ? "menu_block_address" : "menu_block_number") .default_text_style(styleSize: 16) Spacer() } diff --git a/Linphone/UI/Main/Contacts/Fragments/ContactsListBottomSheet.swift b/Linphone/UI/Main/Contacts/Fragments/ContactsListBottomSheet.swift index d63f7c168..d1e199961 100644 --- a/Linphone/UI/Main/Contacts/Fragments/ContactsListBottomSheet.swift +++ b/Linphone/UI/Main/Contacts/Fragments/ContactsListBottomSheet.swift @@ -43,7 +43,7 @@ struct ContactsListBottomSheet: View { Spacer() HStack { Spacer() - Button("Close") { + Button("dialog_close") { if #available(iOS 16.0, *) { showingSheet.toggle() } else { diff --git a/Linphone/UI/Main/ContentView.swift b/Linphone/UI/Main/ContentView.swift index 5df66befe..31c7e27d9 100644 --- a/Linphone/UI/Main/ContentView.swift +++ b/Linphone/UI/Main/ContentView.swift @@ -94,7 +94,7 @@ struct ContentView: View { .padding(.leading, 10) if callViewModel.callsCounter > 1 { - Text("\(callViewModel.callsCounter) appels") + Text(String(format: String(localized: "calls_count_label"), callViewModel.callsCounter)) .default_text_style_white(styleSize: 16) } else { Text("\(callViewModel.displayName)") @@ -104,7 +104,7 @@ struct ContentView: View { Spacer() if callViewModel.callsCounter == 1 { - Text("\(callViewModel.isPaused || telecomManager.isPausedByRemote ? "En pause" : "Actif")") + Text(String(localized: "\(callViewModel.isPaused || telecomManager.isPausedByRemote ? "call_state_paused" : "call_state_connected")")) .default_text_style_white(styleSize: 16) .padding(.trailing, 10) } @@ -142,10 +142,10 @@ struct ContentView: View { .foregroundStyle(self.index == 0 ? Color.orangeMain500 : Color.grayMain2c600) .frame(width: 25, height: 25) if self.index == 0 { - Text("Contacts") + Text("bottom_navigation_contacts_label") .default_text_style_700(styleSize: 10) } else { - Text("Contacts") + Text("bottom_navigation_contacts_label") .default_text_style(styleSize: 10) } } @@ -190,10 +190,10 @@ struct ContentView: View { .foregroundStyle(self.index == 1 ? Color.orangeMain500 : Color.grayMain2c600) .frame(width: 25, height: 25) if self.index == 1 { - Text("Calls") + Text("bottom_navigation_calls_label") .default_text_style_700(styleSize: 10) } else { - Text("Calls") + Text("bottom_navigation_calls_label") .default_text_style(styleSize: 10) } } @@ -315,7 +315,7 @@ struct ContentView: View { openMenu() } - Text(index == 0 ? "bottom_navigation_contacts_label" : (index == 1 ? "bottom_navigation_calls_label" : (index == 2 ? "bottom_navigation_conversations_label" : "bottom_navigation_meetings_label"))) + Text(String(localized: index == 0 ? "bottom_navigation_contacts_label" : (index == 1 ? "bottom_navigation_calls_label" : (index == 2 ? "bottom_navigation_conversations_label" : "bottom_navigation_meetings_label")))) .default_text_style_white_800(styleSize: 20) .padding(.leading, 10) @@ -393,7 +393,7 @@ struct ContentView: View { isShowDeleteAllHistoryPopup.toggle() } label: { HStack { - Text("Delete all history") + Text("menu_delete_history") Spacer() Image("trash-simple-red") .resizable() @@ -671,10 +671,10 @@ struct ContentView: View { .foregroundStyle(self.index == 0 ? Color.orangeMain500 : Color.grayMain2c600) .frame(width: 25, height: 25) if self.index == 0 { - Text("Contacts") + Text("bottom_navigation_contacts_label") .default_text_style_700(styleSize: 10) } else { - Text("Contacts") + Text("bottom_navigation_contacts_label") .default_text_style(styleSize: 10) } } @@ -721,10 +721,10 @@ struct ContentView: View { .foregroundStyle(self.index == 1 ? Color.orangeMain500 : Color.grayMain2c600) .frame(width: 25, height: 25) if self.index == 1 { - Text("Calls") + Text("bottom_navigation_calls_label") .default_text_style_700(styleSize: 9) } else { - Text("Calls") + Text("bottom_navigation_calls_label") .default_text_style(styleSize: 9) } } @@ -1004,17 +1004,16 @@ struct ContentView: View { if isShowDeleteContactPopup { PopupView(isShowPopup: $isShowDeleteContactPopup, - title: Text( - contactViewModel.selectedFriend != nil - ? "Delete \(contactViewModel.selectedFriend!.name!)?" + title: Text(String(format: String(localized: "contact_dialog_delete_title"), contactViewModel.selectedFriend != nil + ? contactViewModel.selectedFriend!.name! : (contactViewModel.indexDisplayedFriend != nil - ? "Delete \(contactsManager.lastSearch[contactViewModel.indexDisplayedFriend!].friend!.name!)?" - : "Error Name")), - content: Text("This contact will be deleted definitively."), - titleFirstButton: Text("Cancel"), + ? contactsManager.lastSearch[contactViewModel.indexDisplayedFriend!].friend!.name! + : "Error Name"))), + content: Text("contact_dialog_delete_message"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowDeleteContactPopup.toggle()}, - titleSecondButton: Text("Ok"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { if contactViewModel.selectedFriendToDelete != nil { if contactViewModel.indexDisplayedFriend != nil { @@ -1046,14 +1045,14 @@ struct ContentView: View { if isShowDeleteAllHistoryPopup { PopupView(isShowPopup: $isShowDeleteContactPopup, - title: Text("Do you really want to delete all calls history?"), - content: Text("All calls will be removed from the history."), - titleFirstButton: Text("Cancel"), + title: Text("history_dialog_delete_all_call_logs_title"), + content: Text("history_dialog_delete_all_call_logs_message"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowDeleteAllHistoryPopup.toggle() historyListViewModel.callLogsAddressToDelete = "" }, - titleSecondButton: Text("Ok"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { historyListViewModel.removeCallLogs() self.isShowDeleteAllHistoryPopup.toggle() @@ -1071,11 +1070,11 @@ struct ContentView: View { if isShowDismissPopup { PopupView(isShowPopup: $isShowDismissPopup, - title: Text("Don’t save modifications?"), - content: Text("All modifications will be canceled."), - titleFirstButton: Text("Cancel"), + title: Text("contact_editor_dialog_abort_confirmation_title"), + content: Text("contact_editor_dialog_abort_confirmation_message"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: {self.isShowDismissPopup.toggle()}, - titleSecondButton: Text("Ok"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { if editContactViewModel.selectedEditFriend == nil { self.isShowDismissPopup.toggle() @@ -1155,15 +1154,15 @@ struct ContentView: View { if isShowSendCancelMeetingNotificationPopup { PopupView(isShowPopup: $isShowSendCancelMeetingNotificationPopup, - title: Text("The meeting will be cancelled"), - content: Text("Send notification to participants ?"), - titleFirstButton: Text("Cancel for me only"), + title: Text("meeting_schedule_cancel_dialog_title"), + content: Text("meeting_schedule_cancel_dialog_message"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { meetingViewModel.displayedMeeting = nil meetingsListViewModel.deleteSelectedMeeting() self.isShowSendCancelMeetingNotificationPopup.toggle( ) }, - titleSecondButton: Text("Send cancellation notifications"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { meetingViewModel.displayedMeeting = nil if let meetingToDelete = self.meetingsListViewModel.selectedMeetingToDelete { @@ -1184,11 +1183,11 @@ struct ContentView: View { isShowPopup: $isShowStartCallGroupPopup, title: Text("conversation_info_confirm_start_group_call_dialog_title"), content: Text("conversation_info_confirm_start_group_call_dialog_message"), - titleFirstButton: Text("Cancel"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowStartCallGroupPopup.toggle() }, - titleSecondButton: Text("Confirm"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { if conversationViewModel.displayedConversation != nil { conversationViewModel.displayedConversation!.createGroupCall() @@ -1208,11 +1207,11 @@ struct ContentView: View { isShowPopup: $isShowStartCallGroupPopup, title: Text("conversation_info_confirm_start_group_call_dialog_title"), content: Text("conversation_info_confirm_start_group_call_dialog_message"), - titleFirstButton: Text("Cancel"), + titleFirstButton: Text("dialog_cancel"), actionFirstButton: { self.isShowStartCallGroupPopup.toggle() }, - titleSecondButton: Text("Confirm"), + titleSecondButton: Text("dialog_ok"), actionSecondButton: { if conversationViewModel.displayedConversation != nil { conversationViewModel.displayedConversation!.createGroupCall() diff --git a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift index 1db8ebead..e4fbb984f 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ChatBubbleView.swift @@ -253,7 +253,7 @@ struct ChatBubbleView: View { VStack(spacing: 2) { if !eventLogMessage.message.messageConferenceInfo!.meetingDescription.isEmpty { - Text("Description") + Text("meeting_schedule_description_title") .default_text_style(styleSize: 14) .frame(maxWidth: .infinity, alignment: .leading) diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift index 92b798f91..f641b52cd 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationForwardMessageFragment.swift @@ -296,7 +296,7 @@ struct ConversationForwardMessageFragment: View { .frame(width: 45, height: 45) .clipShape(Circle()) - Text("Username error") + Text("username_error") .default_text_style(styleSize: 16) .frame(maxWidth: .infinity, alignment: .leading) .foregroundStyle(Color.orangeMain500) diff --git a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift index 94358cef9..d1df79eb0 100644 --- a/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift +++ b/Linphone/UI/Main/Conversations/Fragments/ConversationFragment.swift @@ -1028,7 +1028,7 @@ struct ImdnOrReactionsSheet: View { var body: some View { VStack { - Picker("Categories", selection: $selectedCategoryIndex) { + Picker("picker_categories", selection: $selectedCategoryIndex) { ForEach(0.. some View { GeometryReader { geometry in VStack(alignment: .leading) { - Text("Select \(setFromDate ? "start" : "end") \(isTimeSelection ? "time" : "date")") + Text(setFromDate ? + (isTimeSelection ? String(localized: "meeting_schedule_pick_start_time_title") : String(localized: "meeting_schedule_pick_start_date_title")) + : String(localized: "meeting_schedule_pick_end_time_title")) .default_text_style_800(styleSize: 16) .frame(alignment: .leading) .padding(.bottom, 2) @@ -433,7 +435,7 @@ struct ScheduleMeetingFragment: View { HStack { Spacer() - Text("Cancel") + Text("dialog_cancel") .default_text_style_orange_500(styleSize: 16) .onTapGesture { if isTimeSelection { @@ -442,7 +444,7 @@ struct ScheduleMeetingFragment: View { showDatePicker.toggle() } } - Text("Ok") + Text("dialog_ok") .default_text_style_orange_500(styleSize: 16) .onTapGesture { pickDate() diff --git a/Linphone/UI/Welcome/WelcomeView.swift b/Linphone/UI/Welcome/WelcomeView.swift index 76cb01ae5..73ef01cbf 100644 --- a/Linphone/UI/Welcome/WelcomeView.swift +++ b/Linphone/UI/Welcome/WelcomeView.swift @@ -41,7 +41,7 @@ struct WelcomeView: View { NavigationLink(destination: { PermissionsFragment() }, label: { - Text("Skip") + Text("welcome_carousel_skip") .underline() .default_text_style_600(styleSize: 15) @@ -98,7 +98,7 @@ struct WelcomeView: View { NavigationLink(destination: { PermissionsFragment() }, label: { - Text("Start") + Text("start") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) @@ -117,7 +117,7 @@ struct WelcomeView: View { index += 1 } }, label: { - Text("Next") + Text("next") .default_text_style_white_600(styleSize: 20) .frame(height: 35) .frame(maxWidth: .infinity) diff --git a/msgNotificationService/NotificationService.swift b/msgNotificationService/NotificationService.swift index c6f0f6189..7b6deebc9 100644 --- a/msgNotificationService/NotificationService.swift +++ b/msgNotificationService/NotificationService.swift @@ -165,7 +165,7 @@ class NotificationService: UNNotificationServiceExtension { stopCore() bestAttemptContent.sound = UNNotificationSound(named: UNNotificationSoundName(rawValue: "msg.caf")) - bestAttemptContent.title = NSLocalizedString("Message received", comment: "") + bestAttemptContent.title = String(localized: "notification_chat_message_received_title") if let subtitle = msgData?.subtitle { bestAttemptContent.subtitle = subtitle } @@ -221,11 +221,11 @@ class NotificationService: UNNotificationServiceExtension { var content = "" if message.isConferenceInvitationNew { - content = NSLocalizedString("📅 You are invited to a meeting", comment: "") + content = String(localized: "message_meeting_invitation_notification") } else if message.isConferenceInvitationUpdate { - content = NSLocalizedString("📅 Meeting has been modified", comment: "") + content = String(localized: "message_meeting_invitation_updated_notification") } else if message.isConferenceInvitationCancellation { - content = NSLocalizedString("📅 Meeting has been cancelled", comment: "") + content = String(localized: "message_meeting_invitation_cancelled_notification") } else { content = message.isText ? message.textContent! : "đŸ—»" }