Finish v0.6.14

This commit is contained in:
manuroe
2018-04-20 16:36:13 +02:00
44 changed files with 2288 additions and 277 deletions
+4
View File
@@ -38,4 +38,8 @@ Evan Tang <etang110 at gmail.com>
Joey Watts <joey.watts.96 at gmail.com>
* PR #1777 Add support for interactive notifications
Arash Tabrizian <a.tabriziyan at gmail.com>
* PR #1828 Fix issue #1793 Confirmation popup when leaving room
* PR #1824 Fix issue #1816 Support specifying kick and ban msgs
+16
View File
@@ -1,3 +1,19 @@
Changes in 0.6.14 (2018-04-20)
===============================================
Improvements:
* Upgrade MatrixKit version (v0.7.10).
* The minimal iOS version is now 9.0.
* Render stickers in the timeline (#1819).
* Support specifying kick and ban msgs (#1816), thanks to @atabrizian (PR #1824).
* Confirmation popup when leaving room (#1793), thanks to @atabrizian (PR #1828).
Bug fixes:
* Global Messages search: some search results are missing.
* Crash on URL like https://riot.im/#/app/register?hs_url=... (#1838).
* All rooms showing the same avatar (#1673).
* App fails to logout on unknown token (#1839).
Changes in 0.6.13 (2018-03-30)
===============================================
+2 -2
View File
@@ -1,5 +1,5 @@
# Uncomment this line to define a global platform for your project
platform :ios, "8.0"
platform :ios, "9.0"
# Use frameforks to allow usage of pod written in Swift (like PiwikTracker)
use_frameworks!
@@ -9,7 +9,7 @@ source 'https://github.com/CocoaPods/Specs.git'
# Different flavours of pods to MatrixKit
# The current MatrixKit pod version
$matrixKitVersion = '0.7.9'
$matrixKitVersion = '0.7.10'
# The develop branch version
#$matrixKitVersion = 'develop'
+21 -21
View File
@@ -43,34 +43,34 @@ PODS:
- GZIP (1.2.1)
- HPGrowingTextView (1.1)
- libPhoneNumber-iOS (0.9.13)
- MatrixKit (0.7.9):
- MatrixKit (0.7.10):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixKit/Core (= 0.7.9)
- MatrixSDK (= 0.10.7)
- MatrixKit/AppExtension (0.7.9):
- MatrixKit/Core (= 0.7.10)
- MatrixSDK (= 0.10.8)
- MatrixKit/AppExtension (0.7.10):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- DTCoreText/Extension
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixSDK (= 0.10.7)
- MatrixKit/Core (0.7.9):
- MatrixSDK (= 0.10.8)
- MatrixKit/Core (0.7.10):
- cmark (~> 0.24.1)
- DTCoreText (~> 1.6.21)
- HPGrowingTextView (~> 1.1)
- libPhoneNumber-iOS (~> 0.9.13)
- MatrixSDK (= 0.10.7)
- MatrixSDK (0.10.7):
- MatrixSDK/Core (= 0.10.7)
- MatrixSDK/Core (0.10.7):
- MatrixSDK (= 0.10.8)
- MatrixSDK (0.10.8):
- MatrixSDK/Core (= 0.10.8)
- MatrixSDK/Core (0.10.8):
- AFNetworking (~> 3.2.0)
- GZIP (~> 1.2.1)
- OLMKit (~> 2.2.2)
- Realm (~> 3.1.1)
- MatrixSDK/JingleCallStack (0.10.7):
- Realm (~> 3.3.2)
- MatrixSDK/JingleCallStack (0.10.8):
- MatrixSDK/Core
- WebRTC (= 63.11.20455)
- OLMKit (2.2.2):
@@ -81,17 +81,17 @@ PODS:
- PiwikTracker (4.4.2):
- PiwikTracker/Core (= 4.4.2)
- PiwikTracker/Core (4.4.2)
- Realm (3.1.1):
- Realm/Headers (= 3.1.1)
- Realm/Headers (3.1.1)
- Realm (3.3.2):
- Realm/Headers (= 3.3.2)
- Realm/Headers (3.3.2)
- WebRTC (63.11.20455)
DEPENDENCIES:
- cmark
- DTCoreText
- GBDeviceInfo (~> 5.1.0)
- MatrixKit (= 0.7.9)
- MatrixKit/AppExtension (= 0.7.9)
- MatrixKit (= 0.7.10)
- MatrixKit/AppExtension (= 0.7.10)
- MatrixSDK/JingleCallStack
- OLMKit
- PiwikTracker (from `https://github.com/manuroe/matomo-sdk-ios.git`, branch `feature/CustomVariables`)
@@ -115,13 +115,13 @@ SPEC CHECKSUMS:
GZIP: 7ee835f989fb3c6ea79005fc90b8fa6af710a70d
HPGrowingTextView: 88a716d97fb853bcb08a4a08e4727da17efc9b19
libPhoneNumber-iOS: e444379ac18bbfbdefad571da735b2cd7e096caa
MatrixKit: 1945e24b20e0ba0853798c347404cdf0efb780e3
MatrixSDK: a08af4179df86082affa188b5b2099def9eb2843
MatrixKit: 524aa527ce302731ce322f8ab01724c226e538e6
MatrixSDK: 9a974388ae38996f639358aea9cc442163012dc7
OLMKit: b9d8c0ffee9ea8c45bc0aaa9afb47f93fba7efbd
PiwikTracker: 42862c7b13028065c3dfd36b4dc38db8a5765acf
Realm: 42d1c38a5b1bbcc828b48a7ce702cb86fc68adf4
Realm: d927fbf66df5532cfafc08afb5f7e53ded37b894
WebRTC: f2a6203584745fe53532633397557876b5d71640
PODFILE CHECKSUM: 7abb83aba898f3755b58b5859fd52321f7d97bb2
PODFILE CHECKSUM: ebbd8236ca52d1c288efd2a3eb5d5ef0b05ffc1b
COCOAPODS: 1.4.0
+58 -4
View File
@@ -7,6 +7,8 @@
objects = {
/* Begin PBXBuildFile section */
02543BAE206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 02543BAB206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.m */; };
02543BAF206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 02543BAC206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.xib */; };
2435179C1F375B9400D0683E /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2466B7551F2F80B800AE27B0 /* Info.plist */; };
2435179F1F375C0F00D0683E /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 327382C01F276AED00356143 /* Vector.strings */; };
2439DD621F6BBE760090F42D /* RecentRoomTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2439DD611F6BBE760090F42D /* RecentRoomTableViewCell.m */; };
@@ -76,6 +78,9 @@
329DCE191F988F8100468420 /* riot_icon_callkit.png in Resources */ = {isa = PBXBuildFile; fileRef = 329DCE161F988F8100468420 /* riot_icon_callkit.png */; };
329DCE1A1F988F8100468420 /* riot_icon_callkit@2.png in Resources */ = {isa = PBXBuildFile; fileRef = 329DCE171F988F8100468420 /* riot_icon_callkit@2.png */; };
329DCE1B1F988F8100468420 /* riot_icon_callkit@3.png in Resources */ = {isa = PBXBuildFile; fileRef = 329DCE181F988F8100468420 /* riot_icon_callkit@3.png */; };
32A9B3BA2089CA410087E7A3 /* Vector.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32A9B3B42089CA400087E7A3 /* Vector.strings */; };
32A9B3BB2089CA410087E7A3 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32A9B3B62089CA400087E7A3 /* Localizable.strings */; };
32A9B3BC2089CA410087E7A3 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 32A9B3B82089CA400087E7A3 /* InfoPlist.strings */; };
32AE61E41F0A971B007255F4 /* RoomMembershipBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */; };
32AE61E51F0A971B007255F4 /* RoomMembershipBubbleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */; };
32AE61E91F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 32AE61E71F0CE099007255F4 /* RoomMembershipWithPaginationTitleBubbleCell.m */; };
@@ -656,6 +661,9 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
02543BAB206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomSelectedStickerBubbleCell.m; sourceTree = "<group>"; };
02543BAC206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomSelectedStickerBubbleCell.xib; sourceTree = "<group>"; };
02543BAD206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomSelectedStickerBubbleCell.h; sourceTree = "<group>"; };
12AA0005C8B3D8D8162584C5 /* Pods-RiotShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RiotShareExtension/Pods-RiotShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
22D76C11C202B6BC5917A049 /* Pods-RiotPods-RiotShareExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RiotPods-RiotShareExtension.release.xcconfig"; path = "Pods/Target Support Files/Pods-RiotPods-RiotShareExtension/Pods-RiotPods-RiotShareExtension.release.xcconfig"; sourceTree = "<group>"; };
23D7292481328A48B8D5D4ED /* Pods_RiotPods_RiotShareExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RiotPods_RiotShareExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -735,6 +743,9 @@
329DCE161F988F8100468420 /* riot_icon_callkit.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = riot_icon_callkit.png; sourceTree = "<group>"; };
329DCE171F988F8100468420 /* riot_icon_callkit@2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "riot_icon_callkit@2.png"; sourceTree = "<group>"; };
329DCE181F988F8100468420 /* riot_icon_callkit@3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "riot_icon_callkit@3.png"; sourceTree = "<group>"; };
32A9B3B52089CA400087E7A3 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = Vector.strings; sourceTree = "<group>"; };
32A9B3B72089CA400087E7A3 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = Localizable.strings; sourceTree = "<group>"; };
32A9B3B92089CA400087E7A3 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = InfoPlist.strings; sourceTree = "<group>"; };
32AE61E11F0A971B007255F4 /* RoomMembershipBubbleCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RoomMembershipBubbleCell.h; sourceTree = "<group>"; };
32AE61E21F0A971B007255F4 /* RoomMembershipBubbleCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RoomMembershipBubbleCell.m; sourceTree = "<group>"; };
32AE61E31F0A971B007255F4 /* RoomMembershipBubbleCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RoomMembershipBubbleCell.xib; sourceTree = "<group>"; };
@@ -1621,6 +1632,16 @@
path = js;
sourceTree = "<group>";
};
32A9B3B32089CA400087E7A3 /* vi.lproj */ = {
isa = PBXGroup;
children = (
32A9B3B42089CA400087E7A3 /* Vector.strings */,
32A9B3B62089CA400087E7A3 /* Localizable.strings */,
32A9B3B82089CA400087E7A3 /* InfoPlist.strings */,
);
path = vi.lproj;
sourceTree = "<group>";
};
32AE61EB1F0D2183007255F4 /* nl.lproj */ = {
isa = PBXGroup;
children = (
@@ -1776,6 +1797,7 @@
F083BB0E1E7009EC00A9B29C /* Assets */ = {
isa = PBXGroup;
children = (
32A9B3B32089CA400087E7A3 /* vi.lproj */,
32BB89E7204D86DA002F3AEC /* bg.lproj */,
3211717B203ACD32002C16C6 /* ca.lproj */,
F0173EAE1FCF346800B5F6A3 /* vi.lproj */,
@@ -2428,6 +2450,9 @@
F083BCD51E7009EC00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.h */,
F083BCD61E7009EC00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.m */,
F083BCD71E7009EC00A9B29C /* RoomOutgoingTextMsgWithPaginationTitleWithoutSenderNameBubbleCell.xib */,
02543BAD206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.h */,
02543BAB206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.m */,
02543BAC206E6C58001CDAB2 /* RoomSelectedStickerBubbleCell.xib */,
);
path = RoomBubbleList;
sourceTree = "<group>";
@@ -2947,6 +2972,7 @@
F083BD3F1E7009ED00A9B29C /* call_speaker_off_icon.png in Resources */,
F083BD3D1E7009ED00A9B29C /* call_hangup_icon@2x.png in Resources */,
F083BE551E7009ED00A9B29C /* RoomOutgoingEncryptedTextMsgWithoutSenderNameBubbleCell.xib in Resources */,
32A9B3BA2089CA410087E7A3 /* Vector.strings in Resources */,
32471CDD1F1373A100BDF50A /* RoomMembershipCollapsedWithPaginationTitleBubbleCell.xib in Resources */,
329DCE191F988F8100468420 /* riot_icon_callkit.png in Resources */,
3233F7321F31F4BF006ACA81 /* JitsiViewController.xib in Resources */,
@@ -3023,6 +3049,7 @@
3205ED851E97725E003D65FA /* DirectoryServerTableViewCell.xib in Resources */,
F083BD761E7009ED00A9B29C /* e2e_verified@3x.png in Resources */,
F083BE181E7009ED00A9B29C /* MediaPickerViewController.xib in Resources */,
32A9B3BC2089CA410087E7A3 /* InfoPlist.strings in Resources */,
F083BDCE1E7009ED00A9B29C /* selection_untick.png in Resources */,
F083BE971E7009ED00A9B29C /* MessagesSearchResultAttachmentBubbleCell.xib in Resources */,
F083BD9C1E7009ED00A9B29C /* main_alias_icon@2x.png in Resources */,
@@ -3062,6 +3089,7 @@
F083BD661E7009ED00A9B29C /* directChatOff@2x.png in Resources */,
F083BE011E7009ED00A9B29C /* third_party_licenses.html in Resources */,
F083BD751E7009ED00A9B29C /* e2e_verified@2x.png in Resources */,
32A9B3BB2089CA410087E7A3 /* Localizable.strings in Resources */,
F083BDCD1E7009ED00A9B29C /* selection_tick@3x.png in Resources */,
F0E05A311EA0F9EB004B83FB /* tab_favourites_selected@2x.png in Resources */,
F083BD741E7009ED00A9B29C /* e2e_verified.png in Resources */,
@@ -3217,6 +3245,7 @@
F083BD3A1E7009ED00A9B29C /* call_chat_icon@2x.png in Resources */,
F083BE711E7009ED00A9B29C /* RoomOutgoingTextMsgBubbleCell.xib in Resources */,
F083BD5E1E7009ED00A9B29C /* create_room@3x.png in Resources */,
02543BAF206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.xib in Resources */,
F083BE6B1E7009ED00A9B29C /* RoomOutgoingAttachmentBubbleCell.xib in Resources */,
F083BD4C1E7009ED00A9B29C /* camera_capture@2x.png in Resources */,
F083BD8F1E7009ED00A9B29C /* file_video_icon.png in Resources */,
@@ -3635,6 +3664,7 @@
F083BE601E7009ED00A9B29C /* RoomIncomingTextMsgBubbleCell.m in Sources */,
F083BE2F1E7009ED00A9B29C /* ContactTableViewCell.m in Sources */,
F083BE901E7009ED00A9B29C /* RoomTitleView.m in Sources */,
02543BAE206E6C59001CDAB2 /* RoomSelectedStickerBubbleCell.m in Sources */,
F083BE6E1E7009ED00A9B29C /* RoomOutgoingAttachmentWithPaginationTitleBubbleCell.m in Sources */,
3233F7311F31F4BF006ACA81 /* JitsiViewController.m in Sources */,
F083BE2A1E7009ED00A9B29C /* UsersDevicesViewController.m in Sources */,
@@ -3872,6 +3902,30 @@
name = Vector.strings;
sourceTree = "<group>";
};
32A9B3B42089CA400087E7A3 /* Vector.strings */ = {
isa = PBXVariantGroup;
children = (
32A9B3B52089CA400087E7A3 /* vi */,
);
name = Vector.strings;
sourceTree = "<group>";
};
32A9B3B62089CA400087E7A3 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
32A9B3B72089CA400087E7A3 /* vi */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
32A9B3B82089CA400087E7A3 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
32A9B3B92089CA400087E7A3 /* vi */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
32AE61EC1F0D2183007255F4 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
@@ -4009,7 +4063,7 @@
DEVELOPMENT_TEAM = 7J4U792NQT;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = RiotShareExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app.shareExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4032,7 +4086,7 @@
DEVELOPMENT_TEAM = 7J4U792NQT;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = RiotShareExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app.shareExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4193,7 +4247,7 @@
"\"$(PROJECT_DIR)/Riot/libs/jitsi-meet\"",
);
INFOPLIST_FILE = Riot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -4227,7 +4281,7 @@
"\"$(PROJECT_DIR)/Riot/libs/jitsi-meet\"",
);
INFOPLIST_FILE = Riot/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = im.vector.app;
PRODUCT_NAME = "$(TARGET_NAME)";
+8 -1
View File
@@ -101,7 +101,14 @@ extern NSString *const kAppDelegateNetworkStatusDidChangeNotification;
// Reload all running matrix sessions
- (void)reloadMatrixSessions:(BOOL)clearCache;
- (void)logout;
/**
Log out all the accounts after asking for a potential confirmation.
Show the authentication screen on successful logout.
@param askConfirmation tell whether a confirmation is required before logging out.
@param completion the block to execute at the end of the operation.
*/
- (void)logoutWithConfirmation:(BOOL)askConfirmation completion:(void (^)(BOOL isLoggedOut))completion;
#pragma mark - Matrix Accounts handling
+114 -12
View File
@@ -1,6 +1,7 @@
/*
Copyright 2014 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.
@@ -207,6 +208,8 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
@property (strong, nonatomic) UIAlertController *mxInAppNotification;
@property (strong, nonatomic) UIAlertController *logoutConfirmation;
@property (nonatomic, nullable, copy) void (^registrationForRemoteNotificationsCompletion)(NSError *);
@@ -1587,6 +1590,15 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
else
notificationBody = [NSString stringWithFormat:NSLocalizedString(@"USER_INVITE_TO_CHAT", nil), eventSenderName];
}
else if (event.eventType == MXEventTypeSticker)
{
NSString *roomDisplayName = room.summary.displayname;
if (roomDisplayName.length && ![roomDisplayName isEqualToString:eventSenderName])
notificationBody = [NSString stringWithFormat:NSLocalizedString(@"MSG_FROM_USER_IN_ROOM", nil), eventSenderName, roomDisplayName];
else
notificationBody = [NSString stringWithFormat:NSLocalizedString(@"MSG_FROM_USER", nil), eventSenderName];
}
return notificationBody;
}
@@ -2074,6 +2086,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
}];
}
}
// Check whether this is a registration links.
else if ([pathParams[0] isEqualToString:@"register"])
{
NSLog(@"[AppDelegate] Universal link with registration parameters");
@@ -2385,7 +2398,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
// Logout the app when there is no available account
if (![MXKAccountManager sharedManager].accounts.count)
{
[self logout];
[self logoutWithConfirmation:NO completion:nil];
}
}];
@@ -2557,8 +2570,90 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
}
}
- (void)logout
- (void)logoutWithConfirmation:(BOOL)askConfirmation completion:(void (^)(BOOL isLoggedOut))completion
{
// Check whether we have to ask confirmation before logging out.
if (askConfirmation)
{
if (self.logoutConfirmation)
{
[self.logoutConfirmation dismissViewControllerAnimated:NO completion:nil];
self.logoutConfirmation = nil;
}
__weak typeof(self) weakSelf = self;
NSString *message = NSLocalizedStringFromTable(@"settings_sign_out_confirmation", @"Vector", nil);
// If the user has encrypted rooms, warn he will lose his e2e keys
MXSession *session = self.mxSessions.firstObject;
for (MXRoom *room in session.rooms)
{
if (room.state.isEncrypted)
{
message = [message stringByAppendingString:[NSString stringWithFormat:@"\n\n%@", NSLocalizedStringFromTable(@"settings_sign_out_e2e_warn", @"Vector", nil)]];
break;
}
}
// Ask confirmation
self.logoutConfirmation = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil) message:message preferredStyle:UIAlertControllerStyleAlert];
[self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self.logoutConfirmation = nil;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self logoutWithConfirmation:NO completion:completion];
});
}
}]];
[self.logoutConfirmation addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self.logoutConfirmation = nil;
if (completion)
{
completion(NO);
}
}
}]];
[self.logoutConfirmation mxk_setAccessibilityIdentifier: @"AppDelegateLogoutConfirmationAlert"];
[self showNotificationAlert:self.logoutConfirmation];
return;
}
// Display a loading wheel during the logout process
id topVC;
if (_masterTabBarController && _masterTabBarController == _masterNavigationController.visibleViewController)
{
topVC = _masterTabBarController.selectedViewController;
}
else
{
topVC = _masterNavigationController.visibleViewController;
}
if (topVC && [topVC respondsToSelector:@selector(startActivityIndicator)])
{
[topVC startActivityIndicator];
}
self.pushRegistry = nil;
isPushRegistered = NO;
@@ -2577,15 +2672,22 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
#endif
// Logout all matrix account
[[MXKAccountManager sharedManager] logout];
// Return to authentication screen
[_masterTabBarController showAuthenticationScreen];
// Note: Keep App settings
// Reset the contact manager
[[MXKContactManager sharedManager] reset];
[[MXKAccountManager sharedManager] logoutWithCompletion:^{
if (completion)
{
completion (YES);
}
// Return to authentication screen
[_masterTabBarController showAuthenticationScreen];
// Note: Keep App settings
// Reset the contact manager
[[MXKContactManager sharedManager] reset];
}];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
@@ -2907,7 +3009,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN
typeof(self) self = weakSelf;
self->_errorNotification = nil;
[self logout];
[self logoutWithConfirmation:NO completion:nil];
}
}]];
+3 -1
View File
@@ -198,7 +198,7 @@
"room_participants_action_start_video_call" = "Започни видео разговор";
"room_participants_action_mention" = "Спомени";
// Chat
"room_jump_to_first_unread" = "Отиди до първото непрочетено съобщение";
"room_jump_to_first_unread" = "Виж първото непрочетено съобщение";
"room_new_message_notification" = "%d ново съобщение";
"room_new_messages_notification" = "%d нови съобщения";
"room_one_user_is_typing" = "%@ пише…";
@@ -514,3 +514,5 @@
"room_details_unset_main_address" = "Премахни задаването като основен адрес";
"room_participants_action_set_default_power_level" = "Възвърни към нормален потребител";
"settings_config_no_build_info" = "Няма build информация";
"room_event_action_kick_prompt_reason" = "Причина за изгонване на потребителя";
"room_event_action_ban_prompt_reason" = "Причина за блокиране на потребителя";
+2
View File
@@ -515,3 +515,5 @@
"group_rooms_filter_rooms" = "Filtere Community-Räume";
"e2e_room_key_request_message_new_device" = "Du hast ein neues Gerät '%@' hinzugefügt, welches Verschlüsselungs-Schlüssel anfordert.";
"room_do_not_have_permission_to_post" = "Du hast keine Berechtigung in diesem Raum zu posten";
"room_event_action_kick_prompt_reason" = "Grund für den Rauswurf des Benutzers";
"room_event_action_ban_prompt_reason" = "Grund für die Verbannung des Benutzers";
+2
View File
@@ -256,6 +256,8 @@
"room_event_action_view_source" = "View Source";
"room_event_action_report" = "Report content";
"room_event_action_report_prompt_reason" = "Reason for reporting this content";
"room_event_action_kick_prompt_reason" = "Reason for kicking this user";
"room_event_action_ban_prompt_reason" = "Reason for banning this user";
"room_event_action_report_prompt_ignore_user" = "Do you want to hide all messages from this user?";
"room_event_action_save" = "Save";
"room_event_action_resend" = "Resend";
+1 -1
View File
@@ -78,7 +78,7 @@
"auth_reset_password_missing_email" = "Zure kontura gehitutako e-mail helbidea sartu behar da.";
"auth_reset_password_missing_password" = "Pasahitz berri bat sartu behar da.";
"auth_reset_password_error_unauthorized" = "Huts egin du e-mail helbidearen egiaztaketak, egin klik e-mailean zetorren estekan";
"auth_reset_password_success_message" = "Zure pasahitza berrezarri da.\n\nSaiotik atera zaizu gailu guztietan eta ez dituzu jakinarazpenak jasoko. Jakinarazpenak berriro jasotzeko hasi berriro saioa gailu bakoitzean.";
"auth_reset_password_success_message" = "Zure pasahitza berrezarri da.\n\nSaioa amaitu da zure gailu guztietan eta ez dituzu jakinarazpenak jasoko. Jakinarazpenak berriro jasotzeko hasi berriro saioa gailu bakoitzean.";
// Read Receipts
"read_receipts_list" = "Irakurragirien zerrenda";
"yesterday" = "Atzo";
+2
View File
@@ -515,3 +515,5 @@
"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_ban_prompt_reason" = "Raison du bannissement de l'utilisateur";
+15 -1
View File
@@ -1 +1,15 @@
// Titles
"title_home" = "Kezdőképernyő";
"title_favourites" = "Kedvencek";
"title_people" = "Emberek";
"title_rooms" = "Szobák";
"title_groups" = "Közösségek";
"warning" = "Figyelmeztetés";
// Actions
"view" = "Megtekintés";
"back" = "Vissza";
"continue" = "Folytatás";
"create" = "Létrehozás";
"leave" = "Elhagyás";
"remove" = "Eltávolítás";
"invite" = "Meghívás";
+355
View File
@@ -0,0 +1,355 @@
// Titles
"title_home" = "Heim";
"title_favourites" = "Eftirlæti";
"title_people" = "Fólk";
"title_rooms" = "Spjallrásir";
"title_groups" = "Samfélög";
"warning" = "Aðvörun";
// Actions
"view" = "Skoða";
"next" = "Næsta";
"back" = "Til baka";
"continue" = "Halda áfram";
"create" = "Búa til";
"start" = "Byrja";
"leave" = "Fara út";
"remove" = "Fjarlægja";
"invite" = "Bjóða";
"retry" = "Reyna aftur";
"on" = "Kveikt";
"off" = "Slökkt";
"cancel" = "Hætta við";
"save" = "Vista";
"join" = "Taka þátt";
"decline" = "Hafna";
"accept" = "Samþykkja";
"preview" = "Forskoðun";
"camera" = "Myndavél";
"voice" = "Tal";
"video" = "Myndmerki";
"later" = "Seinna";
"rename" = "Endurnefna";
"collapse" = "fella saman";
"send_to" = "Senda til %@";
"sending" = "Sendi";
// Authentication
"auth_login" = "Innskráning";
"auth_register" = "Nýskrá";
"auth_submit" = "Senda inn";
"auth_skip" = "Sleppa";
"auth_user_id_placeholder" = "Tölvupóstfang eða notandanafn";
"auth_password_placeholder" = "Lykilorð";
"auth_new_password_placeholder" = "Nýtt lykilorð";
"auth_user_name_placeholder" = "Notandanafn";
"auth_optional_email_placeholder" = "Tölvupóstfang (valfrjálst)";
"auth_email_placeholder" = "Tölvupóstfang";
"auth_optional_phone_placeholder" = "Símanúmer (valfrjálst)";
"auth_phone_placeholder" = "Símanúmer";
"auth_repeat_password_placeholder" = "Endurtaka lykilorð";
"auth_repeat_new_password_placeholder" = "Staðfestu nýtt lykilorð";
"auth_invalid_login_param" = "Rangt notandanafn og/eða lykilorð";
"auth_invalid_user_name" = "Notandanöfn mega einungis innihalda bókstafi, tölustafi, punkta, bandstrik eða undirstrik";
"auth_invalid_password" = "Lykilorð er of stutt (lágmark 6 stafir)";
"auth_missing_password" = "Lykilorð vantar";
"auth_missing_email" = "Vantar tölvupóstfang";
"auth_missing_phone" = "Vantar símanúmer";
"auth_missing_email_or_phone" = "Vantar tölvupóstfang eða símanúmer";
"auth_password_dont_match" = "Lykilorðin stemma ekki";
"auth_username_in_use" = "Notandanafn er í notkun";
"auth_forgot_password" = "Gleymt lykilorð?";
"auth_msisdn_validation_title" = "Sannvottun í bið";
"room_creation_account" = "Notandaaðgangur";
"room_creation_appearance" = "Útlit";
"room_creation_appearance_name" = "Heiti";
"room_creation_privacy" = "Meðferð persónuupplýsinga";
"room_creation_make_private" = "Gera einka";
"room_recents_directory_section_network" = "Netkerfi";
"room_recents_favourites_section" = "Eftirlæti";
"room_recents_people_section" = "FÓLK";
"room_recents_conversations_section" = "SPJALLRÁSIR";
"room_recents_no_conversation" = "Engar spjallrásir";
"room_recents_low_priority_section" = "LÍTILL FORGANGUR";
"room_recents_invites_section" = "BOÐSGESTIR";
"room_recents_start_chat_with" = "Hefja spjall";
"room_recents_create_empty_room" = "Búa til spjallrás";
"room_recents_join_room" = "Taka þátt í spjallrás";
"room_recents_join_room_title" = "Taka þátt í spjallsvæði";
// People tab
"people_invites_section" = "BOÐSGESTIR";
"people_conversation_section" = "SAMTÖL";
"people_no_conversation" = "Engin samtöl";
// Groups tab
"group_invite_section" = "BOÐSGESTIR";
"group_section" = "SAMFÉLÖG";
// Search
"search_rooms" = "Spjallrásir";
"search_messages" = "Skilaboð";
"search_people" = "Fólk";
"search_files" = "Skrár";
"search_default_placeholder" = "Leita";
"search_no_result" = "Engar niðurstöður";
"search_in_progress" = "Leita…";
// Directory
"directory_cell_title" = "Vafra í möppu";
"directory_cell_description" = "%tu spjallrásir";
// Contacts
"contacts_address_book_section" = "TENGILIÐIR Á TÆKI";
"contacts_address_book_matrix_users_toggle" = "Einungis notendur Matrix";
"room_participants_leave_prompt_title" = "Fara af spjallrás";
"room_participants_leave_prompt_msg" = "Ertu viss um að þú viljir fara út spjallrásinni?";
"room_participants_remove_prompt_title" = "Staðfesting";
"room_participants_invite_prompt_title" = "Staðfesting";
"room_participants_filter_room_members" = "Sía meðlimi spjallrásar";
"room_participants_online" = "Nettengt";
"room_participants_offline" = "Ónettengt";
"room_participants_unknown" = "Óþekkt";
"room_participants_idle" = "Iðjulaust";
"room_participants_now" = "núna";
"room_participants_ago" = "síðan";
"room_participants_action_section_admin_tools" = "Kerfisstjóratól";
"room_participants_action_section_direct_chats" = "Beint spjall";
"room_participants_action_section_devices" = "Tæki";
"room_participants_action_section_other" = "Annað";
"room_participants_action_invite" = "Bjóða";
"room_participants_action_leave" = "Fara af spjallrás";
"room_participants_action_remove" = "Fjarlægja úr þessari spjallrás";
"room_participants_action_ban" = "Banna á þessari spjallrás";
"room_participants_action_unban" = "Afbanna";
"room_participants_action_set_admin" = "Gera að stjórnanda";
"room_participants_action_start_new_chat" = "Hefja nýtt spjall";
"room_participants_action_start_voice_call" = "Hefja raddsamtal";
"room_participants_action_start_video_call" = "Hefja myndsamtal";
"room_new_message_notification" = "%d ný skilaboð";
"room_new_messages_notification" = "%d ný skilaboð";
"room_one_user_is_typing" = "%@ er að skrifa…";
"room_two_users_are_typing" = "%@ & %@ eru að skrifa…";
"room_many_users_are_typing" = "%@, %@ & fleiri eru að skrifa……";
"encrypted_room_message_placeholder" = "Senda dulrituð skilaboð…";
"room_ongoing_conference_call_close" = "Loka";
"room_prompt_resend" = "Endursenda allt";
"room_prompt_cancel" = "hætta við allt";
"room_event_action_copy" = "Afrita";
"room_event_action_quote" = "Tilvitnun";
"room_event_action_redact" = "Ritstýra";
"room_event_action_more" = "Meira";
"room_event_action_share" = "Deila";
"room_event_action_permalink" = "Varanlegur tengill";
"room_event_action_view_source" = "Skoða frumkóða";
"room_event_action_save" = "Vista";
"room_event_action_resend" = "Endursenda";
"room_event_action_delete" = "Eyða";
"room_event_action_cancel_download" = "Hætta við niðurhal";
"unknown_devices_send_anyway" = "Senda samt";
"unknown_devices_verify" = "Sannreyna…";
// Room Title
"room_title_new_room" = "Ný spjallrás";
"room_title_multiple_active_members" = "%@/%@ virkir meðlimir";
"room_title_one_active_member" = "%@/%@ virkur meðlimur";
"room_title_invite_members" = "Bjóða meðlimum";
"room_title_members" = "%@ meðlimir";
"room_title_one_member" = "1 meðlimur";
"room_preview_try_join_an_unknown_room_default" = "spjallrás";
// Settings
"settings_title" = "Stillingar";
"settings_report_bug" = "Tilkynna galla";
"settings_config_user_id" = "Skráð inn sem %@";
"settings_user_settings" = "STILLINGAR NOTANDA";
"settings_notifications_settings" = "STILLINGAR Á TILKYNNINGUM";
"settings_calls_settings" = "SAMTÖL";
"settings_user_interface" = "NOTANDAVIÐMÓT";
"settings_ignored_users" = "HUNSAÐIR NOTENDUR";
"settings_contacts" = "TENGILIÐIR Á TÆKI";
"settings_advanced" = "ÍTARLEGT";
"settings_other" = "ANNAÐ";
"settings_devices" = "TÆKI";
"settings_cryptography" = "DULRITUN";
"settings_sign_out" = "Skrá út";
"settings_sign_out_confirmation" = "Ertu viss?";
"settings_profile_picture" = "Notandamynd";
"settings_display_name" = "Birtingarnafn";
"settings_first_name" = "Skírnarnafn";
"settings_surname" = "Eftirnafn";
"settings_remove_prompt_title" = "Staðfesting";
"settings_email_address" = "Tölvupóstfang";
"settings_add_email_address" = "Bæta við tölvupóstfangi";
"settings_phone_number" = "Símanúmer";
"settings_add_phone_number" = "Bæta við símanúmeri";
"settings_night_mode" = "Næturhamur";
"settings_ui_language" = "Tungumál";
"settings_ui_theme" = "Þema";
"settings_ui_theme_auto" = "Sjálfvirkt";
"settings_ui_theme_light" = "Ljóst";
"settings_ui_theme_dark" = "Dökkt";
"settings_ui_theme_black" = "Svart";
"settings_ui_theme_picker_title" = "Veldu þema";
"settings_labs_e2e_encryption" = "Enda-í-enda dulritun";
"settings_version" = "Útgáfa %@";
"settings_olm_version" = "Útgáfa olm %@";
"settings_copyright" = "Höfundarréttur";
"settings_copyright_url" = "https://riot.im/copyright";
"settings_term_conditions" = "Skilmálar og kvaðir";
"settings_term_conditions_url" = "https://riot.im/tac_apple";
"settings_privacy_policy" = "Stefna vegna meðferðar persónuupplýsinga";
"settings_privacy_policy_url" = "https://riot.im/privacy";
"settings_third_party_notices" = "Athugasemdir frá þriðja aðila";
"settings_send_crash_report" = "Senda nafnlausar hrunskýrslur og upplýsingar um notkun";
"settings_clear_cache" = "Hreinsa skyndiminni";
"settings_change_password" = "Breyta lykilorði";
"settings_old_password" = "eldra lykilorð";
"settings_new_password" = "nýtt lykilorð";
"settings_confirm_password" = "staðfestu lykilorð";
"settings_fail_to_update_password" = "Mistókst að uppfæra lykilorð";
"settings_password_updated" = "Lykilorðið þitt hefur verið uppfært";
"settings_crypto_device_name" = "Heiti tækis: ";
"settings_crypto_device_id" = "\nAuðkenni tækis: ";
"settings_crypto_device_key" = "\nDulritunarlykill tækis: ";
"settings_crypto_export" = "Flytja út dulritunarlykla";
// Room Details
"room_details_title" = "Nánar um spjallrás";
"room_details_people" = "Meðlimir";
"room_details_files" = "Skrár";
"room_details_settings" = "Stillingar";
"room_details_photo" = "Mynd spjallrásar";
"room_details_room_name" = "Nafn spjallrásar";
"room_details_topic" = "Umfjöllunarefni";
"room_details_favourite_tag" = "Eftirlæti";
"room_details_low_priority_tag" = "Lítill forgangur";
"room_details_direct_chat" = "Beint spjall";
"room_details_history_section" = "Hver getur lesið ferilskráningu?";
"room_details_history_section_anyone" = "Hver sem er";
"room_details_history_section_prompt_title" = "Aðvörun vegna gagnaleyndar";
"room_details_addresses_section" = "Vistföng";
"room_details_new_address" = "Bæta við nýju heimilisfangi";
"room_details_flair_invalid_id_prompt_title" = "Ógilt snið";
"room_details_banned_users_section" = "Bannaðir notendur";
"room_details_advanced_section" = "Ítarlegt";
// Group Details
"group_details_title" = "Nánar um samfélag";
"group_details_home" = "Heim";
"group_details_people" = "Fólk";
"group_details_rooms" = "Spjallrásir";
// Group Home
"group_home_one_member_format" = "1 meðlimur";
"group_home_multi_members_format" = "%tu meðlimir";
"group_home_one_room_format" = "1 spjallrás";
"group_home_multi_rooms_format" = "%tu spjallrásir";
"group_invitation_format" = "%@ hefur boðið þér að taka þátt í þessu samfélagi";
// Group participants
"group_participants_add_participant" = "Bæta við þátttakanda";
"group_participants_remove_prompt_title" = "Staðfesting";
"group_participants_invite_prompt_title" = "Staðfesting";
"group_participants_filter_members" = "Sía meðlimi samfélags";
"group_participants_invited_section" = "BOÐIÐ";
// Group rooms
"group_rooms_filter_rooms" = "Sía spjallrásir samfélags";
"receipt_status_read" = "Lesið: ";
// Media picker
"media_picker_library" = "Safn";
"media_picker_select" = "Veldu";
// Directory
"directory_title" = "Mappa";
"directory_server_picker_title" = "Veldu möppu";
"directory_server_all_rooms" = "Allar spjallrásir á %@ vefþjóninum";
"directory_server_all_native_rooms" = "Allar innbyggðar Matrix-spjallrásir";
// Others
"or" = "eða";
"you" = "Þú";
"today" = "Í dag";
"yesterday" = "Í gær";
"network_offline_prompt" = "Internettenging virðist vera ótengd.";
"do_not_ask_again" = "Ekki spyrja aftur";
"large_badge_value_k_format" = "%.1fK";
"room_displayname_two_members" = "%@ og %@";
"room_displayname_more_than_two_members" = "%@ og %u til viðbótar";
"room_displayname_no_title" = "Tóm spjallrás";
// Call
"call_incoming_voice_prompt" = "Innhringing raddsamtals frá %@";
"call_incoming_video_prompt" = "Innhringing myndsamtals frá %@";
"call_incoming_voice" = "Innhringing...";
"call_incoming_video" = "Innhringing myndsamtals...";
// No VoIP support
"no_voip_title" = "Innhringing";
// Bug report
"bug_report_title" = "Villuskýrsla";
"bug_crash_report_title" = "Hrunskýrsla";
"bug_report_send_logs" = "Senda atvikaskrá";
"bug_report_send_screenshot" = "Senda skjámynd";
"bug_report_progress_zipping" = "Safna atvikaskrám";
"bug_report_progress_uploading" = "Sendi inn skýrslu";
"bug_report_send" = "Senda";
"widget_integration_must_be_in_room" = "Þú ert ekki á þessari spjallrás.";
"widget_integration_no_permission_in_room" = "Þú hefur ekki réttindi til þess að gera þetta á þessari spjallrás.";
"e2e_room_key_request_ignore_request" = "Hunsa beiðni";
"active_call" = "Virkt samtal";
"unknown_devices_call_anyway" = "hringja samt";
"call_already_displayed" = "Þegar er samtal í gangi.";
"active_call_details" = "Virkt samtal (%@)";
"auth_send_reset_email" = "Senda endurstillingarpóst";
"auth_return_to_login" = "Fara aftur í innskráningargluggann";
"auth_home_server_placeholder" = "URL-slóð (t.d. https://matrix.org)";
"auth_identity_server_placeholder" = "URL-slóð (t.d. https://matrix.org)";
"auth_invalid_email" = "Þetta lítur ekki út eins og gilt tölvupóstfang";
"auth_invalid_phone" = "Þetta lítur ekki út eins og gilt símanúmer";
"auth_email_in_use" = "Þetta tölvupóstfang er nú þegar í notkun";
"auth_phone_in_use" = "Þetta símanúmer er nú þegar í notkun";
"auth_untrusted_id_server" = "Þessum auðkennisþjóni er ekki treyst";
"auth_use_server_options" = "Nota sérsniðna valkosti vefþjóns (ítarlegt)";
"auth_email_validation_message" = "Skoðaðu tölvupóstinn þinn til að geta haldið áfram með skráningu";
"auth_msisdn_validation_message" = "Við höfum sent SMS-skilaboð með virkjunarkóða. Settu þennan kóða inn hér fyrir neðan.";
"auth_msisdn_validation_error" = "Ekki var hægt að sannreyna símanúmer.";
// Chat creation
"room_creation_title" = "Nýtt spjall";
"room_creation_private_room" = "Þetta spjall er einkamál";
"room_creation_public_room" = "Þetta spjall er opinbert";
"room_creation_make_public" = "Gera opinbert";
"room_creation_make_public_prompt_title" = "Gera þetta spjall opinbert?";
"room_creation_keep_private" = "Halda einka";
// Rooms tab
"room_directory_no_public_room" = "Engar opinberar spjallrásir tiltækar";
"search_people_placeholder" = "Leita eftir notandauðkenni, nafni eða tölvupóstfangi";
"directory_search_fail" = "Ekki tókst að sækja gögn";
"contacts_address_book_no_contact" = "Engir tengiliðir á tæki";
// Chat participants
"room_participants_title" = "Þátttakendur";
"room_participants_add_participant" = "Bæta við þátttakanda";
"room_participants_one_participant" = "1 þáttakandi";
"room_participants_multi_participants" = "%d þátttakendur";
"room_participants_action_ignore" = "Fela öll skilaboð frá þessum notanda";
"room_participants_action_unignore" = "Sýna öll skilaboð frá þessum notanda";
"room_participants_action_set_default_power_level" = "Endurstilla sem venjulegan notanda";
"room_participants_action_set_moderator" = "Gera að umsjónarmanni";
"room_participants_action_mention" = "Minnst á";
// Chat
"room_jump_to_first_unread" = "Fara í fyrstu ólesin skilaboð";
"room_message_placeholder" = "Senda skilaboð (ódulrituð)…";
"room_do_not_have_permission_to_post" = "Þú hefur ekki heimild til að senda skilaboð á þessa spjallrás";
"room_message_short_placeholder" = "Senda skilaboð…";
"room_offline_notification" = "Tenging við vefþjón hefur rofnað.";
"room_resend_unsent_messages" = "Senda aftur ósend skilaboð";
"room_delete_unsent_messages" = "Eyða ósendum skilaboðum";
"room_event_action_report" = "Klaga efni";
"room_event_action_report_prompt_reason" = "Ástæður fyrir tilkynningu um vankanta á þessu efni";
"room_event_action_report_prompt_ignore_user" = "Viltu fela öll skilaboð frá þessum notanda?";
"room_event_action_cancel_send" = "Hætta við sendingu";
"room_event_action_view_encryption" = "Dulritunarupplýsingar";
"room_event_failed_to_send" = "Mistókst að senda";
// Unknown devices
"unknown_devices_alert_title" = "Spjallrás inniheldur óþekkt tæki";
"unknown_devices_answer_anyway" = "Svara samt";
"unknown_devices_title" = "Óþekkt tæki";
// Room Preview
"room_preview_invitation_format" = "Þér hefur verið boðið af %@ að taka þátt í þessari spjallrás";
"account_logout_all" = "Skrá út af öllum notandaaðgöngum";
"settings_config_no_build_info" = "Engar smíðaupplýsingar";
"settings_mark_all_as_read" = "Merkja öll skilaboð sem lesin";
"settings_config_home_server" = "Heimaþjónn er %@";
"settings_config_identity_server" = "Auðkennisþjónn er %@";
"settings_labs" = "TILRAUNIR";
"settings_flair" = "Sýna hlutverksmerki þar sem það er leyfilegt";
"settings_remove_email_prompt_msg" = "Ertu viss um að þú viljir fjarlægja tölvupóstfangið %@?";
"settings_remove_phone_prompt_msg" = "Ertu viss um að þú viljir fjarlægja símanúmerið %@?";
"settings_email_address_placeholder" = "Settu inn tölvupóstfangið þitt";
"settings_enable_push_notif" = "Tilkynningar á þessu tæki";
"settings_show_decrypted_content" = "Sýna afkóðað efni";
"settings_enable_callkit" = "Innbyggð hringing";
"room_details_flair_section" = "Sýna hlutverksmerki fyrir samfélög";
+4 -23
View File
@@ -18,82 +18,63 @@
/* New message from a specific person, not referencing a room */
"MSG_FROM_USER" = "Bericht van %@";
/* New message from a specific person in a named room */
"MSG_FROM_USER_IN_ROOM" = "%@ geplaatst in %@";
/** Single, unencrypted messages (where we can include the content */
/* 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" = "%@ in %@: %@";
/* 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" = "%@: * %@ %@";
/** Image Messages **/
/* New action message from a specific person, not referencing a room. */
"IMAGE_FROM_USER" = "%@ heeft je een afbeelding %@ gestuurd";
/* New action message from a specific person in a named room. */
"IMAGE_FROM_USER_IN_ROOM" = "%@ plaatste een afbeelding %@ in %@";
/** Coalesced messages **/
/* Multiple unread messages in a room */
"UNREAD_IN_ROOM" = "%@ nieuwe berichten in %@";
/* Multiple unread messages from a specific person, not referencing a room */
"MSGS_FROM_USER" = "%@ nieuwe berichten in %@";
/* Multiple unread messages from two people */
"MSGS_FROM_TWO_USERS" = "%@ nieuwe berichten van %@ en %@";
/* Multiple unread messages from three people */
"MSGS_FROM_THREE_USERS" = "%@ nieuwe berichten van %@, %@ en %@";
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
"MSGS_FROM_TWO_PLUS_USERS" = "%@ nieuwe berichten van %@, %@ en anderen";
/* Multiple messages in two rooms */
"MSGS_IN_TWO_ROOMS" = "%@ nieuwe berichten in %@ en %@";
/* Look, stuff's happened, alright? Just open the app. */
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ nieuwe berichten in %@, %@ en anderen";
/** Invites **/
/* A user has invited you to a chat */
"USER_INVITE_TO_CHAT" = "%@ heeft je voor een gesprek uitgenodigd";
/* A user has invited you to an (unamed) group chat */
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ heeft je voor een groepsgesprek uitgenodigd";
/* A user has invited you to a named room */
"USER_INVITE_TO_NAMED_ROOM" = "%@ heeft je in %@ uitgenodigd";
/** Calls **/
/* Incoming one-to-one voice call */
"VOICE_CALL_FROM_USER" = "Oproep van %@";
/* Incoming one-to-one video call */
"VIDEO_CALL_FROM_USER" = "Video-oproep van %@";
/* Incoming unnamed voice conference invite from a specific person */
"VOICE_CONF_FROM_USER" = "Groepsoproep van %@";
/* Incoming unnamed video conference invite from a specific person */
"VIDEO_CONF_FROM_USER" = "Video groepsoproep van %@";
/* Incoming named voice conference invite from a specific person */
"VOICE_CONF_NAMED_FROM_USER" = "Groepsoproep van %@: '%@'";
/* Incoming named video conference invite from a specific person */
"VIDEO_CONF_NAMED_FROM_USER" = "Video groepsoproep van %@: '%@'";
/* A single unread message in a room */
"SINGLE_UNREAD_IN_ROOM" = "Je hebt een bericht ontvangen in %@";
/* A single unread message */
"SINGLE_UNREAD" = "Je hebt een bericht ontvangen";
+38
View File
@@ -503,3 +503,41 @@
"e2e_room_key_request_start_verification" = "Start verificatie...";
"e2e_room_key_request_share_without_verifying" = "Delen zonder te verifiëren";
"e2e_room_key_request_ignore_request" = "Negeer verzoek";
"title_groups" = "Gemeenschappen";
// Groups tab
"group_invite_section" = "UITNODIGINGEN";
"group_section" = "GEMEENSCHAPPEN";
"room_do_not_have_permission_to_post" = "Je hebt geen toestemming om in deze ruimte te posten";
"settings_flair" = "Badge weergeven waar toegestaan";
"room_details_flair_section" = "Badge voor gemeenschappen weergeven";
"room_details_new_flair_placeholder" = "Voeg nieuw gemeenschaps-ID toe (bv. +foo%@)";
"room_details_flair_invalid_id_prompt_title" = "Ongeldig formaat";
"room_details_flair_invalid_id_prompt_msg" = "%@ is niet een geldige identificatie voor een gemeenschap";
"room_details_fail_to_update_room_communities" = "Niet gelukt om de gerelateerde gemeenschappen te updaten";
// Group Details
"group_details_title" = "Gemeenschapsdetails";
"group_details_home" = "Home";
"group_details_people" = "Personen";
"group_details_rooms" = "Ruimtes";
// Group Home
"group_home_one_member_format" = "1 lid";
"group_home_multi_members_format" = "%tu leden";
"group_home_one_room_format" = "1 ruimte";
"group_home_multi_rooms_format" = "%tu ruimtes";
"group_invitation_format" = "%@ heeft je uitgenodigd om tot deze gemeenschap toe te treden";
// Group participants
"group_participants_add_participant" = "Deelnemer toevoegen";
"group_participants_leave_prompt_title" = "Groep verlaten";
"group_participants_leave_prompt_msg" = "Weet je zeker dat je de groep wilt verlaten?";
"group_participants_remove_prompt_title" = "Bevestigen";
"group_participants_remove_prompt_msg" = "Weet je zeker dat je %@ van deze groep wilt verwijderen?";
"group_participants_invite_prompt_title" = "Bevestiging";
"group_participants_invite_prompt_msg" = "Weet je zeker dat je %@ in deze groep wilt uitnodigen?";
"group_participants_filter_members" = "Gemeenschapsleden filteren";
"group_participants_invite_another_user" = "Zoeken / uitnodigen bij Gebruikers-ID of Naam";
"group_participants_invite_malformed_id_title" = "Uitnodigingsfout";
"group_participants_invite_malformed_id" = "Misvormd ID. Het moet een Matrix ID zijn, zoals '@localpart:domain'";
"group_participants_invited_section" = "UITGENODIGD";
// Group rooms
"group_rooms_filter_rooms" = "Gemeenschapsruimtes filteren";
"e2e_room_key_request_message_new_device" = "Je hebt een nieuwe apparaat '%@' toegevoegd, die een verzoek doet naar versleutelingssleutels.";
+4
View File
@@ -514,3 +514,7 @@
"group_rooms_filter_rooms" = "Фильтр комнат сообщества";
"e2e_room_key_request_message_new_device" = "Вы добавили новое устройство '%@', которое запрашивает ключи шифрования.";
"room_do_not_have_permission_to_post" = "У вас нет разрешения на публикацию в этой комнате";
"settings_flair" = "Покажите настроение, где это разрешено";
"room_details_flair_section" = "Показать настроение для сообществ";
"room_event_action_kick_prompt_reason" = "Причина по которой этот пользователь будет выкинут";
"room_event_action_ban_prompt_reason" = "Причина по которой этот пользователь будет забанен";
+5
View File
@@ -0,0 +1,5 @@
// Permissions usage explanations
"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.";
+52
View File
@@ -0,0 +1,52 @@
/* New message from a specific person, not referencing a room */
"MSG_FROM_USER" = "Mesazh prej %@";
/* New message from a specific person in a named room */
"MSG_FROM_USER_IN_ROOM" = "%@ postuar te %@";
/* 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" = "%@ te %@: %@";
/* 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" = "%@ ju dërgoi një foto %@";
/* New action message from a specific person in a named room. */
"IMAGE_FROM_USER_IN_ROOM" = "%@ postoi një foto %@ në %@";
/* A single unread message in a room */
"SINGLE_UNREAD_IN_ROOM" = "Morët një mesazh te %@";
/* A single unread message */
"SINGLE_UNREAD" = "Morët një mesazh";
/* Multiple unread messages in a room */
"UNREAD_IN_ROOM" = "%@ mesazhe të rinj në %@";
/* Multiple unread messages from a specific person, not referencing a room */
"MSGS_FROM_USER" = "%@ mesazhe të rinj në %@";
/* Multiple unread messages from two people */
"MSGS_FROM_TWO_USERS" = "%@ mesazhe të rinj nga %@ dhe %@";
/* Multiple unread messages from three people */
"MSGS_FROM_THREE_USERS" = "%@ mesazhe të rinj nga %@, %@ dhe %@";
/* Multiple unread messages from two plus people (ie. for 4+ people: 'others' replaces the third person) */
"MSGS_FROM_TWO_PLUS_USERS" = "%@ mesazhe të rinj nga %@, %@ dhe të tjerë";
/* Multiple messages in two rooms */
"MSGS_IN_TWO_ROOMS" = "%@ mesazhe të rinj në %@ dhe %@";
/* Look, stuff's happened, alright? Just open the app. */
"MSGS_IN_TWO_PLUS_ROOMS" = "%@ mesazhe të rinj në %@, %@ dhe të tjerë";
/* A user has invited you to a chat */
"USER_INVITE_TO_CHAT" = "%@ ju ka ftuar të fjaloseni";
/* A user has invited you to an (unamed) group chat */
"USER_INVITE_TO_CHAT_GROUP_CHAT" = "%@ ju ka ftuar në një fjalosje në grup";
/* A user has invited you to a named room */
"USER_INVITE_TO_NAMED_ROOM" = "%@ ju ka ftuar te %@";
/* Incoming one-to-one voice call */
"VOICE_CALL_FROM_USER" = "Thirrje nga %@";
/* Incoming one-to-one video call */
"VIDEO_CALL_FROM_USER" = "Thirrje video nga %@";
/* Incoming unnamed voice conference invite from a specific person */
"VOICE_CONF_FROM_USER" = "Thirrje grupi nga %@";
/* Incoming unnamed video conference invite from a specific person */
"VIDEO_CONF_FROM_USER" = "Thirrje video në grup nga %@";
/* Incoming named voice conference invite from a specific person */
"VOICE_CONF_NAMED_FROM_USER" = "Thirrje grupi nga %@: '%@'";
/* Incoming named video conference invite from a specific person */
"VIDEO_CONF_NAMED_FROM_USER" = "Thirrje video në grup nga %@: '%@'";
+400
View File
@@ -0,0 +1,400 @@
// Titles
"title_home" = "Kreu";
"title_people" = "Persona";
"title_rooms" = "Dhoma";
"title_groups" = "Bashkësi";
"warning" = "Sinjalizim";
// Actions
"view" = "Shiheni";
"next" = "Pasuesja";
"back" = "Mbrapsht";
"continue" = "Vazhdo";
"create" = "Krijoje";
"start" = "Fillo";
"leave" = "Dilni";
"remove" = "Hiqe";
"invite" = "Ftoje";
"retry" = "Riprovo";
"off" = "Off";
"cancel" = "Anuloje";
"save" = "Ruaje";
"decline" = "Hidhe poshtë";
"accept" = "Pranoje";
"preview" = "Paraparje";
"camera" = "Kamerë";
"voice" = "Zë";
"video" = "Video";
"active_call" = "Thirrje Aktive";
"active_call_details" = "Thirrje Aktive (%@)";
"later" = "Më vonë";
"rename" = "Riemërtojeni";
"collapse" = "tkurre";
"send_to" = "Dërgoje te %@";
"sending" = "Po dërgohet";
// Authentication
"auth_login" = "Hyni";
"auth_register" = "Regjistrohuni";
"auth_submit" = "Parashtroje";
"auth_skip" = "Anashkaloje";
"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 (opsionale)";
"auth_email_placeholder" = "Adresë email";
"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";
"auth_home_server_placeholder" = "URL (p.sh. https://matrix.org)";
"auth_identity_server_placeholder" = "URL (p.sh. https://matrix.org)";
"auth_invalid_login_param" = "Emër përdoruesi dhe/ose fjalëkalim i pasaktë";
"auth_invalid_password" = "Fjalëkalim shumë i shkurtër (min 6)";
"auth_invalid_email" = "Kjo sduket si adresë email e vlefshme";
"auth_invalid_phone" = "Ky sduket si numër telefoni i vlefshëm";
"auth_missing_password" = "Mungon fjalëkalimi";
"auth_missing_email" = "Mungon adresa email";
"auth_missing_phone" = "Mungon numër telefoni";
"auth_missing_email_or_phone" = "Mungon adresa email ose numër telefoni";
"auth_email_in_use" = "Kjo adresë email është tashmë në përdorim";
"auth_phone_in_use" = "Ky numër telefoni është tashmë në përdorim";
"auth_untrusted_id_server" = "Shërbyesi i identiteteve s’është i besuar";
"auth_password_dont_match" = "Fjalëkalimet spërputhen";
"auth_username_in_use" = "Emër përdoruesi në përdorim";
"auth_forgot_password" = "Harruat fjalëkalimin?";
"auth_email_not_found" = "Su arrit të dërgohej email: Kjo adresë email su gjet";
"auth_email_validation_message" = "Ju lutemi, që të vazhdojë regjistrimi, kontrolloni email-in tuaj";
"auth_msisdn_validation_title" = "Verifikim Në Pritje të Miratimit";
"auth_msisdn_validation_error" = "Sarrihet të verifikohet numër telefoni.";
"auth_reset_password_message" = "Që të ricaktoni fjalëkalimin, jepni adresën email të lidhur me llogarinë tuaj:";
"auth_reset_password_missing_email" = "Duhet dhënë adresa email e lidhur me llogarinë tuaj.";
"auth_reset_password_missing_password" = "Duhet dhënë një fjalëkalim i ri.";
// Chat creation
"room_creation_title" = "Fjalosje e Re";
"room_creation_account" = "Llogari";
"room_creation_appearance" = "Dukje";
"room_creation_appearance_name" = "Emër";
"room_creation_privacy" = "Privatësi";
"room_creation_private_room" = "Kjo fjalosje është private";
"room_creation_public_room" = "Kjo fjalosje është publike";
"room_creation_make_public" = "Bëje publike";
"room_creation_make_public_prompt_title" = "Të bëhet publike kjo fjalosje?";
"room_creation_keep_private" = "Mbaje private";
"room_creation_make_private" = "Bëje private";
// Room recents
"room_recents_directory_section" = "DREJTORI DHOME";
"room_recents_directory_section_network" = "Rrjet";
"room_recents_people_section" = "PERSONA";
"room_recents_conversations_section" = "DHOMA";
"room_recents_no_conversation" = "Ska dhoma";
"room_recents_low_priority_section" = "ME PËRPARËSI TË ULËT";
"room_recents_invites_section" = "FTESA";
"room_recents_start_chat_with" = "Filloni fjalosje";
"room_recents_create_empty_room" = "Krijo dhomë";
"room_recents_join_room" = "Hyni në dhomë";
"room_recents_join_room_prompt" = "Shtypni një ID ose alias dhome";
// People tab
"people_invites_section" = "FTESA";
"people_conversation_section" = "BISEDA";
"people_no_conversation" = "Ska biseda";
// Rooms tab
"room_directory_no_public_room" = "Sk a dhoma publike";
// Groups tab
"group_invite_section" = "FTESA";
"group_section" = "BASHKËSI";
// Search
"search_rooms" = "Dhoma";
"search_messages" = "Mesazhe";
"search_people" = "Persona";
"search_files" = "Kartela";
"search_default_placeholder" = "Kërko";
"search_people_placeholder" = "Kërkoni sipas ID-je Përdoruesi, Emri ose email-i";
"search_no_result" = "Ska përfundime";
"search_in_progress" = "Po kërkohet…";
// Directory
"directory_cell_title" = "Shfletoni në drejtori";
"directory_cell_description" = "Dhoma %tu";
"directory_search_results_title" = "Shfletoni përfundime drejtorie";
"directory_search_results" = "u gjetën %tu përfundime për %@";
"directory_search_results_more_than" = "u gjetën >%tu përfundime për %@";
"directory_searching_title" = "Po kërkohet në drejtori…";
"directory_search_fail" = "Su arrit të sillen të dhëna";
// Contacts
"contacts_address_book_section" = "KONTAKTE VENDORE";
"contacts_address_book_matrix_users_toggle" = "Vetëm përdorues të Matrix-it";
"contacts_address_book_no_contact" = "Ska kontakte vendore";
"contacts_user_directory_section" = "DREJTORI PËRDORUESI";
"contacts_user_directory_offline_section" = "DREJTORI PËRDORUESI (jashtë linje)";
// Chat participants
"room_participants_title" = "Pjesëmarrës";
"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_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?";
"room_participants_invite_prompt_title" = "Ripohim";
"room_participants_invite_prompt_msg" = "Jeni i sigurt se doni të ftohet %@ te kjo fjalosje?";
"room_participants_filter_room_members" = "Filtroni anëtarë dhome";
"room_participants_invite_malformed_id_title" = "Gabim Ftim";
"room_participants_invited_section" = "TË FTUAR";
"room_participants_online" = "Në linjë";
"room_participants_offline" = "Jo në linjë";
"room_participants_unknown" = "I panjohur";
"room_participants_idle" = "I plogësht";
"room_participants_now" = "tani";
"room_participants_ago" = "më parë";
"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_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_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";
"room_participants_action_mention" = "Përmendje";
// Chat
"room_jump_to_first_unread" = "Hidhu te mesazhi i parë i palexuar";
"room_new_message_notification" = "%d mesazh i ri";
"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_do_not_have_permission_to_post" = "Skeni leje të postoni në këtë dhomë";
"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 su 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_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" = "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";
"room_event_action_delete" = "Fshije";
"room_event_action_cancel_send" = "Anuloje Dërgimin";
"room_event_action_cancel_download" = "Anuloje Shkarkimin";
"room_event_action_view_encryption" = "Të dhëna Fshehtëzimi";
"room_event_failed_to_send" = "Su arrit të dërgohej";
"unknown_devices_send_anyway" = "Dërgoje Sido Qoftë";
"unknown_devices_call_anyway" = "Thirre Sido Qoftë";
"unknown_devices_answer_anyway" = "Përgjigju Sido Qoftë";
"unknown_devices_verify" = "Verifikoni…";
"unknown_devices_title" = "Pajisje të panjohura";
// Room Title
"room_title_new_room" = "Dhomë e re";
"room_title_multiple_active_members" = "%@/%@ anëtarë aktivë";
"room_title_one_active_member" = "%@/%@ anëtar aktiv";
"room_title_invite_members" = "Ftoni anëtarë";
"room_title_members" = "%@ anëtarë";
"room_title_one_member" = "1 anëtar";
// Room Preview
"room_preview_invitation_format" = "Jeni ftuar të merrni pjesë në këtë dhomë nga %@";
"room_preview_try_join_an_unknown_room_default" = "një dhomë";
// Settings
"settings_title" = "Rregullime";
"account_logout_all" = "Bëj dalje nga krejt llogaritë";
"settings_config_no_build_info" = "Ska të dhëna montimi";
"settings_mark_all_as_read" = "Vëru shenjë krejt mesazheve si të lexuar";
"settings_report_bug" = "Njoftoni një të metë";
"settings_config_home_server" = "Shërbyesi home është %@";
"settings_config_identity_server" = "Shërbyes identitetesh është %@";
"settings_config_user_id" = "I futur si %@";
"settings_user_settings" = "RREGULLIME PËRDORUESI";
"settings_notifications_settings" = "RREGULLIME NJOFTIMESH";
"settings_calls_settings" = "THIRRJE";
"settings_user_interface" = "NDËRFAQE PËRDORUESI";
"settings_ignored_users" = "PËRDORUES TË SHPËRFILLUR";
"settings_contacts" = "KONTAKTE VENDORE";
"settings_advanced" = "TË MËTEJSHME";
"settings_other" = "TË TJERA";
"settings_devices" = "PAJISJE";
"settings_cryptography" = "KRIPTOGRAFI";
"settings_sign_out" = "Dilni";
"settings_sign_out_confirmation" = "Jeni i sigurt?";
"settings_profile_picture" = "Foto Profili";
"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 %@?";
"settings_remove_phone_prompt_msg" = "Jeni i sigurt se doni të hiqet numri i telefonit %@?";
"settings_email_address" = "Email";
"settings_email_address_placeholder" = "Jepni adresën tuaj email";
"settings_add_email_address" = "Shtoni adresë email";
"settings_phone_number" = "Telefon";
"settings_add_phone_number" = "Shtoni numër telefoni";
"settings_night_mode" = "Mënyra Mbrëmje";
"settings_enable_push_notif" = "Njoftime në këtë pajisje";
"settings_show_decrypted_content" = "Shfaq lëndë të shfshehtëzuar";
"settings_ui_language" = "Gjuhë";
"settings_ui_theme" = "Temë";
"settings_ui_theme_auto" = "Auto";
"settings_ui_theme_light" = "E çelët";
"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_contacts_phonebook_country" = "Vend libri telefonash";
"settings_labs_e2e_encryption" = "Fshehtëzim Skaj-Më-Skaj";
"settings_version" = "Version %@";
"settings_copyright" = "Të drejta kopjimi";
"settings_copyright_url" = "https://riot.im/copyright";
"settings_term_conditions" = "Terma & Kushte";
"settings_term_conditions_url" = "https://riot.im/tac_apple";
"settings_privacy_policy" = "Rregulla Privatësie";
"settings_privacy_policy_url" = "https://riot.im/privacy";
"settings_third_party_notices" = "Njoftime Palësh të Treta";
"settings_clear_cache" = "Pastroje fshehtinën";
"settings_change_password" = "Ndryshoni fjalëkalimin";
"settings_old_password" = "fjalëkalim i vjetër";
"settings_new_password" = "fjalëkalim i ri";
"settings_confirm_password" = "ripohoni fjalëkalimin";
"settings_password_updated" = "Fjalëkalimi juaj u përditësua";
"settings_crypto_device_name" = "Emër pajisjeje: ";
"settings_crypto_device_id" = "\nID pajisjeje: ";
"settings_crypto_device_key" = "\nKyç pajisjeje: ";
"settings_crypto_export" = "Eksporto kyçe";
"settings_crypto_blacklist_unverified_devices" = "Fshehtëzoje vetëm për pajisje të verifikuara";
// Room Details
"room_details_title" = "Hollësi Dhome";
"room_details_people" = "Anëtarë";
"room_details_files" = "Kartela";
"room_details_settings" = "Rregullime";
"room_details_photo" = "Foto Dhome";
"room_details_room_name" = "Emër Dhome";
"room_details_topic" = "Temë";
"room_details_favourite_tag" = "E parapëlqyer";
"room_details_low_priority_tag" = "Me përparësi të ulët";
"room_details_direct_chat" = "Fjalosje e Drejtpërdrejtë";
"room_details_access_section" = "Kush mund të hyjë në këtë dhomë?";
"room_details_access_section_invited_only" = "Vetëm persona që janë ftuar";
"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_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ë ska 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";
"room_details_addresses_disable_main_address_prompt_title" = "Sinjalizim adrese kryesore";
"room_details_flair_invalid_id_prompt_title" = "Format i pavlefshëm";
"room_details_flair_invalid_id_prompt_msg" = "%@ s’është identifikues i vlefshëm për një bashkësi";
"room_details_banned_users_section" = "Përdorues të dëbuar";
"room_details_advanced_section" = "Të mëtejshme";
"room_details_advanced_room_id" = "ID Dhome:";
"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" = "Su arrit të shtoheshin adresa dhome të re";
"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";
"room_details_copy_room_id" = "Kopjo ID Dhome";
"room_details_copy_room_address" = "Kopjo Adresë Dhome";
"room_details_copy_room_url" = "Kopjo URL Dhome";
// Group Details
"group_details_title" = "Hollësi Bashkësie";
"group_details_home" = "Kreu";
"group_details_people" = "Persona";
"group_details_rooms" = "Dhoma";
// Group Home
"group_home_one_member_format" = "1 anëtar";
"group_home_one_room_format" = "1 dhomë";
"group_invitation_format" = "%s ju ftoi të bëheni pjesë e kësaj bashkësie";
// Group participants
"group_participants_add_participant" = "Shtoni pjesmarrës";
"group_participants_leave_prompt_title" = "Braktiseni grupin";
"group_participants_leave_prompt_msg" = "Jeni i sigurt se doni ta braktisni grupin?";
"group_participants_remove_prompt_title" = "Ripohim";
"group_participants_remove_prompt_msg" = "Jeni i sigurt se doni të hiqet %@ nga ky grup?";
"group_participants_invite_prompt_title" = "Ripohim";
"group_participants_invite_prompt_msg" = "Jeni i sigurt se doni të ftohet %@ te ky grup?";
"group_participants_filter_members" = "Filtroni anëtarë bashkësie";
"group_participants_invite_malformed_id_title" = "Gabim Ftese";
"group_participants_invited_section" = "TË FTUAR";
// Group rooms
"group_rooms_filter_rooms" = "Filtroni dhoma bashkësie";
// Read Receipts
"read_receipts_list" = "Listë Dëftesash Leximi";
"receipt_status_read" = "Të lexuara: ";
// Media picker
"media_picker_library" = "Mediatekë";
"media_picker_select" = "Përzgjidhni";
// Directory
"directory_title" = "Drejtori";
"directory_server_picker_title" = "Përzgjidhni drejtori";
"directory_server_all_rooms" = "Krejt dhomat te shërbyesi %@";
"directory_server_placeholder" = "matrix.org";
// Events formatter
"event_formatter_member_updates" = "%tu ndryshime anëtarësie";
"event_formatter_jitsi_widget_added" = "Konferencë VoIP e shtuar nga %@";
"event_formatter_jitsi_widget_removed" = "Konferencë VoIP e hequr nga %@";
"you" = "Ju";
"today" = "Sot";
"yesterday" = "Dje";
"network_offline_prompt" = "Lidhja Internet duket se është jashtë linje.";
"public_room_section_title" = "Dhoma Publike (at %@):";
"do_not_ask_again" = "Mos pyet sërish";
// room display name
"room_displayname_invite_from" = "Ftesë nga %@";
"room_displayname_room_invite" = "Ftesë Dhome";
"room_displayname_more_than_two_members" = "%@ dhe %u të tjerë";
"room_displayname_no_title" = "Dhomë e zbrazët";
// Call
"call_incoming_voice_prompt" = "Thirrje audio ardhëse nga %@";
"call_incoming_video_prompt" = "Thirrje video ardhëse nga %@";
"call_incoming_voice" = "Thirrje ardhëse…";
"call_incoming_video" = "Thirrje video ardhëse…";
"call_already_displayed" = "Ka tashmë një thirrje në kryerje e sipër.";
// No VoIP support
"no_voip_title" = "Thirrje ardhëse";
// Bug report
"bug_report_title" = "Njoftim të Metash";
"bug_crash_report_title" = "Njoftim Vithisjeje";
"bug_report_send_logs" = "Dërgo regjistra";
"bug_report_send_screenshot" = "Dërgo foto ekrani";
"bug_report_progress_zipping" = "Po grumbullohen regjistra";
"bug_report_progress_uploading" = "Po ngarkohet raporti";
"bug_report_send" = "Dërgoje";
"widget_integration_unable_to_create" = "Sarrihet të krijohet widget-i.";
"widget_integration_failed_to_send_request" = "Su arrit të dërgohej kërkesë.";
"widget_integration_room_not_recognised" = "Kjo dhomë s’është e pranuar.";
"widget_integration_positive_power_level" = "Shkalla e pushtetit duhet të jetë një numër i plotë pozitiv.";
"widget_integration_must_be_in_room" = "Sgjendeni në këtë dhomë.";
"widget_integration_no_permission_in_room" = "Skeni leje për ta bërë këtë në këtë dhomë.";
"widget_integration_missing_room_id" = "Mungon room_id te kërkesa.";
"widget_integration_missing_user_id" = "Mungon user_id te kërkesa.";
// Room key request dialog
"e2e_room_key_request_title" = "Kërkesë kyçi fshehtëzimesh";
"e2e_room_key_request_start_verification" = "Fillo verifikimin…";
"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";
"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.";
+45
View File
@@ -444,3 +444,48 @@
"settings_ui_theme_picker_title" = "选择一个主题";
"settings_ui_theme_picker_message" = "“自动”表示使用设备的“反色”设置";
"settings_labs_create_conference_with_jitsi" = "使用 jitsi 创建一个会议通话";
"title_groups" = "社区";
// Groups tab
"group_invite_section" = "邀请";
"group_section" = "社区";
"room_do_not_have_permission_to_post" = "你无权在此聊天室发送消息";
"settings_enable_rageshake" = "摇一摇报告 bug";
"room_details_direct_chat" = "私聊";
// 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 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_invited_section" = "已邀请";
// Group rooms
"group_rooms_filter_rooms" = "过滤社区聊天室";
"event_formatter_widget_added" = "小部件 %@ 已被 %@ 添加";
"event_formatter_widget_removed" = "小部件 %@ 已被 %@ 移除";
"do_not_ask_again" = "不再询问";
"call_already_displayed" = "正在通话。";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "你需要有邀请用户的权限才能进行此操作。";
"widget_integration_unable_to_create" = "无法创建小部件。";
"widget_integration_failed_to_send_request" = "发送请求失败。";
"widget_integration_room_not_recognised" = "无法识别此房间。";
"widget_integration_positive_power_level" = "权限级别必须是整数。";
"widget_integration_must_be_in_room" = "您不在此聊天室中。";
"e2e_room_key_request_start_verification" = "开始验证…";
"e2e_room_key_request_share_without_verifying" = "在不验证的情况下分享";
"e2e_room_key_request_ignore_request" = "忽略请求";
+4 -4
View File
@@ -1,5 +1,5 @@
// Permissions usage explanations
"NSCameraUsageDescription" = "攝影機被用於照片與影片,進行視訊通話。";
"NSPhotoLibraryUsageDescription" = "照片庫被用於傳送照片與影片。";
"NSMicrophoneUsageDescription" = "麥克風被用於拍攝影片進行通話。";
"NSContactsUsageDescription" = "通訊錄被用於在 Riot 上透過電子郵件或電話號碼搜尋使用者。";
"NSCameraUsageDescription" = "相機權限會用來拍攝照片與影片,以及進行視訊通話。";
"NSPhotoLibraryUsageDescription" = "照片圖庫的權限會用來傳送照片與影片。";
"NSMicrophoneUsageDescription" = "麥克風的權限會用來拍攝影片進行通話。";
"NSContactsUsageDescription" = "聯絡資訊的權限會用來在 Riot 上透過電子郵件或電話號碼搜尋使用者。";
+260 -1
View File
@@ -1 +1,260 @@
// 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" = "簡訊驗證碼已經傳送,請在下方輸入驗證碼。";
"auth_msisdn_validation_error" = "無法驗證電話號碼。";
"bug_report_progress_zipping" = "收集記錄";
"bug_report_progress_uploading" = "上傳報告";
"search_default_placeholder" = "搜尋";
"today" = "今天";
"yesterday" = "昨天";
"room_ongoing_conference_call_close" = "關閉";
"bug_report_send_logs" = "傳送記錄";
"bug_report_send" = "傳送";
"room_event_action_resend" = "重新傳送";
"room_event_action_view_source" = "檢視來源";
"room_event_action_permalink" = "永久連結";
"room_event_action_quote" = "引用";
"room_participants_online" = "線上";
"room_details_favourite_tag" = "我的最愛";
"room_details_direct_chat" = "私人聊天";
"room_details_people" = "成員";
// Directory
"directory_title" = "目錄";
"auth_recaptcha_message" = "這個家伺服器想要確定您不是機器人";
"auth_reset_password_missing_email" = "必須輸入和你帳號關聯的電子郵件地址。";
"auth_reset_password_missing_password" = "一個新的密碼必須被輸入。";
"auth_reset_password_next_step_button" = "我已經驗證了我的電子郵件地址";
"auth_reset_password_error_unauthorized" = "電子郵件地址驗證失敗: 請確保你已點擊郵件中的連結";
"auth_reset_password_error_not_found" = "您的電子郵件地址似乎未在此家伺服器上與 Matrix ID 關聯。";
"room_creation_account" = "帳號";
"room_creation_appearance_name" = "名稱";
"room_recents_start_chat_with" = "開始聊天";
"search_no_result" = "沒有結果";
"room_participants_leave_prompt_title" = "離開聊天室";
"room_participants_filter_room_members" = "過濾聊天室成員";
"room_participants_offline" = "離線";
"room_participants_unknown" = "未知";
"room_participants_idle" = "閒置";
"room_participants_action_section_direct_chats" = "私聊";
"room_participants_action_section_devices" = "裝置列表";
"room_participants_action_unban" = "解除封鎖";
"room_participants_action_start_new_chat" = "開始新聊天";
"room_participants_action_mention" = "提及";
"room_message_placeholder" = "傳送訊息(未加密)……";
"room_do_not_have_permission_to_post" = "您沒有權限在此房間發言";
"encrypted_room_message_placeholder" = "傳送加密的訊息……";
"room_offline_notification" = "至伺服器的連線已遺失。";
"room_event_action_delete" = "刪除";
// Unknown devices
"unknown_devices_alert_title" = "包含了未知裝置的房間";
"unknown_devices_call_anyway" = "無論如何都通話";
"unknown_devices_answer_anyway" = "無論如何都回覆";
"unknown_devices_title" = "未知的裝置";
"settings_sign_out_confirmation" = "你確定嗎?";
"settings_email_address" = "電子郵件";
"settings_add_email_address" = "添加郵件地址";
"settings_phone_number" = "電話";
"settings_add_phone_number" = "添加電話號碼";
"room_details_topic" = "主題";
"room_details_low_priority_tag" = "低優先度";
"room_details_access_section" = "誰可以存取此房間?";
"room_details_access_section_invited_only" = "僅有被邀請的夥伴";
"room_details_access_section_anyone_apart_from_guest" = "任何知道房間連結的人,但訪客除外";
"room_details_access_section_anyone" = "任何知道房間連結的人,包括訪客";
"room_details_history_section" = "誰可以讀取歷史紀錄?";
"room_details_history_section_anyone" = "任何人";
"room_details_history_section_members_only" = "僅成員(自選取此選項開始)";
"room_details_history_section_members_only_since_invited" = "僅成員(自他們被邀請開始)";
"room_details_history_section_members_only_since_joined" = "僅成員(自他們加入開始)";
"room_details_history_section_prompt_title" = "隱私警告";
"room_details_addresses_section" = "地址";
"room_details_no_local_addresses" = "此房間沒有本機地址";
"room_details_addresses_invalid_address_prompt_title" = "別名格式錯誤";
"room_details_banned_users_section" = "被封禁的用戶";
"room_details_advanced_section" = "高級";
"room_details_advanced_e2e_encryption_enabled" = "此房間的加密已啟用";
"group_participants_filter_members" = "過濾社群成員";
// Group rooms
"group_rooms_filter_rooms" = "過濾社群聊天室";
// Widget Integration Manager
"widget_integration_need_to_be_able_to_invite" = "您需要邀請使用者來做這件事。";
"widget_integration_unable_to_create" = "無法建立小工具。";
"widget_integration_failed_to_send_request" = "發送請求失敗。";
"widget_integration_room_not_recognised" = "此房間不被認可。";
"widget_integration_positive_power_level" = "權限等級必需為正整數。";
"widget_integration_must_be_in_room" = "您不在這個聊天室內。";
"widget_integration_no_permission_in_room" = "您沒有在這個聊天室做這件事的權限。";
// Room key request dialog
"e2e_room_key_request_title" = "加密金鑰請求";
"e2e_room_key_request_share_without_verifying" = "不驗證就分享";
"e2e_room_key_request_ignore_request" = "忽略請求";
"auth_reset_password_message" = "要重設您的密碼,輸入連結到您的帳號的電子郵件地址:";
"auth_reset_password_email_validation_message" = "電子郵件已傳送至 %@。您必須跟隨其中包含了連結,點按下面的連結。";
"auth_reset_password_success_message" = "您的密碼已重設。\n\n您已在所有裝置上登出,並且不會再收到推送通知。要重新啟用通知,再次於每個裝置上登入。";
"auth_add_email_and_phone_warning" = "直到 API 存在之前,尚不支援同時使用電子郵件地址和電話號碼註冊,因此只有電話號碼會被採用,但您可以在基本資料中新增電子郵件地址。";
// Chat creation
"room_creation_title" = "新的聊天";
"room_creation_appearance" = "外觀";
"room_creation_appearance_picture" = "聊天室圖片(選擇性)";
"room_creation_privacy" = "隱私";
"room_creation_private_room" = "此聊天室為私人聊天室";
"room_creation_public_room" = "此聊天室為公開聊天室";
"room_creation_make_public" = "設成公開";
"room_creation_make_public_prompt_title" = "將此聊天室此設成公開?";
"room_creation_make_public_prompt_msg" = "您確定要將聊天室設定成公開聊天室嗎?如此一來所有人都可以閱讀並加入聊天室。";
"room_creation_keep_private" = "維持私人";
"room_creation_make_private" = "設成公開";
"room_creation_wait_for_creation" = "聊天室正在建立,請稍後。";
"room_creation_invite_another_user" = "透過使用者ID、名稱、電子郵件地址來搜尋/邀請";
// Room recents
"room_recents_directory_section" = "聊天室目錄";
"room_recents_directory_section_network" = "網路";
"room_recents_favourites_section" = "收藏夾";
"room_recents_people_section" = "聯絡人";
"room_recents_conversations_section" = "聊天室";
"room_recents_no_conversation" = "沒有聊天室";
"room_recents_low_priority_section" = "低優先度";
"room_recents_invites_section" = "邀請";
"room_recents_create_empty_room" = "建立新聊天室";
"room_recents_join_room" = "加入聊天室";
"room_recents_join_room_title" = "加入聊天室";
"room_recents_join_room_prompt" = "輸入聊天室 ID 或別名";
// People tab
"people_invites_section" = "邀請";
"people_conversation_section" = "聊天";
"people_no_conversation" = "沒有聊天";
// Rooms tab
"room_directory_no_public_room" = "沒有公開的聊天室";
// Groups tab
"group_invite_section" = "邀請";
"group_section" = "社群";
// Search
"search_rooms" = "聊天室";
"search_messages" = "訊息";
"search_people" = "聯絡人";
"search_files" = "檔案";
"search_people_placeholder" = "透過使用者 ID、名稱、電子郵件地址搜尋";
"search_in_progress" = "搜尋中……";
// Directory
"directory_cell_title" = "瀏覽目錄";
"directory_cell_description" = "tu 個聊天室";
"directory_search_results_title" = "聊天室目錄搜尋結果";
"directory_search_results" = "搜尋 %@ 有 tu 個結果";
"directory_search_results_more_than" = "搜尋 %@ 有超過 %tu 個結果";
"directory_searching_title" = "搜尋聊天室目錄中……";
"directory_search_fail" = "無法取得資料";
// Contacts
"contacts_address_book_section" = "裝置上的聯絡人";
"contacts_address_book_matrix_users_toggle" = "只顯示 Matrix 使用者";
"contacts_address_book_no_contact" = "沒有裝置上的聯絡人";
"contacts_address_book_permission_required" = "取得裝置上的聯絡資訊需要權限";
"contacts_address_book_permission_denied" = "您沒有允許 Riot 存取裝置上的聯絡資訊";
"contacts_user_directory_section" = "使用者目錄";
"contacts_user_directory_offline_section" = "使用者目錄(離線)";
// Chat participants
"room_participants_title" = "成員";
"room_participants_add_participant" = "新增成員";
"room_participants_one_participant" = "1 個成員";
"room_participants_multi_participants" = "%d 個成員";
"room_participants_leave_prompt_msg" = "確定要離開聊天室嗎?";
"room_participants_remove_prompt_title" = "確認";
"room_participants_remove_prompt_msg" = "確定要從此聊天室踢出 %@ 嗎?";
"room_participants_remove_third_party_invite_msg" = "直到 API 存在以前,尚不支援移除第三方邀請";
"room_participants_invite_prompt_title" = "確認";
"room_participants_invite_prompt_msg" = "確定要邀請 %@ 進入聊天室嗎?";
"room_participants_invite_another_user" = "透過使用者ID、名稱或電子郵件地址來搜尋/邀請";
"room_participants_invite_malformed_id_title" = "邀請錯誤";
"room_participants_invite_malformed_id" = "ID 格式不正確。應為電子郵件地址或 Matrix ID(如 @localpart:domain";
"room_participants_invited_section" = "已邀請";
"room_participants_now" = "現在";
"room_participants_ago" = "之前";
"room_participants_action_section_admin_tools" = "管理者工具";
"room_participants_action_section_other" = "其他";
"room_participants_action_invite" = "邀請";
"room_participants_action_leave" = "離開這個房間";
"room_participants_action_remove" = "從此房間踢出";
"room_participants_action_ban" = "從此房間封鎖";
"room_participants_action_ignore" = "隱藏所有來自此使用者的訊息";
"room_participants_action_unignore" = "顯示所有來自此使用者的訊息";
"room_participants_action_set_default_power_level" = "恢復到一般使用者";
"room_participants_action_set_moderator" = "設定成仲裁者";
"room_participants_action_set_admin" = "設定成管理者";
"room_participants_action_start_voice_call" = "開始語音通話";
"room_participants_action_start_video_call" = "開始視訊通話";
"room_event_action_view_encryption" = "加密資訊";
+5 -1
View File
@@ -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.
@@ -57,9 +58,12 @@
} failure:^(NSError *error) {
NSLog(@"[MXRoom+Riot] Failed to update the tag %@ of room (%@)", tag, self.state.roomId);
NSString *userId = self.mxSession.myUser.userId;
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification
object:error
userInfo:userId ? @{kMXKErrorUserIdKey: userId} : nil];
if (completion)
{
+2 -2
View File
@@ -17,11 +17,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.6.13</string>
<string>0.6.14</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>0.6.13</string>
<string>0.6.14</string>
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
+3
View File
@@ -391,6 +391,9 @@
}
}
}
// Auto animate the sticker in case of animated gif
bubbleCell.isAutoAnimatedGif = (cellData.attachment && cellData.attachment.type == MXKAttachmentTypeSticker);
}
return cell;
@@ -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.
@@ -46,8 +47,8 @@
MXKRoomDataSource *roomDataSource;
if (roomId)
{
roomDataSource = [roomDataSourceManager roomDataSourceForRoom:roomId create:NO];
// Check whether the user knows this room to create the room data source if it doesn't exist.
roomDataSource = [roomDataSourceManager roomDataSourceForRoom:roomId create:([self.mxSession roomWithRoomId:roomId])];
if (roomDataSource)
{
// Prepare text font used to highlight the search pattern.
+3 -2
View File
@@ -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.
@@ -39,7 +40,7 @@
// Check attachment if any
if ([searchDataSource.eventFormatter isSupportedAttachment:event])
{
// Note: event.eventType is equal here to MXEventTypeRoomMessage
// Note: event.eventType may be equal here to MXEventTypeRoomMessage or MXEventTypeSticker
attachment = [[MXKAttachment alloc] initWithEvent:event andMatrixSession:searchDataSource.mxSession];
}
@@ -101,7 +102,7 @@
- (BOOL)isAttachmentWithThumbnail
{
return (attachment && (attachment.type == MXKAttachmentTypeImage || attachment.type == MXKAttachmentTypeVideo));
return (attachment && (attachment.type == MXKAttachmentTypeImage || attachment.type == MXKAttachmentTypeVideo || attachment.type == MXKAttachmentTypeSticker));
}
- (UIImage*)attachmentIcon
+9 -3
View File
@@ -372,13 +372,19 @@
}
else
{
NSLog(@"[MasterTabBarController] Universal link: Logout current sessions and open AuthViewController to complete the registration");
NSLog(@"[MasterTabBarController] Universal link: Prompt to logout current sessions and open AuthViewController to complete the registration");
// Keep a ref on the params
authViewControllerRegistrationParameters = parameters;
// And do a logout out. It will then display AuthViewController
[[AppDelegate theDelegate] logout];
// Prompt to logout. It will then display AuthViewController if the user is logged out.
[[AppDelegate theDelegate] logoutWithConfirmation:YES completion:^(BOOL isLoggedOut) {
if (!isLoggedOut)
{
// Reset temporary params
authViewControllerRegistrationParameters = nil;
}
}];
}
}
+113 -53
View File
@@ -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.
@@ -950,45 +951,92 @@
{
if (editedRoomId)
{
// Check whether the user didn't leave the room yet
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
if (room)
{
[self startActivityIndicator];
// cancel pending uploads/downloads
// they are useless by now
[MXMediaManager cancelDownloadsInCacheFolder:room.state.roomId];
// TODO GFO cancel pending uploads related to this room
NSLog(@"[RecentsViewController] Leave room (%@)", room.state.roomId);
[room leave:^{
[self stopActivityIndicator];
// Force table refresh
[self cancelEditionMode:YES];
} failure:^(NSError *error) {
NSLog(@"[RecentsViewController] Failed to leave room (%@)", room.state.roomId);
// Notify MatrixKit user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
[self stopActivityIndicator];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}];
}
else
{
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}
NSString *currentRoomId = editedRoomId;
__weak typeof(self) weakSelf = self;
// confirm leave
NSString *promptMessage = NSLocalizedStringFromTable(@"room_participants_leave_prompt_msg", @"Vector", nil);
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"room_participants_leave_prompt_title", @"Vector", nil)
message:promptMessage
preferredStyle:UIAlertControllerStyleAlert];
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
}
}]];
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"leave", @"Vector", nil)
style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
// Check whether the user didn't leave the room yet
// TODO: Handle multi-account
MXRoom *room = [self.mainSession roomWithRoomId:currentRoomId];
if (room)
{
[self startActivityIndicator];
// cancel pending uploads/downloads
// they are useless by now
[MXMediaManager cancelDownloadsInCacheFolder:room.state.roomId];
// TODO GFO cancel pending uploads related to this room
NSLog(@"[RecentsViewController] Leave room (%@)", room.state.roomId);
[room leave:^{
if (weakSelf)
{
typeof(self) self = weakSelf;
[self stopActivityIndicator];
// Force table refresh
[self cancelEditionMode:YES];
}
} failure:^(NSError *error) {
NSLog(@"[RecentsViewController] Failed to leave room");
if (weakSelf)
{
typeof(self) self = weakSelf;
// Notify the end user
NSString *userId = room.mxSession.myUser.userId;
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification
object:error
userInfo:userId ? @{kMXKErrorUserIdKey: userId} : nil];
[self stopActivityIndicator];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}
}];
}
else
{
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}
}
}]];
[currentAlert mxk_setAccessibilityIdentifier:@"LeaveEditedRoomAlert"];
[self presentViewController:currentAlert animated:YES completion:nil];
}
}
@@ -1023,7 +1071,10 @@
{
if (editedRoomId)
{
__weak typeof(self) weakSelf = self;
// Check whether the user didn't leave the room
// TODO: handle multi-account
MXRoom *room = [self.mainSession roomWithRoomId:editedRoomId];
if (room)
{
@@ -1031,23 +1082,32 @@
[room setIsDirect:isDirect withUserId:nil success:^{
[self stopActivityIndicator];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
if (weakSelf)
{
typeof(self) self = weakSelf;
[self stopActivityIndicator];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}
} failure:^(NSError *error) {
[self stopActivityIndicator];
NSLog(@"[RecentsViewController] Failed to update direct tag of the room (%@)", editedRoomId);
// Notify MatrixKit user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
if (weakSelf)
{
typeof(self) self = weakSelf;
[self stopActivityIndicator];
NSLog(@"[RecentsViewController] Failed to update direct tag of the room (%@)", editedRoomId);
// Notify the end user
NSString *userId = self.mainSession.myUser.userId; // TODO: handle multi-account
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification
object:error
userInfo:userId ? @{kMXKErrorUserIdKey: userId} : nil];
// Leave editing mode
[self cancelEditionMode:isRefreshPending];
}
}];
}
@@ -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.
@@ -415,9 +416,7 @@
{
// Restore the status bar
typeof(self) self = weakSelf;
self->devicesArray = usersDevicesInfoMap.map[userId].allValues;
// Reload the full table to take into account a potential change on a device status.
[super updateMemberInfo];
}
@@ -425,9 +424,15 @@
} failure:^(NSError *error) {
NSLog(@"[RoomMemberDetailsVC] Crypto failed to download device info for user: %@", userId);
// Notify MatrixKit user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
if (weakSelf)
{
// Restore the status bar
typeof(self) self = weakSelf;
// Notify the end user
NSString *myUserId = self.mainSession.myUser.userId;
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}
}];
}
@@ -938,6 +943,130 @@
[self setPowerLevel:kRiotRoomAdminLevel promptUser:YES];
break;
}
case MXKRoomMemberDetailsActionBan:
{
__weak typeof(self) weakSelf = self;
// Ban
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"room_event_action_ban_prompt_reason", @"Vector", nil)
message:nil
preferredStyle:UIAlertControllerStyleAlert];
[currentAlert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.secureTextEntry = NO;
textField.placeholder = nil;
textField.keyboardType = UIKeyboardTypeDefault;
}];
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
}
}]];
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"ban", @"Vector", nil)
style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
[self startActivityIndicator];
// kick user
UITextField *textField = [self->currentAlert textFields].firstObject;
[self.mxRoom banUser:self.mxRoomMember.userId reason:textField.text success:^{
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
} failure:^(NSError *error) {
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
NSLog(@"[RoomMemberDetailVC] Ban user (%@) failed", self.mxRoomMember.userId);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
}
}]];
[currentAlert mxk_setAccessibilityIdentifier:@"RoomMemberDetailsVCBanAlert"];
[self presentViewController:currentAlert animated:YES completion:nil];
break;
}
case MXKRoomMemberDetailsActionKick:
{
__weak typeof(self) weakSelf = self;
// Kick
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"room_event_action_kick_prompt_reason", @"Vector", nil)
message:nil
preferredStyle:UIAlertControllerStyleAlert];
[currentAlert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.secureTextEntry = NO;
textField.placeholder = nil;
textField.keyboardType = UIKeyboardTypeDefault;
}];
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
}
}]];
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"remove", @"Vector", nil)
style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
[self startActivityIndicator];
// kick user
UITextField *textField = [self->currentAlert textFields].firstObject;
[self.mxRoom kickUser:self.mxRoomMember.userId reason:textField.text success:^{
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
} failure:^(NSError *error) {
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
NSLog(@"[RoomMemberDetailVC] Removing user (%@) failed", self.mxRoomMember.userId);
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
}
}]];
[currentAlert mxk_setAccessibilityIdentifier:@"RoomMemberDetailsVCKickAlert"];
[self presentViewController:currentAlert animated:YES completion:nil];
break;
}
default:
{
[super onActionButtonPressed:sender];
+82 -38
View File
@@ -1,6 +1,7 @@
/*
Copyright 2014 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.
@@ -97,6 +98,8 @@
#import "RoomMembershipExpandedBubbleCell.h"
#import "RoomMembershipExpandedWithPaginationTitleBubbleCell.h"
#import "RoomSelectedStickerBubbleCell.h"
#import "MXKRoomBubbleTableViewCell+Riot.h"
#import "AvatarGenerator.h"
@@ -310,6 +313,8 @@
[self.bubblesTableView registerClass:RoomMembershipExpandedBubbleCell.class forCellReuseIdentifier:RoomMembershipExpandedBubbleCell.defaultReuseIdentifier];
[self.bubblesTableView registerClass:RoomMembershipExpandedWithPaginationTitleBubbleCell.class forCellReuseIdentifier:RoomMembershipExpandedWithPaginationTitleBubbleCell.defaultReuseIdentifier];
[self.bubblesTableView registerClass:RoomSelectedStickerBubbleCell.class forCellReuseIdentifier:RoomSelectedStickerBubbleCell.defaultReuseIdentifier];
// Prepare expanded header
expandedHeader = [ExpandedRoomTitleView roomTitleView];
expandedHeader.delegate = self;
@@ -1760,7 +1765,12 @@
{
if (bubbleData.isAttachmentWithThumbnail)
{
if (bubbleData.isPaginationFirstBubble)
// Check whether the provided celldata corresponds to a selected sticker
if (customizedRoomDataSource.selectedEventId && (bubbleData.attachment.type == MXKAttachmentTypeSticker) && [bubbleData.attachment.eventId isEqualToString:customizedRoomDataSource.selectedEventId])
{
cellViewClass = RoomSelectedStickerBubbleCell.class;
}
else if (bubbleData.isPaginationFirstBubble)
{
cellViewClass = isEncryptedRoom ? RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.class : RoomIncomingAttachmentWithPaginationTitleBubbleCell.class;
}
@@ -1805,7 +1815,12 @@
// Handle here outgoing bubbles
if (bubbleData.isAttachmentWithThumbnail)
{
if (bubbleData.isPaginationFirstBubble)
// Check whether the provided celldata corresponds to a selected sticker
if (customizedRoomDataSource.selectedEventId && (bubbleData.attachment.type == MXKAttachmentTypeSticker) && [bubbleData.attachment.eventId isEqualToString:customizedRoomDataSource.selectedEventId])
{
cellViewClass = RoomSelectedStickerBubbleCell.class;
}
else if (bubbleData.isPaginationFirstBubble)
{
cellViewClass = isEncryptedRoom ? RoomOutgoingEncryptedAttachmentWithPaginationTitleBubbleCell.class :RoomOutgoingAttachmentWithPaginationTitleBubbleCell.class;
}
@@ -1909,12 +1924,38 @@
[self showEditButtonAlertMenuForEvent:selectedEvent inCell:cell level:0];
}
}
else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAttachmentView]
&& ((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.eventSentState == MXEventSentStateFailed)
else if ([actionIdentifier isEqualToString:kMXKRoomBubbleCellTapOnAttachmentView])
{
// Shortcut: when clicking on an unsent media, show the action sheet to resend it
MXEvent *selectedEvent = [self.roomDataSource eventWithEventId:((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.eventId];
[self dataSource:dataSource didRecognizeAction:kMXKRoomBubbleCellRiotEditButtonPressed inCell:cell userInfo:@{kMXKRoomBubbleCellEventKey:selectedEvent}];
if (((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.eventSentState == MXEventSentStateFailed)
{
// Shortcut: when clicking on an unsent media, show the action sheet to resend it
MXEvent *selectedEvent = [self.roomDataSource eventWithEventId:((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.eventId];
[self dataSource:dataSource didRecognizeAction:kMXKRoomBubbleCellRiotEditButtonPressed inCell:cell userInfo:@{kMXKRoomBubbleCellEventKey:selectedEvent}];
}
else if (((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.type == MXKAttachmentTypeSticker)
{
// We don't open the attachments viewer when the user taps on a sticker.
// We consider this tap like a selection.
// Check whether a selection already exist or not
if (customizedRoomDataSource.selectedEventId)
{
[self cancelEventSelection];
}
else
{
// Highlight this event in displayed message
customizedRoomDataSource.selectedEventId = ((MXKRoomBubbleTableViewCell*)cell).bubbleData.attachment.eventId;
}
// Force table refresh
[self dataSource:self.roomDataSource didCellChange:nil];
}
else
{
// Keep default implementation
[super dataSource:dataSource didRecognizeAction:actionIdentifier inCell:cell userInfo:userInfo];
}
}
else if ([actionIdentifier isEqualToString:kRoomEncryptedDataBubbleCellTapOnEncryptionIcon])
{
@@ -2156,38 +2197,41 @@
}]];
}
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_copy", @"Vector", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
if (attachment.type != MXKAttachmentTypeSticker)
{
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_copy", @"Vector", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
[self cancelEventSelection];
if (weakSelf)
{
typeof(self) self = weakSelf;
[self cancelEventSelection];
[self startActivityIndicator];
[attachment copy:^{
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
} failure:^(NSError *error) {
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
// Start animation in case of download during attachment preparing
[roomBubbleTableViewCell startProgressUI];
}
[self startActivityIndicator];
[attachment copy:^{
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
} failure:^(NSError *error) {
__strong __typeof(weakSelf)self = weakSelf;
[self stopActivityIndicator];
//Alert user
[[AppDelegate theDelegate] showErrorAsAlert:error];
}];
// Start animation in case of download during attachment preparing
[roomBubbleTableViewCell startProgressUI];
}
}]];
}]];
}
// Check status of the selected event
if (selectedEvent.sentState == MXEventSentStatePreparing ||
@@ -2234,7 +2278,7 @@
}
}
if (level == 1)
if (level == 1 && (attachment.type != MXKAttachmentTypeSticker))
{
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"room_event_action_share", @"Vector", nil)
style:UIAlertActionStyleDefault
+30 -65
View File
@@ -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.
@@ -707,7 +708,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
[self stopActivityIndicator];
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = self.mainSession.myUser.userId; // TODO: Hanlde multi-account
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}
}
}
@@ -817,8 +819,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
{
[self stopActivityIndicator];
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = self.mainSession.myUser.userId; // TODO: Hanlde multi-account
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}
}
@@ -2446,8 +2448,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
NSLog(@"[SettingsViewController] Unignore %@ failed", ignoredUserId);
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = session.myUser.userId;
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}];
}
@@ -2570,63 +2572,24 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
- (void)onSignout:(id)sender
{
[currentAlert dismissViewControllerAnimated:NO completion:nil];
__weak typeof(self) weakSelf = self;
NSString *message = NSLocalizedStringFromTable(@"settings_sign_out_confirmation", @"Vector", nil);
// If the user has encrypted rooms, warn he will lose his e2e keys
MXSession* session = [[AppDelegate theDelegate].mxSessions objectAtIndex:0];
for (MXRoom *room in session.rooms)
{
if (room.state.isEncrypted)
// Feedback: disable button and run activity indicator
UIButton *button = (UIButton*)sender;
button.enabled = NO;
[self startActivityIndicator];
__weak typeof(self) weakSelf = self;
[[AppDelegate theDelegate] logoutWithConfirmation:YES completion:^(BOOL isLoggedOut) {
if (!isLoggedOut && weakSelf)
{
message = [message stringByAppendingString:[NSString stringWithFormat:@"\n\n%@", NSLocalizedStringFromTable(@"settings_sign_out_e2e_warn", @"Vector", nil)]];
break;
typeof(self) self = weakSelf;
// Enable the button and stop activity indicator
button.enabled = YES;
[self stopActivityIndicator];
}
}
// Ask confirmation
currentAlert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil) message:message preferredStyle:UIAlertControllerStyleAlert];
[currentAlert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTable(@"settings_sign_out", @"Vector", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
// Feedback: disable button and run activity indicator
UIButton *button = (UIButton*)sender;
button.enabled = NO;
[self startActivityIndicator];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[[MXKAccountManager sharedManager] logout];
});
}
}]];
[currentAlert addAction:[UIAlertAction actionWithTitle:[NSBundle mxk_localizedStringForKey:@"cancel"]
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action) {
if (weakSelf)
{
typeof(self) self = weakSelf;
self->currentAlert = nil;
}
}]];
[currentAlert mxk_setAccessibilityIdentifier: @"SettingsVCSignoutAlert"];
[self presentViewController:currentAlert animated:YES completion:nil];
}];
}
- (void)onRemove3PID:(NSIndexPath*)path
@@ -2724,8 +2687,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
[self stopActivityIndicator];
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = self.mainSession.myUser.userId; // TODO: Hanlde multi-account
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}
}];
}
@@ -2930,7 +2893,7 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[[MXKAccountManager sharedManager] logout];
[[AppDelegate theDelegate] logoutWithConfirmation:NO completion:nil];
});
}
@@ -3413,7 +3376,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
}
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = session.myUser.userId; // TODO: Hanlde multi-account
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}];
}
@@ -3515,7 +3479,8 @@ typedef void (^blockSettingsViewController_onReadyToDestroy)();
}
// Notify user
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
NSString *myUserId = session.myUser.userId;
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error userInfo:myUserId ? @{kMXKErrorUserIdKey: myUserId} : nil];
}];
}
@@ -21,12 +21,6 @@
@implementation RoomOutgoingAttachmentBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.readReceiptsAlignment = ReadReceiptAlignmentRight;
}
- (void)customizeTableViewCellRendering
{
[super customizeTableViewCellRendering];
@@ -21,12 +21,6 @@
@implementation RoomOutgoingAttachmentWithPaginationTitleBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.readReceiptsAlignment = ReadReceiptAlignmentRight;
}
- (void)customizeTableViewCellRendering
{
[super customizeTableViewCellRendering];
@@ -21,13 +21,6 @@
@implementation RoomOutgoingAttachmentWithoutSenderInfoBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.readReceiptsAlignment = ReadReceiptAlignmentRight;
}
- (void)customizeTableViewCellRendering
{
[super customizeTableViewCellRendering];
@@ -21,12 +21,6 @@
@implementation RoomOutgoingTextMsgBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.readReceiptsAlignment = ReadReceiptAlignmentRight;
}
- (void)customizeTableViewCellRendering
{
[super customizeTableViewCellRendering];
@@ -21,13 +21,6 @@
@implementation RoomOutgoingTextMsgWithoutSenderInfoBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
self.readReceiptsAlignment = ReadReceiptAlignmentRight;
}
- (void)customizeTableViewCellRendering
{
[super customizeTableViewCellRendering];
@@ -0,0 +1,33 @@
/*
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 "RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.h"
/**
`RoomSelectedStickerBubbleCell` is used to display the current selected sticker if any
*/
@interface RoomSelectedStickerBubbleCell : RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell
@property (weak, nonatomic) IBOutlet UIView *descriptionContainerView;
@property (weak, nonatomic) IBOutlet UIView *arrowView;
@property (weak, nonatomic) IBOutlet UIView *descriptionView;
@property (weak, nonatomic) IBOutlet UILabel *descriptionLabel;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *userNameLabelTopConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *attachViewLeadingConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *descriptionContainerViewBottomConstraint;
@end
@@ -0,0 +1,242 @@
/*
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 "RoomSelectedStickerBubbleCell.h"
#import "RoomEncryptedDataBubbleCell.h"
#import "RoomIncomingAttachmentBubbleCell.h"
#import "RoomIncomingAttachmentWithoutSenderInfoBubbleCell.h"
#import "RoomIncomingAttachmentWithPaginationTitleBubbleCell.h"
#import "RoomIncomingEncryptedAttachmentBubbleCell.h"
#import "RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.h"
#import "RiotDesignValues.h"
@implementation RoomSelectedStickerBubbleCell
- (void)awakeFromNib
{
[super awakeFromNib];
// define arrow mask
CAShapeLayer *arrowMaskLayer = [[CAShapeLayer alloc] init];
arrowMaskLayer.frame = self.arrowView.bounds;
CGSize viewSize = self.arrowView.frame.size;
UIBezierPath *path = [[UIBezierPath alloc] init];
[path moveToPoint:CGPointMake(0, viewSize.height)]; // arrow left bottom point
[path addLineToPoint:CGPointMake(viewSize.width / 2, 0)]; // arrow head
[path addLineToPoint:CGPointMake(viewSize.width, viewSize.height)]; // arrow right bottom point
[path closePath]; // arrow top side
arrowMaskLayer.path = path.CGPath;
self.arrowView.layer.mask = arrowMaskLayer;
self.arrowView.backgroundColor = kRiotSecondaryBgColor;
self.descriptionView.backgroundColor = kRiotSecondaryBgColor;
[self.descriptionView.layer setCornerRadius:10];
}
- (void)render:(MXKCellData *)cellData
{
[self prepareRender:cellData];
if (bubbleData)
{
// Retrieve the component which stores the sticker (Only one component is handled by the bubble in case of sticker).
MXKRoomBubbleComponent *component = bubbleData.bubbleComponents.firstObject;
// Handle the pagination and the sender information
// Look for the original cell class to extract the constraints value.
Class<MXKCellRendering> modelCellViewClass = nil;
if (bubbleData.shouldHideSenderInformation)
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.class : RoomIncomingAttachmentWithoutSenderInfoBubbleCell.class;
self.paginationTitleView.hidden = YES;
self.pictureView.hidden = YES;
self.userNameLabel.hidden = YES;
self.userNameTapGestureMaskView.userInteractionEnabled = NO;
}
else
{
if (bubbleData.isPaginationFirstBubble)
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.class : RoomIncomingAttachmentWithPaginationTitleBubbleCell.class;
self.paginationTitleView.hidden = NO;
self.paginationLabel.text = [[bubbleData.eventFormatter dateStringFromDate:bubbleData.date withTime:NO] uppercaseString];
}
else
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentBubbleCell.class : RoomIncomingAttachmentBubbleCell.class;
self.paginationTitleView.hidden = YES;
}
// Hanlde sender avatar
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];
// Display sender's name except if the name appears in the displayed text (see emote and membership events)
if (bubbleData.shouldHideSenderName == NO)
{
if (bubbleData.senderFlair)
{
[self renderSenderFlair];
}
else
{
self.userNameLabel.text = bubbleData.senderDisplayName;
}
self.userNameLabel.hidden = NO;
self.userNameTapGestureMaskView.userInteractionEnabled = YES;
}
else
{
self.userNameLabel.hidden = YES;
self.userNameTapGestureMaskView.userInteractionEnabled = NO;
}
}
// Retrieve the suitable content size for the attachment thumbnail
CGSize contentSize = bubbleData.contentSize;
// Update image view frame in order to center loading wheel (if any)
CGRect frame = self.attachmentView.frame;
frame.size.width = contentSize.width;
frame.size.height = contentSize.height;
self.attachmentView.frame = frame;
// Retrieve the MIME type
NSString *mimetype = nil;
if (bubbleData.attachment.thumbnailInfo)
{
mimetype = bubbleData.attachment.thumbnailInfo[@"mimetype"];
}
else if (bubbleData.attachment.contentInfo)
{
mimetype = bubbleData.attachment.contentInfo[@"mimetype"];
}
// 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
NSAttributedString *description = component.attributedTextMessage;
if (description.length)
{
self.descriptionContainerView.hidden = NO;
self.descriptionLabel.attributedText = description;
}
else
{
self.descriptionContainerView.hidden = YES;
}
// Adjust Attachment width constant
self.attachViewWidthConstraint.constant = contentSize.width;
// Handle the encryption view
if (bubbleData.isEncryptedRoom)
{
// Set the right device info icon
self.encryptionStatusView.hidden = NO;
self.encryptionStatusView.image = [RoomEncryptedDataBubbleCell encryptionIconForEvent:component.event andSession:bubbleData.mxSession];
}
else
{
self.encryptionStatusView.hidden = YES;
}
// Hide by default the info container
self.bubbleInfoContainer.hidden = YES;
// Adjust the layout according to the original cell, the one used to display the sticker unselected.
if ([modelCellViewClass nib])
{
MXKRoomBubbleTableViewCell* cell= (MXKRoomBubbleTableViewCell*)[[modelCellViewClass nib] instantiateWithOwner:nil options:nil].firstObject;
if (cell.userNameLabel)
{
frame = cell.userNameLabel.frame;
self.userNameLabelTopConstraint.constant = frame.origin.y;
}
frame = cell.attachmentView.frame;
self.attachViewLeadingConstraint.constant = frame.origin.x;
self.attachViewTopConstraint.constant = cell.attachViewTopConstraint.constant;
self.attachViewBottomConstraint.constant = cell.attachViewBottomConstraint.constant;
self.bubbleInfoContainerTopConstraint.constant = cell.bubbleInfoContainerTopConstraint.constant;
}
}
}
+ (CGFloat)heightForCellData:(MXKCellData*)cellData withMaximumWidth:(CGFloat)maxWidth
{
// Sanity check: accept only object of MXKRoomBubbleCellData classes or sub-classes
NSParameterAssert([cellData isKindOfClass:[MXKRoomBubbleCellData class]]);
MXKRoomBubbleCellData *bubbleData = (MXKRoomBubbleCellData*)cellData;
// Look for the original cell class to extract the constraints value.
Class modelCellViewClass = nil;
if (bubbleData.shouldHideSenderInformation)
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentWithoutSenderInfoBubbleCell.class : RoomIncomingAttachmentWithoutSenderInfoBubbleCell.class;
}
else
{
if (bubbleData.isPaginationFirstBubble)
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentWithPaginationTitleBubbleCell.class : RoomIncomingAttachmentWithPaginationTitleBubbleCell.class;
}
else
{
modelCellViewClass = bubbleData.isEncryptedRoom ? RoomIncomingEncryptedAttachmentBubbleCell.class : RoomIncomingAttachmentBubbleCell.class;
}
}
CGFloat rowHeight = [modelCellViewClass heightForCellData:cellData withMaximumWidth:maxWidth];
// Finalize the cell height by adding the height of the description.
// Retrieve the component which stores the sticker (Only one component is handled by the bubble in case of sticker).
MXKRoomBubbleComponent *component = bubbleData.bubbleComponents.firstObject;
NSAttributedString *description = component.attributedTextMessage;
if (description.length)
{
RoomSelectedStickerBubbleCell* cell = (RoomSelectedStickerBubbleCell*)[self cellWithOriginalXib];
CGRect frame = cell.frame;
frame.size.width = maxWidth;
frame.size.height = 300;
cell.frame = frame;
cell.descriptionLabel.attributedText = description;
[cell layoutIfNeeded];
rowHeight += cell.descriptionContainerView.frame.size.height + cell.descriptionContainerViewBottomConstraint.constant;
}
return rowHeight;
}
@end
@@ -0,0 +1,209 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14088"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" id="WmY-Jw-mqv" customClass="RoomSelectedStickerBubbleCell">
<rect key="frame" x="0.0" y="0.0" width="600" height="180"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="WmY-Jw-mqv" id="ef1-Tq-U3Z">
<rect key="frame" x="0.0" y="0.0" width="600" height="179.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SFg-55-RF4" userLabel="Pagination Title View">
<rect key="frame" x="67" y="10" width="523" height="24"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="wkY-7Y-sGw" userLabel="Pagination Label">
<rect key="frame" x="0.0" y="0.0" width="513" height="18"/>
<accessibility key="accessibilityConfiguration" identifier="PaginationLabel"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="PiZ-Ag-oxc"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<color key="textColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0kR-4b-Wav" userLabel="Pagination Separator View">
<rect key="frame" x="0.0" y="23" width="523" height="1"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="wkY-7Y-sGw" secondAttribute="trailing" constant="10" id="4DU-xA-diS"/>
<constraint firstItem="wkY-7Y-sGw" firstAttribute="top" secondItem="SFg-55-RF4" secondAttribute="top" id="6Cz-bj-kUg"/>
<constraint firstItem="0kR-4b-Wav" firstAttribute="leading" secondItem="SFg-55-RF4" secondAttribute="leading" id="JnC-Xe-1qa"/>
<constraint firstAttribute="bottom" secondItem="0kR-4b-Wav" secondAttribute="bottom" id="PHN-VL-Vv5"/>
<constraint firstAttribute="height" constant="24" id="Qo9-cw-LCa"/>
<constraint firstItem="0kR-4b-Wav" firstAttribute="top" secondItem="wkY-7Y-sGw" secondAttribute="bottom" constant="5" id="c44-l0-OW4"/>
<constraint firstAttribute="trailing" secondItem="0kR-4b-Wav" secondAttribute="trailing" id="i6x-Qa-JZG"/>
<constraint firstItem="wkY-7Y-sGw" firstAttribute="leading" secondItem="SFg-55-RF4" secondAttribute="leading" id="uq9-MP-Dmm"/>
</constraints>
</view>
<view clipsSubviews="YES" contentMode="scaleAspectFill" translatesAutoresizingMaskIntoConstraints="NO" id="hgp-Z5-rAj" userLabel="Picture View" customClass="MXKImageView">
<rect key="frame" x="13" y="54" width="30" height="30"/>
<color key="backgroundColor" red="0.66666666666666663" green="0.66666666666666663" blue="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="PictureView"/>
<constraints>
<constraint firstAttribute="width" constant="30" id="NQk-ck-Lo8"/>
<constraint firstAttribute="height" constant="30" id="dNT-QU-CUG"/>
</constraints>
</view>
<imageView userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="e2e_verified.png" translatesAutoresizingMaskIntoConstraints="NO" id="SfO-mO-OOz">
<rect key="frame" x="41" y="68" width="28" height="28"/>
<accessibility key="accessibilityConfiguration" identifier="EncryptionStatusView"/>
<constraints>
<constraint firstAttribute="width" constant="28" id="AZL-1M-R2e"/>
<constraint firstAttribute="height" constant="28" id="P35-h8-egI"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="User name:" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="8" translatesAutoresizingMaskIntoConstraints="NO" id="q9c-0p-QyP">
<rect key="frame" x="67" y="54" width="448" height="18"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="UserNameLabel"/>
<constraints>
<constraint firstAttribute="height" constant="18" placeholder="YES" id="5ZO-W1-tS2"/>
</constraints>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
<color key="textColor" red="0.33333333333333331" green="0.33333333333333331" blue="0.33333333333333331" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
<view contentMode="scaleAspectFit" translatesAutoresizingMaskIntoConstraints="NO" id="5IE-JS-uf3" userLabel="Attachment View" customClass="MXKImageView">
<rect key="frame" x="67" y="75" width="192" height="46.5"/>
<color key="backgroundColor" red="0.93725490196078431" green="0.93725490196078431" blue="0.95686274509803926" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="AttachmentView"/>
<constraints>
<constraint firstAttribute="width" constant="192" id="9zO-jU-qTb"/>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="34" id="C5F-6D-LZx"/>
</constraints>
</view>
<view hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="IOg-Kt-8vW">
<rect key="frame" x="515" y="54" width="70" height="125.5"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="BubbleInfoContainer"/>
<constraints>
<constraint firstAttribute="width" constant="70" id="tLr-6k-ArA"/>
</constraints>
</view>
<view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="3b7-4a-YL0">
<rect key="frame" x="12" y="3" width="576" height="174"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="4ru-pn-Aka">
<rect key="frame" x="57" y="48" width="458" height="30"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lgz-UT-c2U">
<rect key="frame" x="67" y="131.5" width="53.5" height="38"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Bk9-l7-4ug">
<rect key="frame" x="10" y="0.0" width="20" height="10"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<constraints>
<constraint firstAttribute="height" constant="10" id="JYF-su-bXV"/>
<constraint firstAttribute="width" constant="20" id="o8q-GT-1HB"/>
</constraints>
</view>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="lql-N7-aOv">
<rect key="frame" x="0.0" y="10" width="53.5" height="28"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PwC-m9-IC3">
<rect key="frame" x="8" y="5" width="37.5" height="18"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<fontDescription key="fontDescription" type="system" pointSize="15"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<constraints>
<constraint firstAttribute="bottom" secondItem="PwC-m9-IC3" secondAttribute="bottom" constant="5" id="9IY-ct-GK4"/>
<constraint firstItem="PwC-m9-IC3" firstAttribute="top" secondItem="lql-N7-aOv" secondAttribute="top" constant="5" id="Ptz-mS-jIO"/>
<constraint firstAttribute="trailing" secondItem="PwC-m9-IC3" secondAttribute="trailing" constant="8" id="aFv-U3-X8p"/>
<constraint firstItem="PwC-m9-IC3" firstAttribute="leading" secondItem="lql-N7-aOv" secondAttribute="leading" constant="8" id="wdB-ZN-l8I"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="lql-N7-aOv" firstAttribute="top" secondItem="Bk9-l7-4ug" secondAttribute="bottom" id="4ls-NU-aG9"/>
<constraint firstAttribute="trailing" secondItem="lql-N7-aOv" secondAttribute="trailing" id="80S-HL-oVy"/>
<constraint firstItem="Bk9-l7-4ug" firstAttribute="leading" secondItem="lgz-UT-c2U" secondAttribute="leading" constant="10" id="AVi-Mf-7UD"/>
<constraint firstItem="lql-N7-aOv" firstAttribute="leading" secondItem="lgz-UT-c2U" secondAttribute="leading" id="BjZ-jz-Xmd"/>
<constraint firstAttribute="bottom" secondItem="lql-N7-aOv" secondAttribute="bottom" id="m3I-Ml-oAP"/>
<constraint firstItem="Bk9-l7-4ug" firstAttribute="top" secondItem="lgz-UT-c2U" secondAttribute="top" id="qsk-cV-cyd"/>
</constraints>
</view>
</subviews>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="4ru-pn-Aka" firstAttribute="bottom" secondItem="q9c-0p-QyP" secondAttribute="bottom" constant="6" id="0Cl-Or-gY1"/>
<constraint firstItem="3b7-4a-YL0" firstAttribute="top" secondItem="ef1-Tq-U3Z" secondAttribute="topMargin" constant="-8" id="10i-70-PDz"/>
<constraint firstItem="SfO-mO-OOz" firstAttribute="top" secondItem="SFg-55-RF4" secondAttribute="bottom" constant="34" id="7ug-dI-P4H"/>
<constraint firstItem="5IE-JS-uf3" firstAttribute="top" secondItem="ef1-Tq-U3Z" secondAttribute="top" constant="75" id="96U-67-5TP"/>
<constraint firstItem="lgz-UT-c2U" firstAttribute="leading" secondItem="5IE-JS-uf3" secondAttribute="leading" id="B0j-24-Z8x"/>
<constraint firstAttribute="trailing" secondItem="q9c-0p-QyP" secondAttribute="trailing" constant="85" id="Bkh-h2-JOQ"/>
<constraint firstItem="4ru-pn-Aka" firstAttribute="trailing" secondItem="q9c-0p-QyP" secondAttribute="trailing" id="Coe-gt-nwe"/>
<constraint firstAttribute="bottom" secondItem="lgz-UT-c2U" secondAttribute="bottom" constant="10" id="IAx-xw-tKp"/>
<constraint firstItem="q9c-0p-QyP" firstAttribute="top" secondItem="ef1-Tq-U3Z" secondAttribute="top" constant="54" id="Ixr-7h-f8j"/>
<constraint firstItem="4ru-pn-Aka" firstAttribute="top" secondItem="q9c-0p-QyP" secondAttribute="top" constant="-6" id="K0X-dz-PvH"/>
<constraint firstItem="lgz-UT-c2U" firstAttribute="top" secondItem="5IE-JS-uf3" secondAttribute="bottom" constant="10" id="MOf-5l-vZU"/>
<constraint firstItem="5IE-JS-uf3" firstAttribute="leading" secondItem="ef1-Tq-U3Z" secondAttribute="leading" constant="67" id="Q0k-2f-DNG"/>
<constraint firstAttribute="bottom" secondItem="IOg-Kt-8vW" secondAttribute="bottom" id="TPw-iE-nii"/>
<constraint firstItem="q9c-0p-QyP" firstAttribute="leading" secondItem="5IE-JS-uf3" secondAttribute="leading" id="UnW-3c-mf6"/>
<constraint firstItem="IOg-Kt-8vW" firstAttribute="top" secondItem="ef1-Tq-U3Z" secondAttribute="top" constant="54" id="XSL-TG-m62"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="lgz-UT-c2U" secondAttribute="trailing" constant="15" id="YHV-bx-NYo"/>
<constraint firstItem="3b7-4a-YL0" firstAttribute="leading" secondItem="ef1-Tq-U3Z" secondAttribute="leadingMargin" constant="-8" id="aGh-ad-trR"/>
<constraint firstAttribute="trailingMargin" secondItem="3b7-4a-YL0" secondAttribute="trailing" constant="-8" id="abE-n9-N8T"/>
<constraint firstItem="4ru-pn-Aka" firstAttribute="leading" secondItem="q9c-0p-QyP" secondAttribute="leading" constant="-10" id="djP-gt-Mas"/>
<constraint firstAttribute="trailing" secondItem="IOg-Kt-8vW" secondAttribute="trailing" constant="15" id="hQV-lO-7aQ"/>
<constraint firstItem="SFg-55-RF4" firstAttribute="leading" secondItem="q9c-0p-QyP" secondAttribute="leading" id="hwY-nq-Oyw"/>
<constraint firstAttribute="trailing" secondItem="SFg-55-RF4" secondAttribute="trailing" constant="10" id="jvR-oT-EQF"/>
<constraint firstItem="SfO-mO-OOz" firstAttribute="leading" secondItem="ef1-Tq-U3Z" secondAttribute="leading" constant="41" id="nW4-ob-PSQ"/>
<constraint firstItem="hgp-Z5-rAj" firstAttribute="leading" secondItem="ef1-Tq-U3Z" secondAttribute="leading" constant="13" id="tuw-aU-ncu"/>
<constraint firstItem="SFg-55-RF4" firstAttribute="top" secondItem="ef1-Tq-U3Z" secondAttribute="top" constant="10" id="wJX-7V-bJB"/>
<constraint firstAttribute="bottomMargin" secondItem="3b7-4a-YL0" secondAttribute="bottom" constant="-8" id="wpa-8Z-Gy3"/>
<constraint firstItem="hgp-Z5-rAj" firstAttribute="top" secondItem="q9c-0p-QyP" secondAttribute="top" id="xVT-Xe-sq0"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<accessibility key="accessibilityConfiguration" identifier="RoomBubbleCell"/>
<connections>
<outlet property="arrowView" destination="Bk9-l7-4ug" id="mDe-UL-4nb"/>
<outlet property="attachViewBottomConstraint" destination="MOf-5l-vZU" id="Xr2-3T-bs2"/>
<outlet property="attachViewLeadingConstraint" destination="Q0k-2f-DNG" id="JEV-IK-2NO"/>
<outlet property="attachViewMinHeightConstraint" destination="C5F-6D-LZx" id="frk-Ox-WbA"/>
<outlet property="attachViewTopConstraint" destination="96U-67-5TP" id="Ugm-cH-32E"/>
<outlet property="attachViewWidthConstraint" destination="9zO-jU-qTb" id="fOO-VW-fe1"/>
<outlet property="attachmentView" destination="5IE-JS-uf3" id="imT-1z-hR1"/>
<outlet property="bubbleInfoContainer" destination="IOg-Kt-8vW" id="TAw-QY-Y9e"/>
<outlet property="bubbleInfoContainerTopConstraint" destination="XSL-TG-m62" id="qVf-vJ-4aP"/>
<outlet property="bubbleOverlayContainer" destination="3b7-4a-YL0" id="KNb-h4-YHD"/>
<outlet property="descriptionContainerView" destination="lgz-UT-c2U" id="Tip-cN-J3S"/>
<outlet property="descriptionContainerViewBottomConstraint" destination="IAx-xw-tKp" id="m9G-uX-pnD"/>
<outlet property="descriptionLabel" destination="PwC-m9-IC3" id="Xf9-RK-KCJ"/>
<outlet property="descriptionView" destination="lql-N7-aOv" id="7Sb-9t-j0p"/>
<outlet property="encryptionStatusView" destination="SfO-mO-OOz" id="8BV-oD-e0i"/>
<outlet property="paginationLabel" destination="wkY-7Y-sGw" id="9Uh-tX-t0I"/>
<outlet property="paginationSeparatorView" destination="0kR-4b-Wav" id="c7x-Sh-aj6"/>
<outlet property="paginationTitleView" destination="SFg-55-RF4" id="mbP-6I-gOn"/>
<outlet property="pictureView" destination="hgp-Z5-rAj" id="rKM-QG-RJN"/>
<outlet property="userNameLabel" destination="q9c-0p-QyP" id="JId-R7-LoM"/>
<outlet property="userNameLabelTopConstraint" destination="Ixr-7h-f8j" id="RqB-b5-7D2"/>
<outlet property="userNameTapGestureMaskView" destination="4ru-pn-Aka" id="28k-f4-1LY"/>
</connections>
</tableViewCell>
</objects>
<resources>
<image name="e2e_verified.png" width="10" height="12"/>
</resources>
</document>
+1 -1
View File
@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.6.13</string>
<string>0.6.14</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
+1 -1
View File
@@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>0.6.13</string>
<string>0.6.14</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
+3 -1
View File
@@ -30,7 +30,9 @@ rm -r "$tmp"
if [ -z "$xcent" ]
then
echo "$1 has no archived-expanded-entitlements.xcent."
exit 2
# It seems that since Xcode 9.3, this file is no more present (https://forums.developer.apple.com/thread/99923)
#exit 2
fi
# Check the aps-environment embedded in the binary.