From 2331dd4175794761c29a72eccd5ad5d41fb88630 Mon Sep 17 00:00:00 2001 From: spla Date: Mon, 5 Feb 2018 15:50:06 +0000 Subject: [PATCH 01/54] Translated using Weblate (Catalan) Currently translated at 100.0% (4 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/ca/ --- Riot/Assets/ca.lproj/InfoPlist.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/ca.lproj/InfoPlist.strings b/Riot/Assets/ca.lproj/InfoPlist.strings index aa2178176..e749ade1a 100644 --- a/Riot/Assets/ca.lproj/InfoPlist.strings +++ b/Riot/Assets/ca.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSCameraUsageDescription" = "La càmera s'utilitza per fer fotos i vídeos, fer vídeo conferència."; "NSPhotoLibraryUsageDescription" = "La fototeca s'utilitza per enviar fotos i vídeos."; "NSMicrophoneUsageDescription" = "El micròfon s'utilitza per fer vídeos, fer trucades."; -"NSContactsUsageDescription" = "L'agenda de contactes s'utilitza per cercar usuaris per correu electrònic o número de telèfon a Riot."; +"NSContactsUsageDescription" = "Per tal de mostrar-vos quins dels vostres contactes ja són usuaris de Riot o Matrix, podem enviar les seves adreces i números de telèfon desades a la vostra agenda cap al vostre servidor d'identitats de Matrix. El nou Vector no emmagatzema aquestes dades ni les usa per a cap altra finalitat. Per a més informació, si us plau visiteu l'apartat de política de privacitat als paràmetres de l'aplicació."; From 03d1bb29566a38f7fca99f1281d71f7f58e87f02 Mon Sep 17 00:00:00 2001 From: Scott Rothrock Date: Wed, 25 Apr 2018 05:58:00 +0000 Subject: [PATCH 02/54] Translated using Weblate (Japanese) Currently translated at 100.0% (4 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/ja/ --- Riot/Assets/ja.lproj/InfoPlist.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/ja.lproj/InfoPlist.strings b/Riot/Assets/ja.lproj/InfoPlist.strings index 27cd8cb99..3e0da6f18 100644 --- a/Riot/Assets/ja.lproj/InfoPlist.strings +++ b/Riot/Assets/ja.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSCameraUsageDescription" = "ビデオ通話や写真撮影、動画撮影などを行うときにカメラを使用します。"; "NSPhotoLibraryUsageDescription" = "フォトライブラリは、写真や動画の送信に使用されます。"; "NSMicrophoneUsageDescription" = "マイクは動画撮影や通話に使用されます。"; -"NSContactsUsageDescription" = "本体内の連絡先、アドレス帳は、Riotのユーザを電子メールアドレスや電話番号で検索する際に使用します。"; +"NSContactsUsageDescription" = "連絡先のどれがRiotまたはMatrixを既に使用しているかを表示するために、あなたのアドレス帳にあるメールアドレスと電話番号をMatrix Identity Serverに送信することができます。 新しいVectorはこのデータを保存したり、他の目的に使用したりしません。 詳細については、アプリケーション設定のプライバシーポリシーページを参照してください。"; From fcc719ad4864c1e6e1b6cd1721ead748d5facf7d Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Wed, 7 Nov 2018 07:39:58 +0000 Subject: [PATCH 03/54] Translated using Weblate (Japanese) Currently translated at 100.0% (26 of 26 strings) Translation: Riot iOS/Riot iOS (Push) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-push/ja/ --- Riot/Assets/ja.lproj/Localizable.strings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Riot/Assets/ja.lproj/Localizable.strings b/Riot/Assets/ja.lproj/Localizable.strings index b357da46d..f81b270ee 100644 --- a/Riot/Assets/ja.lproj/Localizable.strings +++ b/Riot/Assets/ja.lproj/Localizable.strings @@ -46,3 +46,7 @@ "VOICE_CONF_NAMED_FROM_USER" = "会議通話の着信 from %@: '%@'"; /* Incoming named video conference invite from a specific person */ "VIDEO_CONF_NAMED_FROM_USER" = "映像つき会議通話の着信 from %@: '%@'"; +/* A single unread message in a room */ +"SINGLE_UNREAD_IN_ROOM" = "%@にメッセージを受け取りました"; +/* A single unread message */ +"SINGLE_UNREAD" = "あなたはメッセージを受け取りました"; From 997f8903ff0f3e40d4b801e36112cd8781c2eb04 Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Thu, 8 Nov 2018 04:46:15 +0000 Subject: [PATCH 04/54] Translated using Weblate (Japanese) Currently translated at 100.0% (519 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/ja/ --- Riot/Assets/ja.lproj/Vector.strings | 102 ++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 5 deletions(-) diff --git a/Riot/Assets/ja.lproj/Vector.strings b/Riot/Assets/ja.lproj/Vector.strings index a1e6b545d..c526364de 100644 --- a/Riot/Assets/ja.lproj/Vector.strings +++ b/Riot/Assets/ja.lproj/Vector.strings @@ -11,13 +11,13 @@ "continue" = "続く"; "create" = "作成"; "start" = "開始"; -"leave" = "退室"; +"leave" = "保存しない"; "remove" = "削除"; "invite" = "招待"; "retry" = "再試行"; "on" = "オン"; "off" = "オフ"; -"cancel" = "取消"; +"cancel" = "キャンセル"; "save" = "保存"; "join" = "参加"; "decline" = "断る"; @@ -178,8 +178,8 @@ "room_participants_action_invite" = "招待"; "room_participants_action_leave" = "部屋を退室"; "room_participants_action_remove" = "部屋から退室させる"; -"room_participants_action_ban" = "この部屋から強制退去と再入室禁止"; -"room_participants_action_unban" = "再入室禁止解除"; +"room_participants_action_ban" = "この部屋からブロックする"; +"room_participants_action_unban" = "ブロック解除"; "room_participants_action_ignore" = "この参加者の発言を全て非表示にする"; "room_participants_action_unignore" = "この参加者の発言を全て表示する"; "room_participants_action_set_default_power_level" = "権限を一般参加者へ変更"; @@ -362,7 +362,7 @@ "room_details_addresses_invalid_address_prompt_msg" = "%@ は正しくない形式の住所表記です"; "room_details_addresses_disable_main_address_prompt_title" = "代表住所表記の警告"; "room_details_addresses_disable_main_address_prompt_msg" = "代表住所表記が設定されていません. この部屋の代表住所表記は無作為に選択、設定されます"; -"room_details_banned_users_section" = "再入室禁止された参加者"; +"room_details_banned_users_section" = "ブロックされたユーザー"; "room_details_advanced_section" = "拡張設定"; "room_details_advanced_room_id" = "部屋の固有ID:"; "room_details_advanced_enable_e2e_encryption" = "暗号化を開始(警告: 部屋の暗号を中止することはできません!)"; @@ -470,3 +470,95 @@ "room_details_advanced_e2e_encryption_prompt_message" = "End-to-end暗号化は実験的なものであり、信頼性が低い場合があります。\n\n発言を保護するためにはまだそれを信用すべきではありません。\n\n端末は、まだ参加する前の発言履歴を復号化することはできません。\n\n部屋の暗号化が今から有効になったら、もう無効にすることはできません。\n\n暗号化された発言は、まだ暗号化を実装していないアプリでは表示されません。"; "settings_enable_callkit" = "呼び出しの統合"; "settings_pin_rooms_with_unread" = "未読のある部屋をピン止めする"; +"title_groups" = "コミュニティ"; +"room_recents_server_notice_section" = "システムアラート"; +// Groups tab +"group_invite_section" = "招待"; +"group_section" = "コミュニティ"; +"room_message_reply_to_placeholder" = "返信を送る (暗号化されていない)…"; +"room_do_not_have_permission_to_post" = "この部屋に投稿する権限がありません"; +"encrypted_room_message_reply_to_placeholder" = "暗号化された返信を送る…"; +"room_message_reply_to_short_placeholder" = "返信を送る…"; +"room_event_action_view_decrypted_source" = "復号化されたソースを見る"; +"room_event_action_kick_prompt_reason" = "このユーザーを追放する理由"; +"room_action_send_photo_or_video" = "写真か動画を送る"; +"room_action_send_sticker" = "スタンプ送信"; +"room_replacement_information" = "この部屋は交換されており、もうアクティブではありません。"; +"room_replacement_link" = "会話はここで続けられます。"; +"room_predecessor_information" = "この部屋は別の会話の続きです。"; +"room_predecessor_link" = "より古いメッセージを見るにはここをクリックしてください。"; +"room_resource_limit_exceeded_message_contact_2_link" = "サービス管理者に連絡する"; +"room_resource_limit_exceeded_message_contact_3" = " このサービスの使用を継続するには。"; +"room_resource_usage_limit_reached_message_1_default" = "このホームサーバーはリソース制限の1つを超えています "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "このホームサーバーは月間アクティブユーザー数制限を超えています "; +"room_resource_usage_limit_reached_message_2" = "一部のユーザーはログインできなくなります。"; +"room_resource_usage_limit_reached_message_contact_3" = " この制限を増やすには。"; +"settings_deactivate_account" = "無効化したアカウント"; +"settings_labs_room_members_lazy_loading" = "遅延ロードルームのメンバー"; +"settings_labs_room_members_lazy_loading_error_message" = "あなたのホームサーバーはまだルームメンバーの遅延ロードをサポートしていません。 後で試してください。"; +"settings_deactivate_my_account" = "アカウントを無効にします"; +"room_details_flair_section" = "コミュニティの特色を表示"; +"room_details_new_flair_placeholder" = "新しいコミュニティIDを追加 (例 +foo%@)"; +"room_details_flair_invalid_id_prompt_title" = "無効な形式"; +"room_details_flair_invalid_id_prompt_msg" = "%@はコミュニティの有効な識別子ではありません"; +"room_details_fail_to_update_room_communities" = "関連コミュニティを更新できない"; +// Group Details +"group_details_title" = "コミュニティの詳細"; +"group_details_home" = "ホーム"; +"group_details_people" = "人々"; +"group_details_rooms" = "部屋"; +// Group Home +"group_home_one_member_format" = "1 メンバー"; +"group_home_multi_members_format" = "%tu メンバー"; +"group_home_one_room_format" = "1 部屋"; +"group_home_multi_rooms_format" = "%tu 部屋"; +"group_invitation_format" = "%@がこのコミュニティにあなたを招待しました"; +// Group participants +"group_participants_add_participant" = "参加者を追加"; +"group_participants_leave_prompt_title" = "グループを退出"; +"group_participants_leave_prompt_msg" = "本当にグループを退出しますか?"; +"group_participants_remove_prompt_title" = "確認"; +"group_participants_remove_prompt_msg" = "本当にこのグループから%@を削除しますか?"; +"group_participants_invite_prompt_title" = "確認"; +"group_participants_invite_prompt_msg" = "本当にこのグループに%@を招待しますか?"; +"group_participants_filter_members" = "コミュニティメンバーをフィルタリング"; +"group_participants_invite_another_user" = "ユーザーIDまたは名前による検索/招待"; +"group_participants_invite_malformed_id_title" = "招待エラー"; +"group_participants_invite_malformed_id" = "不正なID。 '@localpart:domain' のようなMatrix IDでなければなりません"; +"group_participants_invited_section" = "招待した"; +// Group rooms +"group_rooms_filter_rooms" = "コミュニティルームをフィルタリング"; +"event_formatter_rerequest_keys_part1_link" = "暗号鍵の再要求"; +"event_formatter_rerequest_keys_part2" = " あなたの他の端末から。"; +"homeserver_connection_lost" = "ホームサーバーに接続できませんでした。"; +"widget_sticker_picker_no_stickerpacks_alert" = "現在、ステッカーパックを有効にしていません。"; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "今すぐ追加しますか?"; +// Room key request dialog +"e2e_room_key_request_title" = "暗号化キー要求"; +"e2e_room_key_request_message_new_device" = "暗号化キーを要求している新しい端末 '%@'を追加しました。"; +"e2e_room_key_request_message" = "検証されていない端末 '%@'が暗号化キーを要求しています。"; +"e2e_room_key_request_start_verification" = "検証開始..."; +"e2e_room_key_request_share_without_verifying" = "検証せずに共有"; +"e2e_room_key_request_ignore_request" = "要求を無視"; +// GDPR +"gdpr_consent_not_given_alert_message" = "%@ホームサーバーを引き続き使用するには、利用規約を確認して同意する必要があります。"; +"gdpr_consent_not_given_alert_review_now_action" = "今レビュー"; +"deactivate_account_title" = "無効なアカウント"; +"deactivate_account_informations_part1" = "これにより、アカウントは永久に使用できなくなります。 ログインすることはできず、誰も同じユーザーIDを再登録することはできません。 これにより、あなたのアカウントは参加しているすべての部屋から退去し、あなたのIDサーバーからアカウントの詳細が削除されます。 "; +"deactivate_account_informations_part2_emphasize" = "この動作は元に戻せません。"; +"deactivate_account_informations_part3" = "\n\nアカウントの無効化 "; +"deactivate_account_informations_part4_emphasize" = "デフォルトではあなたが送信したメッセージを忘れることはありません。 "; +"deactivate_account_informations_part5" = "あなたのメッセージを忘れたければ、下のボックスにチェックを入れてください\n\nMatrixのメッセージの可視性はEメールと似ています。 forgettingメッセージは、送信したメッセージは新規または未登録のユーザーと共有されませんが、既にこれらのメッセージにアクセスしている登録ユーザーは引き続き自分のコピーにアクセスできます。"; +"deactivate_account_forget_messages_information_part1" = "アカウントが無効になったときに送信したすべてのメッセージを忘れてください ("; +"deactivate_account_forget_messages_information_part2_emphasize" = "警告"; +"deactivate_account_forget_messages_information_part3" = ":これは将来のユーザーに会話の不完全なビューが表示される)"; +"deactivate_account_validate_action" = "無効なアカウント"; +"deactivate_account_password_alert_title" = "無効なアカウント"; +"deactivate_account_password_alert_message" = "続行するには、パスワードを入力してください"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "リクエスト送信"; +"rerequest_keys_alert_message" = "この端末にキーを送信できるように、メッセージを復号化できる別の端末でRiotを起動してください。"; +"room_event_action_ban_prompt_reason" = "このユーザーをブロックする理由"; +"room_resource_limit_exceeded_message_contact_1" = " Please "; +"settings_ui_theme_black" = "Black"; +"settings_flair" = "特色を表示する"; From 0d68e42fb41724869fa2bbbaaaeadd413b3dc5dc Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Sat, 10 Nov 2018 14:28:08 +0100 Subject: [PATCH 05/54] Replace the deprecated MXMediaManager and MXMediaLoader interfaces use --- .../Home/GroupHomeViewController.m | 76 ++++++++++++++----- Riot/Modules/Room/RoomViewController.m | 10 +-- .../Managers/ShareExtensionManager.m | 35 +++++---- 3 files changed, 82 insertions(+), 39 deletions(-) diff --git a/Riot/Modules/Communities/Home/GroupHomeViewController.m b/Riot/Modules/Communities/Home/GroupHomeViewController.m index 62397db77..f66f9d39f 100644 --- a/Riot/Modules/Communities/Home/GroupHomeViewController.m +++ b/Riot/Modules/Communities/Home/GroupHomeViewController.m @@ -497,39 +497,73 @@ ]; // Do some sanitisation by handling the potential image + MXWeakify(self); sanitisedGroupLongDescription = [MXKTools sanitiseHTML:_group.summary.profile.longDescription withAllowedHTMLTags:allowedHTMLTags imageHandler:^NSString *(NSString *sourceURL, CGFloat width, CGFloat height) { - NSString *imageURL; + NSString *localSourcePath; if (width != -1 && height != -1) { CGSize size = CGSizeMake(width, height); - imageURL = [self.mxSession.matrixRestClient urlOfContentThumbnail:sourceURL toFitViewSize:size withMethod:MXThumbnailingMethodScale]; + // Build the cache path for the a thumbnail of this image. + NSString *cacheFilePath = [MXMediaManager thumbnailCachePathForMatrixContentURI:sourceURL + andType:nil + inFolder:kMXMediaManagerDefaultCacheFolder + toFitViewSize:size + withMethod:MXThumbnailingMethodScale]; + // Check whether the provided URL is a valid Matrix Content URI. + if (cacheFilePath) + { + localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; + + // Download the thumbnail if it is not already stored in the cache. + if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) + { + MXStrongifyAndReturnValueIfNil(self, nil); + MXWeakify(self); + [self.mxSession.mediaManager downloadThumbnailFromMatrixContentURI:sourceURL + withType:nil + inFolder:kMXMediaManagerDefaultCacheFolder + toFitViewSize:size + withMethod:MXThumbnailingMethodScale + success:^(NSString *outputFilePath) { + MXStrongifyAndReturnIfNil(self); + [self renderGroupLongDescription]; + } + failure:nil]; + } + } } else { - imageURL = [self.mxSession.matrixRestClient urlOfContent:sourceURL]; - } - - NSString *mimeType = nil; - // Check if the extension could not be deduced from url - if (![imageURL pathExtension].length) - { - // Set default mime type if no information is available - mimeType = @"image/jpeg"; - } - - NSString *cacheFilePath = [MXMediaManager cachePathForMediaWithURL:imageURL andType:mimeType inFolder:kMXMediaManagerDefaultCacheFolder]; - if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) - { - [MXMediaManager downloadMediaFromURL:imageURL andSaveAtFilePath:cacheFilePath success:^{ + // Build the cache path for this image. + NSString* cacheFilePath = [MXMediaManager cachePathForMatrixContentURI:sourceURL + andType:nil + inFolder:kMXMediaManagerDefaultCacheFolder]; + + // Check whether the provided URL is a valid Matrix Content URI. + if (cacheFilePath) + { + localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; - [self renderGroupLongDescription]; - - } failure:nil]; + // Download the image if it is not already stored in the cache. + if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) + { + MXStrongifyAndReturnValueIfNil(self, nil); + MXWeakify(self); + [self.mxSession.mediaManager downloadMediaFromMatrixContentURI:sourceURL + withType:nil + inFolder:kMXMediaManagerDefaultCacheFolder + success:^(NSString *outputFilePath) { + MXStrongifyAndReturnIfNil(self); + [self renderGroupLongDescription]; + } + failure:nil]; + } + } } + return localSourcePath; - return [NSString stringWithFormat:@"file://%@", cacheFilePath]; }]; } else diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index ea535c7c4..390979666 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -2333,7 +2333,7 @@ selectedEvent.sentState == MXEventSentStateSending) { // Upload id is stored in attachment url (nasty trick) - NSString *uploadId = roomBubbleTableViewCell.bubbleData.attachment.actualURL; + NSString *uploadId = roomBubbleTableViewCell.bubbleData.attachment.contentURL; if ([MXMediaManager existingUploaderWithId:uploadId]) { [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_send", @"Vector", nil) @@ -2357,7 +2357,7 @@ // Remove the outgoing message and its related cached file. [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath error:nil]; - [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.cacheThumbnailPath error:nil]; + [[NSFileManager defaultManager] removeItemAtPath:roomBubbleTableViewCell.bubbleData.attachment.thumbnailCachePath error:nil]; // Cancel and remove the outgoing message [self.roomDataSource.room cancelSendingOperation:selectedEvent.eventId]; @@ -2418,8 +2418,8 @@ // Check whether download is in progress if (level == 0 && selectedEvent.isMediaAttachment) { - NSString *cacheFilePath = roomBubbleTableViewCell.bubbleData.attachment.cacheFilePath; - if ([MXMediaManager existingDownloaderWithOutputFilePath:cacheFilePath]) + NSString *downloadId = roomBubbleTableViewCell.bubbleData.attachment.downloadId; + if ([MXMediaManager existingDownloaderWithIdentifier:downloadId]) { [currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_cancel_download", @"Vector", nil) style:UIAlertActionStyleDefault @@ -2432,7 +2432,7 @@ [self cancelEventSelection]; // Get again the loader - MXMediaLoader *loader = [MXMediaManager existingDownloaderWithOutputFilePath:cacheFilePath]; + MXMediaLoader *loader = [MXMediaManager existingDownloaderWithIdentifier:downloadId]; if (loader) { [loader cancel]; diff --git a/RiotShareExtension/Managers/ShareExtensionManager.m b/RiotShareExtension/Managers/ShareExtensionManager.m index 7cae6fac4..541b5892d 100644 --- a/RiotShareExtension/Managers/ShareExtensionManager.m +++ b/RiotShareExtension/Managers/ShareExtensionManager.m @@ -58,7 +58,7 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode) sharedInstance.pendingImages = [NSMutableArray array]; sharedInstance.imageUploadProgresses = [NSMutableDictionary dictionary]; - [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(onMediaUploadProgress:) name:kMXMediaUploadProgressNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(onMediaLoaderStateDidChange:) name:kMXMediaLoaderStateDidChangeNotification object:nil]; // Add observer to handle logout [[NSNotificationCenter defaultCenter] addObserver:sharedInstance selector:@selector(checkUserAccount) name:kMXKAccountManagerDidRemoveAccountNotification object:nil]; @@ -503,21 +503,30 @@ typedef NS_ENUM(NSInteger, ImageCompressionMode) #pragma mark - Notifications -- (void)onMediaUploadProgress:(NSNotification *)notification +- (void)onMediaLoaderStateDidChange:(NSNotification *)notification { - self.imageUploadProgresses[notification.object] = (NSNumber *)notification.userInfo[kMXMediaLoaderProgressValueKey]; - - if ([self.delegate respondsToSelector:@selector(shareExtensionManager:mediaUploadProgress:)]) - { - const NSInteger totalImagesCount = self.pendingImages.count; - CGFloat totalProgress = 0.0; - - for (NSNumber *progress in self.imageUploadProgresses.allValues) + MXMediaLoader *loader = (MXMediaLoader*)notification.object; + // Consider only upload progress + switch (loader.state) { + case MXMediaLoaderStateUploadInProgress: { - totalProgress += progress.floatValue/totalImagesCount; + self.imageUploadProgresses[loader.uploadId] = (NSNumber *)loader.statisticsDict[kMXMediaLoaderProgressValueKey]; + if ([self.delegate respondsToSelector:@selector(shareExtensionManager:mediaUploadProgress:)]) + { + const NSInteger totalImagesCount = self.pendingImages.count; + CGFloat totalProgress = 0.0; + + for (NSNumber *progress in self.imageUploadProgresses.allValues) + { + totalProgress += progress.floatValue/totalImagesCount; + } + + [self.delegate shareExtensionManager:self mediaUploadProgress:totalProgress]; + } + break; } - - [self.delegate shareExtensionManager:self mediaUploadProgress:totalProgress]; + default: + break; } } From 3bcdd880225d6eb4f84b6e50e568e3397700f24d Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Sun, 11 Nov 2018 15:20:32 +0100 Subject: [PATCH 06/54] MXImageView: use the new interface [setImageURI:...] instead of the deprecated one [setImageURL:...] . Note - DirectoryServerTableViewCell: Presently the thirdPartyProtocolInstance.icon is not a Matrix Content URI. We could not use here MXKImageView setImageURI method without breaking the instance icon rendering. We use the deprecated interface until this point is fixed on the server side. --- Riot/Categories/MXGroup+Riot.m | 9 +++- Riot/Categories/MXRoomSummary+Riot.m | 9 +++- Riot/Modules/Call/CallViewController.m | 21 +++++----- Riot/Modules/Call/Views/IncomingCallView.h | 19 +++++++-- Riot/Modules/Call/Views/IncomingCallView.m | 14 +++++-- .../Home/GroupHomeViewController.m | 12 ++++-- .../Rooms/Views/GroupRoomTableViewCell.m | 11 +++-- .../Details/ContactDetailsViewController.m | 13 ++++-- .../Files/CellData/FilesSearchCellData.m | 2 +- .../Files/Views/FilesSearchTableViewCell.m | 26 ++---------- .../Views/PublicRoomTableViewCell.m | 11 +++-- .../Modules/Room/DataSources/RoomDataSource.m | 2 +- .../Detail/RoomMemberDetailsViewController.m | 41 ++++++++----------- .../ReadReceiptsViewController.m | 17 ++++---- Riot/Modules/Room/RoomViewController.m | 20 ++++----- .../RoomMembershipCollapsedBubbleCell.m | 19 +++++---- .../RoomSelectedStickerBubbleCell.m | 19 ++++----- .../Title/Preview/PreviewRoomTitleView.m | 9 +++- .../Views/DirectoryServerTableViewCell.m | 9 ++++ .../Modules/Settings/SettingsViewController.m | 8 +++- 20 files changed, 168 insertions(+), 123 deletions(-) diff --git a/Riot/Categories/MXGroup+Riot.m b/Riot/Categories/MXGroup+Riot.m index 8e18f3d92..a68710c06 100644 --- a/Riot/Categories/MXGroup+Riot.m +++ b/Riot/Categories/MXGroup+Riot.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -30,7 +31,13 @@ { mxkImageView.enableInMemoryCache = YES; - [mxkImageView setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:self.profile.avatarUrl toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage]; + [mxkImageView setImageURI:self.profile.avatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:mxkImageView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:avatarImage + mediaManager:mxSession.mediaManager]; } else { diff --git a/Riot/Categories/MXRoomSummary+Riot.m b/Riot/Categories/MXRoomSummary+Riot.m index 78465b325..0367f2436 100644 --- a/Riot/Categories/MXRoomSummary+Riot.m +++ b/Riot/Categories/MXRoomSummary+Riot.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -30,7 +31,13 @@ { mxkImageView.enableInMemoryCache = YES; - [mxkImageView setImageURL:[self.mxSession.matrixRestClient urlOfContentThumbnail:self.avatar toFitViewSize:mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage]; + [mxkImageView setImageURI:self.avatar + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:mxkImageView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:avatarImage + mediaManager:self.mxSession.mediaManager]; } else { diff --git a/Riot/Modules/Call/CallViewController.m b/Riot/Modules/Call/CallViewController.m index f846a114d..b88a3e32b 100644 --- a/Riot/Modules/Call/CallViewController.m +++ b/Riot/Modules/Call/CallViewController.m @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,20 +200,17 @@ - (UIView *)createIncomingCallView { - NSString *avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.peer.avatarUrl - toFitViewSize:IncomingCallView.callerAvatarSize - withMethod:MXThumbnailingMethodCrop]; - NSString *callInfo; if (self.mxCall.isVideoCall) callInfo = NSLocalizedStringFromTable(@"call_incoming_video", @"Vector", nil); else callInfo = NSLocalizedStringFromTable(@"call_incoming_voice", @"Vector", nil); - IncomingCallView *incomingCallView = [[IncomingCallView alloc] initWithCallerAvatarURL:avatarThumbURL - placeholderImage:self.picturePlaceholder - callerName:self.peer.displayname - callInfo:callInfo]; + IncomingCallView *incomingCallView = [[IncomingCallView alloc] initWithCallerAvatar:self.peer.avatarUrl + mediaManager:self.mainSession.mediaManager + placeholderImage:self.picturePlaceholder + callerName:self.peer.displayname + callInfo:callInfo]; // Incoming call is retained by call vc so use weak to avoid retain cycle __weak typeof(self) weakSelf = self; @@ -396,8 +394,11 @@ if (peerAvatarURL) { // Retrieve the avatar in full resolution - NSString *avatarThumbURL = [self.mainSession.matrixRestClient urlOfContent:peerAvatarURL]; - [self.callerImageView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:self.picturePlaceholder]; + [self.callerImageView setImageURI:peerAvatarURL + withType:nil + andImageOrientation:UIImageOrientationUp + previewImage:self.picturePlaceholder + mediaManager:self.mainSession.mediaManager]; } else { diff --git a/Riot/Modules/Call/Views/IncomingCallView.h b/Riot/Modules/Call/Views/IncomingCallView.h index 9b437c1ee..12164d8d8 100644 --- a/Riot/Modules/Call/Views/IncomingCallView.h +++ b/Riot/Modules/Call/Views/IncomingCallView.h @@ -19,6 +19,7 @@ NS_ASSUME_NONNULL_BEGIN typedef void (^IncomingCallViewAction)(); +@class MXMediaManager; @interface IncomingCallView : UIView @@ -37,10 +38,20 @@ typedef void (^IncomingCallViewAction)(); */ @property (nonatomic, nullable, copy) IncomingCallViewAction onReject; -- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL - placeholderImage:(UIImage *)placeholderImage - callerName:(NSString *)callerName - callInfo:(NSString *)callInfo; +/** + Contructors. + + @param mxcAvatarURI the Matrix Content URI of the caller avatar. + @param mediaManager the media manager used to download this avatar if it is not cached yet. + @param placeholderImage + @param callerName + @param callInfo + */ +- (instancetype)initWithCallerAvatar:(NSString *)mxcAvatarURI + mediaManager:(MXMediaManager *)mediaManager + placeholderImage:(UIImage *)placeholderImage + callerName:(NSString *)callerName + callInfo:(NSString *)callInfo; @end diff --git a/Riot/Modules/Call/Views/IncomingCallView.m b/Riot/Modules/Call/Views/IncomingCallView.m index 0d442232c..d956cecce 100644 --- a/Riot/Modules/Call/Views/IncomingCallView.m +++ b/Riot/Modules/Call/Views/IncomingCallView.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -46,7 +47,11 @@ static const CGFloat kButtonSize = 80.0; return CGSizeMake(kAvatarSize, kAvatarSize); } -- (instancetype)initWithCallerAvatarURL:(NSString *)callerAvatarURL placeholderImage:(UIImage *)placeholderImage callerName:(NSString *)callerName callInfo:(NSString *)callInfo +- (instancetype)initWithCallerAvatar:(NSString *)mxcAvatarURI + mediaManager:(MXMediaManager *)mediaManager + placeholderImage:(UIImage *)placeholderImage + callerName:(NSString *)callerName + callInfo:(NSString *)callInfo { self = [super initWithFrame:CGRectZero]; if (self) @@ -59,10 +64,13 @@ static const CGFloat kButtonSize = 80.0; self.callerImageView.clipsToBounds = YES; self.callerImageView.mediaFolder = kMXMediaManagerAvatarThumbnailFolder; self.callerImageView.enableInMemoryCache = YES; - [self.callerImageView setImageURL:callerAvatarURL + [self.callerImageView setImageURI:mxcAvatarURI withType:nil andImageOrientation:UIImageOrientationUp - previewImage:placeholderImage]; + toFitViewSize:IncomingCallView.callerAvatarSize + withMethod:MXThumbnailingMethodCrop + previewImage:placeholderImage + mediaManager:mediaManager]; self.callerNameLabel = [[UILabel alloc] init]; self.callerNameLabel.backgroundColor = kRiotPrimaryBgColor; diff --git a/Riot/Modules/Communities/Home/GroupHomeViewController.m b/Riot/Modules/Communities/Home/GroupHomeViewController.m index f66f9d39f..54a0ad79b 100644 --- a/Riot/Modules/Communities/Home/GroupHomeViewController.m +++ b/Riot/Modules/Communities/Home/GroupHomeViewController.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -735,22 +736,25 @@ __block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero]; avatarFullScreenView.stretchable = YES; + MXWeakify(self); [avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle) { + + MXStrongifyAndReturnIfNil(self); [avatarFullScreenView dismissSelection]; [avatarFullScreenView removeFromSuperview]; avatarFullScreenView = nil; - isStatusBarHidden = NO; + self->isStatusBarHidden = NO; // Trigger status bar update [self setNeedsStatusBarAppearanceUpdate]; }]; - NSString *avatarURL = [self.mainSession.matrixRestClient urlOfContent:_group.summary.profile.avatarUrl]; - [avatarFullScreenView setImageURL:avatarURL + [avatarFullScreenView setImageURI:_group.summary.profile.avatarUrl withType:nil andImageOrientation:UIImageOrientationUp - previewImage:self.groupAvatar.image]; + previewImage:self.groupAvatar.image + mediaManager:_mxSession.mediaManager]; [avatarFullScreenView showFullScreen]; isStatusBarHidden = YES; diff --git a/Riot/Modules/Communities/Rooms/Views/GroupRoomTableViewCell.m b/Riot/Modules/Communities/Rooms/Views/GroupRoomTableViewCell.m index e57156b52..ea0d153b4 100644 --- a/Riot/Modules/Communities/Rooms/Views/GroupRoomTableViewCell.m +++ b/Riot/Modules/Communities/Rooms/Views/GroupRoomTableViewCell.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -75,11 +76,13 @@ { _roomAvatar.enableInMemoryCache = YES; - [_roomAvatar setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:groupRoom.avatarUrl - toFitViewSize:_roomAvatar.frame.size - withMethod:MXThumbnailingMethodCrop] + [_roomAvatar setImageURI:groupRoom.avatarUrl withType:nil - andImageOrientation:UIImageOrientationUp previewImage:avatarImage]; + andImageOrientation:UIImageOrientationUp + toFitViewSize:_roomAvatar.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:avatarImage + mediaManager:mxSession.mediaManager]; } else { diff --git a/Riot/Modules/Contacts/Details/ContactDetailsViewController.m b/Riot/Modules/Contacts/Details/ContactDetailsViewController.m index b4761f589..3c40ccb57 100644 --- a/Riot/Modules/Contacts/Details/ContactDetailsViewController.m +++ b/Riot/Modules/Contacts/Details/ContactDetailsViewController.m @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -1153,13 +1154,16 @@ __block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero]; avatarFullScreenView.stretchable = YES; + MXWeakify(self); [avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle) { + + MXStrongifyAndReturnIfNil(self); [avatarFullScreenView dismissSelection]; [avatarFullScreenView removeFromSuperview]; avatarFullScreenView = nil; - isStatusBarHidden = NO; + self->isStatusBarHidden = NO; // Trigger status bar update [self setNeedsStatusBarAppearanceUpdate]; }]; @@ -1168,15 +1172,16 @@ if (self.firstMatrixId) { MXUser *user = [self.mainSession userWithUserId:self.firstMatrixId]; - avatarURL = [self.mainSession.matrixRestClient urlOfContent:user.avatarUrl]; + avatarURL = user.avatarUrl; } // TODO: Display the orignal contact avatar when the contast is not a Matrix user - [avatarFullScreenView setImageURL:avatarURL + [avatarFullScreenView setImageURI:avatarURL withType:nil andImageOrientation:UIImageOrientationUp - previewImage:self.contactAvatar.image]; + previewImage:self.contactAvatar.image + mediaManager:self.mainSession.mediaManager]; [avatarFullScreenView showFullScreen]; isStatusBarHidden = YES; diff --git a/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m b/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m index 3b81c28d5..f39daa444 100644 --- a/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m +++ b/Riot/Modules/GlobalSearch/Files/CellData/FilesSearchCellData.m @@ -41,7 +41,7 @@ if ([searchDataSource.eventFormatter isSupportedAttachment:event]) { // Note: event.eventType may be equal here to MXEventTypeRoomMessage or MXEventTypeSticker - attachment = [[MXKAttachment alloc] initWithEvent:event andMatrixSession:searchDataSource.mxSession]; + attachment = [[MXKAttachment alloc] initWithEvent:event andMediaManager:searchDataSource.mxSession.mediaManager]; } // Append the file size if any diff --git a/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m b/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m index de045e5fb..29f8ccb5d 100644 --- a/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m +++ b/Riot/Modules/GlobalSearch/Files/Views/FilesSearchTableViewCell.m @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -74,29 +75,8 @@ if (bubbleData.isAttachmentWithThumbnail) { - // Set attached media folders - self.attachmentImageView.mediaFolder = bubbleData.roomId; - - NSString *mimetype = nil; - if (bubbleData.attachment.thumbnailInfo) - { - mimetype = bubbleData.attachment.thumbnailInfo[@"mimetype"]; - } - else if (bubbleData.attachment.contentInfo) - { - mimetype = bubbleData.attachment.contentInfo[@"mimetype"]; - } - - NSString *url = bubbleData.attachment.thumbnailURL; - UIImage *preview = bubbleData.attachment.previewImage; - - if (url.length || preview) - { - self.attachmentImageView.enableInMemoryCache = YES; - [self.attachmentImageView setImageURL:url withType:mimetype andImageOrientation:bubbleData.attachment.thumbnailOrientation previewImage:preview]; - - self.attachmentImageView.backgroundColor = kRiotPrimaryBgColor; - } + self.attachmentImageView.backgroundColor = kRiotPrimaryBgColor; + [self.attachmentImageView setAttachmentThumb:bubbleData.attachment]; } self.iconImage.image = [self attachmentIcon:bubbleData.attachment.type]; diff --git a/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m b/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m index 5cd611a52..a8fbca4cc 100644 --- a/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m +++ b/Riot/Modules/PublicRoomList/Views/PublicRoomTableViewCell.m @@ -1,6 +1,7 @@ /* Copyright 2015 OpenMarket Ltd Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -61,11 +62,13 @@ { _roomAvatar.enableInMemoryCache = YES; - [_roomAvatar setImageURL:[mxSession.matrixRestClient urlOfContentThumbnail:publicRoom.avatarUrl - toFitViewSize:_roomAvatar.frame.size - withMethod:MXThumbnailingMethodCrop] + [_roomAvatar setImageURI:publicRoom.avatarUrl withType:nil - andImageOrientation:UIImageOrientationUp previewImage:avatarImage]; + andImageOrientation:UIImageOrientationUp + toFitViewSize:_roomAvatar.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:avatarImage + mediaManager:mxSession.mediaManager]; } else { diff --git a/Riot/Modules/Room/DataSources/RoomDataSource.m b/Riot/Modules/Room/DataSources/RoomDataSource.m index ca861c7dc..24a60e6fd 100644 --- a/Riot/Modules/Room/DataSources/RoomDataSource.m +++ b/Riot/Modules/Room/DataSources/RoomDataSource.m @@ -304,7 +304,7 @@ if (roomMembers.count) { // Define the read receipts container, positioned on the right border of the bubble cell (Note the right margin 6 pts). - MXKReceiptSendersContainer* avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - 156, bottomPositionY - 13, 150, 12) andRestClient:self.mxSession.matrixRestClient]; + MXKReceiptSendersContainer* avatarsContainer = [[MXKReceiptSendersContainer alloc] initWithFrame:CGRectMake(bubbleCell.frame.size.width - 156, bottomPositionY - 13, 150, 12) andMediaManager:self.mxSession.mediaManager]; // Custom avatar display avatarsContainer.maxDisplayedAvatars = 5; diff --git a/Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m b/Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m index aedc8c202..5b88317b3 100644 --- a/Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m +++ b/Riot/Modules/Room/Members/Detail/RoomMemberDetailsViewController.m @@ -1101,38 +1101,31 @@ } else if (view == memberTitleView.memberAvatarMask || view == self.roomMemberAvatarMask) { - __weak typeof(self) weakSelf = self; + MXWeakify(self); // Show the avatar in full screen __block MXKImageView * avatarFullScreenView = [[MXKImageView alloc] initWithFrame:CGRectZero]; avatarFullScreenView.stretchable = YES; - [avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] handler:^(MXKImageView* imageView, NSString* buttonTitle) - { - [avatarFullScreenView dismissSelection]; - [avatarFullScreenView removeFromSuperview]; - - avatarFullScreenView = nil; - - if (weakSelf) - { - // Restore the status bar - isStatusBarHidden = NO; - typeof(self) self = weakSelf; - [self setNeedsStatusBarAppearanceUpdate]; - } - }]; + [avatarFullScreenView setRightButtonTitle:[NSBundle mxk_localizedStringForKey:@"ok"] + handler:^(MXKImageView* imageView, NSString* buttonTitle) { + + MXStrongifyAndReturnIfNil(self); + [avatarFullScreenView dismissSelection]; + [avatarFullScreenView removeFromSuperview]; + + avatarFullScreenView = nil; + + // Restore the status bar + self->isStatusBarHidden = NO; + [self setNeedsStatusBarAppearanceUpdate]; + }]; - NSString *avatarURL = nil; - if (self.mxRoomMember.avatarUrl) - { - avatarURL = [self.mainSession.matrixRestClient urlOfContent:self.mxRoomMember.avatarUrl]; - } - - [avatarFullScreenView setImageURL:avatarURL + [avatarFullScreenView setImageURI:self.mxRoomMember.avatarUrl withType:nil andImageOrientation:UIImageOrientationUp - previewImage:self.memberThumbnail.image]; + previewImage:self.memberThumbnail.image + mediaManager:self.mainSession.mediaManager]; [avatarFullScreenView showFullScreen]; diff --git a/Riot/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m b/Riot/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m index 28f0a10a5..09ffafd0c 100644 --- a/Riot/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m +++ b/Riot/Modules/Room/ReadReceiptsDetail/ReadReceiptsViewController.m @@ -1,5 +1,6 @@ /* Copyright 2017 Aram Sargsyan + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -26,7 +27,6 @@ id kRiotDesignValuesDidChangeThemeNotificationObserver; } -@property (nonatomic) MXRestClient* restClient; @property (nonatomic) MXSession *session; @property (nonatomic) NSArray *roomMembers; @@ -48,7 +48,6 @@ + (void)openInViewController:(UIViewController *)viewController fromContainer:(MXKReceiptSendersContainer *)receiptSendersContainer withSession:(MXSession *)session { ReadReceiptsViewController *receiptsController = [[[self class] alloc] initWithNibName:NSStringFromClass([self class]) bundle:nil]; - receiptsController.restClient = receiptSendersContainer.restClient; receiptsController.session = session; receiptsController.roomMembers = receiptSendersContainer.roomMembers; @@ -210,12 +209,14 @@ if (indexPath.row < self.placeholders.count) { NSString *avatarUrl = self.roomMembers[indexPath.row].avatarUrl; - if (self.restClient && avatarUrl) - { - CGFloat side = CGRectGetWidth(cell.avatarImageView.frame); - avatarUrl = [self.restClient urlOfContentThumbnail:avatarUrl toFitViewSize:CGSizeMake(side, side) withMethod:MXThumbnailingMethodCrop]; - } - [cell.avatarImageView setImageURL:avatarUrl withType:nil andImageOrientation:UIImageOrientationUp previewImage:self.placeholders[indexPath.row]]; + CGFloat side = CGRectGetWidth(cell.avatarImageView.frame); + [cell.avatarImageView setImageURI:avatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:CGSizeMake(side, side) + withMethod:MXThumbnailingMethodCrop + previewImage:self.placeholders[indexPath.row] + mediaManager:self.session.mediaManager]; } if (indexPath.row < self.receipts.count) { diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 390979666..fea0b3ca0 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -1426,14 +1426,16 @@ if (userPictureView) { UIImage *preview = [AvatarGenerator generateAvatarForMatrixItem:self.mainSession.myUser.userId withDisplayName:self.mainSession.myUser.displayname]; - NSString *avatarThumbURL = nil; - if (self.mainSession.myUser.avatarUrl) - { - // Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server - avatarThumbURL = [self.mainSession.matrixRestClient urlOfContentThumbnail:self.mainSession.myUser.avatarUrl toFitViewSize:userPictureView.frame.size withMethod:MXThumbnailingMethodCrop]; - } + + // Suppose the avatar is stored unencrypted on the Matrix media repository. userPictureView.enableInMemoryCache = YES; - [userPictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:preview]; + [userPictureView setImageURI:self.mainSession.myUser.avatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:userPictureView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:preview + mediaManager:self.mainSession.mediaManager]; [userPictureView.layer setCornerRadius:userPictureView.frame.size.width / 2]; userPictureView.clipsToBounds = YES; } @@ -1731,9 +1733,7 @@ // Set the avatar provided in preview data if (roomPreviewData.roomAvatarUrl) { - NSString *roomAvatarUrl = [self.mainSession.matrixRestClient urlOfContentThumbnail:roomPreviewData.roomAvatarUrl toFitViewSize:previewHeader.roomAvatar.frame.size withMethod:MXThumbnailingMethodCrop]; - - previewHeader.roomAvatarURL = roomAvatarUrl; + previewHeader.roomAvatarURL = roomPreviewData.roomAvatarUrl; } else if (roomPreviewData.roomId && roomPreviewData.roomName) { diff --git a/Riot/Modules/Room/Views/BubbleCells/RoomMembershipCollapsedBubbleCell.m b/Riot/Modules/Room/Views/BubbleCells/RoomMembershipCollapsedBubbleCell.m index b24f91fac..0c6bd06e4 100644 --- a/Riot/Modules/Room/Views/BubbleCells/RoomMembershipCollapsedBubbleCell.m +++ b/Riot/Modules/Room/Views/BubbleCells/RoomMembershipCollapsedBubbleCell.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -65,14 +66,8 @@ { MXKImageView *avatarView = [[MXKImageView alloc] initWithFrame:CGRectMake(12 * self.avatarsView.subviews.count, 0, 16, 16)]; - // Handle user's picture - NSString *avatarThumbURL = nil; - if (nextBubbleData.senderAvatarUrl) - { - // Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server - avatarThumbURL = [nextBubbleData.mxSession.matrixRestClient urlOfContentThumbnail:nextBubbleData.senderAvatarUrl toFitViewSize:avatarView.frame.size withMethod:MXThumbnailingMethodCrop]; - } - + // Handle user's picture by considering it is stored unencrypted on Matrix media repository + // Use the Riot style placeholder if (!nextBubbleData.senderAvatarPlaceholder) { @@ -80,7 +75,13 @@ } avatarView.enableInMemoryCache = YES; - [avatarView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage: nextBubbleData.senderAvatarPlaceholder]; + [avatarView setImageURI:nextBubbleData.senderAvatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:avatarView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:nextBubbleData.senderAvatarPlaceholder + mediaManager:nextBubbleData.mxSession.mediaManager]; // Clear the default background color of a MXKImageView instance avatarView.defaultBackgroundColor = [UIColor clearColor]; diff --git a/Riot/Modules/Room/Views/BubbleCells/RoomSelectedStickerBubbleCell.m b/Riot/Modules/Room/Views/BubbleCells/RoomSelectedStickerBubbleCell.m index 6df642c36..18a757bbb 100644 --- a/Riot/Modules/Room/Views/BubbleCells/RoomSelectedStickerBubbleCell.m +++ b/Riot/Modules/Room/Views/BubbleCells/RoomSelectedStickerBubbleCell.m @@ -86,16 +86,17 @@ self.paginationTitleView.hidden = YES; } - // Hanlde sender avatar + // Hanlde sender avatar (Supposed his avatar is stored unencrypted on Matrix media repo) self.pictureView.hidden = NO; - NSString *avatarThumbURL = nil; - if (bubbleData.senderAvatarUrl) - { - // Suppose this url is a matrix content uri, we use SDK to get the well adapted thumbnail from server - avatarThumbURL = [bubbleData.mxSession.matrixRestClient urlOfContentThumbnail:bubbleData.senderAvatarUrl toFitViewSize:self.pictureView.frame.size withMethod:MXThumbnailingMethodCrop]; - } + self.pictureView.enableInMemoryCache = YES; - [self.pictureView setImageURL:avatarThumbURL withType:nil andImageOrientation:UIImageOrientationUp previewImage: bubbleData.senderAvatarPlaceholder ? bubbleData.senderAvatarPlaceholder : self.picturePlaceholder]; + [self.pictureView setImageURI:bubbleData.senderAvatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:self.pictureView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:bubbleData.senderAvatarPlaceholder ? bubbleData.senderAvatarPlaceholder : self.picturePlaceholder + mediaManager:bubbleData.mxSession.mediaManager]; // Display sender's name except if the name appears in the displayed text (see emote and membership events) if (bubbleData.shouldHideSenderName == NO) @@ -139,8 +140,6 @@ // Display the sticker self.attachmentView.backgroundColor = [UIColor clearColor]; - self.attachmentView.mediaFolder = bubbleData.roomId; - self.attachmentView.enableInMemoryCache = YES; [self.attachmentView setAttachmentThumb:bubbleData.attachment]; // Set the description diff --git a/Riot/Modules/Room/Views/Title/Preview/PreviewRoomTitleView.m b/Riot/Modules/Room/Views/Title/Preview/PreviewRoomTitleView.m index 63c436cf0..d1c155736 100644 --- a/Riot/Modules/Room/Views/Title/Preview/PreviewRoomTitleView.m +++ b/Riot/Modules/Room/Views/Title/Preview/PreviewRoomTitleView.m @@ -1,6 +1,7 @@ /* Copyright 2016 OpenMarket Ltd Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -96,7 +97,13 @@ { if (self.roomAvatarURL) { - [self.roomAvatar setImageURL:self.roomAvatarURL withType:nil andImageOrientation:UIImageOrientationUp previewImage:[UIImage imageNamed:@"placeholder"]]; + [self.roomAvatar setImageURI:self.roomAvatarURL + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:self.roomAvatar.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:[UIImage imageNamed:@"placeholder"] + mediaManager:self.mxRoom.mxSession.mediaManager]; } else { diff --git a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m index 0cf810c26..e8b7e7bc2 100644 --- a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m +++ b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m @@ -1,5 +1,6 @@ /* Copyright 2017 Vector Creations Ltd + Copyright 2018 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -49,7 +50,15 @@ } else if (cellData.thirdPartyProtocolInstance.icon) { + // Presently the thirdPartyProtocolInstance.icon is not a Matrix Content URI. We could not use here MXKImageView setImageURI method + // without breaking the instance icon rendering. We use the deprecated interface until this point is fixed on the server side. + // TODO: MEDIA: remove the deprecated interface use. [self.iconImageView setImageURL:cellData.thirdPartyProtocolInstance.icon withType:nil andImageOrientation:UIImageOrientationUp previewImage:[UIImage imageNamed:@"placeholder"]]; +// [self.iconImageView setImageURI:cellData.thirdPartyProtocolInstance.icon +// withType:nil +// andImageOrientation:UIImageOrientationUp +// previewImage:[UIImage imageNamed:@"placeholder"] +// mediaManager:cellData.mediaManager]; } else { diff --git a/Riot/Modules/Settings/SettingsViewController.m b/Riot/Modules/Settings/SettingsViewController.m index 9fc346cd5..04acf5dc6 100644 --- a/Riot/Modules/Settings/SettingsViewController.m +++ b/Riot/Modules/Settings/SettingsViewController.m @@ -1451,7 +1451,13 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)(); { profileCell.mxkImageView.enableInMemoryCache = YES; - [profileCell.mxkImageView setImageURL:[session.matrixRestClient urlOfContentThumbnail:myUser.avatarUrl toFitViewSize:profileCell.mxkImageView.frame.size withMethod:MXThumbnailingMethodCrop] withType:nil andImageOrientation:UIImageOrientationUp previewImage:avatarImage]; + [profileCell.mxkImageView setImageURI:myUser.avatarUrl + withType:nil + andImageOrientation:UIImageOrientationUp + toFitViewSize:profileCell.mxkImageView.frame.size + withMethod:MXThumbnailingMethodCrop + previewImage:avatarImage + mediaManager:session.mediaManager]; } else { From a39806725d648ce419ea2d6f9a389fddf601a77e Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Sun, 11 Nov 2018 16:50:00 +0100 Subject: [PATCH 07/54] Update Changes --- CHANGES.rst | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 7d86c104c..dac886b66 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,49 +1,56 @@ +Changes in 0.7.x (2018-xx-xx) +=============================================== + +Improvements: + * Replace the deprecated MXMediaManager and MXMediaLoader interfaces use (see matrix-org/matrix-ios-sdk/pull/593). + * Replace the deprecated MXKAttachment and MXKImageView interfaces use (see matrix-org/matrix-ios-kit/pull/487). + Changes in 0.7.7 (2018-10-31) =============================================== Improvements: -* Upgrade MatrixKit version (v0.8.6). + * Upgrade MatrixKit version (v0.8.6). Bug fix: -* Notifications: old notifications can reappear (#1985). + * Notifications: old notifications can reappear (#1985). Changes in 0.7.6 (2018-10-05) =============================================== Bug fix: -* Wrong version number. + * Wrong version number. Changes in 0.7.5 (2018-10-05) =============================================== Improvements: -* Upgrade MatrixKit version (v0.8.5). -* Server Quota Notices: Implement the blue banner (#1937). + * Upgrade MatrixKit version (v0.8.5). + * Server Quota Notices: Implement the blue banner (#1937). Changes in 0.7.4 (2018-09-26) =============================================== Improvements: -* Upgrade MatrixKit version (v0.8.4). -* Lazy loading: Enable it by default (if the homeserver supports it). -* i18n: Add Spanish (sp). -* Settings: Make advanced info copyable (#2023). -* Settings: Made cryptography info copyable, thanks to @daverPL (PR #1999). -* Room settings: Anyone can now set a room alias (#2033). + * Upgrade MatrixKit version (v0.8.4). + * Lazy loading: Enable it by default (if the homeserver supports it). + * i18n: Add Spanish (sp). + * Settings: Make advanced info copyable (#2023). + * Settings: Made cryptography info copyable, thanks to @daverPL (PR #1999). + * Room settings: Anyone can now set a room alias (#2033). Bug fix: -* Fix missing read receipts when lazy-loading room members. -* Weird text color when selecting a message (#2046). + * Fix missing read receipts when lazy-loading room members. + * Weird text color when selecting a message (#2046). Changes in 0.7.3 (2018-08-27) =============================================== Improvements: -* Upgrade MatrixKit version (v0.8.3). + * Upgrade MatrixKit version (v0.8.3). Bug fix: -* Fix input toolbar reset in RoomViewController on MXSession state change (#2006 and #2008). -* Fix user interaction disabled in master view of UISplitViewContoller when selecting a room (#2005). + * Fix input toolbar reset in RoomViewController on MXSession state change (#2006 and #2008). + * Fix user interaction disabled in master view of UISplitViewContoller when selecting a room (#2005). Changes in 0.7.2 (2018-08-24) =============================================== From fe2d2126645b848d277a39bf662016520abb5d1a Mon Sep 17 00:00:00 2001 From: spla Date: Mon, 12 Nov 2018 11:47:24 +0000 Subject: [PATCH 08/54] Translated using Weblate (Catalan) Currently translated at 100.0% (519 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/ca/ --- Riot/Assets/ca.lproj/Vector.strings | 47 +++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Riot/Assets/ca.lproj/Vector.strings b/Riot/Assets/ca.lproj/Vector.strings index b95257160..9bb795aac 100644 --- a/Riot/Assets/ca.lproj/Vector.strings +++ b/Riot/Assets/ca.lproj/Vector.strings @@ -508,3 +508,50 @@ "e2e_room_key_request_share_without_verifying" = "Comparteix sense verificar"; "e2e_room_key_request_ignore_request" = "Ignora la sol·licitud"; "room_do_not_have_permission_to_post" = "No tens permisos per publicar en aquesta sala"; +"room_recents_server_notice_section" = "Alertes del sistema"; +"room_message_reply_to_placeholder" = "Envia una resposta (no xifrada)…"; +"encrypted_room_message_reply_to_placeholder" = "Envia una resposta xifrada…"; +"room_message_reply_to_short_placeholder" = "Envia una resposta…"; +"room_event_action_view_decrypted_source" = "Veure la font no xifrada"; +"room_event_action_kick_prompt_reason" = "Raó per a fer fora aquest usuari"; +"room_event_action_ban_prompt_reason" = "Raó per a prohibir aquest usuari"; +"room_action_send_photo_or_video" = "Envia foto o vídeo"; +"room_action_send_sticker" = "Envia adhesiu"; +"room_replacement_information" = "Aquesta sala s'ha substituït i ja no està activa."; +"room_replacement_link" = "La conversa continua aquí."; +"room_predecessor_information" = "Aquesta sala és una continuació d'una altra conversa."; +"room_predecessor_link" = "Fes clic aquí per veure missatges antics."; +"room_resource_limit_exceeded_message_contact_1" = " Si us plau "; +"room_resource_limit_exceeded_message_contact_2_link" = "Posa't en contacte amb l'administrador del servei"; +"room_resource_limit_exceeded_message_contact_3" = " per a continuar usant aquest servei."; +"room_resource_usage_limit_reached_message_1_default" = "Aquest servidor ha superat un dels seus límits de recursos per tant "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Aquest servidor ha arribat al seu límit d'usuaris actius mensuals "; +"room_resource_usage_limit_reached_message_2" = "alguns usuaris no podran iniciar sessió."; +"room_resource_usage_limit_reached_message_contact_3" = " per augmentar aquest límit."; +"settings_deactivate_account" = "Desactivar compte"; +"settings_labs_room_members_lazy_loading" = "Membres de les sales de càrrega lenta"; +"settings_labs_room_members_lazy_loading_error_message" = "El teu servidor encara no admet càrregues lentes de membres de la sala. Prova-ho més tard."; +"settings_deactivate_my_account" = "Desactivar el meu compte"; +"event_formatter_rerequest_keys_part1_link" = "Re-sol·licita les claus de xifratge"; +"event_formatter_rerequest_keys_part2" = " des d'els teus altres dispositius."; +"homeserver_connection_lost" = "No s'ha pogut connectar amb el servidor."; +"widget_sticker_picker_no_stickerpacks_alert" = "Actualment no tens cap etiqueta adhesiva activada."; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Afegir alguns ara?"; +// GDPR +"gdpr_consent_not_given_alert_message" = "Per a continuar utilitzant el servidor %@ has de revisar i acceptar els termes i condicions."; +"gdpr_consent_not_given_alert_review_now_action" = "Revisa ara"; +"deactivate_account_title" = "Desactiva el compte"; +"deactivate_account_informations_part1" = "Això farà que el teu compte no es pugui utilitzar de manera permanent. No podràs iniciar sessió i ningú no podrà tornar a registrar la mateixa identificació d'usuari. Això farà que el teu compte deixi totes les sales on participa i eliminarà els detalls del teu compte del teu servidor d'identitat. "; +"deactivate_account_informations_part2_emphasize" = "Aquesta acció és irreversible."; +"deactivate_account_informations_part3" = "\n\nDesactivant el teu compte "; +"deactivate_account_informations_part4_emphasize" = "no per defecte ens obliga a oblidar els missatges que has enviat. "; +"deactivate_account_informations_part5" = "Si vols que oblidem els teus missatges, marca el quadre següent\n\nLa visibilitat del missatge a Matrix és similar al correu electrònic. L'oblit dels teus missatges significa que els missatges que has enviat no es compartiran amb cap usuari nou o no registrat però els usuaris registrats que ja tenen accés a aquests missatges encara tindran accés a la seva còpia."; +"deactivate_account_forget_messages_information_part1" = "Si us plau oblida tots els missatges que he enviat quan el meu compte estigui desactivat ("; +"deactivate_account_forget_messages_information_part2_emphasize" = "Avís"; +"deactivate_account_forget_messages_information_part3" = ": això farà que els usuaris futurs vegin una vista incompleta de les converses)"; +"deactivate_account_validate_action" = "Desactiva el compte"; +"deactivate_account_password_alert_title" = "Desactiva el compte"; +"deactivate_account_password_alert_message" = "Per a continuar si us plau introdueix la teva contrasenya"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "Sol·licitud enviada"; +"rerequest_keys_alert_message" = "Inicia Riot en un altre dispositiu que pugui desxifrar el missatge per que pugui enviar les claus a aquest dispositiu."; From 488c6ccfc84d5a75170c7d9519668bf9c8aafb35 Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Tue, 13 Nov 2018 00:08:35 +0100 Subject: [PATCH 09/54] Remove all deprecated methods --- .../Views/DirectoryServerTableViewCell.m | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m index e8b7e7bc2..617b0b400 100644 --- a/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m +++ b/Riot/Modules/Rooms/DirectoryPicker/Views/DirectoryServerTableViewCell.m @@ -50,15 +50,20 @@ } else if (cellData.thirdPartyProtocolInstance.icon) { - // Presently the thirdPartyProtocolInstance.icon is not a Matrix Content URI. We could not use here MXKImageView setImageURI method - // without breaking the instance icon rendering. We use the deprecated interface until this point is fixed on the server side. - // TODO: MEDIA: remove the deprecated interface use. - [self.iconImageView setImageURL:cellData.thirdPartyProtocolInstance.icon withType:nil andImageOrientation:UIImageOrientationUp previewImage:[UIImage imageNamed:@"placeholder"]]; -// [self.iconImageView setImageURI:cellData.thirdPartyProtocolInstance.icon -// withType:nil -// andImageOrientation:UIImageOrientationUp -// previewImage:[UIImage imageNamed:@"placeholder"] -// mediaManager:cellData.mediaManager]; + // Presently the thirdPartyProtocolInstance.icon is not a Matrix Content URI (https://github.com/matrix-org/synapse/issues/4175). + // Patch: We extract the expected URI from the URL + NSString *iconURL = cellData.thirdPartyProtocolInstance.icon; + NSString *mxMediaPrefix = [NSString stringWithFormat:@"/%@/download/", kMXContentPrefixPath]; + NSRange range = [iconURL rangeOfString:mxMediaPrefix]; + if (range.location != NSNotFound) + { + iconURL = [NSString stringWithFormat:@"%@%@", kMXContentUriScheme, [iconURL substringFromIndex:range.location + range.length]]; + } + [self.iconImageView setImageURI:iconURL + withType:nil + andImageOrientation:UIImageOrientationUp + previewImage:[UIImage imageNamed:@"placeholder"] + mediaManager:cellData.mediaManager]; } else { From 3c0ab58ebc5c993340ed95a41009e671a44ebe2a Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Tue, 13 Nov 2018 16:12:54 +0100 Subject: [PATCH 10/54] Move MXStrongifyAndReturnValueIfNil(self, nil); at the beginning of the block. --- Riot/Modules/Communities/Home/GroupHomeViewController.m | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Riot/Modules/Communities/Home/GroupHomeViewController.m b/Riot/Modules/Communities/Home/GroupHomeViewController.m index 54a0ad79b..8f2563729 100644 --- a/Riot/Modules/Communities/Home/GroupHomeViewController.m +++ b/Riot/Modules/Communities/Home/GroupHomeViewController.m @@ -501,6 +501,7 @@ MXWeakify(self); sanitisedGroupLongDescription = [MXKTools sanitiseHTML:_group.summary.profile.longDescription withAllowedHTMLTags:allowedHTMLTags imageHandler:^NSString *(NSString *sourceURL, CGFloat width, CGFloat height) { + MXStrongifyAndReturnValueIfNil(self, nil); NSString *localSourcePath; if (width != -1 && height != -1) @@ -520,7 +521,6 @@ // Download the thumbnail if it is not already stored in the cache. if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) { - MXStrongifyAndReturnValueIfNil(self, nil); MXWeakify(self); [self.mxSession.mediaManager downloadThumbnailFromMatrixContentURI:sourceURL withType:nil @@ -550,7 +550,6 @@ // Download the image if it is not already stored in the cache. if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) { - MXStrongifyAndReturnValueIfNil(self, nil); MXWeakify(self); [self.mxSession.mediaManager downloadMediaFromMatrixContentURI:sourceURL withType:nil From 3f8cb7356270b0c74252fdc14034bd5e21d2f8e4 Mon Sep 17 00:00:00 2001 From: Giom Foret Date: Tue, 13 Nov 2018 17:30:37 +0100 Subject: [PATCH 11/54] Fix a race condition observed when the app renders an image in a Group/Community description --- .../Communities/Home/GroupHomeViewController.m | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Riot/Modules/Communities/Home/GroupHomeViewController.m b/Riot/Modules/Communities/Home/GroupHomeViewController.m index 8f2563729..247b49521 100644 --- a/Riot/Modules/Communities/Home/GroupHomeViewController.m +++ b/Riot/Modules/Communities/Home/GroupHomeViewController.m @@ -516,8 +516,6 @@ // Check whether the provided URL is a valid Matrix Content URI. if (cacheFilePath) { - localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; - // Download the thumbnail if it is not already stored in the cache. if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) { @@ -529,10 +527,15 @@ withMethod:MXThumbnailingMethodScale success:^(NSString *outputFilePath) { MXStrongifyAndReturnIfNil(self); - [self renderGroupLongDescription]; + [self refreshGroupLongDescription]; } failure:nil]; } + else + { + // Update the local path + localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; + } } } else @@ -545,8 +548,6 @@ // Check whether the provided URL is a valid Matrix Content URI. if (cacheFilePath) { - localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; - // Download the image if it is not already stored in the cache. if (![[NSFileManager defaultManager] fileExistsAtPath:cacheFilePath]) { @@ -556,10 +557,15 @@ inFolder:kMXMediaManagerDefaultCacheFolder success:^(NSString *outputFilePath) { MXStrongifyAndReturnIfNil(self); - [self renderGroupLongDescription]; + [self refreshGroupLongDescription]; } failure:nil]; } + else + { + // Update the local path + localSourcePath = [NSString stringWithFormat:@"file://%@", cacheFilePath]; + } } } return localSourcePath; From 8b0531f925b52a3957e1d6b6e3e2e4fc96f21532 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 08:09:17 +0000 Subject: [PATCH 12/54] Translated using Weblate (Albanian) Currently translated at 100.0% (4 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/sq/ --- Riot/Assets/sq.lproj/InfoPlist.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/sq.lproj/InfoPlist.strings b/Riot/Assets/sq.lproj/InfoPlist.strings index acf7ceec8..ede69c765 100644 --- a/Riot/Assets/sq.lproj/InfoPlist.strings +++ b/Riot/Assets/sq.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSCameraUsageDescription" = "Kamera përdoret për të bërë foto dhe regjistruar video, dhe për të bërë thirrje video."; "NSPhotoLibraryUsageDescription" = "Fototeka përdoret për të dërguar foto dhe video."; "NSMicrophoneUsageDescription" = "Mikrofoni përdoret për të regjistruar video, dhe për të bërë thirrje."; -"NSContactsUsageDescription" = "Libri i kontakteve përdoret për të kërkuar për përdorues sipas email-i ose numri telefoni në Riot."; +"NSContactsUsageDescription" = "Që të mund t’ju shfaqim se cilët prej kontakteve tuaj përdorin tashmë Riot ose Matrix, mund të dërgojmë adresat email dhe numrat e telefonave nga libri juaj i adresave te Shërbyesi Matrix i Identiteteve. Vektori i ri nuk i depoziton këto të dhëna apo t’i përdorë për ndonjë qëllim tjetër. Për më tepër të dhëna, shihni faqen e rregullave të privatësisë, te rregullimet e aplikacionit."; From 683832324819454616a1ed45693fafb47275c31f Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 12:21:41 +0000 Subject: [PATCH 13/54] Translated using Weblate (Albanian) Currently translated at 84.9% (441 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 98 ++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 10 deletions(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index bca8dc756..734143e4d 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -5,7 +5,7 @@ "title_groups" = "Bashkësi"; "warning" = "Sinjalizim"; // Actions -"view" = "Shiheni"; +"view" = "Parje"; "next" = "Pasuesja"; "back" = "Mbrapsht"; "continue" = "Vazhdo"; @@ -170,7 +170,7 @@ "room_many_users_are_typing" = "%@, %@ & të tjerë po shtyin…"; "room_message_placeholder" = "Dërgojni një mesazh (të pafshehtëzuar)…"; "room_do_not_have_permission_to_post" = "S’keni leje të postoni në këtë dhomë"; -"encrypted_room_message_placeholder" = "Dërgoni një mesazh të fshehtëzuar…"; +"encrypted_room_message_placeholder" = "Dërgoni një mesazhi të fshehtëzuar…"; "room_message_short_placeholder" = "Dërgoni një mesazh…"; "room_offline_notification" = "Humbi lidhja me shërbyesin."; "room_unsent_messages_notification" = "Mesazhet s’u dërguan. %@ apo %@ tani?"; @@ -384,12 +384,90 @@ "e2e_room_key_request_share_without_verifying" = "Ndaje pa e verifikuar"; "e2e_room_key_request_ignore_request" = "Shpërfille kërkesën"; "auth_user_id_placeholder" = "Email ose emër përdoruesi"; -"auth_invalid_user_name" = "Emri përdoruesi mund të përmban vetëm shkronja, numra, pika, viza lidhëse dhe nënvije"; -"auth_reset_password_email_validation_message" = "Një e-mail të është dërguar në %@. Pasi ke ndjekur lidhjen që përmban, kliko përfundi."; -"auth_reset_password_next_step_button" = "Kam vërtetuar adresën e-mail-i time"; +"auth_invalid_user_name" = "Emrat e përdoruesve mund të përmbajë vetëm shkronja, numra, pika, vija ndarëse dhe nënvija"; +"auth_reset_password_email_validation_message" = "Te %@ u dërgua një email. Pasi të ndiqni lidhjen që përmban, klikoni më poshtë."; +"auth_reset_password_next_step_button" = "E kam verifikuar adresën time email"; "on" = "Aktivizuar"; -"auth_add_phone_message" = "Shtoja një adresë e-mail-i llogarisë tënde për të mundur përdoruesit të te zbulojnë."; -"auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Të lutem fute kodin përposh."; -"auth_recaptcha_message" = "Ky server shtëpiak kishte dashur të sigurohet se nuk je robot"; -"auth_reset_password_error_unauthorized" = "Vërtetimi i adresës e-mail-i dështoi: sigurohu se ke klikuar lidhjen në e-mail"; -"auth_reset_password_error_not_found" = "Adresa e-mail-i yt nuk duket se është e lidhur me një ID matrix-i në këtë server shtëpiak."; +"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë."; +"auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Ju lutemi, jepeni këtë kod më poshtë."; +"auth_recaptcha_message" = "Ky Shërbyes Home do të donte të sigurohej se s’jeni robot"; +"auth_reset_password_error_unauthorized" = "Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i"; +"auth_reset_password_error_not_found" = "Adresa juaj email s’duket të jetë e përshoqëruar me ID Matrix në këtë shërbyes Home."; +"title_favourites" = "Të parapëlqyer"; +"join" = "Merrni pjesë"; +"auth_add_email_message" = "Shtoni te llogaria juaj një adresë email, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë dhe që t’ju lejojë të ricaktoni fjalëkalimin."; +"auth_add_email_phone_message" = "Shtoni te llogaria juaj një adresë email dhe/ose një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; +"auth_add_email_and_phone_message" = "Shtoni te llogaria juaj një adresë email dhe një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; +"auth_use_server_options" = "Përdor mundësi vetjake shërbyesi (e përparuar)"; +"auth_add_email_and_phone_warning" = "Regjistrimi me email dhe me numër telefoni njëherazi nuk mbulohet ende, deri sa të ketë API. Do të merret parasysh vetëm numri i telefonit. Email-in tuaj mund ta shtoni te profili juaj, te rregullimet."; +"room_creation_appearance_picture" = "Foto fjalosjeje (në daçi)"; +"room_creation_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi, Emri ose email-i"; +"room_recents_favourites_section" = "TË PARAPALQYERA"; +"room_recents_server_notice_section" = "SINJALIZIME SISTEMI"; +"room_recents_join_room_title" = "Hyni në një dhomë"; +"room_participants_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi, Emri ose email-i"; +"room_participants_action_ignore" = "Fshihi krejt mesazhet nga ky përdorues"; +"room_participants_action_unignore" = "Shfaq krejt mesazhet nga ky përdorues"; +"room_message_reply_to_placeholder" = "Dërgoni një përgjigje (të pafshehtëzuar)…"; +"encrypted_room_message_reply_to_placeholder" = "Dërgoni një përgjigje të fshehtëzuar…"; +"room_message_reply_to_short_placeholder" = "Dërgoni një përgjigje…"; +"room_resend_unsent_messages" = "Ridërgo mesazhet e padërguara"; +"room_event_action_view_decrypted_source" = "Shihni Burim të Shfshehtëzuar"; +"room_event_action_kick_prompt_reason" = "Arsye për përzënien e këtij përdoruesi"; +"room_event_action_ban_prompt_reason" = "Arsye për dëbimin e këtij përdoruesi"; +"room_action_send_photo_or_video" = "Dërgoni foto ose video"; +"room_replacement_link" = "Biseda vazhdon këtu."; +"room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër"; +"room_resource_limit_exceeded_message_contact_1" = " Ju lutemi, "; +"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin e shërbimit tuaj"; +"room_resource_limit_exceeded_message_contact_3" = " që të vazhdoni përdorimin e këtij shërbimi."; +"room_resource_usage_limit_reached_message_2" = "disa përdorues s’do të jenë në gjendje të bëjnë hyrjen."; +"room_resource_usage_limit_reached_message_contact_3" = " për ta zmadhuar këtë kufi."; +// Unknown devices +"unknown_devices_alert_title" = "Dhoma përmban pajisje të panjohura"; +"settings_deactivate_account" = "ÇAKTIVIZOJE LLOGARINË"; +"settings_fail_to_update_profile" = "S’arrihet të përditësohet profili"; +"settings_pin_rooms_with_missed_notif" = "Fikso dhomat me njoftime të humbura"; +"settings_pin_rooms_with_unread" = "Fikso dhomat me mesazhe të palexuar"; +"settings_labs_create_conference_with_jitsi" = "Krijoni thirrje konferencë me Jitsi-n"; +"settings_fail_to_update_password" = "S’arrihet të përditësohet fjalëkalimi"; +"settings_deactivate_my_account" = "Çaktivizoje llogarinë time"; +"room_details_mute_notifs" = "Heshtoji njoftimet"; +"room_details_access_section_no_address_warning" = "Që të lidhni një dhomë, ajo duhet të ketë një adresë"; +"room_details_new_address_placeholder" = "Shtoni adresë të re (p.sh. #foo%@)"; +"room_details_new_flair_placeholder" = "Shtoni ID bashkësie të re (e.g. +foo%@)"; +"room_details_fail_to_update_avatar" = "S’arrihet të përditësohet fotoja e dhomës"; +"room_details_fail_to_update_room_name" = "S’arrihet të përditësohet emri i dhomës"; +"room_details_fail_to_update_topic" = "S’arrihet të përditësohet tema"; +"room_details_fail_to_update_room_join_rule" = "S’arrihet të përditësohet rregulli për pjesëmarrje"; +"room_details_fail_to_update_room_directory_visibility" = "S’arrihet të përditësohet dukshmëria e drejtorisë së dhomave"; +"room_details_fail_to_update_history_visibility" = "S’arrihet të përditësohet dukshmëria e historikut"; +"room_details_fail_to_remove_room_aliases" = "S’arrihet të hiqen adresat e dhomës"; +"room_details_fail_to_update_room_canonical_alias" = "S’arrihet të përditësohet adresa kryesore"; +"room_details_fail_to_update_room_communities" = "S’arrihet të përditësohen bashkësitë e afërta"; +"room_details_fail_to_enable_encryption" = "S’arrihet të aktivizohet fshehtëzimi në këtë dhomë"; +"group_home_multi_members_format" = "Anëtarë %tu"; +"group_home_multi_rooms_format" = "Dhoma %tu"; +"group_participants_invite_another_user" = "Kërkoni / ftoni sipas ID-je Përdoruesi ose Emri"; +"directory_server_all_native_rooms" = "Krejt dhomat origjinale nën Matrix"; +"event_formatter_widget_added" = "Widget-i %@ u shtua nga %@"; +"event_formatter_widget_removed" = "Widget-i %@ u hoq nga %@"; +"event_formatter_rerequest_keys_part1_link" = "Rikërko kyçe fshehtëzimi"; +"event_formatter_rerequest_keys_part2" = " nga pajisje tuajat të tjera."; +// Others +"or" = "ose"; +"homeserver_connection_lost" = "S’u lidh dot te shërbyesu Home."; +"call_jitsi_error" = "S'u arrit të hyhej në thirrjen për konferencë."; +"widget_creation_failure" = "Krijimi i widget-it dështoi"; +"widget_sticker_picker_no_stickerpacks_alert_add_now" = "Të shtohen ca tani?"; +"widget_integration_room_not_visible" = "Dhoma %s s’është e dukshme."; +"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojeni tani"; +"deactivate_account_title" = "Çaktivizoni Llogarinë"; +"deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm"; +"deactivate_account_informations_part3" = "\n\nPo çaktivizohet llogaria juaj "; +"deactivate_account_forget_messages_information_part2_emphasize" = "Kujdes"; +"deactivate_account_validate_action" = "Çaktivizoje llogarinë"; +"deactivate_account_password_alert_title" = "Çaktivizoni Llogarinë"; +"deactivate_account_password_alert_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin tuaj"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "Kërkesa u Dërgua"; From ab8f147f78f453c1d3252131e57cb2099b685021 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 14:58:40 +0000 Subject: [PATCH 14/54] Translated using Weblate (Albanian) Currently translated at 98.4% (511 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 110 +++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 17 deletions(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 734143e4d..84e7f7e96 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -99,7 +99,7 @@ "people_conversation_section" = "BISEDA"; "people_no_conversation" = "S’ka biseda"; // Rooms tab -"room_directory_no_public_room" = "S’k a dhoma publike"; +"room_directory_no_public_room" = "S’ka dhoma publike"; // Groups tab "group_invite_section" = "FTESA"; "group_section" = "BASHKËSI"; @@ -108,7 +108,7 @@ "search_messages" = "Mesazhe"; "search_people" = "Persona"; "search_files" = "Kartela"; -"search_default_placeholder" = "Kërko"; +"search_default_placeholder" = "Kërkoni"; "search_people_placeholder" = "Kërkoni sipas ID-je Përdoruesi, Emri ose email-i"; "search_no_result" = "S’ka përfundime"; "search_in_progress" = "Po kërkohet…"; @@ -153,10 +153,10 @@ "room_participants_action_invite" = "Ftoje"; "room_participants_action_leave" = "Braktiseni këtë dhomë"; "room_participants_action_remove" = "Hiqeni prej kësaj dhome"; -"room_participants_action_unban" = "Zhdëboje"; +"room_participants_action_unban" = "Hiqi dëbimin"; "room_participants_action_set_default_power_level" = "Riktheje në përdorues normal"; "room_participants_action_set_moderator" = "Kaloje moderator"; -"room_participants_action_set_admin" = "Kalojeni përgjegjës"; +"room_participants_action_set_admin" = "Kaloje përgjegjës"; "room_participants_action_start_new_chat" = "Filloni fjalosje të re"; "room_participants_action_start_voice_call" = "Nis thirrje audio"; "room_participants_action_start_video_call" = "Nis thirrje video"; @@ -167,8 +167,8 @@ "room_new_messages_notification" = "%d mesazhe të rinj"; "room_one_user_is_typing" = "%@ po shtyp…"; "room_two_users_are_typing" = "%@ & %@ po shtypin…"; -"room_many_users_are_typing" = "%@, %@ & të tjerë po shtyin…"; -"room_message_placeholder" = "Dërgojni një mesazh (të pafshehtëzuar)…"; +"room_many_users_are_typing" = "%@, %@ & të tjerë po shtypin…"; +"room_message_placeholder" = "Dërgoni një mesazh (të pafshehtëzuar)…"; "room_do_not_have_permission_to_post" = "S’keni leje të postoni në këtë dhomë"; "encrypted_room_message_placeholder" = "Dërgoni një mesazhi të fshehtëzuar…"; "room_message_short_placeholder" = "Dërgoni një mesazh…"; @@ -249,7 +249,7 @@ "settings_ui_theme_dark" = "E errët"; "settings_ui_theme_black" = "E zezë"; "settings_ui_theme_picker_title" = "Përzgjidhni temë"; -"settings_unignore_user" = "Shfaq krejt mesazhet nga %@?"; +"settings_unignore_user" = "Të shfaqen krejt mesazhet nga %@?"; "settings_contacts_phonebook_country" = "Vend libri telefonash"; "settings_labs_e2e_encryption" = "Fshehtëzim Skaj-Më-Skaj"; "settings_version" = "Version %@"; @@ -304,7 +304,7 @@ "room_details_advanced_e2e_encryption_enabled" = "Në këtë dhomë është i aktivizuar fshehtëzimi"; "room_details_advanced_e2e_encryption_disabled" = "Në këtë dhomë s’është i aktivizuar fshehtëzimi."; "room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Fshehtëzo vetëm për pajisje të verifikuara"; -"room_details_fail_to_add_room_aliases" = "S’u arrit të shtoheshin adresa dhome të re"; +"room_details_fail_to_add_room_aliases" = "S’arrihet të shtohen adresa dhomash të reja"; "room_details_save_changes_prompt" = "Doni të ruhen ndryshimet?"; "room_details_set_main_address" = "Caktoje si Adresë Kryesore"; "room_details_unset_main_address" = "Hiqe Nga Adresë Kryesore"; @@ -351,7 +351,7 @@ "you" = "Ju"; "today" = "Sot"; "yesterday" = "Dje"; -"network_offline_prompt" = "Lidhja Internet duket se është jashtë linje."; +"network_offline_prompt" = "Lidhja Internet duket se s’funksionin."; "public_room_section_title" = "Dhoma Publike (at %@):"; "do_not_ask_again" = "Mos pyet sërish"; // Call @@ -387,7 +387,7 @@ "auth_invalid_user_name" = "Emrat e përdoruesve mund të përmbajë vetëm shkronja, numra, pika, vija ndarëse dhe nënvija"; "auth_reset_password_email_validation_message" = "Te %@ u dërgua një email. Pasi të ndiqni lidhjen që përmban, klikoni më poshtë."; "auth_reset_password_next_step_button" = "E kam verifikuar adresën time email"; -"on" = "Aktivizuar"; +"on" = "On"; "auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë."; "auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Ju lutemi, jepeni këtë kod më poshtë."; "auth_recaptcha_message" = "Ky Shërbyes Home do të donte të sigurohej se s’jeni robot"; @@ -417,9 +417,9 @@ "room_event_action_ban_prompt_reason" = "Arsye për dëbimin e këtij përdoruesi"; "room_action_send_photo_or_video" = "Dërgoni foto ose video"; "room_replacement_link" = "Biseda vazhdon këtu."; -"room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër"; +"room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër."; "room_resource_limit_exceeded_message_contact_1" = " Ju lutemi, "; -"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin e shërbimit tuaj"; +"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin tuaj të shërbimit"; "room_resource_limit_exceeded_message_contact_3" = " që të vazhdoni përdorimin e këtij shërbimi."; "room_resource_usage_limit_reached_message_2" = "disa përdorues s’do të jenë në gjendje të bëjnë hyrjen."; "room_resource_usage_limit_reached_message_contact_3" = " për ta zmadhuar këtë kufi."; @@ -442,7 +442,7 @@ "room_details_fail_to_update_room_join_rule" = "S’arrihet të përditësohet rregulli për pjesëmarrje"; "room_details_fail_to_update_room_directory_visibility" = "S’arrihet të përditësohet dukshmëria e drejtorisë së dhomave"; "room_details_fail_to_update_history_visibility" = "S’arrihet të përditësohet dukshmëria e historikut"; -"room_details_fail_to_remove_room_aliases" = "S’arrihet të hiqen adresat e dhomës"; +"room_details_fail_to_remove_room_aliases" = "S’arrihet të hiqen adresat e dhomave"; "room_details_fail_to_update_room_canonical_alias" = "S’arrihet të përditësohet adresa kryesore"; "room_details_fail_to_update_room_communities" = "S’arrihet të përditësohen bashkësitë e afërta"; "room_details_fail_to_enable_encryption" = "S’arrihet të aktivizohet fshehtëzimi në këtë dhomë"; @@ -456,18 +456,94 @@ "event_formatter_rerequest_keys_part2" = " nga pajisje tuajat të tjera."; // Others "or" = "ose"; -"homeserver_connection_lost" = "S’u lidh dot te shërbyesu Home."; +"homeserver_connection_lost" = "S’u lidh dot te shërbyesi Home."; "call_jitsi_error" = "S'u arrit të hyhej në thirrjen për konferencë."; "widget_creation_failure" = "Krijimi i widget-it dështoi"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "Të shtohen ca tani?"; "widget_integration_room_not_visible" = "Dhoma %s s’është e dukshme."; -"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojeni tani"; +"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojini tani"; "deactivate_account_title" = "Çaktivizoni Llogarinë"; -"deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm"; -"deactivate_account_informations_part3" = "\n\nPo çaktivizohet llogaria juaj "; +"deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm."; +"deactivate_account_informations_part3" = "\n\nÇaktivizimi i llogarisë tuaj, "; "deactivate_account_forget_messages_information_part2_emphasize" = "Kujdes"; "deactivate_account_validate_action" = "Çaktivizoje llogarinë"; "deactivate_account_password_alert_title" = "Çaktivizoni Llogarinë"; "deactivate_account_password_alert_message" = "Që të vazhdohet, ju lutemi, jepni fjalëkalimin tuaj"; // Re-request confirmation dialog "rerequest_keys_alert_title" = "Kërkesa u Dërgua"; +"auth_reset_password_success_message" = "Fjalëkalimi juaj u ri caktua.\n\nËshtë bërë dalja juaj nga llogaria në krejt pajisjet dhe s’do të merrni më njoftime push. Për riaktivizim të njoftimeve, ribëni hyrjen në çdo pajisje."; +"room_creation_make_public_prompt_msg" = "Jeni i sigurt se doni ta bëni publike këtë fjalosje? Në një të tillë, mesazhet tuaj mund t’i lexojë cilido dhe mund të hyjë në bisedë."; +"room_creation_wait_for_creation" = "Po krijohet tashmë një dhomë, Ju lutemi, prisni."; +"contacts_address_book_permission_required" = "Lypset leje për hyrje në kontaktet vendore"; +"contacts_address_book_permission_denied" = "S’e lejuat Riot-i të hyjë në kontaktet tuaja vendore"; +"room_participants_remove_third_party_invite_msg" = "Heqja e ftesave nga palë të treta nuk mbulohet ende, derisa të kihet API"; +"room_participants_invite_malformed_id" = "ID e keqformuar. Duhet të jetë një adresë email ose ID Matrix, si '@localpart:domain'"; +"room_participants_action_ban" = "Dëboje nga kjo dhomë"; +"room_unsent_messages_unknown_devices_notification" = "Mesazhi s’u dërgua, për shkak të pranisë së pajisjeve të panjohura. %@ apo %@ tani?"; +"room_ongoing_conference_call" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@."; +"room_ongoing_conference_call_with_close" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@. %@."; +"room_conference_call_no_power" = "Ju duhen leje për të administruar thirrje konferencë në këtë dhomë"; +"room_event_action_share" = "Ndaje me të tjerë"; +"room_event_action_report_prompt_ignore_user" = "Doni të fshihen krejt mesazhet nga ky përdorues?"; +"room_warning_about_encryption" = "Fshehtëzimi skaj-më-skaj është në fazën beta dhe mund të mos jetë i qëndrueshëm.\n\nS’duhet t’i zini ende besë për sigurim të dhënash.\n\nPajisjet s’do të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nMesazhet e fshehtëzuar s’do të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin."; +"room_replacement_information" = "Kjo dhomë është zëvendësuar dhe s’është më aktive."; +"room_predecessor_information" = "Kjo dhomë është një vazhdim i një bisede tjetër."; +"room_resource_usage_limit_reached_message_1_default" = "Ky shërbyes home ka tejkaluar një nga kufijtë mbi burimet, ndaj "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ky shërbyes home ka tejkaluar kufirin Përdorues Aktivë Mujorë, ndaj "; +"unknown_devices_alert" = "Kjo dhomë përmban pajisje të panjohura që s’janë verifikuar.\nKjo do të thotë se nuk ka garanci se pajisjet u përkasin përdoruesve që pretendojnë se u përkasin.\nPërpara se të vazhdoni, këshillojmë që të kaloni në proces verifikimi çdo pajisje, por mund të ridërgoni mesazhin pa verifikuar gjë, nëse parapëlqeni kështu."; +"room_preview_subtitle" = "Kjo është një paraparje e kësaj dhome. Ndërveprimet në dhomë janë çaktivizuar."; +"room_preview_unlinked_email_warning" = "Kjo ftesë i qe dërguar %@, që s’është i përshoqëruar me këtë llogari. Mund të doni të hyni me një llogari tjetër, ose ta shtoni këtë email te kjo llogari."; +"room_preview_try_join_an_unknown_room" = "Po përpiqeni të hyni në %@. Do të donit të bëheni pjesë, që të mundni të merrni pjesë te diskutimi?"; +"settings_sign_out_e2e_warn" = "Do të humbni kyçet tuaj të fshehtëzimit skaj-më-skaj. Kjo do të thotë se s’do të jeni më në gjendje të lexoni mesazhe të vjetër te dhoma të fshehtëzuara në këtë pajisje."; +"settings_surname" = "Mbiemër"; +"settings_global_settings_info" = "Rregullimet globale për njoftime i gjeni te klienti juaj %@ web"; +"settings_on_denied_notification" = "Njoftimet për %@ s’pranohen, ju lutemi, lejojini që nga rregullimet e pajisjes tuaj"; +"settings_enable_callkit" = "Thirrje të integruara"; +"settings_callkit_info" = "Merrini thirrjet ardhëse edhe me ekran të kyçur. Shihni thirrjet tuaja nën Riot te historiku i thirrjeve të sistemit. Nëse iCloud është i aktivizuar, ky historik thirrjesh do t’i jepet kompanisë Apple."; +"settings_ui_theme_picker_message" = "\"Auto\" përdor rregullimet Përmbysi Ngjyrat\" të pajisjes tuaj"; +"settings_contacts_discover_matrix_users" = "Përdorni email-e dhe numra telefoni për të gjetur përdorues"; +"settings_labs_e2e_encryption_prompt_message" = "Që të përfundohet rregullimi i fshehtëzimit duhet të ribëni hyrjen në llogari."; +"settings_labs_room_members_lazy_loading" = "Lazy-load anëtarët e dhomave"; +"settings_labs_room_members_lazy_loading_error_message" = "Shërbyesi juaj nuk e mbulon ende lazy loading e anëtarëve të dhomës. Provoni më vonë."; +"settings_olm_version" = "Version Olm %@"; +"settings_send_crash_report" = "Dërgo të dhëna anonime vithisjesh & përdorimi"; +"room_details_access_section_anyone_apart_from_guest" = "Cilido që di lidhjen e dhomës, hiq vizitorët"; +"room_details_access_section_anyone" = "Cilido që di lidhjen e dhomës, përfshi vizitorë"; +"room_details_history_section_members_only" = "Vetëm anëtarët (që nga çasti i përzgjedhjes së kësaj mundësie)"; +"room_details_history_section_prompt_msg" = "Ndryshime se cilët mund të lexojnë historikun do të vlejnë vetëm për mesazhe të ardhshëm në këtë dhomë. Dukshmëria e historikut ekzistues nuk do të ndryshohet."; +"room_details_addresses_disable_main_address_prompt_msg" = "S’do të keni adresë kryesore të specifikuar. Adresa kryesore parazgjedhje për këtë dhomë do të zgjidhet në tym"; +"room_details_advanced_enable_e2e_encryption" = "Aktivizo fshehtëzim (kujdes: s’mund të çaktizohet më!)"; +"room_details_advanced_e2e_encryption_prompt_message" = "Fshehtëzimi skaj-më-skaj është eksperimental dhe mund të mos jetë i qëndrueshëm.\n\nS’duhet t’i zini ende besë për sigurim të dhënash.\n\nPajisjet s’do të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nPasi të jetë aktivizuar fshehtëzimi për një dhomë, s’mund të çaktivizohet më (hëpërhë).\n\nMesazhet e fshehtëzuar s’do të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin."; +"room_details_fail_to_update_room_guest_access" = "S’arrihet të përditësohet mundësia e hyrjes në dhomë të vizitorëve"; +"group_participants_invite_malformed_id" = "ID e keqformuar. Duhet të jetë një ID Matrix, si '@localpart:domain'"; +"directory_server_type_homeserver" = "Shtypni një shërbyes home që të paraqiten dhoma publike prej tij"; +"bug_report_prompt" = "Herën e fundit aplikacioni u vithis. Do të donit të parashtroni një raport vithisje?"; +"rage_shake_prompt" = "Duket se po përplasni telefonin nga inati. Do të donit të parashtroni një njoftim të mete?"; +"camera_access_not_granted" = "%@ s’ka leje të përdorë Kamerën, ju lutemi, ndryshoni rregullimet e privatësisë"; +"large_badge_value_k_format" = "%.1fK"; +"no_voip" = "%@ po ju thërret, por %@ nuk mbulon ende thirrje.\nMund ta shpërfillni këtë njoftim dhe t’i përgjigjeni thirrjes prej një tjetër pajisjeje, ose mund të mos e pranoni."; +// Crash report +"google_analytics_use_prompt" = "Do të donit të ndihmoni në përmirësimin e %@-it duke parashtruar automatikisht dhe në mënyrë anonime raporte vithisjesh dhe të dhëna përdorimi?"; +// Crypto +"e2e_enabling_on_app_update" = "Riot tani mbulon fshehtëzim skaj-më-skaj, por lypset të ribëni hyrjen që ta aktivizoni.\n\nMund ta bëni tani ose më vonë, që prej rregullimeve të aplikacionit."; +"bug_report_description" = "Ju lutemi, përshkruajeni të metën. Ç’po bënit? Ç’prisnit të ndodhte? Ç’ndodhi në fakt?"; +"bug_crash_report_description" = "Ju lutemi, përshkruani ç’po bënit para vithisjes:"; +"bug_report_logs_description" = "Që të mund të diagnostikohen probleme, regjistra prej këtij klienti do të dërgohen tok me këtë njoftim të metash. Nëse do të parapëlqenit të dërgohej vetëm teksti më sipër, ju lutemi, hiqjani shenjën kutizës:"; +// Widget +"widget_no_power_to_manage" = "Ju duhen leje për të administruar widget-e në këtë dhomë"; +"widget_sticker_picker_no_stickerpacks_alert" = "Hëpërhë, s’keni të aktivizuar ndonjë pako ngjitësash."; +// Widget Integration Manager +"widget_integration_need_to_be_able_to_invite" = "Që ta bëni këtë, lypset të jeni në gjendje të ftoni përdorues."; +// Share extension +"share_extension_auth_prompt" = "Që të ndani lëndë me të tjerët, bëni hyrjen te aplikacioni kryesor"; +"share_extension_failed_to_encrypt" = "S’u arrit të dërgohej. Kontrolloni te aplikacioni kryesor rregullimet e fshehtëzimit për këtë dhomë"; +"e2e_room_key_request_message_new_device" = "Shtuat një pajisje të re '%@', e cila po kërkon kyçe fshehtëzimi."; +"e2e_room_key_request_message" = "Pajisja juaj e paverifikuar '%@' po kërkon kyçe fshehtëzimi."; +// GDPR +"gdpr_consent_not_given_alert_message" = "Që të vazhdohet të përdoret shërbyesi home %@, duhet të shqyrtoni dhe pajtoheni me termat dhe kushtet."; +"deactivate_account_informations_part1" = "Kjo do ta bëjë përgjithnjë të papërdorshëm llogarinë tuaj. Nuk do të jeni në gjendje të bëni hyrjen në të, dhe askush s’do të jetë në gjendje të rrregjistrohet me të njëjtën ID përdoruesi. Kjo do të sjellë daljen e llogarisë tuaj nga krejt dhomat në të cilat po merr pjesë, dhe do të heqë nga shërbyesi i identitetit tuaj hollësitë e llogarisë tuaj. "; +"deactivate_account_informations_part4_emphasize" = "si parazgjedhje, nuk na bën të harrojmë mesazhet që keni dërguar. "; +"deactivate_account_informations_part5" = "Nëse do të donit që të harrohen mesazhet tuaj, ju lutemi, i vini shenjë kutizës më poshtë\n\nDukshmëria e mesazheve në Matrix është e ngjashme me atë në email. Harrimi i mesazheve nga ana jonë do të thotë që mesazhet që keni dërguar nuk do të ndahen me çfarëdo përdoruesi të ri apo të paregjistruar, por përdoruesit e regjistruar, që kanë tashmë hyrje në këto mesazhe, do të kenë prapëseprapë hyrje te kopja e tyre."; +"deactivate_account_forget_messages_information_part1" = "Të lutem, harro krejt mesazhet që kamë dërguar, kur të çaktivizohet llogaria ime ("; +"deactivate_account_forget_messages_information_part3" = ": kjo do të bëjë që përdorues të ardhshëm të shohin një pamje jo të plotë të bisedave)"; +"rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mund të shfshehtëzoje mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; From 9ff6a26526b0d8b4b7adfdf56fe15c10209f0269 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 15:10:44 +0000 Subject: [PATCH 15/54] Translated using Weblate (Albanian) Currently translated at 98.4% (511 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 84e7f7e96..eb8798c4c 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -546,4 +546,4 @@ "deactivate_account_informations_part5" = "Nëse do të donit që të harrohen mesazhet tuaj, ju lutemi, i vini shenjë kutizës më poshtë\n\nDukshmëria e mesazheve në Matrix është e ngjashme me atë në email. Harrimi i mesazheve nga ana jonë do të thotë që mesazhet që keni dërguar nuk do të ndahen me çfarëdo përdoruesi të ri apo të paregjistruar, por përdoruesit e regjistruar, që kanë tashmë hyrje në këto mesazhe, do të kenë prapëseprapë hyrje te kopja e tyre."; "deactivate_account_forget_messages_information_part1" = "Të lutem, harro krejt mesazhet që kamë dërguar, kur të çaktivizohet llogaria ime ("; "deactivate_account_forget_messages_information_part3" = ": kjo do të bëjë që përdorues të ardhshëm të shohin një pamje jo të plotë të bisedave)"; -"rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mund të shfshehtëzoje mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; +"rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mundet të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; From fa16164059729931f2ffaf783267d4c35cdc936c Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 17:06:39 +0000 Subject: [PATCH 16/54] Translated using Weblate (Albanian) Currently translated at 98.6% (512 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index eb8798c4c..342312a40 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -547,3 +547,4 @@ "deactivate_account_forget_messages_information_part1" = "Të lutem, harro krejt mesazhet që kamë dërguar, kur të çaktivizohet llogaria ime ("; "deactivate_account_forget_messages_information_part3" = ": kjo do të bëjë që përdorues të ardhshëm të shohin një pamje jo të plotë të bisedave)"; "rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mundet të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; +"room_event_action_redact" = "Redaktojeni"; From ebf6e6edebef13566ce45bf17398a12a840c2179 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 17:07:52 +0000 Subject: [PATCH 17/54] Translated using Weblate (Albanian) Currently translated at 98.6% (512 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 342312a40..5a39fa729 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -183,7 +183,7 @@ "room_event_action_more" = "Më tepër"; "room_event_action_permalink" = "Permalidhje"; "room_event_action_view_source" = "Shihini Burimin"; -"room_event_action_report" = "Raportoni lëndë"; +"room_event_action_report" = "Lëndë raportimi"; "room_event_action_report_prompt_reason" = "Arsye për raportimin e kësaj lënde"; "room_event_action_save" = "Ruaje"; "room_event_action_resend" = "Ridërgoje"; From af7465ffe910c1f21c3957df8702bf8cc39323d5 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 17:15:25 +0000 Subject: [PATCH 18/54] Translated using Weblate (Albanian) Currently translated at 98.6% (512 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 5a39fa729..863ceecd2 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -11,7 +11,7 @@ "continue" = "Vazhdo"; "create" = "Krijoje"; "start" = "Fillo"; -"leave" = "Dilni"; +"leave" = "Dil"; "remove" = "Hiqe"; "invite" = "Ftoje"; "retry" = "Riprovo"; @@ -36,14 +36,14 @@ "auth_register" = "Regjistrohuni"; "auth_submit" = "Parashtroje"; "auth_skip" = "Anashkaloje"; -"auth_send_reset_email" = "Ridërgo Email Ricaktimi"; +"auth_send_reset_email" = "Dërgo Email Ricaktimi"; "auth_return_to_login" = "Kthehuni te skena e hyrjeve"; "auth_password_placeholder" = "Fjalëkalim"; "auth_new_password_placeholder" = "Fjalëkalim i ri"; "auth_user_name_placeholder" = "Emër përdoruesi"; -"auth_optional_email_placeholder" = "Adresë email (opsionale)"; +"auth_optional_email_placeholder" = "Adresë email (në daçi)"; "auth_email_placeholder" = "Adresë email"; -"auth_optional_phone_placeholder" = "Numër telefoni (opsionale)"; +"auth_optional_phone_placeholder" = "Numër telefoni (në daçi)"; "auth_phone_placeholder" = "Numër telefoni"; "auth_repeat_password_placeholder" = "Rijepeni fjalëkalimin"; "auth_repeat_new_password_placeholder" = "Ripohoni fjalëkalimin tuaj të ri"; @@ -131,7 +131,7 @@ "room_participants_add_participant" = "Shtoni pjesmarrës"; "room_participants_one_participant" = "1 pjesmarrës"; "room_participants_multi_participants" = "%d pjesëmarrës"; -"room_participants_leave_prompt_title" = "Dilni nga dhomë"; +"room_participants_leave_prompt_title" = "Dilni nga dhoma"; "room_participants_leave_prompt_msg" = "Jeni i sigurt se doni të ikni nga dhoma?"; "room_participants_remove_prompt_title" = "Ripohim"; "room_participants_remove_prompt_msg" = "Jeni i sigurt se doni të hiqet %@ nga kjo fjalosje?"; @@ -149,14 +149,14 @@ "room_participants_action_section_admin_tools" = "Mjete përgjegjësi"; "room_participants_action_section_direct_chats" = "Fjalosje të drejtpërdrejta"; "room_participants_action_section_devices" = "Pajisje"; -"room_participants_action_section_other" = "Të tjera"; +"room_participants_action_section_other" = "Tjetër"; "room_participants_action_invite" = "Ftoje"; "room_participants_action_leave" = "Braktiseni këtë dhomë"; "room_participants_action_remove" = "Hiqeni prej kësaj dhome"; -"room_participants_action_unban" = "Hiqi dëbimin"; +"room_participants_action_unban" = "Zhdëboje"; "room_participants_action_set_default_power_level" = "Riktheje në përdorues normal"; "room_participants_action_set_moderator" = "Kaloje moderator"; -"room_participants_action_set_admin" = "Kaloje përgjegjës"; +"room_participants_action_set_admin" = "Kalojeni përgjegjës"; "room_participants_action_start_new_chat" = "Filloni fjalosje të re"; "room_participants_action_start_voice_call" = "Nis thirrje audio"; "room_participants_action_start_video_call" = "Nis thirrje video"; @@ -170,20 +170,20 @@ "room_many_users_are_typing" = "%@, %@ & të tjerë po shtypin…"; "room_message_placeholder" = "Dërgoni një mesazh (të pafshehtëzuar)…"; "room_do_not_have_permission_to_post" = "S’keni leje të postoni në këtë dhomë"; -"encrypted_room_message_placeholder" = "Dërgoni një mesazhi të fshehtëzuar…"; +"encrypted_room_message_placeholder" = "Dërgoni një mesazh të fshehtëzuar…"; "room_message_short_placeholder" = "Dërgoni një mesazh…"; "room_offline_notification" = "Humbi lidhja me shërbyesin."; "room_unsent_messages_notification" = "Mesazhet s’u dërguan. %@ apo %@ tani?"; "room_ongoing_conference_call_close" = "Mbylle"; "room_prompt_resend" = "Ridërgoji krejt"; "room_prompt_cancel" = "anuloji krejt"; -"room_delete_unsent_messages" = "Fshi mesazhet e padërguara"; +"room_delete_unsent_messages" = "Fshi mesazhet e padërguar"; "room_event_action_copy" = "Kopjoje"; "room_event_action_quote" = "Citim"; "room_event_action_more" = "Më tepër"; "room_event_action_permalink" = "Permalidhje"; "room_event_action_view_source" = "Shihini Burimin"; -"room_event_action_report" = "Lëndë raportimi"; +"room_event_action_report" = "Raportoni lëndë"; "room_event_action_report_prompt_reason" = "Arsye për raportimin e kësaj lënde"; "room_event_action_save" = "Ruaje"; "room_event_action_resend" = "Ridërgoje"; @@ -229,7 +229,7 @@ "settings_sign_out" = "Dilni"; "settings_sign_out_confirmation" = "Jeni i sigurt?"; "settings_profile_picture" = "Foto Profili"; -"settings_display_name" = "Emër Në Ekran"; +"settings_display_name" = "Emër në Ekran"; "settings_first_name" = "Emër"; "settings_remove_prompt_title" = "Ripohim"; "settings_remove_email_prompt_msg" = "Jeni i sigurt se doni të hiqet adresa email %@?"; @@ -287,11 +287,11 @@ "room_details_access_section_directory_toggle" = "Shfaqe këtë dhomë te drejtori dhomash"; "room_details_history_section" = "Kush mund të lexojë historikun?"; "room_details_history_section_anyone" = "Cilido"; -"room_details_history_section_members_only_since_invited" = "Vetëm anëtarë (ngaqë janë të ftuar)"; +"room_details_history_section_members_only_since_invited" = "Vetëm anëtarë (ngaqë qenë ftuar)"; "room_details_history_section_members_only_since_joined" = "Vetëm anëtarë (ngaqë janë bërë pjesë)"; "room_details_history_section_prompt_title" = "Sinjalizim privatësie"; "room_details_addresses_section" = "Adresa"; -"room_details_no_local_addresses" = "Kjo dhomë s’ka adresë vendore"; +"room_details_no_local_addresses" = "Kjo dhomë s’ka adresa vendore"; "room_details_new_address" = "Shtoni adresë të re"; "room_details_addresses_invalid_address_prompt_title" = "Format i pavlefshëm aliasesh"; "room_details_addresses_invalid_address_prompt_msg" = "%@ s’është format i vlefshëm aliasesh"; @@ -314,7 +314,7 @@ // Group Details "group_details_title" = "Hollësi Bashkësie"; "group_details_home" = "Kreu"; -"group_details_people" = "Persona"; +"group_details_people" = "Njerëz"; "group_details_rooms" = "Dhoma"; // Group Home "group_home_one_member_format" = "1 anëtar"; @@ -388,13 +388,13 @@ "auth_reset_password_email_validation_message" = "Te %@ u dërgua një email. Pasi të ndiqni lidhjen që përmban, klikoni më poshtë."; "auth_reset_password_next_step_button" = "E kam verifikuar adresën time email"; "on" = "On"; -"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë."; +"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, që përdoruesit të mund t’ju zbulojnë."; "auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Ju lutemi, jepeni këtë kod më poshtë."; "auth_recaptcha_message" = "Ky Shërbyes Home do të donte të sigurohej se s’jeni robot"; "auth_reset_password_error_unauthorized" = "Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i"; "auth_reset_password_error_not_found" = "Adresa juaj email s’duket të jetë e përshoqëruar me ID Matrix në këtë shërbyes Home."; "title_favourites" = "Të parapëlqyer"; -"join" = "Merrni pjesë"; +"join" = "Bëhuni pjesë"; "auth_add_email_message" = "Shtoni te llogaria juaj një adresë email, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë dhe që t’ju lejojë të ricaktoni fjalëkalimin."; "auth_add_email_phone_message" = "Shtoni te llogaria juaj një adresë email dhe/ose një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; "auth_add_email_and_phone_message" = "Shtoni te llogaria juaj një adresë email dhe një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; @@ -419,7 +419,7 @@ "room_replacement_link" = "Biseda vazhdon këtu."; "room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër."; "room_resource_limit_exceeded_message_contact_1" = " Ju lutemi, "; -"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin tuaj të shërbimit"; +"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin e shërbimit tuaj"; "room_resource_limit_exceeded_message_contact_3" = " që të vazhdoni përdorimin e këtij shërbimi."; "room_resource_usage_limit_reached_message_2" = "disa përdorues s’do të jenë në gjendje të bëjnë hyrjen."; "room_resource_usage_limit_reached_message_contact_3" = " për ta zmadhuar këtë kufi."; @@ -461,7 +461,7 @@ "widget_creation_failure" = "Krijimi i widget-it dështoi"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "Të shtohen ca tani?"; "widget_integration_room_not_visible" = "Dhoma %s s’është e dukshme."; -"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojini tani"; +"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojeni tani"; "deactivate_account_title" = "Çaktivizoni Llogarinë"; "deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm."; "deactivate_account_informations_part3" = "\n\nÇaktivizimi i llogarisë tuaj, "; @@ -483,7 +483,7 @@ "room_ongoing_conference_call" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@."; "room_ongoing_conference_call_with_close" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@. %@."; "room_conference_call_no_power" = "Ju duhen leje për të administruar thirrje konferencë në këtë dhomë"; -"room_event_action_share" = "Ndaje me të tjerë"; +"room_event_action_share" = "Ndaje"; "room_event_action_report_prompt_ignore_user" = "Doni të fshihen krejt mesazhet nga ky përdorues?"; "room_warning_about_encryption" = "Fshehtëzimi skaj-më-skaj është në fazën beta dhe mund të mos jetë i qëndrueshëm.\n\nS’duhet t’i zini ende besë për sigurim të dhënash.\n\nPajisjet s’do të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nMesazhet e fshehtëzuar s’do të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin."; "room_replacement_information" = "Kjo dhomë është zëvendësuar dhe s’është më aktive."; From 9d812d231b63f249756d1c4eeb5f4536e3d22e72 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 17:18:15 +0000 Subject: [PATCH 19/54] Translated using Weblate (Albanian) Currently translated at 98.6% (512 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 40 ++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 863ceecd2..8c9013167 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -11,7 +11,7 @@ "continue" = "Vazhdo"; "create" = "Krijoje"; "start" = "Fillo"; -"leave" = "Dil"; +"leave" = "Dilni"; "remove" = "Hiqe"; "invite" = "Ftoje"; "retry" = "Riprovo"; @@ -36,14 +36,14 @@ "auth_register" = "Regjistrohuni"; "auth_submit" = "Parashtroje"; "auth_skip" = "Anashkaloje"; -"auth_send_reset_email" = "Dërgo Email Ricaktimi"; +"auth_send_reset_email" = "Ridërgo Email Ricaktimi"; "auth_return_to_login" = "Kthehuni te skena e hyrjeve"; "auth_password_placeholder" = "Fjalëkalim"; "auth_new_password_placeholder" = "Fjalëkalim i ri"; "auth_user_name_placeholder" = "Emër përdoruesi"; -"auth_optional_email_placeholder" = "Adresë email (në daçi)"; +"auth_optional_email_placeholder" = "Adresë email (opsionale)"; "auth_email_placeholder" = "Adresë email"; -"auth_optional_phone_placeholder" = "Numër telefoni (në daçi)"; +"auth_optional_phone_placeholder" = "Numër telefoni (opsionale)"; "auth_phone_placeholder" = "Numër telefoni"; "auth_repeat_password_placeholder" = "Rijepeni fjalëkalimin"; "auth_repeat_new_password_placeholder" = "Ripohoni fjalëkalimin tuaj të ri"; @@ -131,7 +131,7 @@ "room_participants_add_participant" = "Shtoni pjesmarrës"; "room_participants_one_participant" = "1 pjesmarrës"; "room_participants_multi_participants" = "%d pjesëmarrës"; -"room_participants_leave_prompt_title" = "Dilni nga dhoma"; +"room_participants_leave_prompt_title" = "Dilni nga dhomë"; "room_participants_leave_prompt_msg" = "Jeni i sigurt se doni të ikni nga dhoma?"; "room_participants_remove_prompt_title" = "Ripohim"; "room_participants_remove_prompt_msg" = "Jeni i sigurt se doni të hiqet %@ nga kjo fjalosje?"; @@ -149,13 +149,13 @@ "room_participants_action_section_admin_tools" = "Mjete përgjegjësi"; "room_participants_action_section_direct_chats" = "Fjalosje të drejtpërdrejta"; "room_participants_action_section_devices" = "Pajisje"; -"room_participants_action_section_other" = "Tjetër"; +"room_participants_action_section_other" = "Të tjera"; "room_participants_action_invite" = "Ftoje"; "room_participants_action_leave" = "Braktiseni këtë dhomë"; "room_participants_action_remove" = "Hiqeni prej kësaj dhome"; -"room_participants_action_unban" = "Zhdëboje"; -"room_participants_action_set_default_power_level" = "Riktheje në përdorues normal"; -"room_participants_action_set_moderator" = "Kaloje moderator"; +"room_participants_action_unban" = "Hiqi dëbimin"; +"room_participants_action_set_default_power_level" = "Rikthejeni në përdorues normal"; +"room_participants_action_set_moderator" = "Kalojeni moderator"; "room_participants_action_set_admin" = "Kalojeni përgjegjës"; "room_participants_action_start_new_chat" = "Filloni fjalosje të re"; "room_participants_action_start_voice_call" = "Nis thirrje audio"; @@ -170,14 +170,14 @@ "room_many_users_are_typing" = "%@, %@ & të tjerë po shtypin…"; "room_message_placeholder" = "Dërgoni një mesazh (të pafshehtëzuar)…"; "room_do_not_have_permission_to_post" = "S’keni leje të postoni në këtë dhomë"; -"encrypted_room_message_placeholder" = "Dërgoni një mesazh të fshehtëzuar…"; +"encrypted_room_message_placeholder" = "Dërgoni një mesazhi të fshehtëzuar…"; "room_message_short_placeholder" = "Dërgoni një mesazh…"; "room_offline_notification" = "Humbi lidhja me shërbyesin."; "room_unsent_messages_notification" = "Mesazhet s’u dërguan. %@ apo %@ tani?"; "room_ongoing_conference_call_close" = "Mbylle"; "room_prompt_resend" = "Ridërgoji krejt"; "room_prompt_cancel" = "anuloji krejt"; -"room_delete_unsent_messages" = "Fshi mesazhet e padërguar"; +"room_delete_unsent_messages" = "Fshi mesazhet e padërguara"; "room_event_action_copy" = "Kopjoje"; "room_event_action_quote" = "Citim"; "room_event_action_more" = "Më tepër"; @@ -229,7 +229,7 @@ "settings_sign_out" = "Dilni"; "settings_sign_out_confirmation" = "Jeni i sigurt?"; "settings_profile_picture" = "Foto Profili"; -"settings_display_name" = "Emër në Ekran"; +"settings_display_name" = "Emër Në Ekran"; "settings_first_name" = "Emër"; "settings_remove_prompt_title" = "Ripohim"; "settings_remove_email_prompt_msg" = "Jeni i sigurt se doni të hiqet adresa email %@?"; @@ -287,11 +287,11 @@ "room_details_access_section_directory_toggle" = "Shfaqe këtë dhomë te drejtori dhomash"; "room_details_history_section" = "Kush mund të lexojë historikun?"; "room_details_history_section_anyone" = "Cilido"; -"room_details_history_section_members_only_since_invited" = "Vetëm anëtarë (ngaqë qenë ftuar)"; +"room_details_history_section_members_only_since_invited" = "Vetëm anëtarë (ngaqë janë të ftuar)"; "room_details_history_section_members_only_since_joined" = "Vetëm anëtarë (ngaqë janë bërë pjesë)"; "room_details_history_section_prompt_title" = "Sinjalizim privatësie"; "room_details_addresses_section" = "Adresa"; -"room_details_no_local_addresses" = "Kjo dhomë s’ka adresa vendore"; +"room_details_no_local_addresses" = "Kjo dhomë s’ka adresë vendore"; "room_details_new_address" = "Shtoni adresë të re"; "room_details_addresses_invalid_address_prompt_title" = "Format i pavlefshëm aliasesh"; "room_details_addresses_invalid_address_prompt_msg" = "%@ s’është format i vlefshëm aliasesh"; @@ -314,7 +314,7 @@ // Group Details "group_details_title" = "Hollësi Bashkësie"; "group_details_home" = "Kreu"; -"group_details_people" = "Njerëz"; +"group_details_people" = "Persona"; "group_details_rooms" = "Dhoma"; // Group Home "group_home_one_member_format" = "1 anëtar"; @@ -388,13 +388,13 @@ "auth_reset_password_email_validation_message" = "Te %@ u dërgua një email. Pasi të ndiqni lidhjen që përmban, klikoni më poshtë."; "auth_reset_password_next_step_button" = "E kam verifikuar adresën time email"; "on" = "On"; -"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, që përdoruesit të mund t’ju zbulojnë."; +"auth_add_phone_message" = "Shtoni te llogaria juaj një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë."; "auth_msisdn_validation_message" = "Kemi dërguar një SMS me një kod aktivizimi. Ju lutemi, jepeni këtë kod më poshtë."; "auth_recaptcha_message" = "Ky Shërbyes Home do të donte të sigurohej se s’jeni robot"; "auth_reset_password_error_unauthorized" = "Verifikimi i adresës email dështoi: sigurohuni se keni klikuar lidhjen te email-i"; "auth_reset_password_error_not_found" = "Adresa juaj email s’duket të jetë e përshoqëruar me ID Matrix në këtë shërbyes Home."; "title_favourites" = "Të parapëlqyer"; -"join" = "Bëhuni pjesë"; +"join" = "Merrni pjesë"; "auth_add_email_message" = "Shtoni te llogaria juaj një adresë email, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë dhe që t’ju lejojë të ricaktoni fjalëkalimin."; "auth_add_email_phone_message" = "Shtoni te llogaria juaj një adresë email dhe/ose një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; "auth_add_email_and_phone_message" = "Shtoni te llogaria juaj një adresë email dhe një numër telefoni, për t’u dhënë mundësinë përdoruesve t’ju zbulojnë. Adresa email do t’ju lejojë edhe të ricaktoni fjalëkalimin tuaj."; @@ -419,7 +419,7 @@ "room_replacement_link" = "Biseda vazhdon këtu."; "room_predecessor_link" = "Klikoni këtu për të parë mesazhe më të vjetër."; "room_resource_limit_exceeded_message_contact_1" = " Ju lutemi, "; -"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin e shërbimit tuaj"; +"room_resource_limit_exceeded_message_contact_2_link" = "lidhuni me përgjegjësin tuaj të shërbimit"; "room_resource_limit_exceeded_message_contact_3" = " që të vazhdoni përdorimin e këtij shërbimi."; "room_resource_usage_limit_reached_message_2" = "disa përdorues s’do të jenë në gjendje të bëjnë hyrjen."; "room_resource_usage_limit_reached_message_contact_3" = " për ta zmadhuar këtë kufi."; @@ -461,7 +461,7 @@ "widget_creation_failure" = "Krijimi i widget-it dështoi"; "widget_sticker_picker_no_stickerpacks_alert_add_now" = "Të shtohen ca tani?"; "widget_integration_room_not_visible" = "Dhoma %s s’është e dukshme."; -"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojeni tani"; +"gdpr_consent_not_given_alert_review_now_action" = "Shqyrtojini tani"; "deactivate_account_title" = "Çaktivizoni Llogarinë"; "deactivate_account_informations_part2_emphasize" = "Ky veprim është i paprapakthyeshëm."; "deactivate_account_informations_part3" = "\n\nÇaktivizimi i llogarisë tuaj, "; @@ -483,7 +483,7 @@ "room_ongoing_conference_call" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@."; "room_ongoing_conference_call_with_close" = "Thirrje konference që po zhvillohet. Merrni pjesë si %@ ose %@. %@."; "room_conference_call_no_power" = "Ju duhen leje për të administruar thirrje konferencë në këtë dhomë"; -"room_event_action_share" = "Ndaje"; +"room_event_action_share" = "Ndajeni me të tjerë"; "room_event_action_report_prompt_ignore_user" = "Doni të fshihen krejt mesazhet nga ky përdorues?"; "room_warning_about_encryption" = "Fshehtëzimi skaj-më-skaj është në fazën beta dhe mund të mos jetë i qëndrueshëm.\n\nS’duhet t’i zini ende besë për sigurim të dhënash.\n\nPajisjet s’do të jenë ende në gjendje të shfshehtëzojnë historik nga periudha përpara se të merrnin pjesë te dhomë.\n\nMesazhet e fshehtëzuar s’do të jenë të dukshëm në klientë që nuk sendërtojnë ende fshehtëzimin."; "room_replacement_information" = "Kjo dhomë është zëvendësuar dhe s’është më aktive."; From 0e7916e6e1be7c8017f0efd316ec89a1307f1c8c Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 14 Nov 2018 18:21:49 +0000 Subject: [PATCH 20/54] Translated using Weblate (Albanian) Currently translated at 98.8% (513 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 8c9013167..72f9b4ef0 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -548,3 +548,4 @@ "deactivate_account_forget_messages_information_part3" = ": kjo do të bëjë që përdorues të ardhshëm të shohin një pamje jo të plotë të bisedave)"; "rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mundet të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; "room_event_action_redact" = "Redaktojeni"; +"e2e_need_log_in_again" = "Që të prodhohen kyçe fshehtëzimi skaj-më-skaj për këtë pajisje, lypset të ribëni hyrjen dhe të parashtroni kyçin publik te shërbyesi juaj homë.\nKjo duhet vetëm një herë; na ndjeni për belanë."; From 1e9aba4c9d553a8481d4657887dd182dccd03142 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 17 Nov 2018 17:34:19 +0000 Subject: [PATCH 21/54] Translated using Weblate (Albanian) Currently translated at 99.4% (516 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/sq/ --- Riot/Assets/sq.lproj/Vector.strings | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Riot/Assets/sq.lproj/Vector.strings b/Riot/Assets/sq.lproj/Vector.strings index 72f9b4ef0..c529fac53 100644 --- a/Riot/Assets/sq.lproj/Vector.strings +++ b/Riot/Assets/sq.lproj/Vector.strings @@ -549,3 +549,6 @@ "rerequest_keys_alert_message" = "Ju lutemi, niseni Riot-in në një tjetër pajisje që mundet të shfshehtëzojë mesazhin, që kështu të mund të dërgojë kyçet te kjo pajisje."; "room_event_action_redact" = "Redaktojeni"; "e2e_need_log_in_again" = "Që të prodhohen kyçe fshehtëzimi skaj-më-skaj për këtë pajisje, lypset të ribëni hyrjen dhe të parashtroni kyçin publik te shërbyesi juaj homë.\nKjo duhet vetëm një herë; na ndjeni për belanë."; +"room_action_send_sticker" = "Dërgoni ngjitës"; +"settings_flair" = "Shfaq simbole, kur lejohet"; +"room_details_flair_section" = "Shfaq simbole për bashkësi"; From 442e577e8d01a03e022ae826c1cfdae223be77cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 14 Nov 2018 09:40:17 +0000 Subject: [PATCH 22/54] Translated using Weblate (French) Currently translated at 100.0% (519 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/fr/ --- Riot/Assets/fr.lproj/Vector.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index c7602efeb..b4ff8e37b 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -509,7 +509,7 @@ "room_details_flair_invalid_id_prompt_msg" = "%@ n'est pas un identifiant valide pour une communauté"; "room_details_fail_to_update_room_communities" = "Échec de la mise à jour des communautés liées"; "room_do_not_have_permission_to_post" = "Vous n'avez pas la permission d'envoyer des messages dans ce salon"; -"room_event_action_kick_prompt_reason" = "Raison de l'exclusion de l'utilisateur"; +"room_event_action_kick_prompt_reason" = "Motif de l'expulsion de l'utilisateur"; "room_event_action_ban_prompt_reason" = "Raison du bannissement de l'utilisateur"; // GDPR "gdpr_consent_not_given_alert_message" = "Pour continuer à utiliser le serveur d'accueil %@, vous devez lire et accepter les conditions générales."; From d5df5304b15dd9a9fcf6dd22fdfe242d2150ca9a Mon Sep 17 00:00:00 2001 From: Suetsugu Kawamura Date: Fri, 9 Nov 2018 00:21:56 +0000 Subject: [PATCH 23/54] Translated using Weblate (Japanese) Currently translated at 100.0% (4 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/ja/ --- Riot/Assets/ja.lproj/InfoPlist.strings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Riot/Assets/ja.lproj/InfoPlist.strings b/Riot/Assets/ja.lproj/InfoPlist.strings index 3e0da6f18..07641c4e5 100644 --- a/Riot/Assets/ja.lproj/InfoPlist.strings +++ b/Riot/Assets/ja.lproj/InfoPlist.strings @@ -2,4 +2,4 @@ "NSCameraUsageDescription" = "ビデオ通話や写真撮影、動画撮影などを行うときにカメラを使用します。"; "NSPhotoLibraryUsageDescription" = "フォトライブラリは、写真や動画の送信に使用されます。"; "NSMicrophoneUsageDescription" = "マイクは動画撮影や通話に使用されます。"; -"NSContactsUsageDescription" = "連絡先のどれがRiotまたはMatrixを既に使用しているかを表示するために、あなたのアドレス帳にあるメールアドレスと電話番号をMatrix Identity Serverに送信することができます。 新しいVectorはこのデータを保存したり、他の目的に使用したりしません。 詳細については、アプリケーション設定のプライバシーポリシーページを参照してください。"; +"NSContactsUsageDescription" = "連絡先のどれがRiotまたはMatrixを既に使用しているかを表示するために、あなたのアドレス帳にあるメールアドレスと電話番号をMatrix Identity Serverに送信することができます。 New Vectorはこのデータを保存したり、他の目的に使用したりしません。 詳細については、アプリケーション設定のプライバシーポリシーページを参照してください。"; From f54a619bf5e54c3047dab8e51b79eec286eb9b29 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 21 Nov 2018 19:46:45 +0000 Subject: [PATCH 24/54] Added translation using Weblate (Polish) --- Riot/Assets/pl.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/pl.lproj/Vector.strings diff --git a/Riot/Assets/pl.lproj/Vector.strings b/Riot/Assets/pl.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/pl.lproj/Vector.strings @@ -0,0 +1 @@ + From 72ad623b8035373ede3440f7d7d64409d38a3def Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 21 Nov 2018 22:23:14 +0000 Subject: [PATCH 25/54] Added translation using Weblate (Polish) --- Riot/Assets/pl.lproj/InfoPlist.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/pl.lproj/InfoPlist.strings diff --git a/Riot/Assets/pl.lproj/InfoPlist.strings b/Riot/Assets/pl.lproj/InfoPlist.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/pl.lproj/InfoPlist.strings @@ -0,0 +1 @@ + From d199d70502bff1068a2e2514525e4056d9fd7b57 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 06:00:02 +0000 Subject: [PATCH 26/54] Added translation using Weblate (Ukrainian) --- Riot/Assets/uk.lproj/Localizable.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/uk.lproj/Localizable.strings diff --git a/Riot/Assets/uk.lproj/Localizable.strings b/Riot/Assets/uk.lproj/Localizable.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/uk.lproj/Localizable.strings @@ -0,0 +1 @@ + From 08bee47279db91a25e872a4138c6341f0b227e58 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 06:12:16 +0000 Subject: [PATCH 27/54] Translated using Weblate (Ukrainian) Currently translated at 100.0% (26 of 26 strings) Translation: Riot iOS/Riot iOS (Push) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-push/uk/ --- Riot/Assets/uk.lproj/Localizable.strings | 53 +++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/uk.lproj/Localizable.strings b/Riot/Assets/uk.lproj/Localizable.strings index 8b1378917..f3fe81265 100644 --- a/Riot/Assets/uk.lproj/Localizable.strings +++ b/Riot/Assets/uk.lproj/Localizable.strings @@ -1 +1,52 @@ - +/* New message from a specific person, not referencing a room */ +"MSG_FROM_USER" = "Повідомлення від %@"; +/* New message from a specific person in a named room */ +"MSG_FROM_USER_IN_ROOM" = "%@ пише в %@"; +/* New message from a specific person, not referencing a room. Content included. */ +"MSG_FROM_USER_WITH_CONTENT" = "%@: %@"; +/* New message from a specific person in a named room. Content included. */ +"MSG_FROM_USER_IN_ROOM_WITH_CONTENT" = "%@ в %@: %@"; +/* New action message from a specific person, not referencing a room. */ +"ACTION_FROM_USER" = "* %@ %@"; +/* New action message from a specific person in a named room. */ +"ACTION_FROM_USER_IN_ROOM" = "%@: * %@ %@"; +/* New action message from a specific person, not referencing a room. */ +"IMAGE_FROM_USER" = "%@ надсилає вам зображення %@"; +/* New action message from a specific person in a named room. */ +"IMAGE_FROM_USER_IN_ROOM" = "%@ оприлюднює зображення %@ в %@"; +/* A single unread message in a room */ +"SINGLE_UNREAD_IN_ROOM" = "Ви отримали повідомлення в %@"; +/* A single unread message */ +"SINGLE_UNREAD" = "Ви отримали повідомлення"; +/* Multiple unread messages in a room */ +"UNREAD_IN_ROOM" = "%@ нових повідомлень в %@"; +/* Multiple unread messages from a specific person, not referencing a room */ +"MSGS_FROM_USER" = "%@ нових повідомлень в %@"; +/* Multiple unread messages from two people */ +"MSGS_FROM_TWO_USERS" = "%@ нових повідомлень від %@ і %@"; +/* Multiple unread messages from three people */ +"MSGS_FROM_THREE_USERS" = "%@ нових повідомлень від %@, %@ і %@"; +/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */ +"MSGS_FROM_TWO_PLUS_USERS" = "%@ нових повідомлень від %@, %@ та інших"; +/* Multiple messages in two rooms */ +"MSGS_IN_TWO_ROOMS" = "%@ нових повідомлень в %@ і %@"; +/* Look, stuff's happened, alright? Just open the app. */ +"MSGS_IN_TWO_PLUS_ROOMS" = "%@ нових повідомлень в %@, %@ та інших"; +/* A user has invited you to a chat */ +"USER_INVITE_TO_CHAT" = "%@ запрошує вас до чату"; +/* A user has invited you to an (unamed) group chat */ +"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ запрошує вас до групового чату"; +/* A user has invited you to a named room */ +"USER_INVITE_TO_NAMED_ROOM" = "%@ запрошує вас до %@"; +/* Incoming one-to-one voice call */ +"VOICE_CALL_FROM_USER" = "Виклик від %@"; +/* Incoming one-to-one video call */ +"VIDEO_CALL_FROM_USER" = "Відео-виклик від %@"; +/* Incoming unnamed voice conference invite from a specific person */ +"VOICE_CONF_FROM_USER" = "Груповий виклик від %@"; +/* Incoming unnamed video conference invite from a specific person */ +"VIDEO_CONF_FROM_USER" = "Груповий відео-виклик від %@"; +/* Incoming named voice conference invite from a specific person */ +"VOICE_CONF_NAMED_FROM_USER" = "Груповий виклик від %@: '%@'"; +/* Incoming named video conference invite from a specific person */ +"VIDEO_CONF_NAMED_FROM_USER" = "Груповий відео-виклик від %@: '%@'"; From f2f6a57893d57d0ca054094ec9fa0c2528c8e2f9 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 06:13:30 +0000 Subject: [PATCH 28/54] Added translation using Weblate (Ukrainian) --- Riot/Assets/uk.lproj/InfoPlist.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/uk.lproj/InfoPlist.strings diff --git a/Riot/Assets/uk.lproj/InfoPlist.strings b/Riot/Assets/uk.lproj/InfoPlist.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/uk.lproj/InfoPlist.strings @@ -0,0 +1 @@ + From b57a451122dca4012387032b03ae5eeba9fa08ed Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 07:03:57 +0000 Subject: [PATCH 29/54] Translated using Weblate (Ukrainian) Currently translated at 100.0% (4 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/uk/ --- Riot/Assets/uk.lproj/InfoPlist.strings | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/uk.lproj/InfoPlist.strings b/Riot/Assets/uk.lproj/InfoPlist.strings index 8b1378917..e215f2935 100644 --- a/Riot/Assets/uk.lproj/InfoPlist.strings +++ b/Riot/Assets/uk.lproj/InfoPlist.strings @@ -1 +1,5 @@ - +// Permissions usage explanations +"NSCameraUsageDescription" = "Камера використовується для знімків фото і відео, а також для відео-викликів."; +"NSPhotoLibraryUsageDescription" = "Фотографії використовуються для надсилання фото і відео."; +"NSMicrophoneUsageDescription" = "Мікрофон використовується для відео і викликів."; +"NSContactsUsageDescription" = "Щоб показати, які з ваших контактів вже використовують Riot чи Matrix, ми можемо надіслати адреси електронної пошти і номери телефонів з вашої адресної книги до вашого сервера ідентифікації Matrix. Новий Vector не зберігає і не використовує ці дані. Для докладних відомостей ознайомтеся зі сторінкою політики приватності в налаштуваннях додатку."; From b6b31f714e187677a231f7c31b26651ee449b3b3 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 07:08:23 +0000 Subject: [PATCH 30/54] Added translation using Weblate (Ukrainian) --- Riot/Assets/uk.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/uk.lproj/Vector.strings diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -0,0 +1 @@ + From 6450a9bb6fe3a6fba2f26c1ea71ba8f5e89d4847 Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 26 Nov 2018 15:46:13 -0600 Subject: [PATCH 31/54] i18n: Enable Japanese Signed-off-by: Aaron Raimist --- CHANGES.rst | 1 + Riot.xcodeproj/project.pbxproj | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index dac886b66..c14ed34b1 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changes in 0.7.x (2018-xx-xx) Improvements: * Replace the deprecated MXMediaManager and MXMediaLoader interfaces use (see matrix-org/matrix-ios-sdk/pull/593). * Replace the deprecated MXKAttachment and MXKImageView interfaces use (see matrix-org/matrix-ios-kit/pull/487). + * i18n: Enable Japanese (ja) Changes in 0.7.7 (2018-10-31) =============================================== diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index dc1207f6f..1e9fa3331 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -396,6 +396,9 @@ 32D7159F2146CC7F00DF59C9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; 32D715A02146CC8800DF59C9 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = ""; }; 3998C51E0196D42B366E0900 /* Pods-RiotPods-RiotShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-RiotShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-RiotShareExtension/Pods-RiotPods-RiotShareExtension.debug.xcconfig"; sourceTree = ""; }; + 3D78489021AC9E6400B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; + 3D78489121AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; + 3D78489221AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Vector.strings; sourceTree = ""; }; 78CD06F14060998545642330 /* Pods-RiotPods-Riot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-Riot.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-Riot/Pods-RiotPods-Riot.debug.xcconfig"; sourceTree = ""; }; 926FA53D1F4C132000F826C2 /* MXSession+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXSession+Riot.h"; sourceTree = ""; }; 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MXSession+Riot.m"; sourceTree = ""; }; @@ -2663,6 +2666,7 @@ zh_Hant, sq, es, + ja, ); mainGroup = F094A9991B78D8F000B1FBBF; productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */; @@ -2871,6 +2875,7 @@ "${PODS_ROOT}/WebRTC/WebRTC.framework", "${BUILT_PRODUCTS_DIR}/cmark/cmark.framework", "${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework", + "${BUILT_PRODUCTS_DIR}/libbase58/libbase58.framework", "${BUILT_PRODUCTS_DIR}/DTCoreText.default-Extension/DTCoreText.framework", "${BUILT_PRODUCTS_DIR}/MatrixKit-AppExtension/MatrixKit.framework", ); @@ -2890,6 +2895,7 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cmark.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libbase58.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -3187,6 +3193,7 @@ 32BDC9A3211C2C870064AF51 /* zh_Hant */, 32BDC9A6211C34C90064AF51 /* sq */, 32D7159E2146CC6F00DF59C9 /* es */, + 3D78489221AC9E6500B98A7D /* ja */, ); name = Vector.strings; sourceTree = ""; @@ -3207,6 +3214,7 @@ 32BDC9A1211C2C870064AF51 /* zh_Hant */, 32BDC9A4211C34C90064AF51 /* sq */, 32D715A02146CC8800DF59C9 /* es */, + 3D78489021AC9E6400B98A7D /* ja */, ); name = InfoPlist.strings; sourceTree = ""; @@ -3227,6 +3235,7 @@ 32BDC9A2211C2C870064AF51 /* zh_Hant */, 32BDC9A5211C34C90064AF51 /* sq */, 32D7159F2146CC7F00DF59C9 /* es */, + 3D78489121AC9E6500B98A7D /* ja */, ); name = Localizable.strings; sourceTree = ""; From 5f74b53ed5cd9ff35681936cdd8a181f1db58616 Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 26 Nov 2018 15:54:17 -0600 Subject: [PATCH 32/54] i18n: Enable Hungarian Signed-off-by: Aaron Raimist --- CHANGES.rst | 1 + Riot.xcodeproj/project.pbxproj | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index c14ed34b1..3f22871f2 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -5,6 +5,7 @@ Improvements: * Replace the deprecated MXMediaManager and MXMediaLoader interfaces use (see matrix-org/matrix-ios-sdk/pull/593). * Replace the deprecated MXKAttachment and MXKImageView interfaces use (see matrix-org/matrix-ios-kit/pull/487). * i18n: Enable Japanese (ja) + * i18n: Enable Hungarian (hu) Changes in 0.7.7 (2018-10-31) =============================================== diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index 1e9fa3331..d98c83e20 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -399,6 +399,9 @@ 3D78489021AC9E6400B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/InfoPlist.strings; sourceTree = ""; }; 3D78489121AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; 3D78489221AC9E6500B98A7D /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Vector.strings; sourceTree = ""; }; + 3D78489321ACA25200B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/InfoPlist.strings; sourceTree = ""; }; + 3D78489421ACA25300B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; + 3D78489521ACA25300B98A7D /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Vector.strings; sourceTree = ""; }; 78CD06F14060998545642330 /* Pods-RiotPods-Riot.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-Riot.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-Riot/Pods-RiotPods-Riot.debug.xcconfig"; sourceTree = ""; }; 926FA53D1F4C132000F826C2 /* MXSession+Riot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "MXSession+Riot.h"; sourceTree = ""; }; 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MXSession+Riot.m"; sourceTree = ""; }; @@ -2667,6 +2670,7 @@ sq, es, ja, + hu, ); mainGroup = F094A9991B78D8F000B1FBBF; productRefGroup = F094A9A31B78D8F000B1FBBF /* Products */; @@ -3194,6 +3198,7 @@ 32BDC9A6211C34C90064AF51 /* sq */, 32D7159E2146CC6F00DF59C9 /* es */, 3D78489221AC9E6500B98A7D /* ja */, + 3D78489521ACA25300B98A7D /* hu */, ); name = Vector.strings; sourceTree = ""; @@ -3215,6 +3220,7 @@ 32BDC9A4211C34C90064AF51 /* sq */, 32D715A02146CC8800DF59C9 /* es */, 3D78489021AC9E6400B98A7D /* ja */, + 3D78489321ACA25200B98A7D /* hu */, ); name = InfoPlist.strings; sourceTree = ""; @@ -3236,6 +3242,7 @@ 32BDC9A5211C34C90064AF51 /* sq */, 32D7159F2146CC7F00DF59C9 /* es */, 3D78489121AC9E6500B98A7D /* ja */, + 3D78489421ACA25300B98A7D /* hu */, ); name = Localizable.strings; sourceTree = ""; From b0573c6ec1e5885f76a95211a6b42a690853789b Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 26 Nov 2018 21:58:49 +0000 Subject: [PATCH 33/54] Added translation using Weblate (Icelandic) --- Riot/Assets/is.lproj/InfoPlist.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/is.lproj/InfoPlist.strings diff --git a/Riot/Assets/is.lproj/InfoPlist.strings b/Riot/Assets/is.lproj/InfoPlist.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/is.lproj/InfoPlist.strings @@ -0,0 +1 @@ + From de13b4a9a186a5dde1dfd49e76c081082d04e743 Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 26 Nov 2018 21:59:05 +0000 Subject: [PATCH 34/54] Added translation using Weblate (Icelandic) --- Riot/Assets/is.lproj/Localizable.strings | 1 + 1 file changed, 1 insertion(+) create mode 100644 Riot/Assets/is.lproj/Localizable.strings diff --git a/Riot/Assets/is.lproj/Localizable.strings b/Riot/Assets/is.lproj/Localizable.strings new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/Riot/Assets/is.lproj/Localizable.strings @@ -0,0 +1 @@ + From ded360e633d48dba802ef01df981cba9cb1fda9d Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 26 Nov 2018 16:19:21 -0600 Subject: [PATCH 35/54] Add a pull request template Signed-off-by: Aaron Raimist --- .github/PULL_REQUEST_TEMPLATE.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..3c0e4cbd2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,6 @@ +### Pull Request Checklist + + + +* [ ] Pull request is based on the develop branch +* [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst#sign-off) From 0edb045e0cd2c5c5512a7002eecfc85406b56d61 Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 27 Nov 2018 11:15:13 +0100 Subject: [PATCH 36/54] Login flow: Add generic isFlowSupported: and isFlowCompleted: methods --- .../Authentication/Views/AuthInputsView.m | 153 +++++------------- 1 file changed, 41 insertions(+), 112 deletions(-) diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index 0cf9f87a7..ae65005e7 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -247,7 +247,7 @@ if (type == MXKAuthenticationTypeLogin) { - if (self.isPasswordBasedFlowSupported) + if ([self isFlowSupported:kMXLoginFlowTypePassword]) { // Check required fields if ((!self.userLoginTextField.text.length && !nbPhoneNumber) || !self.passWordTextField.text.length) @@ -301,14 +301,14 @@ else { // Check email field - if (self.isEmailIdentityFlowSupported && !self.emailTextField.text.length) + if ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity] && !self.emailTextField.text.length) { if (self.areAllThirdPartyIdentifiersRequired) { NSLog(@"[AuthInputsView] Missing email"); errorMsg = NSLocalizedStringFromTable(@"auth_missing_email", @"Vector", nil); } - else if (self.isMSISDNFlowSupported && !self.phoneTextField.text.length && self.isThirdPartyIdentifierRequired) + else if ([self isFlowSupported:kMXLoginFlowTypeMSISDN] && !self.phoneTextField.text.length && self.isThirdPartyIdentifierRequired) { NSLog(@"[AuthInputsView] Missing email or phone number"); errorMsg = NSLocalizedStringFromTable(@"auth_missing_email_or_phone", @"Vector", nil); @@ -318,7 +318,7 @@ if (!errorMsg) { // Check phone field - if (self.isMSISDNFlowSupported && !self.phoneTextField.text.length) + if ([self isFlowSupported:kMXLoginFlowTypeMSISDN] && !self.phoneTextField.text.length) { if (self.areAllThirdPartyIdentifiersRequired) { @@ -402,7 +402,7 @@ // Handle here the supported login flow if (type == MXKAuthenticationTypeLogin) { - if (self.isPasswordBasedFlowSupported) + if ([self isFlowSupported:kMXLoginFlowTypePassword]) { // Check whether the user login has been set. NSString *user = self.userLoginTextField.text; @@ -473,7 +473,7 @@ else if (type == MXKAuthenticationTypeRegister) { // Check whether a phone number has been set, and if it is not handled yet - if (nbPhoneNumber && !self.isMSISDNFlowCompleted) + if (nbPhoneNumber && ![self isFlowCompleted:kMXLoginFlowTypeMSISDN]) { NSLog(@"[AuthInputsView] Prepare msisdn stage"); @@ -488,7 +488,7 @@ if (restClient) { // Check whether a second 3pid is available - _isThirdPartyIdentifierPending = (!self.emailContainer.isHidden && self.emailTextField.text.length && !self.isEmailIdentityFlowCompleted); + _isThirdPartyIdentifierPending = (!self.emailContainer.isHidden && self.emailTextField.text.length && ![self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]); // Launch msisdn validation NSString *e164 = [[NBPhoneNumberUtil sharedInstance] format:nbPhoneNumber numberFormat:NBEPhoneNumberFormatE164 error:nil]; @@ -563,7 +563,7 @@ NSLog(@"[AuthInputsView] Authentication failed during the msisdn stage"); } // Check whether an email has been set, and if it is not handled yet - else if (!self.emailContainer.isHidden && self.emailTextField.text.length && !self.isEmailIdentityFlowCompleted) + else if (!self.emailContainer.isHidden && self.emailTextField.text.length && ![self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]) { NSLog(@"[AuthInputsView] Prepare email identity stage"); @@ -578,7 +578,7 @@ if (restClient) { // Check whether a second 3pid is available - _isThirdPartyIdentifierPending = (nbPhoneNumber && !self.isMSISDNFlowCompleted); + _isThirdPartyIdentifierPending = (nbPhoneNumber && ![self isFlowCompleted:kMXLoginFlowTypeMSISDN]); // Launch email validation submittedEmail = [[MXK3PID alloc] initWithMedium:kMX3PIDMediumEmail andAddress:self.emailTextField.text]; @@ -603,7 +603,7 @@ @"auth": @{@"session":currentSession.session, @"threepid_creds": @{@"client_secret": submittedEmail.clientSecret, @"id_server": identServerURL.host, @"sid": submittedEmail.sid}, @"type": kMXLoginFlowTypeEmailIdentity}, @"username": self.userLoginTextField.text, @"password": self.passWordTextField.text, - @"bind_msisdn": [NSNumber numberWithBool:self.isMSISDNFlowCompleted], + @"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]), @"bind_email": @(YES) }; @@ -664,7 +664,7 @@ } NSLog(@"[AuthInputsView] Authentication failed during the email identity stage"); } - else if (self.isRecaptchaFlowRequired) + else if ([self isFlowSupported:kMXLoginFlowTypeRecaptcha]) { NSLog(@"[AuthInputsView] Prepare reCaptcha stage"); @@ -676,8 +676,8 @@ @"auth": @{@"session":currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha}, @"username": self.userLoginTextField.text, @"password": self.passWordTextField.text, - @"bind_msisdn": [NSNumber numberWithBool:self.isMSISDNFlowCompleted], - @"bind_email": [NSNumber numberWithBool:self.isEmailIdentityFlowCompleted] + @"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]), + @"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]) }; callback(parameters, nil); @@ -693,7 +693,7 @@ // Async response return; } - else if (self.isDummyFlowSupported) + else if ([self isFlowSupported:kMXLoginFlowTypeDummy]) { parameters = @{ @"auth": @{@"session":currentSession.session, @"type": kMXLoginFlowTypeDummy}, @@ -703,7 +703,7 @@ @"bind_email": @(NO) }; } - else if (self.isPasswordBasedFlowSupported) + else if ([self isFlowSupported:kMXLoginFlowTypePassword]) { // Note: this use case was not tested yet. parameters = @{ @@ -725,8 +725,8 @@ { currentSession.completed = completedStages; - BOOL isMSISDNFlowCompleted = self.isMSISDNFlowCompleted; - BOOL isEmailFlowCompleted = self.isEmailIdentityFlowCompleted; + BOOL isMSISDNFlowCompleted = [self isFlowCompleted:kMXLoginFlowTypeMSISDN]; + BOOL isEmailFlowCompleted = [self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]; // Check the supported use cases if (isMSISDNFlowCompleted && self.isThirdPartyIdentifierPending) @@ -738,7 +738,7 @@ return; } - else if ((isMSISDNFlowCompleted || isEmailFlowCompleted) && self.isRecaptchaFlowRequired) + else if ((isMSISDNFlowCompleted || isEmailFlowCompleted) && [self isFlowSupported:kMXLoginFlowTypeRecaptcha]) { NSLog(@"[AuthInputsView] Display reCaptcha stage"); @@ -930,7 +930,7 @@ - (BOOL)areThirdPartyIdentifiersSupported { - return (self.isEmailIdentityFlowSupported || self.isMSISDNFlowSupported); + return ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity] || [self isFlowSupported:kMXLoginFlowTypeMSISDN]); } - (BOOL)isThirdPartyIdentifierRequired @@ -974,8 +974,8 @@ return NO; } - BOOL isEmailIdentityFlowSupported = self.isEmailIdentityFlowSupported; - BOOL isMSISDNFlowSupported = self.isMSISDNFlowSupported; + BOOL isEmailIdentityFlowSupported = [self isFlowSupported:kMXLoginFlowTypeEmailIdentity]; + BOOL isMSISDNFlowSupported = [self isFlowSupported:kMXLoginFlowTypeMSISDN]; for (MXLoginFlow *loginFlow in currentSession.flows) { @@ -1036,7 +1036,7 @@ } else { - if (self.isEmailIdentityFlowSupported) + if ([self isFlowSupported:kMXLoginFlowTypeEmailIdentity]) { if (self.isThirdPartyIdentifierRequired) { @@ -1062,7 +1062,7 @@ lastViewContainer = self.emailContainer; } - if (self.isMSISDNFlowSupported) + if ([self isFlowSupported:kMXLoginFlowTypeMSISDN]) { self.phoneTextField.returnKeyType = UIReturnKeyDone; @@ -1499,7 +1499,7 @@ @"username": self.userLoginTextField.text, @"password": self.passWordTextField.text, @"bind_msisdn": @(YES), - @"bind_email": [NSNumber numberWithBool:self.isEmailIdentityFlowCompleted] + @"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]) }; callback(parameters, nil); @@ -1565,111 +1565,40 @@ [self.delegate authInputsView:self presentAlertController:inputsAlert]; } -- (BOOL)isPasswordBasedFlowSupported -{ - if (currentSession) - { - for (MXLoginFlow *loginFlow in currentSession.flows) - { - if ([loginFlow.type isEqualToString:kMXLoginFlowTypePassword] || [loginFlow.stages indexOfObject:kMXLoginFlowTypePassword] != NSNotFound) - { - return YES; - } - } - } - - return NO; -} +#pragma mark - Flow state -- (BOOL)isEmailIdentityFlowSupported -{ - if (currentSession) - { - for (MXLoginFlow *loginFlow in currentSession.flows) - { - if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeEmailIdentity] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeEmailIdentity]) - { - return YES; - } - } - } - - return NO; -} +/** + Check if a flow (kMXLoginFlowType*) is part of the required flows steps. -- (BOOL)isEmailIdentityFlowCompleted + @param flow the flow type to check. + @return YES if the the flow must be implemented. + */ +- (BOOL)isFlowSupported:(NSString *)flow { - if (currentSession && currentSession.completed) + for (MXLoginFlow *loginFlow in currentSession.flows) { - if ([currentSession.completed indexOfObject:kMXLoginFlowTypeEmailIdentity] != NSNotFound) + if ([loginFlow.type isEqualToString:flow] || [loginFlow.stages indexOfObject:flow] != NSNotFound) { return YES; } } - + return NO; } -- (BOOL)isMSISDNFlowSupported -{ - if (currentSession) - { - for (MXLoginFlow *loginFlow in currentSession.flows) - { - if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeMSISDN] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeMSISDN]) - { - return YES; - } - } - } - - return NO; -} +/** + Check if a flow (kMXLoginFlowType*) has already been completed. -- (BOOL)isMSISDNFlowCompleted + @param flow the flow type to check. + @return YES if the the flow has been completedd. + */ +- (BOOL)isFlowCompleted:(NSString *)flow { - if (currentSession && currentSession.completed) + if (currentSession.completed && [currentSession.completed indexOfObject:flow] != NSNotFound) { - if ([currentSession.completed indexOfObject:kMXLoginFlowTypeMSISDN] != NSNotFound) - { - return YES; - } - } - - return NO; -} - -- (BOOL)isRecaptchaFlowRequired -{ - if (currentSession && currentSession.flows) - { - for (MXLoginFlow *loginFlow in currentSession.flows) - { - if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeRecaptcha] == NSNotFound && ![loginFlow.type isEqualToString:kMXLoginFlowTypeRecaptcha]) - { - return NO; - } - } - return YES; } - - return NO; -} -- (BOOL)isDummyFlowSupported -{ - if (currentSession) - { - for (MXLoginFlow *loginFlow in currentSession.flows) - { - if ([loginFlow.stages indexOfObject:kMXLoginFlowTypeDummy] != NSNotFound || [loginFlow.type isEqualToString:kMXLoginFlowTypeDummy]) - { - return YES; - } - } - } - return NO; } From 1d3c45db9a2fdce3e189e783e35da4b9a69a43de Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 27 Nov 2018 11:20:07 +0100 Subject: [PATCH 37/54] Login flow: Make more usage of the isFlowCompleted: method --- Riot/Modules/Authentication/Views/AuthInputsView.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index ae65005e7..bee542243 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -664,7 +664,7 @@ } NSLog(@"[AuthInputsView] Authentication failed during the email identity stage"); } - else if ([self isFlowSupported:kMXLoginFlowTypeRecaptcha]) + else if ([self isFlowSupported:kMXLoginFlowTypeRecaptcha] && ![self isFlowCompleted:kMXLoginFlowTypeRecaptcha]) { NSLog(@"[AuthInputsView] Prepare reCaptcha stage"); @@ -693,7 +693,7 @@ // Async response return; } - else if ([self isFlowSupported:kMXLoginFlowTypeDummy]) + else if ([self isFlowSupported:kMXLoginFlowTypeDummy] && ![self isFlowCompleted:kMXLoginFlowTypeDummy]) { parameters = @{ @"auth": @{@"session":currentSession.session, @"type": kMXLoginFlowTypeDummy}, @@ -703,7 +703,7 @@ @"bind_email": @(NO) }; } - else if ([self isFlowSupported:kMXLoginFlowTypePassword]) + else if ([self isFlowSupported:kMXLoginFlowTypePassword] && ![self isFlowCompleted:kMXLoginFlowTypePassword]) { // Note: this use case was not tested yet. parameters = @{ @@ -738,7 +738,8 @@ return; } - else if ((isMSISDNFlowCompleted || isEmailFlowCompleted) && [self isFlowSupported:kMXLoginFlowTypeRecaptcha]) + else if ((isMSISDNFlowCompleted || isEmailFlowCompleted) + && [self isFlowSupported:kMXLoginFlowTypeRecaptcha] && ![self isFlowCompleted:kMXLoginFlowTypeRecaptcha]) { NSLog(@"[AuthInputsView] Display reCaptcha stage"); From e8156d36fab3164e372b1fe4956fe9f6ad209508 Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 27 Nov 2018 15:52:05 +0100 Subject: [PATCH 38/54] Login flow: Make User Agreement part of the registration flow #1939 --- Podfile | 1 + Riot.xcodeproj/project.pbxproj | 12 + Riot/Assets/en.lproj/Vector.strings | 1 + .../AuthenticationViewController.m | 5 +- .../Authentication/Views/AuthInputsView.h | 3 + .../Authentication/Views/AuthInputsView.m | 68 +++++- .../Authentication/Views/AuthInputsView.xib | 15 +- .../Authentication/Views/TermsView.swift | 208 ++++++++++++++++++ .../Authentication/Views/TermsView.xib | 55 +++++ Riot/SupportingFiles/Riot-Bridging-Header.h | 5 + 10 files changed, 366 insertions(+), 7 deletions(-) create mode 100644 Riot/Modules/Authentication/Views/TermsView.swift create mode 100644 Riot/Modules/Authentication/Views/TermsView.xib diff --git a/Podfile b/Podfile index 3d5f36b11..515dc2228 100644 --- a/Podfile +++ b/Podfile @@ -65,6 +65,7 @@ end abstract_target 'RiotPods' do pod 'GBDeviceInfo', '~> 5.2.0' + pod 'Reusable', '~> 4.0' # Piwik for analytics # While https://github.com/matomo-org/matomo-sdk-ios/pull/223 is not released, use the PR branch diff --git a/Riot.xcodeproj/project.pbxproj b/Riot.xcodeproj/project.pbxproj index dc1207f6f..78cc38375 100644 --- a/Riot.xcodeproj/project.pbxproj +++ b/Riot.xcodeproj/project.pbxproj @@ -12,7 +12,9 @@ 24EEE5A31F23A8C300B3C705 /* AvatarGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = F083BC111E7009EC00A9B29C /* AvatarGenerator.m */; }; 3233F7461F3497E2006ACA81 /* JitsiMeet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3233F7441F3497DA006ACA81 /* JitsiMeet.framework */; }; 3233F7471F3497E2006ACA81 /* JitsiMeet.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3233F7441F3497DA006ACA81 /* JitsiMeet.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3275FD8B21A5A2C500B9C13D /* TermsView.swift */; }; 3284A35120A07C210044F922 /* postMessageAPI.js in Resources */ = {isa = PBXBuildFile; fileRef = 3284A35020A07C210044F922 /* postMessageAPI.js */; }; + 32B1FEDB21A46F2C00637127 /* TermsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32B1FEDA21A46F2C00637127 /* TermsView.xib */; }; 358DB9429359F97520545D35 /* Pods_RiotPods_RiotShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F5856BA7A55E53C0AEAFC084 /* Pods_RiotPods_RiotShareExtension.framework */; }; 89C94E649229EA68AE787E9E /* Pods_RiotPods_Riot.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2510A69B4A681C1FEC36E848 /* Pods_RiotPods_Riot.framework */; }; 926FA53F1F4C132000F826C2 /* MXSession+Riot.m in Sources */ = {isa = PBXBuildFile; fileRef = 926FA53E1F4C132000F826C2 /* MXSession+Riot.m */; }; @@ -385,7 +387,9 @@ 3267EFB420E379FD00FF1CAA /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; fileEncoding = 4; path = Podfile; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 3267EFB520E379FD00FF1CAA /* AUTHORS.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AUTHORS.rst; sourceTree = ""; }; 3267EFB620E379FD00FF1CAA /* README.rst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.rst; sourceTree = ""; }; + 3275FD8B21A5A2C500B9C13D /* TermsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsView.swift; sourceTree = ""; }; 3284A35020A07C210044F922 /* postMessageAPI.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = postMessageAPI.js; sourceTree = ""; }; + 32B1FEDA21A46F2C00637127 /* TermsView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TermsView.xib; sourceTree = ""; }; 32BDC9A1211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/InfoPlist.strings; sourceTree = ""; }; 32BDC9A2211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/Localizable.strings; sourceTree = ""; }; 32BDC9A3211C2C870064AF51 /* zh_Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = zh_Hant; path = zh_Hant.lproj/Vector.strings; sourceTree = ""; }; @@ -1892,6 +1896,8 @@ B1B5579720EF575A00210D55 /* ForgotPasswordInputsView.h */, B1B5579420EF575A00210D55 /* ForgotPasswordInputsView.m */, B1B5579820EF575A00210D55 /* ForgotPasswordInputsView.xib */, + 32B1FEDA21A46F2C00637127 /* TermsView.xib */, + 3275FD8B21A5A2C500B9C13D /* TermsView.swift */, ); path = Views; sourceTree = ""; @@ -2768,6 +2774,7 @@ B1B558D920EF768F00210D55 /* RoomOutgoingEncryptedAttachmentBubbleCell.xib in Resources */, B1B5573020EE6C4D00210D55 /* BugReportViewController.xib in Resources */, B169329B20F39E6300746532 /* Main.storyboard in Resources */, + 32B1FEDB21A46F2C00637127 /* TermsView.xib in Resources */, B1B5578E20EF568D00210D55 /* GroupInviteTableViewCell.xib in Resources */, B1B5582020EF625800210D55 /* SimpleRoomTitleView.xib in Resources */, F083BE061E7009ED00A9B29C /* Riot-Defaults.plist in Resources */, @@ -2868,9 +2875,11 @@ "${BUILT_PRODUCTS_DIR}/OLMKit/OLMKit.framework", "${BUILT_PRODUCTS_DIR}/PiwikTracker/PiwikTracker.framework", "${BUILT_PRODUCTS_DIR}/Realm/Realm.framework", + "${BUILT_PRODUCTS_DIR}/Reusable/Reusable.framework", "${PODS_ROOT}/WebRTC/WebRTC.framework", "${BUILT_PRODUCTS_DIR}/cmark/cmark.framework", "${BUILT_PRODUCTS_DIR}/libPhoneNumber-iOS/libPhoneNumber_iOS.framework", + "${BUILT_PRODUCTS_DIR}/libbase58/libbase58.framework", "${BUILT_PRODUCTS_DIR}/DTCoreText.default-Extension/DTCoreText.framework", "${BUILT_PRODUCTS_DIR}/MatrixKit-AppExtension/MatrixKit.framework", ); @@ -2887,9 +2896,11 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/OLMKit.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PiwikTracker.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reusable.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WebRTC.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cmark.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libPhoneNumber_iOS.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/libbase58.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -3023,6 +3034,7 @@ B1B558E920EF768F00210D55 /* RoomSelectedStickerBubbleCell.m in Sources */, B1B558DF20EF768F00210D55 /* RoomOutgoingTextMsgWithoutSenderInfoBubbleCell.m in Sources */, F083BE041E7009ED00A9B29C /* Tools.m in Sources */, + 3275FD8C21A5A2C500B9C13D /* TermsView.swift in Sources */, B1B5573D20EE6C4D00210D55 /* WebViewViewController.m in Sources */, B1B5572720EE6C4D00210D55 /* RoomSearchViewController.m in Sources */, F05927C91FDED836009F2A68 /* MXGroup+Riot.m in Sources */, diff --git a/Riot/Assets/en.lproj/Vector.strings b/Riot/Assets/en.lproj/Vector.strings index e34fb4f23..9fad99136 100644 --- a/Riot/Assets/en.lproj/Vector.strings +++ b/Riot/Assets/en.lproj/Vector.strings @@ -107,6 +107,7 @@ "auth_reset_password_error_not_found" = "Your email address does not appear to be associated with a Matrix ID on this Homeserver."; "auth_reset_password_success_message" = "Your password has been reset.\n\nYou have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, re-log in on each device."; "auth_add_email_and_phone_warning" = "Registration with email and phone number at once is not supported yet until the api exists. Only the phone number will be taken into account. You may add your email to your profile in settings."; +"auth_accept_policies" = "Please review and accept the policies of this homeserver:"; // Chat creation "room_creation_title" = "New Chat"; diff --git a/Riot/Modules/Authentication/AuthenticationViewController.m b/Riot/Modules/Authentication/AuthenticationViewController.m index eb8c29a81..cd16fe9d5 100644 --- a/Riot/Modules/Authentication/AuthenticationViewController.m +++ b/Riot/Modules/Authentication/AuthenticationViewController.m @@ -801,11 +801,10 @@ #pragma mark - MXKAuthInputsViewDelegate -- (void)authInputsView:(MXKAuthInputsView *)authInputsView presentViewController:(UIViewController*)viewControllerToPresent +- (void)authInputsView:(MXKAuthInputsView *)authInputsView presentViewController:(UIViewController*)viewControllerToPresent animated:(BOOL)animated { [self dismissKeyboard]; - - [self presentViewController:viewControllerToPresent animated:YES completion:nil]; + [self presentViewController:viewControllerToPresent animated:animated completion:nil]; } - (void)authInputsViewDidCancelOperation:(MXKAuthInputsView *)authInputsView diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.h b/Riot/Modules/Authentication/Views/AuthInputsView.h index 02fa0edad..e6ce0f9ac 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.h +++ b/Riot/Modules/Authentication/Views/AuthInputsView.h @@ -17,6 +17,8 @@ #import +#import "Riot-Swift.h" + @interface AuthInputsView : MXKAuthInputsView @property (weak, nonatomic) IBOutlet UITextField *userLoginTextField; @@ -50,6 +52,7 @@ @property (weak, nonatomic) IBOutlet UILabel *messageLabel; @property (weak, nonatomic) IBOutlet MXKAuthenticationRecaptchaWebView *recaptchaWebView; +@property (weak, nonatomic) IBOutlet TermsView *termsView; /** Tell whether some third-party identifiers may be added during the account registration. diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index bee542243..6f27de631 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -710,6 +710,30 @@ @"auth": @{@"session":currentSession.session, @"username": self.userLoginTextField.text, @"password": self.passWordTextField.text, @"type": kMXLoginFlowTypePassword} }; } + else if ([self isFlowSupported:kMXLoginFlowTypeTerms] && ![self isFlowCompleted:kMXLoginFlowTypeTerms]) + { + NSLog(@"[AuthInputsView] Prepare terms stage"); + + MXWeakify(self); + [self displayTermsView:^{ + MXStrongifyAndReturnIfNil(self); + + NSDictionary *parameters = @{ + @"auth": @{ + @"session":self->currentSession.session, + @"type": kMXLoginFlowTypeTerms + }, + @"username": self.userLoginTextField.text, + @"password": self.passWordTextField.text, + @"bind_msisdn": @([self isFlowCompleted:kMXLoginFlowTypeMSISDN]), + @"bind_email": @([self isFlowCompleted:kMXLoginFlowTypeEmailIdentity]) + }; + callback(parameters, nil); + }]; + + // Async response + return; + } } } @@ -779,6 +803,15 @@ }]; + return; + } + // TODO: avoid that + else if ([self isFlowSupported:kMXLoginFlowTypeTerms] && ![self isFlowCompleted:kMXLoginFlowTypeTerms]) + { + NSLog(@"[AuthInputsView] Prepare a new terms stage"); + + [self prepareParameters:callback]; + return; } } @@ -1158,7 +1191,7 @@ UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_icon"] style:UIBarButtonItemStylePlain target:self action:@selector(dismissCountryPicker)]; phoneNumberCountryPicker.navigationItem.leftBarButtonItem = leftBarButtonItem; - [self.delegate authInputsView:self presentViewController:phoneNumberPickerNavigationController]; + [self.delegate authInputsView:self presentViewController:phoneNumberPickerNavigationController animated:YES]; } } @@ -1259,6 +1292,7 @@ self.messageLabelTopConstraint.constant = 8; self.messageLabel.hidden = YES; self.recaptchaWebView.hidden = YES; + self.termsView.hidden = YES; _currentLastContainer = nil; } @@ -1339,7 +1373,11 @@ { return YES; } - + else if ([flowType isEqualToString:kMXLoginFlowTypeTerms]) + { + return YES; + } + return NO; } @@ -1566,6 +1604,32 @@ [self.delegate authInputsView:self presentAlertController:inputsAlert]; } +- (BOOL)displayTermsView:(dispatch_block_t)onAcceptedCallback +{ + // Extract data + NSDictionary *loginTermsData = currentSession.params[kMXLoginFlowTypeTerms]; + MXLoginTerms *loginTerms; + MXJSONModelSetMXJSONModel(loginTerms, MXLoginTerms.class, loginTermsData); + + if (loginTerms) + { + [self hideInputsContainer]; + + self.messageLabel.hidden = NO; + self.messageLabel.text = NSLocalizedStringFromTable(@"auth_accept_policies", @"Vector", nil); + + self.termsView.hidden = NO; + self.currentLastContainer = self.termsView; + + self.termsView.delegate = self.delegate; + [self.termsView displayTermsWithTerms:loginTerms onAccepted:onAcceptedCallback]; + + return YES; + } + + return NO; +} + #pragma mark - Flow state /** diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.xib b/Riot/Modules/Authentication/Views/AuthInputsView.xib index ef5ee2f58..c60119b25 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.xib +++ b/Riot/Modules/Authentication/Views/AuthInputsView.xib @@ -1,11 +1,11 @@ - + - + @@ -247,6 +247,13 @@ + @@ -258,6 +265,7 @@ + @@ -265,11 +273,13 @@ + + @@ -300,6 +310,7 @@ + diff --git a/Riot/Modules/Authentication/Views/TermsView.swift b/Riot/Modules/Authentication/Views/TermsView.swift new file mode 100644 index 000000000..626e0fe11 --- /dev/null +++ b/Riot/Modules/Authentication/Views/TermsView.swift @@ -0,0 +1,208 @@ +/* + Copyright 2018 New Vector Ltd + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ + +import Foundation +import Reusable + +final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableViewDataSource { + + @IBOutlet weak var tableView: UITableView! + @IBOutlet weak var acceptButton: UIButton! + + @objc weak var delegate: MXKAuthInputsViewDelegate? + + private var acceptedCallback: (()->Void)? + + + /// NavigationVC to display a policy content + private var navigationController: RiotNavigationController? + + /// The list of policies to be accepted by the end user + private var policies: [MXLoginPolicyData] = [] + + /// Policies already accepted by the end user + /// Combined with `policies`, this is the view model for `tableView` + private var acceptedPolicies: Set = [] + + /// The index of the policy being displayed fullscreen within `navigationController` + private var displayedPolicyIndex: Int? + + + // MARK: - Setup + + convenience init() { + self.init(frame: CGRect.zero) + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + loadNibContent() + commonInit() + } + + override init(frame: CGRect) { + super.init(frame: frame) + loadNibContent() + commonInit() + } + + private func commonInit() { + + tableView.delegate = self + tableView.dataSource = self + tableView.separatorStyle = .none + tableView.register(TableViewCellWithCheckBoxAndLabel.nib(), forCellReuseIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier()) + + acceptButton.layer.cornerRadius = 5 + acceptButton.clipsToBounds = true + acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .normal) + acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .highlighted) + + customizeViewRendering() + } + + func customizeViewRendering() { + acceptButton.backgroundColor = kRiotColorGreen + } + + + // MARK: - Public + + /// Display a list of policies the end user must accept. + /// + /// - Parameters: + /// - terms: Terms data sent by the homeserver. + /// - onAccepted: block called when the user has accepted all of them. + @objc func displayTerms(terms: MXLoginTerms, onAccepted: @escaping () -> Void) { + + acceptedCallback = onAccepted + + let lang: String? = Bundle.mxk_language() + + policies = terms.policiesData(forLanguage: lang, defaultLanguage: "en") + acceptedPolicies.removeAll() + + reload() + } + + + // MARK: - Private + + private func reload() { + tableView.reloadData() + + // Enable the button only if the user has accepted all policies + acceptButton.isEnabled = (policies.count == acceptedPolicies.count) + acceptButton.alpha = acceptButton.isEnabled ? 1 : 0.5 + } + + @IBAction func didAcceptButtonTapped(_ sender: Any) { + if policies.count == acceptedPolicies.count { + acceptedCallback?() + } + } + + + // MARK: - UITableViewDataSource + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return policies.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier(), for: indexPath) as! TableViewCellWithCheckBoxAndLabel + + let policy = policies[indexPath.row] + let accepted = acceptedPolicies .contains(indexPath.row) + + cell.label.text = policy.name + cell.isEnabled = accepted + cell.accessoryType = .disclosureIndicator + + + let gesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didTapCheckbox)) + gesture.numberOfTapsRequired = 1 + gesture.numberOfTouchesRequired = 1 + + cell.checkBox.tag = indexPath.row + cell.checkBox?.isUserInteractionEnabled = true + cell.checkBox?.addGestureRecognizer(gesture) + + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + + self.displayPolicy(policyIndex: indexPath.row) + } + + @objc private func didTapCheckbox(sender: UITapGestureRecognizer) { + + if let policyIndex = sender.view?.tag { + + if acceptedPolicies.contains(policyIndex) { + acceptedPolicies.remove(policyIndex) + } + else { + acceptedPolicies.insert(policyIndex) + } + + reload() + } + } + + + // MARK: - Policy content display + + func displayPolicy(policyIndex: Int) { + + displayedPolicyIndex = policyIndex + let policy = policies[policyIndex] + + // Display the policy webpage into our webview + let webViewViewController: WebViewViewController = WebViewViewController(url: policy.url) + webViewViewController.title = policy.name + + let leftBarButtonItem: UIBarButtonItem = UIBarButtonItem(image: UIImage(named: "back_icon"), style: .plain, target: self, action:#selector(didTapCancelOnPolicyScreen)) + webViewViewController.navigationItem.leftBarButtonItem = leftBarButtonItem + + let rightBarButtonItem: UIBarButtonItem = UIBarButtonItem(title: NSLocalizedString("accept", tableName: "Vector", comment: ""), style: .plain, target: self, action: #selector(didAcceptPolicy)) + webViewViewController.navigationItem.rightBarButtonItem = rightBarButtonItem + + navigationController = RiotNavigationController() + delegate?.authInputsView!(nil, present: navigationController, animated: true) + navigationController?.pushViewController(webViewViewController, animated: false) + } + + @objc private func didTapCancelOnPolicyScreen() { + removePolicyScreen() + } + + @objc private func didAcceptPolicy() { + acceptedPolicies.insert(displayedPolicyIndex!) + + removePolicyScreen() + reload() + } + + private func removePolicyScreen() { + displayedPolicyIndex = nil + + navigationController?.dismiss(animated: false) + navigationController = nil + } +} diff --git a/Riot/Modules/Authentication/Views/TermsView.xib b/Riot/Modules/Authentication/Views/TermsView.xib new file mode 100644 index 000000000..c947e9bba --- /dev/null +++ b/Riot/Modules/Authentication/Views/TermsView.xib @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Riot/SupportingFiles/Riot-Bridging-Header.h b/Riot/SupportingFiles/Riot-Bridging-Header.h index 59026bb56..9dd6fab82 100644 --- a/Riot/SupportingFiles/Riot-Bridging-Header.h +++ b/Riot/SupportingFiles/Riot-Bridging-Header.h @@ -3,4 +3,9 @@ // @import MatrixSDK; +@import MatrixKit; + #import "WebViewViewController.h" +#import "RiotNavigationController.h" +#import "RiotDesignValues.h" +#import "TableViewCellWithCheckBoxAndLabel.h" From c8b489fd0c57c8cb1559bf8ae8351f43a487cc0a Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 27 Nov 2018 17:06:30 +0100 Subject: [PATCH 39/54] AuthInputsView: Refactor a bit updateAuthSessionWithCompletedStages --- .../Authentication/Views/AuthInputsView.m | 45 +++++++------------ 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index 6f27de631..2c3c5789b 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -766,46 +766,33 @@ && [self isFlowSupported:kMXLoginFlowTypeRecaptcha] && ![self isFlowCompleted:kMXLoginFlowTypeRecaptcha]) { NSLog(@"[AuthInputsView] Display reCaptcha stage"); - - [self displayRecaptchaForm:^(NSString *response) { - - if (response.length) - { - // Update the parameters dict - NSDictionary *parameters; - - if (externalRegistrationParameters) + + if (externalRegistrationParameters) + { + [self displayRecaptchaForm:^(NSString *response) { + + if (response.length) { // We finalize here a registration triggered from external inputs. All the required data are handled by the session id - parameters = @{ + NSDictionary *parameters = @{ @"auth": @{@"session": currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha}, }; + callback (parameters, nil); } else { - parameters = @{ - @"auth": @{@"session": currentSession.session, @"response": response, @"type": kMXLoginFlowTypeRecaptcha}, - @"username": self.userLoginTextField.text, - @"password": self.passWordTextField.text, - @"bind_msisdn": [NSNumber numberWithBool:isMSISDNFlowCompleted], - @"bind_email": [NSNumber numberWithBool:isEmailFlowCompleted] - }; + NSLog(@"[AuthInputsView] reCaptcha stage failed"); + callback (nil, [NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[NSBundle mxk_localizedStringForKey:@"not_supported_yet"]}]); } - - - callback (parameters, nil); - } - else - { - NSLog(@"[AuthInputsView] reCaptcha stage failed"); - callback (nil, [NSError errorWithDomain:MXKAuthErrorDomain code:0 userInfo:@{NSLocalizedDescriptionKey:[NSBundle mxk_localizedStringForKey:@"not_supported_yet"]}]); - } - - }]; + }]; + } + else + { + [self prepareParameters:callback]; + } return; } - // TODO: avoid that else if ([self isFlowSupported:kMXLoginFlowTypeTerms] && ![self isFlowCompleted:kMXLoginFlowTypeTerms]) { NSLog(@"[AuthInputsView] Prepare a new terms stage"); From 5d6f3c9c04491a6877753ac1c6d28cd27541ea56 Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 27 Nov 2018 18:36:06 +0100 Subject: [PATCH 40/54] Login flow: Make User Agreement part of the registration flow Some fixes --- Riot/Modules/Authentication/Views/AuthInputsView.m | 2 +- Riot/Modules/Authentication/Views/TermsView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index 2c3c5789b..4b0747505 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -1151,7 +1151,7 @@ - (IBAction)selectPhoneNumberCountry:(id)sender { - if ([self.delegate respondsToSelector:@selector(authInputsView:presentViewController:)]) + if ([self.delegate respondsToSelector:@selector(authInputsView:presentViewController:animated:)]) { phoneNumberCountryPicker = [CountryPickerViewController countryPickerViewController]; phoneNumberCountryPicker.delegate = self; diff --git a/Riot/Modules/Authentication/Views/TermsView.swift b/Riot/Modules/Authentication/Views/TermsView.swift index 626e0fe11..a62334151 100644 --- a/Riot/Modules/Authentication/Views/TermsView.swift +++ b/Riot/Modules/Authentication/Views/TermsView.swift @@ -184,7 +184,7 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie webViewViewController.navigationItem.rightBarButtonItem = rightBarButtonItem navigationController = RiotNavigationController() - delegate?.authInputsView!(nil, present: navigationController, animated: true) + delegate?.authInputsView!(nil, present: navigationController, animated: false) navigationController?.pushViewController(webViewViewController, animated: false) } From 8a9d050d07ca512998b0a54b4ecf44116537d0bc Mon Sep 17 00:00:00 2001 From: manuroe Date: Wed, 28 Nov 2018 10:18:59 +0100 Subject: [PATCH 41/54] PULL_REQUEST_TEMPLATE: add a checkbox for "Pull request updates CHANGES.rst" and "Pull request includes screenshots or videos of UI changes" --- .github/PULL_REQUEST_TEMPLATE.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3c0e4cbd2..11896f805 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,4 +3,6 @@ * [ ] Pull request is based on the develop branch +* [ ] Pull request updates [CHANGES.rst](https://github.com/vector-im/riot-ios/blob/develop/CHANGES.rst) +* [ ] Pull request includes screenshots or videos of UI changes * [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst#sign-off) From a247cefd31abec78b88ab83c6dfc856c6a25ddd5 Mon Sep 17 00:00:00 2001 From: manuroe Date: Fri, 30 Nov 2018 12:42:31 +0100 Subject: [PATCH 42/54] Login flow: Fix Steve's remarks --- .../Authentication/Views/TermsView.swift | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Riot/Modules/Authentication/Views/TermsView.swift b/Riot/Modules/Authentication/Views/TermsView.swift index a62334151..443b9486e 100644 --- a/Riot/Modules/Authentication/Views/TermsView.swift +++ b/Riot/Modules/Authentication/Views/TermsView.swift @@ -59,6 +59,12 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie commonInit() } + override func layoutSubviews() { + super.layoutSubviews() + + acceptButton.layer.cornerRadius = 5 + } + private func commonInit() { tableView.delegate = self @@ -66,7 +72,6 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie tableView.separatorStyle = .none tableView.register(TableViewCellWithCheckBoxAndLabel.nib(), forCellReuseIdentifier: TableViewCellWithCheckBoxAndLabel.defaultReuseIdentifier()) - acceptButton.layer.cornerRadius = 5 acceptButton.clipsToBounds = true acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .normal) acceptButton.setTitle(NSLocalizedString("accept", tableName: "Vector", comment: ""), for: .highlighted) @@ -139,8 +144,11 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie gesture.numberOfTouchesRequired = 1 cell.checkBox.tag = indexPath.row + cell.checkBox?.isUserInteractionEnabled = true - cell.checkBox?.addGestureRecognizer(gesture) + if (cell.checkBox?.gestureRecognizers?.count == 0) { + cell.checkBox?.addGestureRecognizer(gesture) + } return cell } @@ -152,17 +160,17 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie @objc private func didTapCheckbox(sender: UITapGestureRecognizer) { - if let policyIndex = sender.view?.tag { - - if acceptedPolicies.contains(policyIndex) { - acceptedPolicies.remove(policyIndex) - } - else { - acceptedPolicies.insert(policyIndex) - } - - reload() + guard let policyIndex = sender.view?.tag else { + return } + + if acceptedPolicies.contains(policyIndex) { + acceptedPolicies.remove(policyIndex) + } else { + acceptedPolicies.insert(policyIndex) + } + + reload() } @@ -184,7 +192,7 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie webViewViewController.navigationItem.rightBarButtonItem = rightBarButtonItem navigationController = RiotNavigationController() - delegate?.authInputsView!(nil, present: navigationController, animated: false) + delegate?.authInputsView?(nil, present: navigationController, animated: false) navigationController?.pushViewController(webViewViewController, animated: false) } @@ -193,7 +201,10 @@ final class TermsView: UIView, NibOwnerLoadable, UITableViewDelegate, UITableVie } @objc private func didAcceptPolicy() { - acceptedPolicies.insert(displayedPolicyIndex!) + + if let displayedPolicyIndex = self.displayedPolicyIndex { + acceptedPolicies.insert(displayedPolicyIndex) + } removePolicyScreen() reload() From 8ced213470ade4ee193a3f8fb57fca33554d7745 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 5 Dec 2018 22:12:52 +0000 Subject: [PATCH 43/54] Translated using Weblate (Polish) Currently translated at 75.5% (392 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/pl/ --- Riot/Assets/pl.lproj/Vector.strings | 419 +++++++++++++++++++++++++++- 1 file changed, 418 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/pl.lproj/Vector.strings b/Riot/Assets/pl.lproj/Vector.strings index 8b1378917..6a7d8fe2c 100644 --- a/Riot/Assets/pl.lproj/Vector.strings +++ b/Riot/Assets/pl.lproj/Vector.strings @@ -1 +1,418 @@ - +// Titles +"title_home" = "Strona startowa"; +"title_favourites" = "Ulubione"; +"title_people" = "Ludzie"; +"title_rooms" = "Pokoje"; +"title_groups" = "Społeczności"; +"warning" = "Ostrzeżenie"; +// Actions +"view" = "Widok"; +"back" = "Powrót"; +"continue" = "Kontynuuj"; +"create" = "Utwórz"; +"leave" = "Opuść"; +"remove" = "Usuń"; +"invite" = "Zaproś"; +"retry" = "Ponów"; +"off" = "Off"; +"cancel" = "Anuluj"; +"save" = "Zapisz"; +"join" = "Dołącz"; +"decline" = "Odrzuć"; +"accept" = "Akceptuj"; +"preview" = "Podgląd"; +"camera" = "Kamera"; +"voice" = "Głos"; +"active_call" = "Aktywne połączenie"; +"active_call_details" = "Aktywne połączenie (%@)"; +"later" = "Później"; +"rename" = "Zmień nazwę"; +"collapse" = "zwiń"; +"send_to" = "Wyślij do %@"; +"sending" = "Wysyłanie"; +// Authentication +"auth_login" = "Zaloguj się"; +"auth_register" = "Zarejestruj"; +"auth_submit" = "Wyślij"; +"auth_skip" = "Pomiń"; +"auth_send_reset_email" = "Wyślij e-mail przywracający"; +"auth_return_to_login" = "Wróć do ekranu logowania"; +"auth_user_id_placeholder" = "Nazwa użytkownika lub e-mail"; +"auth_password_placeholder" = "Hasło"; +"auth_new_password_placeholder" = "Nowe hasło"; +"auth_user_name_placeholder" = "Nazwa użytkownika"; +"auth_optional_email_placeholder" = "Adres e-mail (opcjonalnie)"; +"auth_email_placeholder" = "Adres e-mail"; +"auth_optional_phone_placeholder" = "Numer telefonu komórkowego (opcjonalne)"; +"auth_phone_placeholder" = "Numer telefonu"; +"auth_repeat_password_placeholder" = "Powtórz hasło"; +"auth_repeat_new_password_placeholder" = "Potwierdź swoje nowe hasło"; +"auth_home_server_placeholder" = "URL (np. https://matrix.org)"; +"auth_identity_server_placeholder" = "URL (np. https://matrix.org)"; +"auth_invalid_login_param" = "Nieprawidłowa nazwa użytkownika i/lub hasło"; +"auth_invalid_user_name" = "Nazwa użytkownika może zawierać tylko litery, cyfry, kropki, myślniki i podkreślenia"; +"auth_invalid_email" = "To nie wygląda na poprawny adres e-mail"; +"auth_invalid_phone" = "To nie wygląda na poprawny numer telefonu"; +"auth_missing_password" = "Brak hasła"; +"auth_add_email_phone_message" = "Dodaj adres e-mail i/lub nr telefonu do swojego konta, aby umożliwić innym użytkownikom odnalezienie ciebie. Adres e-mail pozwoli ci również zresetować hasło."; +"auth_add_email_and_phone_message" = "Dodaj adres e-mail i nr telefonu do swojego konta, aby umożliwić innym użytkownikom odnalezienie ciebie. Adres e-mail pozwoli ci również zresetować hasło."; +"auth_missing_email" = "Brak adresu e-mail"; +"auth_missing_phone" = "Brak numeru telefonu"; +"auth_missing_email_or_phone" = "Brak adresu e-mail lub numeru telefonu"; +"auth_email_in_use" = "Podany adres e-mail jest już w użyciu"; +"auth_phone_in_use" = "Ten numer telefonu jest już używany"; +"auth_password_dont_match" = "Hasła nie zgadzają się"; +"auth_username_in_use" = "Nazwa użytkownika jest już używana"; +"auth_use_server_options" = "Użyj niestandardowych ustawień serwera (zaawansowane)"; +"auth_email_validation_message" = "Sprawdź swój e-mail, aby kontynuować rejestrację"; +"auth_msisdn_validation_title" = "Oczekiwanie na weryfikację"; +"auth_msisdn_validation_message" = "Wysłaliśmy SMS z kodem aktywacyjnym. Podaj ten kod poniżej."; +"auth_recaptcha_message" = "Ten serwer domowy chciałby się upewnić, że nie jesteś robotem"; +"auth_reset_password_message" = "Aby zresetować swoje hasło, wpisz adres e-mail powiązany z twoim kontem:"; +"auth_reset_password_missing_password" = "Należy wprowadzić nowe hasło."; +"auth_reset_password_next_step_button" = "Zweryfikowałem swój adres e-mail"; +"auth_reset_password_error_unauthorized" = "Nie udało się zweryfikować adresu e-mail: upewnij się że kliknąłeś w link w e-mailu"; +"auth_reset_password_error_not_found" = "Twój adres e-mail zdaje się nie być powiązany z żadnym Matrix ID na tym serwerze domowym."; +"auth_invalid_password" = "Zbyt krótkie hasło (co najmniej 6 znaków)"; +"auth_add_email_message" = "Dodaj do konta adres e-mail, aby użytkownicy mogli Cię odnaleźć, oraz abyś mógł przywrócić swoje hasło."; +"auth_add_phone_message" = "Dodaj numer telefonu, aby użytkownicy mogli Cię odnaleźć."; +"auth_reset_password_missing_email" = "Musi zostać wprowadzony e-mail powiązany z kontem."; +"auth_reset_password_email_validation_message" = "Wysłano email na adres %@. Po otwarciu znajdującego się tam linku, kliknij poniżej."; +"auth_reset_password_success_message" = "Twoje hasło zostało zresetowane.\n\nZostałeś wylogowany ze wszystkich urządzeń i nie będziesz więcej otrzymywać powiadomień push. Aby ponownie włączyć powiadomienia, zaloguj się ponownie na każdym urządzeniu."; +"auth_add_email_and_phone_warning" = "Rejestracja jednocześnie za pomocą numeru telefonu i adresu e-mail nie jest obsługiwana dopóki nie pojawi się odpowiednie API. Tylko numer telefonu będzie brany pod uwagę. Możesz dodać adres e-mail do swojego profilu w ustawieniach."; +// Chat creation +"room_creation_title" = "Nowa rozmowa"; +"room_creation_account" = "Konto"; +"room_creation_appearance" = "Wygląd"; +"room_creation_appearance_name" = "Nazwa"; +"room_creation_privacy" = "Prywatność"; +"room_recents_directory_section_network" = "Sieć"; +"room_recents_favourites_section" = "ULUBIONE"; +"room_recents_people_section" = "LUDZIE"; +"room_recents_conversations_section" = "POKOJE"; +"room_recents_no_conversation" = "Brak pokojów"; +"room_recents_low_priority_section" = "NISKI PRIORYTET"; +"room_recents_server_notice_section" = "ALERTY SYSTEMOWE"; +"room_recents_invites_section" = "ZAPROSZENIA"; +"room_recents_start_chat_with" = "Rozpocznij rozmowę"; +"room_recents_create_empty_room" = "Utwórz pokój"; +"room_recents_join_room" = "Dołącz do pokoju"; +"room_recents_join_room_title" = "Dołącz do pokoju"; +"room_recents_join_room_prompt" = "Wprowadź ID lub nazwę pokoju"; +// People tab +"people_invites_section" = "ZAPROSZENIA"; +"people_conversation_section" = "ROZMOWY"; +"people_no_conversation" = "Brak rozmów"; +// Groups tab +"group_invite_section" = "ZAPROSZENIA"; +"group_section" = "SPOŁECZNOŚCI"; +// Search +"search_rooms" = "Pokoje"; +"search_messages" = "Wiadomości"; +"search_people" = "Ludzie"; +"search_files" = "Pliki"; +"search_default_placeholder" = "Szukaj"; +"search_no_result" = "Brak wyników"; +// Directory +"directory_cell_title" = "Przeglądaj katalog"; +"directory_search_results" = "%tu znalezionych wyników dla %@"; +"directory_search_results_more_than" = ">%tu znalezionych wyników dla %@"; +"directory_searching_title" = "Wyszukiwanie katalogu…"; +// Contacts +"contacts_address_book_section" = "LOKALNE KONTAKTY"; +"contacts_address_book_matrix_users_toggle" = "Tylko użytkownicy Matrixa"; +"contacts_address_book_permission_denied" = "Nie udzieliłeś(-aś) uprawnienia na dostęp do listy kontaktów"; +"contacts_user_directory_section" = "KATALOG UŻYTKOWNIKÓW"; +"room_participants_leave_prompt_title" = "Opuść pokój"; +"room_participants_remove_prompt_title" = "Potwierdzenie"; +"room_participants_invite_prompt_title" = "Potwierdzenie"; +"room_participants_filter_room_members" = "Filtruj członków pokoju"; +"room_participants_idle" = "Bezczynny(-a)"; +"room_participants_now" = "teraz"; +"room_participants_ago" = "temu"; +"room_participants_action_section_admin_tools" = "Narzędzia Administracyjne"; +"room_participants_action_section_direct_chats" = "Rozmowy bezpośrednie"; +"room_participants_action_section_devices" = "Urządzenia"; +"room_participants_action_invite" = "Zaproś"; +"room_participants_action_leave" = "Opuść pokój"; +"room_participants_action_remove" = "Usuń z pokoju"; +"room_participants_action_unban" = "Odbanuj"; +"room_participants_action_ignore" = "Ukryj wszystkie wiadomości od tego użytkownika"; +"room_participants_action_unignore" = "Pokaż wszystkie wiadomości od tego użytkownika"; +"room_participants_action_set_default_power_level" = "Przywróć do poziomu normalnego użytkownika"; +"room_participants_action_set_moderator" = "Uczyń moderatorem"; +"room_participants_action_set_admin" = "Uczyń administratorem"; +"room_participants_action_start_new_chat" = "Rozpocznij nową rozmowę"; +"room_participants_action_start_voice_call" = "Rozpocznij połączenie telefoniczne"; +"room_participants_action_start_video_call" = "Rozpocznij połączenie wideo"; +"room_participants_action_mention" = "Wspomnij"; +"room_many_users_are_typing" = "%@, %@ i inni piszą…"; +"room_message_placeholder" = "Wyślij wiadomość (niezaszyfrowaną)…"; +"room_message_reply_to_placeholder" = "Wyślij odpowiedź (niezaszyfrowaną)…"; +"room_do_not_have_permission_to_post" = "Nie masz uprawnień, aby pisać w tym pokoju"; +"encrypted_room_message_placeholder" = "Wyślij zaszyfrowaną wiadomość…"; +"encrypted_room_message_reply_to_placeholder" = "Wyślij zaszyfrowaną odpowiedź…"; +"room_message_short_placeholder" = "Wyślij wiadomość…"; +"room_message_reply_to_short_placeholder" = "Wyślij odpowiedź…"; +"room_offline_notification" = "Połączenie z serwerem zostało utracone."; +"room_ongoing_conference_call_close" = "Zamknij"; +"room_prompt_resend" = "Wyślij ponownie wszystko"; +"room_prompt_cancel" = "anuluj wszystko"; +"room_resend_unsent_messages" = "Wyślij niewysłane wiadomości ponownie"; +"room_delete_unsent_messages" = "Usuń niewysłane wiadomości"; +"room_event_action_copy" = "Kopiuj"; +"room_event_action_quote" = "Cytuj"; +"room_event_action_redact" = "Usuń"; +"room_event_action_more" = "Więcej"; +"room_event_action_share" = "Udostępnij"; +"room_event_action_permalink" = "Odnośnik bezpośredni"; +"room_event_action_view_source" = "Pokaż źródło"; +"room_event_action_view_decrypted_source" = "Pokaż odszyfrowane źródło"; +"room_event_action_report" = "Zgłoś zawartość"; +"room_event_action_report_prompt_reason" = "Powód zgłoszenia zawartości"; +"room_event_action_save" = "Zapisz"; +"room_event_action_resend" = "Wyślij ponownie"; +"room_event_action_delete" = "Usuń"; +"room_event_action_cancel_download" = "Anuluj pobieranie"; +"room_action_send_sticker" = "Wyślij naklejkę"; +"room_replacement_information" = "Ten pokój został zamieniony i nie jest już aktywny."; +"room_replacement_link" = "Konwersacja jest kontynuowana tutaj."; +"room_predecessor_information" = "Ten pokój jest kontynuacją innej rozmowy."; +"room_predecessor_link" = "Kliknij tutaj, aby zobaczyć starsze wiadomości."; +"room_resource_limit_exceeded_message_contact_2_link" = "skontaktuj się z administratorem"; +"room_resource_limit_exceeded_message_contact_3" = " , aby korzystać dalej z funkcji."; +"room_resource_limit_exceeded_message_contact_1" = " Proszę "; +"room_resource_usage_limit_reached_message_1_default" = "Ten serwer przekroczył jeden z limitów, więc "; +"room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ten serwer osiągnął miesięczny limit aktywnych użytkowników, więc "; +"room_resource_usage_limit_reached_message_2" = "niektórzy użytkownicy nie będą mogli się zalogować."; +"room_resource_usage_limit_reached_message_contact_3" = " , aby zwiększył ten limit."; +// Unknown devices +"unknown_devices_alert_title" = "Pokój zawiera nieznane urządzenia"; +"room_event_action_cancel_send" = "Anuluj Wysyłanie"; +"room_event_action_view_encryption" = "Informacje o szyfrowaniu"; +"room_event_failed_to_send" = "Nie udało się wysłać"; +"room_warning_about_encryption" = "Szyfrowanie End-to-End jest w fazie beta i nie jest pewne. \n\nNie powinieneś ufać mu w celu zabezpieczenia danych.\n\nUrządzenia nie będą w stanie na razie odszyfrować historii sprzed momentu dołączenia do pokoju.\n\nSzyfrowane wiadomości nie będą widoczne dla klientów którzy nie wspierają jeszcze szyfrowania."; +"unknown_devices_alert" = "Ten pokój zawiera nieznane urządzenia, które nie zostały zweryfikowane.\nOznacza to brak gwarancji, że urządzenia należą do użytkowników do których twierdzą, że należą.\nPrzed kontynuowaniem, zalecamy wykonanie procesu weryfikacji każdego urządzenia, ale możesz ponownie wysłać wiadomość bez weryfikacji, jeśli wolisz."; +"unknown_devices_send_anyway" = "Wyślij mimo to"; +"unknown_devices_call_anyway" = "Zadzwoń mimo to"; +"unknown_devices_answer_anyway" = "Odpowiedz mimo to"; +"unknown_devices_verify" = "Zweryfikuj…"; +"unknown_devices_title" = "Nieznane urządzenia"; +// Room Title +"room_title_new_room" = "Nowy pokój"; +"room_title_multiple_active_members" = "%@/%@ aktywnych członków"; +"room_title_invite_members" = "Zaproś członków"; +"room_title_members" = "%@ członków"; +"room_title_one_member" = "1 członek"; +// Room Preview +"room_preview_invitation_format" = "Zostałeś(-aś) zaproszony(-a) do tego pokoju przez %@"; +"room_preview_subtitle" = "To jest podgląd pokoju. Interakcje zostały zablokowane."; +"room_preview_unlinked_email_warning" = "Zaproszenie zostało wysłane do %@, który nie jest powiązany z zalogowanym kontem. Możesz zalogować się z wykorzystaniem innego konta, albo dodać ten adres e-mail do swoich kontaktów."; +"room_preview_try_join_an_unknown_room_default" = "pokój"; +// Settings +"settings_title" = "Ustawienia"; +"settings_report_bug" = "Zgłoś błąd"; +"settings_config_user_id" = "Zalogowany(-a) jako %@"; +"settings_user_settings" = "USTAWIENIA UŻYTKOWNIKA"; +"settings_notifications_settings" = "USTAWIENIA POWIADOMIEŃ"; +"settings_calls_settings" = "POŁĄCZENIA"; +"settings_user_interface" = "INTERFEJS UŻYTKOWNIKA"; +"settings_ignored_users" = "IGNOROWANI UŻYTKOWNICY"; +"settings_contacts" = "LOKALNE KONTAKTY"; +"settings_advanced" = "ZAAWANSOWANE"; +"settings_other" = "POZOSTAŁE"; +"settings_devices" = "URZĄDZENIA"; +"settings_cryptography" = "KRYPTOGRAFIA"; +"settings_deactivate_account" = "DEZAKTYWUJ KONTO"; +"settings_sign_out" = "Wyloguj się"; +"settings_profile_picture" = "Obraz profilowy"; +"settings_display_name" = "Wyświetlana nazwa"; +"settings_remove_prompt_title" = "Potwierdzenie"; +"settings_pin_rooms_with_missed_notif" = "Przypnij pokoje z ominiętymi powiadomieniami"; +"settings_pin_rooms_with_unread" = "Przypnij pokoje z nieprzeczytanych wiadomościami"; +"settings_ui_language" = "Język"; +"settings_ui_theme" = "Motyw"; +"settings_ui_theme_auto" = "Auto"; +"settings_ui_theme_light" = "Jasny"; +"settings_ui_theme_dark" = "Ciemmy"; +"settings_ui_theme_black" = "Czarny"; +"settings_ui_theme_picker_title" = "Wybierz motyw"; +"settings_contacts_phonebook_country" = "Kraj książki adresowej"; +"settings_labs_e2e_encryption" = "Szyfrowanie End-to-End"; +"settings_labs_create_conference_with_jitsi" = "Utwórz połączenia konferencyjne za pomocą jitsi"; +"settings_version" = "Wersja %@"; +"settings_olm_version" = "Wersja Olm %@"; +"settings_copyright" = "Prawa autorskie"; +"settings_copyright_url" = "https://riot.im/copyright"; +"settings_term_conditions" = "Warunki użytkowania"; +"settings_term_conditions_url" = "https://riot.im/tac_apple"; +"settings_privacy_policy" = "Polityka prywatności"; +"settings_privacy_policy_url" = "https://riot.im/privacy"; +"settings_third_party_notices" = "Informacje o stronach trzecich"; +"settings_enable_rageshake" = "Potrząśnij wściekle, aby zgłosić błąd"; +"settings_clear_cache" = "Wyczyść pamięć podręczną"; +"settings_change_password" = "Zmień hasło"; +"settings_old_password" = "stare hasło"; +"settings_new_password" = "nowe hasło"; +"settings_confirm_password" = "potwierdź hasło"; +"settings_password_updated" = "Twoje hasło zostało zmienione"; +"settings_crypto_device_name" = "Nazwa urządzenia: "; +"settings_crypto_device_id" = "\nIdentyfikator urządzenia: "; +"settings_crypto_device_key" = "\nKlucz urządzenia: "; +"settings_crypto_blacklist_unverified_devices" = "Szyfruj wiadomości tylko do zaufanych urządzeń"; +"settings_deactivate_my_account" = "Dezaktywuj moje konto"; +// Room Details +"room_details_title" = "Szczegóły pokoju"; +"room_details_files" = "Pliki"; +"room_details_settings" = "Ustawienia"; +"room_details_photo" = "Obraz pokoju"; +"room_details_room_name" = "Nazwa Pokoju"; +"room_details_topic" = "Temat"; +"room_details_favourite_tag" = "Ulubione"; +"room_details_low_priority_tag" = "Niski priorytet"; +"room_details_direct_chat" = "Rozmowa bezpośrednia"; +"room_details_access_section_anyone_apart_from_guest" = "Każdy kto zna link pokoju, poza gośćmi"; +"room_details_access_section_anyone" = "Każdy kto zna link pokoju, razem z gośćmi"; +"room_details_access_section_no_address_warning" = "Aby móc stworzyć link do pokoju musi on mieć swój adres"; +"room_details_access_section_directory_toggle" = "Wyświetlaj ten pokój na liście pokojów"; +"room_details_history_section" = "Kto może przeczytać historię?"; +"room_details_history_section_anyone" = "Każdy"; +"room_details_history_section_members_only" = "Tylko członkowie (od momentu włączenia tej opcji)"; +"room_details_history_section_members_only_since_invited" = "Tylko członkowie (od kiedy zostali zaproszeni)"; +"room_details_history_section_members_only_since_joined" = "Tylko członkowie (od kiedy dołączyli)"; +"room_details_history_section_prompt_title" = "Ostrzeżenie o prywatności"; +"room_details_addresses_section" = "Adresy"; +"room_details_no_local_addresses" = "Ten pokój nie ma lokalnych adresów"; +"room_details_new_address" = "Dodaj nowy adres"; +"room_details_new_address_placeholder" = "Dodaj nowy adres (np. #foo%@)"; +"room_details_addresses_invalid_address_prompt_title" = "Nieprawidłowy format aliasu"; +"room_details_addresses_invalid_address_prompt_msg" = "%@ nie jest poprawnym formatem aliasu"; +"room_details_flair_invalid_id_prompt_title" = "Nieprawidłowy format"; +"room_details_banned_users_section" = "Zbanowani użytkownicy"; +"room_details_advanced_section" = "Zaawansowane"; +"room_details_advanced_room_id" = "ID Pokoju:"; +"room_details_advanced_enable_e2e_encryption" = "Włącz szyfrowanie \n(ostrzeżenie: nie może zostać wyłączone!)"; +"room_details_advanced_e2e_encryption_enabled" = "Szyfrowanie jest włączone w tym pokoju"; +"room_details_advanced_e2e_encryption_disabled" = "Szyfrowanie nie jest włączone w tym pokoju."; +"room_details_advanced_e2e_encryption_blacklist_unverified_devices" = "Szyfruj wiadomości tylko do zaufanych urządzeń"; +"room_details_set_main_address" = "Ustaw jako główny adres"; +"room_details_unset_main_address" = "Nie ustawiaj jako główny adres"; +"room_details_copy_room_id" = "Kopiuj ID pokoju"; +"room_details_copy_room_address" = "Kopiuj adres pokoju"; +"room_details_copy_room_url" = "Kopiuj URL Pokoju"; +// Group Details +"group_details_title" = "Informacje o społeczności"; +"group_details_people" = "Ludzie"; +"group_details_rooms" = "Pokoje"; +// Group Home +"group_home_one_member_format" = "1 członek"; +"group_home_multi_members_format" = "%tu członków"; +"group_home_one_room_format" = "1 pokój"; +"group_home_multi_rooms_format" = "%tu pokojów"; +"group_invitation_format" = "%@ zaprosił(a) Cię do przyłączenia się do tej Społeczności"; +"group_participants_leave_prompt_title" = "Opuść grupę"; +"group_participants_remove_prompt_title" = "Potwierdzenie"; +"group_participants_invite_prompt_title" = "Potwierdzenie"; +"group_participants_filter_members" = "Filtruj członków społeczności"; +"group_participants_invite_malformed_id" = "Uszkodzony ID. Czy to powinien być Matrix ID podobny do '@localpart:domain'"; +// Group rooms +"group_rooms_filter_rooms" = "Filtruj pokoje społeczności"; +// Read Receipts +"read_receipts_list" = "Przeczytaj listę odbiorców"; +"media_picker_select" = "Wybierz"; +// Directory +"directory_title" = "Katalog"; +"directory_server_picker_title" = "Wybierz katalog"; +"directory_server_all_rooms" = "Wszystkie pokoje na serwerze %@"; +"directory_server_type_homeserver" = "Wpisz serwer domowy, aby pobrać z niego listę publicznych pokoi"; +"directory_server_placeholder" = "matrix.org"; +"event_formatter_widget_added" = "widżet %@ został dodany przez %@"; +"event_formatter_widget_removed" = "widżet %@ został usunięty przez %@"; +"event_formatter_rerequest_keys_part1_link" = "Poproś ponownie o klucze szyfrujące"; +"event_formatter_rerequest_keys_part2" = " z innych Twoich urządzeń."; +// Others +"or" = "lub"; +"you" = "Ty"; +"today" = "Dzisiaj"; +"yesterday" = "Wczoraj"; +// Room key request dialog +"e2e_room_key_request_title" = "Żądanie klucza szyfrującego"; +"e2e_room_key_request_message_new_device" = "Dodałeś(-aś) nowe urządzenie '%@', które żąda kluczy szyfrujących."; +"e2e_room_key_request_message" = "Twoje niezweryfikowane urządzenie '%@' żąda kluczy szyfrujących."; +"e2e_room_key_request_start_verification" = "Rozpocznij weryfikację…"; +"e2e_room_key_request_share_without_verifying" = "Udostępnij bez weryfikacji"; +"gdpr_consent_not_given_alert_review_now_action" = "Przejrzyj teraz"; +"deactivate_account_title" = "Dezaktywuj konto"; +"deactivate_account_informations_part1" = "To sprawi, że Twoje konto stanie się na stałe niezdatne do użytku. Nie będziesz mógł się zalogować i nikt nie będzie mógł ponownie zarejestrować tego samego identyfikatora użytkownika. Spowoduje to, że Twoje konto opuści wszystkie pokoje, w których uczestniczy, i usunie dane Twojego konta z serwera tożsamości. "; +"deactivate_account_informations_part2_emphasize" = "Ta czynność jest nieodwracalna."; +"deactivate_account_informations_part3" = "\n\nDezaktywacja konta "; +"deactivate_account_informations_part4_emphasize" = "domyślnie nie powoduje zapomnienia wysłanych przez Ciebie wiadomości. "; +"deactivate_account_informations_part5" = "Jeśli chcesz, abyśmy zapomnieli o Twoich wiadomościach, zaznacz pole poniżej\n\nWidoczność wiadomości w Matrix jest podobna do wiadomości e-mail. Nasze zapomnienie wiadomości oznacza, że wysłane wiadomości nie będą udostępniane żadnym nowym lub niezarejestrowanym użytkownikom, ale zarejestrowani użytkownicy, którzy już mają dostęp do tych wiadomości, nadal będą mieli dostęp do ich kopii."; +"deactivate_account_forget_messages_information_part1" = "Proszę zapomnieć o wszystkich wiadomościach, które wysłałem, gdy moje konto zostało dezaktywowane ("; +"deactivate_account_forget_messages_information_part2_emphasize" = "Ostrzeżenie"; +"deactivate_account_forget_messages_information_part3" = ": spowoduje to, że przyszli użytkownicy zobaczą niepełny obraz rozmów)"; +"deactivate_account_validate_action" = "Dezaktywuj konto"; +"deactivate_account_password_alert_title" = "Dezaktywuj konto"; +"deactivate_account_password_alert_message" = "Aby kontynuować, proszę wprowadzić swoje hasło"; +// Re-request confirmation dialog +"rerequest_keys_alert_title" = "Prośba wysłana"; +"rerequest_keys_alert_message" = "Uruchom proszę Riot na innym urządzeniu, które może odszyfrować wiadomość, aby wysłać klucze do tego urządzenia."; +"on" = "Włączone"; +"video" = "Obraz"; +"auth_forgot_password" = "Zapomniałeś(-aś) hasło?"; +// Room recents +"room_recents_directory_section" = "KATALOG POKOJÓW"; +// Rooms tab +"room_directory_no_public_room" = "Nie są dostępne publiczne pokoje"; +"directory_cell_description" = "%tu pokojów"; +// Chat participants +"room_participants_title" = "Uczestnicy"; +"room_participants_add_participant" = "Dodaj uczestnika"; +"room_participants_one_participant" = "1 uczestnik"; +"room_participants_multi_participants" = "%d uczestników"; +"room_participants_leave_prompt_msg" = "Czy napewno chcesz opuścić pokój?"; +"room_participants_online" = "Dostępny(-a)"; +"room_participants_offline" = "Niedostępny(-a)"; +"room_participants_unknown" = "Nieznane"; +"room_participants_action_section_other" = "Inny"; +// Chat +"room_jump_to_first_unread" = "Przeskocz do pierwszej nieprzeczytanej wiadomości"; +"room_new_message_notification" = "%d nowa wiadomość"; +"room_new_messages_notification" = "%d nowych wiadomości"; +"room_one_user_is_typing" = "%@ pisze…"; +"room_two_users_are_typing" = "%@ i %@ piszą…"; +"room_ongoing_conference_call" = "Przychodzące połączenie grupowe. Dołącz z %@ lub %@."; +"room_title_one_active_member" = "%@/%@ aktywnych członków"; +"next" = "Następny"; +"auth_untrusted_id_server" = "Serwer tożsamości nie jest zaufany"; +"room_creation_appearance_picture" = "Obraz rozmowy (opcjonalne)"; +"room_creation_private_room" = "Ta rozmowa jest prywatna"; +"room_creation_public_room" = "Ta rozmowa jest publiczna"; +"room_creation_make_public" = "Zrób publiczny"; +"room_creation_make_public_prompt_title" = "Zrobić tą rozmowę publiczną?"; +"room_creation_make_private" = "Zrób prywatny"; +"search_in_progress" = "Wyszukiwanie…"; +"contacts_address_book_no_contact" = "Brak lokalnych kontaktów"; +"auth_msisdn_validation_error" = "Nie można zweryfikować numeru telefonu."; +"room_participants_invite_malformed_id" = "Uszkodzony ID. Powinien być adres e-mail lub Matrix ID podobny do '@localpart:domain'"; +"room_unsent_messages_notification" = "Wiadomość nie została wysłana. Czy %@ lub %@ teraz?"; +"room_ongoing_conference_call_with_close" = "Przychodzące połączenie grupowe. Dołącz z %@ lub z %@. %@ to."; +"directory_search_results_title" = "Przeglądaj wyniki katalogów"; +"room_event_action_kick_prompt_reason" = "Powód wyrzucenia użytkownika"; +"room_action_send_photo_or_video" = "Wyślij zdjęcie lub film"; +"settings_mark_all_as_read" = "Oznacz wszystkie wiadomości jako przeczytane"; +"settings_labs" = "LABORATORIUM"; +"settings_sign_out_confirmation" = "Jesteś pewny(-a)?"; +"settings_email_address" = "E-mail"; +"settings_email_address_placeholder" = "Wprowadź adres e-mail"; +"settings_add_email_address" = "Dodaj adres e-mail"; +"settings_phone_number" = "Telefon"; +"settings_add_phone_number" = "Dodaj numer telefonu"; +"settings_night_mode" = "Tryb Nocny"; +"settings_fail_to_update_profile" = "Nie udało się zaktualizować profilu"; +"settings_show_decrypted_content" = "Pokaż odszyfrowaną zawartość"; +"settings_fail_to_update_password" = "Nie udało się zaktualizować hasła"; +"settings_crypto_export" = "Eksportuj klucze"; +"room_details_people" = "Członkowie"; +"room_details_access_section_invited_only" = "Tylko ludzie, którzy zostali zaproszeni"; +"room_details_new_flair_placeholder" = "Dodaj nowe ID społeczności (np. +foo%@)"; From e8cd17d054766bdb44443ca118a89c70ec3d07d5 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Thu, 22 Nov 2018 08:47:23 +0000 Subject: [PATCH 44/54] Translated using Weblate (Ukrainian) Currently translated at 15.4% (80 of 519 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/uk/ --- Riot/Assets/uk.lproj/Vector.strings | 84 ++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/uk.lproj/Vector.strings b/Riot/Assets/uk.lproj/Vector.strings index 8b1378917..2a4ce162c 100644 --- a/Riot/Assets/uk.lproj/Vector.strings +++ b/Riot/Assets/uk.lproj/Vector.strings @@ -1 +1,83 @@ - +// Titles +"title_home" = "Домівка"; +"title_favourites" = "Обране"; +"title_people" = "Люди"; +"title_rooms" = "Кімнати"; +"title_groups" = "Спільноти"; +"warning" = "Попередження"; +// Actions +"view" = "Вигляд"; +"next" = "Далі"; +"back" = "Назад"; +"continue" = "Продовжити"; +"create" = "Створити"; +"start" = "Почати"; +"leave" = "Вийти"; +"remove" = "Вилучити"; +"invite" = "Запросити"; +"retry" = "Повторити"; +"on" = "Увімк"; +"off" = "Вимк"; +"cancel" = "Скасувати"; +"save" = "Зберегти"; +"join" = "Приєднатися"; +"decline" = "Відхилити"; +"accept" = "Прийняти"; +"preview" = "Попередній перегляд"; +"camera" = "Камера"; +"voice" = "Голос"; +"video" = "Відео"; +"active_call" = "Активний виклик"; +"active_call_details" = "Активний виклик (%@)"; +"later" = "Пізніше"; +"rename" = "Перейменувати"; +"collapse" = "згорнути"; +"send_to" = "Надіслати до %@"; +"sending" = "Надсилання"; +// Authentication +"auth_login" = "Увійти"; +"auth_register" = "Зареєструватися"; +"auth_submit" = "Відправити"; +"auth_skip" = "Пропустити"; +"auth_send_reset_email" = "Надіслати лист для відновлення"; +"auth_return_to_login" = "Повернутися на екран входу"; +"auth_user_id_placeholder" = "Е-пошта чи ім'я користувача"; +"auth_password_placeholder" = "Пароль"; +"auth_new_password_placeholder" = "Новий пароль"; +"auth_user_name_placeholder" = "Ім'я користувача"; +"auth_optional_email_placeholder" = "Адреса е-пошти (необов'язково)"; +"auth_email_placeholder" = "Адреса е-пошти"; +"auth_optional_phone_placeholder" = "Номер телефону (необов'язково)"; +"auth_phone_placeholder" = "Номер телефону"; +"auth_repeat_password_placeholder" = "Повторіть пароль"; +"auth_repeat_new_password_placeholder" = "Підтвердьте новий пароль"; +"auth_home_server_placeholder" = "URL (наприклад, https://matrix.org)"; +"auth_identity_server_placeholder" = "URL (наприклад, https://matrix.org)"; +"auth_invalid_login_param" = "Неправильне ім'я користувача або пароль"; +"auth_invalid_user_name" = "Імена користувачів можуть містити лише літери, цифри, крапки, дефіси й підкреслення"; +"auth_invalid_password" = "Пароль надто короткий (мінімум 6 знаків)"; +"auth_invalid_email" = "Схоже, це недійсна адреса е-пошти"; +"auth_invalid_phone" = "Схоже, це недійсний номер телефону"; +"auth_missing_password" = "Відсутній пароль"; +"auth_add_email_message" = "Додайте адресу е-пошти до свого облікового запису, щоб користувачі могли знаходити вас, а також для можливості відновлення пароля."; +"auth_add_phone_message" = "Додайте номер телефону до свого облікового запису, щоб користувачі могли знаходити вас."; +"auth_add_email_phone_message" = "Додайте адресу е-пошти та/або номер телефону до свого облікового запису, щоб інші користувачі могли знаходити вас. Адреса е-пошти також дозволить вам відновлювати пароль."; +"auth_add_email_and_phone_message" = "Додайте адресу е-пошти та/або номер телефону до свого облікового запису, щоб інші користувачі могли знаходити вас. Адреса е-пошти також дозволить вам відновлювати пароль."; +"auth_missing_email" = "Відсутня адреса е-пошти"; +"auth_missing_phone" = "Відсутній номер телефону"; +"auth_missing_email_or_phone" = "Відсутня адреса е-пошта чи номер телефону"; +"auth_email_in_use" = "Ця адреса е-пошти вже використовується"; +"auth_phone_in_use" = "Цей номер телефону вже використовується"; +"auth_untrusted_id_server" = "Сервер облікових даних не довірений"; +"auth_password_dont_match" = "Паролі не збігаються"; +"auth_username_in_use" = "Ім'я користувача зайняте"; +"auth_forgot_password" = "Забули пароль?"; +"auth_email_not_found" = "Не вдалося надіслати лист: Таку адресу е-пошти не знайдено"; +"auth_use_server_options" = "Власні налаштування сервера"; +"auth_email_validation_message" = "Перевірте свою пошту для продовження реєстрації"; +"auth_msisdn_validation_title" = "Очікування перевірки"; +"auth_msisdn_validation_message" = "Ми надіслали SMS з кодом активації. Введіть цей код внизу."; +"auth_msisdn_validation_error" = "Неможливо перевірити номер телефону."; +"auth_recaptcha_message" = "Цей домашній сервер бажає переконатися, що ви не робот"; +"auth_reset_password_message" = "Щоб відновити пароль, введіть адресу е-пошти, пов'язану з вашим обліковим записом:"; +"auth_reset_password_missing_email" = "Необхідно ввести адресу е-пошти, пов'язану з вашим обліковим записом."; From f95b3dbac8cf696a29acd0531f4cc9976dda7ded Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Wed, 21 Nov 2018 22:25:31 +0000 Subject: [PATCH 45/54] Translated using Weblate (Polish) Currently translated at 50.0% (2 of 4 strings) Translation: Riot iOS/Riot iOS (Dialogs) Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios-dialogs/pl/ --- Riot/Assets/pl.lproj/InfoPlist.strings | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Riot/Assets/pl.lproj/InfoPlist.strings b/Riot/Assets/pl.lproj/InfoPlist.strings index 8b1378917..e2a84c4c3 100644 --- a/Riot/Assets/pl.lproj/InfoPlist.strings +++ b/Riot/Assets/pl.lproj/InfoPlist.strings @@ -1 +1,3 @@ - +// Permissions usage explanations +"NSCameraUsageDescription" = "Aparat służy do robienia zdjęć i nagrywania filmów, prowadzenia rozmów wideo."; +"NSPhotoLibraryUsageDescription" = "Biblioteka zdjęć służy do wysyłania zdjęć i filmów."; From 2f3aa33793b63ecb68198e0a952435d771514a0f Mon Sep 17 00:00:00 2001 From: Lino Date: Sat, 3 Nov 2018 07:26:16 +0000 Subject: [PATCH 46/54] Translated using Weblate (German) Currently translated at 100.0% (520 of 520 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/de/ --- Riot/Assets/de.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/de.lproj/Vector.strings b/Riot/Assets/de.lproj/Vector.strings index 822d31202..a7ce4c0e7 100644 --- a/Riot/Assets/de.lproj/Vector.strings +++ b/Riot/Assets/de.lproj/Vector.strings @@ -556,3 +556,4 @@ "room_resource_usage_limit_reached_message_1_monthly_active_user" = "Dieser Heimserver hat sein Limit an monatlich aktiven Benutzern überschritten, sodass "; "room_resource_usage_limit_reached_message_2" = "einige Benutzer nicht in der Lage sein werden, sich einzuloggen."; "room_resource_usage_limit_reached_message_contact_3" = " um dieses Limit erhöhen zu lassen."; +"auth_accept_policies" = "Bitte Regeln dieses Heimservers ansehen und akzeptieren:"; From 8ab4efceb6c10a92f4263051bc688da310fe4f2a Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 16 Oct 2018 18:07:31 +0000 Subject: [PATCH 47/54] Translated using Weblate (Hungarian) Currently translated at 100.0% (520 of 520 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/hu/ --- Riot/Assets/hu.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/hu.lproj/Vector.strings b/Riot/Assets/hu.lproj/Vector.strings index cac3bae51..c73c95ff1 100644 --- a/Riot/Assets/hu.lproj/Vector.strings +++ b/Riot/Assets/hu.lproj/Vector.strings @@ -561,3 +561,4 @@ "room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ez a Matrix szerver elérte a havi aktív felhasználói korlátját, így "; "room_resource_usage_limit_reached_message_2" = "néhány felhasználó nem tud majd bejelentkezni."; "room_resource_usage_limit_reached_message_contact_3" = " hogy korlátot megemeljék."; +"auth_accept_policies" = "A Matrix szerver felhasználási feltételeit kérlek nézd át és fogadd el:"; From e601528752aa990575934700f8900e448653d14d Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Thu, 18 Oct 2018 12:06:40 +0000 Subject: [PATCH 48/54] Translated using Weblate (Bulgarian) Currently translated at 100.0% (520 of 520 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/bg/ --- Riot/Assets/bg.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/bg.lproj/Vector.strings b/Riot/Assets/bg.lproj/Vector.strings index 17d0dc538..b8a0b49b5 100644 --- a/Riot/Assets/bg.lproj/Vector.strings +++ b/Riot/Assets/bg.lproj/Vector.strings @@ -555,3 +555,4 @@ "room_resource_usage_limit_reached_message_1_monthly_active_user" = "Сървърът е достигнал ограничението си за активни потребители на месец, така че "; "room_resource_usage_limit_reached_message_2" = "някои потребители няма да могат да влязат."; "room_resource_usage_limit_reached_message_contact_3" = " за да увеличите този лимит."; +"auth_accept_policies" = "Моля, прегледайте и приемете политиките на този сървър:"; From 3b582294ffe0d5b49f9ee3ca6b231c78371d2236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20C?= Date: Wed, 14 Nov 2018 09:40:17 +0000 Subject: [PATCH 49/54] Translated using Weblate (French) Currently translated at 100.0% (520 of 520 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/fr/ --- Riot/Assets/fr.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/fr.lproj/Vector.strings b/Riot/Assets/fr.lproj/Vector.strings index b4ff8e37b..844d41785 100644 --- a/Riot/Assets/fr.lproj/Vector.strings +++ b/Riot/Assets/fr.lproj/Vector.strings @@ -556,3 +556,4 @@ "room_resource_usage_limit_reached_message_1_monthly_active_user" = "Ce serveur d'accueil a atteint sa limite mensuelle d'utilisateurs actifs donc "; "room_resource_usage_limit_reached_message_2" = "quelques utilisateurs ne pourront pas se connecter."; "room_resource_usage_limit_reached_message_contact_3" = " pour augmenter cette limite."; +"auth_accept_policies" = "Veuillez lire et accepter les politiques de ce serveur d'accueil :"; From c42ffefa9d71f026527f64f7609a804693a58a1c Mon Sep 17 00:00:00 2001 From: Osoitz Date: Wed, 17 Oct 2018 15:42:12 +0000 Subject: [PATCH 50/54] Translated using Weblate (Basque) Currently translated at 100.0% (520 of 520 strings) Translation: Riot iOS/Riot iOS Translate-URL: https://translate.riot.im/projects/riot-ios/riot-ios/eu/ --- Riot/Assets/eu.lproj/Vector.strings | 1 + 1 file changed, 1 insertion(+) diff --git a/Riot/Assets/eu.lproj/Vector.strings b/Riot/Assets/eu.lproj/Vector.strings index 45af38be8..9077f5bde 100644 --- a/Riot/Assets/eu.lproj/Vector.strings +++ b/Riot/Assets/eu.lproj/Vector.strings @@ -558,3 +558,4 @@ "room_resource_usage_limit_reached_message_1_monthly_active_user" = "Hasiera zerbitzari honek hilabeteko erabiltzaile aktiboen muga jo du "; "room_resource_usage_limit_reached_message_2" = "erabiltzaile batzuk ezin izango dute saioa hasi."; "room_resource_usage_limit_reached_message_contact_3" = " muga hau areagotzeko."; +"auth_accept_policies" = "Irakurri eta onartu hasiera-zerbitzariaren baldintzak:"; From 1d2733e27270db85b39b830f930800fd7f248213 Mon Sep 17 00:00:00 2001 From: manuroe Date: Tue, 11 Dec 2018 17:46:09 +0100 Subject: [PATCH 51/54] Registration: reCAPTCHA does not work anymore on iOS 10 #2119 --- CHANGES.rst | 3 ++ .../Authentication/Views/AuthInputsView.h | 2 +- .../Authentication/Views/AuthInputsView.m | 43 ++++++++++++++++--- .../Authentication/Views/AuthInputsView.xib | 6 +-- 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 3f22871f2..2c3295a36 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,6 +1,9 @@ Changes in 0.7.x (2018-xx-xx) =============================================== +Bug fix: + * Registration: reCAPTCHA does not work anymore on iOS 10 (#2119). + Improvements: * Replace the deprecated MXMediaManager and MXMediaLoader interfaces use (see matrix-org/matrix-ios-sdk/pull/593). * Replace the deprecated MXKAttachment and MXKImageView interfaces use (see matrix-org/matrix-ios-kit/pull/487). diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.h b/Riot/Modules/Authentication/Views/AuthInputsView.h index e6ce0f9ac..f2c1dbbd8 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.h +++ b/Riot/Modules/Authentication/Views/AuthInputsView.h @@ -51,7 +51,7 @@ @property (weak, nonatomic) IBOutlet UILabel *messageLabel; -@property (weak, nonatomic) IBOutlet MXKAuthenticationRecaptchaWebView *recaptchaWebView; +@property (weak, nonatomic) IBOutlet UIView *recaptchaContainer; @property (weak, nonatomic) IBOutlet TermsView *termsView; /** diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.m b/Riot/Modules/Authentication/Views/AuthInputsView.m index 4b0747505..04a994521 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.m +++ b/Riot/Modules/Authentication/Views/AuthInputsView.m @@ -1278,7 +1278,7 @@ // Hide other items self.messageLabelTopConstraint.constant = 8; self.messageLabel.hidden = YES; - self.recaptchaWebView.hidden = YES; + self.recaptchaContainer.hidden = YES; self.termsView.hidden = YES; _currentLastContainer = nil; @@ -1326,10 +1326,43 @@ self.messageLabel.hidden = NO; self.messageLabel.text = NSLocalizedStringFromTable(@"auth_recaptcha_message", @"Vector", nil); - self.recaptchaWebView.hidden = NO; - self.currentLastContainer = self.recaptchaWebView; - - [self.recaptchaWebView openRecaptchaWidgetWithSiteKey:siteKey fromHomeServer:restClient.homeserver callback:callback]; + self.recaptchaContainer.hidden = NO; + self.currentLastContainer = self.recaptchaContainer; + + // IB does not support WKWebview in a xib before iOS 11 + // So, add it by coding + + // Do some cleaning/reset before + for (UIView *view in self.recaptchaContainer.subviews) + { + [view removeFromSuperview]; + } + + MXKAuthenticationRecaptchaWebView *reCaptchaWebView = [MXKAuthenticationRecaptchaWebView new]; + reCaptchaWebView.translatesAutoresizingMaskIntoConstraints = NO; + [self.recaptchaContainer addSubview:reCaptchaWebView]; + + [self.recaptchaContainer addConstraints: + [NSLayoutConstraint constraintsWithVisualFormat:@"|-[view]-|" + options:0 + metrics:0 + views:@{ + @"view": reCaptchaWebView + } + ] + ]; + [self.recaptchaContainer addConstraints: + [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[view]-|" + options:0 + metrics:0 + views:@{ + @"view": reCaptchaWebView + } + ] + ]; + + + [reCaptchaWebView openRecaptchaWidgetWithSiteKey:siteKey fromHomeServer:restClient.homeserver callback:callback]; return YES; } diff --git a/Riot/Modules/Authentication/Views/AuthInputsView.xib b/Riot/Modules/Authentication/Views/AuthInputsView.xib index c60119b25..1e34290d6 100644 --- a/Riot/Modules/Authentication/Views/AuthInputsView.xib +++ b/Riot/Modules/Authentication/Views/AuthInputsView.xib @@ -237,7 +237,7 @@ - +